Revert "SW: Improve main game loop."

This reverts commit e878c5bab8.

Revert "SW: Use Q16.16 for horiz."

This reverts commit f07a0ae01e.

Revert "SW: Use Q16.16 for angle."

This reverts commit 1ecc74c2ec.

Revert "SW: Minor repairs for Q16.16 implementation."

This reverts commit d78d046bad.

Revert "SW: Process input at frame rate."

This reverts commit c162014dab.

Revert "SW: Amendments to accommodate changes in master."

This reverts commit eaa51138ad.

Revert "SW: Fix incorrectly declared function input type."

This reverts commit 1cdd5b08d8.

Revert "SW: Amend scaleAdjustmentToInterval() with correct value for SW."

This reverts commit d4dd737cd5.

Revert "SW: Refinements to new input code."

This reverts commit 5ebc65a1fb.

Revert "SW: Adjust look and snap up/down keys and slightly tune PLAYER_TURN_AMOUNT."

This reverts commit 2852536dbf.

Revert "SW: Get PLAYER_TURN_SCALE to be just right."

This reverts commit 4630c8a0b7.

Revert "SW: Make map follow mode work better."

This reverts commit 8e94c48eff.

Revert "SW: Remove line accidentally left from 'MoveScrollMode2D()'."

This reverts commit 5db8047b41.

Revert "Fix multiplayer desync after the change to q16 angle and horiz."

This reverts commit 3bc46078b8.

Revert "SW: Revert commented out horiz->q16horiz renames in DSPRINTF strings"

This reverts commit 537313f620.

Revert "sw/src/draw.cpp:drawscreen: We can set the pp->si* fields just once,"

This reverts commit d2e9595980.

Revert "sw/src/game.cpp:LoadLevel: Rename q16ang -> ang"

This reverts commit a178961a3e.

Revert "SW: Minor tweaks."

This reverts commit 377ba68344.

Revert "SW: Further refine turning and optimise horizon adjustment."

This reverts commit 039022d9ac.

Revert "SW: Don't process input at frame rate if ScrollMode2D is true."

This reverts commit 1aa1e62c4d.

Revert "SW: Use a bit more Q16.16 in places."

This reverts commit 40ca656f38.

Revert "SW: Use the old interpolation path in drawscreen if player is dead"

This reverts commit 2d73466425.

Revert "SW: Smooth out 180 degree turn landing and replace some fix16_min/max with fix16_clamp."

This reverts commit 0996e87f79.

Revert "Change Next/Previous Weapon button handling for Shadow Warrior."

This reverts commit f6b8ca6a22.

Revert "SW: Make "Center_View" key return smoothly."

This reverts commit 23c401fbc2.

Revert "SW: Use the old interpolation path in drawscreen if player is dead"

This reverts commit 43ec16eb55.

Revert "Interpolation fixes for SW:"

This reverts commit ac8a7ecfbd.

Revert "SW: Reset the number of interpolations on level load"

This reverts commit 04bf8499e7.

Revert "Another change modifying saved game format in SW:"

This reverts commit e80888523e.

Revert "SW: Interpolate sector objects in non-demo, single player games."

This reverts commit 996ab77cf4.

Revert "- fixed merge errors in SW."

This reverts commit b8cfa94568.

Revert "- fix interpolation stutters when opening console for SW."

This reverts commit 99fdbfb6cb.

Revert "- reset buttonMap button states after returning from pause for SW (stops keys acting stuck down if down prior to pausing)."

This reverts commit 693b6955da.

Revert "SW: fix stupid input scaling bug"

This reverts commit 1c79e6e17c.

Revert "SW: Make vehicle input better."

This reverts commit 670a53c402.

Revert "SW: Change fix16_from_float() to fix16_from_int() that was changed in 4630c8a0b7 but should have been reverted in 377ba68344e34495638c6fa7685ff78c9a0ed6f8."

This reverts commit 423c9da071.

Revert "SW: Remove ScrollMode2D extern boolean and move into PLAYERp struct."

This reverts commit 31eb55c1fa.
This commit is contained in:
Mitchell Richters 2020-05-19 21:44:52 +10:00 committed by Christoph Oelckers
parent 31eb55c1fa
commit 83936bf5eb
23 changed files with 892 additions and 943 deletions

View file

@ -194,7 +194,7 @@ DemoWriteHeader(void)
dsp.z = pp->posz;
fwrite(&dsp, sizeof(dsp), 1, DemoFileOut);
fwrite(&pp->Flags, sizeof(pp->Flags), 1, DemoFileOut);
fwrite(&pp->q16ang, sizeof(pp->q16ang), 1, DemoFileOut);
fwrite(&pp->pang, sizeof(pp->pang), 1, DemoFileOut);
}
fwrite(&Skill, sizeof(Skill), 1, DemoFileOut);
@ -252,7 +252,7 @@ DemoReadHeader(void)
//pp->cursectnum = 0;
//updatesectorz(pp->posx, pp->posy, pp->posz, &pp->cursectnum);
DREAD(&pp->Flags, sizeof(pp->Flags), 1, DemoFileIn);
DREAD(&pp->q16ang, sizeof(pp->q16ang), 1, DemoFileIn);
DREAD(&pp->pang, sizeof(pp->pang), 1, DemoFileIn);
}
DREAD(&Skill, sizeof(Skill), 1, DemoFileIn);

View file

@ -75,6 +75,7 @@ extern short HelpPagePic[];
extern ParentalStruct aVoxelArray[MAXTILES];
extern SWBOOL RedrawScreen;
SWBOOL RedrawCompass=FALSE;
extern int Follow_posx,Follow_posy;
int ConnectCopySprite(uspritetype const * tsp);
void PreDrawStackedWater(void);
@ -885,7 +886,7 @@ analyzesprites(int viewx, int viewy, int viewz, SWBOOL mirror)
}
tsp->z = tsp->z + pp->siz;
tsp->ang = fix16_to_int(pp->q16ang);
tsp->ang = pp->siang;
//continue;
}
else
@ -1054,9 +1055,11 @@ ResizeView(PLAYERp pp)
if (inputState.GetKeyStatus(KEYSC_ESC))
{
extern SWBOOL ScrollMode2D;
inputState.ClearKeyStatus(sc_Escape);
dimensionmode = 3;
pp->ScrollMode2D = FALSE;
ScrollMode2D = FALSE;
SetRedrawScreen(pp);
}
}
@ -1090,7 +1093,7 @@ ViewOutsidePlayerRecurse(PLAYERp pp, int32_t* vx, int32_t* vy, int32_t* vz, int1
*vz = pp->posz;
*vsectnum = pp->cursectnum;
*ang = fix16_to_int(pp->q16ang) + pp->view_outside_dang;
*ang = pp->pang + pp->view_outside_dang;
nx = sintable[NORM_ANGLE(*ang + 512 + 1024)] << 11;
ny = sintable[NORM_ANGLE(*ang + 1024)] << 11;
@ -1138,7 +1141,7 @@ ViewOutsidePlayerRecurse(PLAYERp pp, int32_t* vx, int32_t* vy, int32_t* vz, int1
void
BackView(int *nx, int *ny, int *nz, short *vsect, fix16_t *nq16ang, short horiz)
BackView(int *nx, int *ny, int *nz, short *vsect, short *nang, short horiz)
{
vec3_t n = { *nx, *ny, *nz };
SPRITEp sp;
@ -1150,7 +1153,7 @@ BackView(int *nx, int *ny, int *nz, short *vsect, fix16_t *nq16ang, short horiz)
ASSERT(*vsect >= 0 && *vsect < MAXSECTORS);
ang = fix16_to_int(*nq16ang) + pp->view_outside_dang;
ang = *nang + pp->view_outside_dang;
// Calculate the vector (nx,ny,nz) to shoot backwards
vx = (sintable[NORM_ANGLE(ang + 1536)] >> 3);
@ -1212,7 +1215,7 @@ BackView(int *nx, int *ny, int *nz, short *vsect, fix16_t *nq16ang, short horiz)
flag_backup = hsp->cstat;
RESET(hsp->cstat, CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
ASSERT(*vsect >= 0 && *vsect < MAXSECTORS);
BackView(nx, ny, nz, vsect, nq16ang, horiz);
BackView(nx, ny, nz, vsect, nang, horiz);
hsp->cstat = flag_backup;
return;
}
@ -1253,11 +1256,11 @@ BackView(int *nx, int *ny, int *nz, short *vsect, fix16_t *nq16ang, short horiz)
// Make sure vsect is correct
updatesectorz(*nx, *ny, *nz, vsect);
*nq16ang = fix16_from_int(ang);
*nang = ang;
}
void
CircleCamera(int *nx, int *ny, int *nz, short *vsect, int *nq16ang, short horiz)
CircleCamera(int *nx, int *ny, int *nz, short *vsect, short *nang, short horiz)
{
vec3_t n = { *nx, *ny, *nz };
SPRITEp sp;
@ -1267,7 +1270,7 @@ CircleCamera(int *nx, int *ny, int *nz, short *vsect, int *nq16ang, short horiz)
PLAYERp pp = &Player[screenpeek];
short ang;
ang = fix16_to_int(*nq16ang) + pp->circle_camera_ang;
ang = *nang + pp->circle_camera_ang;
// Calculate the vector (nx,ny,nz) to shoot backwards
vx = (sintable[NORM_ANGLE(ang + 1536)] >> 4);
@ -1333,7 +1336,7 @@ CircleCamera(int *nx, int *ny, int *nz, short *vsect, int *nq16ang, short horiz)
flag_backup = hsp->cstat;
RESET(hsp->cstat, CSTAT_SPRITE_BLOCK|CSTAT_SPRITE_BLOCK_HITSCAN);
CircleCamera(nx, ny, nz, vsect, nq16ang, horiz);
CircleCamera(nx, ny, nz, vsect, nang, horiz);
hsp->cstat = flag_backup;
return;
}
@ -1362,7 +1365,7 @@ CircleCamera(int *nx, int *ny, int *nz, short *vsect, int *nq16ang, short horiz)
// Make sure vsect is correct
updatesectorz(*nx, *ny, *nz, vsect);
*nq16ang = fix16_from_int(ang);
*nang = ang;
}
FString GameInterface::statFPS()
@ -1394,7 +1397,7 @@ FString GameInterface::GetCoordString()
out.AppendFormat("POSX:%d ", pp->posx);
out.AppendFormat("POSY:%d ", pp->posy);
out.AppendFormat("POSZ:%d ", pp->posz);
out.AppendFormat("ANG:%d\n", (int32_t)fix16_to_int(pp->q16ang));
out.AppendFormat("ANG:%d\n", (int32_t)pp->pang);
return out;
}
@ -1573,7 +1576,7 @@ void DrawCrosshair(PLAYERp pp)
}
void CameraView(PLAYERp pp, int *tx, int *ty, int *tz, short *tsectnum, fix16_t *tq16ang, fix16_t *tq16horiz)
void CameraView(PLAYERp pp, int *tx, int *ty, int *tz, short *tsectnum, short *tang, int *thoriz)
{
int i,nexti;
short ang;
@ -1614,7 +1617,7 @@ void CameraView(PLAYERp pp, int *tx, int *ty, int *tz, short *tsectnum, fix16_t
{
case 1:
pp->last_camera_sp = sp;
CircleCamera(tx, ty, tz, tsectnum, tq16ang, 100);
CircleCamera(tx, ty, tz, tsectnum, tang, 100);
found_camera = TRUE;
break;
@ -1640,12 +1643,14 @@ void CameraView(PLAYERp pp, int *tx, int *ty, int *tz, short *tsectnum, fix16_t
zvect = 0;
// new horiz to player
*tq16horiz = fix16_clamp(fix16_from_int(100 - (zvect/256)), fix16_from_int(PLAYER_HORIZ_MIN), fix16_from_int(PLAYER_HORIZ_MAX));
*thoriz = 100 - (zvect/256);
*thoriz = max(*thoriz, PLAYER_HORIZ_MIN);
*thoriz = min(*thoriz, PLAYER_HORIZ_MAX);
//DSPRINTF(ds,"xvect %d,yvect %d,zvect %d,tq16horiz %d",xvect,yvect,zvect,*tq16horiz);
//DSPRINTF(ds,"xvect %d,yvect %d,zvect %d,thoriz %d",xvect,yvect,zvect,*thoriz);
MONO_PRINT(ds);
*tq16ang = fix16_from_int(ang);
*tang = ang;
*tx = sp->x;
*ty = sp->y;
*tz = sp->z;
@ -1860,7 +1865,7 @@ void PreDrawStackedWater(void)
}
void FAF_DrawRooms(int x, int y, int z, fix16_t q16ang, fix16_t q16horiz, short sectnum)
void FAF_DrawRooms(int x, int y, int z, short ang, int horiz, short sectnum)
{
short i,nexti;
@ -1887,7 +1892,7 @@ void FAF_DrawRooms(int x, int y, int z, fix16_t q16ang, fix16_t q16horiz, short
}
}
renderDrawRoomsQ16(x,y,z,q16ang,q16horiz,sectnum);
drawrooms(x,y,z,ang,horiz,sectnum);
TRAVERSE_SPRITE_STAT(headspritestat[STAT_CEILING_FLOOR_PIC_OVERRIDE], i, nexti)
{
@ -1919,14 +1924,14 @@ short ScreenSavePic = FALSE;
SWBOOL PicInView(short, SWBOOL);
void DoPlayerDiveMeter(PLAYERp pp);
void MoveScrollMode2D(PLAYERp pp);
void
drawscreen(PLAYERp pp)
{
extern SWBOOL DemoMode,CameraTestMode;
int tx, ty, tz;
fix16_t tq16horiz, tq16ang;
short tsectnum;
int tx, ty, tz,thoriz;
short tang,tsectnum;
short i,j;
int bob_amt = 0;
int quake_z, quake_x, quake_y;
@ -2007,17 +2012,8 @@ drawscreen(PLAYERp pp)
tx = camerapp->oposx + mulscale16(camerapp->posx - camerapp->oposx, smoothratio);
ty = camerapp->oposy + mulscale16(camerapp->posy - camerapp->oposy, smoothratio);
tz = camerapp->oposz + mulscale16(camerapp->posz - camerapp->oposz, smoothratio);
if (pp == Player+myconnectindex && (pp->on_vehicle || pp->sop_control || TEST(pp->Flags, PF_DEAD)))
{
tq16ang = camerapp->oq16ang + mulscale16(((camerapp->q16ang + fix16_from_int(1024) - camerapp->oq16ang) & 0x7FFFFFF) - fix16_from_int(1024), smoothratio);
tq16horiz = camerapp->oq16horiz + mulscale16(camerapp->q16horiz - camerapp->oq16horiz, smoothratio);
}
else
{
tq16ang = camerapp->q16ang;
tq16horiz = camerapp->q16horiz;
}
tang = camerapp->oang + mulscale16(((camerapp->pang + 1024 - camerapp->oang) & 2047) - 1024, smoothratio);
thoriz = camerapp->ohoriz + mulscale16(camerapp->horiz - camerapp->ohoriz, smoothratio);
tsectnum = camerapp->cursectnum;
//ASSERT(tsectnum >= 0 && tsectnum <= MAXSECTORS);
@ -2048,52 +2044,53 @@ drawscreen(PLAYERp pp)
// with "last valid" code this should never happen
// ASSERT(tsectnum >= 0 && tsectnum <= MAXSECTORS);
if (pp->sop_riding || pp->sop_control)
{
if (pp->sop_control && !InterpolateSectObj)
{
tx = pp->posx;
ty = pp->posy;
tz = pp->posz;
tq16ang = pp->q16ang;
}
tsectnum = pp->cursectnum;
updatesectorz(tx, ty, tz, &tsectnum);
}
pp->six = tx;
pp->siy = ty;
pp->siz = tz - pp->posz;
pp->siang = tang;
if (pp->sop_riding || pp->sop_control)
{
tx = pp->posx;
ty = pp->posy;
tz = pp->posz;
tang = pp->pang;
tsectnum = pp->cursectnum;
updatesectorz(tx, ty, tz, &tsectnum);
pp->six = tx;
pp->siy = ty;
pp->siz = tz - pp->posz;
pp->siang = tang;
}
QuakeViewChange(camerapp, &quake_z, &quake_x, &quake_y, &quake_ang);
VisViewChange(camerapp, &g_visibility);
tz = tz + quake_z;
tx = tx + quake_x;
ty = ty + quake_y;
//tq16horiz = tq16horiz + fix16_from_int(quake_x);
tq16ang = fix16_sadd(tq16ang, fix16_from_int(quake_ang)) & 0x7FFFFFF;
//thoriz = thoriz + quake_x;
tang = NORM_ANGLE(tang + quake_ang);
if (pp->sop_remote)
{
if (TEST_BOOL1(pp->remote_sprite))
tq16ang = fix16_from_int(pp->remote_sprite->ang);
tang = pp->remote_sprite->ang;
else
tq16ang = fix16_from_int(getangle(pp->sop_remote->xmid - tx, pp->sop_remote->ymid - ty));
tang = getangle(pp->sop_remote->xmid - tx, pp->sop_remote->ymid - ty);
}
//if (TEST(camerapp->Flags, PF_VIEW_FROM_OUTSIDE))
if (TEST(pp->Flags, PF_VIEW_FROM_OUTSIDE))
{
BackView(&tx, &ty, &tz, &tsectnum, &tq16ang, fix16_to_int(tq16horiz));
BackView(&tx, &ty, &tz, &tsectnum, &tang, thoriz);
}
else
{
bob_amt = camerapp->bob_amt;
if (DemoMode || CameraTestMode)
{
CameraView(camerapp, &tx, &ty, &tz, &tsectnum, &tq16ang, &tq16horiz);
}
CameraView(camerapp, &tx, &ty, &tz, &tsectnum, &tang, &thoriz);
}
if (!TEST(pp->Flags, PF_VIEW_FROM_CAMERA|PF_VIEW_FROM_OUTSIDE))
@ -2102,8 +2099,10 @@ drawscreen(PLAYERp pp)
tz += camerapp->bob_z;
// recoil only when not in camera
//tq16horiz = fix16_clamp(fix16_sadd(tq16horiz, fix16_from_int(camerapp->recoil_horizoff)), fix16_from_int(PLAYER_HORIZ_MIN), fix16_from_int(PLAYER_HORIZ_MAX));
tq16horiz = fix16_clamp(fix16_sadd(tq16horiz, fix16_from_int(pp->recoil_horizoff)), fix16_from_int(PLAYER_HORIZ_MIN), fix16_from_int(PLAYER_HORIZ_MAX));
//thoriz = thoriz + camerapp->recoil_horizoff;
thoriz = thoriz + pp->recoil_horizoff;
thoriz = max(thoriz, PLAYER_HORIZ_MIN);
thoriz = min(thoriz, PLAYER_HORIZ_MAX);
}
if (r_usenewaspect)
@ -2118,25 +2117,25 @@ drawscreen(PLAYERp pp)
if (dimensionmode != 6)// && !ScreenSavePic)
{
// Cameras must be done before the main loop.
JS_DrawCameras(pp, tx, ty, tz);
JS_DrawCameras(pp, tx, ty, tz, tang, thoriz);
}
screen->BeginScene();
OverlapDraw = TRUE;
DrawOverlapRoom(tx, ty, tz, tq16ang, tq16horiz, tsectnum);
DrawOverlapRoom(tx, ty, tz, tang, thoriz, tsectnum);
OverlapDraw = FALSE;
if (dimensionmode != 6)// && !ScreenSavePic)
{
// TEST this! Changed to camerapp
//JS_DrawMirrors(camerapp, tx, ty, tz, tq16ang, tq16horiz);
JS_DrawMirrors(pp, tx, ty, tz, tq16ang, tq16horiz);
//JS_DrawMirrors(camerapp, tx, ty, tz, tang, thoriz);
JS_DrawMirrors(pp, tx, ty, tz, tang, thoriz);
}
// TODO: This call is redundant if the tiled overhead map is shown, but the
// HUD elements should be properly outputted with hardware rendering first.
if (!FAF_DebugView)
FAF_DrawRooms(tx, ty, tz, tq16ang, tq16horiz, tsectnum);
FAF_DrawRooms(tx, ty, tz, tang, thoriz, tsectnum);
analyzesprites(tx, ty, tz, FALSE);
post_analyzesprites();
@ -2187,10 +2186,12 @@ drawscreen(PLAYERp pp)
if ((dimensionmode == 5 || dimensionmode == 6) && pp == Player+myconnectindex)
{
if (pp->ScrollMode2D)
extern SWBOOL ScrollMode2D;
if (ScrollMode2D)
{
tx = pp->mfposx;
ty = pp->mfposy;
tx = Follow_posx;
ty = Follow_posy;
}
for (j = 0; j < MAXSPRITES; j++)
@ -2210,11 +2211,11 @@ drawscreen(PLAYERp pp)
{
// only clear the actual window.
twod->AddColorOnlyQuad(windowxy1.x, windowxy1.y, (windowxy2.x + 1) - windowxy1.x, (windowxy2.y + 1) - windowxy1.y, 0xff000000);
renderDrawMapView(tx, ty, zoom, fix16_to_int(tq16ang));
renderDrawMapView(tx, ty, zoom, tang);
}
// Draw the line map on top of texture 2d map or just stand alone
drawoverheadmap(tx, ty, zoom, fix16_to_int(tq16ang), pp->ScrollMode2D);
drawoverheadmap(tx, ty, zoom, tang);
}
for (j = 0; j < MAXSPRITES; j++)
@ -2259,6 +2260,8 @@ drawscreen(PLAYERp pp)
if (!M_Active())
SecretInfo(pp);
videoNextPage();
#if SYNC_TEST
SyncStatMessage();
#endif
@ -2270,9 +2273,6 @@ drawscreen(PLAYERp pp)
short_restoreinterpolations(); // Stick at end of drawscreen
PostDraw();
videoNextPage();
DrawScreen = FALSE;
}
@ -2345,7 +2345,7 @@ DrawCompass(PLAYERp pp)
if (gs.BorderNum < BORDER_BAR || pp - Player != screenpeek)
return;
ang = fix16_to_int(pp->q16ang);
ang = pp->pang;
if (pp->sop_remote)
ang = 0;

View file

@ -52,7 +52,6 @@ Things required to make savegames work:
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "interp.h"
#include "tags.h"
#include "sector.h"
#include "sprite.h"
@ -147,6 +146,7 @@ char DemoText[3][64];
int DemoTextYstart = 0;
SWBOOL DoubleInitAWE32 = FALSE;
int Follow_posx=0,Follow_posy=0;
SWBOOL NoMeters = FALSE;
short IntroAnimCount = 0;
@ -186,8 +186,8 @@ SWBOOL NoDemoStartup = FALSE;
SWBOOL FirstTimeIntoGame;
SWBOOL BorderAdjust = FALSE;
SWBOOL InterpolateSectObj;
SWBOOL LocationInfo = 0;
void drawoverheadmap(int cposx, int cposy, int czoom, short cang);
int DispFrameRate = FALSE;
int DispMono = TRUE;
int Fog = FALSE;
@ -228,6 +228,7 @@ SWBOOL PauseMode = FALSE;
SWBOOL PauseKeySet = FALSE;
SWBOOL SlowMode = FALSE;
SWBOOL FrameAdvanceTics = 3;
SWBOOL ScrollMode2D = FALSE;
SWBOOL DebugSO = FALSE;
SWBOOL DebugPanel = FALSE;
@ -275,8 +276,6 @@ uint8_t DebugPrintColor = 255;
int krandcount;
SW_PACKET localInput;
/// L O C A L P R O T O T Y P E S /////////////////////////////////////////////////////////
void BOT_DeleteAllBots(void);
void BotPlayerInsert(PLAYERp pp);
@ -286,7 +285,6 @@ void MenuLevel(void);
void StatScreen(PLAYERp mpp);
void InitRunLevel(void);
void RunLevel(void);
void getinput(int playerNum);
/////////////////////////////////////////////////////////////////////////////////////////////
static FILE *debug_fout = NULL;
@ -588,8 +586,7 @@ void TerminateGame(void)
bool LoadLevel(const char *filename)
{
int16_t ang;
if (engineLoadBoard(filename, SW_SHAREWARE ? 1 : 0, (vec3_t *)&Player[0], &ang, &Player[0].cursectnum) == -1)
if (engineLoadBoard(filename, SW_SHAREWARE ? 1 : 0, (vec3_t *)&Player[0], &Player[0].pang, &Player[0].cursectnum) == -1)
{
Printf("Level not found: %s", filename);
return false;
@ -597,7 +594,6 @@ bool LoadLevel(const char *filename)
currentLevel = &mapList[Level];
SECRET_SetMapName(currentLevel->DisplayName(), currentLevel->name);
STAT_NewLevel(currentLevel->labelName);
Player[0].q16ang = fix16_from_int(ang);
return true;
}
@ -943,7 +939,6 @@ void InitLevelGlobals(void)
AnimCnt = 0;
left_foot = FALSE;
screenpeek = myconnectindex;
numinterpolations = short_numinterpolations = 0;
gNet.TimeLimitClock = gNet.TimeLimit;
@ -951,7 +946,6 @@ void InitLevelGlobals(void)
sumowasseen = FALSE;
zillawasseen = FALSE;
memset(BossSpriteNum,-1,sizeof(BossSpriteNum));
InterpolateSectObj = !CommEnabled;// && !PedanticMode;
}
void InitLevelGlobals2(void)
@ -2392,6 +2386,48 @@ void dsprintf_null(char *str, const char *format, ...)
va_list arglist;
}
void MoveLoop(void)
{
int pnum;
getpackets();
if (PredictionOn && CommEnabled)
{
while (predictmovefifoplc < Player[myconnectindex].movefifoend)
{
DoPrediction(ppp);
}
}
//While you have new input packets to process...
if (!CommEnabled)
bufferjitter = 0;
while (Player[myconnectindex].movefifoend - movefifoplc > bufferjitter)
{
//Make sure you have at least 1 packet from everyone else
for (pnum=connecthead; pnum>=0; pnum=connectpoint2[pnum])
{
if (movefifoplc == Player[pnum].movefifoend)
{
break;
}
}
//Pnum is >= 0 only if last loop was broken, meaning a player wasn't caught up
if (pnum >= 0)
break;
domovethings();
#if DEBUG
//if (DemoSyncRecord)
// demosync_record();
#endif
}
}
void InitPlayerGameSettings(void)
{
@ -2505,6 +2541,8 @@ void InitRunLevel(void)
StartAmbientSound();
}
void faketimerhandler();
void RunLevel(void)
{
InitRunLevel();
@ -2519,45 +2557,22 @@ void RunLevel(void)
handleevents();
OSD_DispatchQueued();
D_ProcessEvents();
faketimerhandler();
if (LoadGameOutsideMoveLoop)
{
return; // Stop the game loop if a savegame was loaded from the menu.
}
if (M_Active() || GUICapture || GamePaused)
if (M_Active())
{
ototalclock = (int)totalclock - (120 / synctics);
buttonMap.ResetButtonStates();
ototalclock = (int)totalclock;
}
else
{
PLAYERp const pp = Player + myconnectindex;
while ((totalclock - ototalclock) >= synctics)
{
ototalclock += synctics;
getinput(myconnectindex);
auto const q16ang = fix16_to_int(pp->q16ang);
auto & input = pp->inputfifo[Player[myconnectindex].movefifoend & (MOVEFIFOSIZ - 1)];
input = localInput;
input.vel = mulscale9(localInput.vel, sintable[NORM_ANGLE(q16ang + 512)]) +
mulscale9(localInput.svel, sintable[NORM_ANGLE(q16ang)]);
input.svel = mulscale9(localInput.vel, sintable[NORM_ANGLE(q16ang)]) +
mulscale9(localInput.svel, sintable[NORM_ANGLE(q16ang + 1536)]);
pp->movefifoend++;
localInput = {};
domovethings();
}
if (!pp->ScrollMode2D && !pp->on_vehicle)
getinput(myconnectindex);
MoveLoop();
}
drawscreen(Player + screenpeek);
if (QuitFlag)
@ -2774,7 +2789,7 @@ void ManualPlayerInsert(PLAYERp pp)
npp->posx = pp->posx;
npp->posy = pp->posy;
npp->posz = pp->posz;
npp->q16ang = pp->q16ang;
npp->pang = pp->pang;
npp->cursectnum = pp->cursectnum;
myconnectindex = numplayers;
@ -2804,7 +2819,7 @@ void BotPlayerInsert(PLAYERp pp)
npp->posx = pp->posx;
npp->posy = pp->posy;
npp->posz = pp->posz-Z(100);
npp->q16ang = pp->q16ang;
npp->pang = pp->pang;
npp->cursectnum = pp->cursectnum;
//myconnectindex = numplayers;
@ -3007,15 +3022,11 @@ void PauseKey(PLAYERp pp)
short MirrorDelay;
double elapsedInputTicks;
double scaleAdjustmentToInterval(double x) { return x * (120 / synctics) / (1000.0 / elapsedInputTicks); }
void DoPlayerHorizon(PLAYERp pp, fix16_t *q16horz);
void getinput(int const playerNum)
void getinput(SW_PACKET *loc)
{
int i;
PLAYERp pp = Player + playerNum;
PLAYERp pp = Player + myconnectindex;
PLAYERp newpp = Player + myconnectindex;
int inv_hotkey = 0;
#define TURBOTURNTIME (120/8)
@ -3025,27 +3036,26 @@ void getinput(int const playerNum)
#define NORMALKEYMOVE 35
#define MAXVEL ((NORMALKEYMOVE*2)+10)
#define MAXSVEL ((NORMALKEYMOVE*2)+10)
#define MAXANGVEL 1024
#define MAXHORIZVEL 256
#define TURN_SHIFT 4
#define SET_LOC_KEY(bits, sync_num, key_test) SET(bits, ((!!(key_test)) << (sync_num)))
#define MAXANGVEL 100
#define MAXAIMVEL 128
#define SET_LOC_KEY(loc, sync_num, key_test) SET(loc, ((!!(key_test)) << (sync_num)))
static int32_t turnheldtime;
int32_t momx, momy;
// reset objects.
SW_PACKET input {};
localInput = {};
localInput.bits = 0;
extern SWBOOL MenuButtonAutoRun;
extern SWBOOL MenuButtonAutoAim;
if (Prediction && CommEnabled)
{
pp = ppp;
newpp = ppp;
}
// reset all syncbits
loc->bits = 0;
// MAKE SURE THIS WILL GET SET
SET_LOC_KEY(localInput.bits, SK_QUIT_GAME, MultiPlayQuitFlag);
SET_LOC_KEY(loc->bits, SK_QUIT_GAME, MultiPlayQuitFlag);
bool mouseaim = in_mousemode || buttonMap.ButtonDown(gamefunc_Mouse_Aiming);
@ -3055,23 +3065,78 @@ void getinput(int const playerNum)
// this needs to be fixed properly - as it is this can never be compatible with demo playback.
if (mouseaim)
SET(Player[playerNum].Flags, PF_MOUSE_AIMING_ON);
SET(Player[myconnectindex].Flags, PF_MOUSE_AIMING_ON);
else
RESET(Player[playerNum].Flags, PF_MOUSE_AIMING_ON);
RESET(Player[myconnectindex].Flags, PF_MOUSE_AIMING_ON);
if (cl_autoaim)
SET(Player[playerNum].Flags, PF_AUTO_AIM);
else
RESET(Player[playerNum].Flags, PF_AUTO_AIM);
}
SET(Player[myconnectindex].Flags, PF_AUTO_AIM);
else
RESET(Player[myconnectindex].Flags, PF_AUTO_AIM);
}
ControlInfo info;
CONTROL_GetInput(&info);
//info.dz = (info.dz * move_scale)>>8;
//info.dyaw = (info.dyaw * turn_scale)>>8;
PauseKey(pp);
if (PauseKeySet)
return;
// MAP KEY
if (buttonMap.ButtonDown(gamefunc_Map))
{
buttonMap.ClearButton(gamefunc_Map);
// Init follow coords
Follow_posx = pp->posx;
Follow_posy = pp->posy;
if (dimensionmode == 3)
dimensionmode = 5;
else if (dimensionmode == 5)
dimensionmode = 6;
else
{
MirrorDelay = 1;
dimensionmode = 3;
SetFragBar(pp);
ScrollMode2D = FALSE;
SetRedrawScreen(pp);
}
}
// Toggle follow map mode on/off
if (dimensionmode == 5 || dimensionmode == 6)
{
if (buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
ScrollMode2D = !ScrollMode2D;
Follow_posx = pp->posx;
Follow_posy = pp->posy;
}
}
// If in 2D follow mode, scroll around using glob vars
// Tried calling this in domovethings, but key response it too poor, skips key presses
// Note: ScrollMode2D = Follow mode, so this get called only during follow mode
if (ScrollMode2D && pp == Player + myconnectindex && !Prediction)
MoveScrollMode2D(Player + myconnectindex);
// !JIM! Added M_Active() so that you don't move at all while using menus
if (M_Active() || ScrollMode2D || InputMode)
return;
SET_LOC_KEY(loc->bits, SK_SPACE_BAR, ((!!inputState.GetKeyStatus(KEYSC_SPACE)) | buttonMap.ButtonDown(gamefunc_Open)));
int const running = G_CheckAutorun(buttonMap.ButtonDown(gamefunc_Run));
int32_t turnamount;
int32_t keymove;
constexpr int analogTurnAmount = (NORMALTURN << 1);
constexpr int const analogExtent = 32767; // KEEPINSYNC sdlayer.cpp
if (running)
@ -3093,178 +3158,58 @@ void getinput(int const playerNum)
keymove = NORMALKEYMOVE;
}
PauseKey(pp);
if (PauseKeySet)
return;
// MAP KEY
if (buttonMap.ButtonDown(gamefunc_Map))
{
buttonMap.ClearButton(gamefunc_Map);
// Init follow coords
pp->mfposx = pp->posx;
pp->mfposy = pp->posy;
if (dimensionmode == 3)
dimensionmode = 5;
else if (dimensionmode == 5)
dimensionmode = 6;
else
{
MirrorDelay = 1;
dimensionmode = 3;
SetFragBar(pp);
pp->ScrollMode2D = FALSE;
SetRedrawScreen(pp);
}
}
// Toggle follow map mode on/off
if (dimensionmode == 5 || dimensionmode == 6)
{
if (buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
pp->ScrollMode2D = !pp->ScrollMode2D;
pp->mfposx = pp->posx;
pp->mfposy = pp->posy;
}
}
// If in 2D follow mode, scroll around.
if (pp->ScrollMode2D && !Prediction)
{
keymove = keymove / 2;
if (M_Active())
return;
// Recenter view if told
if (buttonMap.ButtonDown(gamefunc_Center_View))
{
pp->mfposx = pp->posx;
pp->mfposy = pp->posy;
}
// Toggle follow map mode on/off
if (buttonMap.ButtonDown(gamefunc_Map_Follow_Mode))
{
buttonMap.ClearButton(gamefunc_Map_Follow_Mode);
pp->ScrollMode2D = !pp->ScrollMode2D;
// Reset coords
pp->mfposx = pp->posx;
pp->mfposy = pp->posy;
}
if (buttonMap.ButtonDown(gamefunc_Strafe))
input.svel -= info.dyaw>>2;
input.svel -= info.dx>>2;
input.vel = -info.dz>>2;
if (!ConPanel)
{
if (!HelpInputMode)
{
if (buttonMap.ButtonDown(gamefunc_Turn_Left))
input.svel += keymove;
if (buttonMap.ButtonDown(gamefunc_Turn_Right))
input.svel += -keymove;
if (buttonMap.ButtonDown(gamefunc_Move_Forward))
input.vel += keymove;
if (buttonMap.ButtonDown(gamefunc_Move_Backward))
input.vel += -keymove;
}
if (!InputMode)
{
if (buttonMap.ButtonDown(gamefunc_Strafe_Left))
input.svel += keymove;
if (buttonMap.ButtonDown(gamefunc_Strafe_Right))
input.svel += -keymove;
}
}
input.vel = clamp(input.vel, -MAXVEL, MAXVEL);
input.svel = clamp(input.svel, -MAXSVEL, MAXSVEL);
pp->mfposx += mulscale9(input.vel, sintable[NORM_ANGLE(fix16_to_int(pp->q16ang) + 512)]) +
mulscale9(input.svel, sintable[NORM_ANGLE(fix16_to_int(pp->q16ang))]);
pp->mfposy += mulscale9(input.vel, sintable[NORM_ANGLE(fix16_to_int(pp->q16ang))]) +
mulscale9(input.svel, sintable[NORM_ANGLE(fix16_to_int(pp->q16ang) + 1536)]);
pp->mfposx = max(pp->mfposx, x_min_bound);
pp->mfposy = max(pp->mfposy, y_min_bound);
pp->mfposx = min(pp->mfposx, x_max_bound);
pp->mfposy = min(pp->mfposy, y_max_bound);
}
// !JIM! Added M_Active() so that you don't move at all while using menus
if (M_Active() || pp->ScrollMode2D || InputMode)
return;
SET_LOC_KEY(localInput.bits, SK_SPACE_BAR, ((!!inputState.GetKeyStatus(KEYSC_SPACE)) | buttonMap.ButtonDown(gamefunc_Open)));
info.dz = (info.dz * move_scale)>>8;
info.dyaw = (info.dyaw * turn_scale)>>8;
int32_t svel = 0, vel = 0, angvel = 0, aimvel = 0;
if (buttonMap.ButtonDown(gamefunc_Strafe) && !pp->sop)
{
input.svel = -info.mousex;
input.svel -= info.dyaw * keymove / analogExtent;
svel = -info.mousex;
svel -= info.dyaw * keymove / analogExtent;
}
else
{
input.q16avel = fix16_sadd(input.q16avel, fix16_sdiv(fix16_from_int(info.mousex), fix16_from_int(32)));
input.q16avel = fix16_sadd(input.q16avel, fix16_from_int(info.dyaw * analogTurnAmount / (analogExtent >> 1)));
angvel = info.mousex / 32;
angvel += info.dyaw * (turnamount << 1) / analogExtent;
}
if (mouseaim)
input.q16horz = fix16_sadd(input.q16horz, fix16_sdiv(fix16_from_int(info.mousey), fix16_from_int(64)));
aimvel = -info.mousey / 64;
else
input.vel = -(info.mousey >> 6);
vel = -(info.mousey >> 6);
if (!in_mouseflip)
input.q16horz = -input.q16horz;
if (in_mouseflip)
aimvel = -aimvel;
input.q16horz = fix16_ssub(input.q16horz, fix16_from_int(info.dpitch * analogTurnAmount / analogExtent));
input.svel -= info.dx * keymove / analogExtent;
input.vel -= info.dz * keymove / analogExtent;
static double lastInputTicks;
auto const currentHiTicks = timerGetHiTicks();
elapsedInputTicks = currentHiTicks - lastInputTicks;
lastInputTicks = currentHiTicks;
aimvel -= info.dpitch * turnamount / analogExtent;
svel -= info.dx * keymove / analogExtent;
vel -= info.dz * keymove / analogExtent;
if (buttonMap.ButtonDown(gamefunc_Strafe) && !pp->sop)
{
if (!localInput.svel)
{
if (buttonMap.ButtonDown(gamefunc_Turn_Left) && !localInput.svel)
input.svel = keymove;
if (buttonMap.ButtonDown(gamefunc_Turn_Right) && !localInput.svel)
input.svel = -keymove;
}
if (buttonMap.ButtonDown(gamefunc_Turn_Left))
svel -= -keymove;
if (buttonMap.ButtonDown(gamefunc_Turn_Right))
svel -= keymove;
}
else
{
if (buttonMap.ButtonDown(gamefunc_Turn_Left))
{
turnheldtime += synctics;
input.q16avel = fix16_ssub(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval((turnheldtime >= TURBOTURNTIME) ? turnamount : PREAMBLETURN)));
if (turnheldtime >= TURBOTURNTIME)
angvel -= turnamount;
else
angvel -= PREAMBLETURN;
}
else if (buttonMap.ButtonDown(gamefunc_Turn_Right))
{
turnheldtime += synctics;
input.q16avel = fix16_sadd(input.q16avel, fix16_from_dbl(scaleAdjustmentToInterval((turnheldtime >= TURBOTURNTIME) ? turnamount : PREAMBLETURN)));
if (turnheldtime >= TURBOTURNTIME)
angvel += turnamount;
else
angvel += PREAMBLETURN;
}
else
{
@ -3272,119 +3217,43 @@ void getinput(int const playerNum)
}
}
if (localInput.svel < keymove && localInput.svel > -keymove)
{
if (buttonMap.ButtonDown(gamefunc_Strafe_Left) && !pp->sop)
input.svel += keymove;
if (buttonMap.ButtonDown(gamefunc_Strafe_Left) && !pp->sop)
svel += keymove;
if (buttonMap.ButtonDown(gamefunc_Strafe_Right) && !pp->sop)
input.svel += -keymove;
if (buttonMap.ButtonDown(gamefunc_Strafe_Right) && !pp->sop)
svel += -keymove;
if (buttonMap.ButtonDown(gamefunc_Move_Forward))
{
vel += keymove;
//DSPRINTF(ds,"vel key %d",vel);
//DebugWriteString(ds);
}
else
{
//DSPRINTF(ds,"vel %d",vel);
//DebugWriteString(ds);
}
if (localInput.vel < keymove && localInput.vel > -keymove)
{
if (buttonMap.ButtonDown(gamefunc_Move_Forward))
input.vel += keymove;
if (buttonMap.ButtonDown(gamefunc_Move_Backward))
vel += -keymove;
if (buttonMap.ButtonDown(gamefunc_Move_Backward))
input.vel += -keymove;
}
vel = clamp(vel, -MAXVEL, MAXVEL);
svel = clamp(svel, -MAXSVEL, MAXSVEL);
localInput.vel = clamp(localInput.vel + input.vel, -MAXVEL, MAXVEL);
localInput.svel = clamp(localInput.svel + input.svel, -MAXSVEL, MAXSVEL);
angvel = clamp(angvel, -MAXANGVEL, MAXANGVEL);
aimvel = clamp(aimvel, -MAXAIMVEL, MAXAIMVEL);
localInput.q16avel = fix16_clamp(fix16_sadd(localInput.q16avel, input.q16avel), fix16_from_int(-MAXANGVEL), fix16_from_int(MAXANGVEL));
localInput.q16horz = fix16_clamp(fix16_sadd(localInput.q16horz, input.q16horz), fix16_from_int(-MAXHORIZVEL), fix16_from_int(MAXHORIZVEL));
momx = mulscale9(vel, sintable[NORM_ANGLE(newpp->pang + 512)]);
momy = mulscale9(vel, sintable[NORM_ANGLE(newpp->pang)]);
// actually snap
SET_LOC_KEY(localInput.bits, SK_SNAP_UP, buttonMap.ButtonDown(gamefunc_Aim_Up));
SET_LOC_KEY(localInput.bits, SK_SNAP_DOWN, buttonMap.ButtonDown(gamefunc_Aim_Down));
momx += mulscale9(svel, sintable[NORM_ANGLE(newpp->pang)]);
momy += mulscale9(svel, sintable[NORM_ANGLE(newpp->pang + 1536)]);
// actually just look
SET_LOC_KEY(localInput.bits, SK_LOOK_UP, buttonMap.ButtonDown(gamefunc_Look_Up));
SET_LOC_KEY(localInput.bits, SK_LOOK_DOWN, buttonMap.ButtonDown(gamefunc_Look_Down));
SET_LOC_KEY(localInput.bits, SK_CENTER_VIEW, buttonMap.ButtonDown(gamefunc_Center_View));
SET_LOC_KEY(localInput.bits, SK_TURN_180, buttonMap.ButtonDown(gamefunc_TurnAround));
pp->on_vehicle = P_CheckOperatingVehicle(pp);
if (!TEST(pp->Flags, PF_DEAD) && !pp->on_vehicle)
{
if (!TEST(pp->Flags, PF_CLIMBING))
{
if (!TEST(pp->Flags, PF_TURN_180))
{
if (TEST_SYNC_KEY(pp, SK_TURN_180))
{
if (FLAG_KEY_PRESSED(pp, SK_TURN_180))
{
fix16_t delta_q16ang;
FLAG_KEY_RELEASE(pp, SK_TURN_180);
pp->turn180_target = fix16_sadd(pp->q16ang, fix16_from_int(1024)) & 0x7FFFFFF;
// make the first turn in the clockwise direction
// the rest will follow
delta_q16ang = GetDeltaAngleQ16(pp->turn180_target, pp->q16ang);
pp->q16ang = fix16_sadd(pp->q16ang, fix16_max(fix16_one, fix16_from_dbl(scaleAdjustmentToInterval(fix16_to_dbl(fix16_sdiv(fix16_abs(delta_q16ang), fix16_from_int(TURN_SHIFT))))))) & 0x7FFFFFF;
SET(pp->Flags, PF_TURN_180);
}
}
else
{
FLAG_KEY_RESET(pp, SK_TURN_180);
}
}
if (TEST(pp->Flags, PF_TURN_180))
{
fix16_t delta_q16ang;
delta_q16ang = GetDeltaAngleQ16(pp->turn180_target, pp->q16ang);
pp->q16ang = fix16_sadd(pp->q16ang, fix16_from_dbl(scaleAdjustmentToInterval(fix16_to_dbl(fix16_sdiv(fix16_abs(delta_q16ang), fix16_from_int(TURN_SHIFT)))))) & 0x7FFFFFF;
sprite[pp->PlayerSprite].ang = fix16_to_int(pp->q16ang);
if (!Prediction)
{
if (pp->PlayerUnderSprite >= 0)
sprite[pp->PlayerUnderSprite].ang = fix16_to_int(pp->q16ang);
}
// get new delta to see how close we are
delta_q16ang = GetDeltaAngleQ16(pp->turn180_target, pp->q16ang);
if (fix16_abs(delta_q16ang) < (fix16_one << 1))
{
pp->q16ang = pp->turn180_target;
RESET(pp->Flags, PF_TURN_180);
}
else
return;
}
if (input.q16avel != 0)
{
pp->q16ang = fix16_sadd(pp->q16ang, input.q16avel) & 0x7FFFFFF;
// update players sprite angle
// NOTE: It's also updated in UpdatePlayerSprite, but needs to be
// here to cover
// all cases.
sprite[pp->PlayerSprite].ang = fix16_to_int(pp->q16ang);
if (!Prediction)
{
if (pp->PlayerUnderSprite >= 0)
sprite[pp->PlayerUnderSprite].ang = fix16_to_int(pp->q16ang);
}
}
}
DoPlayerHorizon(pp, &localInput.q16horz);
}
loc->vel = momx;
loc->svel = momy;
loc->angvel = angvel;
loc->aimvel = aimvel;
if (!CommEnabled)
{
@ -3394,29 +3263,39 @@ void getinput(int const playerNum)
{
MenuButtonAutoAim = FALSE;
if ((!!TEST(pp->Flags, PF_AUTO_AIM)) != !!cl_autoaim)
SET_LOC_KEY(localInput.bits, SK_AUTO_AIM, TRUE);
SET_LOC_KEY(loc->bits, SK_AUTO_AIM, TRUE);
}
#endif
}
else if (inputState.GetKeyStatus(sc_Pause))
{
SET_LOC_KEY(localInput.bits, SK_PAUSE, inputState.GetKeyStatus(sc_Pause));
SET_LOC_KEY(loc->bits, SK_PAUSE, inputState.GetKeyStatus(sc_Pause));
inputState.ClearKeyStatus(sc_Pause);
}
SET_LOC_KEY(localInput.bits, SK_RUN, buttonMap.ButtonDown(gamefunc_Run));
SET_LOC_KEY(localInput.bits, SK_SHOOT, buttonMap.ButtonDown(gamefunc_Fire));
SET_LOC_KEY(loc->bits, SK_CENTER_VIEW, buttonMap.ButtonDown(gamefunc_Center_View));
SET_LOC_KEY(loc->bits, SK_RUN, buttonMap.ButtonDown(gamefunc_Run));
SET_LOC_KEY(loc->bits, SK_SHOOT, buttonMap.ButtonDown(gamefunc_Fire));
// actually snap
SET_LOC_KEY(loc->bits, SK_SNAP_UP, buttonMap.ButtonDown(gamefunc_Aim_Up));
SET_LOC_KEY(loc->bits, SK_SNAP_DOWN, buttonMap.ButtonDown(gamefunc_Aim_Down));
// actually just look
SET_LOC_KEY(loc->bits, SK_LOOK_UP, buttonMap.ButtonDown(gamefunc_Look_Up));
SET_LOC_KEY(loc->bits, SK_LOOK_DOWN, buttonMap.ButtonDown(gamefunc_Look_Down));
for (i = 0; i < MAX_WEAPONS_KEYS; i++)
{
if (buttonMap.ButtonDown(gamefunc_Weapon_1 + i))
{
SET(localInput.bits, i + 1);
SET(loc->bits, i + 1);
break;
}
}
if (buttonMap.ButtonPressed(gamefunc_Next_Weapon))
if (buttonMap.ButtonDown(gamefunc_Next_Weapon))
{
USERp u = User[pp->PlayerSprite];
short next_weapon = u->WeaponNum + 1;
@ -3452,11 +3331,11 @@ void getinput(int const playerNum)
}
}
SET(localInput.bits, next_weapon + 1);
SET(loc->bits, next_weapon + 1);
}
if (buttonMap.ButtonPressed(gamefunc_Previous_Weapon))
if (buttonMap.ButtonDown(gamefunc_Previous_Weapon))
{
USERp u = User[pp->PlayerSprite];
short prev_weapon = u->WeaponNum - 1;
@ -3490,7 +3369,7 @@ void getinput(int const playerNum)
}
}
SET(localInput.bits, prev_weapon + 1);
SET(loc->bits, prev_weapon + 1);
}
if (buttonMap.ButtonDown(gamefunc_Alt_Weapon))
@ -3498,7 +3377,7 @@ void getinput(int const playerNum)
buttonMap.ClearButton(gamefunc_Alt_Weapon);
USERp u = User[pp->PlayerSprite];
short const which_weapon = u->WeaponNum + 1;
SET(localInput.bits, which_weapon);
SET(loc->bits, which_weapon);
}
@ -3516,21 +3395,23 @@ void getinput(int const playerNum)
if (buttonMap.ButtonDown(gamefunc_Caltrops))
inv_hotkey = INVENTORY_CALTROPS+1;
SET(localInput.bits, inv_hotkey<<SK_INV_HOTKEY_BIT0);
SET(loc->bits, inv_hotkey<<SK_INV_HOTKEY_BIT0);
SET_LOC_KEY(localInput.bits, SK_INV_USE, buttonMap.ButtonDown(gamefunc_Inventory));
SET_LOC_KEY(loc->bits, SK_INV_USE, buttonMap.ButtonDown(gamefunc_Inventory));
SET_LOC_KEY(localInput.bits, SK_OPERATE, buttonMap.ButtonDown(gamefunc_Open));
SET_LOC_KEY(localInput.bits, SK_JUMP, buttonMap.ButtonDown(gamefunc_Jump));
SET_LOC_KEY(localInput.bits, SK_CRAWL, buttonMap.ButtonDown(gamefunc_Crouch));
SET_LOC_KEY(loc->bits, SK_OPERATE, buttonMap.ButtonDown(gamefunc_Open));
SET_LOC_KEY(loc->bits, SK_JUMP, buttonMap.ButtonDown(gamefunc_Jump));
SET_LOC_KEY(loc->bits, SK_CRAWL, buttonMap.ButtonDown(gamefunc_Crouch));
SET_LOC_KEY(localInput.bits, SK_INV_LEFT, buttonMap.ButtonDown(gamefunc_Inventory_Left));
SET_LOC_KEY(localInput.bits, SK_INV_RIGHT, buttonMap.ButtonDown(gamefunc_Inventory_Right));
SET_LOC_KEY(loc->bits, SK_TURN_180, buttonMap.ButtonDown(gamefunc_TurnAround));
SET_LOC_KEY(localInput.bits, SK_HIDE_WEAPON, buttonMap.ButtonDown(gamefunc_Holster_Weapon));
SET_LOC_KEY(loc->bits, SK_INV_LEFT, buttonMap.ButtonDown(gamefunc_Inventory_Left));
SET_LOC_KEY(loc->bits, SK_INV_RIGHT, buttonMap.ButtonDown(gamefunc_Inventory_Right));
SET_LOC_KEY(loc->bits, SK_HIDE_WEAPON, buttonMap.ButtonDown(gamefunc_Holster_Weapon));
// need BUTTON
SET_LOC_KEY(localInput.bits, SK_CRAWL_LOCK, inputState.GetKeyStatus(KEYSC_NUM));
SET_LOC_KEY(loc->bits, SK_CRAWL_LOCK, inputState.GetKeyStatus(KEYSC_NUM));
if (gNet.MultiGameType == MULTI_GAME_COOPERATIVE)
{
@ -3543,7 +3424,7 @@ void getinput(int const playerNum)
if (screenpeek < 0)
screenpeek = connecthead;
if (dimensionmode != 2 && screenpeek == playerNum)
if (dimensionmode != 2 && screenpeek == myconnectindex)
{
// JBF: figure out what's going on here
DoPlayerDivePalette(pp); // Check Dive again
@ -3583,7 +3464,7 @@ void getinput(int const playerNum)
#define MAP_BLOCK_SPRITE (DK_BLUE + 6)
void drawoverheadmap(int cposx, int cposy, int czoom, short cang, SWBOOL ScrollMode2D)
void drawoverheadmap(int cposx, int cposy, int czoom, short cang)
{
int i, j, k, l, x1, y1, x2, y2, x3, y3, x4, y4, ox, oy, xoff, yoff;
int dax, day, cosang, sinang, xspan, yspan, sprx, spry;

View file

@ -540,11 +540,11 @@ int StdRandomRange(int range);
#define KENFACING_PLAYER(pp,sp) (sintable[NORM_ANGLE(sp->ang+512)]*(pp->posy-sp->y) >= sintable[NORM_ANGLE(sp-ang)]*(pp->posx-sp->x))
#define FACING_PLAYER(pp,sp) (labs(GetDeltaAngle((sp)->ang, NORM_ANGLE(getangle((pp)->posx - (sp)->x, (pp)->posy - (sp)->y)))) < 512)
#define PLAYER_FACING(pp,sp) (labs(GetDeltaAngle(fix16_to_int((pp)->q16ang), NORM_ANGLE(getangle((sp)->x - (pp)->posx, (sp)->y - (pp)->posy)))) < 320)
#define PLAYER_FACING(pp,sp) (labs(GetDeltaAngle((pp)->pang, NORM_ANGLE(getangle((sp)->x - (pp)->posx, (sp)->y - (pp)->posy)))) < 320)
#define FACING(sp1,sp2) (labs(GetDeltaAngle((sp2)->ang, NORM_ANGLE(getangle((sp1)->x - (sp2)->x, (sp1)->y - (sp2)->y)))) < 512)
#define FACING_PLAYER_RANGE(pp,sp,range) (labs(GetDeltaAngle((sp)->ang, NORM_ANGLE(getangle((pp)->posx - (sp)->x, (pp)->posy - (sp)->y)))) < (range))
#define PLAYER_FACING_RANGE(pp,sp,range) (labs(GetDeltaAngle(fix16_to_int((pp)->q16ang), NORM_ANGLE(getangle((sp)->x - (pp)->posx, (sp)->y - (pp)->posy)))) < (range))
#define PLAYER_FACING_RANGE(pp,sp,range) (labs(GetDeltaAngle((pp)->pang, NORM_ANGLE(getangle((sp)->x - (pp)->posx, (sp)->y - (pp)->posy)))) < (range))
#define FACING_RANGE(sp1,sp2,range) (labs(GetDeltaAngle((sp2)->ang, NORM_ANGLE(getangle((sp1)->x - (sp2)->x, (sp1)->y - (sp2)->y)))) < (range))
// two vectors
@ -874,8 +874,6 @@ extern int PlayerYellVocs[MAX_YELLSOUNDS];
void BossHealthMeter(void);
extern SWBOOL InterpolateSectObj;
// Global variables used for modifying variouse things from the Console
///////////////////////////////////////////////////////////////////////////////////////////
@ -1060,7 +1058,8 @@ typedef struct
{
int16_t vel;
int16_t svel;
fix16_t q16horz, q16avel;
int8_t angvel;
int8_t aimvel;
int32_t bits;
} SW_PACKET;
@ -1094,10 +1093,8 @@ struct PLAYERstruct
// interpolation
int
oposx, oposy, oposz;
fix16_t oq16horiz, oq16ang;
// Map follow mode pos values.
int32_t mfposx, mfposy;
short oang;
short ohoriz;
// holds last valid move position
short lv_sectnum;
@ -1121,6 +1118,7 @@ struct PLAYERstruct
int camera_dist; // view mode dist
int circle_camera_dist;
int six,siy,siz; // save player interp position for PlayerSprite
short siang;
int xvect, yvect;
int oxvect, oyvect;
@ -1131,6 +1129,8 @@ struct PLAYERstruct
int drive_angvel;
int drive_oangvel;
// scroll 2D mode stuff
int scr_x, scr_y, oscr_x, oscr_y;
int scr_xvect, scr_yvect;
@ -1140,12 +1140,11 @@ struct PLAYERstruct
short circle_camera_ang;
short camera_check_time_delay;
short cursectnum,lastcursectnum;
fix16_t turn180_target; // 180 degree turn
short pang,cursectnum,lastcursectnum;
short turn180_target; // 180 degree turn
// variables that do not fit into sprite structure
int hvel,tilt,tilt_dest;
fix16_t q16horiz, q16horizbase, q16horizoff, q16ang;
int horizbase,horiz,horizoff,hvel,tilt,tilt_dest;
short recoil_amt;
short recoil_speed;
short recoil_ndx;
@ -1153,7 +1152,7 @@ struct PLAYERstruct
int oldposx,oldposy,oldposz;
int RevolveX, RevolveY;
fix16_t RevolveDeltaAng, RevolveAng;
short RevolveDeltaAng, RevolveAng;
// under vars are for wading and swimming
short PlayerSprite, PlayerUnderSprite;
@ -1282,8 +1281,6 @@ struct PLAYERstruct
short Reverb; // Player's current reverb setting
short Heads; // Number of Accursed Heads orbiting player
int PlayerVersion;
SWBOOL on_vehicle, ScrollMode2D;
};
extern PLAYER Player[MAX_SW_PLAYERS_REG+1];
@ -1909,6 +1906,7 @@ typedef struct
extern SPIN Spin[17];
extern DOOR_AUTO_CLOSE DoorAutoClose[MAX_DOOR_AUTO_CLOSE];
extern int x_min_bound, y_min_bound, x_max_bound, y_max_bound;
#define MAXANIM 256
typedef void ANIM_CALLBACK (ANIMp, void *);
@ -2127,7 +2125,6 @@ void SetBorder(PLAYERp pp, int);
void SetFragBar(PLAYERp pp);
int Distance(int x1, int y1, int x2, int y2);
short GetDeltaAngle(short, short);
fix16_t GetDeltaAngleQ16(fix16_t, fix16_t);
int SetActorRotation(short SpriteNum,int,int);
int NewStateGroup(short SpriteNum, STATEp SpriteGroup[]);
@ -2295,6 +2292,7 @@ extern int lockspeed,totalsynctics;
#define synctics 3
#define ACTORMOVETICS (synctics<<1)
#define TICSPERMOVEMENT synctics
#define FAKETIMERHANDLER() if (totalclock >= ototalclock + synctics) faketimerhandler()
// subtract value from clipdist on getzrange calls
#define GETZRANGE_CLIP_ADJ 8
@ -2402,7 +2400,7 @@ int DoSkullBeginDeath(int16_t SpriteNum); // skull.c
void AnimateCacheCursor(void); // game.c
void TerminateGame(void); // game.c
void TerminateLevel(void); // game.c
void drawoverheadmap(int cposx,int cposy,int czoom,short cang, SWBOOL ScrollMode2D); // game.c
void drawoverheadmap(int cposx,int cposy,int czoom,short cang); // game.c
void DrawMenuLevelScreen(void); // game.c
void DebugWriteString(char *string); // game.c
void ManualPlayerInsert(PLAYERp pp); // game.c
@ -2425,7 +2423,7 @@ void ScreenCaptureKeys(void); // draw.c
int minigametext(int x,int y,const char *t,short dabits); // jplayer.c
void computergetinput(int snum,SW_PACKET *syn); // jplayer.c
void DrawOverlapRoom(int tx,int ty,int tz,fix16_t tq16ang,fix16_t tq16horiz,short tsectnum); // rooms.c
void DrawOverlapRoom(int tx,int ty,int tz,short tang,int thoriz,short tsectnum); // rooms.c
void SetupMirrorTiles(void); // rooms.c
SWBOOL FAF_Sector(short sectnum); // rooms.c
int GetZadjustment(short sectnum,short hitag); // rooms.c

View file

@ -33,6 +33,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
BEGIN_SW_NS
#define MAXINTERPOLATIONS 1024
int numinterpolations = 0, startofdynamicinterpolations = 0;
int oldipos[MAXINTERPOLATIONS];
int bakipos[MAXINTERPOLATIONS];
@ -110,12 +111,4 @@ void restoreinterpolations(void) // Stick at end of drawscreen
for (i = numinterpolations - 1; i >= 0; i--)
*curipos[i] = bakipos[i];
}
void togglespriteinterpolation(spritetype *sp, int set)
{
auto func = set ? setinterpolation : stopinterpolation;
func(&sp->x);
func(&sp->y);
func(&sp->z);
}
END_SW_NS

View file

@ -23,13 +23,6 @@ Original Source: 1997 - Frank Maddin and Jim Norwood
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
*/
//-------------------------------------------------------------------------
#ifndef INTERP_H
#define INTERP_H
#include "build.h"
BEGIN_SW_NS
#define SHORT_MAXINTERPOLATIONS 256
@ -38,7 +31,7 @@ extern short short_oldipos[SHORT_MAXINTERPOLATIONS];
extern short short_bakipos[SHORT_MAXINTERPOLATIONS];
extern short *short_curipos[SHORT_MAXINTERPOLATIONS];
#define MAXINTERPOLATIONS MAXSPRITES
#define MAXINTERPOLATIONS 1024
extern int numinterpolations, startofdynamicinterpolations;
extern int oldipos[MAXINTERPOLATIONS];
extern int bakipos[MAXINTERPOLATIONS];
@ -49,12 +42,4 @@ void stopinterpolation(int *posptr);
void updateinterpolations(void);
void dointerpolations(int smoothratio);
void restoreinterpolations(void);
void togglespriteinterpolation(spritetype *sp, int set);
static void FORCE_INLINE setspriteinterpolation(spritetype *sp) { togglespriteinterpolation(sp, 1); }
static void FORCE_INLINE stopspriteinterpolation(spritetype *sp) { togglespriteinterpolation(sp, 0); }
END_SW_NS
#endif

View file

@ -437,21 +437,21 @@ void computergetinput(int snum, SW_PACKET *syn)
myx = p->posx;
myy = p->posy;
myz = p->posz;
myang = fix16_to_int(p->q16ang);
myang = p->pang;
mycursectnum = p->cursectnum;
// Reset input bits
syn->vel = 0;
syn->svel = 0;
syn->q16avel = 0;
syn->q16horz = 0;
syn->angvel = 0;
syn->aimvel = 0;
syn->bits = 0;
x1 = p->posx;
y1 = p->posy;
z1 = p->posz;
damyang = fix16_to_int(p->q16ang);
damyang = p->pang;
damysect = sprite[p->PlayerSprite].sectnum;
if ((numplayers >= 2) && (snum == myconnectindex))
{ x1 = myx; y1 = myy; z1 = myz+PLAYER_HEIGHT; damyang = myang; damysect = mycursectnum; }
@ -596,7 +596,7 @@ void computergetinput(int snum, SW_PACKET *syn)
{
vec3_t hit_pos = { x1, y1, z1-PLAYER_HEIGHT };
hitscan(&hit_pos,damysect,sintable[(damyang+512)&2047],sintable[damyang&2047],
(100-fix16_to_int(p->q16horiz)-fix16_to_int(p->q16horizoff))*32,&hitinfo,CLIPMASK1);
(100-p->horiz-p->horizoff)*32,&hitinfo,CLIPMASK1);
if ((hitinfo.pos.x-x1)*(hitinfo.pos.x-x1)+(hitinfo.pos.y-y1)*(hitinfo.pos.y-y1) < 2560*2560) syn->bits &= ~(1<<SK_SHOOT);
}
@ -648,9 +648,9 @@ void computergetinput(int snum, SW_PACKET *syn)
daang = NORM_ANGLE((daang-64) + STD_RANDOM_RANGE(128));
// Below formula fails in certain cases
//syn->q16avel = fix16_from_int(min(max((((daang+1024-damyang)&2047)-1024)>>1,-MAXANGVEL),MAXANGVEL)); //was 127
p->q16ang = fix16_from_int(daang);
syn->q16horz = fix16_clamp(fix16_sdiv(fix16_ssub(fix16_from_int(zang), p->q16horiz), fix16_from_int(2)), -fix16_from_int(PLAYER_HORIZ_MAX), fix16_from_int(PLAYER_HORIZ_MAX));
//syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>1,-MAXANGVEL),MAXANGVEL); //was 127
p->pang = daang;
syn->aimvel = min(max((zang-p->horiz)>>1,-PLAYER_HORIZ_MAX),PLAYER_HORIZ_MAX);
// Sets type of aiming, auto aim for bots
syn->bits |= (1<<SK_AUTO_AIM);
return;
@ -806,7 +806,7 @@ void computergetinput(int snum, SW_PACKET *syn)
daang = getangle(x2-x1,y2-y1);
syn->vel += (x2-x1)*2047/dist;
syn->svel += (y2-y1)*2047/dist;
syn->q16avel = fix16_from_int(min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL));
syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL);
}
else
goalsprite[snum] = -1;
@ -869,7 +869,7 @@ void computergetinput(int snum, SW_PACKET *syn)
daang = ((getangle(wall[wall[goalwall[snum]].point2].x-wall[goalwall[snum]].x,wall[wall[goalwall[snum]].point2].y-wall[goalwall[snum]].y)+1536)&2047);
syn->vel += (x2-x1)*2047/dist;
syn->svel += (y2-y1)*2047/dist;
syn->q16avel = fix16_from_int(min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL));
syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL);
}
@ -890,7 +890,7 @@ void computergetinput(int snum, SW_PACKET *syn)
daang = ((getangle(wall[wall[goalwall[snum]].point2].x-wall[goalwall[snum]].x,wall[wall[goalwall[snum]].point2].y-wall[goalwall[snum]].y)+1536)&2047);
syn->vel += (x2-x1)*2047/dist;
syn->svel += (y2-y1)*2047/dist;
syn->q16avel = fix16_from_int(min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL));
syn->angvel = min(max((((daang+1024-damyang)&2047)-1024)>>3,-MAXANGVEL),MAXANGVEL);
}
*/
}

View file

@ -460,14 +460,14 @@ void JS_InitMirrors(void)
// Draw a 3d screen to a specific tile
/////////////////////////////////////////////////////
void drawroomstotile(int daposx, int daposy, int daposz,
fix16_t daq16ang, fix16_t daq16horiz, short dacursectnum, short tilenume)
short daang, int dahoriz, short dacursectnum, short tilenume)
{
TileFiles.MakeCanvas(tilenume, tilesiz[tilenume].x, tilesiz[tilenume].y);
renderSetTarget(tilenume, tilesiz[tilenume].x, tilesiz[tilenume].y);
screen->BeginScene();
renderDrawRoomsQ16(daposx, daposy, daposz, daq16ang, daq16horiz, dacursectnum);
drawrooms(daposx, daposy, daposz, daang, dahoriz, dacursectnum);
analyzesprites(daposx, daposy, daposz, FALSE);
renderDrawMasks();
screen->FinishScene();
@ -524,13 +524,16 @@ short camplayerview = 1; // Don't show yourself!
// Hack job alert!
// Mirrors and cameras are maintained in the same data structure, but for hardware rendering they cannot be interleaved.
// So this function replicates JS_DrawMirrors to only process the camera textures but not change any global state.
void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz)
void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz, short tpang, int tphoriz)
{
int j, cnt;
int dist;
int tposx, tposy; // Camera
int* longptr;
fix16_t tang;
// int tx, ty, tz, tpang; // Interpolate so mirror doesn't
// drift!
SWBOOL bIsWallMirror = FALSE;
camloopcnt += (int32_t)(totalclock - ototalclock);
@ -700,11 +703,11 @@ void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz)
if (TEST_BOOL11(sp) && numplayers > 1)
{
drawroomstotile(cp->posx, cp->posy, cp->posz, cp->q16ang, cp->q16horiz, cp->cursectnum, mirror[cnt].campic);
drawroomstotile(cp->posx, cp->posy, cp->posz, cp->pang, cp->horiz, cp->cursectnum, mirror[cnt].campic);
}
else
{
drawroomstotile(sp->x, sp->y, sp->z, fix16_from_int(SP_TAG5(sp)), fix16_from_int(camhoriz), sp->sectnum, mirror[cnt].campic);
drawroomstotile(sp->x, sp->y, sp->z, SP_TAG5(sp), camhoriz, sp->sectnum, mirror[cnt].campic);
}
}
}
@ -714,7 +717,7 @@ void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz)
}
}
void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fix16_t tpq16ang, fix16_t tpq16horiz)
void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, short tpang, int tphoriz)
{
int j, cnt;
int dist;
@ -752,7 +755,7 @@ void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fix16_t tpq16ang, fix16
// tx = pp->oposx + mulscale16(pp->posx - pp->oposx, smoothratio);
// ty = pp->oposy + mulscale16(pp->posy - pp->oposy, smoothratio);
// tz = pp->oposz + mulscale16(pp->posz - pp->oposz, smoothratio);
// tpq16ang = pp->q16ang
// tpang = pp->oang + mulscale16(((pp->pang + 1024 - pp->oang) & 2047) - 1024, smoothratio);
dist = 0x7fffffff;
@ -849,7 +852,7 @@ void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fix16_t tpq16ang, fix16
if (mirror[cnt].campic != -1)
tileDelete(mirror[cnt].campic);
renderDrawRoomsQ16(dx, dy, dz, tpq16ang, tpq16horiz, sp->sectnum + MAXSECTORS);
drawrooms(dx, dy, dz, tpang, tphoriz, sp->sectnum + MAXSECTORS);
analyzesprites(dx, dy, dz, FALSE);
renderDrawMasks();
}
@ -863,10 +866,10 @@ void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fix16_t tpq16ang, fix16
// Must call preparemirror before drawrooms and
// completemirror after drawrooms
renderPrepareMirror(tx, ty, tz, tpq16ang, tpq16horiz,
renderPrepareMirror(tx, ty, tz, fix16_from_int(tpang), fix16_from_int(tphoriz),
mirror[cnt].mirrorwall, /*mirror[cnt].mirrorsector,*/ &tposx, &tposy, &tang);
renderDrawRoomsQ16(tposx, tposy, tz, (tang), tpq16horiz, mirror[cnt].mirrorsector + MAXSECTORS);
renderDrawRoomsQ16(tposx, tposy, tz, (tang), fix16_from_int(tphoriz), mirror[cnt].mirrorsector + MAXSECTORS);
analyzesprites(tposx, tposy, tz, TRUE);
renderDrawMasks();
@ -879,7 +882,7 @@ void JS_DrawMirrors(PLAYERp pp, int tx, int ty, int tz, fix16_t tpq16ang, fix16
// g_visibility = tvisibility;
// g_visibility = NormalVisibility;
// renderDrawRoomsQ16(tx, ty, tz, tpq16ang, tpq16horiz, pp->cursectnum);
// drawrooms(tx, ty, tz, tpang, tphoriz, pp->cursectnum);
// Clean up anything that the camera view might have done
SetFragBar(pp);
tileDelete(MIRROR);

View file

@ -71,8 +71,8 @@ extern SWBOOL mirrorinview;
extern short NormalVisibility;
void JAnalyzeSprites(tspriteptr_t tspr);
void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz);
void JS_DrawMirrors(PLAYERp pp,int tx,int ty,int tz,fix16_t tpq16ang,fix16_t tpq16horiz);
void JS_DrawCameras(PLAYERp pp, int tx, int ty, int tz, short tpang, int tphoriz);
void JS_DrawMirrors(PLAYERp pp,int tx,int ty,int tz,short tpang,int tphoriz);
void JS_InitMirrors(void);
void JS_InitLockouts(void);
void JS_ToggleLockouts(void);

View file

@ -1393,7 +1393,7 @@ PlayerInitChemBomb(PLAYERp pp)
// Spawn a shot
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, CHEMBOMB, s_ChemBomb, pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), CHEMBOMB_VELOCITY);
nx, ny, nz, pp->pang, CHEMBOMB_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -1423,10 +1423,10 @@ PlayerInitChemBomb(PLAYERp pp)
if (TEST(pp->Flags, PF_DIVING) || SpriteInUnderwaterArea(wp))
SET(wu->Flags, SPR_UNDERWATER);
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
// //DSPRINTF(ds,"horiz %d, ho %d, ho+ho %d",fix16_to_int(pp->q16horiz), fix16_to_int(pp->q16horizoff),
// fix16_to_int(pp->q16horizoff + pp->q16horiz));
// //DSPRINTF(ds,"horiz %d, ho %d, ho+ho %d",pp->horiz, pp->horizoff,
// pp->horizoff + pp->horiz);
// MONO_PRINT(ds);
oclipdist = pp->SpriteP->clipdist;
@ -1837,7 +1837,7 @@ PlayerInitCaltrops(PLAYERp pp)
// Spawn a shot
// Inserting and setting up variables
w = SpawnSprite(STAT_DEAD_ACTOR, CALTROPS, s_Caltrops, pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), (CHEMBOMB_VELOCITY + RANDOM_RANGE(CHEMBOMB_VELOCITY)) / 2);
nx, ny, nz, pp->pang, (CHEMBOMB_VELOCITY + RANDOM_RANGE(CHEMBOMB_VELOCITY)) / 2);
wp = &sprite[w];
wu = User[w];
@ -1865,9 +1865,9 @@ PlayerInitCaltrops(PLAYERp pp)
SET(wu->Flags, SPR_UNDERWATER);
// They go out at different angles
// wp->ang = NORM_ANGLE(fix16_to_int(pp->q16ang) + (RANDOM_RANGE(50) - 25));
// wp->ang = NORM_ANGLE(pp->pang + (RANDOM_RANGE(50) - 25));
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
oclipdist = pp->SpriteP->clipdist;
pp->SpriteP->clipdist = 0;
@ -2501,7 +2501,7 @@ InitShell(int16_t SpriteNum, int16_t ShellNum)
if (u->PlayerP)
{
wp->z += ((100 - fix16_to_int(u->PlayerP->q16horiz)) * (HORIZ_MULT/3));
wp->z += ((100 - u->PlayerP->horiz) * (HORIZ_MULT/3));
}
switch (wu->ID)

View file

@ -58,7 +58,7 @@ int MultiClipMove(PLAYERp pp, int z, int floor_dist)
for (i = 0; i < sop->clipbox_num; i++)
{
ang = NORM_ANGLE(fix16_to_int(pp->q16ang) + sop->clipbox_ang[i]);
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
ox[i] = x[i] = pp->posx + (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)] >> 14);
oy[i] = y[i] = pp->posy + (sop->clipbox_vdist[i] * sintable[ang] >> 14);
@ -102,7 +102,7 @@ int MultiClipMove(PLAYERp pp, int z, int floor_dist)
for (i = 0; i < sop->clipbox_num; i++)
{
ang = NORM_ANGLE(fix16_to_int(pp->q16ang) + sop->clipbox_ang[i]);
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
ox[i] = x[i] = pp->posx + (sop->clipbox_vdist[i] * sintable[NORM_ANGLE(ang + 512)] >> 14);
oy[i] = y[i] = pp->posy + (sop->clipbox_vdist[i] * sintable[ang] >> 14);
@ -153,7 +153,7 @@ int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
// move the box to position instead of using offset- this prevents small rounding errors
// allowing you to move through wall
ang = NORM_ANGLE(fix16_to_int(pp->q16ang) + sop->clipbox_ang[i]);
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
xs = pp->posx;
ys = pp->posy;
@ -219,7 +219,7 @@ int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
// move the box to position instead of using offset- this prevents small rounding errors
// allowing you to move through wall
ang = NORM_ANGLE(fix16_to_int(pp->q16ang) + sop->clipbox_ang[i]);
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
xs = pp->posx;
ys = pp->posy;
@ -300,7 +300,7 @@ int MultiClipMove(PLAYERp pp, int z, int floor_dist)
{
// move the box to position instead of using offset- this prevents small rounding errors
// allowing you to move through wall
ang = NORM_ANGLE(fix16_to_int(pp->q16ang) + sop->clipbox_ang[i]);
ang = NORM_ANGLE(pp->pang + sop->clipbox_ang[i]);
xs = pp->posx;
ys = pp->posy;

View file

@ -44,8 +44,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
BEGIN_SW_NS
// getinput() calls will require redoing with regard to local input changes.
// void getinput(int playerNum);
void getinput(SW_PACKET*);
/*
SYNC BUG NOTES:
@ -105,7 +104,8 @@ typedef struct
{
int32_t vel;
int32_t svel;
fix16_t q16horz, q16avel;
int32_t angvel;
int32_t aimvel;
int32_t bits;
} SW_AVERAGE_PACKET;
@ -282,7 +282,6 @@ int EncodeBits(SW_PACKET *pak, SW_PACKET *old_pak, uint8_t* buf)
*buf = 0;
buf++;
// TODO: Properly copy the values in a cross-platform manner
if (pak->vel != old_pak->vel)
{
*((short *)buf) = pak->vel;
@ -297,17 +296,17 @@ int EncodeBits(SW_PACKET *pak, SW_PACKET *old_pak, uint8_t* buf)
SET(*base_ptr, BIT(1));
}
if (pak->q16avel != old_pak->q16avel)
if (pak->angvel != old_pak->angvel)
{
*((fix16_t *)buf) = pak->q16avel;
buf += sizeof(pak->q16avel);
*((char *)buf) = pak->angvel;
buf += sizeof(pak->angvel);
SET(*base_ptr, BIT(2));
}
if (pak->q16horz != old_pak->q16horz)
if (pak->aimvel != old_pak->aimvel)
{
*((fix16_t *)buf) = pak->q16horz;
buf += sizeof(pak->q16horz);
*((char *)buf) = pak->aimvel;
buf += sizeof(pak->aimvel);
SET(*base_ptr, BIT(3));
}
@ -335,7 +334,6 @@ int DecodeBits(SW_PACKET *pak, SW_PACKET *old_pak, uint8_t* buf)
*pak = *old_pak;
// TODO: Properly copy the values in a cross-platform manner
if (TEST(*base_ptr, BIT(0)))
{
pak->vel = *(short *)buf;
@ -350,14 +348,14 @@ int DecodeBits(SW_PACKET *pak, SW_PACKET *old_pak, uint8_t* buf)
if (TEST(*base_ptr, BIT(2)))
{
pak->q16avel = *(fix16_t *)buf;
buf += sizeof(pak->q16avel);
pak->angvel = *(char *)buf;
buf += sizeof(pak->angvel);
}
if (TEST(*base_ptr, BIT(3)))
{
pak->q16horz = *(fix16_t *)buf;
buf += sizeof(pak->q16horz);
pak->aimvel = *(char *)buf;
buf += sizeof(pak->aimvel);
}
//won't work if > 4 bytes
@ -935,13 +933,12 @@ faketimerhandler(void)
if (Player[myconnectindex].movefifoend - movefifoplc >= 100)
return;
// getinput() calls will require redoing with regard to local input changes.
// getinput(&loc);
getinput(&loc);
AveragePacket.vel += loc.vel;
AveragePacket.svel += loc.svel;
AveragePacket.q16avel += loc.q16avel;
AveragePacket.q16horz += loc.q16horz;
AveragePacket.angvel += loc.angvel;
AveragePacket.aimvel += loc.aimvel;
SET(AveragePacket.bits, loc.bits);
pp = Player + myconnectindex;
@ -958,8 +955,8 @@ faketimerhandler(void)
loc.vel = AveragePacket.vel / MovesPerPacket;
loc.svel = AveragePacket.svel / MovesPerPacket;
loc.q16avel = AveragePacket.q16avel / fix16_from_int(MovesPerPacket);
loc.q16horz = AveragePacket.q16horz / fix16_from_int(MovesPerPacket);
loc.angvel = AveragePacket.angvel / MovesPerPacket;
loc.aimvel = AveragePacket.aimvel / MovesPerPacket;
loc.bits = AveragePacket.bits;
memset(&AveragePacket, 0, sizeof(AveragePacket));

View file

@ -2405,7 +2405,7 @@ InitPlayerSprite(PLAYERp pp)
COVER_SetReverb(0); // Turn off any echoing that may have been going before
pp->Reverb = 0;
sp_num = pp->PlayerSprite = SpawnSprite(STAT_PLAYER0 + pnum, NINJA_RUN_R0, NULL, pp->cursectnum, pp->posx,
pp->posy, pp->posz, fix16_to_int(pp->q16ang), 0);
pp->posy, pp->posz, pp->pang, 0);
pp->SpriteP = sp = &sprite[sp_num];
pp->pnum = pnum;
@ -2481,7 +2481,7 @@ SpawnPlayerUnderSprite(PLAYERp pp)
int pnum = pp - Player, sp_num;
sp_num = pp->PlayerUnderSprite = SpawnSprite(STAT_PLAYER_UNDER0 + pnum,
NINJA_RUN_R0, NULL, pp->cursectnum, pp->posx, pp->posy, pp->posz, fix16_to_int(pp->q16ang), 0);
NINJA_RUN_R0, NULL, pp->cursectnum, pp->posx, pp->posy, pp->posz, pp->pang, 0);
sp = &sprite[sp_num];
u = User[sp_num];

File diff suppressed because it is too large Load diff

View file

@ -130,6 +130,7 @@ void DoPlayer(void);
void domovethings(void);
void InitAllPlayers(void);
void InitMultiPlayerInfo(void);
void MoveScrollMode2D(PLAYERp pp);
void DoPlayerDivePalette(PLAYERp pp);
void DoPlayerNightVisionPalette(PLAYERp pp);
void DoPlayerStopDiveNoWarp(PLAYERp pp);
@ -143,8 +144,6 @@ void PlaySOsound(short sectnum,short sound_num);
void DoSpawnTeleporterEffectPlace(SPRITEp sp);
void FindMainSector(SECTOR_OBJECTp sop);
SWBOOL P_CheckOperatingVehicle(PLAYERp pp);
END_SW_NS
#endif

View file

@ -45,9 +45,8 @@ PLAYERp ppp = &PredictPlayer;
typedef struct
{
int x,y,z;
fix16_t q16horiz, q16ang;
short filler;
int x,y,z,horiz;
short ang,filler;
} PREDICT, *PREDICTp;
PREDICT Predict[MOVEFIFOSIZ];
@ -157,11 +156,11 @@ DoPrediction(PLAYERp ppp)
u = User[ppp->PlayerSprite];
User[ppp->PlayerSprite] = &PredictUser;
ppp->oq16ang = ppp->q16ang;
ppp->oang = ppp->pang;
ppp->oposx = ppp->posx;
ppp->oposy = ppp->posy;
ppp->oposz = ppp->posz;
ppp->oq16horiz = ppp->q16horiz;
ppp->ohoriz = ppp->horiz;
#if PREDICT_DEBUG
PredictDebug(ppp);
@ -179,11 +178,11 @@ DoPrediction(PLAYERp ppp)
sprite[Player[myconnectindex].PlayerSprite] = spr;
randomseed = bakrandomseed;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].q16ang = ppp->q16ang;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].ang = ppp->pang;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].x = ppp->posx;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].y = ppp->posy;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].z = ppp->posz;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].q16horiz = ppp->q16horiz;
Predict[predictmovefifoplc & (MOVEFIFOSIZ-1)].horiz = ppp->horiz;
predictmovefifoplc++;
}
@ -199,17 +198,17 @@ CorrectPrediction(int actualfifoplc)
return;
// see if player position is predicted position
if (predict->q16ang == Player[myconnectindex].q16ang &&
if (predict->ang == Player[myconnectindex].pang &&
predict->x == Player[myconnectindex].posx &&
predict->y == Player[myconnectindex].posy &&
predict->z == Player[myconnectindex].posz &&
predict->q16horiz == Player[myconnectindex].q16horiz
predict->horiz == Player[myconnectindex].horiz
)
{
return;
}
// //DSPRINTF(ds,"PREDICT ERROR: %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", fix16_to_int(predict->q16ang), fix16_to_int(Player[myconnectindex].q16ang), predict->x, Player[myconnectindex].posx, predict->y, Player[myconnectindex].posy, predict->z, Player[myconnectindex].posz, fix16_to_int(predict->q16horiz),fix16_to_int(Player[myconnectindex].q16horiz));
// //DSPRINTF(ds,"PREDICT ERROR: %ld %ld %ld %ld %ld %ld %ld %ld %ld %ld", predict->ang, Player[myconnectindex].pang, predict->x, Player[myconnectindex].posx, predict->y, Player[myconnectindex].posy, predict->z, Player[myconnectindex].posz, predict->horiz,Player[myconnectindex].horiz);
// MONO_PRINT(ds);
InitPrediction(&Player[myconnectindex]);

View file

@ -33,7 +33,7 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
BEGIN_SW_NS
void FAF_DrawRooms(int posx, int posy, int posz, fix16_t q16ang, fix16_t q16horiz, short cursectnum);
void FAF_DrawRooms(int posx, int posy, int posz, short ang, int horiz, short cursectnum);
////////////////////////////////////////////////////////////////////
//
@ -1089,7 +1089,7 @@ ViewSectorInScene(short cursectnum, short level)
}
void
DrawOverlapRoom(int tx, int ty, int tz, fix16_t tq16ang, fix16_t tq16horiz, short tsectnum)
DrawOverlapRoom(int tx, int ty, int tz, short tang, int thoriz, short tsectnum)
{
short i;
short match;
@ -1104,8 +1104,8 @@ DrawOverlapRoom(int tx, int ty, int tz, fix16_t tq16ang, fix16_t tq16horiz, shor
if (tsectnum < 0)
return;
renderDrawRoomsQ16(tx, ty, tz, tq16ang, tq16horiz, tsectnum);
//FAF_DrawRooms(tx, ty, tz, tq16ang, tq16horiz, tsectnum);
drawrooms(tx, ty, tz, tang, thoriz, tsectnum);
//FAF_DrawRooms(tx, ty, tz, tang, thoriz, tsectnum);
// reset Z's
for (i = 0; i < save.zcount; i++)
@ -1130,8 +1130,8 @@ DrawOverlapRoom(int tx, int ty, int tz, fix16_t tq16ang, fix16_t tq16horiz, shor
if (tsectnum < 0)
return;
renderDrawRoomsQ16(tx, ty, tz, tq16ang, tq16horiz, tsectnum);
//FAF_DrawRooms(tx, ty, tz, tq16ang, tq16horiz, tsectnum);
drawrooms(tx, ty, tz, tang, thoriz, tsectnum);
//FAF_DrawRooms(tx, ty, tz, tang, thoriz, tsectnum);
// reset Z's
for (i = 0; i < save.zcount; i++)

View file

@ -2339,7 +2339,7 @@ SWBOOL NearThings(PLAYERp pp)
return FALSE;
}
neartag(pp->posx, pp->posy, pp->posz, pp->cursectnum, fix16_to_int(pp->q16ang),
neartag(pp->posx, pp->posy, pp->posz, pp->cursectnum, pp->pang,
&neartagsect, &neartagwall, &neartagsprite,
&neartaghitdist, 1024L, NTAG_SEARCH_LO_HI, NULL);
@ -2373,7 +2373,7 @@ SWBOOL NearThings(PLAYERp pp)
// This only gets called if nothing else worked, check for nearness to a wall
{
hitdata_t hitinfo = { { 0, 0, 0 }, 0, 0, 0 };
short dang = fix16_to_int(pp->q16ang);
short dang = pp->pang;
FAFhitscan(pp->posx, pp->posy, pp->posz - Z(30), pp->cursectnum, // Start position
sintable[NORM_ANGLE(dang + 512)], // X vector of 3D ang
@ -2437,7 +2437,7 @@ NearTagList(NEAR_TAG_INFOp ntip, PLAYERp pp, int z, int dist, int type, int coun
int neartaghitdist;
neartag(pp->posx, pp->posy, z, pp->cursectnum, fix16_to_int(pp->q16ang),
neartag(pp->posx, pp->posy, z, pp->cursectnum, pp->pang,
&neartagsector, &neartagwall, &neartagsprite,
&neartaghitdist, dist, type, NULL);

View file

@ -586,7 +586,7 @@ void DoUpdateSounds(void)
PLAYERp pp = Player + screenpeek;
SoundListener listener;
listener.angle = -(float)fix16_to_float(pp->q16ang) * pi::pi() / 1024; // Build uses a period of 2048.
listener.angle = -(float)pp->pang * pi::pi() / 1024; // Build uses a period of 2048.
listener.velocity.Zero();
listener.position = GetSoundPos((vec3_t*)&pp->posx);
listener.underwater = false;

View file

@ -76,7 +76,7 @@ PlayerSync(void)
updatecrc(crc, pp->posx & 255);
updatecrc(crc, pp->posy & 255);
updatecrc(crc, pp->posz & 255);
updatecrc(crc, fix16_to_int(pp->q16ang) & 255);
updatecrc(crc, pp->pang & 255);
}
return (uint8_t) crc & 255;
@ -93,7 +93,7 @@ PlayerSync2(void)
{
pp = Player + i;
updatecrc(crc, fix16_to_int(pp->q16horiz) & 255);
updatecrc(crc, pp->horiz & 255);
updatecrc(crc, User[pp->PlayerSprite]->Health & 255);
updatecrc(crc, pp->bcnt & 255);
}
@ -544,7 +544,7 @@ getsyncbyte()
{
pp = Player + i;
u = User[pp->SpriteP - sprite];
ch ^= (pp->posx ^ pp->posy ^ pp->posz ^ fix16_to_int(pp->q16ang) ^ fix16_to_int(pp->q16horiz) ^ u->Health);
ch ^= (pp->posx ^ pp->posy ^ pp->posz ^ pp->pang ^ pp->horiz ^ u->Health);
}
for (j = headspritestat[STAT_ENEMY]; j >= 0; j = nextspritestat[j])

View file

@ -34,7 +34,6 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#include "ai.h"
#include "player.h"
#include "game.h"
#include "interp.h"
#include "network.h"
#include "sprite.h"
#include "track.h"
@ -789,7 +788,7 @@ SectorObjectSetupBounds(SECTOR_OBJECTp sop)
if (pp->posx > xlow && pp->posx < xhigh && pp->posy > ylow && pp->posy < yhigh)
{
pp->RevolveAng = pp->q16ang;
pp->RevolveAng = pp->pang;
pp->RevolveX = pp->posx;
pp->RevolveY = pp->posy;
pp->RevolveDeltaAng = 0;
@ -849,7 +848,6 @@ SectorObjectSetupBounds(SECTOR_OBJECTp sop)
//
// Make sure every sector object has an outer loop tagged - important
// Further setup interpolation
//
FoundOutsideLoop = FALSE;
@ -862,21 +860,6 @@ SectorObjectSetupBounds(SECTOR_OBJECTp sop)
// move all walls in sectors
for (k = startwall; k <= endwall; k++)
{
uint16_t const nextwall = wall[k].nextwall;
// setup interpolation
if (InterpolateSectObj)
{
setinterpolation(&wall[k].x);
setinterpolation(&wall[k].y);
if (nextwall < MAXWALLS)
{
setinterpolation(&wall[wall[nextwall].point2].x);
setinterpolation(&wall[wall[nextwall].point2].y);
}
}
// for morph point - tornado style
if (wall[k].lotag == TAG_WALL_ALIGN_SLOPE_TO_POINT)
sop->morph_wall_point = k;
@ -886,16 +869,10 @@ SectorObjectSetupBounds(SECTOR_OBJECTp sop)
// each wall has this set - for collision detection
SET(wall[k].extra, WALLFX_SECTOR_OBJECT|WALLFX_DONT_STICK);
uint16_t const nextwall = wall[k].nextwall;
if (nextwall < MAXWALLS)
SET(wall[nextwall].extra, WALLFX_SECTOR_OBJECT|WALLFX_DONT_STICK);
}
// interpolate floor and ceiling
if (InterpolateSectObj && (k != startwall))
{
setinterpolation(&(*sectp)->ceilingz);
setinterpolation(&(*sectp)->floorz);
}
}
if (!FoundOutsideLoop)
@ -995,8 +972,6 @@ SectorObjectSetupBounds(SECTOR_OBJECTp sop)
ASSERT(sn < SIZ(sop->sp_num) - 1);
sop->sp_num[sn] = sp_num;
if (InterpolateSectObj)
setspriteinterpolation(sp);
if (!TEST(sop->flags, SOBJ_SPRITE_OBJ))
@ -1644,7 +1619,7 @@ MovePlayer(PLAYERp pp, SECTOR_OBJECTp sop, int nx, int ny)
{
SET(pp->Flags, PF_PLAYER_RIDING);
pp->RevolveAng = pp->q16ang;
pp->RevolveAng = pp->pang;
pp->RevolveX = pp->posx;
pp->RevolveY = pp->posy;
@ -1655,11 +1630,6 @@ MovePlayer(PLAYERp pp, SECTOR_OBJECTp sop, int nx, int ny)
pp->posx += BOUND_4PIX(nx);
pp->posy += BOUND_4PIX(ny);
if (!InterpolateSectObj)
{
pp->oposx = pp->posx;
pp->oposy = pp->posy;
}
if (TEST(sop->flags, SOBJ_DONT_ROTATE))
{
@ -1674,7 +1644,7 @@ MovePlayer(PLAYERp pp, SECTOR_OBJECTp sop, int nx, int ny)
// save the current information so when Player stops
// moving then you
// know where he was last
pp->RevolveAng = pp->q16ang;
pp->RevolveAng = pp->pang;
pp->RevolveX = pp->posx;
pp->RevolveY = pp->posy;
@ -1690,13 +1660,13 @@ MovePlayer(PLAYERp pp, SECTOR_OBJECTp sop, int nx, int ny)
pp->RevolveY += BOUND_4PIX(ny);
// Last known angle is now adjusted by the delta angle
pp->RevolveAng = fix16_ssub(pp->q16ang, pp->RevolveDeltaAng) & 0x7FFFFFF;
pp->RevolveAng = NORM_ANGLE(pp->pang - pp->RevolveDeltaAng);
}
// increment Players delta angle
pp->RevolveDeltaAng = fix16_sadd(pp->RevolveDeltaAng, fix16_from_int(GlobSpeedSO)) & 0x7FFFFFF;
pp->RevolveDeltaAng = NORM_ANGLE(pp->RevolveDeltaAng + GlobSpeedSO);
rotatepoint(*(vec2_t *)&sop->xmid, *(vec2_t *)&pp->RevolveX, fix16_to_int(pp->RevolveDeltaAng), (vec2_t *)&pp->posx);
rotatepoint(*(vec2_t *)&sop->xmid, *(vec2_t *)&pp->RevolveX, pp->RevolveDeltaAng, (vec2_t *)&pp->posx);
// THIS WAS CAUSING PROLEMS!!!!
// Sectors are still being manipulated so you can end up in a void (-1) sector
@ -1704,9 +1674,7 @@ MovePlayer(PLAYERp pp, SECTOR_OBJECTp sop, int nx, int ny)
// New angle is formed by taking last known angle and
// adjusting by the delta angle
pp->q16ang = fix16_sadd(pp->RevolveAng, pp->RevolveDeltaAng) & 0x7FFFFFF;
if (!InterpolateSectObj)
pp->oq16ang = pp->q16ang;
pp->pang = NORM_ANGLE(pp->RevolveAng + pp->RevolveDeltaAng);
UpdatePlayerSprite(pp);
}
@ -1959,8 +1927,6 @@ PlayerPart:
pp->SpriteP->z = pp->loz;
}
}
if (!InterpolateSectObj)
pp->oposz = pp->posz;
}
else
{
@ -2075,8 +2041,6 @@ void KillSectorObjectSprites(SECTOR_OBJECTp sop)
if (sp->picnum == ST1 && sp->hitag == SPAWN_SPOT)
continue;
if (InterpolateSectObj)
stopspriteinterpolation(sp);
KillSprite(sop->sp_num[i]);
}

View file

@ -31,7 +31,6 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
#include "names2.h"
#include "panel.h"
#include "game.h"
#include "interp.h"
#include "tags.h"
#include "common_game.h"
#include "break.h"
@ -11393,8 +11392,6 @@ AddSpriteToSectorObject(short SpriteNum, SECTOR_OBJECTp sop)
ASSERT(sn < SIZ(sop->sp_num) - 1);
sop->sp_num[sn] = SpriteNum;
if (InterpolateSectObj)
setspriteinterpolation(sp);
SET(u->Flags, SPR_ON_SO_SECTOR|SPR_SO_ATTACHED);
@ -11461,8 +11458,6 @@ SpawnBigGunFlames(int16_t Weapon, int16_t Operator, SECTOR_OBJECTp sop)
ASSERT(sn < SIZ(sop->sp_num) - 1);
sop->sp_num[sn] = explosion;
if (InterpolateSectObj)
setspriteinterpolation(exp);
// Place sprite exactly where shoot point is
//exp->x = eu->ox = sop->xmid - u->sx;
@ -12846,7 +12841,7 @@ DoRing(int16_t Weapon)
sp->x += ((int) u->Dist * (int) sintable[NORM_ANGLE(sp->ang + 512)]) >> 14;
sp->y += ((int) u->Dist * (int) sintable[sp->ang]) >> 14;
if (User[sp->owner]->PlayerP)
sp->z += (u->Dist * ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT)) >> 9;
sp->z += (u->Dist * ((100 - pp->horiz) * HORIZ_MULT)) >> 9;
//sp->ang = NORM_ANGLE(sp->ang + 512);
//updatesector(sp->x, sp->y);
@ -12894,7 +12889,7 @@ InitSpellRing(PLAYERp pp)
ang_diff = 2048 / max_missiles;
ang_start = NORM_ANGLE(fix16_to_int(pp->q16ang) - DIV2(2048));
ang_start = NORM_ANGLE(pp->pang - DIV2(2048));
if (!SW_SHAREWARE)
PlaySound(DIGI_RFWIZ, pp, v3df_none);
@ -12933,7 +12928,7 @@ InitSpellRing(PLAYERp pp)
// put it out there
sp->x += ((int) u->Dist * (int) sintable[NORM_ANGLE(sp->ang + 512)]) >> 14;
sp->y += ((int) u->Dist * (int) sintable[sp->ang]) >> 14;
sp->z = pp->posz + Z(20) + ((u->Dist * ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT)) >> 9);
sp->z = pp->posz + Z(20) + ((u->Dist * ((100 - pp->horiz) * HORIZ_MULT)) >> 9);
sp->ang = NORM_ANGLE(sp->ang + 512);
@ -13453,7 +13448,7 @@ InitSpellNapalm(PLAYERp pp)
for (i = 0; i < SIZ(mp); i++)
{
SpriteNum = SpawnSprite(STAT_MISSILE, FIREBALL1, s_Napalm, pp->cursectnum,
pp->posx, pp->posy, pp->posz + Z(12), fix16_to_int(pp->q16ang), NAPALM_VELOCITY*2);
pp->posx, pp->posy, pp->posz + Z(12), pp->pang, NAPALM_VELOCITY*2);
sp = &sprite[SpriteNum];
u = User[SpriteNum];
@ -13472,7 +13467,7 @@ InitSpellNapalm(PLAYERp pp)
sp->xrepeat = 32;
sp->yrepeat = 32;
sp->clipdist = 0;
sp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
sp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
SET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_YCENTER);
RESET(sp->cstat, CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
SET(u->Flags2, SPR2_BLUR_TAPER_FAST);
@ -13613,7 +13608,7 @@ InitSpellMirv(PLAYERp pp)
return 0;
SpriteNum = SpawnSprite(STAT_MISSILE, FIREBALL1, s_Mirv, pp->cursectnum,
pp->posx, pp->posy, pp->posz + Z(12), fix16_to_int(pp->q16ang), MIRV_VELOCITY);
pp->posx, pp->posy, pp->posz + Z(12), pp->pang, MIRV_VELOCITY);
sp = &sprite[SpriteNum];
u = User[SpriteNum];
@ -13627,7 +13622,7 @@ InitSpellMirv(PLAYERp pp)
sp->xrepeat = 72;
sp->yrepeat = 72;
sp->clipdist = 32L >> 2;
sp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
sp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
SET(sp->cstat, CSTAT_SPRITE_TRANSLUCENT | CSTAT_SPRITE_YCENTER);
RESET(sp->cstat, CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
@ -13728,7 +13723,7 @@ InitSwordAttack(PLAYERp pp)
{
bp = &sprite[bubble];
bp->ang = fix16_to_int(pp->q16ang);
bp->ang = pp->pang;
random_amt = (RANDOM_P2(32<<8)>>8) - 16;
@ -13777,8 +13772,8 @@ InitSwordAttack(PLAYERp pp)
short daang;
int daz;
daang = fix16_to_int(pp->q16ang);
daz = ((100 - fix16_to_int(pp->q16horiz)) * 2000) + (RANDOM_RANGE(24000) - 12000);
daang = pp->pang;
daz = ((100 - pp->horiz) * 2000) + (RANDOM_RANGE(24000) - 12000);
FAFhitscan(pp->posx, pp->posy, pp->posz, pp->cursectnum, // Start position
sintable[NORM_ANGLE(daang + 512)], // X vector of 3D ang
@ -13905,7 +13900,7 @@ InitFistAttack(PLAYERp pp)
{
bp = &sprite[bubble];
bp->ang = fix16_to_int(pp->q16ang);
bp->ang = pp->pang;
random_amt = (RANDOM_P2(32<<8)>>8) - 16;
@ -13967,8 +13962,8 @@ InitFistAttack(PLAYERp pp)
short daang;
int daz;
daang = fix16_to_int(pp->q16ang);
daz = ((100 - fix16_to_int(pp->q16horiz)) * 2000) + (RANDOM_RANGE(24000) - 12000);
daang = pp->pang;
daz = ((100 - pp->horiz) * 2000) + (RANDOM_RANGE(24000) - 12000);
FAFhitscan(pp->posx, pp->posy, pp->posz, pp->cursectnum, // Start position
sintable[NORM_ANGLE(daang + 512)], // X vector of 3D ang
@ -14626,7 +14621,7 @@ InitStar(PLAYERp pp)
// Spawn a shot
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, STAR1, s_Star, pp->cursectnum, nx, ny, nz, fix16_to_int(pp->q16ang), STAR_VELOCITY);
w = SpawnSprite(STAT_MISSILE, STAR1, s_Star, pp->cursectnum, nx, ny, nz, pp->pang, STAR_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -14641,7 +14636,7 @@ InitStar(PLAYERp pp)
wp->clipdist = 32L >> 2;
// wp->zvel was overflowing with this calculation - had to move to a local
// long var
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (HORIZ_MULT+STAR_HORIZ_ADJ));
zvel = ((100 - pp->horiz) * (HORIZ_MULT+STAR_HORIZ_ADJ));
wu->ceiling_dist = Z(1);
wu->floor_dist = Z(1);
@ -14698,7 +14693,7 @@ InitStar(PLAYERp pp)
if (TEST(pp->Flags, PF_DIVING) || SpriteInUnderwaterArea(np))
SET(nu->Flags, SPR_UNDERWATER);
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (HORIZ_MULT+STAR_HORIZ_ADJ));
zvel = ((100 - pp->horiz) * (HORIZ_MULT+STAR_HORIZ_ADJ));
np->zvel = zvel >> 1;
if (MissileSetPos(nw, DoStar, 1000))
@ -14749,7 +14744,7 @@ InitHeartAttack(PLAYERp pp)
return;
SpriteNum = SpawnSprite(STAT_MISSILE_SKIP4, BLOOD_WORM, s_BloodWorm, pp->cursectnum,
pp->posx, pp->posy, pp->posz + Z(12), fix16_to_int(pp->q16ang), BLOOD_WORM_VELOCITY*2);
pp->posx, pp->posy, pp->posz + Z(12), pp->pang, BLOOD_WORM_VELOCITY*2);
sp = &sprite[SpriteNum];
u = User[SpriteNum];
@ -14762,7 +14757,7 @@ InitHeartAttack(PLAYERp pp)
sp->xrepeat = 52;
sp->yrepeat = 52;
sp->clipdist = 0;
sp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
sp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
RESET(sp->cstat, CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN);
SET(u->Flags2, SPR2_DONT_TARGET_OWNER);
SET(sp->cstat, CSTAT_SPRITE_INVISIBLE);
@ -14825,7 +14820,7 @@ InitHeartAttack(PLAYERp pp)
return;
SpriteNum = SpawnSprite(STAT_MISSILE_SKIP4, BLOOD_WORM, s_BloodWorm, pp->cursectnum,
pp->posx, pp->posy, pp->posz + Z(12), fix16_to_int(pp->q16ang), BLOOD_WORM_VELOCITY*2);
pp->posx, pp->posy, pp->posz + Z(12), pp->pang, BLOOD_WORM_VELOCITY*2);
sp = &sprite[SpriteNum];
u = User[SpriteNum];
@ -14986,8 +14981,8 @@ InitShotgun(PLAYERp pp)
}
else
{
daz = (100 - fix16_to_int(pp->q16horiz)) * 2000;
daang = fix16_to_int(pp->q16ang);
daz = (100 - pp->horiz) * 2000;
daang = pp->pang;
}
for (i = 0; i < 12; i++)
@ -15149,7 +15144,7 @@ InitLaser(PLAYERp pp)
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, BOLT_THINMAN_R0, s_Laser, pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), 300);
nx, ny, nz, pp->pang, 300);
wp = &sprite[w];
wu = User[w];
@ -15162,7 +15157,7 @@ InitLaser(PLAYERp pp)
wp->clipdist = 64L>>2;
// the slower the missile travels the less of a zvel it needs
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wp->zvel /= 4;
wu->WeaponNum = u->WeaponNum;
@ -15261,7 +15256,7 @@ InitRail(PLAYERp pp)
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, BOLT_THINMAN_R1, &s_Rail[0][0], pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), 1200);
nx, ny, nz, pp->pang, 1200);
wp = &sprite[w];
wu = User[w];
@ -15270,7 +15265,7 @@ InitRail(PLAYERp pp)
wp->yrepeat = 52;
wp->xrepeat = 52;
wp->shade = -15;
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (HORIZ_MULT+17));
zvel = ((100 - pp->horiz) * (HORIZ_MULT+17));
wu->RotNum = 5;
NewStateGroup(w, &sg_Rail[0]);
@ -15460,7 +15455,7 @@ InitRocket(PLAYERp pp)
//nz = pp->posz + pp->bob_z + Z(12);
nz = pp->posz + pp->bob_z + Z(8);
w = SpawnSprite(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), ROCKET_VELOCITY);
nx, ny, nz, pp->pang, ROCKET_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -15470,7 +15465,7 @@ InitRocket(PLAYERp pp)
wp->yrepeat = 90;
wp->xrepeat = 90;
wp->shade = -15;
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (HORIZ_MULT+35));
zvel = ((100 - pp->horiz) * (HORIZ_MULT+35));
wp->clipdist = 64L>>2;
@ -15581,7 +15576,7 @@ InitBunnyRocket(PLAYERp pp)
//nz = pp->posz + pp->bob_z + Z(12);
nz = pp->posz + pp->bob_z + Z(8);
w = SpawnSprite(STAT_MISSILE, BOLT_THINMAN_R4, &s_BunnyRocket[0][0], pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), ROCKET_VELOCITY);
nx, ny, nz, pp->pang, ROCKET_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -15591,7 +15586,7 @@ InitBunnyRocket(PLAYERp pp)
wp->yrepeat = 64;
wp->xrepeat = 64;
wp->shade = -15;
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (HORIZ_MULT+35));
zvel = ((100 - pp->horiz) * (HORIZ_MULT+35));
wp->clipdist = 64L>>2;
@ -15695,7 +15690,7 @@ InitNuke(PLAYERp pp)
//nz = pp->posz + pp->bob_z + Z(12);
nz = pp->posz + pp->bob_z + Z(8);
w = SpawnSprite(STAT_MISSILE, BOLT_THINMAN_R0, &s_Rocket[0][0], pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), 700);
nx, ny, nz, pp->pang, 700);
wp = &sprite[w];
wu = User[w];
@ -15705,7 +15700,7 @@ InitNuke(PLAYERp pp)
wp->yrepeat = 128;
wp->xrepeat = 128;
wp->shade = -15;
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (HORIZ_MULT-36));
zvel = ((100 - pp->horiz) * (HORIZ_MULT-36));
wp->clipdist = 64L>>2;
// Set to red palette
@ -15758,7 +15753,7 @@ InitNuke(PLAYERp pp)
wu->ychange = MOVEy(wp->xvel, wp->ang);
wu->zchange = zvel;
PlayerDamageSlide(pp, -40, NORM_ANGLE(fix16_to_int(pp->q16ang)+1024)); // Recoil slide
PlayerDamageSlide(pp, -40, NORM_ANGLE(pp->pang+1024)); // Recoil slide
return 0;
}
@ -15893,7 +15888,7 @@ InitMicro(PLAYERp pp)
{
hp = NULL;
hu = NULL;
ang = fix16_to_int(pp->q16ang);
ang = pp->pang;
}
nz = pp->posz + pp->bob_z + Z(14);
@ -15912,7 +15907,7 @@ InitMicro(PLAYERp pp)
wp->yrepeat = 24;
wp->xrepeat = 24;
wp->shade = -15;
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wp->clipdist = 64L>>2;
// randomize zvelocity
@ -17442,14 +17437,14 @@ InitTracerUzi(PLAYERp pp)
nx = pp->posx;
ny = pp->posy;
//nz = pp->posz + pp->bob_z + Z(8);
//nz = pp->posz + pp->bob_z + Z(8) + ((100 - fix16_to_int(pp->q16horiz)) * 72);
nz = pp->posz + Z(8) + ((100 - fix16_to_int(pp->q16horiz)) * 72);
//nz = pp->posz + pp->bob_z + Z(8) + ((100 - pp->horiz) * 72);
nz = pp->posz + Z(8) + ((100 - pp->horiz) * 72);
// Spawn a shot
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, 0, s_Tracer, pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), TRACER_VELOCITY);
nx, ny, nz, pp->pang, TRACER_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -17461,7 +17456,7 @@ InitTracerUzi(PLAYERp pp)
wp->xrepeat = 10;
wp->shade = -40;
wp->zvel = 0;
//wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
//wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wp->clipdist = 32 >> 2;
wu->WeaponNum = u->WeaponNum;
@ -17488,7 +17483,7 @@ InitTracerUzi(PLAYERp pp)
return 0;
}
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * (wp->xvel/8));
wp->zvel = ((100 - pp->horiz) * (wp->xvel/8));
pp->SpriteP->clipdist = oclipdist;
@ -17731,8 +17726,8 @@ int SpawnWallHole(short hit_sect, short hit_wall, int hit_x, int hit_y, int hit_
sp->ang = NORM_ANGLE(wall_ang + 1024);
// int nx,ny;
//nx = (sintable[(512 + fix16_to_int(Player[0].q16ang)) & 2047] >> 7);
//ny = (sintable[fix16_to_int(Player[0].q16ang)] >> 7);
//nx = (sintable[(512 + Player[0].pang) & 2047] >> 7);
//ny = (sintable[Player[0].pang] >> 7);
//sp->x -= nx;
//sp->y -= ny;
@ -17838,9 +17833,9 @@ InitUzi(PLAYERp pp)
}
else
{
//daang = NORM_ANGLE(fix16_to_int(pp->q16ang) + (RANDOM_RANGE(50) - 25));
daang = NORM_ANGLE(fix16_to_int(pp->q16ang) + (RANDOM_RANGE(24) - 12));
daz = ((100 - fix16_to_int(pp->q16horiz)) * 2000) + (RANDOM_RANGE(24000) - 12000);
//daang = NORM_ANGLE(pp->pang + (RANDOM_RANGE(50) - 25));
daang = NORM_ANGLE(pp->pang + (RANDOM_RANGE(24) - 12));
daz = ((100 - pp->horiz) * 2000) + (RANDOM_RANGE(24000) - 12000);
}
@ -18015,8 +18010,8 @@ InitEMP(PLAYERp pp)
InitTracerUzi(pp);
//daz = nz = pp->posz + Z(8) + ((100 - fix16_to_int(pp->q16horiz)) * 72);
//daang = NORM_ANGLE(fix16_to_int(pp->q16ang) + (RANDOM_RANGE(50) - 25));
//daz = nz = pp->posz + Z(8) + ((100 - pp->horiz) * 72);
//daang = NORM_ANGLE(pp->pang + (RANDOM_RANGE(50) - 25));
daz = nz = pp->posz + pp->bob_z;
daang = 64;
@ -18025,8 +18020,8 @@ InitEMP(PLAYERp pp)
}
else
{
daz = (100 - fix16_to_int(pp->q16horiz)) * 2000;
daang = fix16_to_int(pp->q16ang);
daz = (100 - pp->horiz) * 2000;
daang = pp->pang;
}
FAFhitscan(pp->posx, pp->posy, nz, pp->cursectnum, // Start position
@ -18199,7 +18194,7 @@ InitTankShell(short SpriteNum, PLAYERp pp)
SET(wp->cstat, CSTAT_SPRITE_YCENTER);
SET(wp->cstat, CSTAT_SPRITE_INVISIBLE);
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * (wp->xvel/8));
wp->zvel = ((100 - pp->horiz) * (wp->xvel/8));
WeaponAutoAim(sp, w, 64, FALSE);
// a bit of randomness
@ -18278,7 +18273,7 @@ InitTurretMicro(short SpriteNum, PLAYERp pp)
wp->yrepeat = 24;
wp->xrepeat = 24;
wp->shade = -15;
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wp->clipdist = 64L>>2;
// randomize zvelocity
@ -18359,7 +18354,7 @@ InitTurretRocket(short SpriteNum, PLAYERp pp)
SET(wu->Flags2, SPR2_SO_MISSILE);
SET(wp->cstat, CSTAT_SPRITE_YCENTER);
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * (wp->xvel/8));
wp->zvel = ((100 - pp->horiz) * (wp->xvel/8));
WeaponAutoAim(sp, w, 64, FALSE);
// a bit of randomness
@ -18406,7 +18401,7 @@ InitTurretFireball(short SpriteNum, PLAYERp pp)
SET(wu->Flags2, SPR2_SO_MISSILE);
SET(wp->cstat, CSTAT_SPRITE_YCENTER);
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * (wp->xvel/8));
wp->zvel = ((100 - pp->horiz) * (wp->xvel/8));
WeaponAutoAim(sp, w, 64, FALSE);
// a bit of randomness
@ -18455,7 +18450,7 @@ InitTurretRail(short SpriteNum, PLAYERp pp)
wp->yrepeat = 52;
wp->xrepeat = 52;
wp->shade = -15;
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wu->RotNum = 5;
NewStateGroup(w, &sg_Rail[0]);
@ -18515,7 +18510,7 @@ InitTurretLaser(short SpriteNum, PLAYERp pp)
wp->shade = -15;
// the slower the missile travels the less of a zvel it needs
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wp->zvel /= 4;
wu->Radius = 200;
@ -18562,7 +18557,7 @@ InitSobjMachineGun(short SpriteNum, PLAYERp pp)
nsect = sp->sectnum;
if (RANDOM_P2(1024) < 200)
InitTracerTurret(sp - sprite, pp->PlayerSprite, fix16_to_int(pp->q16horiz));
InitTracerTurret(sp - sprite, pp->PlayerSprite, pp->horiz);
daang = 64;
if (WeaponAutoAimHitscan(sp, &daz, &daang, FALSE) != -1)
@ -18573,7 +18568,7 @@ InitSobjMachineGun(short SpriteNum, PLAYERp pp)
else
{
int horiz;
horiz = fix16_to_int(pp->q16horiz);
horiz = pp->horiz;
if (horiz < 75)
horiz = 75;
@ -19283,7 +19278,7 @@ InitGrenade(PLAYERp pp)
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, GRENADE, &s_Grenade[0][0], pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), GRENADE_VELOCITY);
nx, ny, nz, pp->pang, GRENADE_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -19315,9 +19310,9 @@ InitGrenade(PLAYERp pp)
if (TEST(pp->Flags, PF_DIVING) || SpriteInUnderwaterArea(wp))
SET(wu->Flags, SPR_UNDERWATER);
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
////DSPRINTF(ds,"horiz %d, ho %d, ho+ho %d",fix16_to_int(pp->q16horiz), fix16_to_int(pp->q16horizoff), fix16_to_int(pp->q16horizoff + pp->q16horiz));
////DSPRINTF(ds,"horiz %d, ho %d, ho+ho %d",pp->horiz, pp->horizoff, pp->horizoff + pp->horiz);
//MONO_PRINT(ds);
oclipdist = pp->SpriteP->clipdist;
@ -19452,7 +19447,7 @@ InitMine(PLAYERp pp)
// Inserting and setting up variables
w = SpawnSprite(STAT_MISSILE, MINE, s_Mine, pp->cursectnum,
nx, ny, nz, fix16_to_int(pp->q16ang), MINE_VELOCITY);
nx, ny, nz, pp->pang, MINE_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -19462,7 +19457,7 @@ InitMine(PLAYERp pp)
wp->xrepeat = 32;
wp->shade = -15;
wp->clipdist = 128L>>2;
wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
wu->WeaponNum = u->WeaponNum;
wu->Radius = 200;
wu->ceiling_dist = Z(5);
@ -19475,7 +19470,7 @@ InitMine(PLAYERp pp)
if (TEST(pp->Flags, PF_DIVING) || SpriteInUnderwaterArea(wp))
SET(wu->Flags, SPR_UNDERWATER);
//wp->zvel = ((100 - fix16_to_int(pp->q16horiz)) * HORIZ_MULT);
//wp->zvel = ((100 - pp->horiz) * HORIZ_MULT);
MissileSetPos(w, DoMine, 800);
@ -19483,7 +19478,7 @@ InitMine(PLAYERp pp)
wu->xchange = MOVEx(wp->xvel, wp->ang);
wu->ychange = MOVEy(wp->xvel, wp->ang);
dot = DOT_PRODUCT_2D(pp->xvect, pp->yvect, sintable[NORM_ANGLE(fix16_to_int(pp->q16ang)+512)], sintable[fix16_to_int(pp->q16ang)]);
dot = DOT_PRODUCT_2D(pp->xvect, pp->yvect, sintable[NORM_ANGLE(pp->pang+512)], sintable[pp->pang]);
// don't adjust for strafing
if (labs(dot) > 10000)
@ -19613,7 +19608,7 @@ InitFireball(PLAYERp pp)
nz = pp->posz + pp->bob_z + Z(15);
w = SpawnSprite(STAT_MISSILE, FIREBALL1, s_Fireball, pp->cursectnum, nx, ny, nz, fix16_to_int(pp->q16ang), FIREBALL_VELOCITY);
w = SpawnSprite(STAT_MISSILE, FIREBALL1, s_Fireball, pp->cursectnum, nx, ny, nz, pp->pang, FIREBALL_VELOCITY);
wp = &sprite[w];
wu = User[w];
@ -19628,8 +19623,8 @@ InitFireball(PLAYERp pp)
wu->ceiling_dist = Z(6);
wu->floor_dist = Z(6);
//zvel = ((100 - fix16_to_int(pp->q16horiz)) * (100+ADJUST));
zvel = ((100 - fix16_to_int(pp->q16horiz)) * (240L));
//zvel = ((100 - pp->horiz) * (100+ADJUST));
zvel = ((100 - pp->horiz) * (240L));
//wu->RotNum = 5;
//NewStateGroup(w, &sg_Fireball);

View file

@ -790,7 +790,7 @@ SpawnZombie(PLAYERp pp, short Weapon)
//Zombies++;
New = SpawnSprite(STAT_ENEMY, ZOMBIE_RUN_R0, s_ZombieRun[0], pp->cursectnum, pp->posx, pp->posy, pp->posz, fix16_to_int(pp->q16ang), 0);
New = SpawnSprite(STAT_ENEMY, ZOMBIE_RUN_R0, s_ZombieRun[0], pp->cursectnum, pp->posx, pp->posy, pp->posz, pp->pang, 0);
np = &sprite[New];
nu = User[New];
np->sectnum = pp->cursectnum;