Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
pause_spirits.c File Reference

Go to the source code of this file.

Functions

void pause_spirits_draw_contents (MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
 
void pause_spirits_draw_title (MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
 
void pause_spirits_init (MenuPanel *panel)
 
void pause_spirits_handle_input (MenuPanel *panel)
 
void pause_spirits_update (MenuPanel *panel)
 
void pause_spirits_cleanup (MenuPanel *panel)
 

Variables

Gfx PauseGfxSpiritsBg []
 
s8 pause_spirits_bg_png []
 
Vp gPauseSpiritsViewport
 
s32 gPauseSpiritsSpriteAnims [][4]
 
s8 gPauseSpiritsGridData []
 
Vec2i gPauseSpiritsPositions []
 
s32 gPauseSpiritsDrawOrder [] = { 6, 0, 1, 5, 2, 4, 3 }
 
Vec2i gPauseSpiritsCursorPositions []
 
MenuWindowBP gPauseSpiritsWindowsBPs []
 
MenuPanel gPausePanelSpirits
 

Function Documentation

◆ pause_spirits_draw_contents()

void pause_spirits_draw_contents ( MenuPanel * menu,
s32 baseX,
s32 baseY,
s32 width,
s32 height,
s32 opacity,
s32 darkening )

Definition at line 146 of file pause_spirits.c.

146 {
147 Matrix4f matrix1;
148 Matrix4f matrix2;
149 s32 i, j;
150 s32 color;
151 s32 alpha;
152 s32 index;
153 f32 x, y;
154 f32 offsetY;
155 s32 x1, y1, x2, y2;
156 f32 frameCounter;
157 f32 scale;
158
159 gDPPipeSync(gMainGfxPos++);
160 gSPViewport(gMainGfxPos++, &gPauseSpiritsViewport);
161 gSPDisplayList(gMainGfxPos++, PauseGfxSpiritsBg);
162
163 for (i = 0; i < 5; i++) {
164 gDPLoadTextureTile_4b(gMainGfxPos++, pause_spirits_bg_png, G_IM_FMT_CI, 128, 110,
165 0, i * 22, 127, i * 22 + 21, 0,
166 G_TX_MIRROR, G_TX_CLAMP, 7, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
167 pause_draw_rect((baseX + 15) * 4, (baseY + 22 + i * 22) * 4, (baseX + 271) * 4, (baseY + 22 + i * 22 + 22) * 4, 0, 16, 16 + i * 704, 0x400, 0x400);
168 gDPPipeSync(gMainGfxPos++);
169 }
170
171 guOrthoF(matrix1, 0.0f, 320.0f, 240.0f, 0.0f, -1000.0f, 1000.0f, 1.0f);
173 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
174 guTranslateF(matrix1, 0.0f, 0.0f, 0.0f);
176 gSPMatrix(gMainGfxPos++, &gDisplayContext->matrixStack[gMatrixListPos++], G_MTX_PUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
177
178 for (i = 0; i < gPauseSpiritsNumSpirits; i++) {
179 index = gPauseSpiritsDrawOrder[i];
180 frameCounter = gGameStatusPtr->frameCounter * 4;
181 x = gPauseSpiritsPositions[index].x;
182 y = gPauseSpiritsPositions[index].y;
183
184 if (gPlayerData.maxStarPower < index + 1) {
185 color = 0;
186 alpha = 128;
187 offsetY = 0.0f;
188 } else {
189 color = 255;
190 alpha = 255;
191 offsetY = sin_deg(index * index * index + frameCounter * 0.4321 + frameCounter * (index * 0.02 + 0.1324))
192 * 5.0f
193 * sin_deg(index * 0.25 + frameCounter + frameCounter * (0.0432 - index * 0.01));
194
195 }
196
197 set_npc_imgfx_all(gPauseSpiritsSpriteIDs[gPauseSpiritsIndexes[index]], IMGFX_SET_TINT, color, color, color, alpha, 64);
198 guTranslateF(matrix1, baseX + 22 + x, baseY + 77 + y + offsetY, 0.0f);
199 guRotateF(matrix2, 180.0f, 0.0f, 0.0f, 1.0f);
200 guMtxCatF(matrix2, matrix1, matrix1);
201
202 if (index == 1 || index == 2 || index == 3) {
203 guRotateF(matrix2, 180.0f, 0.0f, 1.0f, 0.0f);
204 guMtxCatF(matrix2, matrix1, matrix1);
205 }
206
207 guScaleF(matrix2, 0.9f, 0.9f, 0.9f);
208 guMtxCatF(matrix2, matrix1, matrix1);
209 spr_draw_npc_sprite(gPauseSpiritsSpriteIDs[gPauseSpiritsIndexes[index]], 0, 0, 0, matrix1);
210 }
211
212 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
213
214 x1 = baseX + 7;
215 y1 = baseY + 14;
216 x2 = baseX + 279;
217 y2 = baseY + 140;
218
219 if (x1 <= 0) {
220 x1 = 1;
221 }
222 if (y1 <= 0) {
223 y1 = 1;
224 }
225
226 if (x2 <= 0 || y2 <= 0 || x1 >= SCREEN_WIDTH - 1 || y1 >= SCREEN_HEIGHT - 1) {
227 return;
228 }
229
230 if (x2 >= SCREEN_WIDTH - 1) {
231 x2 = SCREEN_WIDTH - 1;
232 }
233 if (y2 >= SCREEN_HEIGHT - 1) {
234 y2 = SCREEN_HEIGHT - 1;
235 }
236
237 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, x1, y1, x2, y2);
238 draw_box(0, &gPauseWS_25, baseX + 7, baseY + 14, 0, 272, 126, opacity, darkening, 1.0f, 1.0f, 0, 0, 0, 0, 0, 0, width, height, 0);
239
240 if (gPauseMenuCurrentTab == 5) {
242 }
243}
Mtx matrixStack[0x200]
f32 Matrix4f[4][4]
#define guRotateF
#define guOrthoF
#define guMtxF2L
#define sin_deg
#define guTranslateF
#define guMtxCatF
#define draw_box
#define guScaleF
@ IMGFX_SET_TINT
Definition enums.h:5124
@ WIN_PAUSE_SPIRITS
Definition enums.h:5281
s8 gPauseMenuCurrentTab
Definition pause_main.c:28
void pause_set_cursor_pos(s32 windowID, s32 posX, s32 posY)
Definition pause_main.c:228
void pause_draw_rect(s32 ulx, s32 uly, s32 lrx, s32 lry, s32 tileIdx, s32 uls, s32 ult, s32 dsdx, s32 dtdy)
Definition pause_main.c:841
WindowStyleCustom gPauseWS_25
s8 pause_spirits_bg_png[]
s32 gPauseSpiritsDrawOrder[]
Gfx PauseGfxSpiritsBg[]
Definition pause_gfx.c:325
Vec2i gPauseSpiritsPositions[]
Vp gPauseSpiritsViewport
Vec2i gPauseSpiritsCursorPositions[]
#define SCREEN_WIDTH
Definition macros.h:109
#define SCREEN_HEIGHT
Definition macros.h:110
s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR *paletteList, Matrix4f mtx)
Definition sprite.c:1105
void set_npc_imgfx_all(s32 spriteIdx, ImgFXType imgfxType, s32 imgfxArg1, s32 imgfxArg2, s32 imgfxArg3, s32 imgfxArg4, s32 imgfxArg5)
Definition sprite.c:1253
GameStatus * gGameStatusPtr
Definition main_loop.c:32
Gfx * gMainGfxPos
Definition cam_main.c:15
PlayerData gPlayerData
Definition 77480.c:40
u16 gMatrixListPos
Definition main_loop.c:45
DisplayContext * gDisplayContext
Definition cam_main.c:16

◆ pause_spirits_draw_title()

void pause_spirits_draw_title ( MenuPanel * menu,
s32 baseX,
s32 baseY,
s32 width,
s32 height,
s32 opacity,
s32 darkening )

Definition at line 245 of file pause_spirits.c.

245 {
246 s32 msgID;
247
248 if (gPauseMenuCurrentTab == 5) {
249 if (gPlayerData.maxStarPower > gPauseSpiritsIndexes[menu->selected]) {
250 msgID = gPauseSpiritsIndexes[menu->selected] + MSG_Menus_SpiritName_Eldstar;
251 } else {
253 }
254 draw_msg(msgID, baseX + ((width - get_msg_width(msgID, 0)) >> 1), baseY + 1, 255, MSG_PAL_WHITE, 0);
255 }
256}
#define get_msg_width
#define draw_msg
@ MSG_PAL_WHITE
Definition enums.h:5404
s32 pause_get_menu_msg(s32 index)
Definition pause_gfx.c:583
@ PAUSE_MSG_UNKNOWN_SPIRIT

◆ pause_spirits_init()

void pause_spirits_init ( MenuPanel * panel)

Definition at line 258 of file pause_spirits.c.

258 {
259 s32 i;
260
261 gPauseSpiritsNumSpirits = 0;
262
263 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsIndexes); i++) {
264 gPauseSpiritsIndexes[gPauseSpiritsNumSpirits] = i;
265 gPauseSpiritsNumSpirits++;
266 }
267
268 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsSpriteAnims); i++) {
269 gPauseSpiritsSpriteIDs[i] = spr_load_npc_sprite(gPauseSpiritsSpriteAnims[i][0], gPauseSpiritsSpriteAnims[i]);
270 }
271
272 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsWindowsBPs); i++) {
273 gPauseSpiritsWindowsBPs[i].tab = panel;
274 }
276 panel->initialized = TRUE;
277}
void setup_pause_menu_tab(MenuWindowBP *bpArray, s32 arraySize)
Definition windows.c:461
s32 gPauseSpiritsSpriteAnims[][4]
MenuWindowBP gPauseSpiritsWindowsBPs[]
#define ARRAY_COUNT(arr)
Definition macros.h:40
s32 spr_load_npc_sprite(s32 animID, u32 *extraAnimList)
Definition sprite.c:1025
MenuPanel * tab

◆ pause_spirits_handle_input()

void pause_spirits_handle_input ( MenuPanel * panel)

Definition at line 279 of file pause_spirits.c.

279 {
280 s32 oldSelected = panel->selected;
281
283 while (TRUE) {
284 panel->col--;
285 if (panel->col < 0) {
286 panel->col = 0;
287 break;
288 }
289
290 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
291 break;
292 }
293 }
294 }
295
297 while (TRUE) {
298 panel->col++;
299 if (panel->col >= panel->numCols) {
300 panel->col = panel->numCols - 1;
301 break;
302 }
303
304 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
305 break;
306 }
307 }
308 }
309
311 if (panel->selected == 2) {
312 panel->col = 3;
313 panel->row = 0;
314 } else if (panel->selected == 5) {
315 panel->col = 1;
316 panel->row = 0;
317 } else {
318 while (TRUE) {
319 panel->row--;
320 if (panel->row < 0) {
321 panel->row = 0;
322 break;
323 }
324 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
325 break;
326 }
327 }
328 }
329 }
330
332 if (panel->selected == 2) {
333 panel->col = 3;
334 panel->row = 1;
335 } else if (panel->selected == 5) {
336 panel->col = 1;
337 panel->row = 1;
338 } else {
339 while (TRUE) {
340 panel->row++;
341 if (panel->row >= panel->numRows) {
342 panel->row = panel->numRows - 1;
343 break;
344 }
345 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
346 break;
347 }
348 }
349 }
350 }
351
353
354 if (panel->selected == 4) {
355 panel->col = 1;
356 panel->row = 1;
357 }
358
359 if (panel->selected != oldSelected) {
361 }
362
366 return;
367 }
368
370
371 if (gPlayerData.maxStarPower <= gPauseSpiritsIndexes[panel->selected]) {
373 } else {
374 gPauseCurrentDescMsg = MSG_Menus_SpiritDesc_Eldstar + gPauseSpiritsIndexes[panel->selected];
375 }
376}
@ BUTTON_STICK_UP
Definition enums.h:2791
@ BUTTON_STICK_DOWN
Definition enums.h:2792
@ BUTTON_STICK_LEFT
Definition enums.h:2793
@ BUTTON_STICK_RIGHT
Definition enums.h:2794
@ BUTTON_B
Definition enums.h:2789
@ SOUND_MENU_BACK
Definition enums.h:701
@ SOUND_MENU_CHANGE_SELECTION
Definition enums.h:698
s32 gPausePressedButtons
Definition pause_main.c:24
HudScript * gPauseCurrentDescIconScript
Definition pause_main.c:26
s32 gPauseHeldButtons
Definition pause_main.c:23
s32 gPauseCurrentDescMsg
Definition pause_main.c:25
void sfx_play_sound(s32 soundID)
Definition sfx.c:517
#define MENU_PANEL_SELECTED_GRID_DATA(panel)
Definition macros.h:76

◆ pause_spirits_update()

void pause_spirits_update ( MenuPanel * panel)

Definition at line 378 of file pause_spirits.c.

378 {
379 s32 i;
380
381 for (i = 0; i < gPauseSpiritsNumSpirits; i++) {
382 if (i < gPlayerData.maxStarPower && gPauseMenuCurrentTab == 5 && i == panel->selected) {
383 spr_update_sprite(gPauseSpiritsSpriteIDs[i], gPauseSpiritsSpriteAnims[i][1], 1.0f);
384 } else {
385 spr_update_sprite(gPauseSpiritsSpriteIDs[i], gPauseSpiritsSpriteAnims[i][0], 1.0f);
386 }
387 }
388}
s32 spr_update_sprite(s32 spriteInstanceID, s32 animID, f32 timeScale)
Definition sprite.c:1071

◆ pause_spirits_cleanup()

void pause_spirits_cleanup ( MenuPanel * panel)

Definition at line 390 of file pause_spirits.c.

390 {
391 s32 i;
392
393 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsSpriteIDs); i++) {
394 spr_free_sprite(gPauseSpiritsSpriteIDs[i]);
395 }
396}
s32 spr_free_sprite(s32 spriteInstanceID)
Definition sprite.c:1177

Variable Documentation

◆ PauseGfxSpiritsBg

Gfx PauseGfxSpiritsBg[]
extern

Definition at line 325 of file pause_gfx.c.

325 {
326 gsDPPipeSync(),
327 gsSPTexture(-1, -1, 0, G_TX_RENDERTILE, G_ON),
328 gsDPSetCycleType(G_CYC_1CYCLE),
329 gsDPSetTexturePersp(G_TP_NONE),
330 gsDPSetTextureDetail(G_TD_CLAMP),
331 gsDPSetTextureLOD(G_TL_TILE),
332 gsDPSetTextureLUT(G_TT_RGBA16),
333 gsDPSetTextureFilter(G_TF_AVERAGE),
334 gsDPSetTextureConvert(G_TC_FILT),
335 gsDPLoadTLUT_pal16(0, pause_spirits_bg_pal),
336 gsDPSetRenderMode(G_RM_OPA_SURF, G_RM_OPA_SURF2),
337 gsDPSetCombineMode(G_CC_DECALRGBA, G_CC_DECALRGBA),
338 gsSPClearGeometryMode(G_CULL_BOTH | G_LIGHTING),
339 gsSPSetGeometryMode(G_SHADE | G_SHADING_SMOOTH),
340 gsSPEndDisplayList(),
341};

Referenced by pause_spirits_draw_contents().

◆ pause_spirits_bg_png

s8 pause_spirits_bg_png[]
extern

◆ gPauseSpiritsViewport

Vp gPauseSpiritsViewport
Initial value:
= {
.vp = {
.vscale = { 640, 480, 511, 0 },
.vtrans = { 640, 480, 511, 0 },
}
}

Definition at line 27 of file pause_spirits.c.

27 {
28 .vp = {
29 .vscale = { 640, 480, 511, 0 },
30 .vtrans = { 640, 480, 511, 0 },
31 }
32};

Referenced by pause_spirits_draw_contents().

◆ gPauseSpiritsSpriteAnims

s32 gPauseSpiritsSpriteAnims[][4]

Definition at line 33 of file pause_spirits.c.

33 {
34 {
35 ANIM_WorldEldstar_Still,
36 ANIM_WorldEldstar_Idle,
37 ANIM_WorldEldstar_Wave,
39 },
40 {
41 ANIM_WorldMamar_Still,
42 ANIM_WorldMamar_Idle,
43 ANIM_WorldMamar_TalkHappy,
45 },
46 {
47 ANIM_WorldSkolar_Still,
48 ANIM_WorldSkolar_Idle,
49 ANIM_WorldSkolar_TalkAngry,
51 },
52 {
53 ANIM_WorldMuskular_Still,
54 ANIM_WorldMuskular_Idle,
55 ANIM_WorldMuskular_Talk,
57 },
58 {
59 ANIM_WorldMisstar_Still,
60 ANIM_WorldMisstar_Idle,
61 ANIM_WorldMisstar_Talk,
63 },
64 {
65 ANIM_WorldKlevar_Still,
66 ANIM_WorldKlevar_Idle,
67 ANIM_WorldKlevar_Talk,
69 },
70 {
71 ANIM_WorldKalmar_Still,
72 ANIM_WorldKalmar_Idle,
73 ANIM_WorldKalmar_Talk,
75 }
76};
#define ANIM_LIST_END
Terminates an extraAnimationList.
Definition types.h:22

Referenced by pause_spirits_init(), and pause_spirits_update().

◆ gPauseSpiritsGridData

s8 gPauseSpiritsGridData[]
Initial value:
= {
5, 6, 0, 1, 2,
5, 4, 4, 3, 2
}

Definition at line 77 of file pause_spirits.c.

77 {
78 5, 6, 0, 1, 2,
79 5, 4, 4, 3, 2
80};

◆ gPauseSpiritsPositions

Vec2i gPauseSpiritsPositions[]
Initial value:
= {
{ .x = 120, .y = -5 },
{ .x = 179, .y = -2 },
{ .x = 222, .y = 28 },
{ .x = 165, .y = 45 },
{ .x = 76, .y = 45 },
{ .x = 17, .y = 28 },
{ .x = 59, .y = -2 }
}

Definition at line 81 of file pause_spirits.c.

81 {
82 { .x = 120, .y = -5 },
83 { .x = 179, .y = -2 },
84 { .x = 222, .y = 28 },
85 { .x = 165, .y = 45 },
86 { .x = 76, .y = 45 },
87 { .x = 17, .y = 28 },
88 { .x = 59, .y = -2 }
89};

Referenced by pause_spirits_draw_contents().

◆ gPauseSpiritsDrawOrder

s32 gPauseSpiritsDrawOrder[] = { 6, 0, 1, 5, 2, 4, 3 }

Definition at line 90 of file pause_spirits.c.

90{ 6, 0, 1, 5, 2, 4, 3 };

Referenced by pause_spirits_draw_contents().

◆ gPauseSpiritsCursorPositions

Vec2i gPauseSpiritsCursorPositions[]
Initial value:
= {
{ .x = 120, .y = 50 },
{ .x = 180, .y = 55 },
{ .x = 220, .y = 90 },
{ .x = 165, .y = 110 },
{ .x = 75, .y = 110 },
{ .x = 20, .y = 90 },
{ .x = 60, .y = 55 }
}

Definition at line 91 of file pause_spirits.c.

91 {
92 { .x = 120, .y = 50 },
93 { .x = 180, .y = 55 },
94 { .x = 220, .y = 90 },
95 { .x = 165, .y = 110 },
96 { .x = 75, .y = 110 },
97 { .x = 20, .y = 90 },
98 { .x = 60, .y = 55 }
99};

Referenced by pause_spirits_draw_contents().

◆ gPauseSpiritsWindowsBPs

MenuWindowBP gPauseSpiritsWindowsBPs[]
Initial value:
= {
{
.windowID = WIN_PAUSE_SPIRITS,
.unk_01 = 0,
.pos = { .x = 3, .y = 16 },
.width = 289,
.height = 154,
.priority = WINDOW_PRIORITY_1,
.fpDrawContents = &pause_spirits_draw_contents,
.tab = NULL,
.parentID = WIN_PAUSE_MAIN,
.fpUpdate = { WINDOW_UPDATE_HIDE },
.extraFlags = 0,
.style = { .customStyle = &gPauseWS_23 }
},
{
.unk_01 = 0,
.pos = { .x = 86, .y = 124 },
.width = 120,
.height = 20,
.priority = WINDOW_PRIORITY_0,
.fpDrawContents = &pause_spirits_draw_title,
.tab = NULL,
.parentID = WIN_PAUSE_SPIRITS,
.fpUpdate = { WINDOW_UPDATE_SHOW },
.extraFlags = 0,
.style = { .customStyle = &gPauseWS_24 }
}
}
@ WINDOW_PRIORITY_1
Definition enums.h:3183
@ WINDOW_PRIORITY_0
Definition enums.h:3182
@ WINDOW_UPDATE_SHOW
Definition enums.h:5310
@ WINDOW_UPDATE_HIDE
Definition enums.h:5311
@ WIN_PAUSE_MAIN
Definition enums.h:5262
@ WIN_PAUSE_SPIRITS_TITLE
Definition enums.h:5282
WindowStyleCustom gPauseWS_23
WindowStyleCustom gPauseWS_24
void pause_spirits_draw_title(MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)
void pause_spirits_draw_contents(MenuPanel *menu, s32 baseX, s32 baseY, s32 width, s32 height, s32 opacity, s32 darkening)

Definition at line 100 of file pause_spirits.c.

100 {
101 {
102 .windowID = WIN_PAUSE_SPIRITS,
103 .unk_01 = 0,
104 .pos = { .x = 3, .y = 16 },
105 .width = 289,
106 .height = 154,
107 .priority = WINDOW_PRIORITY_1,
108 .fpDrawContents = &pause_spirits_draw_contents,
109 .tab = NULL,
110 .parentID = WIN_PAUSE_MAIN,
111 .fpUpdate = { WINDOW_UPDATE_HIDE },
112 .extraFlags = 0,
113 .style = { .customStyle = &gPauseWS_23 }
114 },
115 {
116 .windowID = WIN_PAUSE_SPIRITS_TITLE,
117 .unk_01 = 0,
118 .pos = { .x = 86, .y = 124 },
119 .width = 120,
120 .height = 20,
121 .priority = WINDOW_PRIORITY_0,
122 .fpDrawContents = &pause_spirits_draw_title,
123 .tab = NULL,
124 .parentID = WIN_PAUSE_SPIRITS,
125 .fpUpdate = { WINDOW_UPDATE_SHOW },
126 .extraFlags = 0,
127 .style = { .customStyle = &gPauseWS_24 }
128 }
129};

Referenced by pause_spirits_init().

◆ gPausePanelSpirits

MenuPanel gPausePanelSpirits
Initial value:
= {
.initialized = FALSE,
.col = 2,
.row = 0,
.selected = 0,
.state = 0,
.numCols = 5,
.numRows = 2,
.numPages = 0,
.gridData = gPauseSpiritsGridData,
.fpInit = &pause_spirits_init,
.fpHandleInput = &pause_spirits_handle_input,
.fpUpdate = &pause_spirits_update,
.fpCleanup = &pause_spirits_cleanup
}
void pause_spirits_init(MenuPanel *panel)
void pause_spirits_handle_input(MenuPanel *panel)
s8 gPauseSpiritsGridData[]
void pause_spirits_cleanup(MenuPanel *panel)
void pause_spirits_update(MenuPanel *panel)

Definition at line 130 of file pause_spirits.c.

130 {
131 .initialized = FALSE,
132 .col = 2,
133 .row = 0,
134 .selected = 0,
135 .state = 0,
136 .numCols = 5,
137 .numRows = 2,
138 .numPages = 0,
139 .gridData = gPauseSpiritsGridData,
140 .fpInit = &pause_spirits_init,
141 .fpHandleInput = &pause_spirits_handle_input,
142 .fpUpdate = &pause_spirits_update,
143 .fpCleanup = &pause_spirits_cleanup
144};