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
179 for (i = 0; i < gPauseSpiritsNumSpirits; i++) {
180 index = gPauseSpiritsDrawOrder[i];
181 frameCounter = gGameStatusPtr->frameCounter * 4;
182 x = gPauseSpiritsPositions[index].x;
183 y = gPauseSpiritsPositions[index].y;
184
185 if (gPlayerData.maxStarPower < index + 1) {
186 color = 0;
187 alpha = 128;
188 offsetY = 0.0f;
189 } else {
190 color = 255;
191 alpha = 255;
192 offsetY = sin_deg(index * index * index + frameCounter * 0.4321 + frameCounter * (index * 0.02 + 0.1324))
193 * 5.0f
194 * sin_deg(index * 0.25 + frameCounter + frameCounter * (0.0432 - index * 0.01));
195
196 }
197
198 set_npc_imgfx_all(gPauseSpiritsSpriteIDs[gPauseSpiritsIndexes[index]], IMGFX_SET_TINT, color, color, color, alpha, 64);
199 guTranslateF(matrix1, baseX + 22 + x, baseY + 77 + y + offsetY, 0.0f);
200 guRotateF(matrix2, 180.0f, 0.0f, 0.0f, 1.0f);
201 guMtxCatF(matrix2, matrix1, matrix1);
202
203 if (index == 1 || index == 2 || index == 3) {
204 guRotateF(matrix2, 180.0f, 0.0f, 1.0f, 0.0f);
205 guMtxCatF(matrix2, matrix1, matrix1);
206 }
207
208 guScaleF(matrix2, 0.9f, 0.9f, 0.9f);
209 guMtxCatF(matrix2, matrix1, matrix1);
210 spr_draw_npc_sprite(gPauseSpiritsSpriteIDs[gPauseSpiritsIndexes[index]], 0, 0, 0, matrix1);
211 }
212
213 gSPPopMatrix(gMainGfxPos++, G_MTX_MODELVIEW);
214
215 x1 = baseX + 7;
216 y1 = baseY + 14;
217 x2 = baseX + 279;
218 y2 = baseY + 140;
219
220 if (x1 <= 0) {
221 x1 = 1;
222 }
223 if (y1 <= 0) {
224 y1 = 1;
225 }
226
227 if (x2 <= 0 || y2 <= 0 || x1 >= SCREEN_WIDTH - 1 || y1 >= SCREEN_HEIGHT - 1) {
228 return;
229 }
230
231 if (x2 >= SCREEN_WIDTH - 1) {
232 x2 = SCREEN_WIDTH - 1;
233 }
234 if (y2 >= SCREEN_HEIGHT - 1) {
235 y2 = SCREEN_HEIGHT - 1;
236 }
237
238 gDPSetScissor(gMainGfxPos++, G_SC_NON_INTERLACE, x1, y1, x2, y2);
239 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);
240
241 if (gPauseMenuCurrentTab == 5) {
243 }
244}
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:5125
@ WIN_PAUSE_SPIRITS
Definition enums.h:5282
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:105
#define SCREEN_HEIGHT
Definition macros.h:106
s32 spr_draw_npc_sprite(s32 spriteInstanceID, s32 yaw, s32 arg2, PAL_PTR *paletteList, Matrix4f mtx)
Definition sprite.c:1106
void set_npc_imgfx_all(s32 spriteIdx, ImgFXType imgfxType, s32 imgfxArg1, s32 imgfxArg2, s32 imgfxArg3, s32 imgfxArg4, s32 imgfxArg5)
Definition sprite.c:1254
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 246 of file pause_spirits.c.

246 {
247 s32 msgID;
248
249 if (gPauseMenuCurrentTab == 5) {
250 if (gPlayerData.maxStarPower > gPauseSpiritsIndexes[menu->selected]) {
251 msgID = gPauseSpiritsIndexes[menu->selected] + MSG_Menus_SpiritName_Eldstar;
252 } else {
254 }
255 draw_msg(msgID, baseX + ((width - get_msg_width(msgID, 0)) >> 1), baseY + 1, 255, MSG_PAL_WHITE, 0);
256 }
257}
#define get_msg_width
#define draw_msg
@ MSG_PAL_WHITE
Definition enums.h:5405
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 259 of file pause_spirits.c.

259 {
260 s32 i;
261
262 gPauseSpiritsNumSpirits = 0;
263
264 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsIndexes); i++) {
265 gPauseSpiritsIndexes[gPauseSpiritsNumSpirits] = i;
266 gPauseSpiritsNumSpirits++;
267 }
268
269 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsSpriteAnims); i++) {
270 gPauseSpiritsSpriteIDs[i] = spr_load_npc_sprite(gPauseSpiritsSpriteAnims[i][0], gPauseSpiritsSpriteAnims[i]);
271 }
272
273 for (i = 0; i < ARRAY_COUNT(gPauseSpiritsWindowsBPs); i++) {
274 gPauseSpiritsWindowsBPs[i].tab = panel;
275 }
277 panel->initialized = TRUE;
278}
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:1026
MenuPanel * tab

◆ pause_spirits_handle_input()

void pause_spirits_handle_input ( MenuPanel * panel)

Definition at line 280 of file pause_spirits.c.

280 {
281 s32 oldSelected = panel->selected;
282
284 while (TRUE) {
285 panel->col--;
286 if (panel->col < 0) {
287 panel->col = 0;
288 break;
289 }
290
291 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
292 break;
293 }
294 }
295 }
296
298 while (TRUE) {
299 panel->col++;
300 if (panel->col >= panel->numCols) {
301 panel->col = panel->numCols - 1;
302 break;
303 }
304
305 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
306 break;
307 }
308 }
309 }
310
312 if (panel->selected == 2) {
313 panel->col = 3;
314 panel->row = 0;
315 } else if (panel->selected == 5) {
316 panel->col = 1;
317 panel->row = 0;
318 } else {
319 while (TRUE) {
320 panel->row--;
321 if (panel->row < 0) {
322 panel->row = 0;
323 break;
324 }
325 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
326 break;
327 }
328 }
329 }
330 }
331
333 if (panel->selected == 2) {
334 panel->col = 3;
335 panel->row = 1;
336 } else if (panel->selected == 5) {
337 panel->col = 1;
338 panel->row = 1;
339 } else {
340 while (TRUE) {
341 panel->row++;
342 if (panel->row >= panel->numRows) {
343 panel->row = panel->numRows - 1;
344 break;
345 }
346 if (panel->selected != MENU_PANEL_SELECTED_GRID_DATA(panel)) {
347 break;
348 }
349 }
350 }
351 }
352
354
355 if (panel->selected == 4) {
356 panel->col = 1;
357 panel->row = 1;
358 }
359
360 if (panel->selected != oldSelected) {
362 }
363
367 return;
368 }
369
371
372 if (gPlayerData.maxStarPower <= gPauseSpiritsIndexes[panel->selected]) {
374 } else {
375 gPauseCurrentDescMsg = MSG_Menus_SpiritDesc_Eldstar + gPauseSpiritsIndexes[panel->selected];
376 }
377}
@ 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 379 of file pause_spirits.c.

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

◆ pause_spirits_cleanup()

void pause_spirits_cleanup ( MenuPanel * panel)

Definition at line 391 of file pause_spirits.c.

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

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:5311
@ WINDOW_UPDATE_HIDE
Definition enums.h:5312
@ WIN_PAUSE_MAIN
Definition enums.h:5263
@ WIN_PAUSE_SPIRITS_TITLE
Definition enums.h:5283
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};