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 getclosestcol(int32_t r, int32_t g, int32_t b);
// PLAG: line utility functions
typedef struct s_equation {
float a, b, c;

View file

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

View file

@ -289,7 +289,6 @@ extern int32_t nextvoxid;
extern char faketile[MAXTILES];
extern char *faketiledata[MAXTILES];
extern int32_t getclosestcol(int32_t r, int32_t g, int32_t b);
#if defined(POLYMOST) && defined(USE_OPENGL)
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;
updatesector(x1,y1,&sect);
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);
@ -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 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))
{
sprite[spritenum].x += (xchange*TICSPERFRAME)>>2;
sprite[spritenum].y += (ychange*TICSPERFRAME)>>2;
sprite[spritenum].z += (zchange*TICSPERFRAME)>>2;
sprite[spritenum].x += (change->x*TICSPERFRAME)>>2;
sprite[spritenum].y += (change->y*TICSPERFRAME)>>2;
sprite[spritenum].z += (change->z*TICSPERFRAME)>>2;
if (bg)
setsprite(spritenum,sprite[spritenum].x,sprite[spritenum].y,sprite[spritenum].z);
return 0;
@ -493,7 +500,7 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
oldy = sprite[spritenum].y;
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
{
if (sprite[spritenum].picnum == LIZMAN)
@ -503,7 +510,7 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
else
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 &&
@ -530,16 +537,16 @@ int32_t A_MoveSprite(int32_t spritenum, int32_t xchange, int32_t ychange, int32_
{
if (sprite[spritenum].statnum == 4)
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
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 != sprite[spritenum].sectnum))
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))
sprite[spritenum].z = daz;
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
{
return (A_MoveSprite(i,(sprite[i].xvel*(sintable[(sprite[i].ang+512)&2047]))>>14,
(sprite[i].xvel*(sintable[sprite[i].ang&2047]))>>14,sprite[i].zvel,
cliptype)==0);
vec3_t davect;
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
@ -2347,7 +2357,8 @@ static void A_DoProjectileBounce(int32_t i)
static void G_MoveWeapons(void)
{
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;
spritetype *s;
@ -2403,9 +2414,12 @@ static void G_MoveWeapons(void)
ll = s->zvel>>1;
}
dax = s->x;
day = s->y;
daz = s->z;
Bmemcpy(&davect,s,sizeof(int32_t) * 3);
/*
dax = s->x;
day = s->y;
daz = s->z;
*/
A_GetZLimits(i);
qq = CLIPMASK1;
@ -2426,12 +2440,19 @@ static void G_MoveWeapons(void)
for (f=1;f<=ActorExtra[i].projectile.velmult;f++)
{
dax = s->x;
day = s->y;
daz = s->z;
j = A_MoveSprite(i,
(k*(sintable[(s->ang+512)&2047]))>>14,
(k*(sintable[s->ang&2047]))>>14,ll,qq);
vec3_t tmpvect;
/*
dax = s->x;
day = s->y;
daz = s->z;
*/
Bmemcpy(&davect,s,sizeof(int32_t) * 3);
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)
break;
}
@ -2462,9 +2483,13 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.spawns >= 0)
{
k = A_Spawn(i,ActorExtra[i].projectile.spawns);
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2496,9 +2521,13 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.spawns >= 0)
{
k = A_Spawn(i,ActorExtra[i].projectile.spawns);
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2612,9 +2641,12 @@ static void G_MoveWeapons(void)
if (ActorExtra[i].projectile.spawns >= 0)
{
k = A_Spawn(i,ActorExtra[i].projectile.spawns);
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2648,8 +2680,10 @@ static void G_MoveWeapons(void)
}
else
{
setsprite(i,dax,day,daz);
A_DamageWall(i,j,s->x,s->y,s->z,s->picnum);
vec3_t tmpvect;
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)
{
@ -2675,7 +2709,7 @@ static void G_MoveWeapons(void)
}
else if ((j&49152) == 16384)
{
setsprite(i,dax,day,daz);
setsprite(i,davect.x,davect.y,davect.z);
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)
{
k = A_Spawn(i,ActorExtra[i].projectile.spawns);
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
*/
if (ActorExtra[i].projectile.sxrepeat > 4)
sprite[k].xrepeat=ActorExtra[i].projectile.sxrepeat;
@ -2819,9 +2856,12 @@ static void G_MoveWeapons(void)
ll = s->zvel>>1;
}
dax = s->x;
day = s->y;
daz = s->z;
Bmemcpy(&davect,s,sizeof(int32_t) * 3);
/*
dax = s->x;
day = s->y;
daz = s->z;
*/
A_GetZLimits(i);
qq = CLIPMASK1;
@ -2837,7 +2877,15 @@ static void G_MoveWeapons(void)
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 (FindDistance2D(s->x-sprite[s->yvel].x,s->y-sprite[s->yvel].y) < 256)
@ -2953,8 +3001,10 @@ static void G_MoveWeapons(void)
}
else
{
setsprite(i,dax,day,daz);
A_DamageWall(i,j,s->x,s->y,s->z,s->picnum);
vec3_t tmpvect;
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)
{
@ -2974,7 +3024,7 @@ static void G_MoveWeapons(void)
}
else if ((j&49152) == 16384)
{
setsprite(i,dax,day,daz);
setsprite(i,davect.x,davect.y,davect.z);
if (s->zvel < 0)
{
@ -3004,9 +3054,12 @@ static void G_MoveWeapons(void)
if (s->picnum == RPG)
{
k = A_Spawn(i,EXPLOSION2);
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
Bmemcpy(&sprite[k],&davect,sizeof(int32_t) * 3);
/*
sprite[k].x = dax;
sprite[k].y = day;
sprite[k].z = daz;
*/
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,
(s->xvel*(sintable[s->ang&2047]))>>14,
s->zvel,CLIPMASK0);
{
vec3_t tmpvect;
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;
@ -4399,9 +4456,12 @@ static void G_MoveActors(void)
if ((j&49152) == 32768)
{
vec3_t davect;
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(
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[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+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;
typedef struct {
int32_t x, y, z;
} vec3_t;
#include "funct.h"
extern int32_t g_screenCapture;
@ -588,28 +592,26 @@ extern int32_t GametypeFlags[MAXGAMETYPES];
extern char g_numGametypes;
enum GametypeFlags_t {
GAMETYPE_COOP = 1,
GAMETYPE_WEAPSTAY = 2,
GAMETYPE_FRAGBAR = 4,
GAMETYPE_SCORESHEET = 8,
GAMETYPE_DMSWITCHES = 16,
GAMETYPE_COOPSPAWN = 32,
GAMETYPE_ACCESSCARDSPRITES = 64,
GAMETYPE_COOPVIEW = 128,
GAMETYPE_COOPSOUND = 256,
GAMETYPE_OTHERPLAYERSINMAP = 512,
GAMETYPE_ITEMRESPAWN = 1024,
GAMETYPE_MARKEROPTION = 2048,
GAMETYPE_PLAYERSFRIENDLY = 4096,
GAMETYPE_FIXEDRESPAWN = 8192,
GAMETYPE_ACCESSATSTART = 16384,
GAMETYPE_PRESERVEINVENTORYDEATH = 32768,
GAMETYPE_TDM = 65536,
GAMETYPE_TDMSPAWN = 131072
GAMETYPE_COOP = 0x00000001,
GAMETYPE_WEAPSTAY = 0x00000002,
GAMETYPE_FRAGBAR = 0x00000004,
GAMETYPE_SCORESHEET = 0x00000008,
GAMETYPE_DMSWITCHES = 0x00000010,
GAMETYPE_COOPSPAWN = 0x00000020,
GAMETYPE_ACCESSCARDSPRITES = 0x00000040,
GAMETYPE_COOPVIEW = 0x00000080,
GAMETYPE_COOPSOUND = 0x00000100,
GAMETYPE_OTHERPLAYERSINMAP = 0x00000200,
GAMETYPE_ITEMRESPAWN = 0x00000400,
GAMETYPE_MARKEROPTION = 0x00000800,
GAMETYPE_PLAYERSFRIENDLY = 0x00001000,
GAMETYPE_FIXEDRESPAWN = 0x00002000,
GAMETYPE_ACCESSATSTART = 0x00004000,
GAMETYPE_PRESERVEINVENTORYDEATH = 0x00008000,
GAMETYPE_TDM = 0x00010000,
GAMETYPE_TDMSPAWN = 0x00020000
};
#define GTFLAGS(x) (GametypeFlags[ud.coop] & x)
extern char g_numVolumes;
extern int32_t g_lastSaveSlot;
@ -785,14 +787,6 @@ enum GameEvent_t {
MAXEVENTS
};
enum SystemString_t {
STR_MAPNAME,
STR_MAPFILENAME,
STR_PLAYERNAME,
STR_VERSION,
STR_GAMETYPE
};
// store global game definitions
@ -1004,19 +998,18 @@ typedef struct {
animwalltype animwall[MAXANIMWALLS];
int32_t msx[2048], msy[2048];
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];
ActorData_t ActorExtra[MAXSPRITES];
int16_t pskyoff[MAXPSKYTILES], pskybits;
int32_t animategoal[MAXANIMATES], animatevel[MAXANIMATES], g_animateCount;
int16_t animatesect[MAXANIMATES];
int32_t animateptr[MAXANIMATES];
char g_numPlayerSprites;
char g_earthquakeTime;
uint8_t g_numPlayerSprites;
uint8_t g_earthquakeTime;
int32_t lockclock;
int32_t randomseed, g_globalRandom;
char scriptptrs[MAXSPRITES];
uint8_t scriptptrs[MAXSPRITES];
intptr_t *vars[MAXGAMEVARS];
} mapstate_t;

View file

@ -43,7 +43,7 @@ extern void S_MusicShutdown(void);
extern void S_MenuSound(void);
extern int32_t S_PlayMusic(const char *fn, const int32_t sel);
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 int32_t A_PlaySound(uint32_t num,int32_t i);
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 int32_t P_ActivateSwitch(int32_t snum,int32_t w,int32_t switchtype);
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 int32_t Sect_DamageCeiling(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 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 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 G_Shutdown(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_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 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 void A_AddToDeleteQueue(int32_t i);
extern void A_SpawnMultiple(int32_t sp,int32_t pic,int32_t n);

View file

@ -305,7 +305,7 @@ int32_t gametext_z(int32_t small, int32_t starttile, int32_t x,int32_t y,const c
{
int32_t ac,newx,oldx=x;
char centre;
char *oldt;
char *oldt;
int32_t squishtext = ((small&2)!=0);
// int32_t ht = usehightile;
int32_t shift = 16, widthx = 320, ox, oy;
@ -2034,9 +2034,9 @@ static void G_DrawStatusBar(int32_t snum)
the HUD is drawn */
int32_t asprites[MAX_WEAPONS] = { BOOTS, AMMO, SHOTGUNAMMO,
BATTERYAMMO, RPGAMMO, HBOMBAMMO, CRYSTALAMMO, DEVISTATORAMMO,
TRIPBOMBSPRITE, FREEZEAMMO+1, HBOMBAMMO, GROWAMMO
};
BATTERYAMMO, RPGAMMO, HBOMBAMMO, CRYSTALAMMO, DEVISTATORAMMO,
TRIPBOMBSPRITE, FREEZEAMMO+1, HBOMBAMMO, GROWAMMO
};
Bmemcpy(ammo_sprites,asprites,sizeof(ammo_sprites));
}
@ -2855,30 +2855,30 @@ void G_GameExit(const char *t)
if (*t != 0) g_player[myconnectindex].ps->palette = (unsigned char *) &palette[0];
if (numplayers > 1)
{
int32_t i, j, oldtotalclock;
{
int32_t i, j, oldtotalclock;
ready2send = 0;
ready2send = 0;
for (j=MAXPLAYERS-1;j>=0;j--)
{
oldtotalclock = totalclock;
for (j=MAXPLAYERS-1;j>=0;j--)
{
oldtotalclock = totalclock;
while (totalclock < oldtotalclock+TICSPERFRAME)
{
handleevents();
Net_GetPackets();
}
if (KB_KeyPressed(sc_Escape)) return;
while (totalclock < oldtotalclock+TICSPERFRAME)
{
handleevents();
Net_GetPackets();
}
if (KB_KeyPressed(sc_Escape)) return;
packbuf[0] = PACKET_NULL_PACKET;
TRAVERSE_CONNECT(i)
{
if (i != myconnectindex) mmulti_sendpacket(i,packbuf,1);
if ((!g_networkBroadcastMode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
}
}
}
packbuf[0] = PACKET_NULL_PACKET;
TRAVERSE_CONNECT(i)
{
if (i != myconnectindex) mmulti_sendpacket(i,packbuf,1);
if ((!g_networkBroadcastMode) && (myconnectindex != connecthead)) break; //slaves in M/S mode only send to master
}
}
}
mmulti_uninitmultiplayers();
@ -3473,7 +3473,6 @@ static void G_DrawOverheadMap(int32_t cposx, int32_t cposy, int32_t czoom, int16
#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 DefaultCrosshairColors = { 0, 0, 0, 0 };
int32_t g_crosshairSum = 0;
@ -3598,7 +3597,7 @@ void G_DisplayRest(int32_t smoothratio)
DukePlayer_t *pp = g_player[screenpeek].ps;
walltype *wal;
int32_t cposx,cposy,cang;
int32_t cposx, cposy, cang;
#if defined(USE_OPENGL) && defined(POLYMOST)
// this takes care of fullscreen tint for OpenGL
@ -7505,7 +7504,7 @@ PALONLY:
do
{
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];
X_OnEvent(EVENT_ANIMATESPRITES,tsprite[j].owner, myconnectindex, -1);
@ -7516,7 +7515,7 @@ PALONLY:
if (j < 0) return;
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];
X_OnEvent(EVENT_ANIMATESPRITES,tsprite[j].owner, myconnectindex, -1);
@ -10707,7 +10706,7 @@ void G_UpdatePlayerFromMenu(void)
g_player[myconnectindex].ps->auto_aim = ud.config.AutoAim;
g_player[myconnectindex].ps->weaponswitch = ud.weaponswitch;
g_player[myconnectindex].ps->palookup = g_player[myconnectindex].pcolor = ud.color;
g_player[myconnectindex].pteam = ud.team;
if (sprite[g_player[myconnectindex].ps->i].picnum == APLAYER && sprite[g_player[myconnectindex].ps->i].pal != 1)
@ -10966,12 +10965,12 @@ void app_main(int32_t argc,const char **argv)
if (!ShellExecuteExA(&sinfo))
initprintf("update: error launching browser!\n");
/*
CONFIG_SetupMouse();
CONFIG_SetupJoystick();
CONFIG_WriteSetup();
G_GameExit(" ");
*/
/*
CONFIG_SetupMouse();
CONFIG_SetupJoystick();
CONFIG_WriteSetup();
G_GameExit(" ");
*/
}
}
else initprintf("... no updates available\n");

View file

@ -1646,7 +1646,7 @@ static void C_GetNextVarType(int32_t type)
lLabelID=C_GetLabelNameOffset(&wallH,strtolower(label+(g_numLabels<<6),Bstrlen(label+(g_numLabels<<6))));
else if (i == g_iPlayerVarID)
lLabelID=C_GetLabelNameOffset(&playerH,strtolower(label+(g_numLabels<<6),Bstrlen(label+(g_numLabels<<6))));
//printf("LabelID is %d\n",lLabelID);
if (lLabelID == -1)
{
@ -1734,8 +1734,8 @@ static void C_GetNextVarType(int32_t type)
{
C_ReportError(-1);
initprintf("%s:%d: warning: found local gamevar `%s' used within %s; "
"expect multiplayer synchronization issues.\n",g_szScriptFileName,
g_lineNumber,label+(g_numLabels<<6),g_parsingEventPtr?"a synced event":"an actor");
"expect multiplayer synchronization issues.\n",g_szScriptFileName,
g_lineNumber,label+(g_numLabels<<6),g_parsingEventPtr?"a synced event":"an actor");
g_numCompilerWarnings++;
}
if (!(g_numCompilerErrors || g_numCompilerWarnings) && g_scriptDebug > 1)
@ -1838,7 +1838,7 @@ static int32_t C_GetNextValue(int32_t type)
i = l-1;
do
{
// FIXME: check for 0-9 A-F for hex
// FIXME: check for 0-9 A-F for hex
if (textptr[0] == '0' && textptr[1] == 'x') break; // kill the warning for hex
if (!isdigit(textptr[i--]))
{
@ -5738,6 +5738,7 @@ static void C_AddDefaultDefinitions(void)
C_AddDefinition("STR_PLAYERNAME",STR_PLAYERNAME,LABEL_DEFINE);
C_AddDefinition("STR_VERSION",STR_VERSION,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);
@ -5985,13 +5986,13 @@ void C_Compile(const char *filenam)
initprintf("Script compiled in %dms\n", getticks() - startcompiletime);
initprintf("Compiled code size: %ld*%d bytes, version %s\n",
(unsigned)(g_scriptPtr-script), sizeof(intptr_t), (g_scriptVersion == 14?"1.4+":"1.3D"));
(unsigned)(g_scriptPtr-script), sizeof(intptr_t), (g_scriptVersion == 14?"1.4+":"1.3D"));
initprintf("Pointer bitmap size: %ld bytes\n",(g_scriptSize+7)>>3);
initprintf("%ld/%ld labels, %d/%d variables\n", g_numLabels,
min((MAXSECTORS * sizeof(sectortype)/sizeof(int32_t)),
MAXSPRITES * sizeof(spritetype)/(1<<6)),
g_gameVarCount, MAXGAMEVARS);
min((MAXSECTORS * sizeof(sectortype)/sizeof(int32_t)),
MAXSPRITES * sizeof(spritetype)/(1<<6)),
g_gameVarCount, MAXGAMEVARS);
for (i=MAXQUOTES-1;i>=0;i--)
if (ScriptQuotes[i])
@ -6111,92 +6112,92 @@ void C_Compile(const char *filenam)
void C_ReportError(int32_t iError)
{
if (Bstrcmp(g_szCurrentBlockName,g_szLastBlockName))
{
if (g_parsingEventPtr || g_processingState || g_parsingActorPtr)
initprintf("%s: In %s `%s':\n",g_szScriptFileName,g_parsingEventPtr?"event":g_parsingActorPtr?"actor":"state",g_szCurrentBlockName);
else initprintf("%s: At top level:\n",g_szScriptFileName);
Bstrcpy(g_szLastBlockName,g_szCurrentBlockName);
}
switch (iError)
{
case ERROR_CLOSEBRACKET:
initprintf("%s:%d: error: found more `}' than `{' before `%s'.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_EVENTONLY:
initprintf("%s:%d: error: `%s' only valid during events.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_EXCEEDSMAXTILES:
initprintf("%s:%d: error: `%s' value exceeds MAXTILES. Maximum is %d.\n",g_szScriptFileName,g_lineNumber,tempbuf,MAXTILES-1);
break;
case ERROR_EXPECTEDKEYWORD:
initprintf("%s:%d: error: expected a keyword but found `%s'.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_FOUNDWITHIN:
initprintf("%s:%d: error: found `%s' within %s.\n",g_szScriptFileName,g_lineNumber,tempbuf,g_parsingEventPtr?"an event":g_parsingActorPtr?"an actor":"a state");
break;
case ERROR_ISAKEYWORD:
initprintf("%s:%d: error: symbol `%s' is a keyword.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOENDSWITCH:
initprintf("%s:%d: error: did not find `endswitch' before `%s'.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOTAGAMEDEF:
initprintf("%s:%d: error: symbol `%s' is not a game definition.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOTAGAMEVAR:
initprintf("%s:%d: error: symbol `%s' is not a game variable.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOTAGAMEARRAY:
initprintf("%s:%d: error: symbol `%s' is not a game array.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_GAMEARRAYBNC:
initprintf("%s:%d: error: square brackets for index of game array not closed, expected ] found %c\n",g_szScriptFileName,g_lineNumber,*textptr);
break;
case ERROR_GAMEARRAYBNO:
initprintf("%s:%d: error: square brackets for index of game array not opened, expected [ found %c\n",g_szScriptFileName,g_lineNumber,*textptr);
break;
case ERROR_INVALIDARRAYWRITE:
initprintf("%s:%d: error: arrays can only be written to using `setarray' %c\n",g_szScriptFileName,g_lineNumber,*textptr);
break;
case ERROR_OPENBRACKET:
initprintf("%s:%d: error: found more `{' than `}' before `%s'.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_PARAMUNDEFINED:
initprintf("%s:%d: error: parameter `%s' is undefined.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_SYMBOLNOTRECOGNIZED:
initprintf("%s:%d: error: symbol `%s' is not recognized.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_SYNTAXERROR:
initprintf("%s:%d: error: syntax error.\n",g_szScriptFileName,g_lineNumber);
break;
case ERROR_VARREADONLY:
initprintf("%s:%d: error: variable `%s' is read-only.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_VARTYPEMISMATCH:
initprintf("%s:%d: error: variable `%s' is of the wrong type.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_BADGAMEVAR:
initprintf("%s:%ld: warning: variable `%s' should be either per-player OR per-actor, not both.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_DUPLICATECASE:
initprintf("%s:%ld: warning: duplicate case ignored.\n",g_szScriptFileName,g_lineNumber);
break;
case WARNING_DUPLICATEDEFINITION:
initprintf("%s:%d: warning: duplicate game definition `%s' ignored.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_EVENTSYNC:
initprintf("%s:%d: warning: found `%s' within a local event.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case WARNING_LABELSONLY:
initprintf("%s:%d: warning: expected a label, found a constant.\n",g_szScriptFileName,g_lineNumber);
break;
case WARNING_NAMEMATCHESVAR:
initprintf("%s:%d: warning: symbol `%s' already used for game variable.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_REVEVENTSYNC:
initprintf("%s:%d: warning: found `%s' outside of a local event.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
}
if (Bstrcmp(g_szCurrentBlockName,g_szLastBlockName))
{
if (g_parsingEventPtr || g_processingState || g_parsingActorPtr)
initprintf("%s: In %s `%s':\n",g_szScriptFileName,g_parsingEventPtr?"event":g_parsingActorPtr?"actor":"state",g_szCurrentBlockName);
else initprintf("%s: At top level:\n",g_szScriptFileName);
Bstrcpy(g_szLastBlockName,g_szCurrentBlockName);
}
switch (iError)
{
case ERROR_CLOSEBRACKET:
initprintf("%s:%d: error: found more `}' than `{' before `%s'.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_EVENTONLY:
initprintf("%s:%d: error: `%s' only valid during events.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_EXCEEDSMAXTILES:
initprintf("%s:%d: error: `%s' value exceeds MAXTILES. Maximum is %d.\n",g_szScriptFileName,g_lineNumber,tempbuf,MAXTILES-1);
break;
case ERROR_EXPECTEDKEYWORD:
initprintf("%s:%d: error: expected a keyword but found `%s'.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_FOUNDWITHIN:
initprintf("%s:%d: error: found `%s' within %s.\n",g_szScriptFileName,g_lineNumber,tempbuf,g_parsingEventPtr?"an event":g_parsingActorPtr?"an actor":"a state");
break;
case ERROR_ISAKEYWORD:
initprintf("%s:%d: error: symbol `%s' is a keyword.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOENDSWITCH:
initprintf("%s:%d: error: did not find `endswitch' before `%s'.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOTAGAMEDEF:
initprintf("%s:%d: error: symbol `%s' is not a game definition.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOTAGAMEVAR:
initprintf("%s:%d: error: symbol `%s' is not a game variable.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_NOTAGAMEARRAY:
initprintf("%s:%d: error: symbol `%s' is not a game array.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_GAMEARRAYBNC:
initprintf("%s:%d: error: square brackets for index of game array not closed, expected ] found %c\n",g_szScriptFileName,g_lineNumber,*textptr);
break;
case ERROR_GAMEARRAYBNO:
initprintf("%s:%d: error: square brackets for index of game array not opened, expected [ found %c\n",g_szScriptFileName,g_lineNumber,*textptr);
break;
case ERROR_INVALIDARRAYWRITE:
initprintf("%s:%d: error: arrays can only be written to using `setarray' %c\n",g_szScriptFileName,g_lineNumber,*textptr);
break;
case ERROR_OPENBRACKET:
initprintf("%s:%d: error: found more `{' than `}' before `%s'.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_PARAMUNDEFINED:
initprintf("%s:%d: error: parameter `%s' is undefined.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case ERROR_SYMBOLNOTRECOGNIZED:
initprintf("%s:%d: error: symbol `%s' is not recognized.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_SYNTAXERROR:
initprintf("%s:%d: error: syntax error.\n",g_szScriptFileName,g_lineNumber);
break;
case ERROR_VARREADONLY:
initprintf("%s:%d: error: variable `%s' is read-only.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case ERROR_VARTYPEMISMATCH:
initprintf("%s:%d: error: variable `%s' is of the wrong type.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_BADGAMEVAR:
initprintf("%s:%ld: warning: variable `%s' should be either per-player OR per-actor, not both.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_DUPLICATECASE:
initprintf("%s:%ld: warning: duplicate case ignored.\n",g_szScriptFileName,g_lineNumber);
break;
case WARNING_DUPLICATEDEFINITION:
initprintf("%s:%d: warning: duplicate game definition `%s' ignored.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_EVENTSYNC:
initprintf("%s:%d: warning: found `%s' within a local event.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
case WARNING_LABELSONLY:
initprintf("%s:%d: warning: expected a label, found a constant.\n",g_szScriptFileName,g_lineNumber);
break;
case WARNING_NAMEMATCHESVAR:
initprintf("%s:%d: warning: symbol `%s' already used for game variable.\n",g_szScriptFileName,g_lineNumber,label+(g_numLabels<<6));
break;
case WARNING_REVEVENTSYNC:
initprintf("%s:%d: warning: found `%s' outside of a local event.\n",g_szScriptFileName,g_lineNumber,tempbuf);
break;
}
}

View file

@ -113,6 +113,15 @@ extern int32_t g_errorLineNum;
extern int32_t g_tw;
extern const char *keyw[];
enum SystemString_t {
STR_MAPNAME,
STR_MAPFILENAME,
STR_PLAYERNAME,
STR_VERSION,
STR_GAMETYPE,
STR_VOLUMENAME
};
enum ScriptError_t
{
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,
(daxvel*(sintable[angdif&2047]))>>14,vm.g_sp->zvel,CLIPMASK0);
{
vec3_t tmpvect;
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)
@ -1095,7 +1100,7 @@ static int32_t X_DoExecute(void)
default:
// fix for flying/jumping monsters getting stuck in water
if (vm.g_sp->hitag & jumptoplayer || (actorscrptr[vm.g_sp->picnum] &&
moveptr >= &script[0] && moveptr <= (&script[0]+g_scriptSize) && *(moveptr+1)))
moveptr >= &script[0] && moveptr <= (&script[0]+g_scriptSize) && *(moveptr+1)))
{
// OSD_Printf("%d\n",*(moveptr+1));
break;
@ -1516,7 +1521,7 @@ static int32_t X_DoExecute(void)
insptr++;
{
int32_t i = Gv_GetVarX(*insptr++),
f=Gv_GetVarX(*insptr++);
f=Gv_GetVarX(*insptr++);
j=Gv_GetVarX(*insptr++);
if ((i<0 || i>=MAXQUOTES) && g_scriptSanityChecks)
OSD_Printf(CON_ERROR "invalid quote ID %d\n",g_errorLineNum,keyw[g_tw],i);
@ -1617,6 +1622,9 @@ static int32_t X_DoExecute(void)
case STR_GAMETYPE:
Bstrcpy(ScriptQuotes[i],GametypeNames[ud.coop]);
break;
case STR_VOLUMENAME:
Bstrcpy(ScriptQuotes[i],EpisodeNames[ud.volume_number]);
break;
default:
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++;
{
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)
{
@ -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);
break;
}
setsprite(spritenum, x, y, z);
setsprite(spritenum, davector.x, davector.y, davector.z);
break;
}
@ -2424,7 +2436,7 @@ static int32_t X_DoExecute(void)
insptr++;
break;
}
Gv_SetVarX(*insptr++, A_MoveSprite(spritenum, x, y, z, cliptype));
Gv_SetVarX(*insptr++, A_MoveSprite(spritenum, &davector, cliptype));
break;
}
}
@ -3061,17 +3073,17 @@ static int32_t X_DoExecute(void)
index=Gv_GetVarX(*insptr++);
label=*insptr++;
/* if ((index < aGameArrays[lVarID].size)&&(index>=0))
{
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]);
break;
}
else
{
OSD_Printf(CON_ERROR "invalid array index\n",g_errorLineNum,keyw[g_tw]);
break;
} */
/* if ((index < aGameArrays[lVarID].size)&&(index>=0))
{
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]);
break;
}
else
{
OSD_Printf(CON_ERROR "invalid array index\n",g_errorLineNum,keyw[g_tw]);
break;
} */
break;
}
else if (*insptr&(MAXGAMEVARS<<1))

View file

@ -4044,7 +4044,7 @@ static int32_t X_AccessSpriteX(int32_t iActor, int32_t lLabelID, int32_t lParm2)
if ((ActorLabels[lLabelID].flags & LABEL_HASPARM2 && (lParm2 < 0 || lParm2 >= ActorLabels[lLabelID].maxParm2)) && g_scriptSanityChecks)
{
OSD_Printf(CON_ERROR "tried to get invalid %s position %d on sprite (%d) from spr %d\n",
g_errorLineNum,keyw[g_tw],ActorLabels[lLabelID].name,lParm2,iActor,vm.g_i);
g_errorLineNum,keyw[g_tw],ActorLabels[lLabelID].name,lParm2,iActor,vm.g_i);
return -1;
}
@ -4141,7 +4141,7 @@ static int32_t X_AccessPlayerX(int32_t iPlayer, int32_t lLabelID, int32_t lParm2
if ((PlayerLabels[lLabelID].flags & LABEL_HASPARM2 && (lParm2 < 0 || lParm2 >= PlayerLabels[lLabelID].maxParm2)) && g_scriptSanityChecks)
{
OSD_Printf(CON_ERROR "tried to %s invalid %s position %d on player (%d) from spr %d\n",
g_errorLineNum,keyw[g_tw],PlayerLabels[lLabelID].name,lParm2,iPlayer,vm.g_i);
g_errorLineNum,keyw[g_tw],PlayerLabels[lLabelID].name,lParm2,iPlayer,vm.g_i);
}
switch (lLabelID)

View file

@ -163,7 +163,7 @@ char szPlayerName[32];
int32_t g_damageCameras,g_freezerSelfDamage=0,g_tripbombLaserMode=0;
int32_t g_networkBroadcastMode = 255, g_movesPerPacket = 1,g_gameQuit = 0,everyothertime;
int32_t g_numFreezeBounces=3,g_rpgBlastRadius,g_pipebombBlastRadius,g_tripbombBlastRadius,
g_shrinkerBlastRadius,g_morterBlastRadius,g_bouncemineBlastRadius,g_seenineBlastRadius;
g_shrinkerBlastRadius,g_morterBlastRadius,g_bouncemineBlastRadius,g_seenineBlastRadius;
STATUSBARTYPE sbar;
int32_t mymaxlag, otherminlag, bufferjitter = 1;

View file

@ -1,5 +1,7 @@
// 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_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])

View file

@ -449,7 +449,7 @@ static int32_t osdcmd_restartvid(const osdfuncparm_t *parm)
static int32_t osdcmd_vidmode(const osdfuncparm_t *parm)
{
int32_t newbpp = ud.config.ScreenBPP, newwidth = ud.config.ScreenWidth,
newheight = ud.config.ScreenHeight, newfs = ud.config.ScreenMode;
newheight = ud.config.ScreenHeight, newfs = ud.config.ScreenMode;
if (parm->numparms < 1 || parm->numparms > 4) return OSDCMD_SHOWHELP;
switch (parm->numparms)

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;
int16_t sect = -1;
vec3_t srcvect;
vec3_t destvect;
x1 += (sintable[(348+ang+512)&2047]/ProjectileData[atwith].offset);
y1 += (sintable[(ang+348)&2047]/ProjectileData[atwith].offset);
z1 += 1024+(ProjectileData[atwith].toffset<<8);
Bmemcpy(&destvect,&dv,sizeof(vec3_t));
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);
y2 = ((y2-y1)/n);
z2 = ((z2-z1)/n);
n = ((FindDistance2D(srcvect.x-destvect.x,srcvect.y-destvect.y))>>8)+1;
x1 += x2>>2;
y1 += y2>>2;
z1 += (z2>>2);
destvect.x = ((destvect.x-srcvect.x)/n);
destvect.y = ((destvect.y-srcvect.y)/n);
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--)
{
x1 += x2;
y1 += y2;
z1 += z2;
updatesector(x1,y1,&sect);
getzsofslope(sect,x1,y1,&n,&j);
if (sect < 0 || z1 > j || z1 < n)
srcvect.x += destvect.x;
srcvect.y += destvect.y;
srcvect.z += destvect.z;
updatesector(srcvect.x,srcvect.y,&sect);
getzsofslope(sect,srcvect.x,srcvect.y,&n,&j);
if (sect < 0 || srcvect.z > j || srcvect.z < n)
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);
}
}
@ -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)
{
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;
spritetype *s = &sprite[i];
int16_t sect = s->sectnum;
@ -310,9 +316,9 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
{
p = s->yvel;
sx = g_player[p].ps->posx;
sy = g_player[p].ps->posy;
sz = g_player[p].ps->posz+g_player[p].ps->pyoff+(4<<8);
srcvect.x = g_player[p].ps->posx;
srcvect.y = g_player[p].ps->posy;
srcvect.z = g_player[p].ps->posz+g_player[p].ps->pyoff+(4<<8);
sa = g_player[p].ps->ang;
g_player[p].ps->crack_time = 777;
@ -321,16 +327,16 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
{
p = -1;
sa = s->ang;
sx = s->x;
sy = s->y;
sz = s->z-((s->yrepeat*tilesizy[s->picnum])<<1)+(4<<8);
Bmemcpy(&srcvect,s,sizeof(int32_t) * 3);
srcvect.z -= ((s->yrepeat*tilesizy[s->picnum])<<1)+(4<<8);
if (s->picnum != ROTATEGUN)
{
sz -= (7<<8);
srcvect.z -= (7<<8);
if (A_CheckEnemySprite(s) && PN != COMMANDER)
{
sx += (sintable[(sa+1024+96)&2047]>>7);
sy += (sintable[(sa+512+96)&2047]>>7);
srcvect.x += (sintable[(sa+1024+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)
{
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5;
sz += (6<<8);
srcvect.z += (6<<8);
sa += 15;
}
else if (!(ProjectileData[atwith].workslike & PROJECTILE_NOAIM))
{
j = g_player[A_FindPlayer(s,&x)].ps->i;
zvel = ((sprite[j].z-sz)<<8) / (x+1);
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
zvel = ((sprite[j].z-srcvect.z)<<8) / (x+1);
sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
}
}
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&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].range == 0)
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 (hitwall >= 0 && wall[hitwall].overpicnum != BIGFORCE)
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].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
sprite[k].x = hitx;
sprite[k].y = hity;
sprite[k].z = hitz;
sprite[k].x = hitvect.x;
sprite[k].y = hitvect.y;
sprite[k].z = hitvect.z;
sprite[k].cstat |= (krand()&4);
sprite[k].xrepeat = ProjectileData[atwith].xrepeat;
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].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
sprite[k].x = hitx;
sprite[k].y = hity;
sprite[k].z = hitz;
sprite[k].x = hitvect.x;
sprite[k].y = hitvect.y;
sprite[k].z = hitvect.z;
if (ProjectileData[atwith].workslike & PROJECTILE_RANDDECALSIZE)
{
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))
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;
else
{
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;
sprite[j].extra = ProjectileData[atwith].extra;
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].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz))
if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall;
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);
}
}
@ -533,8 +539,8 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
else if (p >= 0 && zvel > 0 && sector[hitsect].lotag == 1)
{
j = A_Spawn(g_player[p].ps->i,WATERSPLASH2);
sprite[j].x = hitx;
sprite[j].y = hity;
sprite[j].x = hitvect.x;
sprite[j].y = hitvect.y;
sprite[j].ang = g_player[p].ps->ang; // Total tweek
sprite[j].xvel = 32;
A_SetSprite(i,CLIPMASK0);
@ -569,10 +575,10 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
dal -= (8<<8);
// return -1;
}
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++;
zvel = ((sprite[j].z-sz-dal)<<8) / hitx;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-srcvect.z-dal)<<8) / hitvect.x;
sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
}
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;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect,sintable[(sa+512)&2047],sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1);
hitscan(srcvect.x,srcvect.y,srcvect.z,sect,sintable[(sa+512)&2047],sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (hitspr != -1)
{
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));
}
sz -= (2<<8);
srcvect.z -= (2<<8);
}
else
{
j = A_FindPlayer(s,&x);
sz -= (4<<8);
hitx = ldist(&sprite[g_player[j].ps->i], s);
if (hitx == 0)
hitx++;
zvel = ((g_player[j].ps->posz-sz) <<8) / hitx;
srcvect.z -= (4<<8);
hitvect.x = ldist(&sprite[g_player[j].ps->i], s);
if (hitvect.x == 0)
hitvect.x++;
zvel = ((g_player[j].ps->posz-srcvect.z) <<8) / hitvect.x;
if (s->picnum != BOSS1)
{
zvel += 128-(krand()&255);
@ -631,7 +637,7 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
else
{
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;
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&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;
@ -650,20 +656,28 @@ int32_t A_Shoot(int32_t i,int32_t atwith)
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)
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 ((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)
{
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;
if (ProjectileData[atwith].extra_rand > 0)
sprite[k].extra += (krand()%ProjectileData[atwith].extra_rand);
@ -821,15 +835,15 @@ DOSKIPBULLETHOLE:
if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz))
if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall;
A_DamageWall(k,hitwall,hitx,hity,hitz,atwith);
A_DamageWall(k,hitwall,&hitvect,atwith);
}
}
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;
if (ProjectileData[atwith].extra_rand > 0)
sprite[k].extra += (krand()%ProjectileData[atwith].extra_rand);
@ -856,12 +870,14 @@ DOSKIPBULLETHOLE:
else sprite[k].xrepeat = sprite[k].yrepeat = 0;
}
else if (hitwall >= 0)
A_DamageWall(k,hitwall,hitx,hity,hitz,atwith);
A_DamageWall(k,hitwall,&hitvect,atwith);
}
if ((krand()&255) < 4)
if (ProjectileData[atwith].isound >= 0)
S_PlaySoundXYZ(ProjectileData[atwith].isound,k,hitx,hity,hitz);
{
S_PlaySoundXYZ(ProjectileData[atwith].isound,k,&hitvect);
}
return -1;
}
@ -892,15 +908,15 @@ DOSKIPBULLETHOLE:
if (j >= 0)
{
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)
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)*(ProjectileData[atwith].vel/8);
@ -913,12 +929,12 @@ DOSKIPBULLETHOLE:
if (!(ProjectileData[atwith].workslike & PROJECTILE_NOAIM))
{
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);
if (l == 0)
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))
sa = s->ang+(krand()&31)-16;
@ -937,9 +953,9 @@ DOSKIPBULLETHOLE:
sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);*/
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
j = A_InsertSprite(sect,
sx+(sintable[(348+sa+512)&2047]/ProjectileData[atwith].offset),
sy+(sintable[(sa+348)&2047]/ProjectileData[atwith].offset),
sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);
srcvect.x+(sintable[(348+sa+512)&2047]/ProjectileData[atwith].offset),
srcvect.y+(sintable[(sa+348)&2047]/ProjectileData[atwith].offset),
srcvect.z-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);
sprite[j].xrepeat=ProjectileData[atwith].xrepeat;
sprite[j].yrepeat=ProjectileData[atwith].yrepeat;
@ -1001,26 +1017,26 @@ DOSKIPBULLETHOLE:
if (p >= 0)
{
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)<<5;
sz += (6<<8);
srcvect.z += (6<<8);
sa += 15;
}
else
{
j = g_player[A_FindPlayer(s,&x)].ps->i;
zvel = ((sprite[j].z-sz)<<8) / (x+1);
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
zvel = ((sprite[j].z-srcvect.z)<<8) / (x+1);
sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
}
}
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&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 (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 ((wall[hitwall].nextsector >= 0 && hitsect >= 0 &&
sector[wall[hitwall].nextsector].lotag == 0 &&
@ -1051,9 +1067,9 @@ DOSKIPBULLETHOLE:
sprite[k].xvel = -12;
sprite[k].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
sprite[k].x = hitx;
sprite[k].y = hity;
sprite[k].z = hitz;
sprite[k].x = hitvect.x;
sprite[k].y = hitvect.y;
sprite[k].z = hitvect.z;
sprite[k].cstat |= (krand()&4);
A_SetSprite(k,CLIPMASK0);
setsprite(k,sprite[k].x,sprite[k].y,sprite[k].z);
@ -1066,11 +1082,11 @@ DOSKIPBULLETHOLE:
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)
{
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);
if (p >= 0)
{
@ -1095,12 +1111,12 @@ DOSKIPBULLETHOLE:
{
if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz))
if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall;
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);
}
}
@ -1108,8 +1124,8 @@ DOSKIPBULLETHOLE:
else if (p >= 0 && zvel > 0 && sector[hitsect].lotag == 1)
{
j = A_Spawn(g_player[p].ps->i,WATERSPLASH2);
sprite[j].x = hitx;
sprite[j].y = hity;
sprite[j].x = hitvect.x;
sprite[j].y = hitvect.y;
sprite[j].ang = g_player[p].ps->ang; // Total tweek
sprite[j].xvel = 32;
A_SetSprite(i,CLIPMASK0);
@ -1147,10 +1163,10 @@ DOSKIPBULLETHOLE:
dal -= (8<<8);
}
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++;
zvel = ((sprite[j].z-sz-dal)<<8) / hitx;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-srcvect.z-dal)<<8) / hitvect.x;
sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
}
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;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
hitscan(sx,sy,sz,sect,sintable[(sa+512)&2047],sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1);
hitscan(srcvect.x,srcvect.y,srcvect.z,sect,sintable[(sa+512)&2047],sintable[sa&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
if (hitspr != -1)
{
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));
}
sz -= (2<<8);
srcvect.z -= (2<<8);
}
else
{
j = A_FindPlayer(s,&x);
sz -= (4<<8);
hitx = ldist(&sprite[g_player[j].ps->i], s);
if (hitx == 0)
hitx++;
zvel = ((g_player[j].ps->posz-sz) <<8) / hitx;
srcvect.z -= (4<<8);
hitvect.x = ldist(&sprite[g_player[j].ps->i], s);
if (hitvect.x == 0)
hitvect.x++;
zvel = ((g_player[j].ps->posz-srcvect.z) <<8) / hitvect.x;
if (s->picnum != BOSS1)
{
zvel += 128-(krand()&255);
@ -1212,26 +1228,27 @@ DOSKIPBULLETHOLE:
else
{
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;
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&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;
if (hitsect < 0) return -1;
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)
{
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 += (krand()%6);
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);
sprite[l].xvel = -1;
sprite[l].x = hitx;
sprite[l].y = hity;
sprite[l].z = hitz;
sprite[l].x = hitvect.x;
sprite[l].y = hitvect.y;
sprite[l].z = hitvect.z;
sprite[l].ang = getangle(wall[hitwall].x-wall[wall[hitwall].point2].x,
wall[hitwall].y-wall[wall[hitwall].point2].y)+512;
@ -1362,15 +1379,15 @@ SKIPBULLETHOLE:
if (wall[hitwall].cstat&2)
if (wall[hitwall].nextsector >= 0)
if (hitz >= (sector[wall[hitwall].nextsector].floorz))
if (hitvect.z >= (sector[wall[hitwall].nextsector].floorz))
hitwall = wall[hitwall].nextwall;
A_DamageWall(k,hitwall,hitx,hity,hitz,SHOTSPARK1);
A_DamageWall(k,hitwall,&hitvect,SHOTSPARK1);
}
}
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].yvel = atwith; // this is a hack to allow you to detect which weapon spawned a SHOTSPARK1
ActorExtra[k].temp_data[6] = hitwall;
@ -1390,11 +1407,11 @@ SKIPBULLETHOLE:
else sprite[k].xrepeat = sprite[k].yrepeat = 0;
}
else if (hitwall >= 0)
A_DamageWall(k,hitwall,hitx,hity,hitz,SHOTSPARK1);
A_DamageWall(k,hitwall,&hitvect,SHOTSPARK1);
}
if ((krand()&255) < 4)
S_PlaySoundXYZ(PISTOL_RICOCHET,k,hitx,hity,hitz);
S_PlaySoundXYZ(PISTOL_RICOCHET,k, &hitvect);
return -1;
@ -1412,12 +1429,12 @@ SKIPBULLETHOLE:
{
if (s->picnum == BOSS2) vel = 644;
else vel = 348;
sz -= (4<<7);
srcvect.z -= (4<<7);
}
else
{
vel = 840;
sz -= (4<<7);
srcvect.z -= (4<<7);
}
}
@ -1435,10 +1452,10 @@ SKIPBULLETHOLE:
if (j >= 0)
{
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)-(12<<8);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++;
zvel = ((sprite[j].z-sz-dal)*vel) / hitx;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-srcvect.z-dal)*vel) / hitvect.x;
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;
@ -1448,9 +1465,9 @@ SKIPBULLETHOLE:
j = A_FindPlayer(s,&x);
// sa = getangle(g_player[j].ps->oposx-sx,g_player[j].ps->oposy-sy);
sa += 16-(krand()&31);
hitx = ldist(&sprite[g_player[j].ps->i],s);
if (hitx == 0) hitx++;
zvel = ((g_player[j].ps->oposz - sz + (3<<8))*vel) / hitx;
hitvect.x = ldist(&sprite[g_player[j].ps->i],s);
if (hitvect.x == 0) hitvect.x++;
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];
oldzvel = zvel;
@ -1458,7 +1475,7 @@ SKIPBULLETHOLE:
if (atwith == SPIT)
{
sizx = 18;
sizy = 18,sz -= (10<<8);
sizy = 18,srcvect.z -= (10<<8);
}
else
{
@ -1487,7 +1504,8 @@ SKIPBULLETHOLE:
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);
if (atwith == COOLEXPLOSION1)
@ -1515,7 +1533,7 @@ SKIPBULLETHOLE:
return j;
case FREEZEBLAST__STATIC:
sz += (3<<8);
srcvect.z += (3<<8);
case RPG__STATIC:
if (s->extra >= 0) s->shade = -96;
@ -1539,11 +1557,11 @@ SKIPBULLETHOLE:
if (j >= 0)
{
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1)+(8<<8);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0) hitx++;
zvel = ((sprite[j].z-sz-dal)*vel) / hitx;
hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitvect.x == 0) hitvect.x++;
zvel = ((sprite[j].z-srcvect.z-dal)*vel) / hitvect.x;
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;
if (atwith == RPG)
@ -1552,19 +1570,19 @@ SKIPBULLETHOLE:
else
{
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)
sz -= (32<<8);
srcvect.z -= (32<<8);
else if (PN == BOSS2)
{
vel += 128;
sz += 24<<8;
srcvect.z += 24<<8;
}
l = ldist(&sprite[g_player[j].ps->i],s);
if (l == 0)
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))
sa = s->ang+(krand()&31)-16;
@ -1575,9 +1593,9 @@ SKIPBULLETHOLE:
else l = -1;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
j = A_InsertSprite(sect,
sx+(sintable[(348+sa+512)&2047]/448),
sy+(sintable[(sa+348)&2047]/448),
sz-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);
srcvect.x+(sintable[(348+sa+512)&2047]/448),
srcvect.y+(sintable[(sa+348)&2047]/448),
srcvect.z-(1<<8),atwith,0,14,14,sa,vel,zvel,i,4);
sprite[j].extra += (krand()&7);
if (atwith != FREEZEBLAST)
@ -1659,16 +1677,16 @@ SKIPBULLETHOLE:
zvel = (100-g_player[p].ps->horiz-g_player[p].ps->horizoff)*32;
else zvel = 0;
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&2047],
zvel<<6,&hitsect,&hitwall,&hitspr,&hitx,&hity,&hitz,CLIPMASK1);
zvel<<6,&hitsect,&hitwall,&hitspr,&hitvect.x,&hitvect.y,&hitvect.z,CLIPMASK1);
j = 0;
if (hitspr >= 0) break;
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)
{
@ -1682,7 +1700,7 @@ SKIPBULLETHOLE:
if (j == 1)
{
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)
{
int32_t lLifetime=Gv_GetVarByLabel("STICKYBOMB_LIFETIME", NAM_GRENADE_LIFETIME, g_player[p].ps->i, p);
@ -1721,9 +1739,9 @@ SKIPBULLETHOLE:
vel = x>>4;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
A_InsertSprite(sect,
sx+(sintable[(512+sa+512)&2047]>>8),
sy+(sintable[(sa+512)&2047]>>8),
sz+(6<<8),atwith,-64,32,32,sa,vel,zvel,i,1);
srcvect.x+(sintable[(512+sa+512)&2047]>>8),
srcvect.y+(sintable[(sa+512)&2047]>>8),
srcvect.z+(6<<8),atwith,-64,32,32,sa,vel,zvel,i,1);
break;
case GROWSPARK__STATIC:
@ -1747,11 +1765,11 @@ SKIPBULLETHOLE:
dal -= (8<<8);
}
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0)
hitx++;
zvel = ((sprite[j].z-sz-dal)<<8) / hitx;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitvect.x == 0)
hitvect.x++;
zvel = ((sprite[j].z-srcvect.z-dal)<<8) / hitvect.x;
sa = getangle(sprite[j].x-srcvect.x,sprite[j].y-srcvect.y);
}
else
{
@ -1760,16 +1778,16 @@ SKIPBULLETHOLE:
zvel += 128-(krand()&255);
}
sz -= (2<<8);
srcvect.z -= (2<<8);
}
else
{
j = A_FindPlayer(s,&x);
sz -= (4<<8);
hitx = ldist(&sprite[g_player[j].ps->i], s);
if (hitx == 0)
hitx++;
zvel = ((g_player[j].ps->posz-sz) <<8) / hitx;
srcvect.z -= (4<<8);
hitvect.x = ldist(&sprite[g_player[j].ps->i], s);
if (hitvect.x == 0)
hitvect.x++;
zvel = ((g_player[j].ps->posz-srcvect.z) <<8) / hitvect.x;
zvel += 128-(krand()&255);
sa += 32-(krand()&63);
}
@ -1781,14 +1799,14 @@ SKIPBULLETHOLE:
s->cstat &= ~257;
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&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;
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].cstat |= 130;
@ -1808,9 +1826,9 @@ SKIPBULLETHOLE:
wall[wall[hitwall].point2].x-wall[hitwall].x,
wall[wall[hitwall].point2].y-wall[hitwall].y);
sx = hitx;
sy = hity;
sz = hitz;
sx = hitvect.x;
sy = hitvect.y;
srcvect.z = hitvect.z;
sect = hitsect;
sa = ((l<<1) - sa)&2047;
sx += sintable[(sa+512)&2047]>>12;
@ -1820,7 +1838,7 @@ SKIPBULLETHOLE:
goto RESHOOTGROW;
}
else */
A_DamageWall(j,hitwall,hitx,hity,hitz,atwith);
A_DamageWall(j,hitwall,&hitvect,atwith);
}
break;
@ -1841,11 +1859,11 @@ SKIPBULLETHOLE:
if (j >= 0)
{
dal = ((sprite[j].yrepeat*tilesizy[sprite[j].picnum])<<1);
hitx = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitx == 0)
hitx++;
zvel = ((sprite[j].z-sz-dal-(4<<8))*768) / hitx;
sa = getangle(sprite[j].x-sx,sprite[j].y-sy);
hitvect.x = ldist(&sprite[g_player[p].ps->i], &sprite[j]);
if (hitvect.x == 0)
hitvect.x++;
zvel = ((sprite[j].z-srcvect.z-dal-(4<<8))*768) / hitvect.x;
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;
}
@ -1855,14 +1873,14 @@ SKIPBULLETHOLE:
l = ldist(&sprite[g_player[j].ps->i],s);
if (l == 0)
l++;
zvel = ((g_player[j].ps->oposz-sz)*512) / l ;
zvel = ((g_player[j].ps->oposz-srcvect.z)*512) / l ;
}
else zvel = 0;
if (ActorExtra[i].temp_data[9]) zvel = ActorExtra[i].temp_data[9];
j = A_InsertSprite(sect,
sx+(sintable[(512+sa+512)&2047]>>12),
sy+(sintable[(sa+512)&2047]>>12),
sz+(2<<8),SHRINKSPARK,-16,28,28,sa,768,zvel,i,4);
srcvect.x+(sintable[(512+sa+512)&2047]>>12),
srcvect.y+(sintable[(sa+512)&2047]>>12),
srcvect.z+(2<<8),SHRINKSPARK,-16,28,28,sa,768,zvel,i,4);
sprite[j].cstat = 128;
sprite[j].clipdist = 32;
@ -3367,7 +3385,7 @@ static int32_t P_DoCounters(DukePlayer_t *p)
int16_t WeaponPickupSprites[MAX_WEAPONS] = { KNEE__STATIC, FIRSTGUNSPRITE__STATIC, SHOTGUNSPRITE__STATIC,
CHAINGUNSPRITE__STATIC, RPGSPRITE__STATIC, HEAVYHBOMB__STATIC, SHRINKERSPRITE__STATIC, DEVISTATORSPRITE__STATIC,
TRIPBOMBSPRITE__STATIC, FREEZESPRITE__STATIC, HEAVYHBOMB__STATIC, SHRINKERSPRITE__STATIC
};
};
// this is used for player deaths
void P_DropWeapon(DukePlayer_t *p)
{

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 i, x, lotag,hitag,picnum,correctdips = 1, numdips = 0;
int32_t sx,sy;
vec3_t davector;
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;
if (lotag == 0) return 0;
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;
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;
if (lotag == 0) return 0;
hitag = wall[w].hitag;
sx = wall[w].x;
sy = wall[w].y;
// sx = wall[w].x;
// sy = wall[w].y;
Bmemcpy(&davector, &wall[w], sizeof(int32_t) * 2);
davector.z = g_player[snum].ps->posz;
picnum = wall[w].picnum;
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 (switchtype == 1)
S_PlaySoundXYZ(ALIEN_SWITCH1,w,sx,sy,g_player[snum].ps->posz);
else S_PlaySoundXYZ(ALIEN_SWITCH1,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz);
S_PlaySoundXYZ(ALIEN_SWITCH1, w, &davector);
else S_PlaySoundXYZ(ALIEN_SWITCH1,g_player[snum].ps->i,&davector);
}
else
{
if (switchtype == 1)
S_PlaySoundXYZ(SWITCH_ON,w,sx,sy,g_player[snum].ps->posz);
else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz);
S_PlaySoundXYZ(SWITCH_ON, w, &davector);
else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,&davector);
}
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+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 (switchtype == 1)
S_PlaySoundXYZ(SWITCH_ON,w,sx,sy,g_player[snum].ps->posz);
else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,sx,sy,g_player[snum].ps->posz);
S_PlaySoundXYZ(SWITCH_ON,w,&davector);
else S_PlaySoundXYZ(SWITCH_ON,g_player[snum].ps->i,&davector);
}
else if (hitag != 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);
}
@ -1622,7 +1626,7 @@ static void BreakWall(int32_t newpn,int32_t spr,int32_t dawallnum)
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;
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 (sector[wal->nextsector].floorz > z)
if (sector[wal->nextsector].floorz > pos->z)
if (sector[wal->nextsector].floorz-sector[wal->nextsector].ceilingz)
{
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:
wal->extra = 1; // tell the forces to animate
case BIGFORCE__STATIC:
updatesector(x,y,&sn);
updatesector(pos->x,pos->y,&sn);
if (sn < 0) return;
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
{
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);
else i = A_InsertSprite(sn,x,y,z,FORCERIPPLE,-127,32,32,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,pos->x,pos->y,pos->z,FORCERIPPLE,-127,32,32,0,0,0,spr,5);
}
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;
case GLASS__STATIC:
updatesector(x,y,&sn);
updatesector(pos->x,pos->y,&sn);
if (sn < 0) return;
wal->overpicnum=GLASS2;
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)
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;
T2 = 5;
T3 = dawallnum;
A_PlaySound(GLASS_BREAKING,i);
return;
case STAINGLASS1__STATIC:
updatesector(x,y,&sn);
updatesector(pos->x,pos->y,&sn);
if (sn < 0) return;
A_SpawnRandomGlass(spr,dawallnum,80);
wal->cstat = 0;
@ -1935,19 +1939,27 @@ void P_CheckTouchDamage(DukePlayer_t *p,int32_t j)
p->posyv = -(sintable[(p->ang)&2047]<<8);
A_PlaySound(DUKE_LONGTERM_PAIN,p->i);
A_DamageWall(p->i,j,
p->posx+(sintable[(p->ang+512)&2047]>>9),
p->posy+(sintable[p->ang&2047]>>9),
p->posz,-1);
{
vec3_t davect;
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;
case BIGFORCE__STATIC:
p->hurt_delay = 26;
A_DamageWall(p->i,j,
p->posx+(sintable[(p->ang+512)&2047]>>9),
p->posy+(sintable[p->ang&2047]>>9),
p->posz,-1);
{
vec3_t davect;
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;
}

View file

@ -267,7 +267,7 @@ int32_t S_LoadSound(uint32_t num)
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 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;
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)
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
{
sndang = 2048 + ca - getangle(cx-x,cy-y);
sndang = 2048 + ca - getangle(cx-pos->x,cy-pos->y);
sndang &= 2047;
}
@ -512,7 +512,12 @@ int32_t A_PlaySound(uint32_t num, int32_t i)
S_PlaySound(num);
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)