support adv files

This commit is contained in:
Ondřej Novák 2025-03-23 19:00:20 +01:00
parent 7aaeccd1c3
commit 8cf3c928e9
6 changed files with 63 additions and 33 deletions

View file

@ -1,6 +1,7 @@
#include <platform/platform.h> #include <platform/platform.h>
#include "advconfig.h" #include "advconfig.h"
#include <ctype.h>
#include <stdlib.h> #include <stdlib.h>
#include <malloc.h> #include <malloc.h>
@ -9,7 +10,14 @@
static void process_row(INI_CONFIG_SECTION *sec, const char *row) { 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,' '); char *sep = strchr(buff,' ');
if (sep == NULL) return; if (sep == NULL) return;
*sep = 0; *sep = 0;
@ -18,26 +26,29 @@ static void process_row(INI_CONFIG_SECTION *sec, const char *row) {
const char *value = sep+1; const char *value = sep+1;
if (istrcmp(key,"CESTA_GRAFIKA") == 0) { 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) { } 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) { } 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) { } 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) { } 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) { } 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) { } 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) { } 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) { } 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) { } 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);
} }
} }

View file

@ -781,8 +781,8 @@ static const void *check_autofade(const void *image, char ceil, int dark)
if (mglob.map_autofadefc==1) if (mglob.map_autofadefc==1)
{ {
word *imgdata=xy+3; word *imgdata=xy+3;
int br=back_color>>11; int br=back_color>>10;
int bg=(back_color>>5) & 0x3F; int bg=(back_color>>5) & 0x1F;
int bb=back_color & 0x1F; int bb=back_color & 0x1F;
int y; 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); float factor=(float)y/(xy[1]-1);
int x; int x;
if (!ceil) factor=1.0f-factor; if (!ceil) factor=1.0f-factor;
factor=factor*factor; factor=factor*factor*factor;
for (x=0;x<xy[0];x++) for (x=0;x<xy[0];x++)
{ {
int r=*imgdata>>11; int r=*imgdata>>10;
int g=(*imgdata>>5) & 0x3F; int g=(*imgdata>>5) & 0x1F;
int b=*imgdata & 0x1F; int b=*imgdata & 0x1F;
r=(int)(r+factor*(br-r)); r=(int)(r+factor*(br-r));
g=(int)(g+factor*(bg-g)); g=(int)(g+factor*(bg-g));
b=(int)(b+factor*(bb-b)); b=(int)(b+factor*(bb-b));
*imgdata=(r<<11)|(g<<5)|b; *imgdata=(r<<10)|(g<<5)|b;
imgdata++; imgdata++;
} }
} }
@ -1371,7 +1371,7 @@ void redraw_scene()
other_draw(); other_draw();
if (cur_mode == MD_END_GAME) { if (cur_mode == MD_END_GAME) {
death_screen(); death_screen();
} }
ukaz_mysku(); ukaz_mysku();
global_anim_counter++; global_anim_counter++;
send_message(E_KOUZLO_ANM); send_message(E_KOUZLO_ANM);

View file

@ -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; int i;
short cisla[256]; short cisla[256];
@ -365,7 +365,7 @@ void load_enemies(short *data,int size,int *grptr,TMOB *template,int32_t tsize)
for(i=0;i<size;i++) for(i=0;i<size;i++)
{ {
int j,c,cnt; int j,c,cnt;
TMOB *b; const TMOB *b;
b=template; b=template;
cnt=tsize/sizeof(TMOB); cnt=tsize/sizeof(TMOB);

View file

@ -645,6 +645,7 @@ const void *hi_8bit_correct(const void *p, int32_t *s);
const void *pcx_8bit_nopal(const void *p, int32_t *s); const void *pcx_8bit_nopal(const void *p, int32_t *s);
const void *set_background(const void *p, int32_t *s); const void *set_background(const void *p, int32_t *s);
const void *wav_load(const void *p, int32_t *s); const void *wav_load(const void *p, int32_t *s);
const void *load_mob_legacy_format_direct(const void *p, int32_t *s);
const void *load_mob_legacy_format(const void *p, int32_t *s); const void *load_mob_legacy_format(const void *p, int32_t *s);
const void *load_spells_legacy_format(const void *p, int32_t *s); const void *load_spells_legacy_format(const void *p, int32_t *s);
void wire_main_functs(void); void wire_main_functs(void);
@ -1562,7 +1563,7 @@ char track_mob(int sect,int dir);//trackuje pritomnost potvory v urcitem smeru
void stop_all_mobs(void); void stop_all_mobs(void);
int utok_na_sektor(THUMAN *p,TMOB *m,int chaos,int bonus, int ruka); int utok_na_sektor(THUMAN *p,TMOB *m,int chaos,int bonus, int ruka);
int vyber_potvoru(int sect,int dir,int *chaos); //vybere potvoru ze sektoru a smeru. Vraci take pocet potvor v promenne *chaos int vyber_potvoru(int sect,int dir,int *chaos); //vybere potvoru ze sektoru a smeru. Vraci take pocet potvor v promenne *chaos
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);
char mob_test_na_bitvu(TMOB *p); //nastavi p->vlajky|MOB_INBATTLE pokud potvora muze vstoupit do bitvy; char mob_test_na_bitvu(TMOB *p); //nastavi p->vlajky|MOB_INBATTLE pokud potvora muze vstoupit do bitvy;
void send_mob_to(int m,word *path); void send_mob_to(int m,word *path);
void save_enemy_paths(TMPFILE_WR *f); void save_enemy_paths(TMPFILE_WR *f);

View file

@ -238,7 +238,7 @@ int load_map(const char *filename)
char nmapend=1; char nmapend=1;
int ofsts=START_HANDLE; int ofsts=START_HANDLE;
char snd_load=0; char snd_load=0;
void *mob_template; const void *mob_template;
int32_t mob_size; int32_t mob_size;
int failed = 0; int failed = 0;
@ -344,7 +344,7 @@ int load_map(const char *filename)
else else
{ {
load_enemies(temp,size,&ofsts,mob_template,mob_size); load_enemies(temp,size,&ofsts,mob_template,mob_size);
free(mob_template); ablock_free(mob_template);
SEND_LOG("(GAME) Loading enemies from map template..."); SEND_LOG("(GAME) Loading enemies from map template...");
} }
free(temp); free(temp);
@ -358,7 +358,7 @@ int load_map(const char *filename)
vyk_max=size/sizeof(TVYKLENEK); vyk_max=size/sizeof(TVYKLENEK);
break; break;
case A_MOBS: case A_MOBS:
mob_template=temp; mob_template=load_mob_legacy_format_direct(temp, &size);
mob_size=size; mob_size=size;
break; break;
case A_MOBSND: case A_MOBSND:

View file

@ -22,6 +22,7 @@
#include "skeldal.h" #include "skeldal.h"
#include "lang.h" #include "lang.h"
#include <ctype.h>
#define CONFIG_NAME SKELDALINI #define CONFIG_NAME SKELDALINI
#define INI_TEXT 1 #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; const int sz = 376;
int count = *s / sz;; int count = *s / sz;;
const char *c = p;
TMOB *out = getmem(count * sizeof(TMOB)); TMOB *out = getmem(count * sizeof(TMOB));
memset(out, 0 , sizeof(TMOB)*count); memset(out, 0 , sizeof(TMOB)*count);
c+=8;
for (int i = 0; i < count ; i++) { for (int i = 0; i < count ; i++) {
TMOB *m = out+i; TMOB *m = out+i;
char *d = (char *)m; char *d = (char *)m;
@ -404,6 +404,12 @@ const void *load_mob_legacy_format(const void *p, int32_t *s) {
*s = count * sizeof(TMOB); *s = count * sizeof(TMOB);
return out; 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) 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_SAVES] = ini_get_string(paths, "savegame", get_default_savegame_directory());
gpathtable[SR_DATA]= ini_get_string(paths, "data", "./"); gpathtable[SR_DATA]= ini_get_string(paths, "data", "./");
gpathtable[SR_LANG]= ini_get_string(paths, "lang", "./lang"); 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; return groot;
@ -1726,11 +1736,6 @@ int skeldal_entry_point(const SKELDAL_CONFIG *start_cfg)
return 1; 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); const char *groot = configure_pathtable(cfg);
if (!change_current_directory(groot)) { if (!change_current_directory(groot)) {
@ -1738,7 +1743,20 @@ int skeldal_entry_point(const SKELDAL_CONFIG *start_cfg)
return 1; 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)); lang_set_folder(build_pathname(2, gpathtable[SR_LANG], start_cfg->lang_path));
} }