mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-15 10:46:44 -04:00
977 lines
24 KiB
C
977 lines
24 KiB
C
#include <skeldal_win.h>
|
||
#include <stdio.h>
|
||
#include <mem.h>
|
||
#include <malloc.h>
|
||
#include <stdlib.h>
|
||
#include <libs/types.h>
|
||
#include <libs/memman.h>
|
||
#include <libs/event.h>
|
||
#include <libs/devices.h>
|
||
#include <libs/bmouse.h>
|
||
#include <libs/bgraph.h>
|
||
#include <libs/gui.h>
|
||
#include <libs/basicobj.h>
|
||
#include <libs/strlite.h>
|
||
#include <strlists.h>
|
||
#include <libs/zvuk.h>
|
||
#include <signal.h>
|
||
#include <libs/inicfg.h>
|
||
#include "dump.h"
|
||
#include "mapy.h"
|
||
#include "edit_map.h"
|
||
#include "globals.h"
|
||
#include "steny.h"
|
||
#include "save_map.h"
|
||
#include "wiz_tool.h"
|
||
#include "mob_edit.h"
|
||
#include "../crashdump.h"
|
||
#include "../mapedit/version.h"
|
||
#include "../mapedit/editor.h"
|
||
|
||
//#define FONTPATH "d:\\tp\\vga\\"
|
||
#define FONTPATH "..\\font\\"
|
||
extern T_EVENT_ROOT *ev_tree;
|
||
|
||
static char newmap=0;
|
||
static char nosound=0;
|
||
TSTR_LIST config_file;
|
||
|
||
word *icones,*vga_font;
|
||
char *sample_path;
|
||
char *script_name;
|
||
extern word ikones;
|
||
extern word boldcz;
|
||
extern word font8x5;
|
||
word icone_color[7]={RGB555(8,8,8),RGB555(31,31,31),RGB555(0,0,15),RGB555(16,16,16),RGB555(0x1b,0x1b,0x1b)};
|
||
extern word sipka;
|
||
static char *error_texts[]=
|
||
{
|
||
"Progamov<EFBFBD> chyba",
|
||
"Pr<EFBFBD>v<EFBFBD> b<><62><EFBFBD>c<EFBFBD> ud<75>lost zp<7A>sobila neplatnou referenci pam<61><6D>i!",
|
||
"Pr<EFBFBD>v<EFBFBD> b<><62><EFBFBD>c<EFBFBD> ud<75>lost zp<7A>sobila zpracov<6F>n<EFBFBD> neplatn<74> instrukce!",
|
||
"Syst<EFBFBD>m zachytil neo<65>ek<65>vanou chybu programu!"
|
||
};
|
||
|
||
static char ask_exit_status;
|
||
|
||
word menu_win=-1;
|
||
char hicolor=1;
|
||
char sekceid[8]="<BLOCK>";
|
||
long pc_counter=0;
|
||
long pc_max=1;
|
||
long pc_result=0;
|
||
long pc_tick=0;
|
||
int test_mode=4;
|
||
char *background_file=NULL;
|
||
int editor_win=-1;
|
||
char color16=0;
|
||
|
||
void close_test()
|
||
{
|
||
close_window(waktual);
|
||
}
|
||
|
||
void logo(void)
|
||
{
|
||
CTL3D ctl;
|
||
word *p;
|
||
|
||
ctl.light=RGB555(31,31,31);
|
||
ctl.shadow=RGB555(16,16,16);
|
||
ctl.bsize=2;
|
||
ctl.ctldef=0;
|
||
draw_border(120,120,0x18f,0x6a,&ctl);
|
||
p=(word *)LoadResourceFont("MAPEDIT.HI");
|
||
put_picture(120,120,p);
|
||
// free(p);
|
||
showview(0,0,0,0);
|
||
}
|
||
|
||
void about();
|
||
|
||
void movesize_test()
|
||
{
|
||
WINDOW *w;
|
||
|
||
w=find_window(map_win);
|
||
if (w==NULL) return;
|
||
movesize_win(w,0,0,100,100);
|
||
redraw_desktop();
|
||
}
|
||
|
||
void forced_map_test()
|
||
{
|
||
int i;
|
||
|
||
for(i=0;i<maplen;i++)
|
||
{
|
||
if (minfo[i].flags & 0x1)
|
||
{
|
||
call_testmap(i);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
EVENT_PROC(exit_key)
|
||
{
|
||
int c;
|
||
|
||
GET_USER_PTR();
|
||
WHEN_MSG(E_INIT)
|
||
return;
|
||
WHEN_MSG(E_KEYBOARD)
|
||
{
|
||
c=GET_DATA(int);
|
||
if ((c & 0xff)==0 && (c>>8)=='D') terminate_gui();
|
||
if ((c & 0xff)==0 && (c>>8)==';') about();
|
||
if ((c & 0xff)==0 && (c>>8)=='?') save_dump();
|
||
if ((c & 0xff)==0 && (c>>8)=='<') movesize_test();
|
||
if ((c & 0xff)=='t' || (c & 0xff)=='T' || (c & 0xff)==' ' ) forced_map_test();
|
||
}
|
||
}
|
||
|
||
EVENT_PROC(wait_ms_key)
|
||
{
|
||
MS_EVENT *ms;
|
||
|
||
GET_USER_PTR();
|
||
WHEN_MSG(E_INIT)
|
||
return;
|
||
WHEN_MSG(E_MOUSE)
|
||
{
|
||
ms=get_mouse(GET_MSG_VAR());
|
||
if (ms->event_type & 4) terminate_gui();
|
||
}
|
||
}
|
||
|
||
EVENT_PROC(main_menu)
|
||
{
|
||
MS_EVENT *ms;
|
||
|
||
GET_USER_PTR();
|
||
WHEN_MSG(E_INIT)
|
||
return;
|
||
WHEN_MSG(E_MOUSE)
|
||
{
|
||
ms=get_mouse(GET_MSG_VAR());
|
||
if (ms->event_type & 32) select_window(menu_win),redraw_window();
|
||
}
|
||
}
|
||
|
||
|
||
void wait_mouse(void)
|
||
{
|
||
send_message(E_ADD,E_MOUSE,wait_ms_key);
|
||
escape();
|
||
send_message(E_DONE,E_MOUSE,wait_ms_key);
|
||
}
|
||
|
||
EVENT_PROC(all_status)
|
||
{
|
||
char *c;
|
||
char *fn;
|
||
char **p;
|
||
|
||
GET_USER_PTR();
|
||
WHEN_MSG(E_INIT) return;
|
||
WHEN_MSG(E_DONE) return;
|
||
c=GET_DATA_PTR(char);
|
||
c=(char *)msg->data;
|
||
fn=strrchr(filename,'\\');
|
||
if (fn) fn++;else fn=filename;
|
||
sprintf(c,"CH:%d, N:%d, P:%d, file: %s ",maplen,0,max_items,fn);
|
||
c=strchr(c,'\0');
|
||
if (pc_result<0) sprintf(c,"(wait)");else sprintf(c,"CPU %03d%%",pc_result);
|
||
c=strchr(c,'\0');
|
||
p=&GET_DATA_PTR(char)
|
||
*p=c;
|
||
pc_counter++;
|
||
}
|
||
|
||
void *pc_metter(EVENT_MSG *msg)
|
||
{
|
||
static int last1,last2;
|
||
if (msg->msg==E_INIT) return &pc_metter;
|
||
if (msg->msg==E_DONE) return NULL;
|
||
pc_tick++;
|
||
if (pc_tick>10)
|
||
{
|
||
if (pc_counter>pc_max)
|
||
if (last1>pc_max && last2>pc_max) pc_max=pc_counter;
|
||
else last2=last1;last1=pc_counter;
|
||
pc_result=100-pc_counter*100/pc_max;
|
||
pc_counter=0;
|
||
pc_tick=0;
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
void graph_init(char windowed)
|
||
{
|
||
/*
|
||
int c;
|
||
static word *p=NULL;
|
||
if (color16)
|
||
{
|
||
if (p==NULL)p=create_blw_palette16();
|
||
initmode16(p);
|
||
}
|
||
else
|
||
{
|
||
if (hicolor) c=initmode32() ;else c=-1;
|
||
if (c)
|
||
{
|
||
|
||
if (p==NULL)p=create_special_palette();
|
||
if (initmode256(p))
|
||
initmode_lo(p);
|
||
}
|
||
}
|
||
*/
|
||
// report_mode(1);
|
||
|
||
const char *c=get_text_field(config_file,"MAPEDIT_WINDOW");
|
||
int scale = 1;
|
||
if (c != 0)
|
||
{
|
||
int x,y;
|
||
if (sscanf(c,"%dx%d",&x,&y) == 2 && x>=640 && y>=480)
|
||
DxSetInitResolution(x,y);
|
||
}
|
||
;
|
||
c=get_text_field(config_file,"MAPEDIT_SCALE");
|
||
if (c != 0)
|
||
{
|
||
sscanf(c,"%d",&scale);
|
||
}
|
||
initmode_dx(windowed,scale,0,0);
|
||
|
||
}
|
||
|
||
void init_sound()
|
||
{
|
||
int a,b,c,d;
|
||
if (nosound)
|
||
{
|
||
a=DEV_NOSOUND;
|
||
}
|
||
else if (sound_detect(&a,&b,&c,&d))
|
||
{
|
||
puts("No sound device found");
|
||
a=DEV_NOSOUND;
|
||
}
|
||
set_mixing_device(a,22000,b,c,d);
|
||
}
|
||
|
||
void prg_error(EVENT_MSG *msg,void **unused)
|
||
{
|
||
int *err;
|
||
char *c;
|
||
|
||
unused;
|
||
if (msg->msg==E_PRGERROR)
|
||
{
|
||
err=(int *)(*(int **)msg->data);
|
||
switch (*err)
|
||
{
|
||
case ERR_MEMREF:c=error_texts[1];break;
|
||
case ERR_ILLEGI:c=error_texts[2];break;
|
||
default: c=error_texts[3];break;
|
||
}
|
||
zobraz_mysku();
|
||
showview(0,0,0,0);
|
||
*err=2-msg_box(error_texts[0],' ',c,"Ignoruj","Konec","Ulo<EFBFBD> mapu",NULL);
|
||
if (*err==-1) save_all_map();
|
||
}
|
||
}
|
||
|
||
void raise_error_conv(int i)
|
||
{
|
||
/* if (i==SIGILL) raise_error(ERR_ILLEGI);
|
||
else
|
||
if (i==SIGSEGV) raise_error(ERR_MEMREF);
|
||
else
|
||
raise_error(ERR_MEMREF);
|
||
*/
|
||
}
|
||
|
||
static void key_test(va_list args)
|
||
{
|
||
word c;
|
||
do
|
||
{
|
||
EVENT_MSG *msg = task_wait_event(E_KEYBOARD);
|
||
c=va_arg(msg->data,unsigned int);
|
||
}
|
||
while ((c & 0xff)!='!');
|
||
puts("\x7");
|
||
}
|
||
|
||
void ddl_init()
|
||
{
|
||
char *c;
|
||
char *path,*temp;
|
||
|
||
c=get_text_field(config_file,"CESTA_DATA");
|
||
concat(path,c,"SKELDAL.DDL");
|
||
c=get_text_field(config_file,"CESTA_TEMP");
|
||
if (c!=NULL)concat(temp,c,"~MAPEDIT.TMP");else temp=c;
|
||
printf("Hledam soubor %s\n",path);
|
||
init_manager(path,temp);
|
||
}
|
||
|
||
void init(void)
|
||
{
|
||
mapy_init();
|
||
ddl_init();
|
||
vga_font=LoadResourceFont("BOLDCZ");
|
||
default_font=vga_font;
|
||
icones=LoadResourceFont("IKONY");
|
||
graph_init(1);
|
||
curcolor=RGB555(24,24,24);memcpy(charcolors,flat_color(0x0000),sizeof(charcolors));
|
||
init_events(100);
|
||
curfont=default_font;
|
||
register_ms_cursor(LoadResourceFont("SIPKA.HI"));
|
||
init_mysky();
|
||
// hranice_mysky(0,0,639,479);
|
||
add_task(1024,key_test);
|
||
send_message(E_ADD,E_STATUS_LINE,status_line);
|
||
send_message(E_STATUS_LINE,E_ADD,E_IDLE,all_status);
|
||
send_message(E_STATUS_LINE,E_ADD,E_IDLE,status_mem_info);
|
||
send_message(E_STATUS_LINE,E_ADD,E_IDLE,show_time);
|
||
send_message(E_ADD,E_TIMER,pc_metter);
|
||
send_message(E_ADD,E_KEYBOARD,exit_key);
|
||
send_message(E_ADD,E_PRGERROR,prg_error);
|
||
signal(SIGILL,raise_error_conv);
|
||
signal(SIGSEGV,raise_error_conv);
|
||
install_gui();
|
||
redraw_desktop();do_events();
|
||
send_message(E_ADD,E_MOUSE,main_menu);
|
||
msg_box_font=vga_font;
|
||
msg_icn_font=icones;
|
||
ukaz_mysku();
|
||
update_mysky();
|
||
}
|
||
/*
|
||
w=create_window(100,100,400,200,0x6318,&x);
|
||
id=desktop_add_window(w);
|
||
define(10,20,50,30,0,sample,"Test");
|
||
property(&x,NULL,flat_color(0x7000),0xffff);
|
||
define(10,20,70,30,3,button,"Tlacitko");
|
||
property(NULL,NULL,flat_color(0x000f),0x01c0);on_change(close_test);
|
||
w=create_window(5,5,200,200,0x6318,&x);
|
||
id=desktop_add_window(w);
|
||
define(50,50,70,30,3,button,"Tlacitko");
|
||
property(NULL,NULL,flat_color(0x7fff),0x000f);on_change(close_test);
|
||
w=create_window(300,150,300,200,0x6318,&x);
|
||
id=desktop_add_window(w);
|
||
define(50,50,70,30,3,button,"Tlacitko");
|
||
property(NULL,NULL,flat_color(0x7fff),0x000f);on_change(close_test);
|
||
*/
|
||
|
||
long def_window(word xs,word ys,char *name)
|
||
{
|
||
word x=0,y=0;
|
||
WINDOW *p;
|
||
CTL3D ctl;
|
||
FC_TABLE fc;
|
||
long q;
|
||
|
||
if (waktual!=NULL)
|
||
{
|
||
x=waktual->x;
|
||
y=waktual->y;
|
||
}
|
||
|
||
highlight(&ctl,WINCOLOR);
|
||
ctl.bsize=2;ctl.ctldef=0;
|
||
x+=20;y+=20;
|
||
memcpy(fc,flat_color(RGB555(31,31,0)),sizeof(FC_TABLE));
|
||
fc[0]=0x0000;
|
||
if (x+xs>SCR_WIDTH_X-2) x=SCR_WIDTH_X-2-xs;
|
||
if (y+ys>SCR_WIDTH_Y-2) y=SCR_WIDTH_Y-2-ys;
|
||
p=create_window(x,y,xs,ys,WINCOLOR,&ctl);
|
||
q=desktop_add_window(p);
|
||
define(0,2,2,xs-5-20*(xs>=70),14,0,win_label,name);
|
||
ctl.bsize=1;ctl.ctldef=1;
|
||
o_end->autoresizex=1;
|
||
property(&ctl,vga_font,&fc,LABELCOLOR);
|
||
if (xs>=70)
|
||
{
|
||
define(1,1,1,19,16,1,button,"\x0f");
|
||
property(NULL,icones,&icone_color,WINCOLOR);on_control_change(close_test);
|
||
}
|
||
return q;
|
||
}
|
||
|
||
void def_dialoge(word x,word y,word xs, word ys, char *name)
|
||
{
|
||
CTL3D ctl;
|
||
FC_TABLE fc;
|
||
WINDOW *p;
|
||
|
||
|
||
memcpy(fc,flat_color(RGB555(31,31,0)),sizeof(FC_TABLE));
|
||
memcpy(&ctl,def_border(2,WINCOLOR),sizeof(CTL3D));
|
||
p=create_window(x,y,xs,ys,WINCOLOR,&ctl);
|
||
desktop_add_window(p);
|
||
set_window_modal();
|
||
ctl.bsize=1;ctl.ctldef=1;
|
||
define(0,1,1,xs-2,14,0,win_label,name);
|
||
o_end->autoresizex=1;
|
||
property(&ctl,vga_font,&fc,LABELCOLOR);
|
||
}
|
||
|
||
void dtext_init(OBJREC *o,char *title)
|
||
{
|
||
title=get_title(title);
|
||
o->userptr=(void *)getmem(strlen(title)+1);
|
||
strcpy((char *)o->userptr,title);
|
||
}
|
||
|
||
|
||
void dtext_draw(int x1,int y1,int x2, int y2,OBJREC *o)
|
||
{
|
||
x2;y2;
|
||
fontdsize=1;
|
||
position(x1,y1);
|
||
outtext((char *)o->userptr);
|
||
fontdsize=0;
|
||
}
|
||
|
||
void dtext(OBJREC *o)
|
||
{
|
||
o->call_init=dtext_init;
|
||
o->call_draw=dtext_draw;
|
||
//o->call_event=sample_event;
|
||
//o->call_done=sample_done;
|
||
}
|
||
|
||
void about()
|
||
{
|
||
FC_TABLE c={0,RGB555(31,31,0),RGB555(28,28,28),RGB555(24,24,24),RGB555(20,20,20)};
|
||
FC_TABLE c2={0,RGB555(31,16,0),RGB555(28,16,0),RGB555(24,16,0),RGB555(20,16,0)};
|
||
FC_TABLE c3={0,RGB555(0,24,0),RGB555(0,20,0),RGB555(0,16,0),RGB555(0,10,0)};
|
||
static about_win=-1;
|
||
|
||
if (find_window(about_win)==NULL)
|
||
{
|
||
about_win=def_window(300,200,"About");
|
||
waktual->x=320-150;
|
||
waktual->y=140;
|
||
memcpy(f_default,flat_color(0x0),sizeof(FC_TABLE));
|
||
waktual->modal=1;
|
||
default_font=vga_font;
|
||
define(-1,5,25,29,29,0,dtext,"\x8");property(NULL,icones,&c,WINCOLOR);
|
||
define(-1,75,25,100,29,0,dtext,"MAPEDIT");property(NULL,NULL,&c2,WINCOLOR);
|
||
define(-1,200,35,60,29,0,label,"verze 2.0");property(NULL,NULL,&c3,WINCOLOR);
|
||
define(-1,20,80,200,10,0,label,"Naps<EFBFBD>no pro hru \"Br<EFBFBD>ny Skeldalu\"");
|
||
define(-1,20,92,200,10,0,label,"(C) 1997 Napoleon gameS ");
|
||
define(-1,20,104,200,10,0,label,"Naprogamoval: Ond<6E>ej Nov<6F>k ");
|
||
define(-1,20,116,200,10,0,label,"Tento software sm<73> b<>t pou<6F>it jen");
|
||
define(-1,20,128,200,10,0,label,"ve spojen<65> s v<>vojem hry \"Br<EFBFBD>ny");
|
||
define(-1,20,140,200,10,0,label,"Skeldalu\" (a p<><70>padn<64> dal<61><6C> verze)");
|
||
define(-1,20,152,200,10,0,label,"a to pouze <20>leny v<>vojov<6F>ho t<>mu.");
|
||
define(10,110,170,80,20,0,button,"Ok");on_control_change(close_test);
|
||
}
|
||
else select_window(about_win);
|
||
redraw_window();
|
||
}
|
||
|
||
void fog_bar_draw(int x1,int y1,int x2,int y2,OBJREC *o)
|
||
{
|
||
disable_bar(x1,y1,x2-x1,y2-y1,o->color);
|
||
}
|
||
|
||
void fog_bar(OBJREC *o)
|
||
{
|
||
o->call_draw=fog_bar_draw;
|
||
}
|
||
|
||
void close_app(void)
|
||
{
|
||
WINDOW *w;
|
||
CTL3D x={0,0,0,0};
|
||
|
||
int mx = DxGetResX() - 1;
|
||
int my = DxGetResY() - 1;
|
||
|
||
w=create_window(0,0,1,1,0,&x);
|
||
desktop_add_window(w);
|
||
define(-1,0,0,mx,my,0,fog_bar);property(NULL,NULL,NULL,RGB555(16,0,0));
|
||
redraw_desktop();
|
||
if ((ask_exit_status=msg_box("Dotaz?",'\x2',"Chce<EFBFBD> program ukon<6F>it, nebo nahr<68>t jinou mapu?","Jinou mapu","Ukon<EFBFBD>it","Ne",NULL))!=3) terminate_gui();
|
||
close_window(w);
|
||
do_events();
|
||
}
|
||
|
||
void edit_basic_maze()
|
||
{
|
||
if (tool_sel>40) tool_sel=30;
|
||
create_map_win(-1);
|
||
if (newmap)
|
||
{
|
||
edit_side(0,0);
|
||
sector_details_call(0);
|
||
if (str_count(side_names)>2 || side_names[1]!=NULL) newmap=0;
|
||
}
|
||
}
|
||
|
||
void spawn_editor(char *dosline)
|
||
{
|
||
// deinstall_mouse_handler();
|
||
closemode();
|
||
system(dosline);
|
||
graph_init(1);
|
||
// install_mouse_handler();
|
||
// hranice_mysky(0,0,639,479);
|
||
redraw_desktop();
|
||
}
|
||
|
||
void edit_script_file()
|
||
{
|
||
char s[255]="";
|
||
char *pr;WINDOW *w;
|
||
|
||
|
||
w=find_window(sektor_win);
|
||
if (w!=NULL) close_window(w);
|
||
switch (o_aktual->id)
|
||
{
|
||
case 10:strcat(s,pripona(filename,SCR));break;
|
||
case 20:strcat(s,pripona(filename,".TXT"));break;
|
||
case 30:strcat(s,ITEMS_SCRIPT);break;
|
||
case 40:strcat(s,ITEMS_PICS);break;
|
||
}
|
||
EditSkeldalFile(s);
|
||
pr=pripona(filename,SCR);
|
||
read_full_side_script(pr);
|
||
read_side_list(ITEMS_SCRIPT,&vzhled_veci,0,4);
|
||
read_side_list(ITEMS_PICS,&pohledy_veci,0,2);
|
||
read_side_list(WEAPONS_SCRIPT,&weapons,0,3);
|
||
read_side_list(WEAPONS_SCRIPT,&weapons_pos,2,3);
|
||
}
|
||
|
||
void call_animator()
|
||
{
|
||
spawn_editor("ani");
|
||
}
|
||
|
||
|
||
void open_editor_win()
|
||
{
|
||
if (find_window(editor_win)==NULL)
|
||
{
|
||
editor_win=def_window(100,150,"Editory");
|
||
define(10,10,25,80,20,0,button,"map script");on_control_change(edit_script_file);
|
||
define(20,10,50,80,20,0,button,"map texty");on_control_change(edit_script_file);
|
||
define(30,10,75,80,20,0,button,"items.scr");on_control_change(edit_script_file);
|
||
define(40,10,100,80,20,0,button,"items.pic");on_control_change(edit_script_file);
|
||
define(50,10,125,80,20,0,button,"animator");on_control_change(call_animator);
|
||
redraw_window();
|
||
}
|
||
else
|
||
{
|
||
select_window(editor_win);
|
||
redraw_window();
|
||
}
|
||
}
|
||
|
||
void create_menu(void)
|
||
{
|
||
FC_TABLE c={0,RGB555(31,31,31),RGB555(24,24,24),RGB555(16,16,16),RGB555(4,4,4)};
|
||
menu_win=def_window(400,150,"Map Edit v2.0 for Windows - " MAPEDIT_VERSION );
|
||
waktual->x=120;
|
||
waktual->y=250;
|
||
on_control_change(close_app);
|
||
curcolor=WINCOLOR;
|
||
default_font=icones;
|
||
define(10,5,25,29,29,0,button,"\x8");property(NULL,NULL,&c,WINCOLOR);on_control_change(edit_basic_maze);
|
||
define(20,5,55,29,29,0,button,"\x9");property(NULL,NULL,&c,WINCOLOR);on_control_change(editor_veci);
|
||
define(30,5,85,29,29,0,button,"\xA");property(NULL,NULL,&c,WINCOLOR);on_control_change(enemy_window);
|
||
c[1]=RGB555(20,0,0);c[2]=RGB555(0,0,16);
|
||
define(40,200,25,29,29,0,button,"e");property(NULL,NULL,&c,WINCOLOR);on_control_change(shop_train_edit);
|
||
c[1]=RGB555(31,31,31);c[2]=RGB555(24,24,24);
|
||
c[3]=RGB555(20,0,0);c[4]=RGB555(0,0,16);
|
||
define(50,200,55,29,29,0,button,"E");property(NULL,NULL,&c,WINCOLOR);on_control_change(open_editor_win);
|
||
define(60,200,85,29,29,0,button,"S");property(NULL,NULL,&c,WINCOLOR);on_control_change(save_all_map);
|
||
define(70,5,115,29,29,0,button,"P");property(NULL,NULL,&c,WINCOLOR);on_control_change(pcxviewer);
|
||
memcpy(c,flat_color(RGB555(0,0,15)),sizeof(FC_TABLE));
|
||
define(-1,45,35,90,20,0,label,"Kreslen<EFBFBD> mapy");property(NULL,vga_font,&c,WINCOLOR);
|
||
define(-1,45,65,90,20,0,label,"Pokl<EFBFBD>d<EFBFBD>n<EFBFBD> p<>edm<64>t<EFBFBD>");property(NULL,vga_font,&c,WINCOLOR);
|
||
define(-1,45,95,90,20,0,label,"Um<EFBFBD>s<EFBFBD>ov<EFBFBD>n<EFBFBD> nestv<74>r");property(NULL,vga_font,&c,WINCOLOR);
|
||
define(-1,240,35,90,20,0,label,"Obchody");property(NULL,vga_font,&c,WINCOLOR);
|
||
define(-1,240,65,90,20,0,label,"Editor script<70>");property(NULL,vga_font,&c,WINCOLOR);
|
||
define(-1,240,95,90,20,0,label,"Ulo<EFBFBD>en<EFBFBD> mapy");property(NULL,vga_font,&c,WINCOLOR);
|
||
define(-1,45,125,90,20,0,label,"Prohl<EFBFBD><EFBFBD>e<EFBFBD> PCX");property(NULL,vga_font,&c,WINCOLOR);
|
||
default_font=vga_font;
|
||
memcpy(f_default,flat_color(0x0000),sizeof(charcolors));
|
||
//set_enable(0,20,0);
|
||
//set_enable(0,30,0);
|
||
}
|
||
|
||
void help(void)
|
||
{
|
||
printf("Parametry:\n\n");
|
||
printf("mapedit filename [/4] [/2] [/c|t|v|m] [/?] \n"
|
||
"\n"
|
||
"/2 Prosadi 256 barev\n"
|
||
"/1 Prosadi 16 barev\n"
|
||
"/c Inicializace mysi se simulaci CGA karty (default)\n"
|
||
"/t Inicializace mysi se simulaci textoveho rezimu (standard)\n"
|
||
"/v Inicializace mysi se simulaci VGA\n"
|
||
"/m Inicializace mysi se simulaci MCGA\n"
|
||
"/? Tento help\n"
|
||
"/s Bez zvuku (dobre pro WIN95)\n"
|
||
);
|
||
exit(0);
|
||
}
|
||
|
||
void args_support(char count, char *sw[])
|
||
{
|
||
int i;
|
||
char c;
|
||
|
||
for(i=1;i<=count;i++)
|
||
if (sw[i][0]=='/')
|
||
{
|
||
c=sw[i][1];
|
||
switch (c)
|
||
{
|
||
case '?': help();break;
|
||
/* case '4': line480=1;break;
|
||
case '2': hicolor=0;break;
|
||
case '1': color16=1;break;
|
||
case 'c':
|
||
case 'C': ms_fake_mode=0x6;break;
|
||
case 't':
|
||
case 'T': ms_fake_mode=0x3;break;
|
||
case 'v':
|
||
case 'V': ms_fake_mode=0x12;break;
|
||
case 'm':
|
||
case 'M': ms_fake_mode=0x13;break;
|
||
case 'r':
|
||
case 'R': test_mode=sw[i][2]-48;if (test_mode<0 || test_mode>4) test_mode=0;break;*/
|
||
case 's': nosound=1;break;
|
||
}
|
||
}
|
||
else
|
||
strcpy(filename,sw[i]);
|
||
}
|
||
|
||
char *pripona(char *fname,char *prip)
|
||
{
|
||
static char name[128],*s,*t;
|
||
|
||
strncpy(name,fname,128);
|
||
name[127]='\0';
|
||
t=strchr(name,'.');
|
||
s=t;
|
||
while (s!=NULL)
|
||
{
|
||
t=s;
|
||
s=strchr(t+1,'.');
|
||
}
|
||
if (t==NULL)
|
||
{
|
||
t=strchr(name,'\0');
|
||
}
|
||
strcpy(t,prip);
|
||
return name;
|
||
}
|
||
|
||
|
||
void load_background()
|
||
{
|
||
FILE *f;
|
||
long siz;
|
||
|
||
if (gui_background!=NULL)
|
||
{
|
||
free(gui_background);
|
||
gui_background=NULL;
|
||
}
|
||
f=fopen(background_file,"rb");
|
||
if (f==NULL) return;
|
||
fseek(f,0,SEEK_END);siz=ftell(f);
|
||
fseek(f,0,SEEK_SET);
|
||
gui_background=getmem(siz);
|
||
fread(gui_background,1,siz,f);
|
||
redraw_desktop();
|
||
fclose(f);
|
||
}
|
||
|
||
static void shut_down()
|
||
{
|
||
// deinstall_mouse_handler();
|
||
closemode();
|
||
}
|
||
|
||
void init_maps(void);
|
||
|
||
static ask_password_event(EVENT_MSG *msg,OBJREC *obj)
|
||
{
|
||
obj;
|
||
WHEN_MSG(E_KEYBOARD)
|
||
{
|
||
char c=GET_DATA(char);
|
||
if (c==13) {goto_control(20);terminate_gui();}
|
||
if (c==27) {goto_control(30);terminate_gui();}
|
||
}
|
||
}
|
||
|
||
char ask_password(char *pass,char text)
|
||
{
|
||
char *c;
|
||
|
||
switch (text)
|
||
{
|
||
case 0:c="Prov<EFBFBD><EFBFBD>en<EFBFBD>";break;
|
||
case 1:c="Zm<EFBFBD>na hesla";break;
|
||
case 2:c="Kontrola";break;
|
||
}
|
||
def_dialoge(320-100,240-50,200,90,c);
|
||
define(-1,10,20,1,1,0,label,"Vlo<EFBFBD> heslo:");
|
||
define(10,10,40,180,12,0,input_line,49);
|
||
property(def_border(3,WINCOLOR),NULL,flat_color(RGB555(31,31,31)),RGB555(8,8,8));
|
||
if (text==1)set_default(pass);else set_default("");on_event(ask_password_event);
|
||
define(20,5,5,50,20,2,button,"OK");
|
||
property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui);
|
||
define(30,5,5,50,20,3,button,"Zru<EFBFBD>it");
|
||
property(def_border(1,0),NULL,NULL,WINCOLOR);on_control_change(terminate_gui);
|
||
redraw_window();
|
||
goto_control(10);
|
||
escape();
|
||
if (o_aktual->id==30) text=0;else
|
||
{
|
||
text=1;
|
||
get_value(0,10,pass);
|
||
}
|
||
close_current();
|
||
return text;
|
||
}
|
||
|
||
static int data_edit_enabled=0;
|
||
static char data_password[50]="";
|
||
|
||
char check_data_password(void)
|
||
{
|
||
char text[50];
|
||
|
||
if (data_password[0]==0) data_edit_enabled=1;
|
||
if (data_edit_enabled) return 1;
|
||
if (ask_password(text,0)==0) return 0;
|
||
if (strcmp(data_password,text))
|
||
{
|
||
msg_box("Chyba!",1,"Chybn<EFBFBD> heslo! P<><50>stup zam<61>tnut!","OK",NULL);
|
||
return 0;
|
||
}
|
||
else
|
||
{
|
||
data_edit_enabled=1;
|
||
return 1;
|
||
}
|
||
}
|
||
|
||
char *set_data_password(char *text)
|
||
{
|
||
if (text!=NULL)
|
||
{
|
||
strncpy(data_password,text,sizeof(data_password));
|
||
data_password[sizeof(data_password)-1]=0;
|
||
}
|
||
return data_password;
|
||
}
|
||
|
||
/*TSTR_LIST read_ddl_dir(char *filter)
|
||
{
|
||
TSTR_LIST ls;
|
||
int i=0;
|
||
char *s;
|
||
|
||
ls=create_list(256);
|
||
s=read_next_entry(MMR_FIRST);
|
||
while (s!=NULL)
|
||
{
|
||
char *d;
|
||
char c[13];
|
||
|
||
strncpy(c,s,12);
|
||
c[12]=0;
|
||
if (filter!=NULL)
|
||
{
|
||
d=strrchr(c,'.');
|
||
if (d!=NULL && !strncmp(d+1,filter,3)) str_replace(&ls,i++,c);
|
||
}
|
||
else
|
||
str_replace(&ls,i++,c);
|
||
s=read_next_entry(MMR_NEXT);
|
||
}
|
||
if (i==0) str_add(&ls,"<chyba>");
|
||
ls=sort_list(ls,-1);
|
||
return ls;
|
||
}
|
||
*/
|
||
|
||
SMapFiles mapFiles;
|
||
|
||
static char *strdup2(const char *a, const char *b)
|
||
{
|
||
char *res=malloc(strlen(a)+strlen(b)+1);
|
||
strcpy(res,a);
|
||
strcat(res,b);
|
||
return res;
|
||
}
|
||
|
||
static void InitMapFiles(const char *path)
|
||
{
|
||
mapFiles.items_script=strdup2(path,XITEMS_SCRIPT);
|
||
mapFiles.items_pics=strdup2(path,XITEMS_PICS);
|
||
mapFiles.items_dat=strdup2(path,XITEM_FILE);
|
||
mapFiles.dialogy_scr=strdup2(path,XDLG_SCRIPT);
|
||
mapFiles.weapons_scr=strdup2(path,XWEAPONS_SCRIPT);
|
||
mapFiles.shops_dat=strdup2(path,XSHOP_NAME);
|
||
mapFiles.enemy=strdup2(path,XMOB_FILE);
|
||
mapFiles.enemy_sound=strdup2(path,XMOB_SOUND);
|
||
}
|
||
static void ClearMapFiles()
|
||
{
|
||
free(mapFiles.items_script);
|
||
free(mapFiles.items_pics);
|
||
free(mapFiles.items_dat);
|
||
free(mapFiles.dialogy_scr);
|
||
free(mapFiles.weapons_scr);
|
||
free(mapFiles.shops_dat);
|
||
free(mapFiles.enemy);
|
||
free(mapFiles.enemy_sound);
|
||
|
||
}
|
||
|
||
|
||
static BOOL WINAPI HandlerRoutine(
|
||
DWORD dwCtrlType // control signal type
|
||
)
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
int main(int argc,char *argv[])
|
||
{
|
||
char *s;
|
||
char *pr;
|
||
char test[50];
|
||
char *mask;
|
||
InitCrashDump();
|
||
SetConsoleCtrlHandler(HandlerRoutine,TRUE);
|
||
filename[0]='\0';
|
||
// strcpy(filename,"TEST.MAP");
|
||
args_support(argc-1,argv);
|
||
printf("Hledam konfiguracni soubor\n");
|
||
config_file=read_config("WSKELDAL.INI");
|
||
if (config_file==NULL)
|
||
{
|
||
puts("...nemohu najit WSKELDAL.INI\n");
|
||
return 1;
|
||
}
|
||
if (strlen(filename)>3 && stricmp(filename+strlen(filename)-3,"adv")==0)
|
||
{
|
||
TSTR_LIST adv_cfg=read_config(filename);
|
||
config_file=merge_configs(config_file,adv_cfg);
|
||
filename[0]=0;
|
||
}
|
||
sample_path=get_text_field(config_file,"CESTA_ZVUKY");
|
||
if (sample_path==NULL) sample_path="";
|
||
mob_dir=get_text_field(config_file,"CESTA_ENEMY");
|
||
if (mob_dir==NULL) mob_dir="";
|
||
init_sound();
|
||
init();
|
||
|
||
concat(mask,get_text_field(config_file,"CESTA_MAPY"),"*.map");
|
||
atexit(shut_down);
|
||
// signal(SIGABRT,shut_down);
|
||
init_mob_list();
|
||
InitMapFiles(get_text_field(config_file,"CESTA_MAPY"));
|
||
do
|
||
{
|
||
ask_exit_status=2;
|
||
if (filename[0]=='\0') browser(mask,filename);
|
||
if (filename[0]!='\0')
|
||
{
|
||
char *mapy=get_text_field(config_file,"CESTA_MAPY");
|
||
memmove(filename+strlen(mapy),filename,strlen(filename)+1);
|
||
memcpy(filename,mapy,strlen(mapy));
|
||
s=pripona(filename,".HI");
|
||
background_file=(char *)getmem(strlen(s)+1);strcpy(background_file,s);
|
||
load_background();
|
||
}
|
||
do_events();
|
||
logo();
|
||
pr=pripona(filename,SCR);
|
||
script_name=NewArr(char,strlen(pr)+1);
|
||
strcpy(script_name,pr);
|
||
read_full_side_script(pr);
|
||
read_spec_procs();
|
||
read_side_list(ITEMS_SCRIPT,&vzhled_veci,0,4);
|
||
read_side_list(ITEMS_PICS,&pohledy_veci,0,2);
|
||
read_dlg_list(DLG_SCRIPT,&dlg_names,&dlg_pgfs);
|
||
read_side_list(WEAPONS_SCRIPT,&weapons,0,3);
|
||
read_side_list(WEAPONS_SCRIPT,&weapons_pos,2,3);
|
||
set_defaults();
|
||
init_multiactions();
|
||
memset(vyklenky,0,sizeof(vyklenky));
|
||
init_item_system();
|
||
if (filename[0]!='\0' )
|
||
{
|
||
int sel=1;
|
||
|
||
init_maps();
|
||
set_defaults();
|
||
if (load_map(filename))
|
||
msg_box(filename,'\01',"Tento soubor je bu<62> ne<6E>iteln<6C>, nebo po<70>kozen<65>","Pokra<EFBFBD>ovat",NULL);
|
||
if (check_password(NULL)==0)
|
||
if (ask_password(test,0)==0 || check_password(test)==0)
|
||
{
|
||
filename[0]=0;
|
||
ask_exit_status=1;
|
||
goto preskoc;
|
||
}
|
||
if (maplen<2)
|
||
{
|
||
sel=msg_box(filename,' ',"Soubor neexistuje, bude vytvo<76>en nov<6F>. Nyn<79> je nutn<74> nastavit z<>kladn<64> st<73>ny"
|
||
" a jin<69> dal<61><6C> parametry pro tuto mapu","Pokra<EFBFBD>ujem","Zav<EFBFBD>it",NULL);
|
||
if (sel==1)
|
||
{
|
||
newmap=1;
|
||
}
|
||
|
||
}
|
||
if (sel==1)
|
||
{
|
||
create_menu();
|
||
redraw_window();
|
||
escape();
|
||
filename[0]=0;
|
||
close_current();
|
||
}
|
||
}
|
||
preskoc:
|
||
free(background_file);
|
||
}
|
||
while (ask_exit_status==1);
|
||
ClearMapFiles();
|
||
redraw_desktop();
|
||
close_manager();
|
||
return 0;
|
||
}
|
||
|
||
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
|
||
{
|
||
return main(__argc,__argv);
|
||
}
|
||
|
||
|
||
int GetExeVersion()
|
||
{
|
||
return MAPEDIT_NVERSION;
|
||
}
|