2 // the in-game inventory screen
6 #include "inventory.fdh"
14 static stInventory inv
;
16 // can't enter Inven if
17 // * script is running
18 // * fade is in progress
21 // param is passed as 1 when returning from Map System.
22 bool inventory_init(int param
)
24 memset(&inv
, 0, sizeof(inv
));
26 inv
.curselector
= &inv
.armssel
;
27 inv
.armssel
.cursel
= RefreshInventoryScreen();
28 inv
.curselector
->lastsel
= -9999; // run the script first time
30 // returning from map system?
33 inv
.curselector
= &inv
.itemsel
;
35 // highlight Map System
36 for(int i
=0;i
<inv
.itemsel
.nitems
;i
++)
38 if (inv
.itemsel
.items
[i
] == 2)
40 inv
.curselector
->cursel
= i
;
41 // textbox NOT up until they move the selector
42 inv
.curselector
->lastsel
= i
;
52 void inventory_tick(void)
55 RunSelector(inv
.curselector
);
64 void c------------------------------() {}
68 // reload which items & guns are available.
69 // reset the cursor for the current selector.
70 // return the slot corresponding to the current weapon.
71 int RefreshInventoryScreen(void)
76 if (game
.mode
!= GM_INVENTORY
)
81 inv
.x
= (SCREEN_WIDTH
/ 2) - (inv
.w
/ 2);
84 // find current weapon and count # items for armssel selector
85 inv
.armssel
.items
[0] = 0; // show "no weapon" in case of no weapon
86 inv
.armssel
.nitems
= 0;
87 for(i
=1;i
<WPN_COUNT
;i
++)
89 if (!player
->weapons
[i
].hasWeapon
) continue;
91 if (player
->curWeapon
== i
) curwpn
= inv
.armssel
.nitems
;
92 inv
.armssel
.items
[inv
.armssel
.nitems
++] = i
;
95 inv
.armssel
.spacing_x
= 40;
96 inv
.armssel
.spacing_y
= 0;
97 inv
.armssel
.sprite
= SPR_SELECTOR_ARMS
;
98 inv
.armssel
.sound
= SND_SWITCH_WEAPON
;
99 inv
.armssel
.scriptbase
= 1000;
100 inv
.armssel
.rowlen
= inv
.armssel
.nitems
;
103 inv
.itemsel
.nitems
= player
->ninventory
;
104 inv
.itemsel
.items
[0] = 0; // show "no item" in case of no items
105 for(i
=0;i
<player
->ninventory
;i
++)
106 inv
.itemsel
.items
[i
] = player
->inventory
[i
];
108 inv
.itemsel
.spacing_x
= sprites
[SPR_ITEMIMAGE
].w
;
109 inv
.itemsel
.spacing_y
= sprites
[SPR_ITEMIMAGE
].h
+ 2;
110 inv
.itemsel
.sprite
= SPR_SELECTOR_ITEMS
;
111 inv
.itemsel
.sound
= SND_MENU_MOVE
;
112 inv
.itemsel
.rowlen
= 6;
113 inv
.itemsel
.scriptbase
= 5000;
115 inv
.curselector
->cursel
= 0;
116 // after an item has been used don't bring up the script of whatever item
117 // the selector is moved to
118 inv
.curselector
->lastsel
= inv
.curselector
->cursel
;
122 void UnlockInventoryInput(void)
125 inv
.lockinput
= false;
129 void c------------------------------() {}
133 static void DrawInventory(void)
138 TextBox::DrawFrame(inv
.x
, inv
.y
, inv
.w
, inv
.h
);
140 // - draw the weapons ----
143 draw_sprite(x
, y
, SPR_TEXT_ARMS
, 0, 0);
144 y
+= sprites
[SPR_TEXT_ARMS
].h
;
146 DrawSelector(&inv
.armssel
, x
, y
);
149 for(w
=1;w
<WPN_COUNT
;w
++)
151 if (!player
->weapons
[w
].hasWeapon
) continue;
153 draw_sprite(x
+1, y
+1, SPR_ARMSICONS
, w
, 0);
154 DrawWeaponLevel(x
+1, y
+16, w
);
155 DrawWeaponAmmo(x
+1, y
+16+8, w
);
157 x
+= inv
.armssel
.spacing_x
;
160 // - draw the items ----
163 draw_sprite(x
, y
, SPR_TEXT_ITEMS
, 0, 0);
164 y
+= sprites
[SPR_TEXT_ITEMS
].h
;
166 DrawSelector(&inv
.itemsel
, x
, y
);
169 for(i
=0;i
<inv
.itemsel
.nitems
;i
++)
171 draw_sprite(x
, y
, SPR_ITEMIMAGE
, inv
.itemsel
.items
[i
], 0);
173 x
+= inv
.itemsel
.spacing_x
;
175 if (++c
>= inv
.itemsel
.rowlen
)
178 y
+= inv
.itemsel
.spacing_y
;
184 static void RunSelector(stSelector
*selector
)
192 if (GetCurrentScript()==-1) inv
.lockinput
= 0;
196 if (selector
->nitems
)
198 nrows
= (selector
->nitems
- 1) / selector
->rowlen
;
199 currow
= (selector
->cursel
/ selector
->rowlen
);
200 curcol
= (selector
->cursel
% selector
->rowlen
);
204 nrows
= currow
= curcol
= 0;
207 if (justpushed(LEFTKEY
))
209 sound(selector
->sound
);
211 // at beginning of row?
213 { // wrap to end of row
215 selector
->cursel
+= (selector
->rowlen
- 1);
216 else if (selector
->nitems
> 0)
217 selector
->cursel
= selector
->nitems
- 1;
219 else selector
->cursel
--;
222 if (justpushed(RIGHTKEY
))
224 sound(selector
->sound
);
227 if (curcol
==selector
->rowlen
-1 || selector
->cursel
+1 >= selector
->nitems
)
228 { // wrap to beginning of row
229 selector
->cursel
= (currow
* selector
->rowlen
);
231 else selector
->cursel
++;
234 if (justpushed(DOWNKEY
))
237 if (currow
>= nrows
) toggle
= 1;
240 selector
->cursel
+= selector
->rowlen
;
242 // don't go past last item
243 if (selector
->cursel
>= selector
->nitems
)
244 selector
->cursel
= (selector
->nitems
- 1);
246 sound(selector
->sound
);
250 if (justpushed(UPKEY
))
253 if (currow
== 0) toggle
= 1;
256 selector
->cursel
-= selector
->rowlen
;
257 sound(selector
->sound
);
261 // switch to other selector
264 if (selector
== &inv
.itemsel
)
266 selector
= &inv
.armssel
;
270 selector
= &inv
.itemsel
;
273 inv
.curselector
= selector
;
275 sound(selector
->sound
);
276 selector
->lastsel
= -9999;
280 if (selector
->cursel
!= selector
->lastsel
)
282 selector
->lastsel
= selector
->cursel
;
284 StartScript(selector
->items
[selector
->cursel
] + selector
->scriptbase
, SP_ARMSITEM
);
288 if (selector
== &inv
.armssel
) // selecting a weapon
290 if (buttonjustpushed())
291 { // select the new weapon
292 weapon_slide(LEFT
, selector
->items
[selector
->cursel
]);
296 else // selecting an item
298 if (justpushed(JUMPKEY
))
299 { // bring up "more info" or "equip" script for this item
300 StartScript(selector
->items
[selector
->cursel
] + selector
->scriptbase
+ 1000, SP_ARMSITEM
);
304 if (justpushed(INVENTORYKEY
) || justpushed(FIREKEY
))
309 static void ExitInventory(void)
312 game
.setmode(GM_NORMAL
);
313 memset(inputs
, 0, sizeof(inputs
));
318 static void DrawSelector(stSelector
*selector
, int x
, int y
)
323 if (selector
== inv
.curselector
)
326 if (++selector
->animtimer
> 1)
328 selector
->animtimer
= 0;
329 selector
->flashstate
^= 1;
334 selector
->flashstate
= 1;
335 selector
->animtimer
= 99; // light up immediately upon becoming active
338 if (selector
->rowlen
)
340 xsel
= (selector
->cursel
% selector
->rowlen
);
341 ysel
= (selector
->cursel
/ selector
->rowlen
);
343 else xsel
= ysel
= 0;
345 selx
= x
+ (xsel
* selector
->spacing_x
);
346 sely
= y
+ (ysel
* selector
->spacing_y
);
347 draw_sprite(selx
, sely
, selector
->sprite
, selector
->flashstate
, 0);