#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mapy.h" #include "edit_map.h" #include "globals.h" #include "steny.h" #include "mob_edit.h" #include "save_map.h" #include #define A_SIDEMAP 0x8001 #define A_SECTMAP 0x8002 #define A_STRTAB1 0x8003 //stena main #define A_STRTAB2 0x8004 //stena leva #define A_STRTAB3 0x8005 //stena prava #define A_STRTAB4 0x8006 //strop #define A_STRTAB5 0x8007 //podlaha #define A_STRTAB6 0x8008 //oblouk levy #define A_MAPINFO 0x8009 #define A_MAPGLOB 0x800A #define A_STRTAB7 0x800B //oblouk pravy #define A_MAPITEM 0x800C //itemy #define A_MAPMACR 0x800D //Makra multiakce #define A_MAPFLY 0x800E //Letajici predmety #define A_MAPMOBS 0x800F //Potvory v bludi¨ti #define A_MAPVYK 0x8010 //Vyklenky #define A_MOBS 0x8011 //Potvory definice #define A_MOBSND 0x8012 //Potvory zvuky #define A_PASSW 0x8013 //Heslo 1 #define A_PASSW2 0x8014 //Heslo 2 #define A_MAPEND 0x8000 #define BACKUP_ADR "backup" char filename[MAX_PATH]; static char backup=0; static char password[50]; static char passpass; void encrypt(char *password) { char *p=password; p=password; while(*p) *p=~*p,p++; } void encrypt2(char *in,char *out,int size) { int c=clock(),i; char z; for(i=0;inext; *size=i*sizeof(TSMP_STAMP); z=(TSMP_STAMP *)getmem(*size); i=0; q=smplist; while(q!=NULL) memcpy(&z[i++],q->data,sizeof(TSMP_STAMP)),q=q->next; return z; } void build_sample_tree(TSMP_STAMP *z,long size) { int i; smplist=NULL; for (i=0;isizeof(mglob)) size=sizeof(mglob); memcpy(&mglob,temp,size); /* if (size>sizeof(mglob)-sizeof(mglob.mappassw)) { decrypt2(mglob.mappassw,password); passpass=2; if (password[0]) newcode=1; }*/ break; case A_MAPINFO: memcpy(&minfo,temp,size); maplen=size / sizeof(TMAP_EDIT_INFO); sect=0; for (i=0;i20) Shift_map_sectors_down(); break; case A_MAPMACR: load_macros(temp); break; case A_MAPEND: nmapend=0; break; case A_MAPITEM: load_item_map(temp,size); break; case A_MAPMOBS: load_mob_map(temp,size); break; case A_MOBS: load_mobs_to_map(temp,size); mglob.local_monsters=1; break; case A_MOBSND: load_sound_dat(temp,size); break; case A_MAPVYK: memcpy(vyklenky,temp,size); break; case A_PASSW: /* if (passpass<2) { memcpy(password,temp,size); encrypt(password); passpass=2; }*/ break; } else { if (temp!=NULL)free(temp); fclose(f); return -1; } free(temp); } while (nmapend); fclose(f); for(r=1;r0 && names[cn-1]==NULL) cn--; while (jmsg==E_INIT) return ; if (msg->msg==E_DONE) return ; if (msg->msg==E_MOUSE) { MS_EVENT *ms; ms=get_mouse(msg); if (ms->tl1) { send_message(E_STATUS_LINE,E_DONE,E_IDLE,backup_info); send_message(E_DONE,E_MOUSE,backup_info); return; } return; } c=(char *)msg->data; strcpy(c,"Star˜ soubor byl ulo‘en v adres ©i backup\\..."); c=strchr(c,'\0'); msg->data=(void *)c; msg->msg=-1; return; } void create_backup(char *old_filename) { char *c; FILE *fl; void *d; long siz; mkdir(BACKUP_ADR); c=alloca(strlen(BACKUP_ADR)+1+strlen(old_filename)+1); sprintf(c,"%s\\%s",BACKUP_ADR,old_filename); fl=fopen(old_filename,"rb");if (fl==NULL) return; fseek(fl,0,SEEK_END);siz=ftell(fl); fseek(fl,0,SEEK_SET); d=getmem(siz); fread(d,1,siz,fl); fclose(fl); fl=fopen(c,"wb"); if (fl!=NULL) { fwrite(d,1,siz,fl); fclose(fl); send_message(E_STATUS_LINE,E_ADD,E_IDLE,backup_info); send_message(E_ADD,E_MOUSE,backup_info); } free(d); } int save_map(char *filename) { long bytesize; FILE *f; char nerr=1;char *pr; int i,j; TSTR_LIST names=NULL; void *temp; char enpass[58]; f=fopen(filename,"wb"); if (f==NULL) return -1; for (i=1;iflags & 0x40000) if ((minfo[i].x+minfo[i].y+j)& 1) w->prim+=(w->prim_anim & 0xf)+1; } bytesize=sizeof(mglob); encrypt2(password,mglob.mappassw,sizeof(mglob.mappassw)); if (nerr) nerr&=(bytesize==save_section(f,&mglob,A_MAPGLOB,bytesize)); bytesize=maplen*sizeof(TSTENA)*4; if (nerr) nerr&=(bytesize==save_section(f,&mapa.sidedef,A_SIDEMAP,bytesize)); bytesize=maplen*sizeof(TSECTOR); if (nerr) nerr&=(bytesize==save_section(f,&mapa.sectordef,A_SECTMAP,bytesize)); if (password[0]) Shift_map_sectors_up(); bytesize=maplen*sizeof(TMAP_EDIT_INFO); if (nerr) nerr&=(bytesize==save_section(f,&minfo,A_MAPINFO,bytesize)); if (password[0]) Shift_map_sectors_down(); pr=pripona(filename,SCR); for (i=1;i<8;i++) { switch (i) { case 1: case 2: case 3:read_side_script_one(pr,NSID,&names,i,4);break; case 4:read_side_script_one(pr,NCEI,&names,1,2);break; case 5:read_side_script_one(pr,NFLR,&names,1,2);break; case 6:read_side_script_one(pr,NOBL,&names,1,3);break; case 7:read_side_script_one(pr,NOBL,&names,2,3);break; } if (nerr) nerr&=save_scr_list(f,names,i==7?A_STRTAB7:A_STRTAB1+i-1); } strcpy(enpass,"Heslo \x8 je heslo"); bytesize=strlen(enpass)+1; if (nerr && bytesize>1) { encrypt(enpass); memcpy(enpass+bytesize,"\0\x13\x80",12);bytesize+=24; nerr&=(bytesize==save_section(f,enpass,A_PASSW,bytesize)); } temp=save_macros(&bytesize); if (temp!=NULL) { if (nerr) nerr&=(bytesize==save_section(f,temp,A_MAPMACR,bytesize)); free(temp); } if (nerr) nerr&=save_item_map(f,A_MAPITEM); if (mglob.local_monsters) { temp=save_mobs_to_map(&bytesize); if (nerr && temp!=NULL) nerr&=(bytesize==save_section(f,temp,A_MOBS,bytesize)); free(temp); nerr&=save_sound_dat(f,A_MOBSND); } temp=save_mob_map(&bytesize); if (temp!=NULL) { if (nerr) nerr&=(bytesize==save_section(f,temp,A_MAPMOBS,bytesize)); free(temp); } for(i=255;i>1;i--) if (vyklenky[i].sector!=0) break; bytesize=sizeof(TVYKLENEK)*(i+1); if (nerr) nerr&=(bytesize==save_section(f,vyklenky,A_MAPVYK,bytesize)); strcpy(enpass,"To bys \x8 chtel vedet co? \x8 "); bytesize=strlen(enpass)+1; if (nerr && bytesize>1) { encrypt(enpass); memcpy(enpass+bytesize,"\0\x13\x80",12);bytesize+=12; nerr&=(bytesize==save_section(f,enpass,A_PASSW,bytesize)); } bytesize=sizeof(bytesize); if (nerr) nerr&=(bytesize==save_section(f,&bytesize,A_MAPEND,bytesize)); strcpy(enpass,"Ty si \x8 ale nedas pokoj! \x8"); bytesize=strlen(enpass)+1; if (nerr && bytesize>1) { encrypt(enpass); memcpy(enpass+bytesize,"\0\x13\x80",12);bytesize+=12; nerr&=(bytesize==save_section(f,enpass,A_PASSW,bytesize)); } bytesize=sizeof(bytesize); if (nerr) nerr&=(bytesize==save_section(f,&bytesize,A_MAPEND,bytesize)); fclose(f); if (names!=NULL) release_list(names); { int x,y; for(x=1;xprim_anim&=0xf; w->sec_anim&=0xf; if (!s->step_next[j]) { w->flags|=0x1e; w->flags&=~0x080; } if (!w->sector_tag) { w->action=0; w->side_tag&=~3; } if (w->flags & 0x100) { w->prim_anim|=(rand()*(w->prim_anim)/32768)<<4; } if (w->prim>=maxp) w->prim=1; /* if (!(w->flags & 0x80) && w->prim==0) { *objnumber=i; *objsub=j; return -1; // Wall definition missing } */ if (s->step_next[j] && !(mapa.sectordef[s->step_next[j]].sector_type)) { *objnumber=i; *objsub=j; return -2; // Wall leades to unexisting sector } /* if (s->sector_type==3) if (w->flags & 1) if (mapa.sidedef[i][(j+1)&3].flags & 1 || mapa.sidedef[i][(j-1)&3].flags & 1 || (!(mapa.sidedef[i][(j^2)].flags & 1))) { *objnumber=i; *objsub=-1; return -3; // Stairs wire error. } */ if (chka[w->action] && !(mapa.sectordef[w->sector_tag].sector_type)) { *objnumber=i; *objsub=j; return -4; // Event leades to unexisting sector. } } return 0; } static char set_date_time(char *filename, unsigned long date, unsigned long time) { HANDLE h=CreateFile(filename,0,0,NULL,OPEN_EXISTING,0,NULL); FILETIME WriteTime; char err=0; if (h==NULL) return 1; WriteTime.dwHighDateTime=date; WriteTime.dwLowDateTime=time; err=SetFileTime(h,NULL,NULL,&WriteTime)==1; CloseHandle(h); return err; } static char get_date_time(char *filename, unsigned long *date, unsigned long *time) { HANDLE h=CreateFile(filename,0,0,NULL,OPEN_EXISTING,0,NULL); FILETIME WriteTime; char err=0; if (h==NULL) return 1; err=GetFileTime(h,NULL,NULL,&WriteTime)!=1; *date=WriteTime.dwHighDateTime; *time=WriteTime.dwLowDateTime; CloseHandle(h); return err; } void validate_sound_map() { unsigned short date,time; if (get_date_time(MOB_SOUND,&date,&time)) return; set_date_time(MOB_FILE,date,time); set_date_time(ITEM_FILE,date,time); } char check_sound_map() { unsigned long date,time; unsigned long cdate,ctime; if (get_date_time(MOB_SOUND,&date,&time)) return 0; get_date_time(MOB_FILE,&cdate,&ctime); if (date!=cdate || time!=ctime) return 1; get_date_time(ITEM_FILE,&cdate,&ctime); if (date!=cdate || time!=ctime) return 1; return 0; } int save_all_map(void) { int x,y,z; char info[160]; char *txt; if ((z=check_map(&x,&y))!=0) { WINDOW *w; unselect_map(); if ((w=find_window(tool_bar))!=NULL) close_window(w); tool_sel=30; create_map_win(-1); open_sector_win(); jdi_na_sektor(x); } sprintf(info,"Chyba %02d na pozici %d:%d",-z,x,y); switch (z) { case -1:msg_box(info,'\01',"Chyb¡ definice stˆny!","OK",NULL);break; case -2:msg_box(info,'\01',"Chodba vede do neexistuj¡c¡ho sektoru!","OK",NULL);break; case -3:msg_box(info,'\01',"Schody jsou ¨patnˆ spojen‚ se sousedn¡m¡ sektory!","OK",NULL);break; case -4:msg_box(info,'\01',"Ud lost v neexistuj¡c¡m sektoru!","OK",NULL);break; } if (!backup) { create_backup(filename); create_backup(SHOP_NAME); create_backup(ITEMS_DAT); create_backup(MOB_FILE); create_backup(MOB_SOUND); backup=1; } if (save_map(filename)) { sprintf(info,"Nedok ‘u ulo‘it soubor %s.",filename); msg_box("Chyba I/O",'\01',info,"!Panika!",NULL); } else txt=pripona(filename,TXT); save_items(); if (_access(txt,0)!=0) { FILE *f; f=fopen(txt,"w"); if (f) { fputs("-1\n",f); fclose(f); } } if (!mglob.local_monsters) { save_mobs(); save_sound_map(); } save_all_shops(); validate_sound_map(); return z; } char *set_password(char *text) { if (text!=NULL) { strncpy(password,text,sizeof(password)); password[sizeof(password)-1]=0; } return password; } char check_password(char *text) { if (password[0]==0) return 1; if (text==NULL) return 0; return !strcmp(text,password); }