mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-13 09:52:01 -04:00
942 lines
22 KiB
C
942 lines
22 KiB
C
//CHARACTER GENERATOR
|
|
#include <platform/platform.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <malloc.h>
|
|
#include <math.h>
|
|
|
|
|
|
#include <libs/types.h>
|
|
#include <libs/event.h>
|
|
#include <libs/memman.h>
|
|
#include <libs/devices.h>
|
|
#include <libs/bmouse.h>
|
|
#include <libs/bgraph.h>
|
|
#include <platform/sound.h>
|
|
#include <libs/gui.h>
|
|
#include <libs/basicobj.h>
|
|
#include "engine1.h"
|
|
#include <libs/pcx.h>
|
|
#include "globals.h"
|
|
#include <stddef.h>
|
|
|
|
//there is defined procedures from source "INV.C"
|
|
|
|
void display_items_wearing(THUMAN *h);
|
|
void inv_display_vlastnosti();;
|
|
extern void (*inv_redraw)(char);
|
|
void write_human_big_name(char *c);
|
|
|
|
#define MSG_COLOR1 RGB555(30,30,23)
|
|
|
|
|
|
#define MAX_XICHTS 8
|
|
#define MAX_CHARS 6
|
|
|
|
#define XICHT_STEP 40
|
|
|
|
#define INV_DESK 266
|
|
#define INV_DESK_Y (SCREEN_OFFLINE)
|
|
#define INV_DESC_X 285
|
|
#define INV_DESC_Y (SCREEN_OFFLINE+20)
|
|
#define HUMAN_X 40
|
|
#define HUMAN_Y 328
|
|
|
|
|
|
#define X_SKIP_X 64
|
|
#define X_SKIP_Y 85
|
|
|
|
typedef struct staty
|
|
{
|
|
int zivl;
|
|
int zivh;
|
|
int manl;
|
|
int manh;
|
|
int konl;
|
|
int konh;
|
|
int akc;
|
|
}T_STATY;
|
|
|
|
static T_STATY cur_stats;
|
|
|
|
word color_butt_on[7]={0,RGB555(31,27,4),RGB555(30,26,4),RGB555(29,25,4)};
|
|
word color_butt_off[7]={0,RGB555(10,10,10),RGB555(10,10,10),RGB555(10,10,10)};
|
|
|
|
|
|
typedef struct vlasts
|
|
{
|
|
int sill;
|
|
int silh;
|
|
int smgl;
|
|
int smgh;
|
|
int pohl;
|
|
int pohh;
|
|
int obrl;
|
|
int obrh;
|
|
int hpreg;
|
|
int mpreg;
|
|
int vpreg;
|
|
}T_VLASTS;
|
|
|
|
static T_VLASTS cur_vls;
|
|
static T_VLASTS rohy[9]=
|
|
{
|
|
{17,22, 5,10,17,22, 9,14, 3, 2, 3},
|
|
{13,18,10,15,20,25, 5,10, 3, 3, 2},
|
|
{ 9,14,15,20,17,22, 9,14, 3, 3, 2},
|
|
{ 5,10,20,25,13,18,13,18, 2, 4, 2},
|
|
{ 9,14,15,20, 9,14,17,22, 2, 3, 2},
|
|
{13,18,10,15, 5,10,20,25, 2, 2, 4},
|
|
{17,22, 5,10, 9,14,17,22, 3, 1, 2},
|
|
{20,25, 0, 5,13,18,13,18, 4, 1, 2},
|
|
{12,17,12,17,12,17,12,17, 2, 2, 2},
|
|
};
|
|
|
|
#define CALC_DIFF(x,y,angl) ((x)+(((((y)-(x))<<4)*((angl)<<4)/720+8)>>4))
|
|
#define CALC_DIFF2(x,y,pol) ((x)+(((((y)-(x))<<4)*((pol)<<4)/(PERLA_MAXPOLOMER<<4)+8)>>4))
|
|
#define DIFF_RAND(x,y) ((x)+rnd((y)-(x)+1))
|
|
|
|
#define MAX_RACES 5
|
|
static uint8_t women[MAX_XICHTS]={0,0,0,0,1,1,1,1};
|
|
static uint8_t poradi[MAX_XICHTS]={0,2,3,4,1,5,6,7};
|
|
static uint8_t disable[MAX_XICHTS];
|
|
static int cur_edited=0;
|
|
static int cur_angle=90;
|
|
static int cur_polomer=0;
|
|
static int cur_xicht=-1;
|
|
static char shut_downing_text=0;
|
|
static int save_values[POCET_POSTAV][2];
|
|
static char del_mode=0;
|
|
static char was_enter=0;
|
|
|
|
|
|
#define PERLA_STRED_X (INV_DESK+189)
|
|
#define PERLA_STRED_Y (INV_DESK_Y+217)
|
|
|
|
|
|
#define PERLA_POLOMER cur_polomer
|
|
#define PERLA_MAXPOLOMER 75
|
|
short *pod_perlou=NULL;
|
|
short pod_perlou_x=0;
|
|
short pod_perlou_y=0;
|
|
char *error_text=NULL;
|
|
|
|
|
|
|
|
static char select_xicht(int id,int xa,int ya,int xr,int yr);
|
|
static char vol_vlastnosti(int id,int xa,int ya,int xr,int yr);
|
|
static char go_next_page(int id,int xa,int ya,int xr,int yr);
|
|
char vls_click(int id,int xa,int ya,int xr,int yr);
|
|
static char view_another_click2(int id,int xa,int ya,int xr,int yr);
|
|
//char edit_another_click(int id,int xa,int ya,int xr,int yr);
|
|
//static char edit_another_click2(int id,int xa,int ya,int xr,int yr);
|
|
static char gen_exit_editor(int id,int xa,int ya,int xr,int yr);
|
|
|
|
static void zobraz_staty(T_VLASTS *st);
|
|
|
|
#define CLK_PAGE1 6
|
|
|
|
|
|
static T_CLK_MAP clk_page1[]=
|
|
{
|
|
{0,28+INV_DESK,18+INV_DESK_Y,334+INV_DESK,55+INV_DESK_Y,select_xicht,2,-1},
|
|
{0,78+INV_DESK,97+INV_DESK_Y,314+INV_DESK,340+INV_DESK_Y,vol_vlastnosti,2+1,-1},
|
|
{-1,520,378,639,479,go_next_page,2,-1},
|
|
//{-1,54,378,497,479,edit_another_click,2+8,-1},
|
|
{2,0,0,639,479,gen_exit_editor,8,-1},
|
|
{0,0,0,639,479,empty_clk,0xff,-1},
|
|
};
|
|
|
|
#define CLK_PAGE2 5
|
|
|
|
static T_CLK_MAP clk_page2[]=
|
|
{
|
|
{-1,INV_DESK,INV_DESK_Y,639,378,vls_click,2,-1},
|
|
{-1,520,378,639,479,go_next_page,2,-1},
|
|
{-1,54,378,497,479,view_another_click2,2,-1},
|
|
{1,0,0,639,479,gen_exit_editor,8,-1},
|
|
{0,0,0,639,479,empty_clk,0xff,-1},
|
|
};
|
|
#define CLK_PAGE3 4
|
|
|
|
/*static T_CLK_MAP clk_page3[]=
|
|
{
|
|
{-1,520,378,639,479,go_next_page,2,-1},
|
|
{-1,54,378,497,479,view_another_click2,2+8,-1},
|
|
{0,0,0,639,479,edit_another_click2,8,-1},
|
|
{0,0,0,639,479,empty_clk,0xff,-1},
|
|
};
|
|
*/
|
|
|
|
|
|
#define H_GENERACE (H_MENUS_FREE+100)
|
|
#define H_GEN_PERLA (H_MENUS_FREE+101)
|
|
#define H_GEN_TOPBAR (H_MENUS_FREE+102)
|
|
#define H_GEN_OKBUTT (H_MENUS_FREE+103)
|
|
#define H_GEN_CHARGEN (H_MENUS_FREE+104)
|
|
#define H_GEN_CHARGENB (H_MENUS_FREE+105)
|
|
#define H_GEN_CHARGENM (H_MENUS_FREE+106)
|
|
#define H_GEN_XICHTY (H_MENUS_FREE+107)
|
|
#define H_GEN_POSTAVY (H_GEN_XICHTY+MAX_XICHTS)
|
|
|
|
TDREGISTERS char_gen_reg[]=
|
|
{
|
|
{H_GENERACE,"postavy.pcx",pcx_15bit_decomp,SR_BGRAFIKA},
|
|
{H_GEN_PERLA,"perla.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
|
|
{H_GEN_TOPBAR,"topbar_p.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
|
|
{H_GEN_CHARGEN,"chargen.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
|
|
{H_GEN_CHARGENB,"chargenb.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
|
|
{H_GEN_CHARGENM,"chargenm.pcx",pcx_8bit_decomp,SR_BGRAFIKA},
|
|
};
|
|
|
|
#define BOTT 378
|
|
#define LEFT 520
|
|
|
|
char *b_texty[4];
|
|
char b_disables;
|
|
|
|
void displ_button(char disable,char **text)
|
|
{
|
|
int posy[]={0,18,37,55};
|
|
int sizy[]={18,20,20,21};
|
|
int i;
|
|
|
|
int32_t scr_linelen2 = GetScreenPitch();
|
|
|
|
set_font(H_FTINY,0);
|
|
put_picture(LEFT,BOTT,ablock(H_GEN_CHARGEN));
|
|
for(i=0;i<4;i++)
|
|
{
|
|
if (disable & 1)
|
|
{
|
|
put_8bit_clipped(ablock(H_GEN_CHARGENB),(392+posy[i])*scr_linelen2+524+GetScreenAdr(),posy[i],96,sizy[i]);
|
|
font_color(color_butt_off);
|
|
}
|
|
else
|
|
{
|
|
font_color(color_butt_on);
|
|
}
|
|
disable>>=1;
|
|
set_aligned_position(LEFT+50,BOTT+14+13+i*19,1,2,*text);
|
|
outtext(*text);
|
|
text++;
|
|
}
|
|
}
|
|
static void draw_other_bar()
|
|
{
|
|
int i;
|
|
int32_t scr_linelen2 = GetScreenPitch();
|
|
|
|
const word *bbar=ablock(H_BOTTBAR);
|
|
word *screen=GetScreenAdr()+(480-102)*scr_linelen2;
|
|
for (i=0;i<102;i++,screen+=scr_linelen2,bbar+=scr_linelen2) memcpy(screen,bbar,scr_linelen2*2);
|
|
//put_8bit_clipped(ablock(H_GEN_OKBUTT),378*640+520+screen,0,120,102);
|
|
displ_button(b_disables,b_texty);
|
|
put_picture(0,0,ablock(H_GEN_TOPBAR));
|
|
zobraz_staty(&cur_vls);
|
|
}
|
|
|
|
|
|
static void display_character(THUMAN *p,char i)
|
|
{
|
|
const word *w;
|
|
put_picture(4,SCREEN_OFFLINE,ablock(H_IOBLOUK));
|
|
if (p->used)
|
|
{
|
|
w=ablock(H_GEN_POSTAVY+(p->xicht));
|
|
put_picture(HUMAN_X+30,HUMAN_Y-w[1],w);
|
|
}
|
|
if (i) draw_other_bar();
|
|
}
|
|
static void zobraz_error_text()
|
|
{
|
|
if (error_text!=NULL)
|
|
{
|
|
trans_bar(0,362,640,16,0);
|
|
set_font(H_FONT6,RGB555(31,31,0));
|
|
position(10,364);outtext(error_text);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
static void vypocet_perly(int angle,int xp,int yp,int *x,int *y)
|
|
{
|
|
float xr,yr;
|
|
float rad;
|
|
|
|
rad=angle*3.14159265f/180;
|
|
xr=(float)cos(rad)*PERLA_POLOMER;
|
|
yr=(float)sin(rad)*PERLA_POLOMER;
|
|
*x=(int)xr+PERLA_STRED_X;
|
|
*y=PERLA_STRED_Y-(int)yr;
|
|
x[0]-=xp>>1;
|
|
y[0]-=yp>>1;
|
|
}
|
|
|
|
static void zobraz_perlu(void)
|
|
{
|
|
const word *perla;
|
|
int x,y;
|
|
word *scr,*sss;
|
|
char *p;
|
|
const word *b;
|
|
int xs,ys,xxs;
|
|
|
|
int32_t scr_linelen2 = GetScreenPitch();
|
|
|
|
alock(H_GEN_PERLA);
|
|
perla=ablock(H_GEN_PERLA);
|
|
if (pod_perlou==NULL)
|
|
{
|
|
pod_perlou=getmem(perla[0]*perla[1]*2+6);
|
|
}
|
|
vypocet_perly(cur_angle,perla[0],perla[1],&x,&y);
|
|
xs=perla[0];ys=perla[1];
|
|
get_picture(x,y,xs,ys,pod_perlou);
|
|
sss=x+scr_linelen2*y+GetScreenAdr();
|
|
p=(char *)(perla+256+3);
|
|
b=perla+3;
|
|
for(;ys>0;ys--)
|
|
{
|
|
scr=sss;
|
|
for(xxs=0;xxs<xs;xxs++)
|
|
if (!*p) scr++,p++;else
|
|
if (*p<128) *scr++=b[(uint8_t)*p++];else
|
|
{
|
|
*scr=(*scr & RGB555(30,30,30))>>1;
|
|
scr++;p++;
|
|
}
|
|
sss+=scr_linelen2;
|
|
}
|
|
//put_picture(x,y,perla);
|
|
pod_perlou_x=x;
|
|
pod_perlou_y=y;
|
|
aunlock(H_GEN_PERLA);
|
|
}
|
|
|
|
static void schovej_perlu(void)
|
|
{
|
|
put_picture(pod_perlou_x,pod_perlou_y,pod_perlou);
|
|
}
|
|
|
|
static void vypocet_vlastnosti(int angle,T_VLASTS *vls)
|
|
{
|
|
T_VLASTS *low,*hi;
|
|
div_t rm;
|
|
int p;
|
|
|
|
rm=div(angle,45);
|
|
p=rm.quot;
|
|
low=rohy+p;p++;if (p>=8) p=0;
|
|
hi=rohy+p;
|
|
// CALC_DIFF(8,12,44);
|
|
vls->sill=CALC_DIFF(low->sill,hi->sill,rm.rem);
|
|
vls->silh=CALC_DIFF(low->silh,hi->silh,rm.rem);
|
|
vls->smgl=CALC_DIFF(low->smgl,hi->smgl,rm.rem);
|
|
vls->smgh=CALC_DIFF(low->smgh,hi->smgh,rm.rem);
|
|
vls->obrl=CALC_DIFF(low->obrl,hi->obrl,rm.rem);
|
|
vls->obrh=CALC_DIFF(low->obrh,hi->obrh,rm.rem);
|
|
vls->pohl=CALC_DIFF(low->pohl,hi->pohl,rm.rem);
|
|
vls->pohh=CALC_DIFF(low->pohh,hi->pohh,rm.rem);
|
|
vls->hpreg=CALC_DIFF(low->hpreg,hi->hpreg,rm.rem);
|
|
vls->mpreg=CALC_DIFF(low->mpreg,hi->mpreg,rm.rem);
|
|
vls->vpreg=CALC_DIFF(low->vpreg,hi->vpreg,rm.rem);
|
|
low=&rohy[8];hi=vls;rm.rem=PERLA_POLOMER;
|
|
vls->sill=CALC_DIFF2(low->sill,hi->sill,rm.rem);
|
|
vls->silh=CALC_DIFF2(low->silh,hi->silh,rm.rem);
|
|
vls->smgl=CALC_DIFF2(low->smgl,hi->smgl,rm.rem);
|
|
vls->smgh=CALC_DIFF2(low->smgh,hi->smgh,rm.rem);
|
|
vls->obrl=CALC_DIFF2(low->obrl,hi->obrl,rm.rem);
|
|
vls->obrh=CALC_DIFF2(low->obrh,hi->obrh,rm.rem);
|
|
vls->pohl=CALC_DIFF2(low->pohl,hi->pohl,rm.rem);
|
|
vls->pohh=CALC_DIFF2(low->pohh,hi->pohh,rm.rem);
|
|
vls->hpreg=CALC_DIFF2(low->hpreg,hi->hpreg,rm.rem);
|
|
vls->mpreg=CALC_DIFF2(low->mpreg,hi->mpreg,rm.rem);
|
|
vls->vpreg=CALC_DIFF2(low->vpreg,hi->vpreg,rm.rem);
|
|
}
|
|
|
|
/*static void vypocet_statu(T_VLASTS *vls,T_STATY *sts)
|
|
{
|
|
sts->zivl=vls->sill*3/2;
|
|
sts->zivh=vls->silh*3/2;
|
|
sts->manl=vls->smgl*2;
|
|
sts->manh=vls->smgh*2;
|
|
sts->konl=vls->obrl*2;
|
|
sts->konh=vls->obrh*2;
|
|
sts->akc=(((vls->pohl+vls->pohh)/2)+14)/15;
|
|
}
|
|
*/
|
|
|
|
static void zobraz_staty(T_VLASTS *st)
|
|
{
|
|
char s[100];
|
|
|
|
set_font(H_FTINY,0);font_color(color_topbar);
|
|
sprintf(s,texty[2],st->sill,st->silh);
|
|
position(230,2);outtext(s);
|
|
sprintf(s,texty[3],st->smgl,st->smgh);
|
|
position(330,2);outtext(s);
|
|
sprintf(s,texty[4],st->pohl,st->pohh);
|
|
position(430,2);outtext(s);
|
|
sprintf(s,texty[5],st->obrl,st->obrh);
|
|
position(530,2);outtext(s);
|
|
}
|
|
|
|
|
|
void redraw_generator(char show)
|
|
{
|
|
T_STATY z;
|
|
int i;
|
|
memset(&z,20,sizeof(z));
|
|
schovej_mysku();
|
|
put_picture(INV_DESK,SCREEN_OFFLINE,ablock(H_GENERACE));
|
|
if (cur_xicht==-1)
|
|
{
|
|
put_picture(4,SCREEN_OFFLINE,ablock(H_IOBLOUK));
|
|
bott_draw(1);
|
|
draw_other_bar();
|
|
}
|
|
else display_character(postavy+cur_edited,1);
|
|
zobraz_error_text();
|
|
zobraz_perlu();
|
|
for(i=0;i<MAX_XICHTS;i++)
|
|
{
|
|
if (disable[poradi[i]])
|
|
trans_bar(28+INV_DESK+i*XICHT_STEP,18+INV_DESK_Y,26,38,0);
|
|
}
|
|
ukaz_mysku();
|
|
if (show) showview(0,0,0,0);
|
|
}
|
|
|
|
|
|
static void set_xicht(int player,int xicht)
|
|
{
|
|
THUMAN *h=postavy+player;
|
|
h->used=1;
|
|
h->xicht=xicht;
|
|
h->vlastnosti[VLS_MAXHIT]=1;
|
|
h->vlastnosti[VLS_KONDIC]=1;
|
|
h->lives=1;
|
|
h->kondice=0;
|
|
h->mana=0;
|
|
h->sektor=viewsector;
|
|
h->groupnum=1;
|
|
h->jidlo=1;
|
|
h->voda=1;
|
|
h->bonus=0;
|
|
h->spell=0;
|
|
}
|
|
|
|
static char select_xicht(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
int i,j,k;
|
|
char s[20];
|
|
|
|
i=xr/XICHT_STEP;
|
|
j=xr%XICHT_STEP;
|
|
if (j>27) return 0;
|
|
k=poradi[i];
|
|
if (disable[k]) return 1;
|
|
memset(disable,0,sizeof(disable));
|
|
set_xicht(cur_edited,cur_xicht=k);
|
|
postavy[cur_edited].female=women[i];
|
|
b_disables=0x6;
|
|
if (was_enter) send_message(E_KEYBOARD,13);
|
|
else
|
|
{
|
|
strcpy(postavy[cur_edited].jmeno,texty[160+i]);
|
|
send_message(E_KEYBOARD,27);
|
|
was_enter=0;
|
|
}
|
|
sprintf(s,XICHT_NAME,k);
|
|
def_handle(H_XICHTY+cur_edited,s,pcx_8bit_decomp,SR_BGRAFIKA);
|
|
sprintf(s,CHAR_NAME,k);
|
|
def_handle(H_POSTAVY+cur_edited,s,pcx_8bit_decomp,SR_BGRAFIKA);
|
|
for(j=0;j<POCET_POSTAV;j++) if (postavy[j].used) disable[postavy[j].xicht]=1;
|
|
error_text=NULL;
|
|
bott_draw(1);
|
|
redraw_generator(1);
|
|
displ_button(b_disables,b_texty);
|
|
showview(0,0,0,0);
|
|
id,xa,ya,xr,yr;
|
|
return 1;
|
|
}
|
|
|
|
static char vol_vlastnosti(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
int a;
|
|
static char cancel=1;
|
|
|
|
id,xa,ya,xr,yr;
|
|
if (!ms_last_event.tl1)
|
|
{
|
|
cancel=1;
|
|
return 0;
|
|
}
|
|
if (ms_last_event.event_type & 0x2) {
|
|
if (xa<pod_perlou_x || ya<pod_perlou_y || xa>pod_perlou_x+pod_perlou[0] || ya>pod_perlou_y+pod_perlou[1] )
|
|
{
|
|
cancel=1;
|
|
return 0;
|
|
}
|
|
else cancel=0;
|
|
}
|
|
if (cancel) return 0;
|
|
xr=xa-PERLA_STRED_X;
|
|
yr=-(ya-PERLA_STRED_Y);
|
|
a=(int)(atan2((double)yr,(double)xr)*180/3.14159265);
|
|
cur_polomer=(int)sqrt(xr*xr+yr*yr);
|
|
if (cur_polomer>PERLA_MAXPOLOMER) cur_polomer=PERLA_MAXPOLOMER;
|
|
xa=pod_perlou_x;
|
|
ya=pod_perlou_y;
|
|
schovej_mysku();
|
|
schovej_perlu();
|
|
if (a<0) a+=360;
|
|
vypocet_vlastnosti(a,&cur_vls);
|
|
cur_angle=a;
|
|
zobraz_perlu();
|
|
ukaz_mysku();
|
|
update_mysky();
|
|
showview(pod_perlou_x,pod_perlou_y,pod_perlou[0],pod_perlou[1]);
|
|
showview(xa,ya,pod_perlou[0],pod_perlou[1]);
|
|
put_picture(0,0,ablock(H_GEN_TOPBAR));
|
|
zobraz_staty(&cur_vls);
|
|
showview(250,0,640,17);
|
|
return 1;
|
|
}
|
|
|
|
static int edit_task=-1;
|
|
|
|
static void edit_name()
|
|
{
|
|
if (shut_downing_text) return;
|
|
curcolor=0;bar32(120,2,120+104,16);
|
|
edit_task=add_task(16384,type_text_v2,postavy[cur_edited].jmeno,120,2,104,
|
|
sizeof(postavy[cur_edited].jmeno)-1,H_FONT6,RGB555(31,31,0),edit_name);
|
|
}
|
|
|
|
static void stop_edit_name()
|
|
{
|
|
shut_downing_text=1;send_message(E_KEYBOARD,13);
|
|
task_sleep();
|
|
if (edit_task>0 && is_running(edit_task))
|
|
term_task(edit_task);
|
|
shut_downing_text=0;
|
|
}
|
|
|
|
/*static char edit_another_click(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
short *w;
|
|
|
|
id,xa,ya,xr,yr;
|
|
w=ablock(H_OKNO);
|
|
id=xr/w[0];
|
|
if (!postavy[id].used) return 0;
|
|
shut_downing_text=1;
|
|
send_message(E_KEYBOARD,13);
|
|
shut_downing_text=0;
|
|
save_values[cur_edited][0]=cur_angle;
|
|
save_values[cur_edited][1]=cur_polomer;
|
|
select_player=cur_edited=id;
|
|
cur_angle=save_values[cur_edited][0];
|
|
cur_polomer=save_values[cur_edited][1];
|
|
vypocet_vlastnosti(cur_angle,&cur_vls);
|
|
cur_xicht=postavy[cur_edited].xicht;
|
|
edit_name();
|
|
bott_draw(1);
|
|
redraw_generator();
|
|
return 1;
|
|
}
|
|
*/
|
|
|
|
|
|
static void def_entries()
|
|
{
|
|
int i;
|
|
int s;
|
|
TDREGISTERS *p;
|
|
|
|
s=sizeof(char_gen_reg)/sizeof(TDREGISTERS);
|
|
p=char_gen_reg;
|
|
for(i=0;i<s;i++,p++) def_handle(p->h_num,p->name,p->proc,p->path);
|
|
for(i=0;i<MAX_XICHTS;i++)
|
|
{
|
|
char s[15];
|
|
|
|
sprintf(s,CHAR_NAME,i);
|
|
def_handle(H_GEN_POSTAVY+i,s,pcx_8bit_decomp,SR_BGRAFIKA);
|
|
mix_back_sound(0);
|
|
}
|
|
for(i=0;i<MAX_XICHTS;i++)
|
|
{
|
|
char s[15];
|
|
|
|
sprintf(s,XICHT_NAME,i);
|
|
def_handle(H_GEN_XICHTY+i,s,pcx_8bit_decomp,SR_BGRAFIKA);
|
|
mix_back_sound(0);
|
|
}
|
|
}
|
|
|
|
static char go_next_page(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
const word *w;
|
|
char *b;
|
|
|
|
xa,ya;
|
|
w=ablock(H_GEN_CHARGENM);
|
|
b=(char *)(w+3+256);
|
|
b+=*w*yr+xr;
|
|
if (!*b) return 1;
|
|
id=*b-1;
|
|
if (b_disables & (1<<id)) return 1;
|
|
send_message(E_CLOSE_GEN,id);
|
|
return 1;
|
|
}
|
|
|
|
|
|
void generuj_postavu(THUMAN *h)
|
|
{
|
|
short *v;
|
|
h->used=1;
|
|
h->groupnum=1;
|
|
v=h->stare_vls;
|
|
v[VLS_SILA]=DIFF_RAND(cur_vls.sill,cur_vls.silh);
|
|
v[VLS_SMAGIE]=DIFF_RAND(cur_vls.smgl,cur_vls.smgh);
|
|
v[VLS_POHYB]=DIFF_RAND(cur_vls.pohl,cur_vls.pohh);
|
|
v[VLS_OBRAT]=DIFF_RAND(cur_vls.obrl,cur_vls.obrh);
|
|
v[VLS_HPREG]=cur_vls.hpreg;
|
|
v[VLS_MPREG]=cur_vls.mpreg;
|
|
v[VLS_VPREG]=cur_vls.vpreg;
|
|
// v[VLS_THIEF]=cur_vls.vpreg;
|
|
h->lives=v[VLS_MAXHIT]=(v[VLS_SILA]*3+v[VLS_POHYB])/2;
|
|
h->mana=v[VLS_MAXMANA]=v[VLS_SMAGIE]*2;
|
|
h->kondice=v[VLS_KONDIC]=v[VLS_OBRAT]*2;
|
|
v[VLS_OBRAN_L]=1;
|
|
v[VLS_OBRAN_H]=2;
|
|
v[VLS_UTOK_L]=1;
|
|
v[VLS_UTOK_H]=2;
|
|
prepocitat_postavu(h);
|
|
h->inv_size=6;
|
|
h->level=1;
|
|
h->exp=0;
|
|
h->bonus=5;
|
|
h->jidlo=MAX_HLAD(h);
|
|
h->voda=MAX_ZIZEN(h);
|
|
h->mana_battery=32767;
|
|
//postava je vygenerovana
|
|
}
|
|
|
|
static void redraw_page3(char _)
|
|
{
|
|
update_mysky();
|
|
schovej_mysku();
|
|
curcolor=0;
|
|
inv_display_vlastnosti();
|
|
display_character(postavy+cur_edited,1);
|
|
write_human_big_name(postavy[cur_edited].jmeno);
|
|
draw_other_bar();
|
|
displ_button(b_disables,b_texty);
|
|
ukaz_mysku();
|
|
showview(0,0,0,0);
|
|
inv_redraw=redraw_page3;
|
|
}
|
|
|
|
|
|
static void redraw_svitek(char _)
|
|
{
|
|
if (postavy[cur_edited].bonus==0)
|
|
{
|
|
char mode;
|
|
mode=7;
|
|
if (postavy[charmin-1].used) mode&=~2;
|
|
if (!postavy[charmax-1].used) mode&=~1;
|
|
if (!del_mode) mode&=~4;
|
|
b_disables=mode;
|
|
redraw_page3(0);
|
|
return;
|
|
}
|
|
update_mysky();
|
|
schovej_mysku();
|
|
curcolor=0;
|
|
bar32(0,16,30,16+360);
|
|
bar32(620,16,640,16+360);
|
|
inv_display_vlastnosti();
|
|
display_character(postavy+cur_edited,0);
|
|
// display_items_wearing(human_selected);
|
|
// write_pocet_sipu();
|
|
// display_rings();
|
|
zobraz_error_text();
|
|
displ_button(b_disables,b_texty);
|
|
ukaz_mysku();
|
|
showview(0,0,0,0);
|
|
inv_redraw=redraw_svitek;
|
|
}
|
|
|
|
|
|
static char validate_character(THUMAN *h)
|
|
{
|
|
if (h->jmeno[0]==0) error_text=texty[111];
|
|
else error_text=NULL;
|
|
return error_text==NULL;
|
|
}
|
|
|
|
/*static char edit_another_click2(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
id,xa,ya,xr,yr;
|
|
cur_edited=select_player;
|
|
schovej_mysku();
|
|
edit_name();
|
|
draw_other_bar();
|
|
send_message(E_CLOSE_GEN,0);
|
|
ukaz_mysku();
|
|
update_mysky();
|
|
return 1;
|
|
}
|
|
*/
|
|
static void empty_proc(void)
|
|
{
|
|
}
|
|
|
|
char potvrzeno(char *text,void (*redraw)(char))
|
|
{
|
|
int i;
|
|
unwire_proc=empty_proc;
|
|
stop_edit_name();
|
|
i=message(2,0,1,texty[118],text,texty[114],texty[115])==0;
|
|
redraw(0);
|
|
edit_name();
|
|
return i;
|
|
}
|
|
|
|
static char view_another_click2(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
const short *w;
|
|
|
|
id,xa,ya,xr,yr;
|
|
w=ablock(H_OKNO);
|
|
id=xr/w[0];
|
|
if (!(~b_disables & 0x3)) return 1;
|
|
if (!postavy[id].used) return 0;
|
|
shut_downing_text=1;send_message(E_KEYBOARD,13);
|
|
shut_downing_text=0;
|
|
select_player=id;
|
|
bott_draw(1);
|
|
human_selected=postavy+id;
|
|
cur_edited=id;
|
|
edit_name();
|
|
redraw_page3(0);
|
|
if (del_mode)
|
|
if (potvrzeno(texty[117],redraw_page3))
|
|
{
|
|
del_mode=0;
|
|
postavy[cur_edited].used=0;
|
|
disable[postavy[cur_edited].xicht]=0;
|
|
send_message(E_CLOSE_GEN,0);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
static void wait_timer(EVENT_MSG *msg, void **udata) {
|
|
if (msg->msg == E_TIMER) {
|
|
exit_wait = 1;
|
|
}
|
|
}
|
|
|
|
void effect_show(va_list args)
|
|
{
|
|
int i;
|
|
char s = exit_wait;
|
|
schovej_mysku();
|
|
for(i=0;i<12;i++)
|
|
{
|
|
showview(0,240-i*20-20,640,20);
|
|
showview(0,240+(i*20),640,20);
|
|
if (q_current_task() != -1) {
|
|
task_wait_event(E_TIMER);
|
|
} else {
|
|
send_message(E_ADD, E_TIMER, wait_timer);
|
|
escape();
|
|
exit_wait = s;
|
|
send_message(E_DONE, E_TIMER, wait_timer);
|
|
}
|
|
}
|
|
ukaz_mysku();
|
|
}
|
|
|
|
|
|
static void enter_reaction(EVENT_MSG *msg,void **unused)
|
|
{
|
|
unused;
|
|
if (msg->msg==E_KEYBOARD)
|
|
{
|
|
int c = va_arg(msg->data, int);
|
|
if ((c >> 1) == 1 || c == E_QUIT_GAME_KEY) {
|
|
gen_exit_editor(2,0,0,0,0);
|
|
return;
|
|
} else if ((c & 0xFF)==13 && !shut_downing_text)
|
|
{
|
|
send_message(E_KEYBOARD,13);
|
|
bott_draw(1);
|
|
redraw_generator(1);
|
|
msg->msg=-1;
|
|
was_enter=1;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void enter_reaction2(EVENT_MSG *msg,void **_)
|
|
{
|
|
int c = va_arg(msg->data, int);
|
|
if ((c >> 1) == 1 || c == E_QUIT_GAME_KEY) {
|
|
gen_exit_editor(1,0,0,0,0);
|
|
return;
|
|
}
|
|
if (msg->msg==E_KEYBOARD && (c & 0xFF)==13 && !shut_downing_text && ~b_disables & 0x3)
|
|
{
|
|
send_message(E_KEYBOARD,13);
|
|
bott_draw(1);
|
|
redraw_page3(0);
|
|
msg->msg=-1;
|
|
}
|
|
}
|
|
|
|
|
|
char gen_exit_editor(int id,int xa,int ya,int xr,int yr)
|
|
{
|
|
xa,ya,xr,yr,id;
|
|
|
|
if (del_mode==1)
|
|
{
|
|
del_mode=0;
|
|
mouse_set_default(H_MS_DEFAULT);
|
|
b_disables&=~0x4;
|
|
redraw_svitek(0);
|
|
return 1;
|
|
}
|
|
unwire_proc=empty_proc;
|
|
shut_downing_text=1;send_message(E_KEYBOARD,13);shut_downing_text=0;
|
|
if (message(2,0,1,texty[118],texty[113],texty[114],texty[115])==0)
|
|
{
|
|
send_message(E_CLOSE_GEN,255);
|
|
}
|
|
else
|
|
{
|
|
game_display_cancel_quit_request();
|
|
if (id==2)redraw_generator(1);
|
|
else redraw_svitek(0);
|
|
edit_name();
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
char enter_generator()
|
|
{
|
|
int i;
|
|
char rep=0;
|
|
|
|
znova:
|
|
del_mode=0;
|
|
stop_edit_name();
|
|
b_texty[0]=texty[170];
|
|
b_texty[1]=texty[171];
|
|
b_texty[2]=texty[172];
|
|
b_texty[3]=texty[173];
|
|
def_entries();
|
|
curcolor=0;bar32(0,0,639,479);
|
|
cur_angle=315;
|
|
cur_edited=0;
|
|
memset(postavy,0,sizeof(postavy));
|
|
memset(disable,0,sizeof(disable));
|
|
memset(save_values,0,sizeof(save_values));
|
|
do
|
|
{
|
|
mouse_set_default(H_MS_DEFAULT);
|
|
cur_angle=save_values[cur_edited][0];
|
|
cur_polomer=save_values[cur_edited][1];
|
|
set_xicht(cur_edited,cur_xicht=-1);
|
|
select_player=-1;
|
|
memset(&cur_stats,0,sizeof(cur_stats));
|
|
vypocet_vlastnosti(cur_angle,&cur_vls);
|
|
b_disables=0x7;
|
|
redraw_generator(rep);if (!rep)effect_show(NULL);rep=1;
|
|
edit_name();
|
|
change_click_map(clk_page1,CLK_PAGE1);
|
|
was_enter=0;
|
|
do
|
|
{
|
|
send_message(E_ADD,E_KEYBOARD,enter_reaction);
|
|
EVENT_MSG *ev= task_wait_event(E_CLOSE_GEN);;
|
|
i=ev?va_arg(ev->data, int):255;
|
|
send_message(E_DONE,E_KEYBOARD,enter_reaction);
|
|
if (i==3 && potvrzeno(texty[116],redraw_generator)) goto znova;
|
|
if (i==255) {
|
|
term_task(edit_task);
|
|
return 1;
|
|
}
|
|
}
|
|
while (cur_xicht==-1 || i==3);
|
|
send_message(E_KEYBOARD,13);
|
|
save_values[cur_edited][0]=cur_angle;
|
|
save_values[cur_edited][1]=cur_polomer;
|
|
cur_xicht=0;
|
|
error_text=NULL;
|
|
generuj_postavu(postavy+cur_edited);
|
|
human_selected=postavy+cur_edited;
|
|
b_disables=0x7;
|
|
do
|
|
{
|
|
redraw_svitek(0);
|
|
change_click_map(clk_page2,CLK_PAGE2);
|
|
do
|
|
{
|
|
send_message(E_ADD,E_KEYBOARD,enter_reaction2);
|
|
EVENT_MSG *ev= task_wait_event(E_CLOSE_GEN);;
|
|
i=va_arg(ev->data, int);
|
|
send_message(E_DONE,E_KEYBOARD,enter_reaction2);
|
|
if (i==3 && potvrzeno(texty[116],redraw_svitek)) goto znova;
|
|
if (i==2)
|
|
{
|
|
del_mode=1;
|
|
mouse_set_default(H_MS_WHO);
|
|
b_disables|=0x4;
|
|
redraw_svitek(0);
|
|
i=3;
|
|
}
|
|
}
|
|
while (i==3);
|
|
mouse_set_default(H_MS_DEFAULT);
|
|
del_mode=0;
|
|
send_message(E_KEYBOARD,13);
|
|
if (i==255) return 1;
|
|
if (validate_character(postavy+cur_edited))
|
|
for(cur_edited=0;postavy[cur_edited].used;cur_edited++);
|
|
}
|
|
while (error_text!=NULL);
|
|
stop_edit_name();
|
|
}
|
|
while (i!=1);
|
|
disable_click_map();
|
|
schovej_mysku();
|
|
curcolor=0;
|
|
bar32(0,0,639,479);
|
|
showview(0,0,0,0);
|
|
ukaz_mysku();
|
|
for(i=0;i<3;i++)
|
|
{
|
|
if (postavy[i].vlastnosti[VLS_SILA]>20) postavy[i].stare_vls[VLS_UTOK_H]++;
|
|
if (postavy[i].vlastnosti[VLS_OBRAT]>20) postavy[i].stare_vls[VLS_OBRAN_H]++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|