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