gates_of_skeldal/MAPS/ITEMS2.C
2025-01-25 21:15:16 +01:00

1707 lines
47 KiB
C
Raw Blame History

#include <skeldal_win.h>
#include <types.h>
#include <mem.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <bgraph.h>
#include <event.h>
#include <devices.h>
#include <bmouse.h>
#include <gui.h>
#include <strlite.h>
#include <strlists.h>
#include <basicobj.h>
#include <memman.h>
#include <pcx.h>
#include <dos.h>
#include <inicfg.h>
#include "mapy.h"
#include "globals.h"
#include "edit_map.h"
#include "steny.h"
#include "save_map.h"
#include "mob_edit.h"
#define ITEM_BUFFER 256
#define SV_ITLIST 0x8001
#define SV_SNDLIST 0x8002
#define SV_END 0x8000
#define SV_PASSW 0x1000
#define ITEM_IKON "..\\graphics\\items\\"
#define ITEM_MALE "..\\graphics\\basic\\char00.pcx"
#define DIALOG_MASK "..\\graphics\\dialogs\\*.hi"
#define IT_INSIDE 0x1
#define IT_IDENTF 0x2
#define IT_UNIKAT 0x4
#define IT_MAGIC 0x8
TITEM item_list[ITEM_SORTS];
short *item_place[MAPSIZE*4];
short item_buffer[ITEM_BUFFER];
short max_items;
int item_win=-1;
int vzor_win=-1;
int selected_place=-1;
int preview_win=-1;
int grep_num=-1;
static int shop_window=-1;
TSTR_LIST vzhled_veci;
TSTR_LIST pohledy_veci;
TSTR_LIST ls_buffer=NULL,ls_sorts=NULL;
TSTR_LIST itm_sounds=NULL;
TSHOP *shop_list=NULL;int max_shops=0;
TSTR_LIST shop_items=NULL;short shop_max_id=1;
TTRAINING *train_list=NULL;int max_trains=0;
void clear_it_buffer();
void init_item_system(void)
{
static char again=0;
int i;
if (again) for(i=0;i<sizeof(item_place)/4;i++) if (item_place[i]!=NULL) free(item_place[i]);
memset(item_place,0,sizeof(item_place));
max_items=0;
clear_it_buffer();
again=1;
}
#define get_items(sector,pos) item_place[sector*4+pos];
void remove_items_from_sector(int sector)
{
int i;
sector<<=2;for(i=0;i<4;i++)
{
free(item_place[i+sector]);
item_place[i+sector]=NULL;
}
}
void update_items(int sector,int pos,short *new[],int pocet)
{
short **q;
q=&item_place[sector*4+pos];
free(*q);
*q=(short *)getmem(pocet*sizeof(short));
memcpy(*q,*new,pocet*sizeof(short));
}
void ikris(int num,int x1,int y1,int x2,int y2)
{
curcolor=RGB555(31,0,0);
if (num==selected_place) bar(x1,y1,x2,y2);
if (item_place[num]==NULL) return;
curcolor=RGB555(0,0,31);
line(x1+1,y1+1,x2-1,y2-1);
line(x2-1,y1+1,x1+1,y2-1);
}
void ikona_display(int x1,int y1,int x2,int y2,OBJREC *o)
{
static char *ikonlib=NULL;
static int lastikolib=-1;
int nowlib;
int ikn;
char s[200];
char n[13];
ikn=*(int *)o->data;
nowlib=ikn/18;
if (lastikolib!=nowlib)
{
FILE *f;int i;void *z;long size;
char *c=get_text_field(config_file,"CESTA_ITEMY");
if (c==NULL) c="";
sprintf(n,"ikony%02d.lib",nowlib);
sprintf(s,"%s%s",c,n);
if (ikonlib==NULL) ikonlib=(char *)getmem(18*2993);
f=fopen(s,"rb");
if (f==NULL)
if ((z=afile(n,read_group(0),&size))==NULL)
for(i=0;i<18;i++)
{
memset(ikonlib+i*2993,0,2993);
}
else
{
memcpy(ikonlib,z,18*2993);
free(z);
}
else
{
fread(ikonlib,1,18*2993,f);
fclose(f);
}
lastikolib=nowlib;
for(i=0;i<18;i++)
{
int j;
word *z=(word *)(ikonlib+i*2993+6);
for (j=0;j<256;j++) z[j]=z[j]+(z[j] & 0x7FE0);
}
}
ikn%=18;
bar(x1,y1,x2,y2);
put_picture(x1,y1,ikonlib+ikn*2993);
}
void ikona_click(EVENT_MSG *msg,OBJREC *o)
{
MS_EVENT *ms;
o;
if (msg->msg==E_MOUSE)
{
ms=get_mouse(msg);
if (ms->event_type==0x4)
set_change();
}
}
void ikona(OBJREC *o)
{
o->call_draw=ikona_display;
o->call_event=ikona_click;
o->datasize=4;
}
int select_ikon_lib(int last)
{
int x,y,i,s;
s=last;
def_dialoge(50,200,500,264,"Knihovna ikon - vyber jednu ikonu");
x=5;y=20;
for (i=0;i<30;i++)
{
define(i+10,x,y,45,55,0,ikona);c_default(last+i);
property(def_border(5,WINCOLOR),NULL,NULL,0);on_control_change(terminate_gui);
x+=48;if (x+48>490) {y+=58;x=5;}
}
define(300,10,10,80,20,3,button,"<<");
property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui);
define(310,10,10,80,20,2,button,">>");
property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui);
define(320,175-40,10,80,20,3,button,"Zru<EFBFBD>it");
property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui);
redraw_window();
do
{
escape();
if (o_aktual->id==300)
{
last-=30;if (last<0) last=0;
for(i=0;i<30;i++) c_set_value(0,10+i,last+i);
}
if (o_aktual->id==310)
{
last+=30;
for(i=0;i<30;i++) c_set_value(0,10+i,last+i);
}
}
while (o_aktual->id==310 || o_aktual->id==300);
i=o_aktual->id;
close_current();
if (i==320) i=s; else i=i-10+last;
return i;
}
void change_item_ikone()
{
c_set_value(0,130,select_ikon_lib(f_get_value(0,130)));
}
char nvlast[][16]=
{"S<EFBFBD>la","Schopnost magie","Pohyblivost","Obratnost","Max zran<61>n<EFBFBD>",
"Kondice","Max mana","Obrana(doln<6C>)","Obrana(Horn<72>)","<EFBFBD>tok(Doln<6C>)",
"<EFBFBD>tok(Horn<72>)","Ohe<EFBFBD>","Voda","Zem<EFBFBD>","Vzduch","Mysl","<EFBFBD>ivoty Regen",
"Mana Regen","Kondice Regen","Magick<EFBFBD> s<>la(D)", "Magick<EFBFBD> s<>la(H)","","<EFBFBD><EFBFBD>innek z<>sahu","*"};
void ukaz_vlastnosti(int pocet,int x,int y,int id,short *it)
{
word i,ts;
i=0;
curfont=vga_font;
default_font=curfont;
while (nvlast[i][0]!='*' && i<pocet)
{
ts=text_width(nvlast[i]);
if (y+15>250)
{
x+=200;
y=20;
}
if (nvlast[i][0])
{
define(-1,x,y,ts,10,0,label,nvlast[i]);
define(id++,x+130,y,60,12,0,input_line,7,-32767,+32767,"%6d");
property(def_border(5,WINCOLOR),NULL,NULL,WINCOLOR);
set_default(strs(*it));
on_exit(test_int);
y+=15;
}
it++;
i++;
}
}
void oprav_vlastnosti(TITEM *it)
{
int i;
def_dialoge(120,80,410,310,"Vlastnosti");
ukaz_vlastnosti(4,5,20,70,it->podminky);
define(-1,5,93,190,0,0,label,"");property(def_border(2,WINCOLOR),NULL,NULL,WINCOLOR);
ukaz_vlastnosti(99,5,105,80,it->zmeny);
/*define(130,5,200,100,10,0,check_box,"Na hlavu");
define(140,5,212,100,10,0,check_box,"Na krk");
define(150,5,224,100,10,0,check_box,"Na telo");
define(160,5,236,100,10,0,check_box,"Na ruce");
define(170,5,248,100,10,0,check_box,"Na lokte");
define(180,5,260,100,10,0,check_box,"Kolem pasu");
define(190,5,272,100,10,0,check_box,"Na nohy");
define(200,105,200,100,10,0,check_box,"Na chodidla");
define(210,105,212,100,10,0,check_box,"Na ramena");
define(220,105,224,100,10,0,check_box,"Na z<>da"); */
define(300,10,10,80,20,2,button,"Zru<EFBFBD>it");on_control_change(terminate_gui);
property(def_border(1,0),NULL,NULL,WINCOLOR);
define(310,10,40,80,20,2,button,"Ok");on_control_change(terminate_gui);
property(def_border(1,0),NULL,NULL,WINCOLOR);
define(-1,225,216,70,10,0,label,"Magick<EFBFBD> <20>tok");
define(250,225,228,70,70,0,radio_butts,5,"Ohe<EFBFBD>","Voda","Zem<EFBFBD>","Vzduch","Mysl");
c_default(it->zmeny[VLS_MGZIVEL]);
// fill_bit_fields(0,130,it->place_map,11);
redraw_window();
escape();
if (o_aktual->id==310)
{
for(i=0;i<4;i++) it->podminky[i]=vals(i+70);
for(i=0;i<23;i++) it->zmeny[i]=vals(i+80);
// it->place_map=get_bit_fields(0,130,10);
it->zmeny[VLS_MGZIVEL]=f_get_value(0,250);
}
close_current();
}
void otevri_vlastnosti()
{
TITEM *it;
get_value(0,5,&it);
oprav_vlastnosti(it);
}
void item_special(TITEM *it)
{
int i,y;
CTL3D *c;
def_dialoge(140,100,410,320,"Special - obr<62>zky v letu");
y=20;c=def_border(5,WINCOLOR);
for(i=0;i<16;i++)
{
define((i+1)*10,100,y,300,12,0,str_line,pohledy_veci);property(c,NULL,NULL,WINCOLOR);
c_default(it->v_letu[i]); on_enter(string_list_sup);
y+=15; if ((i & 3)==3) y+=5;
}
define(-1,5,20,1,1,0,label,"Zezadu");
define(-1,5,85,1,1,0,label,"Ze strany");
define(-1,5,150,1,1,0,label,"Zep<EFBFBD>edu");
define(-1,5,215,1,1,0,label,"V<EFBFBD>buch");
define(300,10,10,80,20,2,button,"Zru<EFBFBD>it");on_control_change(terminate_gui);
define(310,100,10,80,20,2,button,"Ok");on_control_change(terminate_gui);
redraw_window();
escape();
if (o_aktual->id==310)
for(i=0;i<16;i++) it->v_letu[i]=f_get_value(0,i*10+10);
close_current();
}
void otevri_special()
{
TITEM *it;
get_value(0,5,&it);
item_special(it);
}
void items_adjusting()
{
int num;
TSTR_LIST pcxs=NULL;
char *filename;
int x1,y1,x2,y2,yy1,yy2;
word *vec = 0;
WINDOW *w;
char *c,*d;
word *male,malexs,maleys;
w=find_window(preview_win);
c=get_text_field(config_file,"CESTA_BGRAFIKA"); if (c==NULL) c="";
concat(d,c,"CHAR00.PCX");
if (w!=NULL) close_window(w);
if (open_pcx(d,A_8BIT,(void *)&male))
{
void *z;long s;
char *ss=strrchr(d,'\\');
if (ss==NULL) ss=d;else ss=ss+1;
if ((z=afile(ss,read_group(0),&s))==NULL) return;
load_pcx(z,s,A_8BIT,(void *)&male);free(z);
}
malexs=male[0];
maleys=male[1];
free(male);
read_side_list(ITEMS_SCRIPT,&pcxs,2,4);
num=f_get_value(0,190);
if (num >= str_count(pcxs))
num = 0;
concat(c,"",pcxs[num]);
d=get_text_field(config_file,"CESTA_ITEMY");if (d==NULL) d="";
concat(filename,d,c);
release_list(pcxs);
if (open_pcx(filename,A_8BIT,(void *)&vec))
{
void *z;long s;
if ((z=afile(c,read_group(0),&s))==NULL)
{
msg_box("Soubor nenalezen!",'\x1',filename,"Ok",NULL);
return;
}
load_pcx(z,s,A_8BIT,(void *)&vec);free(z);
}
x1=vals(140);
y1=vals(150);
x2=vals(160);
y2=vals(170);
yy1=350-y1-vec[1];
yy2=350-y2-vec[1];
if (yy1<0 || yy2<0)
{
msg_box("Chyba!",'\x1',"Nelze zobrazit, proto<74>e n<>hled je z<><7A>sti mimo obrazovku!","Ok",NULL);
return;
}
preview_win=def_window(300,400,"View");
define(10,150-malexs/2,350-maleys,malexs,maleys,0,pcx_view);set_default(ITEM_MALE);
define(20,150+x1-vec[0]/2,yy1,1,1,0,pcx_view);set_default(filename);
define(30,150+x2-vec[0]/2,yy2,1,1,0,pcx_view);set_default(filename);
define(40,5,5,80,20,2,button,"Ok");on_control_change(close_current);
movesize_win(waktual,0,0,300,400);
redraw_window();
free(vec);
}
static add_sound_to_table(char *s)
{
int cnt;
int i;
cnt=str_count(itm_sounds);
for(i=1;i<cnt;i++) if (itm_sounds[i]!=NULL && !strcmp(itm_sounds[i],s)) return i;
return str_add(&itm_sounds,s);
}
static delete_unused_sound(int index)
{
int i;
for(i=0;i<ITEM_SORTS;i++) if (item_list[i].sound==index) return 0;
str_replace(&itm_sounds,index,NULL);
return 1;
}
void item_sound_call(TITEM *it)
{
TSTR_LIST list;
CTL3D b1,b2,b3;
char *c;
memcpy(&b1,def_border(1,0),sizeof(CTL3D));
memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D));
memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D));
default_font=vga_font;
memcpy(f_default,flat_color(0x0000),sizeof(charcolors));
def_dialoge(100,50,300,250,"Zvuk p<>i dopadu (destrukci)");
concat(c,sample_path,"*.wav");
list=read_directory(c,DIR_BREIF,_A_NORMAL);
read_ddl_list_wav(&list);
define(9,10,20,200,126,0,listbox,list,0x7fff,0);
property(&b3,NULL,NULL,WINCOLOR);c_default(0);on_control_change(mob_test_sound);
define(10,217,40,19,87,0,scroll_bar_v,0,10,1,SCROLLBARCOL);
property(&b2,NULL,NULL,WINCOLOR);
define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(12,216,130,21,17,0,scroll_button,1,10,"\x1f");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
{
int z,y;
char *s;
z=it->sound; y=160+15;
if (z==0) s=NULL;else s=itm_sounds[z];
if (s==NULL) s="";
define(-1,5,y,1,1,0,label,"Zvuk:");
define(20,120,y,120,12,0,input_line,13);property(&b2,NULL,NULL,WINCOLOR);
set_default(s);
define(40,245,y,20,12,0,button,"<");
property(&b1,NULL,NULL,WINCOLOR);on_control_change(mob_sound_copy);
}
define(100,5,5,80,20,2,button,"Ok");on_control_change(terminate_gui); property(&b1,NULL,NULL,WINCOLOR);
define(110,90,5,80,20,2,button,"Zru<EFBFBD>it");on_control_change(terminate_gui); property(&b1,NULL,NULL,WINCOLOR);
redraw_window();
escape();
if (o_aktual->id==100)
{
char s[200];
int z;
get_value(0,20,s);
strupr(s);
z=it->sound;
if (s[0])it->sound=add_sound_to_table(s);else it->sound=0;
delete_unused_sound(z);
}
close_current();
check_unused_sounds();
}
static void item_sound()
{
TITEM *it;
get_value(0,5,&it);
item_sound_call(it);
}
void save_edited_item()
{
TITEM *it;
WINDOW *w;
get_value(0,5,&it);
get_value(0,15,it->jmeno);
get_value(0,20,it->popis);
it->hmotnost=vals(40);
it->nosnost=vals(50);
it->keynum=vals(60);
it->user_value=vals(70);
it->use_event=vals(80);
it->druh=f_get_value(0,90);
it->spell=vals(100);
it->magie=vals(110);
it->cena=vals(120);
it->ikona=f_get_value(0,130);
it->polohy[0][0]=vals(140);
it->polohy[0][1]=vals(150);
it->polohy[1][0]=vals(160);
it->polohy[1][1]=vals(170);
it->umisteni=f_get_value(0,180);
it->vzhled=f_get_value(0,190);
it->flags=get_bit_fields(0,210,2);
it->typ_zbrane=f_get_value(0,200);
it->zmeny[VLS_KOUZLA]=f_get_value(0,700);
it->animace=f_get_value(0,400);
it->hitpos=vals(410);
it->shiftup=0xff;
w=find_window(preview_win);
if (w!=NULL) close_window(w);
terminate_gui();
}
void spell_affections();
static update_hitpos()
{
int i;
i=f_get_value(0,400);
if (i==0) set_value(0,410,"0");
else
if (weapons_pos[i]!=NULL)
{
set_value(0,410,weapons_pos[i]);
}
}
void adjust_enter(EVENT_MSG *msg,OBJREC *o)
{
char update=0;
if (msg->msg==E_KEYBOARD)
{
int s;
char save=0;
s=vals(o_aktual->id);
switch (*(int *)msg->data>>8)
{
case 'Q':s++;save=1;break;
case 'I':s--;save=1;break;
}
if (save)
{
char buff[256];
set_value(0,o_aktual->id,itoa(s,buff,10));
update=1;
}
}
if (msg->msg==E_KEYBOARD && *(char *)(msg->data)==13) update=1;
if (update)
{
if (find_window(preview_win)!=NULL)
{
WINDOW *w;
int c;
w=waktual;c=o->id;
items_adjusting();
select_window(w->id);
goto_control(c);
}
}
}
void item_edit(TITEM *it)
{
CTL3D *c;
WINDOW *w;
int anm=it->animace;
if (anm>=str_count(weapons)) anm=0;
c=def_border(5,WINCOLOR);
def_dialoge(220,80,410,350,"Oprava <20>daj<61> o p<>edm<64>tu");
curfont=vga_font;
default_font=curfont;
define(-1,5,20,50,10,0,label,"Jm<EFBFBD>no (31 znak<61>)");
define(15,10,35,288,12,0,input_line,31);set_default(it->jmeno);
property(def_border(2,WINCOLOR),NULL,flat_color(RGB555(16,0,0)),WINCOLOR);
define(-1,5,50,50,10,0,label,"Popis (31 znak<61>)");
define(20,10,65,380,12,0,input_line,31);set_default(it->popis);
property(def_border(2,WINCOLOR),NULL,flat_color(0xF),WINCOLOR);
define(5,0,0,0,0,0,value_store,4);set_default(&it);
define(30,10,30,80,20,1,button,"Vlastnosti");
property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(otevri_vlastnosti);
define(-1,5,80,100,10,0,label,"Hmotnost");
define(-1,5,95,100,10,0,label,"Nosnost");
define(-1,5,110,100,10,0,label,"ID Kl<4B><6C>e");
define(-1,5,125,100,10,0,label,"?Hodnota");
define(-1,5,140,100,10,0,label,"<EFBFBD>.Ud<55>losti");
define(-1,5,155,100,10,0,label,"Druh");
def_border(5,WINCOLOR);
define(40,105,80,60,12,0,input_line,7,-32767,+32767,"%6d");
property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->hmotnost));
define(50,105,95,60,12,0,input_line,7,-32767,+32767,"%6d");
property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->nosnost));
define(60,105,110,60,12,0,input_line,7,-32767,+32767,"%6d");
property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->keynum));
define(70,105,125,60,12,0,input_line,7,-32767,+32767,"%6d");
property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->user_value));
define(80,105,140,60,12,0,input_line,7,-32767,+32767,"%6d");
property(c,NULL,NULL,WINCOLOR);on_exit(test_int);set_default(strs(it->use_event));
define(90,80,160,220,12,0,str_line,typy_veci);property(c,NULL,NULL,WINCOLOR);
on_enter(string_list_sup);c_default(it->druh);
define(-1,105,80,100,10,1,label,"Kouzlo:");
define(-1,105,95,100,10,1,label,"Mana celk:");
define(-1,105,110,100,10,1,label,"Cena v<>ci");
define(-1,105,125,100,10,1,label,"Poloha1(XY)");
define(-1,105,140,100,10,1,label,"Poloha2(XY)");
define(100,55,80,50,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->spell));
define(110,55,95,50,12,1,input_line,7,-32767,32767,"%6d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->magie));
define(120,5,110,100,12,1,input_line,10,0,999999,"%10d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->cena));
define(140,55,125,50,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[0][0]));on_event(adjust_enter);
define(150,5,125,45,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[0][1]));on_event(adjust_enter);
define(160,55,140,50,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[1][0]));on_event(adjust_enter);
define(170,5,140,45,12,1,input_line,7,-32767,32767,"%5d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->polohy[1][1]));on_event(adjust_enter);
define(175,5,155,60,20,1,button,"Zobraz");on_control_change(items_adjusting);
define(180,80,175,220,12,0,str_line,umisteni_veci);property(c,NULL,NULL,WINCOLOR);
on_enter(string_list_sup);c_default(it->umisteni);
define(200,80,190,220,12,0,str_line,typy_zbrani);property(c,NULL,NULL,WINCOLOR);
on_enter(string_list_sup);c_default(it->typ_zbrane);
define(210,80,205,220,10,0,check_box,"P<EFBFBD>i dopadu se zni<6E><69>");
define(220,80,217,220,10,0,check_box,"Existuje dokud je pou<6F><75>v<EFBFBD>n");
define(130,10,180,45,55,0,ikona);c_default(it->ikona);
property(c,NULL,NULL,0);on_control_change(change_item_ikone);
define(-1,150,25,120,12,2,label,"Obr<EFBFBD>zkov<EFBFBD> script");
define(190,150,10,120,12,2,str_line,vzhled_veci);property(c,NULL,NULL,WINCOLOR);
c_default(it->vzhled); on_enter(string_list_sup);
define(-1,150,60,120,12,2,label,"Animace zbran<61>");
define(400,150,45,120,12,2,str_line,weapons);property(c,NULL,NULL,WINCOLOR);
c_default(anm); on_enter(string_list_sup);on_control_change(update_hitpos);
define(-1,10,45,1,12,3,label,"Hit Pos:");
define(410,90,45,40,12,3,input_line,7,0,255,"%4d");on_exit(test_int);
property(c,NULL,NULL,WINCOLOR);set_default(strs(it->hitpos));
define(300,10,35,80,20,2,button,"Ulo<EFBFBD>");property(def_border(1,0),NULL,NULL,RGB555(0,20,0));on_control_change(save_edited_item);
define(320,10,70,80,20,2,button,"Zvuk");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(item_sound);
define(330,10,10,80,20,2,button,"Zru<EFBFBD>it");property(def_border(1,0),NULL,flat_color(RGB555(31,31,31)),RGB555(20,0,0));on_control_change(terminate_gui);
define(310,10,10,80,20,3,button,"Special");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(otevri_special);
define(340,10,95,80,20,2,button,"Aff");property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(spell_affections);
define(700,0,0,0,0,0,value_store,4);c_default(it->zmeny[VLS_KOUZLA]);
redraw_window();
fill_bit_fields(0,210,it->flags,2);
escape();
w=find_window(preview_win);
if (w!=NULL) close_window(w);
close_current();
}
void clear_it_buffer()
{
memset(item_buffer,0,sizeof(item_buffer));
}
void create_ibuffer_list()
{
int i;
if (ls_buffer!=NULL) release_list(ls_buffer);
ls_buffer=create_list(32);
for (i=0;item_buffer[i];i++)
{
char c[80];TITEM *q;
int p;
p=abs(item_buffer[i])-1;
q=&item_list[p];
if (item_buffer[i]<0) sprintf(c,"%3d ... %s",i,q->jmeno);
else sprintf(c,"%3d %s",i,q->jmeno);
if (str_replace(&ls_buffer,i,c)==NULL) return;
}
if (i==0) str_replace(&ls_buffer,0," -1 <<3C>adn<64> p<>edm<64>ty>");
str_delfreelines(&ls_buffer);
}
void create_isort_list(TSTR_LIST *ls_sorts,int filter)
{
int i;
char cc=0;
if (*ls_sorts!=NULL) release_list(*ls_sorts);
*ls_sorts=create_list(32);
for (i=0;i<max_items;i++)
{
char c[80];TITEM *q;
q=&item_list[i];
if (q->jmeno[0]!='?' && (filter==-1 || q->druh==filter))
{
sprintf(c,"%4d %s",i,q->jmeno);
if (str_replace(ls_sorts,i,c)==NULL) return;
cc=1;
}
}
if (!cc) str_replace(ls_sorts,0," -1 <<3C>adn<64> vzory>");
str_delfreelines(ls_sorts);
}
void save_items()
{
FILE *f;int i;
TSTR_LIST names=NULL;
char passw[50];
for(i=0;i<max_items;i++) item_list[i].shiftup=0xff;
if (max_items)
{
f=fopen(ITEMS_DAT,"wb");
if (f==NULL)
{
msg_box("Chyba",'\x1',"Nemohu ulo<6C>it vzory p<>edm<64>t<EFBFBD>","Panika",NULL);
return;
}
save_section(f,item_list,SV_ITLIST,sizeof(TITEM)*max_items);
for(i=1;i<4;i++)
{
read_side_list(ITEMS_SCRIPT,&names,i,4);
save_scr_list(f,names,i);
}
read_side_list(ITEMS_PICS,&names,1,2);
save_scr_list(f,names,4);
read_side_list(WEAPONS_SCRIPT,&names,1,3);
save_scr_list(f,names,5);
save_scr_list(f,itm_sounds,SV_SNDLIST);
strcpy(passw,set_data_password(NULL));
encrypt(passw);
if (passw[0]!=0) save_section(f,passw,SV_PASSW,strlen(passw)+1);
save_section(f,&max_items,SV_END,sizeof(max_items));
release_list(names);
fclose(f);
}
}
void load_items()
{
FILE *f;void *p;long size,r;int sect;
if (itm_sounds!=NULL) release_list(itm_sounds);
f=fopen(ITEMS_DAT,"rb");
if (f==NULL) return;
do
{
r=load_section(f,&p,&sect,&size);
//if (p!=NULL)size=r;
if (r==size)
if (sect==SV_ITLIST)
{
memcpy(item_list,p,size);
max_items=size/sizeof(TITEM);
itm_sounds=create_list(256);
str_add(&itm_sounds,"<nic>");
}
else if (sect==SV_PASSW)
{
encrypt(p);
set_data_password(p);
}
else if (sect==SV_SNDLIST)
{
int i;
char *c,*s;
c=s=p;i=1;
while(c-s<size)
{
str_replace(&itm_sounds,i,c);
c=strchr(c,0);
c++;i++;
}
}
free(p);
}
while (sect!=SV_END && r==size);
fclose(f);
}
short aloc_free_item()
{
int i;
for(i=0;i<max_items && item_list[i].jmeno[0]!='?';i++);
if (i==max_items)
if (max_items==ITEM_SORTS) return -1;
else max_items++;
return i;
}
void clone_item()
{
int i,j;
if (check_data_password()==0) return;
j=aloc_free_item();
if (j==-1)
{
msg_box("Nelze!",'\0x1',"MAPEDIT je omezen na po<70>et v<>ech mo<6D>n<EFBFBD>ch vzor<6F> ve h<>e","Ok",NULL);
return;
}
i=f_get_value(0,9);
sscanf(ls_sorts[i],"%d",&i);
if (i<0 || i>=max_items)
memset(&item_list[j],0,sizeof(TITEM));
else
memcpy(&item_list[j],&item_list[i],sizeof(TITEM));
item_edit(&item_list[j]);
create_isort_list(&ls_sorts,grep_num);
send_message(E_GUI,9,E_CONTROL,1,ls_sorts);
}
void edit_selected_item()
{
int i;
if (check_data_password()==0) return;
i=f_get_value(0,9);
sscanf(ls_sorts[i],"%d",&i);
if (i<0 || i>=max_items) clone_item();
else
item_edit(&item_list[i]);
create_isort_list(&ls_sorts,grep_num);
send_message(E_GUI,9,E_CONTROL,1,ls_sorts);
}
void delete_item_sort()
{
int i;
if (check_data_password()==0) return;
i=f_get_value(0,9);
sscanf(ls_sorts[i],"%d",&i);
if (i<0 || i>=max_items) return;
if (msg_box("Dotaz?",'\x02',"Opravdu m<><6D> v <20>myslu vymazat tento vzor? Je mo<6D>n<EFBFBD>,"
" <20>e na tento vzor se odvol<6F>v<EFBFBD>j<EFBFBD> p<>edm<64>ty v jin<69> map<61>. MAPEDIT je "
"nem<EFBFBD><EFBFBD>e vymazat, a mohou se dal<61><6C> pr<70>c<EFBFBD> zm<7A>nit v p<>edm<64>t jin<69>!",
"P<EFBFBD>esto vymazat","Zru<EFBFBD>it",NULL)==2) return;
strcpy(item_list[i].jmeno,"??? Vymaz<61>n");
while (max_items && item_list[max_items-1].jmeno[0]=='?') max_items--;
create_isort_list(&ls_sorts,grep_num);
send_message(E_GUI,9,E_CONTROL,1,ls_sorts);
}
void refresh_itm()
{
create_ibuffer_list();
send_message(E_GUI,9,E_CONTROL,1,ls_buffer);
}
void it_kos()
{
int i;
i=f_get_value(0,9);
sscanf(ls_buffer[i],"%d",&i);
if (i<0 || i>=ITEM_BUFFER) return;
if (i==ITEM_BUFFER-1)
{
item_buffer[i]=-1;
return;
}
memcpy(&item_buffer[i],&item_buffer[i+1],(ITEM_BUFFER-i-1)*2);
create_ibuffer_list();
send_message(E_GUI,9,E_CONTROL,1,ls_buffer);
}
void open_item_win()
{
create_ibuffer_list();
if (find_window(item_win)==NULL)
{
CTL3D b1,b2;
FC_TABLE f_sel;
memcpy(&b1,def_border(1,0),sizeof(CTL3D));
memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D));
default_font=vga_font;
memcpy(f_default,flat_color(0x0000),sizeof(charcolors));
memcpy(&f_sel,flat_color(RGB555(0,0,24)),sizeof(charcolors));
item_win=def_window(200,300,"P<EFBFBD>edm<EFBFBD>ty");
waktual->y=2;waktual->x=SCR_WIDTH_X-20-160-3;
waktual->minsizx=120;
waktual->minsizy=100;
on_control_change(close_current);
define(9,5,20,170,240,0,listbox,ls_buffer,RGB555(31,31,0),0);c_default(0);
property(&b2,NULL,&f_sel,WINCOLOR);
o_end->autoresizex=1;
o_end->autoresizey=1;
define(10,3,41,19,198,1,scroll_bar_v,0,10,1,SCROLLBARCOL);
property(&b2,NULL,NULL,WINCOLOR);on_control_change(scroll_support);
o_end->autoresizey=1;
define(11,3,20,19,19,1,scroll_button,-1,0,"\x1e");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(12,3,40,19,19,2,scroll_button,1,10,"\x1f");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(20,3,1,10,10,2,resizer);
define(30,5,10,50,20,3,button,"P<EFBFBD>ekr.");
property(&b1,NULL,NULL,WINCOLOR);on_control_change(refresh_itm);
define(30,60,10,50,20,3,button,"Vyma<EFBFBD>");
property(&b1,NULL,NULL,WINCOLOR);on_control_change(it_kos);
movesize_win(waktual,waktual->x,waktual->y,waktual->xs,150);
redraw_window();
}
else
select_window(item_win);
}
void umisti_item()
{
int i,j;
if (selected_place==-1)
{
msg_box("Nic nen<65> vybr<62>no",'\x01',"Nejd<EFBFBD><EFBFBD>ve klikni my<6D><79> na map<61>, na m<>sto kam chce<63> p<>edm<64>t um<75>stit","Ok",NULL);
return;
}
i=f_get_value(0,9);
sscanf(ls_sorts[i],"%d",&i);
for(j=0;j<ITEM_BUFFER && item_buffer[j];j++);
if (j==ITEM_BUFFER)
{
msg_box("Omezeni.",' ',"MAPEDIT omezil po<70>et p<>edm<64>t<EFBFBD> na jednom poli<6C>ku. Dal<61><6C> ji<6A> nelze vlo<6C>it","Ok",NULL);
return;
}
item_buffer[j]=i+1;
open_item_win();
send_message(E_GUI,9,E_CONTROL,1,ls_buffer);
}
void select_item(int itpos);
void vloz_do_item()
{
int wht,ins,i;
wht=f_get_value(vzor_win,9);
sscanf(ls_sorts[wht],"%d",&wht);
ins=f_get_value(item_win,9);
sscanf(ls_buffer[ins],"%d",&ins);
for(i=ITEM_BUFFER-1;i>ins;item_buffer[i]=item_buffer[i-1],i--);
item_buffer[ins+1]=-wht-1;
open_item_win();
send_message(E_GUI,9,E_CONTROL,1,ls_buffer);
}
void inv_testmap()
{
if (selected_place<0)
msg_box("Nic nen<65> vybr<62>no",'\x01',"Nejd<EFBFBD><EFBFBD>ve klikni my<6D><79> na map<61>, na m<>sto kde chce<63> za<7A><61>t","Ok",NULL);
else
call_testmap(selected_place/4);
}
static void change_grep()
{
char grep_en;
int grep_type;
grep_en=f_get_value(0,100);
grep_type=f_get_value(0,90);
if (grep_en) grep_num=grep_type;else grep_num=-1;
send_message(E_GUI,9,E_CONTROL,0,&ls_sorts);
create_isort_list(&ls_sorts,grep_num);
send_message(E_GUI,9,E_CONTROL,1,ls_sorts);
c_set_value(0,9,0);
send_message(E_GUI,9,E_CONTROL,2);
}
void editor_vzoru()
{
if (find_window(vzor_win)==NULL)
{
CTL3D b1,b2;
FC_TABLE f_sel;
create_isort_list(&ls_sorts,grep_num);
memcpy(&b1,def_border(1,0),sizeof(CTL3D));
memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D));
default_font=vga_font;
memcpy(f_default,flat_color(0x0000),sizeof(charcolors));
memcpy(&f_sel,flat_color(RGB555(0,0,20)),sizeof(charcolors));
vzor_win=def_window(200,370,"Vzory");
waktual->minsizx=130;
waktual->minsizy=170;
on_control_change(close_current);
define(9,5,20,170,240,0,listbox,ls_sorts,RGB555(31,31,0),0);c_default(0);
property(&b2,NULL,&f_sel,WINCOLOR);
o_end->autoresizex=1;
o_end->autoresizey=1;
define(10,3,41,19,198,1,scroll_bar_v,0,10,1,SCROLLBARCOL);
property(&b2,NULL,NULL,WINCOLOR);on_control_change(scroll_support);
o_end->autoresizey=1;
define(11,3,20,19,19,1,scroll_button,-1,0,"\x1e");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(12,3,110,19,19,2,scroll_button,1,10,"\x1f");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(20,3,1,10,10,2,resizer);
define(30,5,35,50,20,3,button,"Vyma<EFBFBD>");on_control_change(delete_item_sort);
property(&b1,NULL,NULL,WINCOLOR);
define(40,5,60,50,20,3,button,"Klonuj");on_control_change(clone_item);
property(&b1,NULL,NULL,WINCOLOR);
define(50,5,85,50,20,3,button,"Oprav");on_control_change(edit_selected_item);
property(&b1,NULL,NULL,WINCOLOR);
define(60,10,35,60,20,2,button,"Um<EFBFBD>stit");on_control_change(umisti_item);
property(&b1,NULL,NULL,WINCOLOR);
define(70,10,60,60,20,2,button,"Vlo<EFBFBD> do");on_control_change(vloz_do_item);
property(&b1,NULL,NULL,WINCOLOR);
define(80,10,85,60,20,2,button,"Test");on_control_change(inv_testmap);
property(&b1,NULL,NULL,WINCOLOR);
define(90,5,10,170,12,3,str_line,typy_veci);c_default(grep_num>-1?grep_num:0);
property(&b2,NULL,&f_sel,WINCOLOR);on_enter(string_list_sup);on_control_change(change_grep);
o_end->autoresizex=1;
define(100,10,10,10,10,2,check_box,"");c_default(grep_num>-1);on_control_change(change_grep);
movesize_win(waktual,waktual->x,160,waktual->xs,SCR_WIDTH_Y-20-160);
redraw_window();
}
else
select_window(vzor_win);
}
void select_item(int itpos)
{
if (selected_place!=-1)
{
int ps;
for(ps=0;item_buffer[ps];ps++);
if (item_place[selected_place]!=NULL) free(item_place[selected_place]);
if (ps)
{
item_place[selected_place]=getmem((ps+1)*sizeof(**item_place));
memcpy(item_place[selected_place],item_buffer,_msize(item_place[selected_place]));
item_place[selected_place][ps]=0;
}
else item_place[selected_place]=NULL;
}
clear_it_buffer();
if (itpos!=-1 && item_place[itpos]!=NULL)
memcpy(item_buffer,item_place[itpos],_msize(item_place[itpos]));
selected_place=itpos;
if (itpos!=-1)
{
open_item_win();
send_message(E_GUI,9,E_CONTROL,1,ls_buffer);
}
}
char save_item_map(FILE *f,int id)
{
int totalmem=0,i,j;
short *c,*d;
long r;
select_item(-1);
for(i=0;i<maplen*4;i++)
{
if (item_place[i]!=NULL)
{
totalmem+=sizeof(int)+sizeof(short);
for(j=0;j<ITEM_BUFFER && item_place[i][j];j++,totalmem+=sizeof(short));
}
}
if (!totalmem) return 1;
c=(short *)getmem(totalmem);d=c;
for(i=0;i<maplen*4;i++)
if (item_place[i]!=NULL)
{
*d++=i & 0xffff;
*d++=i >> 16;
for(j=0;j<ITEM_BUFFER && item_place[i][j];j++) *d++=item_place[i][j];
*d++=0;
}
r=save_section(f,c,id,totalmem);
free(c);
return r==totalmem;
}
void load_item_map(void *data,int size)
{
short *d,*e;
int mode=0;
int sect;
d=data;
while (size)
{
size-=2;
switch (mode)
{
case 0:sect=*d++;mode++;break;
case 1:sect+=(*d++)<<16;
mode++;
selected_place=sect;
clear_it_buffer();
e=item_buffer;
break;
case 2:*e++=*d;
if (!(*d++))
{
select_item(-1);
mode=0;
}
break;
}
}
}
void editor_veci()
{
tool_sel=50;
create_map_win(5,5,SCR_WIDTH_X-220,SCR_WIDTH_Y-60);
change_tools();
open_item_win();
editor_vzoru();
}
void add_record(void **ptr,int *count,int sizef)
{
void *p;
int siz;
siz=*count*sizef;
count[0]++;
p=getmem(siz+sizef);
if (siz) memcpy(p,*ptr,siz);
if (*ptr!=NULL) free(*ptr);
*ptr=p;
}
void insert_record(void **ptr,int *count,int sizef,int pos)
{
int siz;
char *c,*d;
siz=*count*sizef;
add_record(ptr,count,sizef);
pos*=sizef;
c=*ptr;c+=pos;d=c+sizef;
if (siz!=pos)memmove(d,c,siz-pos);
}
void delete_record(void **ptr,int *count,int sizef,int record)
{
char *c1,*c2,*c3;
int siz;
void *p;
if (!count[0] || record>=count[0]) return;
c3=c1=*ptr;
c1+=record*sizef;
c2=c1+sizef;
siz=*count*sizef;
c3+=siz;
if (c3!=c2)memmove(c1,c2,(c3-c2));
p=realloc(*ptr,siz-sizef);
if (siz-sizef<=0) {*ptr=NULL;p=NULL;}
if (p!=NULL) *ptr=p;
count[0]--;
}
void re_build_shop_list(TSTR_LIST *ls,TSHOP *p, int count)
{
if (*ls!=NULL) release_list(*ls);
*ls=create_list(count+1);
while(count--)
{
char s[100];
sprintf(s,"%s (%d)",p->keeper,p->products);
str_add(ls,s);
p++;
}
str_add(ls,"<nov<6F> obchod>");
}
static void refresh_shop_list()
{
TSTR_LIST ls;
send_message(E_GUI,9,E_CONTROL,0,&ls);
re_build_shop_list(&ls,shop_list,max_shops);
send_message(E_GUI,9,E_CONTROL,1,ls);
}
void re_build_item_list(TSTR_LIST *ls,TPRODUCT *p,int count)
{
if (*ls!=NULL) release_list(*ls);
*ls=create_list(16);
if (!count || p==NULL)
{
str_add(ls,"<<3C><>dn<64> p<>edm<64>t>");
return;
}
while (count--)
{
char s[200];
short d;
d=p->item;
if (p->trade_flags & SHP_TYPE)
sprintf(s,"typ: <%s>",typy_veci[d]);
else if (d>=max_items) strcpy(s,"<p<>edm<64>t vymaz<61>n!>");
else
sprintf(s,"%c%c%c%c %s (%d)",(p->trade_flags & SHP_SELL?'P':219),
(p->trade_flags & SHP_BUY?'N':219),
(p->trade_flags & SHP_AUTOADD?'Z':219),
(p->trade_flags & SHP_SPECIAL?'S':219),
item_list[d].jmeno,p->pocet
);
p++;
str_add(ls,s);
}
}
TSHOP *create_shop()
{
TSHOP *p;
add_record(&shop_list,&max_shops,sizeof(TSHOP));
p=shop_list+max_shops-1;
memset(p,0,sizeof(*p));
p->koef=10;
p->shop_id=shop_max_id++;
return p;
}
static char *shopstate=NULL;
static void close_edit_shop()
{
TSHOP *p;
TSTR_LIST ls;
char s[20];
int i;
p=shop_list+f_get_value(0,500);
get_value(0,200,s);
get_value(0,210,p->picture);
i=f_get_value(0,500);
p->koef=vals(220);
p->spec_max=vals(230);
if (s[0]==0)
{
msg_box("Editor obchod<6F>",'\x1',"Obchod mus<75> m<>t sv<73>ho prodava<76>e (shopkeeppera). Obchod bude ozna<6E>en jako smazan<61>.","Ok",NULL);
strcpy(s,"*vymaz<61>n*");
}
if (s[0]=='<')
{
msg_box("Editor obchod<6F>",'\x1',"Obchodn<EFBFBD>k m<> neplatn<74> jm<6A>no","Ok",NULL);
return;
}
strcpy(p->keeper,s);
if (!p->products && s[0]!='*')
msg_box("Editor obchod<6F>",'\x1',"S ni<6E><69>m se neobchoduje. Nejsou definov<6F>ny <20><>dn<64> produkty. Tato situace m<><6D>e v<>st ke krachu hry!","Beru na v<>dom<6F>",NULL);
send_message(E_GUI,9,E_CONTROL,0,&ls);
release_list(ls);
close_current();
select_window(shop_window);
refresh_shop_list();
shopstate[i]=0;
}
static void add_item()
{
TSHOP *p;
TSTR_LIST ls;
TPRODUCT *pr;
int i;
p=shop_list+f_get_value(0,500);
i=f_get_value(0,9);
send_message(E_GUI,9,E_CONTROL,0,&ls);
insert_record(&p->list,&p->products,sizeof(*pr),i);
pr=p->list+i;
pr->trade_flags=get_bit_fields(0,130,4);
pr->cena=vals(110);
pr->max_pocet=pr->pocet=vals(120);
pr->item=f_get_value(0,100);
sscanf(shop_items[pr->item],"%hd",&pr->item);
re_build_item_list(&ls,p->list,p->products);
send_message(E_GUI,9,E_CONTROL,1,ls);
redraw_window();
}
static void rewrite_item()
{
TSHOP *p;
TSTR_LIST ls;
TPRODUCT *pr;
int i;
p=shop_list+f_get_value(0,500);
i=f_get_value(0,9);
send_message(E_GUI,9,E_CONTROL,0,&ls);
if (i>=p->products) return;
pr=p->list+i;
if (i>=pr->max_pocet) return;
pr->trade_flags=get_bit_fields(0,130,4);
pr->cena=vals(110);
pr->max_pocet=pr->pocet=vals(120);
pr->item=f_get_value(0,100);
sscanf(shop_items[pr->item],"%hd",&pr->item);
re_build_item_list(&ls,p->list,p->products);
send_message(E_GUI,9,E_CONTROL,1,ls);
redraw_window();
}
static void show_selected()
{
TSHOP *p;
TPRODUCT *pr;
int i;
char c[30];
p=shop_list+f_get_value(0,500);
i=f_get_value(0,9);
if (i>=p->products) return;
pr=p->list+i;
if (pr->trade_flags & SHP_TYPE) return;
sprintf(c,"%7d",pr->cena);
set_value(0,110,c);
sprintf(c,"%7d",pr->max_pocet);
set_value(0,120,c);
c_set_value(0,100,pr->item);
fill_bit_fields(0,130,pr->trade_flags,4);
}
static void add_type()
{
TSHOP *p;
TSTR_LIST ls;
TPRODUCT *pr;
p=shop_list+f_get_value(0,500);
send_message(E_GUI,9,E_CONTROL,0,&ls);
add_record(&p->list,&p->products,sizeof(*pr));
pr=p->list+p->products-1;
pr->trade_flags=SHP_BUY|SHP_TYPE;
pr->cena=-1;
pr->max_pocet=pr->pocet=-1;
pr->item=item_list[f_get_value(0,100)].druh;
re_build_item_list(&ls,p->list,p->products);
send_message(E_GUI,9,E_CONTROL,1,ls);
redraw_window();
}
static void remove_item()
{
TSTR_LIST ls;
int i;
TSHOP *p;
p=shop_list+f_get_value(0,500);
i=f_get_value(0,9);
send_message(E_GUI,9,E_CONTROL,0,&ls);
delete_record(&p->list,&p->products,sizeof(TPRODUCT),i);
re_build_item_list(&ls,p->list,p->products);
send_message(E_GUI,9,E_CONTROL,1,ls);
redraw_window();
}
static void zjisti_cenu()
{
int i=f_get_value(0,100);
int j=9999999;
sscanf(shop_items[i],"%d",&j);
if (j<max_items)
{
char s[20];
sprintf(s,"%7d",item_list[j].cena);
set_value(0,110,s);
}
set_enable(0,20,j<max_items);
set_enable(0,30,j<max_items);
}
static void browse_dialogs()
{
char c[15]="";
char *d,*e;
d=get_text_field(config_file,"CESTA_DIALOGY");if (d==NULL) d="";
concat(e,d,"*.hi");
browser(e,c);
if (c[0]) set_value(0,210,c);
}
#undef ctl1
void edit_shop(int i)
{
TSTR_LIST ls=NULL;
TSHOP *shp=shop_list+i;
CTL3D ctl1,ctl2;
re_build_item_list(&ls,shp->list,shp->products);
memcpy(&ctl1,def_border(1,0),sizeof(ctl1));
memcpy(&ctl2,def_border(2,WINCOLOR),sizeof(ctl2));
def_window(400,300,"Editor obchod<6F>");
on_control_change(close_edit_shop);
define(500,0,0,0,0,0,value_store,4);c_default(i);
define(9,10,20,200,166,0,listbox,ls,RGB555(31,31,31),0);
property(&ctl1,NULL,NULL,WINCOLOR);c_default(0);on_control_change(show_selected);
define(10,217,40,19,127,0,scroll_bar_v,0,10,1,SCROLLBARCOL);
property(&ctl1,NULL,NULL,WINCOLOR);
define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(12,216,170,21,17,0,scroll_button,1,10,"\x1f");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(20,75,30,60,20,1,button,"Vo<EFBFBD>it");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(add_item);
define(60,75,55,60,20,1,button,"P<EFBFBD>epsat");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(rewrite_item);
define(30,10,30,60,20,1,button,"Typ");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(add_type);
define(40,10,55,60,20,1,button,"Odebrat");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(remove_item);
define(50,10,10,80,20,2,button,"Zav<EFBFBD><EFBFBD>t");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(close_edit_shop);
define(100,10,80,150,12,1,str_line,shop_items);property(&ctl2,NULL,NULL,WINCOLOR);
c_default(0); on_enter(string_list_sup);on_control_change(zjisti_cenu);
define(-1,155,100,1,1,1,label,"Cena:");
define(110,10,100,90,12,1,input_line,10,0,9999999,"%7d");property(&ctl2,NULL,NULL,WINCOLOR);
set_default(strs(item_list[0].cena));on_exit(test_int);
define(-1,155,120,1,1,1,label,"Po<EFBFBD>et:");
define(120,10,120,90,12,1,input_line,10,-1,9999999,"%7d");property(&ctl2,NULL,NULL,WINCOLOR);
set_default(strs(1));on_exit(test_int);
define(130,10,135,150,10,1,check_box,"Prod<EFBFBD>vat");c_default(1);
define(140,10,147,150,10,1,check_box,"Nakupovat");c_default(0);
define(150,10,159,150,10,1,check_box,"Zbo<EFBFBD><EFBFBD> p<>ib<69>v<EFBFBD>");c_default(0);
define(160,10,171,150,10,1,check_box,"Nen<EFBFBD> v<>dy na sklad<61>");c_default(0);
define(-1,10,200,1,1,0,label,"Shopkeeper:");
define(200,100,200,200,12,0,input_line,15);set_default(shp->keeper);property(&ctl2,NULL,NULL,WINCOLOR);
define(-1,10,220,1,1,0,label,"Obr<EFBFBD>zek:");
define(210,100,220,100,12,0,input_line,12);set_default(shp->picture);property(&ctl2,NULL,NULL,WINCOLOR);
define(215,220,218,80,14,0,button,"Nalistuj");property(&ctl1,NULL,NULL,WINCOLOR);on_control_change(browse_dialogs);
define(-1,10,240,1,1,0,label,"Rozptyl cen +/- [%]");
define(220,150,240,60,12,0,input_line,6,0,100,"%5d");set_default(strs(shp->koef));on_exit(test_int);property(&ctl2,NULL,NULL,WINCOLOR);
define(-1,220,240,1,1,0,label,"Po<EFBFBD>et spec:");
define(230,320,240,60,12,0,input_line,6,0,100,"%5d");set_default(strs(shp->spec_max));on_exit(test_int);property(&ctl2,NULL,NULL,WINCOLOR);
{
char s[50];
sprintf(s,"Shop ID: %d",shp->shop_id);
define(-1,10,260,1,1,0,label,s);
}
redraw_window();
}
static void close_shop_list()
{
TSTR_LIST ls;
int i;
send_message(E_GUI,9,E_CONTROL,0,&ls);
for(i=0;i<max_shops;i++) if (shopstate[i]==1)
{
msg_box("Toto okno nelze uzav<61><76>t!",'\x1',"Program <20>ek<65> na dokon<6F>en<65> prace v n<>kter<65>m z pod<6F><64>zen<65>ch oken","Ok",NULL);
return;
}
for(i=0;i<max_shops;)
if (shop_list[i].keeper[0]=='*')
{
if (shop_list[i].list!=NULL) free(shop_list[i].list);
delete_record(&shop_list,&max_shops,sizeof(TSHOP),i);
}
else i++;
release_list(ls);
release_list(shop_items);
free(shopstate);
close_current();
}
void open_shop_editor()
{
int i;
TSTR_LIST ls;
TSHOP *p;
if (check_data_password()==0) return;
i=f_get_value(0,9);
send_message(E_GUI,9,E_CONTROL,0,&ls);
if (i==max_shops)
{
p=create_shop();
shopstate=(char *)grealloc(shopstate,max_shops);
re_build_shop_list(&ls,shop_list,max_shops);
shopstate[i]=1;
send_message(E_GUI,9,E_CONTROL,1,ls);
edit_shop(i);
}
else
{
if (i>=max_shops) return;
if (ls[i]==NULL) return;
if (shopstate[i]==1)
{
msg_box("Seznam obchod<6F>",'\x1',"Tento obchod je ji<6A> opravov<6F>n v jin<69>m okn<6B>. Nelze jej znovu otev<65><76>t","Ok",NULL);
return;
}
shopstate[i]=1;
send_message(E_GUI,9,E_CONTROL,1,ls);
edit_shop(i);
}
}
static void erase_shop()
{
int i;
TSTR_LIST ls;
TSHOP *p;
if (check_data_password()==0) return;
i=f_get_value(0,9);
send_message(E_GUI,9,E_CONTROL,0,&ls);
if (i>=max_shops) return;
if (ls[i]==NULL) return;
if (ls[i][0]=='<')
{
msg_box("Seznam obchod<6F>",'\x1',"Tento obchod je opravov<6F>n v jin<69>m okn<6B>. Nelze jej vymazat","Ok",NULL);
return;
}
if (msg_box("Vymazat obchod?",'\x2',"Opravdu chce<63> vymazat obchod?","Ano","Ne",NULL)==2) return;
p=shop_list+i;
strcpy(p->keeper,"*vymaz<61>n*");
re_build_shop_list(&ls,shop_list,max_shops);
send_message(E_GUI,9,E_CONTROL,1,ls);
}
void open_shop_list()
{
TSTR_LIST ls=NULL;
CTL3D ctl1;
if (find_window(shop_window)==NULL)
{
create_isort_list(&ls_sorts,grep_num);
shopstate=NewArr(char,max_shops);memset(shopstate,0,max_shops);
shop_items=ls_sorts;
ls_sorts=NULL;
re_build_shop_list(&ls,shop_list,max_shops);
memcpy(&ctl1,def_border(1,0),sizeof(ctl1));
shop_window=def_window(250,220,"Seznam obchod<6F>");
on_control_change(close_shop_list);
define(9,10,20,200,166,0,listbox,ls,RGB555(31,31,31),0);
property(&ctl1,NULL,NULL,WINCOLOR);c_default(0);//on_change(edit_shop_item);
define(10,217,40,19,127,0,scroll_bar_v,0,10,1,SCROLLBARCOL);
property(&ctl1,NULL,NULL,WINCOLOR);
define(11,216,20,21,17,0,scroll_button,-1,0,"\x1e");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(12,216,170,21,17,0,scroll_button,1,10,"\x1f");
property(NULL,icones,NULL,WINCOLOR);on_control_change(scroll_support);
define(200,5,5,70,20,3,button,"Oprava");on_control_change(open_shop_editor);property(&ctl1,NULL,NULL,WINCOLOR);
define(210,80,5,70,20,3,button,"Vymazat");on_control_change(erase_shop);property(&ctl1,NULL,NULL,WINCOLOR);
movesize_win(waktual,10,10,250,220);
}
else select_window(shop_window);
redraw_window();
}
void shop_train_edit()
{
open_shop_list();
}
void save_shop(TSHOP *p,FILE *f)
{
char *itm;
int i,j,typs=0,lss;
TPRODUCT *pstr,*pr,*nls,*npr;
TSHOP *shp;
shp=p;p=New(TSHOP);
memcpy(p,shp,sizeof(*p));
itm=getmem(max_items);
memset(itm,0,max_items);
pstr=p->list;pr=pstr;
for(i=0;i<p->products;i++,pr++)
{
if (pr->trade_flags & SHP_TYPE)
{
typs++;
for(j=0;j<max_items;j++) if (item_list[j].druh==pr->item) itm[j]|=1;
}
else
if (itm[pr->item])
{
char s[300];
sprintf(s,"Duplicitn<EFBFBD> p<>edm<64>t v definici v obchodu '%s'. Soubor obchodu bude ulo<6C>en, ale vlastn<74> hra m<><6D>e na tomto p<>edm<64>tu zkrachovat!",p->keeper);
msg_box("Shop edit",'\x1',s,"Ok",NULL);
typs++;
}
else
itm[pr->item]|=2;
}
lss=0;
for(i=0;i<max_items;i++) if (itm[i]) lss++;
nls=NewArr(TPRODUCT,typs+lss);
pr=pstr;npr=nls;
for(i=0;i<p->products;i++,pr++)
if (!(pr->trade_flags & SHP_TYPE)) memcpy(npr++,pr,sizeof(TPRODUCT));
for(i=0;i<max_items;i++)
if (itm[i]==1)
{
npr->item=i;
npr->cena=item_list[i].cena;
npr->trade_flags=SHP_BUY | SHP_NOEDIT | SHP_SELL;
npr->pocet=npr->max_pocet=0;
npr++;
}
pr=pstr;
for(i=0;i<p->products;i++,pr++)
if (pr->trade_flags & SHP_TYPE) memcpy(npr++,pr,sizeof(TPRODUCT));
p->products=typs+lss;
p->list_size=lss;
fwrite(p,1,sizeof(TSHOP),f);
fwrite(nls,p->products,sizeof(TPRODUCT),f);
free(nls);
free(itm);
free(p);
}
void save_all_shops()
{
FILE *f;
int i;
int pocet=max_shops;
f=fopen(SHOP_NAME,"wb");
fwrite(&pocet,1,4,f);
for(i=0;i<pocet;i++) save_shop(shop_list+i,f);
fclose(f);
}
void load_shop(TSHOP *p,FILE *f)
{
int lss,i,el;
TPRODUCT *nls,*ols,*pr,*tr;
fread(p,1,sizeof(TSHOP),f);
if (p->shop_id>=shop_max_id) shop_max_id=p->shop_id+1;
lss=p->products;
ols=NewArr(TPRODUCT,lss);
fread(ols,lss,sizeof(TPRODUCT),f);
el=0;
for(i=0;i<lss;i++) if (!(ols[i].trade_flags & SHP_NOEDIT)) el++;
nls=NewArr(TPRODUCT,el);
pr=nls,tr=ols;
for(i=0;i<lss;i++,tr++) if (!(tr->trade_flags & SHP_NOEDIT)) memcpy(pr++,tr,sizeof(TPRODUCT));
free(ols);
p->list=nls;
p->products=el;
}
void load_all_shops()
{
FILE *f;
int i;
int pocet=0;
f=fopen(SHOP_NAME,"rb");
if (f==NULL) return;
fread(&pocet,1,4,f);
if (!pocet)
{
fclose(f);
return;
}
shop_list=NewArr(TSHOP,pocet);
for(i=0;i<pocet;i++) load_shop(shop_list+i,f);
max_shops=pocet;
fclose(f);
}