NXEngine v1.0.0.6
[NXEngine.git] / inventory.cpp
blobb5cdb5b8fc6cb0fea3ed3554efd07e9bc840b96a
2 // the in-game inventory screen
4 #include "nx.h"
5 #include "inventory.h"
6 #include "inventory.fdh"
8 #define ARMS_X 10
9 #define ARMS_Y 8
11 #define ITEMS_X 10
12 #define ITEMS_Y 60
14 static stInventory inv;
16 // can't enter Inven if
17 // * script is running
18 // * fade is in progress
19 // * player is dead
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?
31 if (param == 1)
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;
43 break;
48 return 0;
52 void inventory_tick(void)
54 // run the selectors
55 RunSelector(inv.curselector);
57 // draw
58 DrawScene();
59 DrawInventory();
60 textbox.Draw();
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)
73 int i;
74 int curwpn = 0;
76 if (game.mode != GM_INVENTORY)
77 return 0;
79 inv.w = 244;
80 inv.h = 152;
81 inv.x = (SCREEN_WIDTH / 2) - (inv.w / 2);
82 inv.y = 8;
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;
102 // setup itemsel...
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;
119 return curwpn;
122 void UnlockInventoryInput(void)
124 if (inv.lockinput)
125 inv.lockinput = false;
129 void c------------------------------() {}
133 static void DrawInventory(void)
135 int x, y, w, i, c;
137 // draw the box
138 TextBox::DrawFrame(inv.x, inv.y, inv.w, inv.h);
140 // - draw the weapons ----
141 x = inv.x + ARMS_X;
142 y = inv.y + ARMS_Y;
143 draw_sprite(x, y, SPR_TEXT_ARMS, 0, 0);
144 y += sprites[SPR_TEXT_ARMS].h;
146 DrawSelector(&inv.armssel, x, y);
148 // draw the arms
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 ----
161 x = inv.x + ITEMS_X;
162 y = inv.y + ITEMS_Y;
163 draw_sprite(x, y, SPR_TEXT_ITEMS, 0, 0);
164 y += sprites[SPR_TEXT_ITEMS].h;
166 DrawSelector(&inv.itemsel, x, y);
168 c = 0;
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)
177 x = inv.x + ITEMS_X;
178 y += inv.itemsel.spacing_y;
179 c = 0;
184 static void RunSelector(stSelector *selector)
186 int nrows;
187 int currow, curcol;
188 char toggle = 0;
190 if (inv.lockinput)
192 if (GetCurrentScript()==-1) inv.lockinput = 0;
193 else return;
196 if (selector->nitems)
198 nrows = (selector->nitems - 1) / selector->rowlen;
199 currow = (selector->cursel / selector->rowlen);
200 curcol = (selector->cursel % selector->rowlen);
202 else
204 nrows = currow = curcol = 0;
207 if (justpushed(LEFTKEY))
209 sound(selector->sound);
211 // at beginning of row?
212 if (curcol == 0)
213 { // wrap to end of row
214 if (currow < nrows)
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);
226 // at end of row?
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))
236 // on last row?
237 if (currow >= nrows) toggle = 1;
238 else
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))
252 // on top row?
253 if (currow == 0) toggle = 1;
254 else
256 selector->cursel -= selector->rowlen;
257 sound(selector->sound);
261 // switch to other selector
262 if (toggle)
264 if (selector == &inv.itemsel)
266 selector = &inv.armssel;
268 else
270 selector = &inv.itemsel;
273 inv.curselector = selector;
275 sound(selector->sound);
276 selector->lastsel = -9999;
279 // bring up scripts
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]);
293 ExitInventory();
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);
301 inv.lockinput = 1;
304 if (justpushed(INVENTORYKEY) || justpushed(FIREKEY))
305 ExitInventory();
309 static void ExitInventory(void)
311 StopScripts();
312 game.setmode(GM_NORMAL);
313 memset(inputs, 0, sizeof(inputs));
318 static void DrawSelector(stSelector *selector, int x, int y)
320 int selx, sely;
321 int xsel, ysel;
323 if (selector == inv.curselector)
325 // flash the box
326 if (++selector->animtimer > 1)
328 selector->animtimer = 0;
329 selector->flashstate ^= 1;
332 else
333 { // permanently dim
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);