mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-10 00:20:27 -04:00
459 lines
12 KiB
C
459 lines
12 KiB
C
#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 <inicfg.h>
|
||
#include <basicobj.h>
|
||
#include <memman.h>
|
||
#include <pcx.h>
|
||
#include <dos.h>
|
||
#include "mapy.h"
|
||
#include "globals.h"
|
||
#include "edit_map.h"
|
||
#include "steny.h"
|
||
#include "save_map.h"
|
||
#include "mob_edit.h"
|
||
|
||
int pcxview_win=-1;
|
||
static char swap=1;
|
||
static char in_ddl=0;
|
||
|
||
static void *last_pcx=NULL;
|
||
static char *basic_path;
|
||
|
||
#define BASIC_PATH "..\\graphics\\"
|
||
|
||
|
||
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;
|
||
}
|
||
|
||
static void get_directory()
|
||
{
|
||
TSTR_LIST ls;
|
||
char pathname[256];
|
||
char file=0;
|
||
|
||
c_set_value(0,9,0);
|
||
send_message(E_GUI,9,E_CONTROL,2);
|
||
get_value(0,20,pathname);
|
||
file=f_get_value(0,45);
|
||
if (pathname[0]==0) strcpy(pathname,".\\");
|
||
else
|
||
if (pathname[strlen(pathname)-1]!='\\') strcat(pathname,"\\");
|
||
set_value(0,20,pathname);
|
||
send_message(E_GUI,9,E_CONTROL,0,&ls);
|
||
if (ls!=NULL) release_list(ls);
|
||
if (file)
|
||
ls=read_ddl_dir("PCX");
|
||
else
|
||
{
|
||
strcat(pathname,"*.pcx");
|
||
ls=read_directory(pathname,DIR_BREIF,_A_NORMAL);
|
||
}
|
||
if (ls==NULL)
|
||
{
|
||
ls=create_list(2);
|
||
str_add(&ls,"<nic>");
|
||
}
|
||
send_message(E_GUI,9,E_CONTROL,1,ls);
|
||
in_ddl=file;
|
||
redraw_desktop();
|
||
}
|
||
|
||
static void close_pcx_window()
|
||
{
|
||
TSTR_LIST ls;
|
||
send_message(E_GUI,9,E_CONTROL,0,&ls);
|
||
if (ls!=NULL) release_list(ls);
|
||
if (last_pcx!=NULL)free(last_pcx);last_pcx=NULL;
|
||
close_current();
|
||
}
|
||
|
||
static void picture2_display(int x1,int y1,int x2,int y2,OBJREC *o)
|
||
{
|
||
word *paleta;
|
||
word *data;
|
||
int xs,ys,xo;
|
||
word *w;
|
||
char *d,*e;
|
||
|
||
data=*(void **)o->data;x2,y2;
|
||
if (data==NULL) return;
|
||
paleta=data+3;
|
||
xs=data[0];
|
||
ys=data[1];
|
||
if (swap) y1=y1+ys/2;
|
||
data=paleta+256;
|
||
e=(char *)data;
|
||
do
|
||
{
|
||
w=GetScreenAdr()+x1+scr_linelen2*y1;
|
||
xo=xs/2;
|
||
d=e;
|
||
do
|
||
{
|
||
word col=paleta[*d];
|
||
*w++=col/*+(col & ~0x1F)*/;d+=2;
|
||
}
|
||
while (--xo);
|
||
e+=xs*2;
|
||
if (swap) y1--;else y1++;
|
||
ys-=2;
|
||
}
|
||
while(ys>0 && y1<460);
|
||
}
|
||
|
||
static void picture2(OBJREC *o)
|
||
{
|
||
o->call_draw=picture2_display;
|
||
o->datasize=4;
|
||
}
|
||
|
||
static char *get_pcx(char *filename)
|
||
{
|
||
char *c;
|
||
if (in_ddl)
|
||
{
|
||
long s;
|
||
void *z;
|
||
char *name;
|
||
|
||
name=strrchr(filename,'\\');if(name!=NULL) name++;else name=filename;
|
||
if (test_file_exist(read_group(0),name))
|
||
{
|
||
z=afile(name,read_group(0),&s);
|
||
load_pcx(z,s,A_8BIT,&c);
|
||
free(z);
|
||
}
|
||
else
|
||
c=NULL;
|
||
}
|
||
else
|
||
if (open_pcx(filename,A_8BIT,&c))
|
||
{
|
||
in_ddl=!in_ddl;c=get_pcx(filename);in_ddl=!in_ddl;
|
||
return c;
|
||
}
|
||
return c;
|
||
}
|
||
|
||
static void read_pcx()
|
||
{
|
||
char pathname[256];
|
||
char name[30];
|
||
TSTR_LIST ls;
|
||
int i;
|
||
|
||
send_message(E_GUI,9,E_CONTROL,0,&ls);
|
||
get_value(0,20,pathname);
|
||
if (last_pcx!=NULL) free(last_pcx);
|
||
i=f_get_value(0,9);
|
||
strcpy(name,ls[i]);name_conv(name);
|
||
strcat(pathname,name);
|
||
last_pcx=get_pcx(pathname);
|
||
c_set_value(0,30,(int)last_pcx);
|
||
redraw_window();
|
||
}
|
||
|
||
static void change_swap()
|
||
{
|
||
swap=f_get_value(0,40);
|
||
redraw_window();
|
||
}
|
||
|
||
static char clr_sw=1;
|
||
|
||
static void refresh_scrs()
|
||
{
|
||
WINDOW *w;
|
||
int i;
|
||
set_value(0,100,"");
|
||
set_value(0,110," 1");
|
||
switch(i=f_get_value(0,130))
|
||
{
|
||
case 0:send_message(E_GUI,140,E_CONTROL,side_names);break;
|
||
case 1:send_message(E_GUI,140,E_CONTROL,floors);break;
|
||
case 2:send_message(E_GUI,140,E_CONTROL,ceils);break;
|
||
case 3:send_message(E_GUI,140,E_CONTROL,oblouky);break;
|
||
}
|
||
if (o_aktual && o_aktual->id==130)
|
||
{
|
||
if (i==3) fill_bit_fields(0,160,2+4,3);else fill_bit_fields(0,160,1,3);
|
||
set_enable(0,160,i!=3);
|
||
set_enable(0,170,i!=2 && i!=1);
|
||
set_enable(0,180,i!=2 && i!=1);
|
||
}
|
||
c_set_value(0,140,0);
|
||
set_value(0,150," 1");
|
||
Beep(1000,10);
|
||
w=find_window(sektor_win);
|
||
if (w!=NULL) close_window(w);
|
||
clr_sw=1;
|
||
}
|
||
|
||
static void clear_switchs()
|
||
{
|
||
if (clr_sw)
|
||
{
|
||
c_set_value(0,160,0);
|
||
c_set_value(0,170,0);
|
||
c_set_value(0,180,0);
|
||
c_set_value(0,o_aktual->id,1);
|
||
clr_sw=0;
|
||
}
|
||
}
|
||
|
||
|
||
#define ZMENIT "Zm<5A>nit grafiku"
|
||
static void zmenit()
|
||
{
|
||
int i,c,f;
|
||
char *name;
|
||
TSTR_LIST ls;
|
||
|
||
i=f_get_value(0,9);
|
||
send_message(E_GUI,9,E_CONTROL,0,&ls);
|
||
if (i>=str_count(ls))return;
|
||
if (ls[i]==NULL) return;
|
||
name=alloca(strlen(ls[i])+1);strcpy(name,ls[i]);
|
||
name_conv(name);
|
||
c=f_get_value(0,140);
|
||
if (c==0)
|
||
{
|
||
msg_box(ZMENIT,1,"Mus<EFBFBD><EFBFBD> vybrat n<>jakou grafiku. Klepni tam, jak je naps<70>no <nic>",MSB_OK);
|
||
return;
|
||
}
|
||
load_side_script(script_name);
|
||
f=vals(150);
|
||
i=change_side(f_get_value(0,130),c-1,get_bit_fields(0,160,3),f-1,name);
|
||
if (i<-1)
|
||
{
|
||
msg_box(ZMENIT,1,"Program odm<64>tl (z n<>jak<61>ch d<>vod<6F>) akci prov<6F>st. Zkontrolujte v<>echny <20>daje",MSB_OK);
|
||
discharge_side_script();
|
||
return;
|
||
}
|
||
if (i==-1)
|
||
{
|
||
msg_box(ZMENIT,1,"Nepovolen<EFBFBD> kombinace pol<6F> \"Hlavn<EFBFBD>\", \"Lev<EFBFBD>\" a \"Prav<EFBFBD>\"",MSB_OK);
|
||
discharge_side_script();
|
||
return;
|
||
}
|
||
save_side_script(script_name);
|
||
refresh_scrs();
|
||
c_set_value(0,140,c);
|
||
if (i>0)
|
||
{
|
||
char c[20];
|
||
|
||
set_value(0,150,itoa(f+1,c,10));
|
||
}
|
||
}
|
||
|
||
#define VYMAZAT "Vymazat"
|
||
static void vymazat()
|
||
{
|
||
int pos=f_get_value(0,140);
|
||
|
||
if (pos==0)
|
||
{
|
||
msg_box(VYMAZAT,1,"Mus<EFBFBD><EFBFBD> vybrat n<>jakou grafiku. Klepni tam, jak je naps<70>no <nic>",MSB_OK);
|
||
return;
|
||
}
|
||
if (msg_box(VYMAZAT,1,"Vymazat grafiku v<>etn<74> p<><70>padn<64>ch animac<61>?",MSB_ANONE)==2) return;
|
||
load_side_script(script_name);
|
||
if (delete_side(f_get_value(0,130),pos-1))
|
||
{
|
||
msg_box(VYMAZAT,1,"Program odm<64>tl vymazat grafiky ze scriptu, nastala n<>jak<61> chyba.",MSB_OK);
|
||
discharge_side_script();
|
||
return;
|
||
}
|
||
save_side_script(script_name);
|
||
refresh_scrs();
|
||
}
|
||
|
||
#define ZALOZIT "Zalo<6C>it grafiku"
|
||
static void add_graphics()
|
||
{
|
||
char name[200];
|
||
int c,d;
|
||
|
||
get_value(0,100,name);
|
||
if (name[0]==0) {msg_box(ZALOZIT,1,"Mus<EFBFBD><EFBFBD> vepsat n<>jak<61> jm<6A>no!",MSB_OK);return;}
|
||
load_side_script(script_name);
|
||
if ((c=add_side(f_get_value(0,130),name,vals(110)))==-1)
|
||
{
|
||
msg_box(ZALOZIT,1,"Nelze zalo<6C>it novou grafiku! P<><50>li<6C> mnoho grafik, nebo nastala jin<69> chyba.",MSB_OK);
|
||
discharge_side_script();
|
||
}
|
||
else save_side_script(script_name);
|
||
d=vals(110);
|
||
refresh_scrs();
|
||
c_set_value(0,140,c+1-d+1);
|
||
}
|
||
|
||
static char *def_nahled(int id,int x,int y,char *name)
|
||
{
|
||
char *fpath,*p;
|
||
char ind=in_ddl;
|
||
|
||
if (name==NULL) return NULL;
|
||
concat(fpath,basic_path,name);
|
||
in_ddl=0;
|
||
p=get_pcx(fpath);
|
||
in_ddl=ind;
|
||
define(id,x,y,10,10,0,picture2);c_default((int)p);
|
||
return p;
|
||
}
|
||
|
||
static void nahled()
|
||
{
|
||
int list;
|
||
int pos,i;
|
||
char *p1=NULL,*p2=NULL,*p3=NULL,*p4;
|
||
char swps=swap;
|
||
|
||
list=f_get_value(0,130);pos=f_get_value(0,140)-1+vals(150)-1;
|
||
if (pos<0)
|
||
{
|
||
msg_box("N<EFBFBD>hled",1,"Nen<EFBFBD> co zobrazit!",MSB_OK);
|
||
return;
|
||
}
|
||
load_side_script(script_name);
|
||
tady:
|
||
def_dialoge(2,2,630,440,"N<EFBFBD>hled grafiky");
|
||
switch (list)
|
||
{
|
||
case 0: p1=def_nahled(10,5,25,get_side_name(list,pos,1));
|
||
p2=def_nahled(10,255,25,get_side_name(list,pos,2));
|
||
p3=def_nahled(10,380,25,get_side_name(list,pos,3));
|
||
swap=1;
|
||
break;
|
||
case 1:
|
||
case 2: p1=def_nahled(10,5,25,get_side_name(list,pos,1));
|
||
swap=0;
|
||
break;
|
||
case 3: p1=def_nahled(10,5,25,get_side_name(list,pos,1));
|
||
p2=def_nahled(10,255,25,get_side_name(list,pos,2));
|
||
swap=1;
|
||
break;
|
||
}
|
||
define(-1,5,5,80,20,2,button,"Ok");on_control_change(terminate_gui);
|
||
define(110,100,5,80,20,2,button,">>");on_control_change(terminate_gui);
|
||
define(120,190,5,80,20,2,button,"<<");on_control_change(terminate_gui);
|
||
redraw_window();
|
||
p4=get_side_name(list,pos,0);
|
||
if (p4!=NULL) set_enable(0,120,p4[0]=='*' && pos>0);
|
||
p4=get_side_name(list,pos+1,0);
|
||
set_enable(0,110,p4!=NULL && p4[0]=='*');
|
||
escape();
|
||
i=o_aktual->id;
|
||
close_current();
|
||
free(p1);free(p2);free(p3);
|
||
if (i==110){pos++;goto tady;}
|
||
if (i==120){pos--;goto tady;}
|
||
discharge_side_script();
|
||
swap=swps;
|
||
}
|
||
|
||
void pcxviewer()
|
||
{
|
||
TSTR_LIST ls;
|
||
|
||
basic_path=get_text_field(config_file,"CESTA_GRAFIKA");
|
||
if (basic_path==NULL)basic_path="";
|
||
if (find_window(pcxview_win)==NULL)
|
||
{
|
||
CTL3D b1,b2,b3;
|
||
|
||
ls=create_list(2);str_add(&ls,"<wait>");
|
||
memcpy(&b1,def_border(1,0),sizeof(CTL3D));
|
||
memcpy(&b2,def_border(5,WINCOLOR),sizeof(CTL3D));
|
||
memcpy(&b3,def_border(6,WINCOLOR),sizeof(CTL3D));
|
||
pcxview_win=def_window(635,440,"Prohl<EFBFBD><EFBFBD>e<EFBFBD> obrazk<7A> PCX");
|
||
default_font=vga_font;
|
||
memcpy(f_default,flat_color(0x0000),sizeof(charcolors));
|
||
on_control_change(close_pcx_window);
|
||
|
||
define(9,10,20,110,376,0,listbox,ls,0x7fff,0);on_control_change(read_pcx);
|
||
property(&b3,NULL,NULL,WINCOLOR);c_default(0);
|
||
define(10,126,40,21,337,0,scroll_bar_v,0,10,1,0x0200);
|
||
property(&b2,NULL,NULL,WINCOLOR);
|
||
define(11,126,20,21,17,0,scroll_button,-1,0,"\x1e");
|
||
property(&b1,icones,NULL,WINCOLOR);on_control_change(scroll_support);
|
||
define(12,126,380,21,17,0,scroll_button,1,10,"\x1f");
|
||
property(&b1,icones,NULL,WINCOLOR);on_control_change(scroll_support);
|
||
define(-1,175,20,1,1,0,label,"Cesta:");
|
||
define(20,175,32,320,12,0,input_line,240);set_default(basic_path);
|
||
property(&b3,NULL,NULL,WINCOLOR);on_control_exit(get_directory);
|
||
define(30,175,50,2,2,0,picture2);c_default(0);
|
||
define(40,10,10,80,10,3,check_box,"Oto<EFBFBD>it");c_default(swap);on_control_change(change_swap);
|
||
define(45,10,25,160,10,3,check_box,"Grafika Skeldalu");c_default(0);on_control_change(get_directory);
|
||
define(-1,5,80,110,75,1,label,"");property(&b2,NULL,NULL,WINCOLOR);
|
||
define(-1,10,80,100,70,1,label,"Nov<EFBFBD> grafika");
|
||
define(100,10,100,100,10,1,input_line,50);set_default("");property(&b3,NULL,NULL,WINCOLOR);
|
||
define(-1,10,115,100,12,1,label,"Sn<EFBFBD>mk<EFBFBD>");
|
||
define(110,10,115,30,10,1,input_line,20,1,15,"%2d");set_default(strs(1));property(&b3,NULL,NULL,WINCOLOR);
|
||
on_control_exit(test_int);
|
||
define(120,10,130,60,20,1,button,"Zalo<EFBFBD>it");property(&b1,NULL,NULL,WINCOLOR);
|
||
on_control_change(add_graphics);
|
||
define(130,10,160,110,50,1,radio_butts,4,"St<EFBFBD>na","Podlaha","Strop","Oblouk");c_default(0);on_control_change(refresh_scrs);
|
||
|
||
define(-1,5,230,110,110,1,label,"");property(&b2,NULL,NULL,WINCOLOR);
|
||
define(-1,10,230,100,10,1,label,"Vyber grafiku:");
|
||
define(140,10,255,100,10,1,str_line,side_names);on_enter(string_list_sup);c_default(0);property(&b2,NULL,NULL,WINCOLOR);
|
||
define(-1,10,270,100,12,1,label,"Sn<EFBFBD>mek");
|
||
define(150,10,270,30,12,1,input_line,20,1,15,"%2d");set_default(strs(1));property(&b3,NULL,NULL,WINCOLOR);
|
||
on_control_exit(test_int);
|
||
define(160,10,300,100,10,1,check_box,"Hlavn<EFBFBD>");c_default(0);on_control_change(clear_switchs);
|
||
define(170,10,312,100,10,1,check_box,"Lev<EFBFBD>");c_default(0);on_control_change(clear_switchs);
|
||
define(180,10,324,100,10,1,check_box,"Prav<EFBFBD>");c_default(0);on_control_change(clear_switchs);
|
||
define(190,20,345,80,20,1,button,"P<EFBFBD>i<EFBFBD>adit");property(&b1,NULL,NULL,WINCOLOR);on_control_change(zmenit);
|
||
define(200,20,370,80,20,1,button,"Vymazat");property(&b1,NULL,NULL,WINCOLOR);on_control_change(vymazat);
|
||
define(200,20,395,80,20,1,button,"N<EFBFBD>hled");property(&b1,NULL,NULL,WINCOLOR);on_control_change(nahled);
|
||
define(-1,130,20,1,400,1,label,"");property(def_border(4,WINCOLOR),NULL,NULL,WINCOLOR);
|
||
define(-1,100,30,1,1,1,label,"Tv<EFBFBD>rce");
|
||
define(-1,100,45,1,1,1,label,"grafick<EFBFBD>ch");
|
||
define(-1,100,60,1,1,1,label,"script<EFBFBD>");
|
||
}
|
||
else
|
||
{
|
||
select_window(pcxview_win);
|
||
}
|
||
redraw_window();
|
||
get_directory();
|
||
}
|