diff --git a/game/dialogy.c b/game/dialogy.c index 571d06d..98a5792 100644 --- a/game/dialogy.c +++ b/game/dialogy.c @@ -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); diff --git a/game/enemy.c b/game/enemy.c index 5ad7a49..597976f 100644 --- a/game/enemy.c +++ b/game/enemy.c @@ -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]; - ly++; - } - else return 0; - while (y= 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]; + ly--; + } 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]; - ly++; - } - else return 0; - while (y= 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]; + 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; + } + } } - } - return s==sector2; - } + } + return s == sector2; +} int q_vidis_postavu(int sector,int dir,TMOB *p,int *otocit_se,char ret) { diff --git a/game/interfac.c b/game/interfac.c index c3ed1e1..60351ea 100644 --- a/game/interfac.c +++ b/game/interfac.c @@ -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(""); diff --git a/game/inv.c b/game/inv.c index 719e930..73e59ee 100644 --- a/game/inv.c +++ b/game/inv.c @@ -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;icena, *get_product_count(pp), money, 0); + + } if (price >= 0) { play_sample_at_channel(H_SND_OBCHOD, 1, 100); 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; 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; - } - 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 > 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; + } + } if (price>=0) { play_sample_at_channel(H_SND_OBCHOD,1,100); @@ -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); diff --git a/game/skeldal.c b/game/skeldal.c index 06906c0..cb6d3d4 100644 --- a/game/skeldal.c +++ b/game/skeldal.c @@ -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; } diff --git a/libs/basicobj.c b/libs/basicobj.c index 26e398b..09dcafc 100644 --- a/libs/basicobj.c +++ b/libs/basicobj.c @@ -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; } diff --git a/libs/gui.c b/libs/gui.c index 2db3d70..9875c59 100644 --- a/libs/gui.c +++ b/libs/gui.c @@ -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(); diff --git a/libs/memman.c b/libs/memman.c index f3e46e5..5dcd299 100644 --- a/libs/memman.c +++ b/libs/memman.c @@ -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); } diff --git a/libs/memman.h b/libs/memman.h index 689e703..b7d159c 100644 --- a/libs/memman.h +++ b/libs/memman.h @@ -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 diff --git a/platform/int2ascii.c b/platform/int2ascii.c index 5c3e7f3..4014828 100644 --- a/platform/int2ascii.c +++ b/platform/int2ascii.c @@ -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;