translation for shops, maps, titles

This commit is contained in:
Ondrej Novak 2025-04-15 18:31:52 +02:00
parent 45bb0c8431
commit f1f6cff78f
4 changed files with 59 additions and 5 deletions

View file

@ -85,6 +85,35 @@ static char convert_map_strings(const char *target_path) {
return !list_files(build_pathname(1, gpathtable[SR_MAP]), file_type_normal|file_type_just_name,convert_map_strings_1 , &target_path); return !list_files(build_pathname(1, gpathtable[SR_MAP]), file_type_normal|file_type_just_name,convert_map_strings_1 , &target_path);
} }
typedef struct make_map_name_stringtable_ctx_tag{
FILE *out;
} make_map_name_stringtable_ctx;
static int make_map_name_stringtable_cb(const char *source_name, LIST_FILE_TYPE type, size_t sz, void *context) {
make_map_name_stringtable_ctx *ctx = (make_map_name_stringtable_ctx *)context;
if (istrcmp(source_name+strlen(source_name)-4,".map")) return 0;
uint32_t id = fnv1a_hash(source_name);
fprintf(ctx->out, "%u,%s\n", id, source_name);
return 0;
}
static char make_map_name_stringtable(const char *target_path) {
const char *target_file = build_pathname(2,target_path,"mapnames.csv");
target_file = local_strdup(target_file);
FILE *f = fopen_icase(target_file, "w");
if (!f) {
fprintf(stderr, "Failed to open %s for writing\n",target_file);
return 0;
}
fprintf(f, "id,string\n");
make_map_name_stringtable_ctx ctx;
ctx.out = f;
int ret = list_files(build_pathname(1, gpathtable[SR_MAP]), file_type_normal|file_type_just_name,make_map_name_stringtable_cb, &ctx);
printf("Writing %s\n", target_file);
fclose(f);
return !ret;
}
static char convert_file_to(const char *src_file, const char *target_file) { static char convert_file_to(const char *src_file, const char *target_file) {
TMPFILE_RD *rd = enc_open(src_file); TMPFILE_RD *rd = enc_open(src_file);
@ -224,6 +253,7 @@ char generate_string_tables(const char *path) {
if (!generate_dialog_table(path)) return 0; if (!generate_dialog_table(path)) return 0;
if (!convert_intro_titles(path)) return 0; if (!convert_intro_titles(path)) return 0;
if (!generate_shop_strings(path)) return 0; if (!generate_shop_strings(path)) return 0;
if (!make_map_name_stringtable(path)) return 0;
return 1; return 1;
} }

View file

@ -82,7 +82,7 @@ static TSHOP_ALL_STATE shop_all_state;
#define INV_YS 60 #define INV_YS 60
#define INV_NAME_X 129 #define INV_NAME_X 129
#define INV_NAME_Y 349 #define INV_NAME_Y 349
#define INV_NAME_COL (RGB555(10,31,31)|FONT_TSHADOW_GRAY) #define INV_NAME_COL (RGB555(10,31,31)|FONT_TSHADOW)
#define INV_DESK 266 #define INV_DESK 266
#define INV_INFO_X 298 #define INV_INFO_X 298
#define INV_INFO_Y 343 #define INV_INFO_Y 343
@ -2547,6 +2547,8 @@ static void rebuild_shops(const void *shop_ptr)
const char *c=(const char *)shop_ptr; const char *c=(const char *)shop_ptr;
int i; int i;
SEND_LOG("(SHOP) Rebuilding shops...."); SEND_LOG("(SHOP) Rebuilding shops....");
max_shops = *(const int32_t *)c; max_shops = *(const int32_t *)c;
c+=4; c+=4;
@ -2574,9 +2576,17 @@ static void rebuild_shops(const void *shop_ptr)
shop_all_state.first_state = (TSHOP_PRODUCT_STATE *)(prod_iter+products); shop_all_state.first_state = (TSHOP_PRODUCT_STATE *)(prod_iter+products);
TSHOP_PRODUCT_STATE *state_iter = shop_all_state.first_state; TSHOP_PRODUCT_STATE *state_iter = shop_all_state.first_state;
TSTRINGTABLE *stbl = lang_load("shops.dat");
for(i=0;i<max_shops;i++) { for(i=0;i<max_shops;i++) {
shop_list[i] = shop_iter; shop_list[i] = shop_iter;
c = load_TSHOP(c, shop_iter); c = load_TSHOP(c, shop_iter);
if (stbl) {
const char *n = stringtable_find(stbl,shop_iter->shop_id,NULL);
if (n) {
strcopy_n(shop_iter->keeper,n,sizeof(shop_iter->keeper));
}
}
shop_iter->list = prod_iter; shop_iter->list = prod_iter;
for (int j = 0; j < shop_iter->products; ++j) { for (int j = 0; j < shop_iter->products; ++j) {
c = load_TPRODUCT(c, prod_iter); c = load_TPRODUCT(c, prod_iter);
@ -2588,6 +2598,7 @@ static void rebuild_shops(const void *shop_ptr)
++shop_iter; ++shop_iter;
SEND_LOG("(SHOP) Shop found: '%s', products %d",shop_list[i]->keeper,shop_list[i]->products); SEND_LOG("(SHOP) Shop found: '%s', products %d",shop_list[i]->keeper,shop_list[i]->products);
} }
stringtable_free(stbl);
free(shop_hacek); free(shop_hacek);
shop_hacek = newhacek; shop_hacek = newhacek;
} }

View file

@ -229,6 +229,17 @@ void sanitize_map() {
} }
void translate_map_name(const char *mapfile, MAPGLOBAL *mglob) {
uint32_t id = fnv1a_hash(mapfile);
const TSTRINGTABLE *stable = lang_load("mapnames.csv");
if (stable) {
const char *rplc = stringtable_find(stable, id, NULL);
if (rplc) {
strcopy_n(mglob->mapname,rplc,sizeof(mglob->mapname));
}
}
}
int load_map(const char *filename) int load_map(const char *filename)
{ {
FILE *f; FILE *f;
@ -316,12 +327,14 @@ int load_map(const char *filename)
case A_MAPGLOB: case A_MAPGLOB:
num_ofsets[BACK_NUM]=ofsts; num_ofsets[BACK_NUM]=ofsts;
num_ofsets_count[BACK_NUM]=1; num_ofsets_count[BACK_NUM]=1;
memset(&mglob,0,sizeof(mglob)); memset(&mglob,0,sizeof(mglob));
memcpy(&mglob,temp,MIN((int)size,(int)sizeof(mglob))); memcpy(&mglob,temp,MIN((int)size,(int)sizeof(mglob)));
free(temp); free(temp);
for(r=0;r<4;r++) for(r=0;r<4;r++) {
def_handle(ofsts++,mglob.back_fnames[r],pcx_fade_decomp,SR_GRAFIKA); def_handle(ofsts++,mglob.back_fnames[r],pcx_fade_decomp,SR_GRAFIKA);
}
back_color=RGB888(mglob.fade_r,mglob.fade_g,mglob.fade_b); back_color=RGB888(mglob.fade_r,mglob.fade_g,mglob.fade_b);
translate_map_name(filename, &mglob);;
break; break;
case A_MAPITEM: case A_MAPITEM:
SEND_LOG("(GAME) Loading items..."); SEND_LOG("(GAME) Loading items...");

View file

@ -129,7 +129,7 @@ static void PlayMGFFile(const void *file, MGIF_PROC proc,int ypos,char full)
{ {
int32_t scr_linelen2 = GetScreenPitch(); int32_t scr_linelen2 = GetScreenPitch();
mgif_install_proc(proc); mgif_install_proc(proc);
sound=PrepareVideoSound(22050,256*1024); sound=PrepareVideoSound(22050,226*1024);
picture=getmem(2*3+320*180*2); picture=getmem(2*3+320*180*2);
picture[0]=320; picture[0]=320;
picture[1]=180; picture[1]=180;