fix manabatery, fix timer clock skew, check queue when mouse move, wasd control

This commit is contained in:
Ondrej Novak 2025-02-23 14:00:55 +01:00
parent 05a2803b2b
commit 56cac26206
17 changed files with 102 additions and 60 deletions

View file

@ -653,12 +653,18 @@ void map_keyboard(EVENT_MSG *msg,void **usr)
c=d>>8;
switch (c)
{
case 'H':yr++;break;
case 'P':yr--;break;
case 'M':xr--;break;
case 'K':xr++;break;
case 17:
case 'H':yr--;break;
case 31:
case 'P':yr++;break;
case 32:
case 'M':xr++;break;
case 30:
case 'K':xr--;break;
case 16:
case 'Q':
case 's':if (check_for_layer(cur_depth-1)) cur_depth--;break;
case 18:
case 'I':
case 't':if (check_for_layer(cur_depth+1)) cur_depth++;break;
case 15:

View file

@ -1261,8 +1261,6 @@ void render_scene(int sector, int smer)
draw_spectxtrs(s,-j,i);
}
}
do_events();
if (cancel_render) return;
}
calc_spectxtrs();
if (lodka) {

View file

@ -2185,10 +2185,10 @@ static void knock_mob_back(TMOB *mm,int dir)
if (itnum == 0) return;
const TITEM *it = glob_items + itnum-1;
if (it->druh != TYP_UTOC) return;
int vls[] = {VLS_MGSIL_H,VLS_MGSIL_L,VLS_UTOK_H,VLS_UTOK_L,VLS_DAMAGE};
int vls[] = {VLS_UTOK_H,VLS_UTOK_L,VLS_DAMAGE};
for (size_t i = 0; i < countof(vls); ++i) {
vlastnosti[vls[i]] -= it->zmeny[vls[i]];
}
}
}

View file

@ -473,7 +473,6 @@ static void zooming_forward_backward(const word *background,char back)
//phase=(float)sin(3.14159265*0.5f*phase);
if (back) phase=-phase;
DxZoomWalk(buffer, SCREEN_OFFLINE, tpoints,phase, NULL);
do_events();
}
while (curtime<maxtime);
DxDoneWalk(buffer);
@ -536,8 +535,7 @@ static void turn_left_right(char right)
curtime=get_timer_value()-tmp;
phase=(curtime)*(1.0f/(float)maxtime);
//phase=(float)sin(3.14159265*0.5f*phase);
DxTurn(buffer,SCREEN_OFFLINE,90,right?-phase:phase,NULL);
do_events();
DxTurn(buffer,SCREEN_OFFLINE,90,right?-phase:phase,NULL);
}
while (curtime<maxtime);
DxDoneTurn(buffer);

View file

@ -207,16 +207,30 @@ void restore_items(TMPFILE_RD *f)
{
int32_t i,j;
for(i=0;i<mapsize*4;i++) if (map_items[i]!=NULL) free(map_items[i]);
memset(map_items,0,mapsize*4*sizeof(*map_items));
while(temp_storage_read(&i,sizeof(i),f) && i!=-1)
{
short **new_item_map = getmem(mapsize*4*sizeof(*map_items));
memset(new_item_map,0,mapsize*4*sizeof(*map_items));
while(temp_storage_read(&i,sizeof(i),f) && i!=-1) {
temp_storage_read(&j,sizeof(j),f);
map_items[i]=(short *)getmem(j*2);
temp_storage_read(map_items[i],2*j,f);
new_item_map[i]=(short *)getmem(j*2);
temp_storage_read(new_item_map[i],2*j,f);
short *v = new_item_map[i];
while (*v) { //sanitize map items
if (*v < 1 || *v >= item_count) {
free(new_item_map[i]);
new_item_map[i] = map_items[i];
map_items[i] = NULL;
break;
}
++v;
}
}
for(i=0;i<mapsize*4;i++) if (map_items[i]!=NULL) free(map_items[i]);
memset(map_items,0,mapsize*4*sizeof(*map_items));
map_items = new_item_map;
}
extern TSTR_LIST texty_v_mape;
void save_map_description(TMPFILE_WR *f)

View file

@ -1911,12 +1911,10 @@ void cast(int num,THUMAN *p,int owner, char backfire)
if (!backfire) p->mana-=k->mge;
p->exp+=k->mge;
check_player_new_level(p);
if (p->mana>p->mana_battery)
{
if (p->mana_battery>=0)p->mana=p->mana_battery;
else
p->mana_battery=32767;
}
if (p->mana>p->mana_battery) {
p->mana=p->mana_battery;
}
p->mana_battery=32767;
end:
GlobEvent(MAGLOB_AFTERMAGIC,p->sektor,p->direction);
}

View file

@ -1920,8 +1920,14 @@ void game_keyboard(EVENT_MSG *msg,void **usr)
while (_bios_keybrd(_KEYBRD_READY) ) _bios_keybrd(_KEYBRD_READ);
switch (c >> 8)
{
case 17:
case 'H':step_zoom(0);break;
case 31:
case 'P':step_zoom(2);break;
case 30: step_zoom(3);break;
case 32: step_zoom(1);break;
case 16: turn_zoom(-1);break;
case 18: turn_zoom(1);break;
case 'M':if (get_control_key_state() & 0x80)
step_zoom(1);
else
@ -1950,6 +1956,7 @@ void game_keyboard(EVENT_MSG *msg,void **usr)
case 1:konec(0,0,0,0,0);break;
// case 25:GamePause();break;
case 28:enforce_start_battle();break;
case 45:
case 82:group_all();break;
case '<':if (!battle && GlobEvent(MAGLOB_CLICKSAVE,viewsector,viewdir))
{unwire_proc();cancel_render=1;do_save_dialog();wire_proc();}break;

View file

@ -440,9 +440,8 @@ void mouse_set_cursor(int cursor)
{
alock(cursor);
schovej_mysku();
register_ms_cursor(ablock(cursor));
nastav_mysku_kurzor(ablock(cursor),0,0);
last_ms_cursor=cursor;
set_ms_finger(0,0);
ukaz_mysku();
}
else
@ -454,8 +453,8 @@ void mouse_set_cursor(int cursor)
p=(char *)ablock(cursor/18+ikon_libs);
memcpy(ms_item,&p[(cursor%18)*IT_ICONE_SIZE],IT_ICONE_SIZE);
schovej_mysku();
register_ms_cursor(ms_item);
set_ms_finger(45/2,55/2);
nastav_mysku_kurzor(ms_item,45/2,55/2);
last_ms_cursor=-cursor;
ukaz_mysku();
}
@ -692,6 +691,7 @@ void user_timer(EVENT_MSG *msg,void **usr)
x=get_timer_value();
x-=lastvalue;
lastvalue+=x;
x = MIN(TIMERSPEED, x); //prevent clock skew
if (x) send_message(E_TIMER,x);
}
}

View file

@ -1183,10 +1183,11 @@ void pouzij_zbran(THUMAN *p,int ruka)
}
vybrana_zbran=itm;
bonus=vypocti_bonus(p,itm);
if (itm>0)
if (itm>0) {
memcpy(&p->vlastnosti[VLS_MGSIL_L],&glob_items[itm-1].zmeny[VLS_MGSIL_L],3*sizeof(short));
else
} else {
memset(&p->vlastnosti[VLS_MGSIL_L],0,3*sizeof(short));
}
if (!itm || (it=&glob_items[itm-1])->druh==TYP_UTOC)
{
TMOB *m;int mm,chaos;
@ -1304,7 +1305,7 @@ void jadro_souboje(EVENT_MSG *msg,void **unused) //!!!! Jadro souboje
if(nxt==-255)
{
int i;
SEND_LOG("(BATTLE) Ending round...(nxt=%d,mob=%s)",nxt,mobs[nxt].name);
// SEND_LOG("(BATTLE) Ending round...(nxt=%d,mob=%s)",nxt,mobs[nxt].name);
delete_from_timer(TM_SCENE);
add_to_timer(TM_SCENE,gamespeed,-1,refresh_scene);
for(i=0;i<MAX_MOBS;i++)
@ -2133,12 +2134,17 @@ void programming_keyboard(EVENT_MSG *msg,void **unused)
switch (c)
{
case 1:konec(0,0,0,0,0);break;
case 18:
case 'M':souboje_turn(1);break;
case 16:
case 'K':souboje_turn(-1);break;
case '=':unwire_proc();cancel_render=1;wire_save_load(0);break;
case '>':game_setup(0,0,0,0,0);break;
case 57:souboje_dalsi();bott_draw(1);break;
case 15:
case 28:zahajit_kolo(0);
souboje_stisknout(AC_START);
break;
case 50:
if (GlobEvent(MAGLOB_BEFOREMAPOPEN,viewsector,viewdir))
show_automap(1);