/*
SDLPoP, a port/conversion of the DOS game Prince of Persia.
Copyright (C) 2013-2018 Dávid Nagy
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
The authors of this program may be contacted at http://forum.princed.org
*/
#include "common.h"
#ifndef _MSC_VER // unistd.h does not exist in the Windows SDK.
#include <unistd.h>
#endif
#include <fcntl.h>
// data:4CB4
short cutscene_wait_frames;
// data:3D14
short cutscene_frame_time;
// data:588C
short disable_keys;
// data:436A
short hourglass_sandflow;
// data:5964
short hourglass_state;
// data:4CC4
short which_torch;
#pragma pack(push,1)
typedef struct hof_type {
char name[25];
short min,tick;
} hof_type;
SDL_COMPILE_TIME_ASSERT(hof_size, sizeof(hof_type) == 29);
#pragma pack(pop)
#define MAX_HOF_COUNT 6
// data:405E
short hof_count;
// data:589A
hof_type hof[MAX_HOF_COUNT];
#define N_STARS 6
// data:0D92
rect_type hof_rects[MAX_HOF_COUNT] = {
{ 84, 72, 96, 248},
{ 98, 72, 110, 248},
{112, 72, 124, 248},
{126, 72, 138, 248},
{140, 72, 152, 248},
{154, 72, 166, 248},
};
// seg001:0004
int __pascal far proc_cutscene_frame(int wait_frames) {
cutscene_wait_frames = wait_frames;
do {
start_timer(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();
}
#else
idle();
#endif
} while(!has_timer_stopped(0)); // busy waiting?
} while(--cutscene_wait_frames);
return 0;
}
// seg001:00DD
void __pascal far play_both_seq() {
play_kid_seq();
play_opp_seq();
}
// seg001:00E6
void __pascal far draw_proom_drects() {
draw_princess_room_bg();
#ifdef USE_FADE
if (!is_global_fading) {
#endif
while (drects_count--) {
copy_screen_rect(&drects[drects_count]);
}
#ifdef USE_FADE
}
#endif
drects_count = 0;
if (cutscene_wait_frames & 1) {
draw_star(prandom(N_STARS - 1), 1);
}
}
// seg001:0128
void __pascal far play_kid_seq() {
loadkid();
if (Char.frame) {
play_seq();
savekid();
}
}
// seg001:013F
void __pascal far play_opp_seq() {
loadshad_and_opp();
if (Char.frame) {
play_seq();
saveshad();
}
}
// seg001:0156
void __pascal far draw_princess_room_bg() {
memset_near(table_counts, 0, sizeof(table_counts));
loadkid();
if (Char.frame) {
load_frame_to_obj();
obj_tilepos = 30;
add_objtable(0);
}
loadshad();
if (Char.frame) {
load_frame_to_obj();
obj_tilepos = 30;
add_objtable(0);
}
redraw_needed_tiles();
add_foretable(id_chtab_8_princessroom, 2 /*pillar piece*/, 30, 0, 167, blitters_10h_transp, 0);
princess_room_torch();
draw_hourglass();
draw_tables();
}
// seg001:01E0
void __pascal far seqtbl_offset_shad_char(int seq_index) {
loadshad();
seqtbl_offset_char(seq_index);
saveshad();
}
// seg001:01F9
void __pascal far seqtbl_offset_kid_char(int seq_index) {
loadkid();
seqtbl_offset_char(seq_index);
savekid();
}
// seg001:0212
void __pascal far init_mouse_cu8() {
init_mouse_go();
Char.x = 144;
seqtbl_offset_char(seq_106_mouse); // mouse
play_seq();
}
// seg001:022A
void __pascal far init_mouse_go() {
Char.charid = charid_24_mouse;
Char.x = 199;
Char.y = 167;
Char.direction = dir_FF_left;
seqtbl_offset_char(seq_105_mouse_forward); // mouse go
play_seq();
}
// seg001:024D
void __pascal far princess_crouching() {
init_princess();
Char.x = 131;
Char.y = 169;
seqtbl_offset_char(seq_110_princess_crouching_PV2); // princess crouching [PV2]
play_seq();
}
// seg001:026A
void __pascal far princess_stand() {
init_princess_right();
Char.x = 144;
Char.y = 169;
seqtbl_offset_char(seq_94_princess_stand_PV1); // princess stand [PV1]
play_seq();
}
// seg001:0287
void __pascal far init_princess_x156() {
init_princess();
Char.x = 156;
}
// seg001:0291
void __pascal far princess_lying() {
init_princess();
Char.x = 92;
Char.y = 162;
seqtbl_offset_char(seq_103_princess_lying_PV2); // princess lying [PV2]
play_seq();
}
// seg001:02AE
void __pascal far init_princess_right() {
init_princess();
Char.direction = dir_0_right;
}
// seg001:02B8
void __pascal far init_ending_princess() {
init_princess();
Char.x = 136;
Char.y = 164;
seqtbl_offset_char(seq_109_princess_stand_PV2); // princess standing [PV2]
play_seq();
}
// seg001:02D5
void __pascal far init_mouse_1() {
init_mouse_go();
Char.x -= 2;
Char.y = 164;
}
// seg001:02E4
void __pascal far init_princess() {
Char.charid = charid_5_princess;
Char.x = 120;
Char.y = 166;
Char.direction = dir_FF_left;
seqtbl_offset_char(seq_94_princess_stand_PV1); // princess stand [PV1]
play_seq();
}
// seg001:0307
void __pascal far init_vizier() {
Char.charid = charid_6_vizier;
Char.x = 198;
Char.y = 166;
Char.direction = dir_FF_left;
seqtbl_offset_char(seq_95_Jaffar_stand_PV1); // Jaffar stand [PV1]
play_seq();
}
// seg001:032A
void __pascal far init_ending_kid() {
Char.charid = charid_0_kid;
Char.x = 198;
Char.y = 164;
Char.direction = dir_FF_left;
seqtbl_offset_char(seq_1_start_run); // start run
play_seq();
}
// seg001:034D
void __pascal far cutscene_8() {
play_sound(sound_35_cutscene_8_9); // cutscene 8, 9
set_hourglass_state(hourglass_frame());
init_mouse_cu8();
savekid();
princess_crouching();
saveshad();
if (fade_in_1()) return;
if (proc_cutscene_frame(20)) return;
seqtbl_offset_kid_char(seq_107_mouse_stand_up_and_go); // mouse stand up and go
if (proc_cutscene_frame(20)) return;
seqtbl_offset_shad_char(seq_111_princess_stand_up_PV2); // princess stand up [PV2]
if (proc_cutscene_frame(20)) return;
Kid.frame = 0;
fade_out_1();
}
// seg001:03B7
void __pascal far cutscene_9() {
play_sound(sound_35_cutscene_8_9); // cutscene 8, 9
set_hourglass_state(hourglass_frame());
princess_stand();
saveshad();
if (fade_in_1()) return;
init_mouse_go();
savekid();
if (proc_cutscene_frame(5)) return;
seqtbl_offset_shad_char(seq_112_princess_crouch_down_PV2); // princess crouch down [PV2]
if (proc_cutscene_frame(9)) return;
seqtbl_offset_kid_char(seq_114_mouse_stand); // mouse stand
if (proc_cutscene_frame(58)) return;
fade_out_1();
}
// seg001:041C
void __pascal far end_sequence_anim() {
disable_keys = 1;
if (!is_sound_on) {
turn_sound_on_off(0x0F);
}
copy_screen_rect(&screen_rect);
play_sound(sound_26_embrace); // arrived to princess
init_ending_princess();
saveshad();
init_ending_kid();
savekid();
if (proc_cutscene_frame(8)) return;
seqtbl_offset_shad_char(seq_108_princess_turn_and_hug); // princess turn and hug [PV2]
if (proc_cutscene_frame(5)) return;
seqtbl_offset_kid_char(seq_13_stop_run); // stop run
if (proc_cutscene_frame(2)) return;
Kid.frame = 0;
if (proc_cutscene_frame(39)) return;
init_mouse_1();
savekid();
if (proc_cutscene_frame(9)) return;
seqtbl_offset_kid_char(seq_101_mouse_stands_up); // mouse stands up
if (proc_cutscene_frame(41)) return;
fade_out_1();
while (check_sound_playing()) idle();
}
// seg001:04D3
void __pascal far time_expired() {
disable_keys = 1;
set_hourglass_state(7);
hourglass_sandflow = -1;
play_sound(sound_36_out_of_time); // time over
if (fade_in_1()) return;
if (proc_cutscene_frame(2)) return;
if (proc_cutscene_frame(100)) return;
fade_out_1();
while (check_sound_playing()) {
idle();
do_paused();
}
}
// seg001:0525
void __pascal far cutscene_12() {
short var_2;
var_2 = hourglass_frame();
if (var_2 >= 6) {
set_hourglass_state(var_2);
init_princess_x156();
saveshad();
play_sound(sound_40_cutscene_12_short_time); // cutscene 12 short time
if (fade_in_1()) return;
if (proc_cutscene_frame(2)) return;
seqtbl_offset_shad_char(98); // princess turn around [PV1]
if (proc_cutscene_frame(24)) return;
fade_out_1();
} else {
cutscene_2_6();
}
}
// seg001:0584
void __pascal far cutscene_4() {
play_sound(sound_27_cutscene_2_4_6_12); // cutscene 2, 4, 6, 12
set_hourglass_state(hourglass_frame());
princess_lying();
saveshad();
if (fade_in_1()) return;
if (proc_cutscene_frame(26)) return;
fade_out_1();
}
// seg001:05B8
void __pascal far cutscene_2_6() {
play_sound(sound_27_cutscene_2_4_6_12); // cutscene 2, 4, 6, 12
set_hourglass_state(hourglass_frame());
init_princess_right();
saveshad();
if (fade_in_1()) return;
if (proc_cutscene_frame(26)) return;
fade_out_1();
}
// seg001:05EC
void __pascal far pv_scene() {
init_princess();
saveshad();
if (fade_in_1()) return;
init_vizier();
savekid();
if (proc_cutscene_frame(2)) return;
play_sound(sound_50_story_2_princess); // story 2: princess waiting
do {
if (proc_cutscene_frame(1)) return;
//idle();
} while(check_sound_playing());
cutscene_frame_time = 8;
if (proc_cutscene_frame(5)) return;
play_sound(sound_4_gate_closing); // gate closing
do {
if (proc_cutscene_frame(1)) return;
} while(check_sound_playing());
play_sound(sound_51_princess_door_opening); // princess door opening
if (proc_cutscene_frame(3)) return;
seqtbl_offset_shad_char(98); // princess turn around [PV1]
if (proc_cutscene_frame(5)) return;
seqtbl_offset_kid_char(96); // Jaffar walk [PV1]
if (proc_cutscene_frame(6)) return;
play_sound(sound_53_story_3_Jaffar_comes); // story 3: Jaffar comes
seqtbl_offset_kid_char(97); // Jaffar stop [PV1]
if (proc_cutscene_frame(4)) return;
if (proc_cutscene_frame(18)) return;
seqtbl_offset_kid_char(96); // Jaffar walk [PV1]
if (proc_cutscene_frame(30)) return;
seqtbl_offset_kid_char(97); // Jaffar stop [PV1]
if (proc_cutscene_frame(35)) return;
seqtbl_offset_kid_char(102); // Jaffar conjuring [PV1]
cutscene_frame_time = 7;
if (proc_cutscene_frame(1)) return;
seqtbl_offset_shad_char(99); // princess step back [PV1]
if (proc_cutscene_frame(17)) return;
hourglass_state = 1;
flash_time = 5;
flash_color = 15; // white
do {
if (proc_cutscene_frame(1)) return;
//idle();
} while(check_sound_playing());
seqtbl_offset_kid_char(100); // Jaffar end conjuring and walk [PV1]
hourglass_sandflow = 0;
if (proc_cutscene_frame(6)) return;
play_sound(sound_52_story_4_Jaffar_leaves); // story 4: Jaffar leaves
if (proc_cutscene_frame(24)) return;
hourglass_state = 2;
if (proc_cutscene_frame(9)) return;
seqtbl_offset_shad_char(113); // princess look down [PV1]
if (proc_cutscene_frame(28)) return;
fade_out_1();
}
// seg001:07C7
void __pascal far set_hourglass_state(int state) {
hourglass_sandflow = 0;
hourglass_state = state;
}
// data:0DEC
short time_bound[] = {6, 17, 33, 65};
// seg001:07DA
int __pascal far hourglass_frame() {
short bound_index;
for (bound_index = 0; bound_index < 4; ++bound_index) {
if (time_bound[bound_index] > rem_min) {
break;
}
}
return 6 - bound_index;
}
// data:0DF4
short princess_torch_pos_xh[] = {11, 26};
// data:0DF8
short princess_torch_pos_xl[] = {5, 3};
// data:0DFC
short princess_torch_frame[] = {1, 6};
// seg001:0808
void __pascal far princess_room_torch() {
short which;
for (which = 2; which--; ) {
which_torch = !which_torch;
princess_torch_frame[which_torch] = get_torch_frame(princess_torch_frame[which_torch]);
add_backtable(id_chtab_1_flameswordpotion, princess_torch_frame[which_torch] + 1, princess_torch_pos_xh[which_torch], princess_torch_pos_xl[which_torch], 116, 0, 0);
}
}
// seg001:0863
void __pascal far draw_hourglass() {
if (hourglass_sandflow >= 0) {
hourglass_sandflow = (hourglass_sandflow + 1) % 3;
if (hourglass_state >= 7) return;
add_foretable(id_chtab_8_princessroom, hourglass_sandflow + 10, 20, 0, 164, blitters_10h_transp, 0);
}
if (hourglass_state) {
add_midtable(id_chtab_8_princessroom, hourglass_state + 2, 19, 0, 168, blitters_10h_transp, 1);
}
}
// seg001:08CA
void __pascal far reset_cutscene() {
Guard.frame = 0;
Kid.frame = 0;
which_torch = 0;
disable_keys = 0;
hourglass_state = 0;
// memset_near(byte_1ED6E, 0, 8); // not used elsewhere
hourglass_sandflow = -1;
cutscene_frame_time = 6;
clear_tile_wipes();
next_sound = -1;
}
// seg001:0908
void __pascal far do_flash(short color) {
// stub
if (color) {
if (graphics_mode == gmMcgaVga) {
set_bg_attr(0, color);
if (color != 0) delay_ticks(2); // give some time to show the flash
} else {
// ...
}
}
}
void delay_ticks(Uint32 ticks) {
#ifdef USE_REPLAY
if (replaying && skipping_replay) return;
#endif
SDL_Delay(ticks *(1000/60));
}
// This flashes the background with the color specified, but does not add delay to show the flash
void do_flash_no_delay(short color) {
if (color) set_bg_attr(0, color);
}
// seg001:0981
void __pascal far remove_flash() {
// stub
if (graphics_mode == gmMcgaVga) {
set_bg_attr(0, 0);
} else {
// ...
}
}
// seg001:09D7
void __pascal far end_sequence() {
peel_type* peel;
short bgcolor;
short color;
rect_type rect;
short hof_index;
short i;
color = 0;
bgcolor = 15;
load_intro(1, &end_sequence_anim, 1);
clear_screen_and_sounds();
load_opt_sounds(sound_56_ending_music, sound_56_ending_music); // winning theme
play_sound_from_buffer(sound_pointers[sound_56_ending_music]); // winning theme
if(offscreen_surface) free_surface(offscreen_surface); // missing in original
offscreen_surface = make_offscreen_buffer(&screen_rect);
load_title_images(0);
current_target_surface = offscreen_surface;
draw_image_2(0 /*story frame*/, chtab_title40, 0, 0, 0);
draw_image_2(3 /*The tyrant Jaffar*/, chtab_title40, 24, 25, get_text_color(15, color_15_brightwhite, 0x800));
fade_in_2(offscreen_surface, 0x800);
pop_wait(timer_0, 900);
start_timer(timer_0, 240);
draw_image_2(0 /*main title image*/, chtab_title50, 0, 0, 0);
transition_ltr();
do_wait(timer_0);
for (hof_index = 0; hof_index < hof_count; ++hof_index) {
if (hof[hof_index].min < rem_min ||
(hof[hof_index].min == rem_min && hof[hof_index].tick < rem_tick)
) break;
}
if (hof_index < MAX_HOF_COUNT && hof_index <= hof_count) {
fade_out_2(0x1000);
for (i = 5; hof_index + 1 <= i; --i) {
hof[i] = hof[i - 1];
}
hof[i].name[0] = 0;
hof[i].min = rem_min;
hof[i].tick = rem_tick;
if (hof_count < MAX_HOF_COUNT) {
++hof_count;
}
draw_image_2(0 /*story frame*/, chtab_title40, 0, 0, 0);
draw_image_2(3 /*Prince Of Persia*/, chtab_title50, 24, 24, blitters_10h_transp);
show_hof();
offset4_rect_add(&rect, &hof_rects[hof_index], -4, -1, -40, -1);
peel = read_peel_from_screen(&rect);
if (graphics_mode == gmMcgaVga) {
color = 0xBE;
bgcolor = 0xB7;
}
draw_rect(&rect, bgcolor);
fade_in_2(offscreen_surface, 0x1800);
current_target_surface = onscreen_surface_;
while(input_str(&rect, hof[hof_index].name, 24, "", 0, 4, color, bgcolor) <= 0);
restore_peel(peel);
show_hof_text(&hof_rects[hof_index], -1, 0, hof[hof_index].name);
hof_write();
pop_wait(timer_0, 120);
current_target_surface = offscreen_surface;
draw_image_2(0 /*main title image*/, chtab_title50, 0, 0, blitters_0_no_transp);
transition_ltr();
}
while (check_sound_playing() && !key_test_quit()) idle();
fade_out_2(0x1000);
start_level = -1;
start_game();
}
// seg001:0C94
void __pascal far expired() {
if (!demo_mode) {
if(offscreen_surface) free_surface(offscreen_surface); // missing in original
offscreen_surface = NULL;
clear_screen_and_sounds();
offscreen_surface = make_offscreen_buffer(&screen_rect);
load_intro(1, &time_expired, 1);
}
start_level = -1;
start_game();
}
// seg001:0CCD
void __pascal far load_intro(int which_imgs,cutscene_ptr_type func,int free_sounds) {
short current_star;
draw_rect(&screen_rect, 0);
if (free_sounds) {
free_optional_sounds();
}
free_all_chtabs_from(id_chtab_3_princessinstory);
load_chtab_from_file(id_chtab_8_princessroom, 950, "PV.DAT", 1<<13);
load_chtab_from_file(id_chtab_9_princessbed, 980, "PV.DAT", 1<<14);
current_target_surface = offscreen_surface;
method_6_blit_img_to_scr(get_image(id_chtab_8_princessroom, 0), 0, 0, 0);
method_6_blit_img_to_scr(get_image(id_chtab_9_princessbed, 0), 0, 142, blitters_2_or);
// Free the images that are not needed anymore.
free_all_chtabs_from(id_chtab_9_princessbed);
SDL_FreeSurface(get_image(id_chtab_8_princessroom, 0));
if (NULL != chtab_addrs[id_chtab_8_princessroom]) chtab_addrs[id_chtab_8_princessroom]->images[0] = NULL;
load_chtab_from_file(id_chtab_3_princessinstory, 800, "PV.DAT", 1<<9);
load_chtab_from_file(id_chtab_4_jaffarinstory_princessincutscenes,
50*which_imgs + 850, "PV.DAT", 1<<10);
for (current_star = 0; current_star < N_STARS; ++current_star) {
draw_star(current_star, 0);
}
current_target_surface = onscreen_surface_;
while (check_sound_playing()) {
idle();
do_paused();
}
need_drects = 1;
reset_cutscene();
is_cutscene = 1;
func();
is_cutscene = 0;
free_all_chtabs_from(3);
draw_rect(&screen_rect, 0);
}
typedef struct star_type {
short x,y,color;
} star_type;
// data:0DC2
star_type stars[N_STARS] = {
{20, 97,0},
{16,104,1},
{23,110,2},
{17,116,3},
{24,120,4},
{18,128,0},
};
#define N_STAR_COLORS 5
// data:0DE6
const byte star_colors[N_STAR_COLORS] = {8, 7, 15, 15, 7};
// seg001:0E1C
void __pascal far draw_star(int which_star,int mark_dirty) {
// The stars in the window of the princess's room.
rect_type rect;
short star_color;
star_color = 15;
rect.right = rect.left = stars[which_star].x;
++rect.right;
rect.bottom = rect.top = stars[which_star].y;
++rect.bottom;
if (graphics_mode != gmCga && graphics_mode != gmHgaHerc) {
stars[which_star].color = (stars[which_star].color + 1) % N_STAR_COLORS;
star_color = star_colors[stars[which_star].color];
}
draw_rect(&rect, star_color);
if (mark_dirty) {
add_drect(&rect);
}
}
// seg001:0E94
void __pascal far show_hof() {
// Hall of Fame
short index;
char time_text[12];
for (index = 0; index < hof_count; ++index) {
#ifdef ALLOW_INFINITE_TIME
int minutes, seconds;
if (hof[index].min > 0) {
minutes = hof[index].min - 1;
seconds = hof[index].tick / 12;
} else {
// negative minutes means time ran 'forward' from 0:00 upwards
minutes
= abs(hof
[index
].
min) - 1;
seconds = (719 - hof[index].tick) / 12;
}
snprintf(time_text
, sizeof(time_text
), "%d:%02d", minutes
, seconds
);
#else
snprintf(time_text
, sizeof(time_text
), "%d:%02d", hof
[index
].
min - 1, hof
[index
].
tick / 12);
#endif
show_hof_text(&hof_rects[index], -1, 0, hof[index].name);
show_hof_text(&hof_rects[index], 1, 0, time_text);
}
// stub
}
static const char* hof_file = "PRINCE.HOF";
const char* get_hof_path(char* custom_path_buffer, size_t max_len) {
if (!use_custom_levelset) {
return hof_file;
}
// if playing a custom levelset, try to use the mod folder
snprintf(custom_path_buffer
, max_len
, "mods/%s/%s", levelset_name
, hof_file
/*PRINCE.HOF*/ );
return custom_path_buffer;
}
// seg001:0F17
void __pascal far hof_write() {
int handle;
char custom_hof_path[POP_MAX_PATH];
const char* hof_path = get_hof_path(custom_hof_path, sizeof(custom_hof_path));
// no O_TRUNC
handle = open(hof_path, O_WRONLY | O_CREAT | O_BINARY, 0600);
if (handle < 0 ||
write(handle, &hof_count, 2) != 2 ||
write(handle, &hof, sizeof(hof)) != sizeof(hof) ||
close(handle))
if (handle >= 0)
close(handle);
}
// seg001:0F6C
void __pascal far hof_read() {
int handle;
hof_count = 0;
char custom_hof_path[POP_MAX_PATH];
const char* hof_path = get_hof_path(custom_hof_path, sizeof(custom_hof_path));
handle = open(hof_path, O_RDONLY | O_BINARY);
if (handle < 0)
return;
if (read(handle, &hof_count, 2) != 2 ||
read(handle, &hof, sizeof(hof)) != sizeof(hof)) {
hof_count = 0;
}
close(handle);
}
// seg001:0FC3
void __pascal far show_hof_text(rect_type far *rect,int x_align,int y_align, const char *text) {
short shadow_color;
short text_color;
rect_type rect2;
text_color = 15;
shadow_color = 0;
if (graphics_mode == gmMcgaVga) {
text_color = 0xB7;
}
offset2_rect(&rect2, rect, 1, 1);
show_text_with_color(&rect2, x_align, y_align, text, shadow_color);
show_text_with_color(rect, x_align, y_align, text, text_color);
}
// seg001:1029
int __pascal far fade_in_1() {
#ifdef USE_FADE
// sbyte index;
word interrupted;
if (graphics_mode == gmMcgaVga) {
fade_palette_buffer = make_pal_buffer_fadein(offscreen_surface, 0x6689, /*0*/ 2);
is_global_fading = 1;
do {
interrupted = proc_cutscene_frame(1);
if (interrupted == 1) {
return 1;
}
} while (interrupted == 0);
is_global_fading = 0;
} else {
// ...
}
return 0;
#else
// stub
method_1_blit_rect(onscreen_surface_, offscreen_surface, &screen_rect, &screen_rect, 0);
updateScreen();
// SDL_UpdateRect(onscreen_surface_, 0, 0, 0, 0); // debug
return 0;
#endif
}
// seg001:112D
int __pascal far fade_out_1() {
#ifdef USE_FADE
word interrupted;
if (graphics_mode == gmMcgaVga) {
fade_palette_buffer = make_pal_buffer_fadeout(0x6689, /*0*/ 2);
is_global_fading = 1;
do {
interrupted = proc_cutscene_frame(1);
if (interrupted == 1) {
return 1;
}
} while (interrupted == 0);
is_global_fading = 0;
} else {
// ...
}
#endif
// stub
return 0;
}