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);
const char *ch = build_pathname(2,gpathtable[SR_DIALOGS], block);
free(block);
aptr=load_file(ch);
size_t loadsize;
aptr=load_file(ch, &loadsize);
do
{
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;
}
char je_mozne_videt(int sector1,int sector2,int flag)
{
int x1,y1;
int x2,y2;
int xs,ys;
int x,y,ly,s;
char je_mozne_videt(int sector1, int sector2, int flag) {
int x1, y1;
int x2, y2;
int xs, ys;
int x, y, ly, s;
if (map_coord[sector1].layer!=map_coord[sector2].layer) return 0;
x1=map_coord[sector1].x;x2=map_coord[sector2].x;
y1=map_coord[sector1].y;y2=map_coord[sector2].y;
xs=x1-x2;
ys=y1-y2;
if (xs==0 && ys==0) return 1;
s=sector1;
ly=0;
if (xs>=0)
{
for(x=0;x<=xs;x++)
{
y=(x+1)*ys/(xs+1);
while (y>ly)
if ((map_sides[(s<<2)].flags & flag)!=(unsigned)flag)
{
s=map_sectors[s].step_next[0];
if (map_coord[sector1].layer != map_coord[sector2].layer)
return 0;
x1 = map_coord[sector1].x;
x2 = map_coord[sector2].x;
y1 = map_coord[sector1].y;
y2 = map_coord[sector2].y;
xs = x1 - x2;
ys = y1 - y2;
if (xs == 0 && ys == 0)
return 1;
s = sector1;
ly = 0;
if (xs >= 0) {
for (x = 0; x <= xs; x++) {
y = (x + 1) * ys / (xs + 1);
while (y > ly) {
if ((map_sides[(s << 2)].flags & flag) != (unsigned) flag) {
s = map_sectors[s].step_next[0];
ly++;
} else
return 0;
}
else return 0;
while (y<ly)
if ((map_sides[(s<<2)+2].flags & flag)!=(unsigned)flag)
{
s=map_sectors[s].step_next[2];
while (y < ly) {
if ((map_sides[(s << 2) + 2].flags & flag) != (unsigned) flag) {
s = map_sectors[s].step_next[2];
ly--;
} else
return 0;
}
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;
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)
{
for(x=0;x>=xs;x--)
{
y=(x-1)*ys/(xs-1);
while (y>ly)
if ((map_sides[(s<<2)].flags & flag)!=(unsigned)flag)
{
s=map_sectors[s].step_next[0];
}
} else if (xs < 0) {
for (x = 0; x >= xs; x--) {
y = (x - 1) * ys / (xs - 1);
while (y > ly)
if ((map_sides[(s << 2)].flags & flag) != (unsigned) flag) {
s = map_sectors[s].step_next[0];
ly++;
}
else return 0;
while (y<ly)
if ((map_sides[(s<<2)+2].flags & flag)!=(unsigned)flag)
{
s=map_sectors[s].step_next[2];
} else
return 0;
while (y < ly)
if ((map_sides[( s << 2) + 2].flags & flag) != (unsigned) flag) {
s = map_sectors[s].step_next[2];
ly--;
}
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;
} 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)
{

View file

@ -1485,9 +1485,10 @@ int smlouvat(int cena,int puvod,int pocet,int money,char mode)
int temp1,temp2;
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]);
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);
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("");

View file

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

View file

@ -1233,14 +1233,7 @@ static void configure(char *filename)
*/
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;
}

View file

@ -816,6 +816,7 @@ void input_line_event(EVENT_MSG *msg,OBJREC *o)
void input_line_done(OBJREC *o) {
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 (desktop==NULL) {exit_wait=1;return;}
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)
{
*oz=1;
@ -665,11 +669,13 @@ void do_it_events(EVENT_MSG *msg,void **user_data)
if (msg->msg==E_KEYBOARD)
{
*oz=1;
EVENT_MSG cmsg = clone_message(msg);
if (o_aktual!=NULL)
{
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 (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;
int32_t *p;
@ -109,7 +109,7 @@ void *load_file(const char *filename)
p=(void *)getmem(size);
if (fread(p,1,size,f)!=size) load_error(filename);
fclose(f);
last_load_size=size;
*sz=size;
return p;
}
@ -377,7 +377,7 @@ THANDLE_DATA *def_handle(int handle,const char *filename,ABLOCK_DECODEPROC decom
return h;
}
void *afile(char *filename,int group,int32_t *blocksize)
const void *afile(char *filename,int group,int32_t *blocksize)
{
char *d;
int32_t entr;
@ -393,24 +393,31 @@ void *afile(char *filename,int group,int32_t *blocksize)
const void *hnd;
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;
const int32_t * szptr = (const int32_t *)hnd;
const int32_t * szptr = (const int32_t *)((const char *)hnd+entr);
*blocksize = *szptr;
void *ret = getmem(*blocksize);
memcpy(ret, szptr+1, *blocksize);
return ret;
return szptr+1;
}
else if (mman_pathlist!=NULL)
{
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);
p=load_file(name);
*blocksize=last_load_size;
p=load_file(name, &sz);
*blocksize=sz;
}
else return NULL;
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) {
if (h->loadproc) {
@ -452,10 +459,11 @@ const void *ablock(int handle)
{
if (h->src_file[0]!=0)
{
size_t sz;
if (mman_action!=NULL) mman_action(MMA_READ);
const char *name = build_pathname(2,mman_pathlist[h->path], h->src_file);
p=load_file(name);
s=last_load_size;
p=load_file(name, &sz);
s=sz;
}
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) {
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
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 *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 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
@ -98,7 +98,8 @@ THANDLE_DATA *zneplatnit_block(int handle); //zneplatni data bloku
THANDLE_DATA *get_handle(int handle); //vraci informace o rukojeti
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
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);
//void get_mem_info(MEMORYSTATUS *mem);
void ablock_free(const void *ptr);
@ -106,7 +107,6 @@ void ablock_free(const void *ptr);
int read_group(int index);
char add_patch_file(char *filename); //pripojuje zaplatu
FILE *afiletemp(char *filename, int group);
#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;
char *r = render_int(where, i/radix, radix);
int p = i % radix;
if (p<=0) {
if (p<=9) {
*r = p + '0';
} else {
*r = p + 'A' - 10;