// seg000:15F8 void __pascal far feather_fall() { is_feather_fall = 1; flash_color = 2; // green flash_time = 3; stop_sounds(); play_sound(sound_39_low_weight); // low weight }
// seg000:08EB void __pascal far play_frame() { do_mobs(); process_trobs(); check_skel(); check_can_guard_see_kid(); // if level is restarted, return immediately if (play_kid_frame()) return; play_guard_frame(); if (0 == resurrect_time) { check_sword_hurting(); check_sword_hurt(); } check_sword_vs_sword(); do_delta_hp(); exit_room(); check_the_end(); check_guard_fallout(); if (current_level == 0) { // Special event: level 0 running exit if (Kid.room == 24) { draw_rect(&screen_rect, 0); start_level = 0; need_quotes = 1; start_game(); } } else if(current_level == 6) { // Special event: level 6 falling exit if (roomleave_result == -2) { Kid.y = -1; stop_sounds(); ++next_level; } } else if(current_level == 12) { // Special event: level 12 running exit if (Kid.room == 23) { ++next_level; // Sounds must be stopped, because play_level_2() checks next_level only if there are no sounds playing. stop_sounds(); seamless = 1; } } show_time(); // expiring doesn't count on Jaffar/princess level if (current_level < 13 && rem_min == 0) { expired(); } }
int quick_load() { int ok = 0; quick_fp = fopen(quick_file, "rb"); if (quick_fp != NULL) { // check quicksave version is compatible process_load(quick_control, COUNT(quick_control)); if (strcmp(quick_control, quick_version) != 0) { fclose(quick_fp); quick_fp = NULL; return 0; } stop_sounds(); start_timer(timer_0, 5); // briefly display a black screen as a visual cue draw_rect(&screen_rect, 0); screen_updates_suspended = 0; request_screen_update(); screen_updates_suspended = 1; word old_rem_min = rem_min; word old_rem_tick = rem_tick; ok = quick_process(process_load); fclose(quick_fp); quick_fp = NULL; restore_room_after_quick_load(); do_wait(timer_0); screen_updates_suspended = 0; request_screen_update(); #ifdef USE_QUICKLOAD_PENALTY // Subtract one minute from the remaining time (if it is above 5 minutes) if (options.enable_quicksave_penalty) { int ticks_elapsed = 720 * (rem_min - old_rem_min) + (rem_tick - old_rem_tick); // don't restore time at all if the elapsed time is between 0 and 1 minutes if (ticks_elapsed > 0 && ticks_elapsed < 720) { rem_min = old_rem_min; rem_tick = old_rem_tick; } else { if (rem_min == 6) rem_tick = 719; // crop to "5 minutes" exactly, if hitting the threshold in <1 minute if (rem_min > 5) --rem_min; } } #endif } return ok; }
// seg001:0004 int __pascal far proc_cutscene_frame(int wait_frames) { cutscene_wait_frames = wait_frames; reset_timer(timer_0); do { set_timer_length(timer_0, cutscene_frame_time); play_both_seq(); draw_proom_drects(); // changed order of drects and flash if (flash_time) { do_flash(flash_color); } if (flash_time) { --flash_time; remove_flash(); } if (!check_sound_playing()) { play_next_sound(); } do { if (!disable_keys && do_paused()) { stop_sounds(); draw_rect(&screen_rect, 0); #ifdef USE_FADE if (is_global_fading) { fade_palette_buffer->proc_restore_free(fade_palette_buffer); is_global_fading = 0; } #endif return 1; } #ifdef USE_FADE if (is_global_fading) { if (fade_palette_buffer->proc_fade_frame(fade_palette_buffer)) { fade_palette_buffer->proc_restore_free(fade_palette_buffer); is_global_fading = 0; return 2; } } else { idle(); delay_ticks(1); } #else idle(); #endif } while(!has_timer_stopped(timer_0)); // busy waiting? } while(--cutscene_wait_frames); return 0; }
// seg000:1F02 void __pascal far clear_screen_and_sounds() { short index; stop_sounds(); current_target_surface = rect_sthg(onscreen_surface_, &screen_rect); is_cutscene = 0; peels_count = 0; // should these be freed? for (index = 2; index < 10; ++index) { if (chtab_addrs[index]) { // Original code does not free these? free_chtab(chtab_addrs[index]); chtab_addrs[index] = NULL; } } /* //Don't free sounds. for (index = 44; index < 57; ++index) { //continue; // don't release sounds? modern machines have enough memory free_sound(sound_pointers[index]); // added sound_pointers[index] = NULL; } */ current_level = -1; }
// seg000:04CD int __pascal far process_key() { char sprintf_temp[80]; int key; const char* answer_text; word need_show_text; need_show_text = 0; key = key_test_quit(); if (start_level == 0) { if (key || control_shift) { #ifdef USE_QUICKSAVE if (key == SDL_SCANCODE_F9) need_quick_load = 1; #endif #ifdef USE_REPLAY if (key == SDL_SCANCODE_TAB) { start_replay(); } else #endif if (key == (SDL_SCANCODE_L | WITH_CTRL)) { // ctrl-L if (!load_game()) return 0; } else { start_level = 1; } draw_rect(&screen_rect, 0); #ifdef USE_FADE if (is_global_fading) { fade_palette_buffer->proc_restore_free(fade_palette_buffer); is_global_fading = 0; } #endif start_game(); } } // If the Kid died, enter or shift will restart the level. if (rem_min != 0 && Kid.alive > 6 && (control_shift || key == SDL_SCANCODE_RETURN)) { key = SDL_SCANCODE_A | WITH_CTRL; // ctrl-a } #ifdef USE_REPLAY if (recording) key_press_while_recording(&key); else if (replaying) key_press_while_replaying(&key); #endif if (key == 0) return 0; if (is_keyboard_mode) clear_kbd_buf(); switch(key) { case SDL_SCANCODE_ESCAPE: // esc case SDL_SCANCODE_ESCAPE | WITH_SHIFT: // allow pause while grabbing is_paused = 1; break; case SDL_SCANCODE_SPACE: // space is_show_time = 1; break; case SDL_SCANCODE_A | WITH_CTRL: // ctrl-a if (current_level != 15) { stop_sounds(); is_restart_level = 1; } break; case SDL_SCANCODE_G | WITH_CTRL: // ctrl-g // CusPoP: first and last level where saving is allowed // if (current_level > 2 && current_level < 14) { // original if (current_level >= saving_allowed_first_level && current_level <= saving_allowed_last_level) { save_game(); } break; case SDL_SCANCODE_J | WITH_CTRL: // ctrl-j if ((sound_flags & sfDigi) && sound_mode == smTandy) { answer_text = "JOYSTICK UNAVAILABLE"; } else { if (set_joy_mode()) { answer_text = "JOYSTICK MODE"; } else { answer_text = "JOYSTICK NOT FOUND"; } } need_show_text = 1; break; case SDL_SCANCODE_K | WITH_CTRL: // ctrl-k answer_text = "KEYBOARD MODE"; is_joyst_mode = 0; is_keyboard_mode = 1; need_show_text = 1; break; case SDL_SCANCODE_R | WITH_CTRL: // ctrl-r start_level = 0; start_game(); break; case SDL_SCANCODE_S | WITH_CTRL: // ctrl-s turn_sound_on_off((!is_sound_on) * 15); answer_text = "SOUND OFF"; if (is_sound_on) { answer_text = "SOUND ON"; } // need_show_text = 1; break; case SDL_SCANCODE_V | WITH_CTRL: // ctrl-v answer_text = "PRINCE OF PERSIA V1.0"; need_show_text = 1; break; case SDL_SCANCODE_L | WITH_SHIFT: // shift-l if (current_level <= 3 || cheats_enabled) { // if shift is not released within the delay, the cutscene is skipped Uint32 delay = 250; key_states[SDL_SCANCODE_LSHIFT] = 0; key_states[SDL_SCANCODE_RSHIFT] = 0; SDL_TimerID timer; timer = SDL_AddTimer(delay, temp_shift_release_callback, NULL); if (timer == 0) { sdlperror("SDL_AddTimer"); quit(1); } if (current_level == 14) { next_level = 1; } else { if (current_level == 15 && cheats_enabled) { #ifdef USE_COPYPROT if (options.enable_copyprot) { next_level = copyprot_level; copyprot_level = -1; } #endif } else { next_level = current_level + 1; if (!cheats_enabled && rem_min > 15) { rem_min = 15; rem_tick = 719; } } } stop_sounds(); } break; #ifdef USE_QUICKSAVE case SDL_SCANCODE_F6: case SDL_SCANCODE_F6 | WITH_SHIFT: if (Kid.alive < 0) need_quick_save = 1; break; case SDL_SCANCODE_F9: case SDL_SCANCODE_F9 | WITH_SHIFT: need_quick_load = 1; break; #ifdef USE_REPLAY case SDL_SCANCODE_TAB | WITH_CTRL: case SDL_SCANCODE_TAB | WITH_CTRL | WITH_SHIFT: if (recording) { // finished recording stop_recording(); } else { // should start recording start_recording(); } break; #endif // USE_RECORD_REPLAY #endif // USE_QUICKSAVE } if (cheats_enabled) { switch (key) { case SDL_SCANCODE_C: // c snprintf(sprintf_temp, sizeof(sprintf_temp), "S%d L%d R%d A%d B%d", drawn_room, room_L, room_R, room_A, room_B); answer_text = /*&*/sprintf_temp; need_show_text = 1; break; case SDL_SCANCODE_C | WITH_SHIFT: // shift-c snprintf(sprintf_temp, sizeof(sprintf_temp), "AL%d AR%d BL%d BR%d", room_AL, room_AR, room_BL, room_BR); answer_text = /*&*/sprintf_temp; need_show_text = 1; break; case SDL_SCANCODE_MINUS: case SDL_SCANCODE_KP_MINUS: // '-' --> subtract time cheat if (rem_min > 1) --rem_min; text_time_total = 0; text_time_remaining = 0; is_show_time = 1; break; case SDL_SCANCODE_EQUALS | WITH_SHIFT: // '+' case SDL_SCANCODE_KP_PLUS: // '+' --> add time cheat ++rem_min; text_time_total = 0; text_time_remaining = 0; is_show_time = 1; break; case SDL_SCANCODE_R: // R --> revive kid cheat if (Kid.alive > 0) { resurrect_time = 20; Kid.alive = -1; erase_bottom_text(1); } break; case SDL_SCANCODE_K: // K --> kill guard cheat guardhp_delta = -guardhp_curr; Guard.alive = 0; break; case SDL_SCANCODE_I | WITH_SHIFT: // shift+I --> invert cheat toggle_upside(); break; case SDL_SCANCODE_W | WITH_SHIFT: // shift+W --> feather fall cheat feather_fall(); break; case SDL_SCANCODE_H: // H --> view room to the left draw_guard_hp(0, 10); next_room = room_L; break; case SDL_SCANCODE_J: // J --> view room to the right draw_guard_hp(0, 10); next_room = room_R; break; case SDL_SCANCODE_U: // U --> view room above draw_guard_hp(0, 10); next_room = room_A; break; case SDL_SCANCODE_N: // N --> view room below draw_guard_hp(0, 10); next_room = room_B; break; case SDL_SCANCODE_B | WITH_SHIFT: // shift-b is_blind_mode = !is_blind_mode; if (is_blind_mode) { draw_rect(&rect_top, 0); } else { need_full_redraw = 1; } break; case SDL_SCANCODE_S | WITH_SHIFT: // shift-s if (hitp_curr != hitp_max) { play_sound(sound_33_small_potion); // small potion (cheat) hitp_delta = 1; flash_color = 4; // red flash_time = 2; } break; case SDL_SCANCODE_T | WITH_SHIFT: // shift-t play_sound(sound_30_big_potion); // big potion (cheat) flash_color = 4; // red flash_time = 4; add_life(); break; #ifdef USE_DEBUG_CHEATS case SDL_SCANCODE_T: printf("Remaining minutes: %d\tticks:%d\n", rem_min, rem_tick); snprintf(sprintf_temp, sizeof(sprintf_temp), "M:%d S:%d T:%d", rem_min, rem_tick / 12, rem_tick); answer_text = sprintf_temp; need_show_text = 1; break; #endif } } if (need_show_text) { display_text_bottom(answer_text); text_time_total = 24; text_time_remaining = 24; } return 1; }