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 "advconfig.h"
#include <ctype.h>
#include <stdlib.h>
#include <malloc.h>
@ -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);
}
}

View file

@ -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<xy[0];x++)
{
int r=*imgdata>>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++;
}
}

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;
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++)
{
int j,c,cnt;
TMOB *b;
const TMOB *b;
b=template;
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 *set_background(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_spells_legacy_format(const void *p, int32_t *s);
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);
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
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;
void send_mob_to(int m,word *path);
void save_enemy_paths(TMPFILE_WR *f);

View file

@ -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:

View file

@ -22,6 +22,7 @@
#include "skeldal.h"
#include "lang.h"
#include <ctype.h>
#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));
}