From 8cf3c928e9b56c638b7807bd5f989555bffa1ad7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Nov=C3=A1k?= Date: Sun, 23 Mar 2025 19:00:20 +0100 Subject: [PATCH] support adv files --- game/advconfig.c | 33 ++++++++++++++++++++++----------- game/builder.c | 14 +++++++------- game/enemy.c | 4 ++-- game/globals.h | 3 ++- game/realgame.c | 6 +++--- game/skeldal.c | 36 +++++++++++++++++++++++++++--------- 6 files changed, 63 insertions(+), 33 deletions(-) diff --git a/game/advconfig.c b/game/advconfig.c index 62968cb..0f59f33 100644 --- a/game/advconfig.c +++ b/game/advconfig.c @@ -1,6 +1,7 @@ #include #include "advconfig.h" +#include #include #include @@ -9,7 +10,14 @@ static void process_row(INI_CONFIG_SECTION *sec, const char *row) { - char *buff = strcpy((char *)alloca(strlen(row)+1), row); + int l = strlen(row); + char *buff = strcpy((char *)alloca(l+1), row); + while (l && isspace(buff[l-1])) { + --l; + buff[l] = 0; + } + if (!l) return; + char *sep = strchr(buff,' '); if (sep == NULL) return; *sep = 0; @@ -18,26 +26,29 @@ static void process_row(INI_CONFIG_SECTION *sec, const char *row) { const char *value = sep+1; + if (istrcmp(key,"CESTA_GRAFIKA") == 0) { - ini_replace_key(sec, "graphics", value); + ini_replace_key(sec, "graphics", file_icase_find(value)); } else if (istrcmp(key, "CESTA_ZVUKY") == 0) { - ini_replace_key(sec, "sounds", value); + ini_replace_key(sec, "sounds", file_icase_find(value)); } else if (istrcmp(key, "CESTA_FONTY") == 0) { - ini_replace_key(sec, "fonts", value); + ini_replace_key(sec, "fonts", file_icase_find(value)); } else if (istrcmp(key, "CESTA_MAPY") == 0) { - ini_replace_key(sec, "maps", value); + ini_replace_key(sec, "maps", file_icase_find(value)); } else if (istrcmp(key, "CESTA_MUSIC") == 0) { - ini_replace_key(sec, "music_adv", value); + ini_replace_key(sec, "music_adv", file_icase_find(value)); } else if (istrcmp(key, "CESTA_BGRAFIKA") == 0) { - ini_replace_key(sec, "gui", value); + ini_replace_key(sec, "gui", file_icase_find(value)); } else if (istrcmp(key, "CESTA_ITEMY") == 0) { - ini_replace_key(sec, "items", value); + ini_replace_key(sec, "items", file_icase_find(value)); } else if (istrcmp(key, "CESTA_ENEMY") == 0) { - ini_replace_key(sec, "enemy", value); + ini_replace_key(sec, "enemy", file_icase_find(value)); } else if (istrcmp(key, "CESTA_VIDEO") == 0) { - ini_replace_key(sec, "video", value); + ini_replace_key(sec, "video", file_icase_find(value)); } else if (istrcmp(key, "CESTA_DIALOGY") == 0) { - ini_replace_key(sec, "dialogs", value); + ini_replace_key(sec, "dialogs", file_icase_find(value)); + } else if (istrcmp(key, "DEFAULT_MAP") == 0) { + ini_replace_key(sec, "default_map", value); } } diff --git a/game/builder.c b/game/builder.c index 914bba4..3ff6461 100644 --- a/game/builder.c +++ b/game/builder.c @@ -781,8 +781,8 @@ static const void *check_autofade(const void *image, char ceil, int dark) if (mglob.map_autofadefc==1) { word *imgdata=xy+3; - int br=back_color>>11; - int bg=(back_color>>5) & 0x3F; + int br=back_color>>10; + int bg=(back_color>>5) & 0x1F; int bb=back_color & 0x1F; int y; @@ -793,16 +793,16 @@ static const void *check_autofade(const void *image, char ceil, int dark) float factor=(float)y/(xy[1]-1); int x; if (!ceil) factor=1.0f-factor; - factor=factor*factor; + factor=factor*factor*factor; for (x=0;x>11; - int g=(*imgdata>>5) & 0x3F; + int r=*imgdata>>10; + int g=(*imgdata>>5) & 0x1F; int b=*imgdata & 0x1F; r=(int)(r+factor*(br-r)); g=(int)(g+factor*(bg-g)); b=(int)(b+factor*(bb-b)); - *imgdata=(r<<11)|(g<<5)|b; + *imgdata=(r<<10)|(g<<5)|b; imgdata++; } } @@ -1371,7 +1371,7 @@ void redraw_scene() other_draw(); if (cur_mode == MD_END_GAME) { death_screen(); - } + } ukaz_mysku(); global_anim_counter++; send_message(E_KOUZLO_ANM); diff --git a/game/enemy.c b/game/enemy.c index 207c990..b98cf4b 100644 --- a/game/enemy.c +++ b/game/enemy.c @@ -352,7 +352,7 @@ static void mob_sound_event(TMOB *m, int event) { } } -void load_enemies(short *data,int size,int *grptr,TMOB *template,int32_t tsize) +void load_enemies(short *data,int size,int *grptr,const TMOB *template,int32_t tsize) { int i; short cisla[256]; @@ -365,7 +365,7 @@ void load_enemies(short *data,int size,int *grptr,TMOB *template,int32_t tsize) for(i=0;ivlajky|MOB_INBATTLE pokud potvora muze vstoupit do bitvy; void send_mob_to(int m,word *path); void save_enemy_paths(TMPFILE_WR *f); diff --git a/game/realgame.c b/game/realgame.c index 0973ae1..a17fda3 100644 --- a/game/realgame.c +++ b/game/realgame.c @@ -238,7 +238,7 @@ int load_map(const char *filename) char nmapend=1; int ofsts=START_HANDLE; char snd_load=0; - void *mob_template; + const void *mob_template; int32_t mob_size; int failed = 0; @@ -344,7 +344,7 @@ int load_map(const char *filename) else { load_enemies(temp,size,&ofsts,mob_template,mob_size); - free(mob_template); + ablock_free(mob_template); SEND_LOG("(GAME) Loading enemies from map template..."); } free(temp); @@ -358,7 +358,7 @@ int load_map(const char *filename) vyk_max=size/sizeof(TVYKLENEK); break; case A_MOBS: - mob_template=temp; + mob_template=load_mob_legacy_format_direct(temp, &size); mob_size=size; break; case A_MOBSND: diff --git a/game/skeldal.c b/game/skeldal.c index 285b669..8f4dc0a 100644 --- a/game/skeldal.c +++ b/game/skeldal.c @@ -22,6 +22,7 @@ #include "skeldal.h" #include "lang.h" +#include #define CONFIG_NAME SKELDALINI #define INI_TEXT 1 @@ -374,14 +375,13 @@ const void *hi_8bit_correct(const void *p,int32_t *s) } -const void *load_mob_legacy_format(const void *p, int32_t *s) { +const void *load_mob_legacy_format_direct(const void *p, int32_t *s) { + const char *c = p; const int sz = 376; int count = *s / sz;; - const char *c = p; TMOB *out = getmem(count * sizeof(TMOB)); memset(out, 0 , sizeof(TMOB)*count); - c+=8; for (int i = 0; i < count ; i++) { TMOB *m = out+i; char *d = (char *)m; @@ -404,6 +404,12 @@ const void *load_mob_legacy_format(const void *p, int32_t *s) { *s = count * sizeof(TMOB); return out; } +const void *load_mob_legacy_format(const void *p, int32_t *s) { + const char *c = p; + c+=8; + *s-=8; + return load_mob_legacy_format_direct(c, s); +} const void *set_background(const void *p, int32_t *s) @@ -1662,6 +1668,10 @@ const char *configure_pathtable(const INI_CONFIG *cfg) { gpathtable[SR_SAVES] = ini_get_string(paths, "savegame", get_default_savegame_directory()); gpathtable[SR_DATA]= ini_get_string(paths, "data", "./"); gpathtable[SR_LANG]= ini_get_string(paths, "lang", "./lang"); + const char *defmap = ini_get_string(paths, "default_map", NULL); + if (defmap) { + strcopy_n(default_map, defmap, sizeof(default_map)); + } return groot; @@ -1726,11 +1736,6 @@ int skeldal_entry_point(const SKELDAL_CONFIG *start_cfg) return 1; } - if (start_cfg->adventure_path) { - TSTR_LIST adv_config=read_config(start_cfg->adventure_path); - adv_patch_config(cfg, adv_config); - release_list(adv_config); - } const char *groot = configure_pathtable(cfg); if (!change_current_directory(groot)) { @@ -1738,7 +1743,20 @@ int skeldal_entry_point(const SKELDAL_CONFIG *start_cfg) return 1; } - if (start_cfg->lang_path) { + if (start_cfg->adventure_path) { + TSTR_LIST adv_config=read_config(start_cfg->adventure_path); + if (!adv_config) { + start_cfg->show_error(concat2("Failed to open adventure configuration: ", start_cfg->adventure_path)); + return 1; + } + adv_patch_config(cfg, adv_config); + release_list(adv_config); + configure_pathtable(cfg); + char *sname = local_strdup(start_cfg->adventure_path); + for (char *c = sname; *c; ++c) if (!isalnum(*c)) *c = '_'; + const char *p = build_pathname(2, gpathtable[SR_SAVES], sname); + gpathtable[SR_SAVES] = local_strdup(p); + } else if (start_cfg->lang_path) { lang_set_folder(build_pathname(2, gpathtable[SR_LANG], start_cfg->lang_path)); }