1#include "Library/Memory/HeapUtil.h"
2
3#include <heap/seadHeapMgr.h>
4
5#include "Library/File/FileUtil.h"
6#include "Library/Resource/ResourceHolder.h"
7#include "Library/System/SystemKit.h"
8#include "Project/Memory/MemorySystem.h"
9
10#include "System/ProjectInterface.h"
11
12namespace al {
13sead::Heap* getStationedHeap() {
14 return alProjectInterface::getSystemKit()->getMemorySystem()->getStationedHeap();
15}
16
17sead::Heap* getSequenceHeap() {
18 return alProjectInterface::getSystemKit()->getMemorySystem()->getSequenceHeap();
19}
20
21sead::Heap* getSceneResourceHeap() {
22 return alProjectInterface::getSystemKit()->getMemorySystem()->getSceneResourceHeap();
23}
24
25sead::Heap* getSceneHeap() {
26 return alProjectInterface::getSystemKit()->getMemorySystem()->getSceneHeap();
27}
28
29sead::Heap* getCourseSelectResourceHeap() {
30 return alProjectInterface::getSystemKit()->getMemorySystem()->getCourseSelectResourceHeap();
31}
32
33sead::Heap* getCourseSelectHeap() {
34 return alProjectInterface::getSystemKit()->getMemorySystem()->getCourseSelectHeap();
35}
36
37sead::Heap* getWorldResourceHeap() {
38 return alProjectInterface::getSystemKit()->getMemorySystem()->getWorldResourceHeap();
39}
40
41sead::Heap* tryFindNamedHeap(const char* heapName) {
42 return alProjectInterface::getSystemKit()->getMemorySystem()->tryFindNamedHeap(heapName);
43}
44
45sead::Heap* findNamedHeap(const char* heapName) {
46 return alProjectInterface::getSystemKit()->getMemorySystem()->findNamedHeap(heapName);
47}
48
49void addNamedHeap(sead::Heap* heap, const char* heapName) {
50 alProjectInterface::getSystemKit()->getMemorySystem()->addNamedHeap(heap, heapName);
51}
52
53void removeNamedHeap(const char* heapName) {
54 alProjectInterface::getSystemKit()->getMemorySystem()->removeNamedHeap(heapName);
55}
56
57void createSequenceHeap() {
58 alProjectInterface::getSystemKit()->getMemorySystem()->createSequenceHeap();
59
60 addResourceCategory("シーケンス", 0x18, getSequenceHeap());
61 setCurrentCategoryName("シーケンス");
62 clearFileLoaderEntry();
63}
64
65void freeAllSequenceHeap() {
66 removeResourceCategory("シーケンス");
67 alProjectInterface::getSystemKit()->getMemorySystem()->freeAllSequenceHeap();
68
69 addResourceCategory("シーケンス", 0x18, getSequenceHeap());
70 setCurrentCategoryName("シーケンス");
71 clearFileLoaderEntry();
72}
73
74bool printAllSequenceHeap() {
75 return alProjectInterface::getSystemKit()->getMemorySystem()->printSequenceHeap();
76}
77
78void createSceneHeap(const char* stageName, bool backwards) {
79 sead::ScopedCurrentHeapSetter heapSetter = sead::ScopedCurrentHeapSetter(getSequenceHeap());
80
81 SystemKit* systemKit = alProjectInterface::getSystemKit();
82 bool isSceneHeapCreated = systemKit->getMemorySystem()->createSceneHeap(stageName, backwards);
83 if (isSceneHeapCreated) {
84 addResourceCategory("シーン", 0x200, getSceneResourceHeap());
85 addResourceCategory("シーン", 0x200, getSceneResourceHeap());
86 setCurrentCategoryName("シーン");
87 clearFileLoaderEntry();
88 }
89}
90
91void createSceneResourceHeap(const char* stageName) {
92 sead::ScopedCurrentHeapSetter heapSetter = sead::ScopedCurrentHeapSetter(getSequenceHeap());
93
94 alProjectInterface::getSystemKit()->getMemorySystem()->createSceneResourceHeap(stageName,
95 backwards: false);
96
97 addResourceCategory("シーン", 0x200, getSceneResourceHeap());
98 addResourceCategory("シーン", 0x200, getSceneResourceHeap());
99 setCurrentCategoryName("シーン");
100 clearFileLoaderEntry();
101}
102
103bool isCreatedSceneResourceHeap() {
104 return getSceneResourceHeap() != nullptr;
105}
106
107void destroySceneHeap(bool removeCategory) {
108 if (removeCategory) {
109 removeResourceCategory("シーン");
110 removeResourceCategory("シーン[デバッグ]");
111 alProjectInterface::getSystemKit()->getMemorySystem()->destroySceneHeap();
112 alProjectInterface::getSystemKit()->getMemorySystem()->destroySceneResourceHeap();
113
114 return;
115 }
116
117 alProjectInterface::getSystemKit()->getMemorySystem()->destroySceneHeap();
118}
119
120void createCourseSelectHeap() {
121 sead::ScopedCurrentHeapSetter heapSetter = sead::ScopedCurrentHeapSetter(getSequenceHeap());
122
123 alProjectInterface::getSystemKit()->getMemorySystem()->createCourseSelectHeap();
124
125 addResourceCategory("コースセレクト", 0x40, getCourseSelectResourceHeap());
126 setCurrentCategoryName("コースセレクト");
127 clearFileLoaderEntry();
128}
129
130void destroyCourseSelectHeap() {
131 removeResourceCategory("コースセレクト");
132 alProjectInterface::getSystemKit()->getMemorySystem()->destroyCourseSelectHeap();
133}
134
135void createWorldResourceHeap(bool useCategory) {
136 sead::ScopedCurrentHeapSetter heapSetter = sead::ScopedCurrentHeapSetter(getSequenceHeap());
137
138 alProjectInterface::getSystemKit()->getMemorySystem()->createWorldResourceHeap();
139
140 if (useCategory) {
141 addResourceCategory("ワールド常駐", 0x400, getWorldResourceHeap());
142 setCurrentCategoryName("ワールド常駐");
143 }
144 clearFileLoaderEntry();
145}
146
147void destroyWorldResourceHeap(bool removeCategory) {
148 if (removeCategory)
149 removeResourceCategory("ワールド常駐");
150
151 clearFileLoaderEntry();
152 alProjectInterface::getSystemKit()->getMemorySystem()->destroyWorldResourceHeap();
153}
154
155void loadPlayerResource(const char* categoryName) {
156 addResourceCategory(
157 categoryName, 0x14,
158 alProjectInterface::getSystemKit()->getMemorySystem()->getPlayerResourceHeap());
159 createCategoryResourceAll(categoryName);
160}
161
162void freePlayerResource(const char* categoryName) {
163 removeResourceCategory(categoryName);
164 alProjectInterface::getSystemKit()->getMemorySystem()->freeAllPlayerHeap();
165}
166
167void setAudioResourceDirectorToMemorySystem(AudioResourceDirector* audioResourceDirector) {
168 alProjectInterface::getSystemKit()->getMemorySystem()->setAudioResourceDirector(
169 audioResourceDirector);
170}
171} // namespace al
172