improved death screen, fix some bugs

This commit is contained in:
Ondřej Novák 2025-02-09 15:41:41 +01:00
parent e40ba67a8d
commit b9953f2d5b
10 changed files with 159 additions and 50 deletions

View file

@ -239,6 +239,7 @@ void chveni(int i)
void objekty_mimo(THE_TIMER *t)
{
if (cur_mode == MD_END_GAME) return;
schovej_mysku();
ukaz_kompas(1);
anim_sipky(0,0);
@ -1304,6 +1305,26 @@ void debug_print()
}
void death_screen() {
trans_bar(0, 0, 640, 480, 0);
int xs;
int ys;
int y = 160;
const char *t = texty[65];
char buff[strlen(t)+4];
set_font(H_FBOLD, RGB555_ALPHA(31,31,31));
zalamovani(t,buff, 440, &xs, &ys);
t = buff;
while (*t) {
set_aligned_position(320, y, 1, 1, t);
outtext(t);
y+=2*text_height(t);
t = t+strlen(t)+1;
}
}
void redraw_scene()
{
if (norefresh) return;
@ -1318,9 +1339,13 @@ void redraw_scene()
if (battle || (game_extras & EX_ALWAYS_MINIMAP)) draw_medium_map();
if (show_debug) debug_print();
other_draw();
if (cur_mode == MD_END_GAME) {
death_screen();
}
ukaz_mysku();
global_anim_counter++;
send_message(E_KOUZLO_ANM);
}
void refresh_scene(THE_TIMER *t)

View file

@ -624,6 +624,19 @@ static int process_actions(const char *command) {
return 0;
}
if (istrcmp(command, "dispel-magic") == 0) {
unaffect();
return 1;
}
if (istrcmp(command, "echoes-of-the-past") == 0) {
const char *lname = local_strdup(level_fname);
leave_current_map();
temp_storage_delete(lname);
load_map(lname);
return 1;
}
return 0;
}
@ -651,6 +664,9 @@ static void wiz_find_monster(const char *name) {
}
}
static int process_with_params(const char *cmd, const char *args) {
if (istrcmp(cmd, "locate") == 0) {
if (args[0] == 0) return 0;
@ -669,8 +685,31 @@ static int process_with_params(const char *cmd, const char *args) {
return 1;
}
}
} if (args[0] == 'm') {
char *end;
unsigned long id = strtoul(args+1, &end, 10);
if (*end == 0) {
ablock(H_ENEMY);
size_t cnt = get_handle_size(H_ENEMY)/sizeof(TMOB);
if (id < cnt) {
int choosen_id = -1;
for (int i = 0; i < MAX_MOBS; ++i) {
if (mobs[i].vlajky & MOB_LIVE) continue;
choosen_id = i;
}
if (choosen_id >= 0) {
const TMOB *t =(TMOB *)ablock(H_ENEMY);
int sect = map_sectors[viewsector].step_next[viewdir];
if (sect) {
load_enemy_to_map(choosen_id, sect, (viewdir+2) & 3, t+id);
return 1;
}
}
}
}
return 0;
}
return 0;
}
if (istrcmp(cmd, "say") == 0) {

View file

@ -54,7 +54,7 @@ char going[]={0,0,1,0,1,1};
static word *mob_paths[MAX_MOBS];
static word *mob_path_ptr[MAX_MOBS];
static int monster_block;
static int monster_block = 0;
void *sound_template=NULL;
@ -2261,3 +2261,33 @@ void regen_all_mobs()
m->lives=m->vlastnosti[VLS_MAXHIT];
}
void load_enemy_to_map(int i, int sector, int dir, const TMOB *t) {
mobs[i]=*t;
if (~mobs[i].vlajky & MOB_MOBILE) mob_map[ sector]=i+MOB_START;
if (mobs[i].palette>0)mobs[i].palette=rnd(mobs[i].palette);else mobs[i].palette=abs(mobs[i].palette);
mobs[i].sector=sector;
mobs[i].dir=dir;
mobs[i].home_pos=sector;
mobs[i].vlajky|=MOB_LIVE;
char s[20];
sprintf(s,"%s.SEQ",mobs[i].mobs_name);
int h = find_handle(s, NULL);
int *grptr = &h;
if (h == -1) {
grptr = &end_ptr;
def_handle(grptr[0]++,s,NULL,SR_ENEMIES);
mobs[i].cislo_vzoru=*grptr-monster_block;
register_mob_graphics(*grptr,mobs[i].mobs_name,mobs[i].anim_counts,ablock(grptr[0]-1));
grptr[0]+=6*16;
register_mob_sounds(*grptr,mobs[i].sounds);
grptr[0]+=4;
sprintf(s,"%s.COL",mobs[i].mobs_name);
def_handle(grptr[0],s,col_load,SR_ENEMIES);
grptr[0]++;
} else {
mobs[i].cislo_vzoru=(h+1)-monster_block;
}
}

View file

@ -652,7 +652,7 @@ extern char marker; //tato promenna je 0, jen v pripade ze je 1 probehne assert
void game_keyboard(EVENT_MSG *msg,void **usr);
void calc_animations(void);
int load_map(char *filename);
int load_map(const char *filename);
void other_draw(void);
void refresh_scene(THE_TIMER *t);
const void *pcx_fade_decomp(const void *p, int32_t *s);
@ -848,8 +848,8 @@ void draw_placed_items_normal(int celx,int cely,int sect,int side);
#define SPL_TVAR 0x4 //hrac ma kouzlo nastav tvar
#define SPL_DRAIN 0x8 //hrac kazdym utokem drainuje nepritele
#define SPL_MANASHIELD 0x10 //hrac je chranen stitem z many
#define SPL_SANC 0x20 //hraci je kazde zraneni snizeno na polovic
#define SPL_HSANC 0x40 //hrac nikdy nedostane zraneni vetsi nez 18
#define SPL_SANC 0x20 //resistance to fyzical attack
#define SPL_HSANC 0x40 //resistance to all attack
#define SPL_BLIND 0x80 //hrac je slepy
#define SPL_REGEN 0x100 //hrac ma regeneraci pri boji
#define SPL_ICE_RES 0x200 //hrac je chranen proti ledu
@ -1826,7 +1826,7 @@ char generate_string_tables(const char *path);
char *change_extension_support(char *buffer, const char *filename,char *new_extension);
#define set_file_extension(filename, extension) change_extension_support((char *)alloca(strlen(filename)+strlen(extension)), (filename), (extension))
void load_enemy_to_map(int i, int sector, int dir, const TMOB *t);
//extras

View file

@ -134,44 +134,56 @@ void add_window(int x,int y,int xs,int ys,int texture,int border,int txtx,int tx
void zalamovani(const char *source,char *target,int maxxs,int *xs,int *ys)
{
strcpy(target,source);
char *x = target;
while (*x) {
if (*x == '\n') *x = 0;
++x;
}
++x;
*x = 0;
xs[0]=0;
ys[0]=0;
if ((xs[0]=text_width(target))>maxxs)
{
char c[2]=" ";
char *ls,*ps,*cs;
int sum;
x = target;
while (*x) {
char *nextx = x + strlen(x)+1;
if ((xs[0]=text_width(x))>maxxs)
{
char c[2]=" ";
char *ls,*ps,*cs;
int sum;
cs=ps=target;
do
{
ls=NULL;
sum=0;
while (sum<maxxs || ls==NULL)
{
c[0]=*ps++;
if (c[0]==0) {ls=NULL;break;}
if (c[0]==32) ls=ps-1;
if (c[0]=='\n') {ls = ps-1;break;}
sum+=text_width(c);
}
if (ls!=NULL)
{
*ls=0;
ps=ls+1;ls=NULL;
}
ys[0]+=text_height(cs);
cs=ps;
}
while (c[0]);
xs[0]=maxxs;
*ps=0;
}
else
{
ys[0]+=text_height(x);
}
x = nextx;
}
cs=ps=target;
do
{
ls=NULL;
sum=0;
while (sum<maxxs || ls==NULL)
{
c[0]=*ps++;
if (c[0]==0) {ls=NULL;break;}
if (c[0]==32) ls=ps-1;
sum+=text_width(c);
}
if (ls!=NULL)
{
*ls=0;
ps=ls+1;ls=NULL;
}
ys[0]+=text_height(cs);
cs=ps;
}
while (c[0]);
xs[0]=maxxs;
*ps=0;
}
else
{
char *c;
c=target;c=strchr(c,0);c++;*c=0;
ys[0]=text_height(target);
}
}
static T_CLK_MAP message_win[]=

View file

@ -2055,6 +2055,7 @@ static char check_double_wield() {
if (!i1 || !i2) return 0;
const TITEM *it1 = glob_items+i1;
const TITEM *it2 = glob_items+i2;
if (it1->typ_zbrane!=TYP_UTOC || it2->typ_zbrane!=TYP_UTOC ) return 0;
for (int i = VLS_SILA; i <=VLS_OBRAT; ++i) {
if ((it1->podminky[i] + it2->podminky[i] > human_selected->vlastnosti[i])
&& (MAX(it1->podminky[i], it2->podminky[i]) > human_selected->vlastnosti[VLS_OBRAT])) {

View file

@ -278,18 +278,20 @@ static char read_set(TMPFILE_RD *txt,char *var,char *set)
int c;
char *cc;
char d;
char e;
temp_storage_scanf(txt,"%[^=]%c",var,&d);
do
c=temp_storage_getc(txt);
while (c<33);
if (c=='"') temp_storage_scanf(txt,"%[^\"]%c%c",set,&d,&c);
else if (c=='\'') temp_storage_scanf(txt,"%[^']%c%c",set,&d,&c);
if (c=='"') temp_storage_scanf(txt,"%[^\"]%c%c",set,&d,&e);
else if (c=='\'') temp_storage_scanf(txt,"%[^']%c%c",set,&d,&e);
else
{
temp_storage_ungetc(txt);
temp_storage_scanf(txt,"%[^> ]%c",set,&c);
temp_storage_scanf(txt,"%[^> ]%c",set,&e);
}
c = e;
while(c<33 && c!=EOF) c=temp_storage_getc(txt);
if (c!='>') temp_storage_ungetc(txt);
cc=strchr(var,0);

View file

@ -1468,7 +1468,8 @@ void call_spell(int i)
c+=p->start;
twins=0;
do {
switch (twins = twins == 3 ? 0 : twins, *c++) {
twins = twins == 3 ? 0 : twins;
switch (*c++) {
case S_zivel:
p->pc = GET_WORD(c)
;

View file

@ -187,7 +187,7 @@ const char *find_map_from_hash_impl(char *c, uint32_t h, int sz) {
}
int load_map(char *filename)
int load_map(const char *filename)
{
FILE *f;
void *temp;

View file

@ -557,7 +557,7 @@ static int vyber_hrace(int att) {
for (int i = POCET_POSTAV; i>0;) {
--i;
h = postavy+i;
if (h->used && h->inmaphash == current_map_hash) {
if (h->used && h->lives && h->inmaphash == current_map_hash) {
candidate0 = i;
if (h->groupnum == gr) {
candidate1 =i;
@ -750,8 +750,8 @@ void wire_end_game()
}
}
bott_disp_text(texty[65]);
bott_text_forever();
/* bott_disp_text(texty[65]);
bott_text_forever();*/
add_to_timer(TM_SCENE,gamespeed,-1,refresh_scene);
add_to_timer(TM_FLY,gamespeed,-1,calc_fly);
disable_click_map();
@ -2460,7 +2460,6 @@ char player_check_death(THUMAN *p, char afterround)
}
p->groupnum=0;
p->lives=0;
if (p->level>1) p->exp=level_map[p->level-2];
p->kondice=0;
p->mana=0;
SEND_LOG("(GAME) Character '%s' died. R.I.P.",p->jmeno);