1 /*
2
3 Copyright (C) 2015-2018 Night Dive Studios, LLC.
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 */
19 /*
20 * $Source: r:/prj/cit/src/RCS/hkeyfunc.c $
21 * $Revision: 1.173 $
22 * $Author: dc $
23 * $Date: 1994/11/18 00:24:50 $
24 */
25
26 #define __HKEYFUNC_SRC
27
28 #include <string.h>
29 #include <stdlib.h>
30
31 #include "Shock.h"
32 #include "Prefs.h"
33
34 #include "fullscrn.h"
35 #include "loops.h"
36 #include "mfdint.h"
37 #include "mfdext.h"
38 #include "MacTune.h"
39 #include "musicai.h"
40 #include "objwpn.h"
41 #include "saveload.h"
42 #include "softdef.h"
43 #include "tools.h"
44 #include "wares.h"
45 #include "mouselook.h"
46 #include "audiolog.h"
47 #include "Xmi.h"
48
49 //--------------
50 // PROTOTYPES
51 //--------------
52 int select_object_by_class(int obclass, int num, ubyte *quantlist);
53
54 #ifdef NOT_YET //
55
56 #include <frprotox.h>
57 #include <wrapper.h>
58 #include <saveload.h>
59 #include <player.h>
60 #include <physics.h>
61 #include <fauxrint.h>
62 #include <frcamera.h>
63 #include <version.h>
64 #include <objsim.h>
65 #include <gamewrap.h>
66 #include <damage.h>
67 #include <cutscene.h>
68 #include <cursors.h>
69 #include <render.h>
70 #include <status.h>
71 #include <scrntext.h>
72 #include <keydefs.h>
73 #include <gamescr.h>
74 #include <gamestrn.h>
75 #include <shodan.h>
76 #include <cybmem.h>
77 #include <gr2ss.h>
78
79 #include <cybstrng.h>
80 #include <memstat.h>
81
82 #define SIGNATURE "giSoink"
83 #define CFG_HKEY_GO "cyberia"
84 uchar yes_3d = TRUE;
85 extern uchar properties_changed;
86
87 #ifdef PLAYTEST
88 #pragma disable_message(202)
maim_player(ushort keycode,uint32_t context,intptr_t data)89 uchar maim_player(ushort keycode, uint32_t context, intptr_t data) {
90 player_struct.hit_points = 5;
91 return TRUE;
92 }
93 #pragma enable_message(202)
94
95 #pragma disable_message(202)
salt_the_player(ushort keycode,uint32_t context,intptr_t data)96 uchar salt_the_player(ushort keycode, uint32_t context, intptr_t data) {
97 if (config_get_raw(CFG_HKEY_GO, NULL, 0)) {
98 player_struct.hit_points = 255;
99 player_struct.cspace_hp = 255;
100 memset(player_struct.hit_points_lost, 0, NUM_DAMAGE_TYPES);
101 player_struct.energy = 255;
102 player_struct.fatigue = 0;
103 player_struct.experience = TRUE;
104 chg_set_flg(VITALS_UPDATE);
105 } else {
106 message_info("Winners don't use hotkeys");
107 damage_player(25, EXPLOSION_FLAG, 0);
108 }
109 return TRUE;
110 }
111
automap_seen(ushort keycode,uint32_t context,intptr_t data)112 uchar automap_seen(ushort keycode, uint32_t context, intptr_t data) {
113 ushort x, y;
114 MapElem *pme;
115
116 if (config_get_raw(CFG_HKEY_GO, NULL, 0)) {
117 for (x = 0; x < MAP_XSIZE; x++) {
118 for (y = 0; y < MAP_YSIZE; y++) {
119 me_bits_seen_set(MAP_GET_XY(x, y));
120 }
121 }
122 }
123 return TRUE;
124 }
125
126 extern errtype give_player_loot(Player *pplr);
127
give_player_hotkey(ushort keycode,uint32_t context,intptr_t data)128 uchar give_player_hotkey(ushort keycode, uint32_t context, intptr_t data) {
129 if (config_get_raw(CFG_HKEY_GO, NULL, 0)) {
130 give_player_loot(&player_struct);
131 chg_set_flg(INVENTORY_UPDATE);
132 mfd_force_update();
133 }
134 return TRUE;
135 }
136
137 #pragma enable_message(202)
138 #endif
139
140 #ifdef PLAYTEST
141 uchar new_cone_clip = TRUE;
142
143 #pragma disable_message(202)
change_clipper(ushort keycode,uint32_t context,intptr_t data)144 uchar change_clipper(ushort keycode, uint32_t context, intptr_t data) {
145 extern errtype render_run(void);
146 new_cone_clip = !new_cone_clip;
147 if (new_cone_clip)
148 mprintf("NEW CONE CLIP\n");
149 else
150 mprintf("OLD CONE CLIP\n");
151 render_run();
152 return TRUE;
153 }
154 #pragma enable_message(202)
155 #endif
156
157 #pragma disable_message(202)
quit_key_func(ushort keycode,uint32_t context,intptr_t data)158 uchar quit_key_func(ushort keycode, uint32_t context, intptr_t data) {
159 #ifndef GAMEONLY
160 extern uchar possible_change;
161 #endif
162
163 #ifndef GAMEONLY
164 if ((!possible_change) || (confirm_box("Level changed without save. Really exit?")))
165 #endif
166 {
167 _new_mode = -1;
168 chg_set_flg(GL_CHG_LOOP);
169 }
170 return TRUE;
171 }
172
173 extern void loopmode_exit(short), loopmode_enter(short);
174
keyhelp_hotkey_func(ushort keycode,uint32_t context,intptr_t data)175 uchar keyhelp_hotkey_func(ushort keycode, uint32_t context, intptr_t data) {
176 void *keyhelp_txtscrn;
177 int fake_inp = 0;
178 extern errtype update_state(uchar time_passes);
179
180 loopmode_exit(_current_loop);
181
182 uiHideMouse(NULL);
183 uiFlush();
184
185 #ifdef RES_keyhelp
186 keyhelp_txtscrn = scrntext_init(RES_smallTechFont, 0x4C, RES_keyhelp);
187 while (scrntext_advance(keyhelp_txtscrn, fake_inp)) {
188
189 fake_inp = 0;
190
191 // translate keys to escape
192 if (uiCheckInput()) {
193 fake_inp = KEY_PGDN;
194 }
195 tight_loop(FALSE);
196 }
197
198 scrntext_free(keyhelp_txtscrn);
199 #else
200 Warning(("Ce n'est pas RES_keyhelp\n"));
201 #endif
202
203 uiShowMouse(NULL);
204
205 update_state(FALSE);
206 loopmode_enter(_current_loop);
207
208 return TRUE;
209 }
210 #endif // NOT_YET
211
really_quit_key_func(ushort keycode,uint32_t context,intptr_t data)212 uchar really_quit_key_func(ushort keycode, uint32_t context, intptr_t data) {
213 extern uchar gPlayingGame;
214 gPlayingGame = FALSE;
215 return TRUE;
216 }
217
toggle_bool_func(ushort keycode,uint32_t context,intptr_t data)218 uchar toggle_bool_func(ushort keycode, uint32_t context, intptr_t data) {
219 bool *tgl = (bool *)data;
220 *tgl = !*tgl;
221 return TRUE;
222 }
223
224 extern bool DoubleSize;
225
change_mode_func(ushort keycode,uint32_t context,intptr_t data)226 uchar change_mode_func(ushort keycode, uint32_t context, intptr_t data) {
227 int newm = (int)data;
228
229 if ((newm == AUTOMAP_LOOP) && ((!player_struct.hardwarez[HARDWARE_AUTOMAP]) || (global_fullmap->cyber)))
230 return TRUE;
231 _new_mode = newm;
232 chg_set_flg(GL_CHG_LOOP);
233 return TRUE;
234 }
235
236 #ifdef NOT_YET //
237
238 #ifdef HANDART_ADJUST
239
240 short hdx = 0, hdy = 0;
241 ubyte hcount = 0;
242
move_handart(ushort keycode,uint32_t context,intptr_t data)243 uchar move_handart(ushort keycode, uint32_t context, intptr_t data) {
244 short amt = 1;
245 ubyte foo = (ubyte)data;
246 short *dir;
247
248 if (foo & 0x10) {
249 hdx = hdy = 0;
250 return TRUE;
251 }
252
253 if (foo & 0x08)
254 amt = 10;
255 foo &= 0x7F;
256 dir = (foo & 0x02) ? &hdx : &hdy;
257
258 if (foo & 0x01)
259 (*dir) += amt;
260 else
261 (*dir) -= amt;
262
263 return TRUE;
264 }
265
adv_handart(ushort keycode,uint32_t context,intptr_t data)266 uchar adv_handart(ushort keycode, uint32_t context, intptr_t data) {
267 hcount = (hcount + 1) % 5;
268 return TRUE;
269 }
270
271 #endif // HANDART_ADJUST
272
toggle_view_func(ushort keycode,uint32_t context,intptr_t data)273 uchar toggle_view_func(ushort keycode, uint32_t context, intptr_t data) {
274 extern uchar full_game_3d;
275 return (change_mode_func(keycode, context, (full_game_3d) ? GAME_LOOP : FULLSCREEN_LOOP));
276 }
277
278 #endif // NOT_YET
279
start_music(void)280 void start_music(void) {
281 extern errtype mlimbs_AI_init(void);
282
283 // if (music_card)
284 // {
285 if (MacTuneInit() == 0) {
286 music_on = TRUE;
287 mlimbs_on = TRUE;
288 mlimbs_AI_init();
289 load_score_for_location(PLAYER_BIN_X, PLAYER_BIN_Y);
290 MacTuneStartCurrentTheme();
291 } else {
292 gShockPrefs.soBackMusic = FALSE;
293 SavePrefs();
294 }
295 // }
296 }
297
stop_music(void)298 void stop_music(void) {
299 extern uchar mlimbs_on;
300
301 MacTuneShutdown();
302 music_on = FALSE;
303 mlimbs_on = FALSE;
304 mlimbs_peril = DEFAULT_PERIL_MIN;
305 mlimbs_monster = NO_MONSTER;
306 }
307
toggle_music_func(ushort keycode,uint32_t context,intptr_t data)308 uchar toggle_music_func(ushort keycode, uint32_t context, intptr_t data) {
309 if (music_on) {
310 message_info("Music off.");
311 StopTheMusic(); //do this here, not in stop_music(), to prevent silence when changing levels
312 stop_music();
313 } else {
314 start_music();
315 message_info("Music on.");
316 }
317
318 gShockPrefs.soBackMusic = music_on;
319 SavePrefs();
320
321 return (FALSE);
322 }
323
arm_grenade_hotkey(ushort keycode,uint32_t context,intptr_t data)324 uchar arm_grenade_hotkey(ushort keycode, uint32_t context, intptr_t data) {
325 extern uchar show_all_actives;
326 extern void super_drop_func(int dispnum, int row);
327 extern void mfd_force_update(void);
328 extern errtype inventory_draw(void);
329 extern short inv_last_page;
330 extern uchar activate_grenade_on_cursor(void);
331 int i, row, act;
332
333 if (!show_all_actives) {
334 show_all_actives = TRUE;
335 inv_last_page = -1;
336 chg_set_flg(INVENTORY_UPDATE);
337 mfd_force_update();
338 return TRUE;
339 }
340 if (activate_grenade_on_cursor())
341 return TRUE;
342 act = player_struct.actives[ACTIVE_GRENADE];
343 for (i = row = 0; i < act; i++)
344 if (player_struct.grenades[i])
345 row++;
346 super_drop_func(ACTIVE_GRENADE, row);
347 return TRUE;
348 }
349
select_object_by_class(int obclass,int num,ubyte * quantlist)350 int select_object_by_class(int obclass, int num, ubyte *quantlist) {
351 extern uchar show_all_actives;
352 extern short inv_last_page;
353 int act = player_struct.actives[obclass];
354 int newobj = act;
355
356 inv_last_page = -1;
357 chg_set_flg(INVENTORY_UPDATE);
358 if (!show_all_actives) {
359 show_all_actives = TRUE;
360 return -1;
361 }
362 do {
363 newobj = (newobj + 1) % num;
364 } while (quantlist[newobj] == 0 && newobj != act);
365
366 player_struct.actives[obclass] = newobj;
367 return newobj;
368 }
369
select_grenade_hotkey(ushort keycode,uint32_t context,intptr_t data)370 uchar select_grenade_hotkey(ushort keycode, uint32_t context, intptr_t data) {
371 int newobj;
372
373 newobj = select_object_by_class(ACTIVE_GRENADE, NUM_GRENADES, player_struct.grenades);
374 set_inventory_mfd(MFD_INV_GRENADE, newobj, TRUE);
375 return TRUE;
376 }
377
select_drug_hotkey(ushort keycode,uint32_t context,intptr_t data)378 uchar select_drug_hotkey(ushort keycode, uint32_t context, intptr_t data) {
379 int newobj;
380
381 newobj = select_object_by_class(ACTIVE_DRUG, NUM_DRUGS, player_struct.drugs);
382 set_inventory_mfd(MFD_INV_DRUG, newobj, TRUE);
383 return TRUE;
384 }
385
use_drug_hotkey(ushort keycode,uint32_t context,intptr_t data)386 uchar use_drug_hotkey(ushort keycode, uint32_t context, intptr_t data) {
387 extern uchar show_all_actives;
388 extern void super_use_func(int dispnum, int row);
389 extern void mfd_force_update(void);
390 extern errtype inventory_draw(void);
391 extern short inv_last_page;
392 int i, row, act;
393
394 if (!show_all_actives) {
395 show_all_actives = TRUE;
396 inv_last_page = -1; // to force redraw
397 chg_set_flg(INVENTORY_UPDATE);
398 return TRUE;
399 }
400 act = player_struct.actives[ACTIVE_DRUG];
401 for (i = row = 0; i < act; i++)
402 if (player_struct.drugs[i])
403 row++;
404 super_use_func(ACTIVE_DRUG, row);
405 return TRUE;
406 }
407
clear_fullscreen_func(ushort keycode,uint32_t context,intptr_t data)408 uchar clear_fullscreen_func(ushort keycode, uint32_t context, intptr_t data) {
409 extern char last_message[128];
410 extern MFD mfd[2];
411
412 full_lower_region(&mfd[MFD_RIGHT].reg2);
413 full_lower_region(&mfd[MFD_LEFT].reg2);
414 full_lower_region(inventory_region_full);
415 full_visible = 0;
416 strcpy(last_message, "");
417 chg_unset_sta(FULLSCREEN_UPDATE);
418 return (FALSE);
419 }
420
421 #ifdef NOT_YET // KLC
422
423 #ifndef GAMEONLY
zoom_func(ushort keycode,uint32_t context,intptr_t data)424 uchar zoom_func(ushort keycode, uint32_t context, intptr_t data) {
425 ushort zoom;
426
427 TileMapGetZoom(NULL, &zoom);
428 if (data == ZOOM_IN) {
429 zoom++;
430 } else
431 zoom = (zoom == 1) ? 1 : zoom - 1;
432 TileMapSetZoom(NULL, zoom);
433 return TRUE;
434 }
435
do_popup_textmenu(ushort keycode,uint32_t context,intptr_t g)436 uchar do_popup_textmenu(ushort keycode, uint32_t context, intptr_t g) {
437 extern errtype textmenu_popup(Gadget * parent);
438
439 textmenu_popup((Gadget *)g);
440 return TRUE;
441 }
442 #endif
443
444 #define MAP_FNAME "map.dat"
445
446 #ifdef PLAYTEST
edit_load_func(char * fn,uchar source,short level_num)447 void edit_load_func(char *fn, uchar source, short level_num) {
448 char buf[256], *buf2;
449 errtype retval;
450 extern Datapath savegame_dpath;
451 extern char real_archive_fn[20];
452 extern void store_objects(char **buf, ObjID *obj_array, char obj_count);
453 extern void restore_objects(char *buf, ObjID *obj_array, char obj_count);
454 extern char *get_proj_datadir(char *);
455
456 // if (level_num != 1)
457 // player_struct.level = 1;
458 if (!strnicmp(fn, "level", 5))
459 player_struct.level = atoi(strncpy(buf, fn + 5, 2));
460 store_objects(&buf2, player_struct.inventory, NUM_GENERAL_SLOTS);
461 switch (source) {
462 case 0: // local
463 strcpy(buf, DATADIR);
464 strcat(buf, fn);
465 retval = load_current_map(buf, LEVEL_ID_NUM, NULL);
466 break;
467 case 1: // currsave
468 retval = load_level_from_file(level_num);
469 break;
470 case 2: // archive
471 retval = load_current_map(real_archive_fn, ResIdFromLevel(level_num), &savegame_dpath);
472 break;
473 case 3: // network
474 if (get_proj_datadir(buf) != NULL) {
475 strcat(buf, fn);
476 retval = load_current_map(buf, LEVEL_ID_NUM, NULL);
477 } else
478 retval = ERR_NULL;
479 break;
480 case 4: // Old Res
481 retval = load_current_map(fn, OLD_LEVEL_ID_NUM, &savegame_dpath);
482 break;
483 }
484 restore_objects(buf2, player_struct.inventory, NUM_GENERAL_SLOTS);
485 switch (retval) {
486 case ERR_FOPEN:
487 sprintf(buf, "Error opening %s", fn);
488 message_box(buf);
489 break;
490 case ERR_NOEFFECT:
491 message_box("bad map version.");
492 break;
493 case OK:
494 compute_shodometer_value(FALSE);
495 config_set_single_value(CFG_LEVEL_VAR, CONFIG_STRING_TYPE, fn);
496 #ifndef GAMEONLY
497 TileMapRedrawPixels(NULL, NULL);
498 chg_set_flg(EDITVIEW_UPDATE);
499 #endif
500 message_info("Load complete");
501 break;
502 }
503 }
504 #endif
505
506 #ifdef GADGET
load_level_func(ushort keycode,uint32_t context,intptr_t data)507 uchar load_level_func(ushort keycode, uint32_t context, intptr_t data) {
508 char fn[256];
509 #ifndef GAMEONLY
510 extern uchar possible_change;
511 #endif
512 extern Gadget *edit_root_gadget;
513
514 fn[0] = '\0';
515 #ifndef GAMEONLY
516 if ((!possible_change) || (confirm_box("Level changed without save! Load anyways?")))
517 #endif
518 level_saveload_box("Load Map", _current_root, 1, fn, edit_load_func, TRUE);
519 return (TRUE);
520 }
521 #endif
522
523 #define BACKUP_FNAME "shockbak.dat"
524
525 #ifdef PLAYTEST
edit_save_func(char * fn,uchar source,short level_num)526 void edit_save_func(char *fn, uchar source, short level_num) {
527 char buf[64], b2[64];
528 extern void reset_schedules(void);
529 #ifndef GAMEONLY
530 extern uchar possible_change;
531 #endif
532 extern char savegame_dir[50];
533 extern Datapath savegame_dpath;
534
535 Spew(DSRC_EDITOR_Restore, ("edit_save_func: fn = %s\n", fn));
536
537 // Make a backup of previous file, if it exists
538 if (DatapathFind(&savegame_dpath, fn, buf)) {
539 strcpy(b2, savegame_dir);
540 strcat(b2, "\\");
541 strcat(b2, BACKUP_FNAME);
542 copy_file(buf, b2);
543 }
544 strcpy(buf, fn);
545 reset_schedules();
546 switch (save_current_map(buf, LEVEL_ID_NUM, TRUE, TRUE)) {
547 case ERR_FOPEN:
548 sprintf(buf, "Error opening %s", fn);
549 message_box(buf);
550 break;
551 case OK:
552 message_info("Save complete.");
553 config_set_single_value(CFG_LEVEL_VAR, CONFIG_STRING_TYPE, fn);
554 #ifndef GAMEONLY
555 possible_change = FALSE;
556 #endif
557 break;
558 }
559 }
560 #endif
561
562 #ifdef GADGET
save_level_func(ushort keycode,uint32_t context,intptr_t data)563 uchar save_level_func(ushort keycode, uint32_t context, intptr_t data) {
564 if (!saves_allowed) {
565 message_box("Saves not allowed -- use control panel to change");
566 return (FALSE);
567 }
568 if ((default_fname == NULL) && !config_get_raw(CFG_LEVEL_VAR, default_fname, 256))
569 strcpy(default_fname, MAP_FNAME);
570 Spew(DSRC_EDITOR_Restore, ("default_fname = %s\n", default_fname));
571 level_saveload_box("Save Map", _current_root, 1, default_fname, edit_save_func, FALSE);
572 return (TRUE);
573 }
574 #endif
575
576 #ifndef GAMEONLY
toggle_3d_func(ushort keycode,uint32_t context,intptr_t data)577 uchar toggle_3d_func(ushort keycode, uint32_t context, intptr_t data) {
578 TileEditor *te = (TileEditor *)data;
579 // uchar yes3d = !chg_get_sta(EDITVIEW_UPDATE);
580 Point newsize;
581 Point newloc;
582 int z;
583
584 if (yes_3d) {
585 newsize.x = TILEMAP_REGION_WIDTH;
586 newsize.y = TILEMAP_REGION_HEIGHT;
587 newloc.x = TILEMAP_REGION_X;
588 newloc.y = TILEMAP_REGION_Y;
589 z = 0;
590 chg_set_flg(EDITVIEW_UPDATE);
591 } else {
592 newsize.x = VIEW_REGION_WIDTH + TILEMAP_REGION_WIDTH;
593 newsize.y = TILEMAP_REGION_HEIGHT;
594 z = 1;
595 newloc.x = VIEW_REGION_X;
596 newloc.y = VIEW_REGION_Y;
597 chg_unset_flg(EDITVIEW_UPDATE);
598 }
599 yes_3d = !yes_3d;
600 region_begin_sequence();
601 TileEditorResize(te, newsize);
602 TileEditorMove(te, newloc, z);
603 region_end_sequence(TRUE);
604 return TRUE;
605 }
606
tilemap_mode_func(ushort keycode,uint32_t context,intptr_t data)607 uchar tilemap_mode_func(ushort keycode, uint32_t context, intptr_t data) {
608 int mode;
609 extern errtype terrain_palette_popup(void);
610 extern void bitsmode_palette_popup(void);
611 extern void cutpaste_palette_popup(void);
612 extern void cybpal_popup(void);
613 mode = (int)data;
614 if (mode != current_palette_mode) {
615 current_palette_mode = mode;
616 switch (mode) {
617 case OBJECT_MODE:
618 object_palette_popup();
619 break;
620 case TERRAIN_MODE:
621 terrain_palette_popup();
622 break;
623 case EYEBALL_MODE:
624 eyeball_palette_popup();
625 break;
626 case CUTPASTE_MODE:
627 cutpaste_palette_popup();
628 break;
629 case TEXTURING_MODE:
630 if (global_fullmap->cyber)
631 cybpal_popup();
632 else
633 texture_palette_popup();
634 break;
635 case BITS_MODE:
636 bitsmode_palette_popup();
637 break;
638 }
639 }
640 return (TRUE);
641 }
642
draw_mode_func(ushort keycode,uint32_t context,intptr_t data)643 uchar draw_mode_func(ushort keycode, uint32_t context, intptr_t data) {
644 TileEditorSetMode(NULL, (int)data);
645 return (TRUE);
646 }
647
clear_highlight_func(ushort keycode,uint32_t context,intptr_t data)648 uchar clear_highlight_func(ushort keycode, uint32_t context, intptr_t data) {
649 TileMapClearHighlights(NULL);
650 TileMapRedrawPixels(NULL, NULL);
651 return TRUE;
652 }
653 #endif
654
655 #ifndef GAMEONLY
texture_selection_func(ushort keycode,uint32_t context,intptr_t data)656 uchar texture_selection_func(ushort keycode, uint32_t context, intptr_t data) {
657 #ifdef TEXTURE_SELECTION
658 textpal_create_selector();
659 #endif
660 return (TRUE);
661 }
662 #endif
663
664 #ifdef GADGET
lighting_func(ushort keycode,uint32_t context,intptr_t data)665 uchar lighting_func(ushort keycode, uint32_t context, intptr_t data) {
666 panel_create_lighting();
667 return (TRUE);
668 }
669
inp6d_panel_func(ushort keycode,uint32_t context,intptr_t data)670 uchar inp6d_panel_func(ushort keycode, uint32_t context, intptr_t data) {
671 extern void panel_create_inp6d(void);
672 panel_create_inp6d();
673 return (TRUE);
674 }
675
render_panel_func(ushort keycode,uint32_t context,intptr_t data)676 uchar render_panel_func(ushort keycode, uint32_t context, intptr_t data) {
677 panel_create_renderer();
678 return (TRUE);
679 }
680
popup_tilemap_func(ushort keycode,uint32_t context,intptr_t data)681 uchar popup_tilemap_func(ushort keycode, uint32_t context, intptr_t data) { return (TRUE); }
682
683 #endif
684
685 #ifdef PLAYTEST
bkpt_me(ushort keycode,uint32_t context,intptr_t data)686 uchar bkpt_me(ushort keycode, uint32_t context, intptr_t data) { // put a break point here, goof
687 return TRUE;
688 }
689 #endif
690
691 #ifdef GADGET
editor_options_func(ushort keycode,uint32_t context,intptr_t data)692 uchar editor_options_func(ushort keycode, uint32_t context, intptr_t data) {
693 editor_options->parent = _current_root;
694 gad_menu_popup_at_mouse(editor_options);
695 return (TRUE);
696 }
697
editor_modes_func(ushort keycode,uint32_t context,intptr_t data)698 uchar editor_modes_func(ushort keycode, uint32_t context, intptr_t data) {
699 editor_modes->parent = _current_root;
700 gad_menu_popup_at_mouse(editor_modes);
701 return (TRUE);
702 }
703
misc_menu_func(ushort keycode,uint32_t context,intptr_t data)704 uchar misc_menu_func(ushort keycode, uint32_t context, intptr_t data) {
705 main_misc_menu->parent = _current_root;
706 main_misc_menu->parent = _current_root;
707 renderer_misc_menu->parent = _current_root;
708 gamesys_misc_menu->parent = _current_root;
709 editor_misc_menu->parent = _current_root;
710 misc_misc_menu->parent = _current_root;
711 report_sys_menu->parent = _current_root;
712 gad_menu_popup_at_mouse(main_misc_menu);
713 return (TRUE);
714 }
715
control_panel_func(ushort keycode,uint32_t context,intptr_t data)716 uchar control_panel_func(ushort keycode, uint32_t context, intptr_t data) {
717 panel_create_control();
718 return (TRUE);
719 }
720 #endif
721
722 #ifndef GAMEONLY
do_find_func(ushort keycode,int32_t context,intptr_t data)723 uchar do_find_func(ushort keycode, int32_t context, intptr_t data) {
724 int hilite_num;
725 extern errtype generic_tile_eyedropper(TileEditor * te);
726 extern errtype TerrainPalUpdate(struct _terrainpal * tp);
727 extern void texture_palette_update(void);
728
729 // hilite_num = 0;
730 switch (current_palette_mode) {
731 case OBJECT_MODE:
732 TileMapFindHighlightNum(NULL, &hilite_num);
733 object_find_func(hilite_num);
734 break;
735 case TERRAIN_MODE:
736 generic_tile_eyedropper(NULL);
737 TerrainPalUpdate(NULL);
738 break;
739 case TEXTURING_MODE:
740 generic_tile_eyedropper(NULL);
741 texture_palette_update();
742 break;
743
744 default:
745 generic_tile_eyedropper(NULL);
746 break;
747 }
748 TileMapRedrawSquares(NULL, NULL);
749 return (TRUE);
750 }
751 #endif
752
753 #ifdef PLAYTEST
754 #ifndef GAMEONLY
755 uchar inp6d_kbd = TRUE;
756 #else
757 uchar inp6d_kbd = FALSE;
758 #endif
759
stupid_slew_func(ushort keycode,uint32_t context,intptr_t data)760 uchar stupid_slew_func(ushort keycode, uint32_t context, intptr_t data) {
761 int dir = (int)data;
762 int v1, v2;
763 static int slew_scale = 16;
764 extern uchar inp6d_kbd;
765
766 if (inp6d_kbd == FALSE)
767 return TRUE;
768
769 switch (dir) {
770 case 1:
771 v1 = EYE_Y;
772 v2 = slew_scale;
773 break;
774 case 2:
775 v1 = EYE_H;
776 v2 = -slew_scale;
777 break;
778 case 3:
779 v1 = EYE_Y;
780 v2 = -slew_scale;
781 break;
782 case 4:
783 v1 = EYE_H;
784 v2 = slew_scale;
785 break;
786 case 5:
787 v1 = EYE_Z;
788 v2 = slew_scale;
789 break;
790 case 6:
791 v1 = EYE_Z;
792 v2 = -slew_scale;
793 break;
794 case 7:
795 v1 = EYE_P;
796 v2 = -slew_scale;
797 break;
798 case 8:
799 v1 = EYE_P;
800 v2 = slew_scale;
801 break;
802 case 9:
803 v1 = EYE_B;
804 v2 = -slew_scale;
805 break;
806 case 10:
807 v1 = EYE_B;
808 v2 = slew_scale;
809 break;
810 case 11:
811 v1 = EYE_X;
812 v2 = slew_scale;
813 break;
814 case 12:
815 v1 = EYE_X;
816 v2 = -slew_scale;
817 break;
818 case 13:
819 v1 = EYE_RESET;
820 v2 = -slew_scale;
821 break;
822 case 14:
823 if (slew_scale < 256)
824 slew_scale <<= 1;
825 return TRUE;
826 case 15:
827 if (slew_scale > 1)
828 slew_scale >>= 1;
829 return TRUE;
830 }
831 fr_camera_slewcam(NULL, v1, v2);
832 if (_current_loop <= FULLSCREEN_LOOP)
833 chg_set_flg(DEMOVIEW_UPDATE);
834 #ifndef GAMEONLY
835 if (_current_loop == EDIT_LOOP) {
836 TileMapUpdateCameras(NULL);
837 chg_set_flg(EDITVIEW_UPDATE);
838 }
839 #endif
840 return (TRUE);
841 }
842
zoom_3d_func(ushort keycode,uint32_t context,intptr_t data)843 uchar zoom_3d_func(ushort keycode, uint32_t context, intptr_t data) {
844 uchar zoomin = (bool)data;
845
846 // cant this be current based?
847 if (zoomin)
848 fr_mod_cams(_current_fr_context, FR_NOCAM, fix_make(0, 62500));
849 else
850 fr_mod_cams(_current_fr_context, FR_NOCAM, fix_make(1, 3000));
851 return (TRUE);
852 }
853 #endif
854
855 #ifdef GADGET
menu_close_func(ushort keycode,uint32_t context,intptr_t data)856 uchar menu_close_func(ushort keycode, uint32_t context, intptr_t data) { return (menu_all_popdown()); }
857 #endif
858
859 #ifdef PLAYTEST
mono_clear_func(ushort keycode,uint32_t context,intptr_t data)860 uchar mono_clear_func(ushort keycode, uint32_t context, intptr_t data) {
861 mono_clear();
862 return (FALSE);
863 }
864
mono_toggle_func(ushort keycode,uint32_t context,intptr_t data)865 uchar mono_toggle_func(ushort keycode, uint32_t context, intptr_t data) {
866 mono_setmode(MONO_TOG);
867 message_info("Monochrome Toggled.");
868 return (FALSE);
869 }
870 #endif
871
872 #ifdef GADGET
873 Gadget *edit_flags_gadget = NULL;
874 uchar f0, f1, f2;
875
edit_flags_close(void * vg,void * ud)876 uchar edit_flags_close(void *vg, void *ud) {
877 // Postprocess results into change flags
878 if (f0) {
879 chg_set_sta(ML_CHG_BASE << 0);
880 chg_set_flg(ML_CHG_BASE << 0);
881 } else {
882 chg_unset_sta(ML_CHG_BASE << 0);
883 chg_unset_flg(ML_CHG_BASE << 0);
884 }
885 if (f1) {
886 chg_set_sta(ML_CHG_BASE << 1);
887 chg_set_flg(ML_CHG_BASE << 1);
888 } else {
889 chg_unset_sta(ML_CHG_BASE << 1);
890 chg_unset_flg(ML_CHG_BASE << 1);
891 }
892 if (f2) {
893 chg_set_sta(ML_CHG_BASE << 2);
894 chg_set_flg(ML_CHG_BASE << 2);
895 } else {
896 chg_unset_sta(ML_CHG_BASE << 2);
897 chg_unset_flg(ML_CHG_BASE << 2);
898 }
899 gadget_destroy(&edit_flags_gadget);
900 return (FALSE);
901 }
902
edit_flags_func(ushort keycode,uint32_t context,intptr_t data)903 uchar edit_flags_func(ushort keycode, uint32_t context, intptr_t data) {
904 Point pt, ss;
905
906 pt.x = 20;
907 pt.y = 25;
908 ss.x = 110;
909 ss.y = 8;
910 if (edit_flags_gadget == NULL) {
911 f0 = ((_change_flag & (ML_CHG_BASE << 0)) != 0);
912 f1 = ((_change_flag & (ML_CHG_BASE << 1)) != 0);
913 f2 = ((_change_flag & (ML_CHG_BASE << 2)) != 0);
914 edit_flags_gadget = gad_qbox_start(_current_root, pt, 10, &EditorStyle, QB_ALIGNMENT, "edit_flags_gadget", ss);
915 gad_qbox_add("Main Loop Flags", QB_TEXT_SLOT, NULL, QB_RD_ONLY);
916 gad_qbox_add("Flag 0", QB_BOOL_SLOT, &f0, QB_ARROWS);
917 gad_qbox_add("Flag 1", QB_BOOL_SLOT, &f1, QB_ARROWS);
918 gad_qbox_add("Frame Rate", QB_BOOL_SLOT, &f2, QB_ARROWS);
919 gad_qbox_add("Close", QB_PUSHBUTTON_SLOT, edit_flags_close, QB_NO_OPTION);
920 gad_qbox_end();
921 }
922 return (FALSE);
923 }
924
music_ai_params_func(ushort keycode,uint32_t context,intptr_t data)925 uchar music_ai_params_func(ushort keycode, uint32_t context, intptr_t data) {
926 panel_ai_param_create();
927 return (FALSE);
928 }
929 #endif
930
version_spew_func(ushort keycode,uint32_t context,intptr_t data)931 uchar version_spew_func(ushort keycode, uint32_t context, intptr_t data) {
932 char tmpstr[] = SIGNATURE; /* for tracking versions */
933 char temp[40];
934 strcpy(temp, ".... ");
935 if (start_mem >= BIG_CACHE_THRESHOLD)
936 temp[0] = 'C';
937 if (start_mem > EXTRA_TMAP_THRESHOLD)
938 temp[1] = 'T';
939 if (start_mem > BLEND_THRESHOLD)
940 temp[2] = 'B';
941 if (start_mem > BIG_HACKCAM_THRESHOLD)
942 temp[3] = 'M';
943 strcat(temp, SYSTEM_SHOCK_VERSION);
944 message_info(temp);
945 return (FALSE);
946 }
947
948 #endif // NOT_YET
949
950 char conv_hex(char val);
951 uchar location_spew_func(ushort, uint32_t, intptr_t);
952
conv_hex(char val)953 char conv_hex(char val) {
954 char retval = '?';
955 if ((val >= 0) && (val <= 9))
956 retval = '0' + val;
957 else if ((val >= 10) && (val <= 15))
958 retval = 'a' + (val - 10);
959 return (retval);
960 }
961 /*KLC moved to TOOLS.C
962 int str_to_hex(char val)
963 {
964 int retval = 0;
965 if ((val >= '0') && (val <= '9'))
966 retval = val - '0';
967 else if ((val >= 'A') && (val <= 'F'))
968 retval = 10 + val - 'A';
969 else if ((val >= 'a') && (val <= 'f'))
970 retval = 10 + val - 'a';
971 return(retval);
972 }
973
974 uchar location_spew_func(ushort , uint32_t , intptr_t )
975 {
976 char goofy_string[32];
977
978 //#ifdef SVGA_SUPPORT
979 // sprintf(goofy_string,"00:00.00:%s",get_temp_string(REF_STR_ScreenModeText + convert_use_mode));
980 //#else
981 strcpy(goofy_string,"00:00.00 ");
982 //#endif
983 goofy_string[0] = conv_hex( player_struct.level / 16 );
984 goofy_string[1] = conv_hex( player_struct.level % 16 );
985 if (!time_passes)
986 goofy_string[2] = '!';
987 goofy_string[3] = conv_hex( PLAYER_BIN_X / 16 );
988 goofy_string[4] = conv_hex( PLAYER_BIN_X % 16 );
989 if (!physics_running)
990 goofy_string[5] = '*';
991 goofy_string[6] = conv_hex( PLAYER_BIN_Y / 16 );
992 goofy_string[7] = conv_hex( PLAYER_BIN_Y % 16 );
993
994 message_info(goofy_string);
995 return(FALSE);
996 }
997 */
998
toggle_physics_func(ushort keycode,uint32_t context,intptr_t data)999 uchar toggle_physics_func(ushort keycode, uint32_t context, intptr_t data) {
1000 physics_running = !physics_running;
1001
1002 extern uchar pacifism_on;
1003 pacifism_on = !physics_running;
1004
1005 if (physics_running)
1006 message_info("Physics turned on");
1007 else
1008 message_info("Physics turned off");
1009
1010 return (FALSE);
1011 }
1012
toggle_giveall_func(ushort keycode,uint32_t context,intptr_t data)1013 uchar toggle_giveall_func(ushort keycode, uint32_t context, intptr_t data) {
1014 message_info("Kick some ass!");
1015
1016 for (int i = 0; i < NUM_HARDWAREZ; i++)
1017 player_struct.hardwarez[i] = 1;
1018 player_struct.hardwarez[HARDWARE_360] = 3;
1019
1020 //rail gun
1021 player_struct.weapons[0].type = GUN_SUBCLASS_SPECIAL;
1022 player_struct.weapons[0].subtype = 1;
1023 player_struct.weapons[0].ammo = 50;
1024 player_struct.weapons[0].ammo_type = 0;
1025 player_struct.weapons[0].make_info = 0;
1026
1027 //ion beam
1028 player_struct.weapons[1].type = GUN_SUBCLASS_BEAM;
1029 player_struct.weapons[1].subtype = 2;
1030 player_struct.weapons[1].heat = 0;
1031 player_struct.weapons[1].setting = 40;
1032 player_struct.weapons[1].make_info = 0;
1033
1034 //riot gun, hollow
1035 player_struct.weapons[2].type = GUN_SUBCLASS_PISTOL;
1036 player_struct.weapons[2].subtype = 4;
1037 player_struct.weapons[2].ammo = 100;
1038 player_struct.weapons[2].ammo_type = 0;
1039 player_struct.weapons[2].make_info = 0;
1040
1041 //skorpion, slag
1042 player_struct.weapons[3].type = GUN_SUBCLASS_AUTO;
1043 player_struct.weapons[3].subtype = 1;
1044 player_struct.weapons[3].ammo = 150;
1045 player_struct.weapons[3].ammo_type = 0;
1046 player_struct.weapons[3].make_info = 0;
1047
1048 //magpulse
1049 player_struct.weapons[4].type = GUN_SUBCLASS_SPECIAL;
1050 player_struct.weapons[4].subtype = 0;
1051 player_struct.weapons[4].ammo = 50;
1052 player_struct.weapons[4].ammo_type = 0;
1053 player_struct.weapons[4].make_info = 0;
1054
1055 //sparq
1056 player_struct.weapons[5].type = GUN_SUBCLASS_BEAM;
1057 player_struct.weapons[5].subtype = 0;
1058 player_struct.weapons[5].heat = 0;
1059 player_struct.weapons[5].setting = 40;
1060 player_struct.weapons[5].make_info = 0;
1061
1062 //laser rapier
1063 player_struct.weapons[6].type = GUN_SUBCLASS_HANDTOHAND;
1064 player_struct.weapons[6].subtype = 1;
1065 player_struct.weapons[6].heat = 0;
1066 player_struct.weapons[6].setting = 0;
1067 player_struct.weapons[6].make_info = 0;
1068
1069 player_struct.hit_points = 255;
1070 player_struct.energy = 255;
1071
1072 // Software stuff
1073 player_struct.softs.misc[SOFTWARE_TURBO] = 5;
1074 player_struct.softs.misc[SOFTWARE_FAKEID] = 5;
1075 player_struct.softs.misc[SOFTWARE_DECOY] = 5;
1076 player_struct.softs.misc[SOFTWARE_RECALL] = 5;
1077
1078 // So we put games in your game so you can play game while you playing game!
1079 player_struct.softs.misc[SOFTWARE_GAMES] = 255;
1080
1081 chg_set_flg(INVENTORY_UPDATE);
1082 chg_set_flg(VITALS_UPDATE);
1083 mfd_force_update();
1084
1085 return (FALSE);
1086 }
1087
toggle_up_level_func(ushort keycode,uint32_t context,intptr_t data)1088 uchar toggle_up_level_func(ushort keycode, uint32_t context, intptr_t data) {
1089 message_info("Changing level!");
1090 go_to_different_level((player_struct.level + 1 + 15) % 15);
1091
1092 return (TRUE);
1093 }
1094
toggle_down_level_func(ushort keycode,uint32_t context,intptr_t data)1095 uchar toggle_down_level_func(ushort keycode, uint32_t context, intptr_t data) {
1096 message_info("Changing level!");
1097 go_to_different_level((player_struct.level - 1 + 15) % 15);
1098
1099 return (TRUE);
1100 }
1101
1102 #ifdef NOT_YET //
1103
1104 #ifdef PLAYTEST
1105
1106 #define camera_info message_info
reset_camera_func(ushort keycode,uint32_t context,intptr_t data)1107 uchar reset_camera_func(ushort keycode, uint32_t context, intptr_t data) {
1108 extern uchar cam_mode;
1109 extern cams objmode_cam, *motion_cam, player_cam;
1110
1111 if ((uchar *)data) {
1112 if (cam_mode != OBJ_STATIC_CAMERA) {
1113 camera_info("cant toggle");
1114 return FALSE;
1115 }
1116 if (motion_cam != NULL) {
1117 motion_cam = NULL;
1118 camera_info("back to cam control");
1119 } else {
1120 motion_cam = fr_camera_getdef();
1121 camera_info("back to obj control");
1122 }
1123 } else {
1124 camera_info("camera reset");
1125 cam_mode = OBJ_PLAYER_CAMERA;
1126 fr_camera_setdef(&player_cam);
1127 }
1128 chg_set_flg(_current_3d_flag);
1129 return (FALSE);
1130 }
1131
current_camera_func(ushort keycode,uint32_t context,intptr_t data)1132 uchar current_camera_func(ushort keycode, uint32_t context, intptr_t data) {
1133 extern cams objmode_cam, *motion_cam;
1134 extern uchar cam_mode;
1135 fix cam_locs[6], *cam_ptr_hack;
1136
1137 motion_cam = NULL;
1138 // Not sure what to pass for last two params....
1139 switch ((uchar)data) {
1140 case OBJ_STATIC_CAMERA:
1141 if (cam_mode == OBJ_DYNAMIC_CAMERA) {
1142 camera_info("cant go static");
1143 return FALSE;
1144 }
1145 motion_cam = fr_camera_getdef(); // note super sneaky fall through hack
1146 camera_info("camera static");
1147 case OBJ_DYNAMIC_CAMERA:
1148 fr_camera_modtype(&objmode_cam, CAMTYPE_ABS, CAMBIT_OBJ);
1149 cam_ptr_hack = fr_camera_getpos(NULL);
1150 memcpy(cam_locs, cam_ptr_hack, 6 * sizeof(fix));
1151 fr_camera_update(&objmode_cam, cam_locs, CAM_UPDATE_NONE, NULL);
1152 if (motion_cam == NULL)
1153 camera_info("camera dynamic");
1154 break;
1155 case OBJ_CURRENT_CAMERA:
1156 camera_info("current obj");
1157 fr_camera_modtype(&objmode_cam, CAMTYPE_OBJ, CAMBIT_OBJ);
1158 fr_camera_update(&objmode_cam, (void *)current_object, CAM_UPDATE_NONE, NULL);
1159 break;
1160 }
1161 cam_mode = (uchar)data;
1162 fr_camera_setdef(&objmode_cam);
1163 chg_set_flg(_current_3d_flag);
1164 return (FALSE);
1165 }
1166
1167 uchar mono_log_on = FALSE;
1168
log_mono_func(ushort keycode,uint32_t context,intptr_t data)1169 uchar log_mono_func(ushort keycode, uint32_t context, intptr_t data) {
1170 if (mono_log_on) {
1171 mono_logoff();
1172 message_info("Mono logging off.");
1173 mono_log_on = FALSE;
1174 } else {
1175 mono_logon("monolog.txt", MONO_LOG_NEW, MONO_LOG_ALLWIN);
1176 message_info("Mono logging on.");
1177 mono_log_on = TRUE;
1178 }
1179 return (FALSE);
1180 }
1181
clear_transient_lighting_func(ushort keycode,uint32_t context,intptr_t data)1182 uchar clear_transient_lighting_func(ushort keycode, uint32_t context, intptr_t data) {
1183 int x, y;
1184 MapElem *pme;
1185 for (x = 0; x < MAP_XSIZE; x++) {
1186 for (y = 0; y < MAP_YSIZE; y++) {
1187 pme = MAP_GET_XY(x, y);
1188 me_templight_flr_set(pme, 0);
1189 me_templight_ceil_set(pme, 0);
1190 }
1191 }
1192 message_info("Trans. light cleared");
1193 return (FALSE);
1194 }
1195
level_entry_trigger_func(ushort keycode,uint32_t context,intptr_t data)1196 uchar level_entry_trigger_func(ushort keycode, uint32_t context, intptr_t data) {
1197 extern errtype do_level_entry_triggers();
1198 do_level_entry_triggers();
1199 message_info("Level entry triggered.");
1200 return (FALSE);
1201 }
1202
convert_one_level_func(ushort keycode,uint32_t context,intptr_t data)1203 uchar convert_one_level_func(ushort keycode, uint32_t context, intptr_t data) {
1204 extern errtype obj_level_munge();
1205 #ifdef TEXTURE_CRUNCH_HACK
1206 extern errtype texture_crunch_init();
1207
1208 texture_crunch_init();
1209 #endif
1210 obj_level_munge();
1211 return (TRUE);
1212 }
1213
1214 //#define CONVERT_FROM_OLD_RESID
1215 //#define TEXTURE_CRUNCH_HACK
1216
1217 #define NUM_CONVERT_LEVELS 16
1218
convert_all_levels_func(ushort keycode,uint32_t context,intptr_t data)1219 uchar convert_all_levels_func(ushort keycode, uint32_t context, intptr_t data) {
1220 int i;
1221 char atoi_buf[10], fn[10], curr_fname[40], new_fname[40];
1222 errtype retval;
1223
1224 extern Datapath savegame_dpath;
1225 extern void edit_load_func(char *fn, uchar source, short level_num);
1226 extern void edit_save_func(char *fn, uchar source, short level_num);
1227 extern errtype obj_level_munge();
1228 #ifdef TEXTURE_CRUNCH_HACK
1229 extern errtype texture_crunch_init();
1230
1231 texture_crunch_init();
1232 #endif
1233
1234 // save off old level
1235 edit_save_func("templevl.dat", 0, 0);
1236
1237 // loop through the real levels
1238 for (i = 0; i < NUM_CONVERT_LEVELS; i++) {
1239 retval = OK;
1240 // load level i
1241 strcpy(fn, "level");
1242 strcat(fn, itoa(i, atoi_buf, 10));
1243 strcat(fn, ".dat");
1244 Spew(DSRC_EDITOR_Modify, ("fn = %s\n", fn));
1245 if (DatapathFind(&savegame_dpath, fn, curr_fname)) {
1246 #ifdef CONVERT_FROM_OLD_RESID
1247 retval = load_current_map(curr_fname, OLD_LEVEL_ID_NUM, &savegame_dpath);
1248 #else
1249 retval = load_current_map(curr_fname, LEVEL_ID_NUM, &savegame_dpath);
1250 #endif
1251 Spew(DSRC_EDITOR_Modify, ("convert_all trying to load %s\n", curr_fname));
1252 } else
1253 retval = ERR_FOPEN;
1254
1255 Spew(DSRC_EDITOR_Modify, ("curr_fname = %s\n", curr_fname));
1256 if (retval != OK) {
1257 strcpy(new_fname, "R:\\prj\\cit\\src\\data\\");
1258 strcat(new_fname, fn);
1259 retval = load_current_map(new_fname, LEVEL_ID_NUM, NULL);
1260 Spew(DSRC_EDITOR_Modify, ("new_fname = %s\n", new_fname));
1261 }
1262
1263 // Generate the report
1264 obj_level_munge();
1265 Spew(DSRC_EDITOR_Modify, ("convert_all trying to save %s\n", fn));
1266 save_current_map(fn, LEVEL_ID_NUM, TRUE, TRUE);
1267 }
1268
1269 // reload original level
1270 edit_load_func("templevl.dat", 0, 0);
1271
1272 return (FALSE);
1273 }
1274
1275 #endif
1276
invulnerable_func(ushort keycode,uint32_t context,intptr_t data)1277 uchar invulnerable_func(ushort keycode, uint32_t context, intptr_t data) {
1278 if (config_get_raw(CFG_HKEY_GO, NULL, 0)) {
1279 player_invulnerable = !player_invulnerable;
1280 if (player_invulnerable)
1281 message_info("invulnerability on");
1282 else
1283 message_info("invulnerability off");
1284 } else {
1285 message_info("Winners don't use hotkeys");
1286 damage_player(50, EXPLOSION_FLAG, 0);
1287 }
1288 return (FALSE);
1289 }
1290
pacifist_func(ushort keycode,uint32_t context,intptr_t data)1291 uchar pacifist_func(ushort keycode, uint32_t context, intptr_t data) {
1292 extern uchar pacifism_on;
1293 pacifism_on = !pacifism_on;
1294 if (pacifism_on)
1295 message_info("pacifism on");
1296 else
1297 message_info("pacifism off");
1298 return (FALSE);
1299 }
1300
1301 int pause_id;
1302 uchar remove_pause_handler = FALSE;
1303
pause_callback(uiEvent *,LGRegion *,void *)1304 uchar pause_callback(uiEvent *, LGRegion *, void *) { return (TRUE); }
1305
unpause_callback(uiEvent *,LGRegion *,void *)1306 uchar unpause_callback(uiEvent *, LGRegion *, void *) { return (TRUE); }
1307
1308 #endif // NOT_YET
1309
pause_game_func(ushort keycode,uint32_t context,intptr_t data)1310 uchar pause_game_func(ushort keycode, uint32_t context, intptr_t data) {
1311 extern uchar game_paused, redraw_paused;
1312 extern LGRegion *inventory_region;
1313
1314 game_paused = !game_paused;
1315 CaptureMouse(!game_paused);
1316
1317 extern LGCursor globcursor;
1318 if (game_paused) uiPushGlobalCursor(&globcursor);
1319 else uiPopGlobalCursor();
1320
1321 if (game_paused) {
1322 redraw_paused = TRUE;
1323 snd_kill_all_samples();
1324 audiolog_stop();
1325 return FALSE;
1326 }
1327
1328 mouse_look_unpause();
1329
1330 return TRUE;
1331 /* KLC - not needed for Mac version
1332 game_paused = !game_paused;
1333 if (game_paused)
1334 {
1335 uiPushGlobalCursor(&globcursor);
1336 uiInstallRegionHandler(inventory_region, UI_EVENT_MOUSE_MOVE, pause_callback, NULL, &pause_id);
1337 uiGrabFocus(inventory_region, UI_EVENT_MOUSE_MOVE);
1338 stop_digi_fx();
1339 redraw_paused=TRUE;
1340 }
1341 else
1342 {
1343 uiRemoveRegionHandler(inventory_region, pause_id);
1344 uiReleaseFocus(inventory_region, UI_EVENT_MOUSE_MOVE);
1345 uiPopGlobalCursor();
1346 }
1347 */
1348 }
1349
1350 /*KLC - not needed for Mac version
1351 uchar unpause_game_func(ushort, uint32_t, intptr_t)
1352 {
1353 extern uchar game_paused;
1354 extern LGRegion *inventory_region;
1355
1356 if (game_paused)
1357 {
1358 game_paused = !game_paused;
1359 uiRemoveRegionHandler(inventory_region, pause_id);
1360 uiReleaseFocus(inventory_region, UI_EVENT_MOUSE_MOVE|UI_EVENT_JOY);
1361 uiPopGlobalCursor();
1362 }
1363 return(FALSE);
1364 }
1365 */
1366
toggle_mouse_look(ushort keycode,uint32_t context,intptr_t data)1367 uchar toggle_mouse_look(ushort keycode, uint32_t context, intptr_t data) {
1368 mouse_look_toggle();
1369 return (TRUE);
1370 }
1371
1372 //--------------------------------------------------------------------
1373 // For Mac version. Save the current game.
1374 //--------------------------------------------------------------------
1375 /*
1376 uchar save_hotkey_func(ushort keycode, uint32_t context, intptr_t data) {
1377 if (global_fullmap->cyber) // Can't save in cyberspace.
1378 {
1379 message_info("Can't save game in cyberspace.");
1380 return TRUE;
1381 }
1382
1383 if (music_on) // Setup the environment for doing Mac stuff.
1384 MacTuneKillCurrentTheme();
1385 uiHideMouse(NULL);
1386 SS_ShowCursor();
1387
1388 // CopyBits(&gMainWindow->portBits, &gMainOffScreen.bits->portBits, &gActiveArea, &gOffActiveArea, srcCopy, 0L);
1389
1390 if (gIsNewGame) // Do the save thang.
1391 {
1392 status_bio_end();
1393
1394 // Fixme: Save game here!
1395
1396 status_bio_start();
1397 }
1398
1399 uiShowMouse(NULL);
1400 if (music_on)
1401 MacTuneStartCurrentTheme();
1402
1403 return TRUE;
1404 }
1405 */
1406
1407 #ifdef NOT_YET //
1408
1409 //#define CHECK_STATE_N_HOTKEY
1410 #ifdef PLAYTEST
check_state_func(ushort keycode,uint32_t context,intptr_t data)1411 uchar check_state_func(ushort keycode, uint32_t context, intptr_t data) {
1412 int avail_memory(int debug_src);
1413 avail_memory(DSRC_TESTING_Test3);
1414 #ifdef CHECK_STATE_N_HOTKEY
1415 extern void check_state_every_n_seconds();
1416 check_state_every_n_seconds();
1417 #endif
1418 #ifdef CORVIN_ZILM_HKEY
1419 extern uchar CorvinZilm;
1420 extern int watchcount;
1421 MemStat pms;
1422 watchcount = 0;
1423 CorvinZilm = TRUE;
1424 MemStats(&pms);
1425 #endif
1426 return (TRUE);
1427 }
1428
diffdump_game_func(ushort keycode,uint32_t context,intptr_t data)1429 uchar diffdump_game_func(ushort keycode, uint32_t context, intptr_t data) {
1430 char goof[45];
1431 sprintf(goof, "diff=%d,%d,%d,%d\n", player_struct.difficulty[0], player_struct.difficulty[1],
1432 player_struct.difficulty[2], player_struct.difficulty[3]);
1433 message_info(goof);
1434 return (TRUE);
1435 }
1436
toggle_difficulty_func(ushort keycode,uint32_t context,intptr_t data)1437 uchar toggle_difficulty_func(ushort keycode, uint32_t context, intptr_t data) {
1438 ubyte which = (ubyte)data - 1;
1439
1440 player_struct.difficulty[which]++;
1441 player_struct.difficulty[which] %= 4;
1442 return (TRUE);
1443 }
1444
toggle_ai_func(ushort keycode,uint32_t context,intptr_t data)1445 uchar toggle_ai_func(ushort keycode, uint32_t context, intptr_t data) {
1446 extern uchar ai_on;
1447 ai_on = !ai_on;
1448 if (ai_on)
1449 message_info("AI state on\n");
1450 else
1451 message_info("AI state off\n");
1452 return (TRUE);
1453 }
1454
toggle_safety_net_func(ushort keycode,uint32_t context,intptr_t data)1455 uchar toggle_safety_net_func(ushort keycode, uint32_t context, intptr_t data) {
1456 extern uchar safety_net_on;
1457 safety_net_on = !safety_net_on;
1458 if (safety_net_on)
1459 message_info("Safety Net on\n");
1460 else
1461 message_info("Safety Net off\n");
1462 return (TRUE);
1463 }
1464 #endif
1465
1466 #ifdef NEW_RES_LIB_INSTALLED
res_cache_usage_func(ushort keycode,uint32_t context,intptr_t data)1467 uchar res_cache_usage_func(ushort keycode, uint32_t context, intptr_t data) {
1468 extern long ResViewCache(uchar only_locks);
1469 ResViewCache((bool)data);
1470 return (TRUE);
1471 }
1472 #endif
1473
1474 #pragma enable_message(202)
1475
1476 #endif // NOT_YET
1477