1
2 // the in-game inventory screen
3
4 #include "nx.h"
5 #include "inventory.h"
6 #include "inventory.fdh"
7
8 #define ARMS_X 10
9 #define ARMS_Y 8
10
11 #define ITEMS_X 10
12 #define ITEMS_Y 60
13
14 static stInventory inv;
15
16 // can't enter Inven if
17 // * script is running
18 // * fade is in progress
19 // * player is dead
20
21 // param is passed as 1 when returning from Map System.
inventory_init(int param)22 bool inventory_init(int param)
23 {
24 memset(&inv, 0, sizeof(inv));
25
26 inv.curselector = &inv.armssel;
27 inv.armssel.cursel = RefreshInventoryScreen();
28 inv.curselector->lastsel = -9999; // run the script first time
29
30 // returning from map system?
31 if (param == 1)
32 {
33 inv.curselector = &inv.itemsel;
34
35 // highlight Map System
36 for(int i=0;i<inv.itemsel.nitems;i++)
37 {
38 if (inv.itemsel.items[i] == 2)
39 {
40 inv.curselector->cursel = i;
41 // textbox NOT up until they move the selector
42 inv.curselector->lastsel = i;
43 break;
44 }
45 }
46 }
47
48 return 0;
49 }
50
51
inventory_tick(void)52 void inventory_tick(void)
53 {
54 // run the selectors
55 RunSelector(inv.curselector);
56
57 // draw
58 DrawScene();
59 DrawInventory();
60 textbox.Draw();
61 }
62
63 /*
64 void c------------------------------() {}
65 */
66
67
68 // reload which items & guns are available.
69 // reset the cursor for the current selector.
70 // return the slot corresponding to the current weapon.
RefreshInventoryScreen(void)71 int RefreshInventoryScreen(void)
72 {
73 int i;
74 int curwpn = 0;
75
76 if (game.mode != GM_INVENTORY)
77 return 0;
78
79 inv.w = 244;
80 inv.h = 152;
81 inv.x = (SCREEN_WIDTH / 2) - (inv.w / 2);
82 inv.y = 8;
83
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++)
88 {
89 if (!player->weapons[i].hasWeapon) continue;
90
91 if (player->curWeapon == i) curwpn = inv.armssel.nitems;
92 inv.armssel.items[inv.armssel.nitems++] = i;
93 }
94
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;
101
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];
107
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;
114
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;
120 }
121
UnlockInventoryInput(void)122 void UnlockInventoryInput(void)
123 {
124 if (inv.lockinput)
125 inv.lockinput = false;
126 }
127
128 /*
129 void c------------------------------() {}
130 */
131
132
DrawInventory(void)133 static void DrawInventory(void)
134 {
135 int x, y, w, i, c;
136
137 // draw the box
138 TextBox::DrawFrame(inv.x, inv.y, inv.w, inv.h);
139
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;
145
146 DrawSelector(&inv.armssel, x, y);
147
148 // draw the arms
149 for(w=1;w<WPN_COUNT;w++)
150 {
151 if (!player->weapons[w].hasWeapon) continue;
152
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);
156
157 x += inv.armssel.spacing_x;
158 }
159
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;
165
166 DrawSelector(&inv.itemsel, x, y);
167
168 c = 0;
169 for(i=0;i<inv.itemsel.nitems;i++)
170 {
171 draw_sprite(x, y, SPR_ITEMIMAGE, inv.itemsel.items[i], 0);
172
173 x += inv.itemsel.spacing_x;
174
175 if (++c >= inv.itemsel.rowlen)
176 {
177 x = inv.x + ITEMS_X;
178 y += inv.itemsel.spacing_y;
179 c = 0;
180 }
181 }
182 }
183
RunSelector(stSelector * selector)184 static void RunSelector(stSelector *selector)
185 {
186 int nrows;
187 int currow, curcol;
188 char toggle = 0;
189
190 if (inv.lockinput)
191 {
192 if (GetCurrentScript()==-1) inv.lockinput = 0;
193 else return;
194 }
195
196 if (selector->nitems)
197 {
198 nrows = (selector->nitems - 1) / selector->rowlen;
199 currow = (selector->cursel / selector->rowlen);
200 curcol = (selector->cursel % selector->rowlen);
201 }
202 else
203 {
204 nrows = currow = curcol = 0;
205 }
206
207 if (justpushed(LEFTKEY))
208 {
209 sound(selector->sound);
210
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;
218 }
219 else selector->cursel--;
220 }
221
222 if (justpushed(RIGHTKEY))
223 {
224 sound(selector->sound);
225
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);
230 }
231 else selector->cursel++;
232 }
233
234 if (justpushed(DOWNKEY))
235 {
236 // on last row?
237 if (currow >= nrows) toggle = 1;
238 else
239 {
240 selector->cursel += selector->rowlen;
241
242 // don't go past last item
243 if (selector->cursel >= selector->nitems)
244 selector->cursel = (selector->nitems - 1);
245
246 sound(selector->sound);
247 }
248 }
249
250 if (justpushed(UPKEY))
251 {
252 // on top row?
253 if (currow == 0) toggle = 1;
254 else
255 {
256 selector->cursel -= selector->rowlen;
257 sound(selector->sound);
258 }
259 }
260
261 // switch to other selector
262 if (toggle)
263 {
264 if (selector == &inv.itemsel)
265 {
266 selector = &inv.armssel;
267 }
268 else
269 {
270 selector = &inv.itemsel;
271 }
272
273 inv.curselector = selector;
274
275 sound(selector->sound);
276 selector->lastsel = -9999;
277 }
278
279 // bring up scripts
280 if (selector->cursel != selector->lastsel)
281 {
282 selector->lastsel = selector->cursel;
283
284 StartScript(selector->items[selector->cursel] + selector->scriptbase, SP_ARMSITEM);
285 }
286
287
288 if (selector == &inv.armssel) // selecting a weapon
289 {
290 if (buttonjustpushed())
291 { // select the new weapon
292 weapon_slide(LEFT, selector->items[selector->cursel]);
293 ExitInventory();
294 }
295 }
296 else // selecting an item
297 {
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;
302 }
303
304 if (justpushed(FIREKEY))
305 ExitInventory();
306 }
307
308 if (justpushed(INVENTORYKEY))
309 ExitInventory();
310 }
311
ExitInventory(void)312 static void ExitInventory(void)
313 {
314 StopScripts();
315 game.setmode(GM_NORMAL);
316 memset(inputs, 0, sizeof(inputs));
317 }
318
319
320
DrawSelector(stSelector * selector,int x,int y)321 static void DrawSelector(stSelector *selector, int x, int y)
322 {
323 int selx, sely;
324 int xsel, ysel;
325
326 if (selector == inv.curselector)
327 {
328 // flash the box
329 if (++selector->animtimer > 1)
330 {
331 selector->animtimer = 0;
332 selector->flashstate ^= 1;
333 }
334 }
335 else
336 { // permanently dim
337 selector->flashstate = 1;
338 selector->animtimer = 99; // light up immediately upon becoming active
339 }
340
341 if (selector->rowlen)
342 {
343 xsel = (selector->cursel % selector->rowlen);
344 ysel = (selector->cursel / selector->rowlen);
345 }
346 else xsel = ysel = 0;
347
348 selx = x + (xsel * selector->spacing_x);
349 sely = y + (ysel * selector->spacing_y);
350 draw_sprite(selx, sely, selector->sprite, selector->flashstate, 0);
351 }
352
353