git-svn-id: https://svn.eduke32.com/eduke32@1207 1a8010ca-5511-0410-912e-c29ae57300e0

This commit is contained in:
terminx 2009-01-13 04:40:56 +00:00
parent 9095a4911d
commit 16084e989e
18 changed files with 572 additions and 459 deletions

View file

@ -480,6 +480,8 @@ int32_t setsprite(int16_t spritenum, int32_t newx, int32_t newy, int32_t newz)
int32_t screencapture(char *filename, char inverseit); int32_t screencapture(char *filename, char inverseit);
int32_t getclosestcol(int32_t r, int32_t g, int32_t b);
// PLAG: line utility functions // PLAG: line utility functions
typedef struct s_equation { typedef struct s_equation {
float a, b, c; float a, b, c;

View file

@ -823,9 +823,11 @@ void editinput(void)
goalz += mousz; goalz += mousz;
if (keystatus[buildkeys[BK_MOVEUP]]) //A (stand high) if (keystatus[buildkeys[BK_MOVEUP]]) //A (stand high)
{ {
/*
if (keystatus[0x1d]|keystatus[0x9d]) if (keystatus[0x1d]|keystatus[0x9d])
horiz = max(-100,horiz-((keystatus[buildkeys[BK_RUN]]+1)*synctics*2)); horiz = max(-100,horiz-((keystatus[buildkeys[BK_RUN]]+1)*synctics*2));
else else
*/
{ {
goalz -= (16<<8); goalz -= (16<<8);
if (keystatus[buildkeys[BK_RUN]]) //Either shift key if (keystatus[buildkeys[BK_RUN]]) //Either shift key
@ -834,9 +836,11 @@ void editinput(void)
} }
if (keystatus[buildkeys[BK_MOVEDOWN]]) //Z (stand low) if (keystatus[buildkeys[BK_MOVEDOWN]]) //Z (stand low)
{ {
/*
if (keystatus[0x1d]|keystatus[0x9d]) if (keystatus[0x1d]|keystatus[0x9d])
horiz = min(300,horiz+((keystatus[buildkeys[BK_RUN]]+1)*synctics*2)); horiz = min(300,horiz+((keystatus[buildkeys[BK_RUN]]+1)*synctics*2));
else else
*/
{ {
goalz += (12<<8); goalz += (12<<8);
if (keystatus[buildkeys[BK_RUN]]) //Either shift key if (keystatus[buildkeys[BK_RUN]]) //Either shift key

View file

@ -289,7 +289,6 @@ extern int32_t nextvoxid;
extern char faketile[MAXTILES]; extern char faketile[MAXTILES];
extern char *faketiledata[MAXTILES]; extern char *faketiledata[MAXTILES];
extern int32_t getclosestcol(int32_t r, int32_t g, int32_t b);
#if defined(POLYMOST) && defined(USE_OPENGL) #if defined(POLYMOST) && defined(USE_OPENGL)
extern float alphahackarray[MAXTILES]; extern float alphahackarray[MAXTILES];

View file

@ -335,7 +335,14 @@ void A_RadiusDamage(int32_t i, int32_t r, int32_t hp1, int32_t hp2, int32_t
y1 = (((wal->y+wall[wal->point2].y)>>1)+s->y)>>1; y1 = (((wal->y+wall[wal->point2].y)>>1)+s->y)>>1;
updatesector(x1,y1,&sect); updatesector(x1,y1,&sect);
if (sect >= 0 && cansee(x1,y1,s->z,sect,s->x,s->y,s->z,s->sectnum)) if (sect >= 0 && cansee(x1,y1,s->z,sect,s->x,s->y,s->z,s->sectnum))
A_DamageWall(i,x,wal->x,wal->y,s->z,s->picnum); {
vec3_t tmpvect;
Bmemcpy(&tmpvect, wal, sizeof(int32_t) * 2);
tmpvect.z = s->z;
A_DamageWall(i,x,&tmpvect,s->picnum);
}
} }
} }
while (sectcnt < sectend); while (sectcnt < sectend);
@ -466,7 +473,7 @@ BOLT:
} }
} }
int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_t zchange, uint32_t cliptype) int32_t A_MoveSprite(int32_t spritenum, const vec3_t *change, uint32_t cliptype)
{ {
int32_t daz, oldx, oldy; int32_t daz, oldx, oldy;
int32_t retval; int32_t retval;
@ -475,9 +482,9 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
if (sprite[spritenum].statnum == 5 || (bg && sprite[spritenum].xrepeat < 4)) if (sprite[spritenum].statnum == 5 || (bg && sprite[spritenum].xrepeat < 4))
{ {
sprite[spritenum].x += (xchange*TICSPERFRAME)>>2; sprite[spritenum].x += (change->x*TICSPERFRAME)>>2;
sprite[spritenum].y += (ychange*TICSPERFRAME)>>2; sprite[spritenum].y += (change->y*TICSPERFRAME)>>2;
sprite[spritenum].z += (zchange*TICSPERFRAME)>>2; sprite[spritenum].z += (change->z*TICSPERFRAME)>>2;
if (bg) if (bg)
setsprite(spritenum,sprite[spritenum].x,sprite[spritenum].y,sprite[spritenum].z); setsprite(spritenum,sprite[spritenum].x,sprite[spritenum].y,sprite[spritenum].z);
return 0; return 0;
@ -493,7 +500,7 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
oldy = sprite[spritenum].y; oldy = sprite[spritenum].y;
if (sprite[spritenum].xrepeat > 60) if (sprite[spritenum].xrepeat > 60)
retval = clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),1024L,(4<<8),(4<<8),cliptype); retval = clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((change->x*TICSPERFRAME)<<11),((change->y*TICSPERFRAME)<<11),1024L,(4<<8),(4<<8),cliptype);
else else
{ {
if (sprite[spritenum].picnum == LIZMAN) if (sprite[spritenum].picnum == LIZMAN)
@ -503,7 +510,7 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
else else
cd = 192L; cd = 192L;
retval = clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),cd,(4<<8),(4<<8),cliptype); retval = clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((change->x*TICSPERFRAME)<<11),((change->y*TICSPERFRAME)<<11),cd,(4<<8),(4<<8),cliptype);
} }
if (dasectnum < 0 || (dasectnum >= 0 && if (dasectnum < 0 || (dasectnum >= 0 &&
@ -530,16 +537,16 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
{ {
if (sprite[spritenum].statnum == 4) if (sprite[spritenum].statnum == 4)
retval = retval =
clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),8L,(4<<8),(4<<8),cliptype); clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((change->x*TICSPERFRAME)<<11),((change->y*TICSPERFRAME)<<11),8L,(4<<8),(4<<8),cliptype);
else else
retval = retval =
clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((xchange*TICSPERFRAME)<<11),((ychange*TICSPERFRAME)<<11),(int32_t)(sprite[spritenum].clipdist<<2),(4<<8),(4<<8),cliptype); clipmove(&sprite[spritenum].x,&sprite[spritenum].y,&daz,&dasectnum,((change->x*TICSPERFRAME)<<11),((change->y*TICSPERFRAME)<<11),(int32_t)(sprite[spritenum].clipdist<<2),(4<<8),(4<<8),cliptype);
} }
if (dasectnum >= 0) if (dasectnum >= 0)
if ((dasectnum != sprite[spritenum].sectnum)) if ((dasectnum != sprite[spritenum].sectnum))
changespritesect(spritenum,dasectnum); changespritesect(spritenum,dasectnum);
daz = sprite[spritenum].z + ((zchange*TICSPERFRAME)>>3); daz = sprite[spritenum].z + ((change->z*TICSPERFRAME)>>3);
if ((daz > ActorExtra[spritenum].ceilingz) && (daz <= ActorExtra[spritenum].floorz)) if ((daz > ActorExtra[spritenum].ceilingz) && (daz <= ActorExtra[spritenum].floorz))
sprite[spritenum].z = daz; sprite[spritenum].z = daz;
else if (retval == 0) else if (retval == 0)
@ -550,9 +557,12 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
inline int32_t A_SetSprite(int32_t i,uint32_t cliptype) //The set sprite function inline int32_t A_SetSprite(int32_t i,uint32_t cliptype) //The set sprite function
{ {
return (A_MoveSprite(i,(sprite[i].xvel*(sintable[(sprite[i].ang+512)&2047]))>>14, vec3_t davect;
(sprite[i].xvel*(sintable[sprite[i].ang&2047]))>>14,sprite[i].zvel,
cliptype)==0); davect.x = (sprite[i].xvel*(sintable[(sprite[i].ang+512)&2047]))>>14;
davect.y = (sprite[i].xvel*(sintable[sprite[i].ang&2047]))>>14;
davect.z = sprite[i].zvel;
return (A_MoveSprite(i,&davect,cliptype)==0);
} }
#undef deletesprite #undef deletesprite
@ -2347,7 +2357,8 @@ static void A_DoProjectileBounce(int32_t i)
static void G_MoveWeapons(void) static void G_MoveWeapons(void)
{ {
int32_t i = headspritestat[STAT_PROJECTILE], j=0, k, f, nexti, p, q; int32_t i = headspritestat[STAT_PROJECTILE], j=0, k, f, nexti, p, q;
int32_t dax,day,daz, x, ll; vec3_t davect;
int32_t x, ll;
uint32_t qq; uint32_t qq;
spritetype *s; spritetype *s;
@ -2403,9 +2414,12 @@ static void G_MoveWeapons(void)
ll = s->zvel>>1; ll = s->zvel>>1;
} }
Bmemcpy(&davect,s,sizeof(int32_t) * 3);
/*
dax = s->x; dax = s->x;
day = s->y; day = s->y;
daz = s->z; daz = s->z;
*/
A_GetZLimits(i); A_GetZLimits(i);
qq = CLIPMASK1; qq = CLIPMASK1;
@ -2426,12 +2440,19 @@ static void G_MoveWeapons(void)
for (f=1;f<=ActorExtra[i].projectile.velmult;f++) for (f=1;f<=ActorExtra[i].projectile.velmult;f++)
{ {
vec3_t tmpvect;
/*
dax = s->x; dax = s->x;
day = s->y; day = s->y;
daz = s->z; daz = s->z;
j = A_MoveSprite(i, */
(k*(sintable[(s->ang+512)&2047]))>>14, Bmemcpy(&davect,s,sizeof(int32_t) * 3);
(k*(sintable[s->ang&2047]))>>14,ll,qq);
tmpvect.x = (k*(sintable[(s->ang+512)&2047]))>>14;
tmpvect.y = (k*(sintable[s->ang&2047]))>>14;
tmpvect.z = ll;
j = A_MoveSprite(i,&tmpvect,qq);
if (j) if (j)
break; break;
} }
@ -2462,9 +2483,13 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.spawns >= 0) if (ActorExtra[i].projectile.spawns >= 0)
{ {
k = A_Spawn(i,ActorExtra[i].projectile.spawns); k = A_Spawn(i,ActorExtra[i].projectile.spawns);
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax; sprite[k].x = dax;
sprite[k].y = day; sprite[k].y = day;
sprite[k].z = daz; sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4) if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat; sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2496,9 +2521,13 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.spawns >= 0) if (ActorExtra[i].projectile.spawns >= 0)
{ {
k = A_Spawn(i,ActorExtra[i].projectile.spawns); k = A_Spawn(i,ActorExtra[i].projectile.spawns);
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax; sprite[k].x = dax;
sprite[k].y = day; sprite[k].y = day;
sprite[k].z = daz; sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4) if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat; sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2612,9 +2641,12 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.spawns >= 0) if (ActorExtra[i].projectile.spawns >= 0)
{ {
k = A_Spawn(i,ActorExtra[i].projectile.spawns); k = A_Spawn(i,ActorExtra[i].projectile.spawns);
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax; sprite[k].x = dax;
sprite[k].y = day; sprite[k].y = day;
sprite[k].z = daz; sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4) if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat; sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2648,8 +2680,10 @@ static void G_MoveWeapons(void)
} }
else else
{ {
setsprite(i,dax,day,daz); vec3_t tmpvect;
A_DamageWall(i,j,s->x,s->y,s->z,s->picnum); setsprite(i,davect.x,davect.y,davect.z);
Bmemcpy(&tmpvect, s, sizeof(int32_t) * 3);
A_DamageWall(i,j,&tmpvect,s->picnum);
if (ActorExtra[i].projectile.workslike & PROJECTILE_BOUNCESOFFWALLS) if (ActorExtra[i].projectile.workslike & PROJECTILE_BOUNCESOFFWALLS)
{ {
@ -2675,7 +2709,7 @@ static void G_MoveWeapons(void)
} }
else if ((j&49152) == 16384) else if ((j&49152) == 16384)
{ {
setsprite(i,dax,day,daz); setsprite(i,davect.x,davect.y,davect.z);
if (s->zvel < 0) if (s->zvel < 0)
{ {
@ -2708,9 +2742,12 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.workslike & PROJECTILE_RPG && ActorExtra[i].projectile.spawns > 0) if (ActorExtra[i].projectile.workslike & PROJECTILE_RPG && ActorExtra[i].projectile.spawns > 0)
{ {
k = A_Spawn(i,ActorExtra[i].projectile.spawns); k = A_Spawn(i,ActorExtra[i].projectile.spawns);
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax; sprite[k].x = dax;
sprite[k].y = day; sprite[k].y = day;
sprite[k].z = daz; sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4) if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat; sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2819,9 +2856,12 @@ static void G_MoveWeapons(void)
ll = s->zvel>>1; ll = s->zvel>>1;
} }
Bmemcpy(&davect,s,sizeof(int32_t) * 3);
/*
dax = s->x; dax = s->x;
day = s->y; day = s->y;
daz = s->z; daz = s->z;
*/
A_GetZLimits(i); A_GetZLimits(i);
qq = CLIPMASK1; qq = CLIPMASK1;
@ -2837,7 +2877,15 @@ static void G_MoveWeapons(void)
break; break;
} }
j = A_MoveSprite(i,(k*(sintable[(s->ang+512)&2047]))>>14,(k*(sintable[s->ang&2047]))>>14,ll,qq); {
vec3_t tmpvect;
tmpvect.x = (k*(sintable[(s->ang+512)&2047]))>>14;
tmpvect.y = (k*(sintable[s->ang&2047]))>>14;
tmpvect.z = ll;
j = A_MoveSprite(i,&tmpvect,qq);
}
if (s->picnum == RPG && s->yvel >= 0 && sprite[s->yvel].sectnum < MAXSECTORS) if (s->picnum == RPG && s->yvel >= 0 && sprite[s->yvel].sectnum < MAXSECTORS)
if (FindDistance2D(s->x-sprite[s->yvel].x,s->y-sprite[s->yvel].y) < 256) if (FindDistance2D(s->x-sprite[s->yvel].x,s->y-sprite[s->yvel].y) < 256)
@ -2953,8 +3001,10 @@ static void G_MoveWeapons(void)
} }
else else
{ {
setsprite(i,dax,day,daz); vec3_t tmpvect;
A_DamageWall(i,j,s->x,s->y,s->z,s->picnum); setsprite(i,davect.x,davect.y,davect.z);
Bmemcpy(&tmpvect, s, sizeof(int32_t) * 3);
A_DamageWall(i,j,&tmpvect,s->picnum);
if (s->picnum == FREEZEBLAST) if (s->picnum == FREEZEBLAST)
{ {
@ -2974,7 +3024,7 @@ static void G_MoveWeapons(void)
} }
else if ((j&49152) == 16384) else if ((j&49152) == 16384)
{ {
setsprite(i,dax,day,daz); setsprite(i,davect.x,davect.y,davect.z);
if (s->zvel < 0) if (s->zvel < 0)
{ {
@ -3004,9 +3054,12 @@ static void G_MoveWeapons(void)
if (s->picnum == RPG) if (s->picnum == RPG)
{ {
k = A_Spawn(i,EXPLOSION2); k = A_Spawn(i,EXPLOSION2);
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax; sprite[k].x = dax;
sprite[k].y = day; sprite[k].y = day;
sprite[k].z = daz; sprite[k].z = daz;
*/
if (s->xrepeat < 10) if (s->xrepeat < 10)
{ {
@ -4355,10 +4408,14 @@ static void G_MoveActors(void)
} }
} }
j = A_MoveSprite(i, {
(s->xvel*(sintable[(s->ang+512)&2047]))>>14, vec3_t tmpvect;
(s->xvel*(sintable[s->ang&2047]))>>14,
s->zvel,CLIPMASK0); tmpvect.x = (s->xvel*(sintable[(s->ang+512)&2047]))>>14;
tmpvect.y = (s->xvel*(sintable[s->ang&2047]))>>14;
tmpvect.z = s->zvel;
j = A_MoveSprite(i,&tmpvect,CLIPMASK0);
}
ActorExtra[i].movflag = j; ActorExtra[i].movflag = j;
@ -4399,9 +4456,12 @@ static void G_MoveActors(void)
if ((j&49152) == 32768) if ((j&49152) == 32768)
{ {
vec3_t davect;
j &= (MAXWALLS-1); j &= (MAXWALLS-1);
A_DamageWall(i,j,s->x,s->y,s->z,s->picnum); Bmemcpy(&davect, s, sizeof(int32_t) * 3);
A_DamageWall(i,j,&davect,s->picnum);
k = getangle( k = getangle(
wall[wall[j].point2].x-wall[j].x, wall[wall[j].point2].x-wall[j].x,

View file

@ -7263,8 +7263,6 @@ static void InitCustomColors(void)
editorcolors[4] = getclosestcol(42,0,0); editorcolors[4] = getclosestcol(42,0,0);
editorcolors[5] = getclosestcol(0,0,0); editorcolors[5] = getclosestcol(0,0,0);
*/ */
extern int32_t getclosestcol(int32_t r, int32_t g, int32_t b);
vgapal16[9*4+0] = 63; vgapal16[9*4+0] = 63;
vgapal16[9*4+1] = 31; vgapal16[9*4+1] = 31;

View file

@ -574,6 +574,10 @@ extern int32_t movefifoplc, vel,svel,angvel,horiz;
extern int16_t g_mirrorWall[64], g_mirrorSector[64], g_mirrorCount; extern int16_t g_mirrorWall[64], g_mirrorSector[64], g_mirrorCount;
typedef struct {
int32_t x, y, z;
} vec3_t;
#include "funct.h" #include "funct.h"
extern int32_t g_screenCapture; extern int32_t g_screenCapture;
@ -588,28 +592,26 @@ extern int32_t GametypeFlags[MAXGAMETYPES];
extern char g_numGametypes; extern char g_numGametypes;
enum GametypeFlags_t { enum GametypeFlags_t {
GAMETYPE_COOP = 1, GAMETYPE_COOP = 0x00000001,
GAMETYPE_WEAPSTAY = 2, GAMETYPE_WEAPSTAY = 0x00000002,
GAMETYPE_FRAGBAR = 4, GAMETYPE_FRAGBAR = 0x00000004,
GAMETYPE_SCORESHEET = 8, GAMETYPE_SCORESHEET = 0x00000008,
GAMETYPE_DMSWITCHES = 16, GAMETYPE_DMSWITCHES = 0x00000010,
GAMETYPE_COOPSPAWN = 32, GAMETYPE_COOPSPAWN = 0x00000020,
GAMETYPE_ACCESSCARDSPRITES = 64, GAMETYPE_ACCESSCARDSPRITES = 0x00000040,
GAMETYPE_COOPVIEW = 128, GAMETYPE_COOPVIEW = 0x00000080,
GAMETYPE_COOPSOUND = 256, GAMETYPE_COOPSOUND = 0x00000100,
GAMETYPE_OTHERPLAYERSINMAP = 512, GAMETYPE_OTHERPLAYERSINMAP = 0x00000200,
GAMETYPE_ITEMRESPAWN = 1024, GAMETYPE_ITEMRESPAWN = 0x00000400,
GAMETYPE_MARKEROPTION = 2048, GAMETYPE_MARKEROPTION = 0x00000800,
GAMETYPE_PLAYERSFRIENDLY = 4096, GAMETYPE_PLAYERSFRIENDLY = 0x00001000,
GAMETYPE_FIXEDRESPAWN = 8192, GAMETYPE_FIXEDRESPAWN = 0x00002000,
GAMETYPE_ACCESSATSTART = 16384, GAMETYPE_ACCESSATSTART = 0x00004000,
GAMETYPE_PRESERVEINVENTORYDEATH = 32768, GAMETYPE_PRESERVEINVENTORYDEATH = 0x00008000,
GAMETYPE_TDM = 65536, GAMETYPE_TDM = 0x00010000,
GAMETYPE_TDMSPAWN = 131072 GAMETYPE_TDMSPAWN = 0x00020000
}; };
#define GTFLAGS(x) (GametypeFlags[ud.coop] & x)
extern char g_numVolumes; extern char g_numVolumes;
extern int32_t g_lastSaveSlot; extern int32_t g_lastSaveSlot;
@ -785,14 +787,6 @@ enum GameEvent_t {
MAXEVENTS MAXEVENTS
}; };
enum SystemString_t {
STR_MAPNAME,
STR_MAPFILENAME,
STR_PLAYERNAME,
STR_VERSION,
STR_GAMETYPE
};
// store global game definitions // store global game definitions
@ -1004,19 +998,18 @@ typedef struct {
animwalltype animwall[MAXANIMWALLS]; animwalltype animwall[MAXANIMWALLS];
int32_t msx[2048], msy[2048]; int32_t msx[2048], msy[2048];
int16_t g_mirrorWall[64], g_mirrorSector[64], g_mirrorCount; int16_t g_mirrorWall[64], g_mirrorSector[64], g_mirrorCount;
char show2dsector[(MAXSECTORS+7)>>3]; uint8_t show2dsector[(MAXSECTORS+7)>>3];
int16_t g_numClouds,clouds[128],cloudx[128],cloudy[128]; int16_t g_numClouds,clouds[128],cloudx[128],cloudy[128];
ActorData_t ActorExtra[MAXSPRITES]; ActorData_t ActorExtra[MAXSPRITES];
int16_t pskyoff[MAXPSKYTILES], pskybits; int16_t pskyoff[MAXPSKYTILES], pskybits;
int32_t animategoal[MAXANIMATES], animatevel[MAXANIMATES], g_animateCount; int32_t animategoal[MAXANIMATES], animatevel[MAXANIMATES], g_animateCount;
int16_t animatesect[MAXANIMATES]; int16_t animatesect[MAXANIMATES];
int32_t animateptr[MAXANIMATES]; int32_t animateptr[MAXANIMATES];
char g_numPlayerSprites; uint8_t g_numPlayerSprites;
char g_earthquakeTime; uint8_t g_earthquakeTime;
int32_t lockclock; int32_t lockclock;
int32_t randomseed, g_globalRandom; int32_t randomseed, g_globalRandom;
char scriptptrs[MAXSPRITES]; uint8_t scriptptrs[MAXSPRITES];
intptr_t *vars[MAXGAMEVARS]; intptr_t *vars[MAXGAMEVARS];
} mapstate_t; } mapstate_t;

View file

@ -43,7 +43,7 @@ extern void S_MusicShutdown(void);
extern void S_MenuSound(void); extern void S_MenuSound(void);
extern int32_t S_PlayMusic(const char *fn, const int32_t sel); extern int32_t S_PlayMusic(const char *fn, const int32_t sel);
extern int32_t S_LoadSound(unsigned num); extern int32_t S_LoadSound(unsigned num);
extern int32_t S_PlaySoundXYZ(int32_t num,int32_t i,int32_t x,int32_t y,int32_t z); extern int32_t S_PlaySoundXYZ(int32_t num,int32_t i,const vec3_t *pos);
extern void S_PlaySound(int32_t num); extern void S_PlaySound(int32_t num);
extern int32_t A_PlaySound(uint32_t num,int32_t i); extern int32_t A_PlaySound(uint32_t num,int32_t i);
extern void S_StopSound(int32_t num); extern void S_StopSound(int32_t num);
@ -74,7 +74,7 @@ extern void G_OperateMasterSwitches(int32_t low);
extern void G_OperateForceFields(int32_t s,int32_t low); extern void G_OperateForceFields(int32_t s,int32_t low);
extern int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype); extern int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype);
extern void activatebysector(int32_t sect,int32_t j); extern void activatebysector(int32_t sect,int32_t j);
extern void A_DamageWall(int32_t spr,int32_t dawallnum,int32_t x,int32_t y,int32_t z,int32_t atwith); extern void A_DamageWall(int32_t spr,int32_t dawallnum,const vec3_t *pos,int32_t atwith);
extern void P_CheckTouchDamage(DukePlayer_t *p,int32_t j); extern void P_CheckTouchDamage(DukePlayer_t *p,int32_t j);
extern int32_t Sect_DamageCeiling(int32_t sn); extern int32_t Sect_DamageCeiling(int32_t sn);
extern void A_DamageObject(int32_t i,int32_t sn); extern void A_DamageObject(int32_t i,int32_t sn);
@ -127,7 +127,6 @@ extern void A_Fall(int32_t iActor);
extern void C_Compile(const char *fn); extern void C_Compile(const char *fn);
extern int32_t A_GetFurthestAngle(int32_t iActor,int32_t angs); extern int32_t A_GetFurthestAngle(int32_t iActor,int32_t angs);
extern void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist); extern void A_Execute(int32_t iActor,int32_t iPlayer,int32_t lDist);
extern void overwritesprite(int32_t thex,int32_t they,int32_t tilenum,int32_t shade,int32_t stat,int32_t dapalnum);
extern void gamenumber(int32_t x,int32_t y,int32_t n,int32_t s); extern void gamenumber(int32_t x,int32_t y,int32_t n,int32_t s);
extern void G_Shutdown(void); extern void G_Shutdown(void);
extern void Net_GetPackets(void); extern void Net_GetPackets(void);
@ -180,7 +179,7 @@ extern void P_AddWeapon(DukePlayer_t *p,int32_t weapon);
extern void P_SelectNextInvItem(DukePlayer_t *p); extern void P_SelectNextInvItem(DukePlayer_t *p);
extern void P_CheckWeapon(DukePlayer_t *p); extern void P_CheckWeapon(DukePlayer_t *p);
extern void A_RadiusDamage(int32_t i,int32_t r,int32_t hp1,int32_t hp2,int32_t hp3,int32_t hp4); extern void A_RadiusDamage(int32_t i,int32_t r,int32_t hp1,int32_t hp2,int32_t hp3,int32_t hp4);
extern int32_t A_MoveSprite(int32_t spritenum,int32_t xchange,int32_t ychange,int32_t zchange,uint32_t cliptype); extern int32_t A_MoveSprite(int32_t spritenum,const vec3_t *change,uint32_t cliptype);
extern inline int32_t A_SetSprite(int32_t i,uint32_t cliptype); extern inline int32_t A_SetSprite(int32_t i,uint32_t cliptype);
extern void A_AddToDeleteQueue(int32_t i); extern void A_AddToDeleteQueue(int32_t i);
extern void A_SpawnMultiple(int32_t sp,int32_t pic,int32_t n); extern void A_SpawnMultiple(int32_t sp,int32_t pic,int32_t n);

View file

@ -3473,7 +3473,6 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16
#define CROSSHAIR_PAL (MAXPALOOKUPS-RESERVEDPALS-1) #define CROSSHAIR_PAL (MAXPALOOKUPS-RESERVEDPALS-1)
extern int32_t getclosestcol(int32_t r, int32_t g, int32_t b);
palette_t CrosshairColors = { 255, 255, 255, 0 }; palette_t CrosshairColors = { 255, 255, 255, 0 };
palette_t DefaultCrosshairColors = { 0, 0, 0, 0 }; palette_t DefaultCrosshairColors = { 0, 0, 0, 0 };
int32_t g_crosshairSum = 0; int32_t g_crosshairSum = 0;
@ -3598,7 +3597,7 @@ void G_DisplayRest(int32_t smoothratio)
DukePlayer_t *pp = g_player[screenpeek].ps; DukePlayer_t *pp = g_player[screenpeek].ps;
walltype *wal; walltype *wal;
int32_t cposx,cposy,cang; int32_t cposx, cposy, cang;
#if defined(USE_OPENGL) && defined(POLYMOST) #if defined(USE_OPENGL) && defined(POLYMOST)
// this takes care of fullscreen tint for OpenGL // this takes care of fullscreen tint for OpenGL
@ -7505,7 +7504,7 @@ PALONLY:
do do
{ {
if (display_mirror) tsprite[j].statnum = TSPR_MIRROR; if (display_mirror) tsprite[j].statnum = TSPR_MIRROR;
if (tsprite[j].owner < MAXSPRITES && tsprite[j].owner > 0 && spriteext[tsprite[j].owner].flags & SPREXT_TSPRACCESS) if (tsprite[j].owner < MAXSPRITES && tsprite[j].owner >= 0 && spriteext[tsprite[j].owner].flags & SPREXT_TSPRACCESS)
{ {
spriteext[tsprite[j].owner].tspr = (spritetype *)&tsprite[j]; spriteext[tsprite[j].owner].tspr = (spritetype *)&tsprite[j];
X_OnEvent(EVENT_ANIMATESPRITES,tsprite[j].owner, myconnectindex, -1); X_OnEvent(EVENT_ANIMATESPRITES,tsprite[j].owner, myconnectindex, -1);
@ -7516,7 +7515,7 @@ PALONLY:
if (j < 0) return; if (j < 0) return;
if (display_mirror) tsprite[j].statnum = TSPR_MIRROR; if (display_mirror) tsprite[j].statnum = TSPR_MIRROR;
if (tsprite[j].owner > 0 && tsprite[j].owner < MAXSPRITES && spriteext[tsprite[j].owner].flags & SPREXT_TSPRACCESS) if (tsprite[j].owner >= 0 && tsprite[j].owner < MAXSPRITES && spriteext[tsprite[j].owner].flags & SPREXT_TSPRACCESS)
{ {
spriteext[tsprite[j].owner].tspr = (spritetype *)&tsprite[j]; spriteext[tsprite[j].owner].tspr = (spritetype *)&tsprite[j];
X_OnEvent(EVENT_ANIMATESPRITES,tsprite[j].owner, myconnectindex, -1); X_OnEvent(EVENT_ANIMATESPRITES,tsprite[j].owner, myconnectindex, -1);
@ -10966,12 +10965,12 @@ void app_main(int32_t argc,const char **argv)
if (!ShellExecuteExA(&sinfo)) if (!ShellExecuteExA(&sinfo))
initprintf("update: error launching browser!\n"); initprintf("update: error launching browser!\n");
/* /*
CONFIG_SetupMouse(); CONFIG_SetupMouse();
CONFIG_SetupJoystick(); CONFIG_SetupJoystick();
CONFIG_WriteSetup(); CONFIG_WriteSetup();
G_GameExit(" "); G_GameExit(" ");
*/ */
} }
} }
else initprintf("... no updates available\n"); else initprintf("... no updates available\n");

View file

@ -5738,6 +5738,7 @@ static void C_AddDefaultDefinitions(void)
C_AddDefinition("STR_PLAYERNAME",STR_PLAYERNAME,LABEL_DEFINE); C_AddDefinition("STR_PLAYERNAME",STR_PLAYERNAME,LABEL_DEFINE);
C_AddDefinition("STR_VERSION",STR_VERSION,LABEL_DEFINE); C_AddDefinition("STR_VERSION",STR_VERSION,LABEL_DEFINE);
C_AddDefinition("STR_GAMETYPE",STR_GAMETYPE,LABEL_DEFINE); C_AddDefinition("STR_GAMETYPE",STR_GAMETYPE,LABEL_DEFINE);
C_AddDefinition("STR_VOLUMENAME",STR_VOLUMENAME,LABEL_DEFINE);
C_AddDefinition("NO",0,LABEL_DEFINE|LABEL_ACTION|LABEL_AI|LABEL_MOVE); C_AddDefinition("NO",0,LABEL_DEFINE|LABEL_ACTION|LABEL_AI|LABEL_MOVE);

View file

@ -113,6 +113,15 @@ extern int32_t g_errorLineNum;
extern int32_t g_tw; extern int32_t g_tw;
extern const char *keyw[]; extern const char *keyw[];
enum SystemString_t {
STR_MAPNAME,
STR_MAPFILENAME,
STR_PLAYERNAME,
STR_VERSION,
STR_GAMETYPE,
STR_VOLUMENAME
};
enum ScriptError_t enum ScriptError_t
{ {
ERROR_CLOSEBRACKET, ERROR_CLOSEBRACKET,

View file

@ -605,9 +605,14 @@ static void X_Move(void)
} }
} }
ActorExtra[vm.g_i].movflag = A_MoveSprite(vm.g_i, {
(daxvel*(sintable[(angdif+512)&2047]))>>14, vec3_t tmpvect;
(daxvel*(sintable[angdif&2047]))>>14,vm.g_sp->zvel,CLIPMASK0);
tmpvect.x = (daxvel*(sintable[(angdif+512)&2047]))>>14;
tmpvect.y = (daxvel*(sintable[angdif&2047]))>>14;
tmpvect.z = vm.g_sp->zvel;
ActorExtra[vm.g_i].movflag = A_MoveSprite(vm.g_i,&tmpvect,CLIPMASK0);
}
} }
if (a) if (a)
@ -1617,6 +1622,9 @@ static int32_t X_DoExecute(void)
case STR_GAMETYPE: case STR_GAMETYPE:
Bstrcpy(ScriptQuotes[i],GametypeNames[ud.coop]); Bstrcpy(ScriptQuotes[i],GametypeNames[ud.coop]);
break; break;
case STR_VOLUMENAME:
Bstrcpy(ScriptQuotes[i],EpisodeNames[ud.volume_number]);
break;
default: default:
OSD_Printf(CON_ERROR "unknown str ID %d %d\n",g_errorLineNum,keyw[g_tw],i,j); OSD_Printf(CON_ERROR "unknown str ID %d %d\n",g_errorLineNum,keyw[g_tw],i,j);
} }
@ -2402,7 +2410,11 @@ static int32_t X_DoExecute(void)
insptr++; insptr++;
{ {
int32_t spritenum = Gv_GetVarX(*insptr++); int32_t spritenum = Gv_GetVarX(*insptr++);
int32_t x = Gv_GetVarX(*insptr++), y = Gv_GetVarX(*insptr++), z = Gv_GetVarX(*insptr++); vec3_t davector;
davector.x = Gv_GetVarX(*insptr++);
davector.y = Gv_GetVarX(*insptr++);
davector.z = Gv_GetVarX(*insptr++);
if (tw == CON_SETSPRITE) if (tw == CON_SETSPRITE)
{ {
@ -2411,7 +2423,7 @@ static int32_t X_DoExecute(void)
OSD_Printf(CON_ERROR "invalid sprite ID %d\n",g_errorLineNum,keyw[g_tw],spritenum); OSD_Printf(CON_ERROR "invalid sprite ID %d\n",g_errorLineNum,keyw[g_tw],spritenum);
break; break;
} }
setsprite(spritenum, x, y, z); setsprite(spritenum, davector.x, davector.y, davector.z);
break; break;
} }
@ -2424,7 +2436,7 @@ static int32_t X_DoExecute(void)
insptr++; insptr++;
break; break;
} }
Gv_SetVarX(*insptr++, A_MoveSprite(spritenum, x, y, z, cliptype)); Gv_SetVarX(*insptr++, A_MoveSprite(spritenum, &davector, cliptype));
break; break;
} }
} }
@ -3061,7 +3073,7 @@ static int32_t X_DoExecute(void)
index=Gv_GetVarX(*insptr++); index=Gv_GetVarX(*insptr++);
label=*insptr++; label=*insptr++;
/* if ((index < aGameArrays[lVarID].size)&&(index>=0)) /* if ((index < aGameArrays[lVarID].size)&&(index>=0))
{ {
OSD_Printf(OSDTEXT_GREEN "%s: L=%d %s[%d] =%d\n",g_errorLineNum,keyw[g_tw], OSD_Printf(OSDTEXT_GREEN "%s: L=%d %s[%d] =%d\n",g_errorLineNum,keyw[g_tw],
aGameArrays[lVarID].szLabel,index,m*aGameArrays[lVarID].plValues[index]); aGameArrays[lVarID].szLabel,index,m*aGameArrays[lVarID].plValues[index]);

View file

@ -1,5 +1,7 @@
// Macros, some from SW source // Macros, some from SW source
#define GTFLAGS(x) (GametypeFlags[ud.coop] & x)
#define TRAVERSE_SPRITE_SECT(l, o, n) for ((o) = (l); (n) = nextspritesect[o], (o) != -1; (o) = (n)) #define TRAVERSE_SPRITE_SECT(l, o, n) for ((o) = (l); (n) = nextspritesect[o], (o) != -1; (o) = (n))
#define TRAVERSE_SPRITE_STAT(l, o, n) for ((o) = (l); (n) = nextspritestat[o], (o) != -1; (o) = (n)) #define TRAVERSE_SPRITE_STAT(l, o, n) for ((o) = (l); (n) = nextspritestat[o], (o) != -1; (o) = (n))
#define TRAVERSE_CONNECT(i) for (i = connecthead; i != -1; i = connectpoint2[i]) #define TRAVERSE_CONNECT(i) for (i = connecthead; i != -1; i = connectpoint2[i])

View file

@ -139,35 +139,39 @@ static void A_DoWaterTracers(int32_t x1,int32_t y1,int32_t z1,int32_t x2,int32_t
} }
} }
static void A_HitscanProjTrail(int32_t x1, int32_t y1, int32_t z1, int32_t x2, int32_t y2, int32_t z2, int32_t ang, int32_t atwith) static void A_HitscanProjTrail(const vec3_t *sv, const vec3_t *dv, int32_t ang, int32_t atwith)
{ {
int32_t n, j, i; int32_t n, j, i;
int16_t sect = -1; int16_t sect = -1;
vec3_t srcvect;
vec3_t destvect;
x1 += (sintable[(348+ang+512)&2047]/ProjectileData[atwith].offset); Bmemcpy(&destvect,&dv,sizeof(vec3_t));
y1 += (sintable[(ang+348)&2047]/ProjectileData[atwith].offset);
z1 += 1024+(ProjectileData[atwith].toffset<<8);
n = ((FindDistance2D(x1-x2,y1-y2))>>8)+1; srcvect.x = sv->x + (sintable[(348+ang+512)&2047]/ProjectileData[atwith].offset);
srcvect.y = sv->y + (sintable[(ang+348)&2047]/ProjectileData[atwith].offset);
srcvect.z = sv->z + 1024+(ProjectileData[atwith].toffset<<8);
x2 = ((x2-x1)/n); n = ((FindDistance2D(srcvect.x-destvect.x,srcvect.y-destvect.y))>>8)+1;
y2 = ((y2-y1)/n);
z2 = ((z2-z1)/n);
x1 += x2>>2; destvect.x = ((destvect.x-srcvect.x)/n);
y1 += y2>>2; destvect.y = ((destvect.y-srcvect.y)/n);
z1 += (z2>>2); destvect.z = ((destvect.z-srcvect.z)/n);
srcvect.x += destvect.x>>2;
srcvect.y += destvect.y>>2;
srcvect.z += (destvect.z>>2);
for (i=ProjectileData[atwith].tnum;i>0;i--) for (i=ProjectileData[atwith].tnum;i>0;i--)
{ {
x1 += x2; srcvect.x += destvect.x;
y1 += y2; srcvect.y += destvect.y;
z1 += z2; srcvect.z += destvect.z;
updatesector(x1,y1,&sect); updatesector(srcvect.x,srcvect.y,&sect);
getzsofslope(sect,x1,y1,&n,&j); getzsofslope(sect,srcvect.x,srcvect.y,&n,&j);
if (sect < 0 || z1 > j || z1 < n) if (sect < 0 || srcvect.z > j || srcvect.z < n)
break; break;
j = A_InsertSprite(sect,x1,y1,z1,ProjectileData[atwith].trail,-32,ProjectileData[atwith].txrepeat,ProjectileData[atwith].tyrepeat,ang,0,0,g_player[0].ps->i,0); j = A_InsertSprite(sect,srcvect.x,srcvect.y,srcvect.z,ProjectileData[atwith].trail,-32,ProjectileData[atwith].txrepeat,ProjectileData[atwith].tyrepeat,ang,0,0,g_player[0].ps->i,0);
changespritestat(j,1); changespritestat(j,1);
} }
} }
@ -301,7 +305,9 @@ static int32_t A_FindTargetSprite(spritetype *s,int32_t aang,int32_t atwith)
int32_t A_Shoot(int32_t i,int32_t atwith) int32_t A_Shoot(int32_t i,int32_t atwith)
{ {
int16_t hitsect, hitspr, hitwall, l, sa, p, j, k=-1, wh, scount; int16_t hitsect, hitspr, hitwall, l, sa, p, j, k=-1, wh, scount;
int32_t sx, sy, sz, vel, zvel = 0, hitx, hity, hitz, x, oldzvel, dal; int32_t vel, zvel = 0, x, oldzvel, dal;
vec3_t hitvect;
vec3_t srcvect;
char sizx,sizy; char sizx,sizy;
spritetype *s = &sprite[i]; spritetype *s = &sprite[i];
int16_t sect = s->sectnum; int16_t sect = s->sectnum;
@ -310,9 +316,9 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
{ {
p = s->yvel; p = s->yvel;
sx = g_player[p].ps->posx; srcvect.x = g_player[p].ps->posx;
sy = g_player[p].ps->posy; srcvect.y = g_player[p].ps->posy;
sz = g_player[p].ps->posz+g_player[p].ps->pyoff+(4<<8); srcvect.z = g_player[p].ps->posz+g_player[p].ps->pyoff+(4<<8);
sa = g_player[p].ps->ang; sa = g_player[p].ps->ang;
g_player[p].ps->crack_time = 777; g_player[p].ps->crack_time = 777;
@ -321,16 +327,16 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
{ {
p = -1; p = -1;
sa = s->ang; sa = s->ang;
sx = s->x; Bmemcpy(&srcvect,s,sizeof(int32_t) * 3);
sy = s->y; srcvect.z -= ((s->yrepeat*tilesizy[s->picnum])<<1)+(4<<8);
sz = s->z-((s->yrepeat*tilesizy[s->picnum])<<1)+(4<<8);
if (s->picnum != ROTATEGUN) if (s->picnum != ROTATEGUN)
{ {
sz -= (7<<8); srcvect.z -= (7<<8);
if (A_CheckEnemySprite(s) && PN != COMMANDER) if (A_CheckEnemySprite(s) && PN != COMMANDER)
{ {
sx += (sintable[(sa+1024+96)&2047]>>7); srcvect.x += (sintable[(sa+1024+96)&2047]>>7);
sy += (sintable[(sa+512+96)&2047]>>7); srcvect.y += (sintable[(sa+512+96)&2047]>>7);
} }
} }
} }
@ -357,29 +363,29 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
if (p >= 0) if (p >= 0)
{ {
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5; zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5;
sz += (6<<8); srcvect.z += (6<<8);
sa += 15; sa += 15;
} }
else if (!(ProjectileData[atwith].workslike & PROJECTILE_NOAIM)) else if (!(ProjectileData[atwith].workslike & PROJECTILE_NOAIM))
{ {
j = g_player[A_FindPlayer(s,&x)].ps->i; j = g_player[A_FindPlayer(s,&x)].ps->i;
zvel = ((sprite[j].z-sz)<<8) / (x+1); zvel = ((sprite[j].z-srcvect.z)<<8) / (x+1);
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
} }
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect, hitscan(srcvect.x,srcvect.y,srcvect.z,sect,
sintable[(sa+512)&2047], sintable[(sa+512)&2047],
sintable[sa&2047],zvel<<6, sintable[sa&2047],zvel<<6,
&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); &hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (ProjectileData[atwith].workslike & PROJECTILE_BLOOD) if (ProjectileData[atwith].workslike & PROJECTILE_BLOOD)
{ {
if (ProjectileData[atwith].range == 0) if (ProjectileData[atwith].range == 0)
ProjectileData[atwith].range = 1024; ProjectileData[atwith].range = 1024;
if (FindDistance2D(sx-hitx,sy-hity) < ProjectileData[atwith].range) if (FindDistance2D(srcvect.x-hitvect.x,srcvect.y-hitvect.y) < ProjectileData[atwith].range)
if (FindDistance2D(wall[hitwall].x-wall[wall[hitwall].point2].x,wall[hitwall].y-wall[wall[hitwall].point2].y) > (mulscale(ProjectileData[atwith].xrepeat+8,tilesizx[ProjectileData[atwith].decal],3))) if (FindDistance2D(wall[hitwall].x-wall[wall[hitwall].point2].x,wall[hitwall].y-wall[wall[hitwall].point2].y) > (mulscale(ProjectileData[atwith].xrepeat+8,tilesizx[ProjectileData[atwith].decal],3)))
if (hitwall >= 0 && wall[hitwall].overpicnum != BIGFORCE) if (hitwall >= 0 && wall[hitwall].overpicnum != BIGFORCE)
if ((wall[hitwall].nextsector >= 0 && hitsect >= 0 && if ((wall[hitwall].nextsector >= 0 && hitsect >= 0 &&
@ -414,9 +420,9 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
sprite[k].xvel = -12; sprite[k].xvel = -12;
sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x, sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512; wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
sprite[k].x = hitx; sprite[k].x = hitvect.x;
sprite[k].y = hity; sprite[k].y = hitvect.y;
sprite[k].z = hitz; sprite[k].z = hitvect.z;
sprite[k].cstat |= (krand()&4); sprite[k].cstat |= (krand()&4);
sprite[k].xrepeat = ProjectileData[atwith].xrepeat; sprite[k].xrepeat = ProjectileData[atwith].xrepeat;
sprite[k].yrepeat = ProjectileData[atwith].yrepeat; sprite[k].yrepeat = ProjectileData[atwith].yrepeat;
@ -433,9 +439,9 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
sprite[k].xvel = -1; sprite[k].xvel = -1;
sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x, sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512; wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
sprite[k].x = hitx; sprite[k].x = hitvect.x;
sprite[k].y = hity; sprite[k].y = hitvect.y;
sprite[k].z = hitz; sprite[k].z = hitvect.z;
if (ProjectileData[atwith].workslike & PROJECTILE_RANDDECALSIZE) if (ProjectileData[atwith].workslike & PROJECTILE_RANDDECALSIZE)
{ {
wh = (krand()&ProjectileData[atwith].xrepeat); wh = (krand()&ProjectileData[atwith].xrepeat);
@ -483,13 +489,13 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
if ((ProjectileData[atwith].range == 0) && (ProjectileData[atwith].workslike & PROJECTILE_KNEE)) if ((ProjectileData[atwith].range == 0) && (ProjectileData[atwith].workslike & PROJECTILE_KNEE))
ProjectileData[atwith].range = 1024; ProjectileData[atwith].range = 1024;
if ((ProjectileData[atwith].range > 0) && ((klabs(sx-hitx)+klabs(sy-hity)) > ProjectileData[atwith].range)) if ((ProjectileData[atwith].range > 0) && ((klabs(srcvect.x-hitvect.x)+klabs(srcvect.y-hitvect.y)) > ProjectileData[atwith].range))
return -1; return -1;
else else
{ {
if (hitwall >= 0 || hitspr >= 0) if (hitwall >= 0 || hitspr >= 0)
{ {
j = A_InsertSprite(hitsect,hitx,hity,hitz,atwith,-15,0,0,sa,32,0,i,4); j = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,atwith,-15,0,0,sa,32,0,i,4);
ActorExtra[j].projectile.workslike = ProjectileData[sprite[j].picnum].workslike; ActorExtra[j].projectile.workslike = ProjectileData[sprite[j].picnum].workslike;
sprite[j].extra = ProjectileData[atwith].extra; sprite[j].extra = ProjectileData[atwith].extra;
if (ProjectileData[atwith].extra_rand > 0) if (ProjectileData[atwith].extra_rand > 0)
@ -520,12 +526,12 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
{ {
if (wall[hitwall].cstat&2) if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0) if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz)) if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall; hitwall = wall[hitwall].nextwall;
if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2) if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
{ {
A_DamageWall(j,hitwall,hitx,hity,hitz,atwith); A_DamageWall(j,hitwall,&hitvect,atwith);
if (p >= 0) P_ActivateSwitch(p,hitwall,0); if (p >= 0) P_ActivateSwitch(p,hitwall,0);
} }
} }
@ -533,8 +539,8 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
else if (p >= 0 && zvel > 0 && sector[hitsect].lotag == 1) else if (p >= 0 && zvel > 0 && sector[hitsect].lotag == 1)
{ {
j = A_Spawn(g_player[p].ps->i,WATERSPLASH2); j = A_Spawn(g_player[p].ps->i,WATERSPLASH2);
sprite[j].x = hitx; sprite[j].x = hitvect.x;
sprite[j].y = hity; sprite[j].y = hitvect.y;
sprite[j].ang = g_player[p].ps->ang; // Total tweek sprite[j].ang = g_player[p].ps->ang; // Total tweek
sprite[j].xvel = 32; sprite[j].xvel = 32;
A_SetSprite(i,CLIPMASK0); A_SetSprite(i,CLIPMASK0);
@ -569,10 +575,10 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
dal -= (8<<8); dal -= (8<<8);
// return -1; // return -1;
} }
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++; if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-sz-dal)<<8) / hitx; zvel = ((sprite[j].z-srcvect.z-dal)<<8) / hitvect.x;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
Gv_SetVar(g_iAngRangeVarID,angRange, i,p); Gv_SetVar(g_iAngRangeVarID,angRange, i,p);
@ -587,8 +593,8 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
{ {
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5; zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect,sintable[(sa+512)&2047],sintable[sa&2047], hitscan(srcvect.x,srcvect.y,srcvect.z,sect,sintable[(sa+512)&2047],sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (hitspr != -1) if (hitspr != -1)
{ {
if (sprite[hitspr].statnum == 1 || sprite[hitspr].statnum == 2 || sprite[hitspr].statnum == 10 || sprite[hitspr].statnum == 13) if (sprite[hitspr].statnum == 1 || sprite[hitspr].statnum == 2 || sprite[hitspr].statnum == 10 || sprite[hitspr].statnum == 13)
@ -613,16 +619,16 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
} }
zvel += (zRange/2)-(krand()&(zRange-1)); zvel += (zRange/2)-(krand()&(zRange-1));
} }
sz -= (2<<8); srcvect.z -= (2<<8);
} }
else else
{ {
j = A_FindPlayer(s,&x); j = A_FindPlayer(s,&x);
sz -= (4<<8); srcvect.z -= (4<<8);
hitx = ldist(&sprite[g_player[j].ps->i], s); hitvect.x = ldist(&sprite[g_player[j].ps->i], s);
if (hitx == 0) if (hitvect.x == 0)
hitx++; hitvect.x++;
zvel = ((g_player[j].ps->posz-sz) <<8) / hitx; zvel = ((g_player[j].ps->posz-srcvect.z) <<8) / hitvect.x;
if (s->picnum != BOSS1) if (s->picnum != BOSS1)
{ {
zvel += 128-(krand()&255); zvel += 128-(krand()&255);
@ -631,7 +637,7 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
else else
{ {
zvel += 128-(krand()&255); zvel += 128-(krand()&255);
sa = getangle(g_player[j].ps->posx-sx,g_player[j].ps->posy-sy)+64-(krand()&127); sa = getangle(g_player[j].ps->posx-srcvect.x,g_player[j].ps->posy-srcvect.y)+64-(krand()&127);
} }
} }
@ -639,10 +645,10 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
else s->cstat &= ~257; else s->cstat &= ~257;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect, hitscan(srcvect.x,srcvect.y,srcvect.z,sect,
sintable[(sa+512)&2047], sintable[(sa+512)&2047],
sintable[sa&2047], sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (ProjectileData[atwith].cstat >= 0) s->cstat |= ProjectileData[atwith].cstat; if (ProjectileData[atwith].cstat >= 0) s->cstat |= ProjectileData[atwith].cstat;
@ -650,20 +656,28 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
if (hitsect < 0) return -1; if (hitsect < 0) return -1;
if ((ProjectileData[atwith].range > 0) && ((klabs(sx-hitx)+klabs(sy-hity)) > ProjectileData[atwith].range)) return -1; if ((ProjectileData[atwith].range > 0) &&
((klabs(srcvect.x-hitvect.x)+klabs(srcvect.y-hitvect.y)) > ProjectileData[atwith].range))
return -1;
if (ProjectileData[atwith].trail >= 0) if (ProjectileData[atwith].trail >= 0)
A_HitscanProjTrail(sx,sy,sz,hitx,hity,hitz,sa,atwith); {
vec3_t tmpvect;
vec3_t tmphvect;
Bmemcpy(&tmpvect,&srcvect,sizeof(vec3_t));
Bmemcpy(&tmphvect,&hitvect,sizeof(vec3_t));
A_HitscanProjTrail(&tmpvect,&tmphvect,sa,atwith);
}
if (ProjectileData[atwith].workslike & PROJECTILE_WATERBUBBLES) if (ProjectileData[atwith].workslike & PROJECTILE_WATERBUBBLES)
{ {
if ((krand()&15) == 0 && sector[hitsect].lotag == 2) if ((krand()&15) == 0 && sector[hitsect].lotag == 2)
A_DoWaterTracers(hitx,hity,hitz,sx,sy,sz,8-(ud.multimode>>1)); A_DoWaterTracers(hitvect.x,hitvect.y,hitvect.z,srcvect.x,srcvect.y,srcvect.z,8-(ud.multimode>>1));
} }
if (p >= 0) if (p >= 0)
{ {
k = A_InsertSprite(hitsect,hitx,hity,hitz,SHOTSPARK1,-15,10,10,sa,0,0,i,4); k = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,SHOTSPARK1,-15,10,10,sa,0,0,i,4);
sprite[k].extra = ProjectileData[atwith].extra; sprite[k].extra = ProjectileData[atwith].extra;
if (ProjectileData[atwith].extra_rand > 0) if (ProjectileData[atwith].extra_rand > 0)
sprite[k].extra += (krand()%ProjectileData[atwith].extra_rand); sprite[k].extra += (krand()%ProjectileData[atwith].extra_rand);
@ -821,15 +835,15 @@ DOSKIPBULLETHOLE:
if (wall[hitwall].cstat&2) if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0) if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz)) if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall; hitwall = wall[hitwall].nextwall;
A_DamageWall(k,hitwall,hitx,hity,hitz,atwith); A_DamageWall(k,hitwall,&hitvect,atwith);
} }
} }
else else
{ {
k = A_InsertSprite(hitsect,hitx,hity,hitz,SHOTSPARK1,-15,24,24,sa,0,0,i,4); k = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,SHOTSPARK1,-15,24,24,sa,0,0,i,4);
sprite[k].extra = ProjectileData[atwith].extra; sprite[k].extra = ProjectileData[atwith].extra;
if (ProjectileData[atwith].extra_rand > 0) if (ProjectileData[atwith].extra_rand > 0)
sprite[k].extra += (krand()%ProjectileData[atwith].extra_rand); sprite[k].extra += (krand()%ProjectileData[atwith].extra_rand);
@ -856,12 +870,14 @@ DOSKIPBULLETHOLE:
else sprite[k].xrepeat = sprite[k].yrepeat = 0; else sprite[k].xrepeat = sprite[k].yrepeat = 0;
} }
else if (hitwall >= 0) else if (hitwall >= 0)
A_DamageWall(k,hitwall,hitx,hity,hitz,atwith); A_DamageWall(k,hitwall,&hitvect,atwith);
} }
if ((krand()&255) < 4) if ((krand()&255) < 4)
if (ProjectileData[atwith].isound >= 0) if (ProjectileData[atwith].isound >= 0)
S_PlaySoundXYZ(ProjectileData[atwith].isound,k,hitx,hity,hitz); {
S_PlaySoundXYZ(ProjectileData[atwith].isound,k,&hitvect);
}
return -1; return -1;
} }
@ -892,15 +908,15 @@ DOSKIPBULLETHOLE:
if (j >= 0) if (j >= 0)
{ {
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)+(8<<8); dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)+(8<<8);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) if (hitvect.x == 0)
hitx++; hitvect.x++;
zvel = ((sprite[j].z-sz-dal)*vel) / hitx; zvel = ((sprite[j].z-srcvect.z-dal)*vel) / hitvect.x;
if (sprite[j].picnum != RECON) if (sprite[j].picnum != RECON)
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
// else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*81; // else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*81;
else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*(ProjectileData[atwith].vel/8); else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*(ProjectileData[atwith].vel/8);
@ -913,12 +929,12 @@ DOSKIPBULLETHOLE:
if (!(ProjectileData[atwith].workslike & PROJECTILE_NOAIM)) if (!(ProjectileData[atwith].workslike & PROJECTILE_NOAIM))
{ {
j = A_FindPlayer(s,&x); j = A_FindPlayer(s,&x);
sa = getangle(g_player[j].ps->oposx-sx,g_player[j].ps->oposy-sy); sa = getangle(g_player[j].ps->oposx-srcvect.x,g_player[j].ps->oposy-srcvect.y);
l = ldist(&sprite[g_player[j].ps->i],s); l = ldist(&sprite[g_player[j].ps->i],s);
if (l == 0) if (l == 0)
l++; l++;
zvel = ((g_player[j].ps->oposz-sz)*vel) / l; zvel = ((g_player[j].ps->oposz-srcvect.z)*vel) / l;
if (A_CheckEnemySprite(s) && (s->hitag&face_player_smart)) if (A_CheckEnemySprite(s) && (s->hitag&face_player_smart))
sa = s->ang+(krand()&31)-16; sa = s->ang+(krand()&31)-16;
@ -937,9 +953,9 @@ DOSKIPBULLETHOLE:
sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);*/ sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);*/
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
j = A_InsertSprite(sect, j = A_InsertSprite(sect,
sx+(sintable[(348+sa+512)&2047]/ProjectileData[atwith].offset), srcvect.x+(sintable[(348+sa+512)&2047]/ProjectileData[atwith].offset),
sy+(sintable[(sa+348)&2047]/ProjectileData[atwith].offset), srcvect.y+(sintable[(sa+348)&2047]/ProjectileData[atwith].offset),
sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4); srcvect.z-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);
sprite[j].xrepeat=ProjectileData[atwith].xrepeat; sprite[j].xrepeat=ProjectileData[atwith].xrepeat;
sprite[j].yrepeat=ProjectileData[atwith].yrepeat; sprite[j].yrepeat=ProjectileData[atwith].yrepeat;
@ -1001,26 +1017,26 @@ DOSKIPBULLETHOLE:
if (p >= 0) if (p >= 0)
{ {
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5; zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5;
sz += (6<<8); srcvect.z += (6<<8);
sa += 15; sa += 15;
} }
else else
{ {
j = g_player[A_FindPlayer(s,&x)].ps->i; j = g_player[A_FindPlayer(s,&x)].ps->i;
zvel = ((sprite[j].z-sz)<<8) / (x+1); zvel = ((sprite[j].z-srcvect.z)<<8) / (x+1);
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
} }
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect, hitscan(srcvect.x,srcvect.y,srcvect.z,sect,
sintable[(sa+512)&2047], sintable[(sa+512)&2047],
sintable[sa&2047],zvel<<6, sintable[sa&2047],zvel<<6,
&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); &hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (atwith == BLOODSPLAT1 || atwith == BLOODSPLAT2 || atwith == BLOODSPLAT3 || atwith == BLOODSPLAT4) if (atwith == BLOODSPLAT1 || atwith == BLOODSPLAT2 || atwith == BLOODSPLAT3 || atwith == BLOODSPLAT4)
{ {
if (FindDistance2D(sx-hitx,sy-hity) < 1024) if (FindDistance2D(srcvect.x-hitvect.x,srcvect.y-hitvect.y) < 1024)
if (hitwall >= 0 && wall[hitwall].overpicnum != BIGFORCE) if (hitwall >= 0 && wall[hitwall].overpicnum != BIGFORCE)
if ((wall[hitwall].nextsector >= 0 && hitsect >= 0 && if ((wall[hitwall].nextsector >= 0 && hitsect >= 0 &&
sector[wall[hitwall].nextsector].lotag == 0 && sector[wall[hitwall].nextsector].lotag == 0 &&
@ -1051,9 +1067,9 @@ DOSKIPBULLETHOLE:
sprite[k].xvel = -12; sprite[k].xvel = -12;
sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x, sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512; wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
sprite[k].x = hitx; sprite[k].x = hitvect.x;
sprite[k].y = hity; sprite[k].y = hitvect.y;
sprite[k].z = hitz; sprite[k].z = hitvect.z;
sprite[k].cstat |= (krand()&4); sprite[k].cstat |= (krand()&4);
A_SetSprite(k,CLIPMASK0); A_SetSprite(k,CLIPMASK0);
setsprite(k,sprite[k].x,sprite[k].y,sprite[k].z); setsprite(k,sprite[k].x,sprite[k].y,sprite[k].z);
@ -1066,11 +1082,11 @@ DOSKIPBULLETHOLE:
if (hitsect < 0) break; if (hitsect < 0) break;
if ((klabs(sx-hitx)+klabs(sy-hity)) < 1024) if ((klabs(srcvect.x-hitvect.x)+klabs(srcvect.y-hitvect.y)) < 1024)
{ {
if (hitwall >= 0 || hitspr >= 0) if (hitwall >= 0 || hitspr >= 0)
{ {
j = A_InsertSprite(hitsect,hitx,hity,hitz,KNEE,-15,0,0,sa,32,0,i,4); j = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,KNEE,-15,0,0,sa,32,0,i,4);
sprite[j].extra += (krand()&7); sprite[j].extra += (krand()&7);
if (p >= 0) if (p >= 0)
{ {
@ -1095,12 +1111,12 @@ DOSKIPBULLETHOLE:
{ {
if (wall[hitwall].cstat&2) if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0) if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz)) if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall; hitwall = wall[hitwall].nextwall;
if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2) if (hitwall >= 0 && wall[hitwall].picnum != ACCESSSWITCH && wall[hitwall].picnum != ACCESSSWITCH2)
{ {
A_DamageWall(j,hitwall,hitx,hity,hitz,atwith); A_DamageWall(j,hitwall,&hitvect,atwith);
if (p >= 0) P_ActivateSwitch(p,hitwall,0); if (p >= 0) P_ActivateSwitch(p,hitwall,0);
} }
} }
@ -1108,8 +1124,8 @@ DOSKIPBULLETHOLE:
else if (p >= 0 && zvel > 0 && sector[hitsect].lotag == 1) else if (p >= 0 && zvel > 0 && sector[hitsect].lotag == 1)
{ {
j = A_Spawn(g_player[p].ps->i,WATERSPLASH2); j = A_Spawn(g_player[p].ps->i,WATERSPLASH2);
sprite[j].x = hitx; sprite[j].x = hitvect.x;
sprite[j].y = hity; sprite[j].y = hitvect.y;
sprite[j].ang = g_player[p].ps->ang; // Total tweek sprite[j].ang = g_player[p].ps->ang; // Total tweek
sprite[j].xvel = 32; sprite[j].xvel = 32;
A_SetSprite(i,CLIPMASK0); A_SetSprite(i,CLIPMASK0);
@ -1147,10 +1163,10 @@ DOSKIPBULLETHOLE:
dal -= (8<<8); dal -= (8<<8);
} }
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++; if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-sz-dal)<<8) / hitx; zvel = ((sprite[j].z-srcvect.z-dal)<<8) / hitvect.x;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
Gv_SetVar(g_iAngRangeVarID,angRange, i,p); Gv_SetVar(g_iAngRangeVarID,angRange, i,p);
@ -1167,8 +1183,8 @@ DOSKIPBULLETHOLE:
{ {
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5; zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect,sintable[(sa+512)&2047],sintable[sa&2047], hitscan(srcvect.x,srcvect.y,srcvect.z,sect,sintable[(sa+512)&2047],sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (hitspr != -1) if (hitspr != -1)
{ {
if (sprite[hitspr].statnum == 1 || sprite[hitspr].statnum == 2 || sprite[hitspr].statnum == 10 || sprite[hitspr].statnum == 13) if (sprite[hitspr].statnum == 1 || sprite[hitspr].statnum == 2 || sprite[hitspr].statnum == 10 || sprite[hitspr].statnum == 13)
@ -1194,16 +1210,16 @@ DOSKIPBULLETHOLE:
zvel += (zRange/2)-(krand()&(zRange-1)); zvel += (zRange/2)-(krand()&(zRange-1));
} }
sz -= (2<<8); srcvect.z -= (2<<8);
} }
else else
{ {
j = A_FindPlayer(s,&x); j = A_FindPlayer(s,&x);
sz -= (4<<8); srcvect.z -= (4<<8);
hitx = ldist(&sprite[g_player[j].ps->i], s); hitvect.x = ldist(&sprite[g_player[j].ps->i], s);
if (hitx == 0) if (hitvect.x == 0)
hitx++; hitvect.x++;
zvel = ((g_player[j].ps->posz-sz) <<8) / hitx; zvel = ((g_player[j].ps->posz-srcvect.z) <<8) / hitvect.x;
if (s->picnum != BOSS1) if (s->picnum != BOSS1)
{ {
zvel += 128-(krand()&255); zvel += 128-(krand()&255);
@ -1212,26 +1228,27 @@ DOSKIPBULLETHOLE:
else else
{ {
zvel += 128-(krand()&255); zvel += 128-(krand()&255);
sa = getangle(g_player[j].ps->posx-sx,g_player[j].ps->posy-sy)+64-(krand()&127); sa = getangle(g_player[j].ps->posx-srcvect.x,g_player[j].ps->posy-srcvect.y)+64-(krand()&127);
} }
} }
s->cstat &= ~257; s->cstat &= ~257;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect, hitscan(srcvect.x,srcvect.y,srcvect.z,sect,
sintable[(sa+512)&2047], sintable[(sa+512)&2047],
sintable[sa&2047], sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
s->cstat |= 257; s->cstat |= 257;
if (hitsect < 0) return -1; if (hitsect < 0) return -1;
if ((krand()&15) == 0 && sector[hitsect].lotag == 2) if ((krand()&15) == 0 && sector[hitsect].lotag == 2)
A_DoWaterTracers(hitx,hity,hitz,sx,sy,sz,8-(ud.multimode>>1)); A_DoWaterTracers(hitvect.x,hitvect.y,hitvect.z,
srcvect.x,srcvect.y,srcvect.z,8-(ud.multimode>>1));
if (p >= 0) if (p >= 0)
{ {
k = A_InsertSprite(hitsect,hitx,hity,hitz,SHOTSPARK1,-15,10,10,sa,0,0,i,4); k = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,SHOTSPARK1,-15,10,10,sa,0,0,i,4);
sprite[k].extra = *actorscrptr[atwith]; sprite[k].extra = *actorscrptr[atwith];
sprite[k].extra += (krand()%6); sprite[k].extra += (krand()%6);
sprite[k].yvel = atwith; // this is a hack to allow you to detect which weapon spawned a SHOTSPARK1 sprite[k].yvel = atwith; // this is a hack to allow you to detect which weapon spawned a SHOTSPARK1
@ -1346,9 +1363,9 @@ DOSKIPBULLETHOLE:
} }
l = A_Spawn(k,BULLETHOLE); l = A_Spawn(k,BULLETHOLE);
sprite[l].xvel = -1; sprite[l].xvel = -1;
sprite[l].x = hitx; sprite[l].x = hitvect.x;
sprite[l].y = hity; sprite[l].y = hitvect.y;
sprite[l].z = hitz; sprite[l].z = hitvect.z;
sprite[l].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x, sprite[l].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512; wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
@ -1362,15 +1379,15 @@ SKIPBULLETHOLE:
if (wall[hitwall].cstat&2) if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0) if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz)) if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall; hitwall = wall[hitwall].nextwall;
A_DamageWall(k,hitwall,hitx,hity,hitz,SHOTSPARK1); A_DamageWall(k,hitwall,&hitvect,SHOTSPARK1);
} }
} }
else else
{ {
k = A_InsertSprite(hitsect,hitx,hity,hitz,SHOTSPARK1,-15,24,24,sa,0,0,i,4); k = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,SHOTSPARK1,-15,24,24,sa,0,0,i,4);
sprite[k].extra = *actorscrptr[atwith]; sprite[k].extra = *actorscrptr[atwith];
sprite[k].yvel = atwith; // this is a hack to allow you to detect which weapon spawned a SHOTSPARK1 sprite[k].yvel = atwith; // this is a hack to allow you to detect which weapon spawned a SHOTSPARK1
ActorExtra[k].temp_data[6] = hitwall; ActorExtra[k].temp_data[6] = hitwall;
@ -1390,11 +1407,11 @@ SKIPBULLETHOLE:
else sprite[k].xrepeat = sprite[k].yrepeat = 0; else sprite[k].xrepeat = sprite[k].yrepeat = 0;
} }
else if (hitwall >= 0) else if (hitwall >= 0)
A_DamageWall(k,hitwall,hitx,hity,hitz,SHOTSPARK1); A_DamageWall(k,hitwall,&hitvect,SHOTSPARK1);
} }
if ((krand()&255) < 4) if ((krand()&255) < 4)
S_PlaySoundXYZ(PISTOL_RICOCHET,k,hitx,hity,hitz); S_PlaySoundXYZ(PISTOL_RICOCHET,k, &hitvect);
return -1; return -1;
@ -1412,12 +1429,12 @@ SKIPBULLETHOLE:
{ {
if (s->picnum == BOSS2) vel = 644; if (s->picnum == BOSS2) vel = 644;
else vel = 348; else vel = 348;
sz -= (4<<7); srcvect.z -= (4<<7);
} }
else else
{ {
vel = 840; vel = 840;
sz -= (4<<7); srcvect.z -= (4<<7);
} }
} }
@ -1435,10 +1452,10 @@ SKIPBULLETHOLE:
if (j >= 0) if (j >= 0)
{ {
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)-(12<<8); dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)-(12<<8);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++; if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-sz-dal)*vel) / hitx; zvel = ((sprite[j].z-srcvect.z-dal)*vel) / hitvect.x;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
else else
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*98; zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*98;
@ -1448,9 +1465,9 @@ SKIPBULLETHOLE:
j = A_FindPlayer(s,&x); j = A_FindPlayer(s,&x);
// sa = getangle(g_player[j].ps->oposx-sx,g_player[j].ps->oposy-sy); // sa = getangle(g_player[j].ps->oposx-sx,g_player[j].ps->oposy-sy);
sa += 16-(krand()&31); sa += 16-(krand()&31);
hitx = ldist(&sprite[g_player[j].ps->i],s); hitvect.x = ldist(&sprite[g_player[j].ps->i],s);
if (hitx == 0) hitx++; if (hitvect.x == 0) hitvect.x++;
zvel = ((g_player[j].ps->oposz - sz + (3<<8))*vel) / hitx; zvel = ((g_player[j].ps->oposz - srcvect.z + (3<<8))*vel) / hitvect.x;
} }
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
oldzvel = zvel; oldzvel = zvel;
@ -1458,7 +1475,7 @@ SKIPBULLETHOLE:
if (atwith == SPIT) if (atwith == SPIT)
{ {
sizx = 18; sizx = 18;
sizy = 18,sz -= (10<<8); sizy = 18,srcvect.z -= (10<<8);
} }
else else
{ {
@ -1487,7 +1504,8 @@ SKIPBULLETHOLE:
while (scount > 0) while (scount > 0)
{ {
j = A_InsertSprite(sect,sx,sy,sz,atwith,-127,sizx,sizy,sa,vel,zvel,i,4); j = A_InsertSprite(sect,srcvect.x,srcvect.y,srcvect.z,
atwith,-127,sizx,sizy,sa,vel,zvel,i,4);
sprite[j].extra += (krand()&7); sprite[j].extra += (krand()&7);
if (atwith == COOLEXPLOSION1) if (atwith == COOLEXPLOSION1)
@ -1515,7 +1533,7 @@ SKIPBULLETHOLE:
return j; return j;
case FREEZEBLAST__STATIC: case FREEZEBLAST__STATIC:
sz += (3<<8); srcvect.z += (3<<8);
case RPG__STATIC: case RPG__STATIC:
if (s->extra >= 0) s->shade = -96; if (s->extra >= 0) s->shade = -96;
@ -1539,11 +1557,11 @@ SKIPBULLETHOLE:
if (j >= 0) if (j >= 0)
{ {
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)+(8<<8); dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)+(8<<8);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++; if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-sz-dal)*vel) / hitx; zvel = ((sprite[j].z-srcvect.z-dal)*vel) / hitvect.x;
if (sprite[j].picnum != RECON) if (sprite[j].picnum != RECON)
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*81; else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*81;
if (atwith == RPG) if (atwith == RPG)
@ -1552,19 +1570,19 @@ SKIPBULLETHOLE:
else else
{ {
j = A_FindPlayer(s,&x); j = A_FindPlayer(s,&x);
sa = getangle(g_player[j].ps->oposx-sx,g_player[j].ps->oposy-sy); sa = getangle(g_player[j].ps->oposx-srcvect.x,g_player[j].ps->oposy-srcvect.y);
if (PN == BOSS3) if (PN == BOSS3)
sz -= (32<<8); srcvect.z -= (32<<8);
else if (PN == BOSS2) else if (PN == BOSS2)
{ {
vel += 128; vel += 128;
sz += 24<<8; srcvect.z += 24<<8;
} }
l = ldist(&sprite[g_player[j].ps->i],s); l = ldist(&sprite[g_player[j].ps->i],s);
if (l == 0) if (l == 0)
l++; l++;
zvel = ((g_player[j].ps->oposz-sz)*vel) / l; zvel = ((g_player[j].ps->oposz-srcvect.z)*vel) / l;
if (A_CheckEnemySprite(s) && (s->hitag&face_player_smart)) if (A_CheckEnemySprite(s) && (s->hitag&face_player_smart))
sa = s->ang+(krand()&31)-16; sa = s->ang+(krand()&31)-16;
@ -1575,9 +1593,9 @@ SKIPBULLETHOLE:
else l = -1; else l = -1;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
j = A_InsertSprite(sect, j = A_InsertSprite(sect,
sx+(sintable[(348+sa+512)&2047]/448), srcvect.x+(sintable[(348+sa+512)&2047]/448),
sy+(sintable[(sa+348)&2047]/448), srcvect.y+(sintable[(sa+348)&2047]/448),
sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4); srcvect.z-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);
sprite[j].extra += (krand()&7); sprite[j].extra += (krand()&7);
if (atwith != FREEZEBLAST) if (atwith != FREEZEBLAST)
@ -1659,16 +1677,16 @@ SKIPBULLETHOLE:
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*32; zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*32;
else zvel = 0; else zvel = 0;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz-g_player[p].ps->pyoff,sect, hitscan(srcvect.x,srcvect.y,srcvect.z-g_player[p].ps->pyoff,sect,
sintable[(sa+512)&2047], sintable[(sa+512)&2047],
sintable[sa&2047], sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
j = 0; j = 0;
if (hitspr >= 0) break; if (hitspr >= 0) break;
if (hitwall >= 0 && hitsect >= 0) if (hitwall >= 0 && hitsect >= 0)
if (((hitx-sx)*(hitx-sx)+(hity-sy)*(hity-sy)) < (290*290)) if (((hitvect.x-srcvect.x)*(hitvect.x-srcvect.x)+(hitvect.y-srcvect.y)*(hitvect.y-srcvect.y)) < (290*290))
{ {
if (wall[hitwall].nextsector >= 0) if (wall[hitwall].nextsector >= 0)
{ {
@ -1682,7 +1700,7 @@ SKIPBULLETHOLE:
if (j == 1) if (j == 1)
{ {
int32_t lTripBombControl=Gv_GetVarByLabel("TRIPBOMB_CONTROL", TRIPBOMB_TRIPWIRE, g_player[p].ps->i, p); int32_t lTripBombControl=Gv_GetVarByLabel("TRIPBOMB_CONTROL", TRIPBOMB_TRIPWIRE, g_player[p].ps->i, p);
k = A_InsertSprite(hitsect,hitx,hity,hitz,TRIPBOMB,-16,4,5,sa,0,0,i,6); k = A_InsertSprite(hitsect,hitvect.x,hitvect.y,hitvect.z,TRIPBOMB,-16,4,5,sa,0,0,i,6);
if (lTripBombControl & TRIPBOMB_TIMER) if (lTripBombControl & TRIPBOMB_TIMER)
{ {
int32_t lLifetime=Gv_GetVarByLabel("STICKYBOMB_LIFETIME", NAM_GRENADE_LIFETIME, g_player[p].ps->i, p); int32_t lLifetime=Gv_GetVarByLabel("STICKYBOMB_LIFETIME", NAM_GRENADE_LIFETIME, g_player[p].ps->i, p);
@ -1721,9 +1739,9 @@ SKIPBULLETHOLE:
vel = x>>4; vel = x>>4;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
A_InsertSprite(sect, A_InsertSprite(sect,
sx+(sintable[(512+sa+512)&2047]>>8), srcvect.x+(sintable[(512+sa+512)&2047]>>8),
sy+(sintable[(sa+512)&2047]>>8), srcvect.y+(sintable[(sa+512)&2047]>>8),
sz+(6<<8),atwith,-64,32,32,sa,vel,zvel,i,1); srcvect.z+(6<<8),atwith,-64,32,32,sa,vel,zvel,i,1);
break; break;
case GROWSPARK__STATIC: case GROWSPARK__STATIC:
@ -1747,11 +1765,11 @@ SKIPBULLETHOLE:
dal -= (8<<8); dal -= (8<<8);
} }
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) if (hitvect.x == 0)
hitx++; hitvect.x++;
zvel = ((sprite[j].z-sz-dal)<<8) / hitx; zvel = ((sprite[j].z-srcvect.z-dal)<<8) / hitvect.x;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
else else
{ {
@ -1760,16 +1778,16 @@ SKIPBULLETHOLE:
zvel += 128-(krand()&255); zvel += 128-(krand()&255);
} }
sz -= (2<<8); srcvect.z -= (2<<8);
} }
else else
{ {
j = A_FindPlayer(s,&x); j = A_FindPlayer(s,&x);
sz -= (4<<8); srcvect.z -= (4<<8);
hitx = ldist(&sprite[g_player[j].ps->i], s); hitvect.x = ldist(&sprite[g_player[j].ps->i], s);
if (hitx == 0) if (hitvect.x == 0)
hitx++; hitvect.x++;
zvel = ((g_player[j].ps->posz-sz) <<8) / hitx; zvel = ((g_player[j].ps->posz-srcvect.z) <<8) / hitvect.x;
zvel += 128-(krand()&255); zvel += 128-(krand()&255);
sa += 32-(krand()&63); sa += 32-(krand()&63);
} }
@ -1781,14 +1799,14 @@ SKIPBULLETHOLE:
s->cstat &= ~257; s->cstat &= ~257;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect, hitscan(srcvect.x,srcvect.y,srcvect.z,sect,
sintable[(sa+512)&2047], sintable[(sa+512)&2047],
sintable[sa&2047], sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1); zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
s->cstat |= 257; s->cstat |= 257;
j = A_InsertSprite(sect,hitx,hity,hitz,GROWSPARK,-16,28,28,sa,0,0,i,1); j = A_InsertSprite(sect,hitvect.x,hitvect.y,hitvect.z,GROWSPARK,-16,28,28,sa,0,0,i,1);
sprite[j].pal = 2; sprite[j].pal = 2;
sprite[j].cstat |= 130; sprite[j].cstat |= 130;
@ -1808,9 +1826,9 @@ SKIPBULLETHOLE:
wall[wall[hitwall].point2].x-wall[hitwall].x, wall[wall[hitwall].point2].x-wall[hitwall].x,
wall[wall[hitwall].point2].y-wall[hitwall].y); wall[wall[hitwall].point2].y-wall[hitwall].y);
sx = hitx; sx = hitvect.x;
sy = hity; sy = hitvect.y;
sz = hitz; srcvect.z = hitvect.z;
sect = hitsect; sect = hitsect;
sa = ((l<<1) - sa)&2047; sa = ((l<<1) - sa)&2047;
sx += sintable[(sa+512)&2047]>>12; sx += sintable[(sa+512)&2047]>>12;
@ -1820,7 +1838,7 @@ SKIPBULLETHOLE:
goto RESHOOTGROW; goto RESHOOTGROW;
} }
else */ else */
A_DamageWall(j,hitwall,hitx,hity,hitz,atwith); A_DamageWall(j,hitwall,&hitvect,atwith);
} }
break; break;
@ -1841,11 +1859,11 @@ SKIPBULLETHOLE:
if (j >= 0) if (j >= 0)
{ {
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1); dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]); hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) if (hitvect.x == 0)
hitx++; hitvect.x++;
zvel = ((sprite[j].z-sz-dal-(4<<8))*768) / hitx; zvel = ((sprite[j].z-srcvect.z-dal-(4<<8))*768) / hitvect.x;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy); sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
} }
else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*98; else zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*98;
} }
@ -1855,14 +1873,14 @@ SKIPBULLETHOLE:
l = ldist(&sprite[g_player[j].ps->i],s); l = ldist(&sprite[g_player[j].ps->i],s);
if (l == 0) if (l == 0)
l++; l++;
zvel = ((g_player[j].ps->oposz-sz)*512) / l ; zvel = ((g_player[j].ps->oposz-srcvect.z)*512) / l ;
} }
else zvel = 0; else zvel = 0;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9]; if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
j = A_InsertSprite(sect, j = A_InsertSprite(sect,
sx+(sintable[(512+sa+512)&2047]>>12), srcvect.x+(sintable[(512+sa+512)&2047]>>12),
sy+(sintable[(sa+512)&2047]>>12), srcvect.y+(sintable[(sa+512)&2047]>>12),
sz+(2<<8),SHRINKSPARK,-16,28,28,sa,768,zvel,i,4); srcvect.z+(2<<8),SHRINKSPARK,-16,28,28,sa,768,zvel,i,4);
sprite[j].cstat = 128; sprite[j].cstat = 128;
sprite[j].clipdist = 32; sprite[j].clipdist = 32;

View file

@ -1144,7 +1144,7 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype)
{ {
int32_t switchpal, switchpicnum; int32_t switchpal, switchpicnum;
int32_t i, x, lotag,hitag,picnum,correctdips = 1, numdips = 0; int32_t i, x, lotag,hitag,picnum,correctdips = 1, numdips = 0;
int32_t sx,sy; vec3_t davector;
if (w < 0) return 0; if (w < 0) return 0;
@ -1153,8 +1153,10 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype)
lotag = sprite[w].lotag; lotag = sprite[w].lotag;
if (lotag == 0) return 0; if (lotag == 0) return 0;
hitag = sprite[w].hitag; hitag = sprite[w].hitag;
sx = sprite[w].x;
sy = sprite[w].y; // sx = sprite[w].x;
// sy = sprite[w].y;
Bmemcpy(&davector, &sprite[w], sizeof(int32_t) * 3);
picnum = sprite[w].picnum; picnum = sprite[w].picnum;
switchpal = sprite[w].pal; switchpal = sprite[w].pal;
} }
@ -1163,8 +1165,10 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype)
lotag = wall[w].lotag; lotag = wall[w].lotag;
if (lotag == 0) return 0; if (lotag == 0) return 0;
hitag = wall[w].hitag; hitag = wall[w].hitag;
sx = wall[w].x; // sx = wall[w].x;
sy = wall[w].y; // sy = wall[w].y;
Bmemcpy(&davector, &wall[w], sizeof(int32_t) * 2);
davector.z = g_player[snum].ps->posz;
picnum = wall[w].picnum; picnum = wall[w].picnum;
switchpal = wall[w].pal; switchpal = wall[w].pal;
} }
@ -1488,17 +1492,17 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype)
if (picnum == ALIENSWITCH || picnum == ALIENSWITCH+1) if (picnum == ALIENSWITCH || picnum == ALIENSWITCH+1)
{ {
if (switchtype == 1) if (switchtype == 1)
S_PlaySoundXYZ(ALIEN_SWITCH1,w,sx,sy,g_player[snum].ps->posz); S_PlaySoundXYZ(ALIEN_SWITCH1, w, &davector);
else S_PlaySoundXYZ(ALIEN_SWITCH1,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz); else S_PlaySoundXYZ(ALIEN_SWITCH1,g_player[snum].ps->i,&davector);
} }
else else
{ {
if (switchtype == 1) if (switchtype == 1)
S_PlaySoundXYZ(SWITCH_ON,w,sx,sy,g_player[snum].ps->posz); S_PlaySoundXYZ(SWITCH_ON, w, &davector);
else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz); else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,&davector);
} }
if (numdips != correctdips) break; if (numdips != correctdips) break;
S_PlaySoundXYZ(END_OF_LEVEL_WARN,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz); S_PlaySoundXYZ(END_OF_LEVEL_WARN,g_player[snum].ps->i,&davector);
} }
case DIPSWITCH2__STATIC: case DIPSWITCH2__STATIC:
//case DIPSWITCH2+1: //case DIPSWITCH2+1:
@ -1578,13 +1582,13 @@ int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype)
if (hitag == 0 && CheckDoorTile(picnum) == 0) if (hitag == 0 && CheckDoorTile(picnum) == 0)
{ {
if (switchtype == 1) if (switchtype == 1)
S_PlaySoundXYZ(SWITCH_ON,w,sx,sy,g_player[snum].ps->posz); S_PlaySoundXYZ(SWITCH_ON,w,&davector);
else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz); else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,&davector);
} }
else if (hitag != 0) else if (hitag != 0)
{ {
if (switchtype == 1 && (g_sounds[hitag].m&4) == 0) if (switchtype == 1 && (g_sounds[hitag].m&4) == 0)
S_PlaySoundXYZ(hitag,w,sx,sy,g_player[snum].ps->posz); S_PlaySoundXYZ(hitag,w,&davector);
else A_PlaySound(hitag,g_player[snum].ps->i); else A_PlaySound(hitag,g_player[snum].ps->i);
} }
@ -1622,7 +1626,7 @@ static void BreakWall(int32_t newpn,int32_t spr,int32_t dawallnum)
A_SpawnWallGlass(spr,dawallnum,10); A_SpawnWallGlass(spr,dawallnum,10);
} }
void A_DamageWall(int32_t spr,int32_t dawallnum,int32_t x,int32_t y,int32_t z,int32_t atwith) void A_DamageWall(int32_t spr,int32_t dawallnum,const vec3_t *pos,int32_t atwith)
{ {
int16_t sn = -1; int16_t sn = -1;
int32_t j, i, darkestwall; int32_t j, i, darkestwall;
@ -1663,7 +1667,7 @@ void A_DamageWall(int32_t spr,int32_t dawallnum,int32_t x,int32_t y,int32_t z,in
} }
if (((wal->cstat&16) || wal->overpicnum == BIGFORCE) && wal->nextsector >= 0) if (((wal->cstat&16) || wal->overpicnum == BIGFORCE) && wal->nextsector >= 0)
if (sector[wal->nextsector].floorz > z) if (sector[wal->nextsector].floorz > pos->z)
if (sector[wal->nextsector].floorz-sector[wal->nextsector].ceilingz) if (sector[wal->nextsector].floorz-sector[wal->nextsector].ceilingz)
{ {
int32_t switchpicnum = wal->overpicnum; int32_t switchpicnum = wal->overpicnum;
@ -1676,16 +1680,16 @@ void A_DamageWall(int32_t spr,int32_t dawallnum,int32_t x,int32_t y,int32_t z,in
//case W_FORCEFIELD+2: //case W_FORCEFIELD+2:
wal->extra = 1; // tell the forces to animate wal->extra = 1; // tell the forces to animate
case BIGFORCE__STATIC: case BIGFORCE__STATIC:
updatesector(x,y,&sn); updatesector(pos->x,pos->y,&sn);
if (sn < 0) return; if (sn < 0) return;
if (atwith == -1) if (atwith == -1)
i = A_InsertSprite(sn,x,y,z,FORCERIPPLE,-127,8,8,0,0,0,spr,5); i = A_InsertSprite(sn,pos->x,pos->y,pos->z,FORCERIPPLE,-127,8,8,0,0,0,spr,5);
else else
{ {
if (atwith == CHAINGUN) if (atwith == CHAINGUN)
i = A_InsertSprite(sn,x,y,z,FORCERIPPLE,-127,16+sprite[spr].xrepeat,16+sprite[spr].yrepeat,0,0,0,spr,5); i = A_InsertSprite(sn,pos->x,pos->y,pos->z,FORCERIPPLE,-127,16+sprite[spr].xrepeat,16+sprite[spr].yrepeat,0,0,0,spr,5);
else i = A_InsertSprite(sn,x,y,z,FORCERIPPLE,-127,32,32,0,0,0,spr,5); else i = A_InsertSprite(sn,pos->x,pos->y,pos->z,FORCERIPPLE,-127,32,32,0,0,0,spr,5);
} }
CS |= 18+128; CS |= 18+128;
@ -1709,7 +1713,7 @@ void A_DamageWall(int32_t spr,int32_t dawallnum,int32_t x,int32_t y,int32_t z,in
return; return;
case GLASS__STATIC: case GLASS__STATIC:
updatesector(x,y,&sn); updatesector(pos->x,pos->y,&sn);
if (sn < 0) return; if (sn < 0) return;
wal->overpicnum=GLASS2; wal->overpicnum=GLASS2;
A_SpawnWallGlass(spr,dawallnum,10); A_SpawnWallGlass(spr,dawallnum,10);
@ -1718,14 +1722,14 @@ void A_DamageWall(int32_t spr,int32_t dawallnum,int32_t x,int32_t y,int32_t z,in
if (wal->nextwall >= 0) if (wal->nextwall >= 0)
wall[wal->nextwall].cstat = 0; wall[wal->nextwall].cstat = 0;
i = A_InsertSprite(sn,x,y,z,SECTOREFFECTOR,0,0,0,g_player[0].ps->ang,0,0,spr,3); i = A_InsertSprite(sn,pos->x,pos->y,pos->z,SECTOREFFECTOR,0,0,0,g_player[0].ps->ang,0,0,spr,3);
SLT = 128; SLT = 128;
T2 = 5; T2 = 5;
T3 = dawallnum; T3 = dawallnum;
A_PlaySound(GLASS_BREAKING,i); A_PlaySound(GLASS_BREAKING,i);
return; return;
case STAINGLASS1__STATIC: case STAINGLASS1__STATIC:
updatesector(x,y,&sn); updatesector(pos->x,pos->y,&sn);
if (sn < 0) return; if (sn < 0) return;
A_SpawnRandomGlass(spr,dawallnum,80); A_SpawnRandomGlass(spr,dawallnum,80);
wal->cstat = 0; wal->cstat = 0;
@ -1935,19 +1939,27 @@ void P_CheckTouchDamage(DukePlayer_t *p,int32_t j)
p->posyv = -(sintable[(p->ang)&2047]<<8); p->posyv = -(sintable[(p->ang)&2047]<<8);
A_PlaySound(DUKE_LONGTERM_PAIN,p->i); A_PlaySound(DUKE_LONGTERM_PAIN,p->i);
A_DamageWall(p->i,j, {
p->posx+(sintable[(p->ang+512)&2047]>>9), vec3_t davect;
p->posy+(sintable[p->ang&2047]>>9),
p->posz,-1); davect.x = p->posx+(sintable[(p->ang+512)&2047]>>9);
davect.y = p->posy+(sintable[p->ang&2047]>>9);
davect.z = p->posz;
A_DamageWall(p->i,j,&davect,-1);
}
break; break;
case BIGFORCE__STATIC: case BIGFORCE__STATIC:
p->hurt_delay = 26; p->hurt_delay = 26;
A_DamageWall(p->i,j, {
p->posx+(sintable[(p->ang+512)&2047]>>9), vec3_t davect;
p->posy+(sintable[p->ang&2047]>>9),
p->posz,-1); davect.x = p->posx+(sintable[(p->ang+512)&2047]>>9);
davect.y = p->posy+(sintable[p->ang&2047]>>9);
davect.z = p->posz;
A_DamageWall(p->i,j,&davect,-1);
}
break; break;
} }

View file

@ -267,7 +267,7 @@ int32_t S_LoadSound(uint32_t num)
return 1; return 1;
} }
int32_t S_PlaySoundXYZ(int32_t num,int32_t i,int32_t x,int32_t y,int32_t z) int32_t S_PlaySoundXYZ(int32_t num, int32_t i, const vec3_t *pos)
{ {
int32_t sndist, cx, cy, cz, j,k; int32_t sndist, cx, cy, cz, j,k;
int32_t pitche,pitchs,cs; int32_t pitche,pitchs,cs;
@ -311,7 +311,7 @@ int32_t S_PlaySoundXYZ(int32_t num,int32_t i,int32_t x,int32_t y,int32_t z)
cs = g_player[screenpeek].ps->cursectnum; cs = g_player[screenpeek].ps->cursectnum;
ca = g_player[screenpeek].ps->ang+g_player[screenpeek].ps->look_ang; ca = g_player[screenpeek].ps->ang+g_player[screenpeek].ps->look_ang;
sndist = FindDistance3D((cx-x),(cy-y),(cz-z)>>4); sndist = FindDistance3D((cx-pos->x),(cy-pos->y),(cz-pos->z)>>4);
if (i >= 0 && (g_sounds[num].m&16) == 0 && PN == MUSICANDSFX && SLT < 999 && (sector[SECT].lotag&0xff) < 9) if (i >= 0 && (g_sounds[num].m&16) == 0 && PN == MUSICANDSFX && SLT < 999 && (sector[SECT].lotag&0xff) < 9)
sndist = divscale14(sndist,(SHT+1)); sndist = divscale14(sndist,(SHT+1));
@ -367,7 +367,7 @@ int32_t S_PlaySoundXYZ(int32_t num,int32_t i,int32_t x,int32_t y,int32_t z)
} }
else else
{ {
sndang = 2048 + ca - getangle(cx-x,cy-y); sndang = 2048 + ca - getangle(cx-pos->x,cy-pos->y);
sndang &= 2047; sndang &= 2047;
} }
@ -512,7 +512,12 @@ int32_t A_PlaySound(uint32_t num, int32_t i)
S_PlaySound(num); S_PlaySound(num);
return 0; return 0;
} }
return S_PlaySoundXYZ(num,i,SX,SY,SZ); {
vec3_t davector;
Bmemcpy(&davector,&sprite[i],sizeof(intptr_t) * 3);
// OSD_Printf("x: %d y: %d z: %d\n",davector.x,davector.y,davector.z);
return S_PlaySoundXYZ(num,i, &davector);
}
} }
void A_StopSound(int32_t num, int32_t i) void A_StopSound(int32_t num, int32_t i)