diff --git a/game/console.c b/game/console.c index c753545..d2353e0 100644 --- a/game/console.c +++ b/game/console.c @@ -162,6 +162,7 @@ extern char immortality; extern char nohassle; extern char dead_food; extern char pass_all_mobs; +extern char force_levitate; static char console_input_line[console_max_characters+1] = ""; @@ -316,6 +317,10 @@ static int process_on_off_command(const char *cmd, char on) { nofloors = on; return 1; } + if (istrcmp(cmd, "levitation") == 0) { + force_levitate = on; + return 1; + } if (istrcmp(cmd, "enemy-insight") == 0) { show_mob_info = on; return 1; @@ -724,16 +729,9 @@ static void console_keyboard(EVENT_MSG *msg, void **_) { } msg->msg = -1; } else if (c == '\r') { - console_command = console_input_line; - PARSED_COMMAND cmd = parse_command(console_input_line); - char ok = process_command(cmd); - if (ok) { - flush_console_command(); - console_top_line = 0; + if (console_exec(console_input_line)) { console_input_line[0] = 0; } - console_command = NULL; - free(cmd.cmd_buffer); msg->msg = -1; } else if (c == 3 && !get_shift_key_state()) { console_copy_to_clipboard(); @@ -773,7 +771,18 @@ void console_show(char show) { if (show) wire_console(); else unwire_console(); } - +} +char console_exec(const char *cmd_text) { + console_command = cmd_text; + PARSED_COMMAND cmd = parse_command(cmd_text); + char ok = process_command(cmd); + if (ok) { + flush_console_command(); + console_top_line = 0; + } + console_command = NULL; + free(cmd.cmd_buffer); + return ok; } diff --git a/game/globals.h b/game/globals.h index 128f380..c0337ca 100644 --- a/game/globals.h +++ b/game/globals.h @@ -1836,6 +1836,7 @@ static __inline int quit_request_as_escape(int c) { void draw_console_window(void); void console_show(char show); +char console_exec(const char *cmd); char console_is_visible(void); char *map_hash_to_string_impl(char *c, uint32_t h, int sz); diff --git a/game/realgame.c b/game/realgame.c index 0979053..7fa707e 100644 --- a/game/realgame.c +++ b/game/realgame.c @@ -74,6 +74,7 @@ char datapath; D_ACTION *d_action={NULL}; int end_ptr; char pass_all_mobs = 0; //cheat make all mobs passable +char force_levitate = 0; //cheat uint8_t cur_group=1; uint8_t group_select=1; char cancel_pass=0; @@ -1143,7 +1144,7 @@ void check_players_place(char mode) { int sect; int u1; - levitat = (h->vlastnosti[VLS_KOUZLA] & SPL_LEVITATION) != 0; + levitat = force_levitate || ((h->vlastnosti[VLS_KOUZLA] & SPL_LEVITATION) != 0); sect = h->sektor; if (sect >= mapsize) continue; diff --git a/game/skeldal.c b/game/skeldal.c index 4b4edde..79b69c9 100644 --- a/game/skeldal.c +++ b/game/skeldal.c @@ -891,7 +891,7 @@ const void *boldcz; void init_DDL_manager() { const char *ddlfile = build_pathname(2, gpathtable[SR_DATA],"SKELDAL.DDL"); - ddlfile = local_strdup(ddlfile); + ddlfile = local_strdup(ddlfile); init_manager(); if (!add_patch_file(ddlfile)) { @@ -1125,6 +1125,25 @@ void *map_keyboard(EVENT_MSG *msg,void **usr); char doNotLoadMapState=0; +static void reload_restart_map() { + unwire_proc(); + if (battle) konec_kola(); + battle=0; + running_battle=0; + doNotLoadMapState=1; + hl_ptr=ikon_libs; + destroy_fly_map(); + load_items(); + zneplatnit_block(H_ENEMY); + zneplatnit_block(H_SHOP_PIC); + zneplatnit_block(H_DIALOGY_DAT); + load_shops(); + autosave_on_enter = 0; + game_display_focus(); + send_message(E_CLOSE_MAP); + +} + static int reload_map_handler(EVENT_MSG *msg,void **usr) { extern char running_battle; @@ -1136,7 +1155,15 @@ extern char running_battle; int side; int i; - if (sscanf(m, "RELOAD %12s %d %d", fname, §or, &side) == 3) { + if (strcmp(m, "RELOAD") == 0) { + reload_ddls(); + loadlevel.start_pos=viewsector; + loadlevel.dir=viewdir; + strcopy_n(loadlevel.name, level_fname, sizeof(loadlevel.name)); + SEND_LOG("(WIZARD) Reload map"); + reload_restart_map(); + + } else if (sscanf(m, "TELEPORT %12s %d %d", fname, §or, &side) == 3) { reload_ddls(); strcopy_n(loadlevel.name,fname,sizeof(loadlevel.name)); @@ -1148,23 +1175,30 @@ extern char running_battle; postavy[i].groupnum = 1; } SEND_LOG("(WIZARD) Load map '%s' %d %d",loadlevel.name,loadlevel.start_pos, loadlevel.dir); - unwire_proc(); - if (battle) konec_kola(); - battle=0; - running_battle=0; - doNotLoadMapState=1; - hl_ptr=ikon_libs; - destroy_fly_map(); - load_items(); - zneplatnit_block(H_ENEMY); - zneplatnit_block(H_SHOP_PIC); - zneplatnit_block(H_DIALOGY_DAT); - load_shops(); - autosave_on_enter = 0; + reload_restart_map(); + } else if (sscanf(m, "CONSOLE %d", &i) == 1) { + console_show(i); + game_display_focus(); + } else if (strncmp(m, "CONSOLE_CMD ", 12) == 0) { + const char *cmd = m+12; + if (strchr(cmd, '~') == NULL) { + console_exec(cmd); + } else { + char *tmp = local_strdup(cmd); + char *x = strchr(tmp,'~'); + while (x) { + *x = 0; + console_exec(tmp); + tmp = x+1; + x = strchr(tmp,'~'); + } + if (*tmp) console_exec(tmp); + } + game_display_focus(); - send_message(E_CLOSE_MAP); } else if (strncmp(m, "MESSAGE ", 8) == 0) { bott_disp_text(m+8); + game_display_focus(); } } @@ -1191,7 +1225,7 @@ void enter_game(void) send_message(E_ADD,E_RELOADMAP,reload_map_handler); { - EVENT_MSG *msg = task_wait_event(E_CLOSE_MAP); + EVENT_MSG *msg = task_wait_event(E_CLOSE_MAP); end = msg != NULL?va_arg(msg->data, int):0; } send_message(E_DONE,E_RELOADMAP,reload_map_handler);