fix shops

This commit is contained in:
Ondřej Novák 2025-01-31 22:20:06 +01:00
parent 99378da298
commit 42087c926c
10 changed files with 143 additions and 139 deletions

View file

@ -164,7 +164,8 @@ static void dialog_anim(va_list args)
mgif_install_proc(animace_kouzla); mgif_install_proc(animace_kouzla);
const char *ch = build_pathname(2,gpathtable[SR_DIALOGS], block); const char *ch = build_pathname(2,gpathtable[SR_DIALOGS], block);
free(block); free(block);
aptr=load_file(ch); size_t loadsize;
aptr=load_file(ch, &loadsize);
do do
{ {
anm=open_mgif(aptr); anm=open_mgif(aptr);

View file

@ -460,72 +460,75 @@ int mob_vyber_vychod(int r,int sector,int dir,char alone,char mobile)
return dir; return dir;
} }
char je_mozne_videt(int sector1,int sector2,int flag) char je_mozne_videt(int sector1, int sector2, int flag) {
{ int x1, y1;
int x1,y1; int x2, y2;
int x2,y2; int xs, ys;
int xs,ys; int x, y, ly, s;
int x,y,ly,s;
if (map_coord[sector1].layer!=map_coord[sector2].layer) return 0; if (map_coord[sector1].layer != map_coord[sector2].layer)
x1=map_coord[sector1].x;x2=map_coord[sector2].x; return 0;
y1=map_coord[sector1].y;y2=map_coord[sector2].y; x1 = map_coord[sector1].x;
xs=x1-x2; x2 = map_coord[sector2].x;
ys=y1-y2; y1 = map_coord[sector1].y;
if (xs==0 && ys==0) return 1; y2 = map_coord[sector2].y;
s=sector1; xs = x1 - x2;
ly=0; ys = y1 - y2;
if (xs>=0) if (xs == 0 && ys == 0)
{ return 1;
for(x=0;x<=xs;x++) s = sector1;
{ ly = 0;
y=(x+1)*ys/(xs+1); if (xs >= 0) {
while (y>ly) for (x = 0; x <= xs; x++) {
if ((map_sides[(s<<2)].flags & flag)!=(unsigned)flag) y = (x + 1) * ys / (xs + 1);
{ while (y > ly) {
s=map_sectors[s].step_next[0]; if ((map_sides[(s << 2)].flags & flag) != (unsigned) flag) {
ly++; s = map_sectors[s].step_next[0];
} ly++;
else return 0; } else
while (y<ly) return 0;
if ((map_sides[(s<<2)+2].flags & flag)!=(unsigned)flag) }
{ while (y < ly) {
s=map_sectors[s].step_next[2]; if ((map_sides[(s << 2) + 2].flags & flag) != (unsigned) flag) {
ly--; s = map_sectors[s].step_next[2];
} ly--;
else return 0; } else
if (x!=xs) { return 0;
if ((map_sides[(s<<2)+3].flags & flag)!=(unsigned)flag) s=map_sectors[s].step_next[3]; }
} else return 0; if (x != xs) {
if ((map_sides[(s << 2) + 3].flags & flag) != (unsigned) flag) {
s = map_sectors[s].step_next[3];
} else {
return 0;
}
}
} }
} } else if (xs < 0) {
else for (x = 0; x >= xs; x--) {
if (xs<0) y = (x - 1) * ys / (xs - 1);
{ while (y > ly)
for(x=0;x>=xs;x--) if ((map_sides[(s << 2)].flags & flag) != (unsigned) flag) {
{ s = map_sectors[s].step_next[0];
y=(x-1)*ys/(xs-1); ly++;
while (y>ly) } else
if ((map_sides[(s<<2)].flags & flag)!=(unsigned)flag) return 0;
{ while (y < ly)
s=map_sectors[s].step_next[0]; if ((map_sides[( s << 2) + 2].flags & flag) != (unsigned) flag) {
ly++; s = map_sectors[s].step_next[2];
} ly--;
else return 0; } else
while (y<ly) return 0;
if ((map_sides[(s<<2)+2].flags & flag)!=(unsigned)flag) if (x != xs) {
{ if ((map_sides[(s << 2) + 1].flags & flag) != (unsigned) flag) {
s=map_sectors[s].step_next[2]; s = map_sectors[s].step_next[1];
ly--; } else {
} return 0;
else return 0; }
if (x!=xs) { }
if ((map_sides[(s<<2)+1].flags & flag)!=(unsigned)flag) s=map_sectors[s].step_next[1];
} else return 0;
} }
} }
return s==sector2; return s == sector2;
} }
int q_vidis_postavu(int sector,int dir,TMOB *p,int *otocit_se,char ret) int q_vidis_postavu(int sector,int dir,TMOB *p,int *otocit_se,char ret)
{ {

View file

@ -1485,9 +1485,10 @@ int smlouvat(int cena,int puvod,int pocet,int money,char mode)
int temp1,temp2; int temp1,temp2;
cena,puvod,pocet,money;text[0]=0;text[1]=0; cena,puvod,pocet,money;text[0]=0;text[1]=0;
add_window(170,130,300,150,H_IDESKA,3,20,20); set_font(H_FBOLD,RGB555(31,31,31));
add_window(170,130,300,100,H_WINTXTR,3,20,20);
define(-1,10,15,1,1,0,label,texty[241]); define(-1,10,15,1,1,0,label,texty[241]);
set_font(H_FBOLD,RGB555(31,31,31));define(-1,150,15,100,13,0,label,int2ascii(cena,buffer,10)); define(-1,150,15,100,13,0,label,int2ascii(cena,buffer,10));
set_font(H_FBOLD,MSG_COLOR1); set_font(H_FBOLD,MSG_COLOR1);
define(-1,10,30,1,1,0,label,texty[238]); define(-1,10,30,1,1,0,label,texty[238]);
define(10,150,30,100,13,0,input_line,8);property(def_border(5,BAR_COLOR),NULL,NULL,0);set_default(""); define(10,150,30,100,13,0,input_line,8);property(def_border(5,BAR_COLOR),NULL,NULL,0);set_default("");

View file

@ -1534,6 +1534,9 @@ void write_pocet_sipu()
} }
static const void *shop_keeper_picture = NULL;
void redraw_inventory() void redraw_inventory()
{ {
update_mysky(); update_mysky();
@ -2430,12 +2433,12 @@ static void shop_mouse_event(EVENT_MSG *msg,void **unused)
} }
static __inline void copy_data(char **src, void *target, int size) { static __inline void copy_data(const char **src, void *target, int size) {
memcpy(target, *src, size); memcpy(target, *src, size);
(*src)+=size; (*src)+=size;
} }
static char * load_TSHOP(char *binary, TSHOP *target) { static const char * load_TSHOP(const char *binary, TSHOP *target) {
copy_data(&binary, target->keeper, 16); copy_data(&binary, target->keeper, 16);
copy_data(&binary, target->picture, 13); copy_data(&binary, target->picture, 13);
copy_data(&binary, &target->koef, 4); copy_data(&binary, &target->koef, 4);
@ -2447,7 +2450,7 @@ static char * load_TSHOP(char *binary, TSHOP *target) {
return binary; return binary;
} }
static char * load_TPRODUCT(char *binary, TPRODUCT *target) { static const char * load_TPRODUCT(const char *binary, TPRODUCT *target) {
copy_data(&binary, &target->item, 2); copy_data(&binary, &target->item, 2);
copy_data(&binary, &target->cena, 4); copy_data(&binary, &target->cena, 4);
copy_data(&binary, &target->trade_flags, 2); copy_data(&binary, &target->trade_flags, 2);
@ -2456,16 +2459,17 @@ static char * load_TPRODUCT(char *binary, TPRODUCT *target) {
return binary; return binary;
} }
static void rebuild_shops(void) static void rebuild_shops(const void *shop_ptr)
{ {
char *c=(char *)shop_hacek; const char *c=(const char *)shop_ptr;
int i; int i;
SEND_LOG("(SHOP) Rebuilding shops...."); SEND_LOG("(SHOP) Rebuilding shops....");
if (shop_list!=NULL) free(shop_list); if (shop_list!=NULL) free(shop_list);
max_shops = *(const int32_t *)c;
shop_list=NewArr(TSHOP *,max_shops); shop_list=NewArr(TSHOP *,max_shops);
c+=4; c+=4;
char *d = c; const char *d = c;
size_t reqsize = 0; size_t reqsize = 0;
size_t products = 0; size_t products = 0;
for(i=0;i<max_shops;i++) { for(i=0;i<max_shops;i++) {
@ -2509,24 +2513,14 @@ static void rebuild_shops(void)
void load_shops(void) void load_shops(void)
{ {
int *d;
if (!test_file_exist(SR_MAP,SHOP_NAME)) if (!test_file_exist(SR_MAP,SHOP_NAME))
{ {
shop_hacek=NULL; shop_hacek=NULL;
shop_list=NULL; shop_list=NULL;
return; return;
} }
shop_hacek=afile(SHOP_NAME,SR_MAP,&shop_hacek_size); const void *sh=afile(SHOP_NAME,SR_MAP,&shop_hacek_size);
d=shop_hacek; rebuild_shops(sh);
max_shops=*d;
if (!max_shops)
{
free(shop_hacek);
shop_hacek=NULL;
shop_list=NULL;
return;
}
rebuild_shops();
} }
static int32_t *get_product_count(const TPRODUCT *p) { static int32_t *get_product_count(const TPRODUCT *p) {
@ -2660,6 +2654,7 @@ static void redraw_shop()
info_box_drawed=0; info_box_drawed=0;
if (info_box_below!=NULL) free(info_box_below); if (info_box_below!=NULL) free(info_box_below);
info_box_below=NULL; info_box_below=NULL;
if (shop_keeper_picture) put_picture(5,SCREEN_OFFLINE,shop_keeper_picture);
ms_last_event.event_type=0x1;send_message(E_MOUSE,&ms_last_event); ms_last_event.event_type=0x1;send_message(E_MOUSE,&ms_last_event);
ukaz_mysku(); ukaz_mysku();
showview(0,0,0,0); showview(0,0,0,0);
@ -2778,10 +2773,14 @@ char shop_keeper_click(int id, int xa, int ya, int xr, int yr) {
sprintf(c, texty[102], price); sprintf(c, texty[102], price);
p = message(3, 0, 1, texty[118], c, texty[77], texty[230], p = message(3, 0, 1, texty[118], c, texty[77], texty[230],
texty[78]); texty[78]);
if (p == 2) if (p == 2) {
price = -1; price = -1;
if (p == 1) }
if (p == 1) {
redraw_shop();
price = smlouvat(price, pp->cena, *get_product_count(pp), money, 0); price = smlouvat(price, pp->cena, *get_product_count(pp), money, 0);
}
if (price >= 0) { if (price >= 0) {
play_sample_at_channel(H_SND_OBCHOD, 1, 100); play_sample_at_channel(H_SND_OBCHOD, 1, 100);
buy_item(z); buy_item(z);
@ -2834,18 +2833,24 @@ char shop_bag_click(int id,int xa,int ya,int xr,int yr)
if (pp==NULL) return 0; if (pp==NULL) return 0;
mouse_set_cursor(H_MS_DEFAULT); mouse_set_cursor(H_MS_DEFAULT);
if (!price) return 0; if (!price) return 0;
if (price>money) if (price > money) {
{ p = message(2, 0, 0, "", texty[104], texty[230], texty[78]);
p=message(2,0,0,"",texty[104],texty[230],texty[78]); if (!p) {
if (!p) price=smlouvat(price,pp->cena,*get_product_count(pp),money,1);else price=-1; redraw_shop();
} price = smlouvat(price, pp->cena, *get_product_count(pp), money, 1);
else } else {
{ price = -1;
sprintf(s,texty[101],price); }
p=message(3,0,1,texty[118],s,texty[77],texty[230],texty[78]); } else {
if (p==1) price=smlouvat(price,pp->cena,*get_product_count(pp),money,1);else sprintf(s, texty[101], price);
if (p==2) price=-1; p = message(3, 0, 1, texty[118], s, texty[77], texty[230], texty[78]);
} if (p == 1) {
redraw_shop();
price = smlouvat(price, pp->cena, *get_product_count(pp), money, 1);
} else if (p == 2) {
price = -1;
}
}
if (price>=0) if (price>=0)
{ {
play_sample_at_channel(H_SND_OBCHOD,1,100); play_sample_at_channel(H_SND_OBCHOD,1,100);
@ -2887,7 +2892,6 @@ void wire_shop()
{ {
int32_t size; int32_t size;
static TSHOP *last_shop=NULL; static TSHOP *last_shop=NULL;
static void *pic=NULL;
mute_all_tracks(0); mute_all_tracks(0);
old_inv_view_mode=inv_view_mode; old_inv_view_mode=inv_view_mode;
inv_view_mode=0; inv_view_mode=0;
@ -2895,10 +2899,10 @@ void wire_shop()
schovej_mysku(); schovej_mysku();
if (last_shop!=cur_shop) if (last_shop!=cur_shop)
{ {
free(pic);pic=afile(cur_shop->picture,SR_DIALOGS,&size); ablock_free(shop_keeper_picture);
shop_keeper_picture=afile(cur_shop->picture,SR_DIALOGS,&size);
last_shop=cur_shop; last_shop=cur_shop;
} }
if (cur_shop->picture[0]) put_picture(5,SCREEN_OFFLINE,pic);
send_message(E_ADD,E_MOUSE,shop_mouse_event); send_message(E_ADD,E_MOUSE,shop_mouse_event);
unwire_proc=unwire_shop; unwire_proc=unwire_shop;
change_click_map(clk_shop,CLK_SHOP); change_click_map(clk_shop,CLK_SHOP);

View file

@ -1233,14 +1233,7 @@ static void configure(char *filename)
*/ */
static int update_config(void) static int update_config(void)
{ {
SEND_LOG("(GAME) Updating config. file '%s'",CONFIG_NAME);
add_field_num(&cur_config,sinit[1].heslo,zoom_speed(-1));
add_field_num(&cur_config,sinit[2].heslo,turn_speed(-1));
if (check_snd_effect(SND_MUSIC)) add_field_num(&cur_config,sinit[3].heslo,get_snd_effect(SND_MUSIC));
if (check_snd_effect(SND_GFX)) add_field_num(&cur_config,sinit[4].heslo,get_snd_effect(SND_GFX));
add_field_num(&cur_config,sinit[9].heslo,level_preload);
add_field_num(&cur_config,sinit[13].heslo,autosave_enabled);
save_config(cur_config,CONFIG_NAME);
return 0; return 0;
} }

View file

@ -816,6 +816,7 @@ void input_line_event(EVENT_MSG *msg,OBJREC *o)
void input_line_done(OBJREC *o) { void input_line_done(OBJREC *o) {
free(o->userptr); free(o->userptr);
o->userptr = NULL;
} }

View file

@ -606,7 +606,11 @@ void do_it_events(EVENT_MSG *msg,void **user_data)
if (msg->msg==E_INIT) return; if (msg->msg==E_INIT) return;
if (desktop==NULL) {exit_wait=1;return;} if (desktop==NULL) {exit_wait=1;return;}
change_flag=0;f_cancel_event=0; change_flag=0;f_cancel_event=0;
if (o_aktual!=NULL)o_aktual->on_event(msg,o_aktual); if (o_aktual!=NULL) {
EVENT_MSG mcpy = clone_message(msg);
o_aktual->on_event(&mcpy,o_aktual);
destroy_message(&mcpy);
}
if (msg->msg==E_MOUSE) if (msg->msg==E_MOUSE)
{ {
*oz=1; *oz=1;
@ -665,11 +669,13 @@ void do_it_events(EVENT_MSG *msg,void **user_data)
if (msg->msg==E_KEYBOARD) if (msg->msg==E_KEYBOARD)
{ {
*oz=1; *oz=1;
EVENT_MSG cmsg = clone_message(msg);
if (o_aktual!=NULL) if (o_aktual!=NULL)
{ {
o_aktual->call_event(msg,o_aktual); o_aktual->call_event(msg,o_aktual);
} }
int code = va_arg(msg->data, int); int code = va_arg(cmsg.data, int);
destroy_message(&cmsg);
if ((code>>8)==0xf && waktual->idlist!=NULL) if ((code>>8)==0xf && waktual->idlist!=NULL)
{ {
if (o_aktual==NULL) o_aktual=get_last_id(); if (o_aktual==NULL) o_aktual=get_last_id();

View file

@ -90,7 +90,7 @@ void *getmem(int32_t size)
} }
void *load_file(const char *filename) void *load_file(const char *filename, size_t *sz)
{ {
FILE *f; FILE *f;
int32_t *p; int32_t *p;
@ -109,7 +109,7 @@ void *load_file(const char *filename)
p=(void *)getmem(size); p=(void *)getmem(size);
if (fread(p,1,size,f)!=size) load_error(filename); if (fread(p,1,size,f)!=size) load_error(filename);
fclose(f); fclose(f);
last_load_size=size; *sz=size;
return p; return p;
} }
@ -377,7 +377,7 @@ THANDLE_DATA *def_handle(int handle,const char *filename,ABLOCK_DECODEPROC decom
return h; return h;
} }
void *afile(char *filename,int group,int32_t *blocksize) const void *afile(char *filename,int group,int32_t *blocksize)
{ {
char *d; char *d;
int32_t entr; int32_t entr;
@ -393,24 +393,31 @@ void *afile(char *filename,int group,int32_t *blocksize)
const void *hnd; const void *hnd;
SEND_LOG("(LOAD) Afile is loading file '%s' from group %d",d,group); SEND_LOG("(LOAD) Afile is loading file '%s' from group %d",d,group);
if (entr<0) entr=-entr,hnd=patch_m;else hnd=bmf_m; if (entr<0) entr=-entr,hnd=patch_m;else hnd=bmf_m;
const int32_t * szptr = (const int32_t *)hnd; const int32_t * szptr = (const int32_t *)((const char *)hnd+entr);
*blocksize = *szptr; *blocksize = *szptr;
void *ret = getmem(*blocksize); return szptr+1;
memcpy(ret, szptr+1, *blocksize);
return ret;
} }
else if (mman_pathlist!=NULL) else if (mman_pathlist!=NULL)
{ {
const char *name = build_pathname(2,mman_pathlist[group],d); const char *name = build_pathname(2,mman_pathlist[group],d);
size_t sz;
SEND_LOG("(LOAD) Afile is loading file '%s' from disk (group %d)",d,group); SEND_LOG("(LOAD) Afile is loading file '%s' from disk (group %d)",d,group);
p=load_file(name); p=load_file(name, &sz);
*blocksize=last_load_size; *blocksize=sz;
} }
else return NULL; else return NULL;
return p; return p;
} }
void *afile_copy(char *filename,int group,int32_t *blocksize) {
const void *ptr = afile(filename, group, blocksize);
if (need_to_be_free(ptr)) return (void *)ptr;
void *cpy = getmem(*blocksize);
memcpy(cpy, ptr, *blocksize);
return cpy;
}
static void decompress_data(THANDLE_DATA *h) { static void decompress_data(THANDLE_DATA *h) {
if (h->loadproc) { if (h->loadproc) {
@ -452,10 +459,11 @@ const void *ablock(int handle)
{ {
if (h->src_file[0]!=0) if (h->src_file[0]!=0)
{ {
size_t sz;
if (mman_action!=NULL) mman_action(MMA_READ); if (mman_action!=NULL) mman_action(MMA_READ);
const char *name = build_pathname(2,mman_pathlist[h->path], h->src_file); const char *name = build_pathname(2,mman_pathlist[h->path], h->src_file);
p=load_file(name); p=load_file(name, &sz);
s=last_load_size; s=sz;
} }
else else
{ {
@ -795,19 +803,6 @@ int32_t get_handle_size(int handle)
} }
*/ */
FILE *afiletemp(char *filename, int group)
{
int32_t size;
void *p=afile(filename,group,&size);
FILE *f;
if (p==NULL) return NULL;
f=tmpfile();
if (f==NULL) {free(p);return NULL;}
fwrite(p,size,1,f);
fseek(f,0,SEEK_SET);
return f;
}
void ablock_free(const void *ptr) { void ablock_free(const void *ptr) {
if (need_to_be_free(ptr)) free((void *)ptr); if (need_to_be_free(ptr)) free((void *)ptr);
} }

View file

@ -81,7 +81,7 @@ extern int memman_handle; //cislo handle naposled zpracovavaneho prikazem ablock
extern char mman_patch; //jednicka zapina moznost pouziti patchu extern char mman_patch; //jednicka zapina moznost pouziti patchu
void *getmem(int32_t size); //alokace pameti pres memman. alokovat pomoci malloc lze ale hrozi nebezpeci ze vrati NULL void *getmem(int32_t size); //alokace pameti pres memman. alokovat pomoci malloc lze ale hrozi nebezpeci ze vrati NULL
void *grealloc(void *m,int32_t size); //realokace pameti pres memman void *grealloc(void *m,int32_t size); //realokace pameti pres memman
void *load_file(const char *filename); //obycejne natahne soubor do pameti a vrati ukazatel. void *load_file(const char *filename, size_t *size); //obycejne natahne soubor do pameti a vrati ukazatel.
void init_manager(const char *filename,const char *swp); //inicializuje manager. Jmeno filename i swapname nejsou povinne (musi byt NULL kdyz nejsou pouzity) void init_manager(const char *filename,const char *swp); //inicializuje manager. Jmeno filename i swapname nejsou povinne (musi byt NULL kdyz nejsou pouzity)
void def_mman_group_table(const char ** ); //define pointer to table of paths, for each group there is path void def_mman_group_table(const char ** ); //define pointer to table of paths, for each group there is path
THANDLE_DATA *def_handle(int handle,const char *filename,ABLOCK_DECODEPROC decompress,char path); //deklaruje rukojet. promenna decompress je ukazatel na funkci ktera upravi data pred vracenim ukazatele THANDLE_DATA *def_handle(int handle,const char *filename,ABLOCK_DECODEPROC decompress,char path); //deklaruje rukojet. promenna decompress je ukazatel na funkci ktera upravi data pred vracenim ukazatele
@ -98,7 +98,8 @@ THANDLE_DATA *zneplatnit_block(int handle); //zneplatni data bloku
THANDLE_DATA *get_handle(int handle); //vraci informace o rukojeti THANDLE_DATA *get_handle(int handle); //vraci informace o rukojeti
int find_handle(const char *name,void *decomp); //hleda mezi rukojeti stejnou definici int find_handle(const char *name,void *decomp); //hleda mezi rukojeti stejnou definici
int test_file_exist(int group,char *filename); //testuje zda soubor existuje v ramci mmanageru int test_file_exist(int group,char *filename); //testuje zda soubor existuje v ramci mmanageru
void *afile(char *filename,int group,int32_t *blocksize); //nahraje do pameti soubor registrovany v ramci mmanageru const void *afile(char *filename,int group,int32_t *blocksize); //nahraje do pameti soubor registrovany v ramci mmanageru
void *afile_copy(char *filename,int group,int32_t *blocksize); //nahraje do pameti soubor registrovany v ramci mmanageru
int32_t get_handle_size(int handle); int32_t get_handle_size(int handle);
//void get_mem_info(MEMORYSTATUS *mem); //void get_mem_info(MEMORYSTATUS *mem);
void ablock_free(const void *ptr); void ablock_free(const void *ptr);
@ -106,7 +107,6 @@ void ablock_free(const void *ptr);
int read_group(int index); int read_group(int index);
char add_patch_file(char *filename); //pripojuje zaplatu char add_patch_file(char *filename); //pripojuje zaplatu
FILE *afiletemp(char *filename, int group);
#define MMA_READ 1 #define MMA_READ 1

View file

@ -6,7 +6,7 @@ static char *render_int(char *where, int i, int radix) {
if (i == 0) return where; if (i == 0) return where;
char *r = render_int(where, i/radix, radix); char *r = render_int(where, i/radix, radix);
int p = i % radix; int p = i % radix;
if (p<=0) { if (p<=9) {
*r = p + '0'; *r = p + '0';
} else { } else {
*r = p + 'A' - 10; *r = p + 'A' - 10;