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