- adjustments for input

This commit is contained in:
Christoph Oelckers 2020-07-16 15:03:09 +02:00
parent 55feadd11c
commit f530732c46
6 changed files with 94 additions and 63 deletions

View file

@ -444,7 +444,12 @@ void moveplayers(void) //Players
execute(i, s->yvel, otherx);
//thisPlayer.smoothcamera = false;
//p->q16angvel = G_GetQ16AngleDelta(pPlayer->oq16ang, pPlayer->q16ang);
p->oq16ang = p->q16ang;
p->oq16horiz = p->q16horiz;
p->oq16horizoff = p->q16horizoff;
if (ud.multimode > 1)
if (sprite[ps[otherp].i].extra > 0)
@ -459,6 +464,12 @@ void moveplayers(void) //Players
}
}
}
if (p->actorsqu >= 0)
{
p->addang(getincangle(p->getang(), getangle(sprite[p->actorsqu].x - p->posx, sprite[p->actorsqu].y - p->posy)) >> 2, true);
}
if (ud.god)
{
s->extra = max_player_health;
@ -467,7 +478,6 @@ void moveplayers(void) //Players
p->jetpack_amount = 1599;
}
if (s->extra > 0)
{
// currently alive...
@ -491,7 +501,7 @@ void moveplayers(void) //Players
{
int ang = p->getang();
ang += getincangle(ang, getangle(sprite[p->wackedbyactor].x - p->posx, sprite[p->wackedbyactor].y - p->posy)) >> 1;
p->setang(ang & 2047);
p->setang(ang & 2047, true);
}
}
@ -750,7 +760,7 @@ void movecrane(int i, int crane)
s->owner = -2;
ps[p].on_crane = i;
spritesound(isRR() ? 390 : DUKE_GRUNT, ps[p].i);
ps[p].setang(s->ang + 1024);
ps[p].setang(s->ang + 1024, true);
}
else
{
@ -2674,7 +2684,7 @@ void handle_se00(int i, int LASERLINE)
if (ps[p].cursectnum == s->sectnum && ps[p].on_ground == 1)
{
ps[p].addang(l * q);
ps[p].addang(l * q, true);
ps[p].posz += zchange;
@ -2866,7 +2876,7 @@ void handle_se14(int i, bool checkstat, int RPG, int JIBS6)
ps[p].bobposx += m;
ps[p].bobposy += x;
ps[p].addang(q);
ps[p].addang(q, true);
if (numplayers > 1)
{

View file

@ -348,7 +348,12 @@ void dokneeattack(int snum, int pi, const std::initializer_list<int> & respawnli
if (p->knee_incs > 0)
{
p->knee_incs++;
#ifndef SYNCINPUT
g_player[snum].horizSkew = -48;
g_player[snum].horizRecenter = true;
#else
p->addhoriz(-48);
#endif
p->return_to_center = 9;
if (p->knee_incs > 15)
{
@ -381,8 +386,6 @@ void dokneeattack(int snum, int pi, const std::initializer_list<int> & respawnli
}
p->actorsqu = -1;
}
else if (p->actorsqu >= 0)
p->addang(getincangle(p->getang(), getangle(sprite[p->actorsqu].x - p->posx, sprite[p->actorsqu].y - p->posy)) >> 2);
}
}
@ -745,10 +748,12 @@ void playerCenterView(int snum)
if (GetGameVarID(g_iReturnVarID, p->i, snum) == 0)
{
p->return_to_center = 9;
#ifndef SYNCINPUT
g_player[snum].horizRecenter = true;
#endif
}
}
#pragma message("input stuff begins here")
void horizAngleAdjust(int snum, int delta)
{
#ifndef SYNCINPUT // for per-frame input

View file

@ -53,6 +53,7 @@ typedef struct
double lastInputTicks;
bool lookLeft;
bool lookRight;
bool horizRecenter;
} playerdata_t;

View file

@ -1562,6 +1562,10 @@ static void operateJetpack(int snum, ESyncBits sb_snum, int psectlotag, int fz,
p->pycount &= 2047;
p->pyoff = sintable[p->pycount] >> 7;
#ifndef SYNCINPUT
g_player[snum].horizSkew = 0;
#endif
if (p->jetpack_on < 11)
{
p->jetpack_on++;
@ -2586,10 +2590,10 @@ static void processweapon(int snum, ESyncBits sb_snum, int psect)
void processinput_d(int snum)
{
int j, i, k, doubvel, fz, cz, hz, lz, truefdist, x, y;
int j, i, k, doubvel, fz, cz, hz, lz, truefdist;
char shrunk;
ESyncBits sb_snum;
short psect, psectlotag, tempsect, pi;
short psect, psectlotag, pi;
struct player_struct* p;
spritetype* s;
@ -2597,8 +2601,10 @@ void processinput_d(int snum)
pi = p->i;
s = &sprite[pi];
#ifndef SYNCINPUT
g_player[snum].horizAngleAdjust = 0;
g_player[snum].horizSkew = 0;
#endif
sb_snum = PlayerInputBits(snum, SKB_ALL);
@ -2635,17 +2641,15 @@ void processinput_d(int snum)
hittype[pi].floorz = fz;
hittype[pi].ceilingz = cz;
#pragma message("input stuff begins here")
#if 0 // disabled input
#ifdef SYNCINPUT
p->oq16horiz = p->q16horiz;
p->oq16horizoff = p->q16horizoff;
#endif
if (p->aim_mode == 0 && p->on_ground && psectlotag != 2 && (sector[psect].floorstat & 2))
if (p->aim_mode == 0 && p->on_ground && psectlotag != ST_2_UNDERWATER && (sector[psect].floorstat & 2))
{
x = p->posx + (sintable[(p->getang() + 512) & 2047] >> 5);
y = p->posy + (sintable[p->getang() & 2047] >> 5);
tempsect = psect;
int x = p->posx + (sintable[(p->getang() + 512) & 2047] >> 5);
int y = p->posy + (sintable[p->getang() & 2047] >> 5);
short tempsect = psect;
updatesector(x, y, &tempsect);
if (tempsect >= 0)
@ -2657,7 +2661,7 @@ void processinput_d(int snum)
}
if (p->q16horizoff > 0) p->q16horizoff -= ((p->q16horizoff >> 3) + FRACUNIT);
else if (p->q16horizoff < 0) p->q16horizoff += (((-p->q16horizoff) >> 3) + FRACUNIT);
#pragma message("input stuff ends here")
#endif
if (hz >= 0 && (hz & 49152) == 49152)
{
@ -2712,9 +2716,10 @@ void processinput_d(int snum)
return;
}
if (s->extra <= 0)
if (s->extra <= 0 && !ud.god)
{
playerisdead(snum, psectlotag, fz, cz);
return;
}
if (p->transporter_hold > 0)
@ -2747,10 +2752,8 @@ void processinput_d(int snum)
doubvel = TICSPERFRAME;
#ifdef SYNCINPUT
if (p->q16rotscrnang > 0) p->q16rotscrnang -= ((p->q16rotscrnang >> 1) + 1);
else if (p->q16rotscrnang < 0) p->q16rotscrnang += (((-p->q16rotscrnang) >> 1) + 1);
p->q16look_ang -= p->q16look_ang >> 2;
p->q16rotscrnang -= (p->q16rotscrnang >> 1); if (p->q16rotscrnang < FRACUNIT) p->q16rotscrnang = 0;
p->q16look_ang -= p->q16look_ang >> 2; if (p->q16look_ang < FRACUNIT) p->q16look_ang = 0;
#endif
if (sb_snum & SKB_LOOK_LEFT)
@ -2810,7 +2813,7 @@ void processinput_d(int snum)
i = 40;
if (psectlotag == 2)
if (psectlotag == ST_2_UNDERWATER)
{
underwater(snum, sb_snum, psect, fz, cz);
}
@ -2819,7 +2822,7 @@ void processinput_d(int snum)
{
operateJetpack(snum, sb_snum, psectlotag, fz, cz, shrunk);
}
else if (psectlotag != 2)
else if (psectlotag != ST_2_UNDERWATER)
{
movement(snum, sb_snum, psect, fz, cz, shrunk, truefdist);
}
@ -2849,8 +2852,8 @@ void processinput_d(int snum)
if (psectlotag == 2) p->angvel = (tempang - (tempang >> 3)) * sgn(doubvel);
else p->angvel = tempang * sgn(doubvel);
p->ang += p->angvel;
p->ang &= 2047;
p->addang(p->angvel);
p->q16ang &= (2048<<FRACBITS)-1;
#endif
p->crack_time = 777;
}
@ -3060,6 +3063,11 @@ HORIZONLY:
fi.activatebysector(psect, pi);
}
#ifndef SYNCINPUT
if (p->return_to_center > 0)
p->return_to_center--;
#endif
// center_view
if (sb_snum & SKB_CENTER_VIEW || p->hard_landing)
{
@ -3081,13 +3089,14 @@ HORIZONLY:
{ // aim_down
playerAimDown(snum, sb_snum);
}
#ifdef SYNCINPUT
if (p->return_to_center > 0)
if ((sb_snum & (SKB_LOOK_UP| SKB_LOOK_DOWN)) == 0)
{
p->return_to_center--;
p->q16horiz += 33*FRACUNIT - (p->q16horiz / 3);
}
#endif
if (p->hard_landing > 0)
{
#ifndef SYNCINPUT
@ -3107,7 +3116,14 @@ HORIZONLY:
if (p->horizoff > -5 && p->horizoff < 5) p->horizoff = 0;
}
horiz = clamp(horiz, HORIZ_MIN, HORIZ_MAX);
p->horiz = clamp(p->horiz, HORIZ_MIN, HORIZ_MAX);
if (centerHoriz)
{
if (p->gethoriz() > 95 && pPlayer->gethoriz() < 105) pPlayer->sethoriz(100);
if (p->gethorizoff() > -5 && pPlayer->gethorizoff < 5) pPlayer->sethorizoff(0);
}
#endif
//Shooting code/changes

View file

@ -3383,10 +3383,10 @@ static void processweapon(int snum, ESyncBits sb_snum, int psect)
void processinput_r(int snum)
{
int j, i, k, doubvel, fz, cz, hz, lz, truefdist, x, y, var60;
int j, i, k, doubvel, fz, cz, hz, lz, truefdist, var60;
char shrunk;
ESyncBits sb_snum;
short psect, psectlotag, tempsect, pi;
short psect, psectlotag, pi;
struct player_struct* p;
spritetype* s;
@ -3476,14 +3476,12 @@ void processinput_r(int snum)
#ifdef SYNCINPUT
p->oq16horiz = p->q16horiz;
p->oq16horizoff = p->q16horizoff;
#endif
#pragma message("input stuff begins here")
if (p->aim_mode == 0 && p->on_ground && psectlotag != 2 && (sector[psect].floorstat & 2))
if (p->aim_mode == 0 && p->on_ground && psectlotag != ST_2_UNDERWATER && (sector[psect].floorstat & 2))
{
x = p->posx + (sintable[(p->getang() + 512) & 2047] >> 5);
y = p->posy + (sintable[p->getang() & 2047] >> 5);
tempsect = psect;
int x = p->posx + (sintable[(p->getang() + 512) & 2047] >> 5);
int y = p->posy + (sintable[p->getang() & 2047] >> 5);
short tempsect = psect;
updatesector(x, y, &tempsect);
if (tempsect >= 0)
@ -3495,7 +3493,7 @@ void processinput_r(int snum)
}
if (p->q16horizoff > 0) p->q16horizoff -= ((p->q16horizoff >> 3) + FRACUNIT);
else if (p->q16horizoff < 0) p->q16horizoff += (((-p->q16horizoff) >> 3) + FRACUNIT);
#pragma message("input stuff ends here")
#endif
if (hz >= 0 && (hz & 49152) == 49152)
{
@ -3607,9 +3605,10 @@ void processinput_r(int snum)
return;
}
if (s->extra <= 0)
if (s->extra <= 0 && !ud.god)
{
playerisdead(snum, psectlotag, fz, cz);
return;
}
if (p->transporter_hold > 0)
@ -3641,10 +3640,8 @@ void processinput_r(int snum)
doubvel = TICSPERFRAME;
#ifdef SYNCINPUT
if (p->q16rotscrnang > 0) p->q16rotscrnang -= ((p->q16rotscrnang >> 1) + 1);
else if (p->q16rotscrnang < 0) p->q16rotscrnang += (((-p->q16rotscrnang) >> 1) + 1);
p->q16look_ang -= p->q16look_ang >> 2;
p->q16rotscrnang -= (p->q16rotscrnang >> 1); if (p->q16rotscrnang < FRACUNIT) p->q16rotscrnang = 0;
p->q16look_ang -= p->q16look_ang >> 2; if (p->q16look_ang < FRACUNIT) p->q16look_ang = 0;
#endif
if ((sb_snum & SKB_LOOK_LEFT) && !p->OnMotorcycle)
@ -3723,19 +3720,7 @@ void processinput_r(int snum)
i = 40;
if (psectlotag == 17)
{
int tmp;
tmp = getanimationgoal(&sector[p->cursectnum].floorz);
if (tmp >= 0)
{
if (!S_CheckSoundPlaying(p->i, 432))
spritesound(432, pi);
}
else
stopsound(432);
}
else if (isRRRA() && psectlotag == 18)
if (psectlotag == ST_17_PLATFORM_UP || (isRRRA() && psectlotag == ST_18_ELEVATOR_DOWN))
{
int tmp;
tmp = getanimationgoal(&sector[p->cursectnum].floorz);
@ -3757,11 +3742,11 @@ void processinput_r(int snum)
p->pyoff = sintable[p->pycount] >> 7;
}
if (psectlotag == 2)
if (psectlotag == ST_2_UNDERWATER)
{
underwater(snum, sb_snum, psect, fz, cz);
}
else if (psectlotag != 2)
else if (psectlotag != ST_2_UNDERWATER)
{
movement(snum, sb_snum, psect, fz, cz, shrunk, truefdist);
}
@ -4116,6 +4101,11 @@ HORIZONLY:
return;
}
#ifndef SYNCINPUT
if (p->return_to_center > 0)
p->return_to_center--;
#endif
if (sb_snum & SKB_CENTER_VIEW || p->hard_landing)
{
playerCenterView(snum);
@ -4144,13 +4134,14 @@ HORIZONLY:
p->recoil -= d;
p->addhoriz(-d);
}
#ifdef SYNCINPUT
else if (p->return_to_center > 0)
if ((sb_snum & (SKB_LOOK_UP| SKB_LOOK_DOWN)) == 0)
{
p->return_to_center--;
p->q16horiz += 33*FRACUNIT - (p->q16horiz / 3);
}
#endif
if (p->hard_landing > 0)
{
#ifndef SYNCINPUT
@ -4170,7 +4161,14 @@ HORIZONLY:
if (p->horizoff > -5 && p->horizoff < 5) p->horizoff = 0;
}
horiz = clamp(horiz, HORIZ_MIN, HORIZ_MAX);
p->horiz = clamp(p->horiz, HORIZ_MIN, HORIZ_MAX);
if (centerHoriz && !p->recoil)
{
if (p->gethoriz() > 95 && pPlayer->gethoriz() < 105) pPlayer->sethoriz(100);
if (p->gethorizoff() > -5 && pPlayer->gethorizoff < 5) pPlayer->sethorizoff(0);
}
#endif
//Shooting code/changes

View file

@ -90,7 +90,8 @@ struct player_struct
};
// input handles angle and horizon as fixed16 numbers. We need to account for that as well.
fixed_t q16ang, oq16ang, q16horiz, q16horizoff, q16rotscrnang, q16look_ang; // oq16horiz, oq16horizoff, orotscrnang, ; // These three are currently not used but may be again later.
fixed_t q16ang, q16horiz, q16horizoff, q16rotscrnang, q16look_ang;
fixed_t oq16ang, oq16horiz, oq16horizoff, oq16rotscrnang; // These are only needed with synchronous mouse input.
fixed_t one_eighty_target;
// using a bit field for this to save a bit of space.
@ -199,8 +200,8 @@ struct player_struct
void addrotscrnang(int b) { q16rotscrnang += b << FRACBITS; }
int getang() { return q16ang >> FRACBITS; }
int getoang() { return oq16ang >> FRACBITS; }
void setang(int v) { q16ang = v << FRACBITS; }
void addang(int v) { q16ang = (q16ang + (v << FRACBITS)) & ((2048 << FRACBITS) - 1); }
void setang(int v, bool smooth = false) { q16ang = v << FRACBITS; }
void addang(int v, bool smooth = false) { q16ang = (q16ang + (v << FRACBITS)) & ((2048 << FRACBITS) - 1); }
void setoang(int v) { oq16ang = v << FRACBITS; }
void addhoriz(int v) { q16horiz += (v << FRACBITS); }
void addhorizoff(int v) { q16horiz += (v << FRACBITS); }