Testing changes for GZDoom 4.11/5.0.
This commit is contained in:
parent
75ffce1627
commit
d0fddbf8a3
24 changed files with 104 additions and 331 deletions
|
|
@ -1,4 +1,4 @@
|
|||
Copyright (c) 2020-2022 Marisa the Magician, UnSX Team
|
||||
Copyright (c) 2020-2023 Marisa the Magician, UnSX Team
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
|||
|
|
@ -3318,6 +3318,8 @@ SWWM_LORETXT_RAFANKOS =
|
|||
"\n"
|
||||
"\cfReload:\c- Loads in a new magazine, each holding four pods. The currently loaded pod must be fully discharged before a new one can be chambered in.\n"
|
||||
"\n"
|
||||
"\cfTechniques:\c- Due to using a singular trigger at different pressures, alternating between both fire modes is completely seamless.\n"
|
||||
"\n"
|
||||
"\cxSaya's Notes:\c-\n"
|
||||
"\cf\"Ultimate Weapon\"? Talk about pretentious... But you know, something about this was making my brains itch, and then it clicked. This is basically like that one spellcard, the Master Spark. Hell, it almost even sounds and looks the same...\c-\n"
|
||||
"\n"
|
||||
|
|
|
|||
|
|
@ -3087,6 +3087,8 @@ SWWM_LORETXT_RAFANKOS =
|
|||
"\n"
|
||||
"\cfRecarga:\c- Coloca un nuevo cargador, cada uno almacenando cuatro cápsulas. La cápsula cargada debe gastarse completamente antes de poder insertar una nueva en la recámara.\n"
|
||||
"\n"
|
||||
"\cfTécnicas:\c- Al usar un solo gatillo con diferentes grados de presión, la acción de alternar entre ambos modos de disparo es completamente fluida.\n"
|
||||
"\n"
|
||||
"\cxNotas de Saya:\c-\n"
|
||||
"\cf¿\"Arma Definitiva\"? Menuda cursilada... Pero sabes, algo de todo esto hacía que me picotearan los sesos, y entonces todo encajó. Esta cosa es básicamente como esa carta de hechizo, la Chispa Maestra. Hostia, es que hasta suena y pinta igual...\c-\n"
|
||||
"\n"
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
[default]
|
||||
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r723 \cu(Sat 31 Dec 13:08:09 CET 2022)\c-";
|
||||
SWWM_SHORTVER="\cw1.3pre r723 \cu(2022-12-31 13:08:09)\c-";
|
||||
SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r724 \cu(Sun 8 Jan 14:58:06 CET 2023)\c-";
|
||||
SWWM_SHORTVER="\cw1.3pre r724 \cu(2023-01-08 14:58:06)\c-";
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@ The weapon employs **Kabbadon** as fuel, a common byproduct of **Nokorokinylum**
|
|||
|
||||
\cfReload:\c- Loads in a new magazine, each holding four pods. The currently loaded pod must be fully discharged before a new one can be chambered in.
|
||||
|
||||
\cfTechniques:\c- Due to using a singular trigger at different pressures, alternating between both fire modes is completely seamless.
|
||||
|
||||
\cxSaya's Notes:\c-
|
||||
\cf"Ultimate Weapon"? Talk about pretentious... But you know, something about this was making my brains itch, and then it clicked. This is basically like that one spellcard, the Master Spark. Hell, it almost even sounds and looks the same...\c-
|
||||
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@ El arma emplea **Kabbadon** como combustible, un subproducto común de la fusió
|
|||
|
||||
\cfRecarga:\c- Coloca un nuevo cargador, cada uno almacenando cuatro cápsulas. La cápsula cargada debe gastarse completamente antes de poder insertar una nueva en la recámara.
|
||||
|
||||
\cfTécnicas:\c- Al usar un solo gatillo con diferentes grados de presión, la acción de alternar entre ambos modos de disparo es completamente fluida.
|
||||
|
||||
\cxNotas de Saya:\c-
|
||||
\cf¿"Arma Definitiva"? Menuda cursilada... Pero sabes, algo de todo esto hacía que me picotearan los sesos, y entonces todo encajó. Esta cosa es básicamente como esa carta de hechizo, la Chispa Maestra. Hostia, es que hasta suena y pinta igual...\c-
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
a.k.a.
|
||||
Some Weird Weapons Mod: GZDoom Edition
|
||||
--------------------------------------------
|
||||
(C)2020-2022 Marisa the Magician - UnSX Team
|
||||
(C)2020-2023 Marisa the Magician - UnSX Team
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
6BFABEBF4497E46370D5724D5D638989
|
||||
757249FBAD1706214F9AEF0E210EFE44
|
||||
78E51D7ACD8AD50076AC658255DBFF14
|
||||
7E371B881D9F7060A2F5F9A24B8EF1C1
|
||||
845D77DBE053DD03CBDD5D343E792603
|
||||
8E4798C0CC58E27F62EBE83B4BA19D8A
|
||||
96C5914A9B4A2383DE6BBE363940DF2F
|
||||
|
|
@ -21,4 +22,3 @@ BC8F9A1EA116535A1D48ED8DB0A5FAC8
|
|||
DC32F182CF747FD70A1C43671A7294D2
|
||||
DF6A001A6C42DB5CCA599EE5883B294A
|
||||
F396B7A7B43BCCCFC37B761A4DADDDDC
|
||||
F49892913C542EDE85E15B52AF1F21A5
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
version "4.10"
|
||||
version "4.11"
|
||||
|
||||
/*
|
||||
DEMOLITIONIST Main Codebase
|
||||
(C)2020-2022 Marisa the Magician, UnSX Team
|
||||
(C)2020-2023 Marisa the Magician, UnSX Team
|
||||
This copyright and the attached LICENSE.code file apply to all files
|
||||
included from here, with the exception of any third party libraries
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -274,7 +274,7 @@ Class SWWMHandler : EventHandler
|
|||
{
|
||||
if ( !lastlock || (gametic > lastlock+20) )
|
||||
{
|
||||
if ( SWWMUtility.IsValidLockNum(locknum) )
|
||||
if ( Key.IsLockDefined(locknum) )
|
||||
lastlock = AddOneliner("locked",2);
|
||||
else lastlock = AddOneliner("jammed",2);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -146,70 +146,6 @@ extend Class SWWMHandler
|
|||
SWWMUtility.MarkAchievement("hurry",players[consoleplayer]);
|
||||
}
|
||||
|
||||
private void SetupLockdefsCache( SWWMCachedLockInfo cli )
|
||||
{
|
||||
for ( int i=0; i<Wads.GetNumLumps(); i++ )
|
||||
{
|
||||
String lname = Wads.GetLumpName(i);
|
||||
if ( !(lname ~== "LOCKDEFS") ) continue;
|
||||
String data = Wads.ReadLump(i);
|
||||
Array<String> lines;
|
||||
lines.Clear();
|
||||
data.Split(lines,"\n");
|
||||
bool valid = false;
|
||||
for ( int j=0; j<lines.Size(); j++ )
|
||||
{
|
||||
// strip leading whitespace
|
||||
while ( (lines[j].Left(1) == " ") || (lines[j].Left(1) == "\t") )
|
||||
lines[j] = lines[j].Mid(1);
|
||||
if ( lines[j].Left(10) ~== "CLEARLOCKS" )
|
||||
{
|
||||
for ( int k=0; k<cli.ent.Size(); k++ )
|
||||
cli.ent[k].Destroy();
|
||||
cli.ent.Clear();
|
||||
}
|
||||
else if ( Lines[j].Left(5) ~== "LOCK " )
|
||||
{
|
||||
Array<String> spl;
|
||||
spl.Clear();
|
||||
lines[j].Split(spl," ",TOK_SKIPEMPTY);
|
||||
// check game string (if any)
|
||||
if ( spl.Size() > 2 )
|
||||
{
|
||||
if ( (spl[2] ~== "DOOM") && !(gameinfo.gametype&GAME_Doom) ) continue;
|
||||
else if ( (spl[2] ~== "HERETIC") && !(gameinfo.gametype&GAME_Heretic) ) continue;
|
||||
else if ( (spl[2] ~== "HEXEN") && !(gameinfo.gametype&GAME_Hexen) ) continue;
|
||||
else if ( (spl[2] ~== "STRIFE") && !(gameinfo.gametype&GAME_Strife) ) continue;
|
||||
else if ( (spl[2] ~== "CHEX") && !(gameinfo.gametype&GAME_Chex) ) continue;
|
||||
}
|
||||
// valid lock, prepare it
|
||||
let li = new("LIEntry");
|
||||
li.locknumber = spl[1].ToInt();
|
||||
li.hascolor = false;
|
||||
// see if there's a Mapcolor defined
|
||||
int k = j+1;
|
||||
for ( int k=j+2; k<lines.Size(); k++ )
|
||||
{
|
||||
// strip leading whitespace
|
||||
while ( (lines[k].Left(1) == " ") || (lines[k].Left(1) == "\t") )
|
||||
lines[k] = lines[k].Mid(1);
|
||||
if ( lines[k].Left(5) ~== "LOCK " )
|
||||
break; // we reached the next lock
|
||||
if ( !(lines[k].Left(9) ~== "MAPCOLOR ") )
|
||||
continue;
|
||||
// here it is
|
||||
spl.Clear();
|
||||
lines[k].Split(spl," ",TOK_SKIPEMPTY);
|
||||
if ( spl.Size() < 4 ) break;
|
||||
li.hascolor = true;
|
||||
li.mapcolor = Color(spl[1].ToInt(),spl[2].ToInt(),spl[3].ToInt());
|
||||
}
|
||||
cli.ent.Push(li);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void MapStartDialogues()
|
||||
{
|
||||
int whichboss = WhichVanillaBossMap();
|
||||
|
|
@ -388,9 +324,6 @@ extend Class SWWMHandler
|
|||
}
|
||||
break;
|
||||
}
|
||||
// setup cached lockdefs data
|
||||
let cli = SWWMCachedLockInfo.GetInstance();
|
||||
if ( cli.ent.Size() == 0 ) SetupLockdefsCache(cli);
|
||||
// for skipping over merged exit lines (sharing vertices)
|
||||
Array<Line> skipme;
|
||||
skipme.Clear();
|
||||
|
|
|
|||
|
|
@ -89,7 +89,8 @@ Class SWWMStaticHandler : StaticEventHandler
|
|||
for ( int i=0; i<MAXPLAYERS; i++ )
|
||||
{
|
||||
if ( !playeringame[i] || !(players[i].mo is 'Demolitionist') ) continue;
|
||||
Demolitionist(players[i].mo).CheckUnderwaterAmb(true);
|
||||
let demo = Demolitionist(players[i].mo);
|
||||
demo.CheckUnderwaterAmb(true);
|
||||
}
|
||||
}
|
||||
SWWMHandler.ClearAllShaders();
|
||||
|
|
@ -210,7 +211,7 @@ Class SWWMStaticHandler : StaticEventHandler
|
|||
if ( (gamestate != GS_LEVEL) || !swwm_showmaptitle ) return;
|
||||
StatusBar.AttachMessage(new("DSMapTitle").Init(),-7777);
|
||||
}
|
||||
else if ( e.Name ~== "swwmflushud" )
|
||||
else if ( e.Name ~== "swwmflushhud" )
|
||||
{
|
||||
if ( !(StatusBar is 'SWWMStatusBar') ) return;
|
||||
SWWMStatusBar(StatusBar).Flush();
|
||||
|
|
|
|||
|
|
@ -517,7 +517,7 @@ extend Class SWWMStatusBar
|
|||
else if ( mm_displaylocks
|
||||
&& (lock > 0) && (lock < 256) )
|
||||
{
|
||||
let lcol = SWWMUtility.GetLockColor(lock);
|
||||
let lcol = Key.GetMapColorForLock(lock);
|
||||
if ( !lcol )
|
||||
{
|
||||
// "all keys" locks lack a color
|
||||
|
|
|
|||
|
|
@ -704,7 +704,7 @@ Class ChanceboxSpawner : Actor
|
|||
if ( tbox[3] < l.bbox[2] ) continue;
|
||||
if ( tbox[0] < l.bbox[1] ) continue;
|
||||
if ( tbox[1] > l.bbox[0] ) continue;
|
||||
if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue;
|
||||
if ( Level.BoxOnLineSide(pos.xy,32,l) != -1 ) continue;
|
||||
// there isn't enough space to spawn a box here
|
||||
let b = Spawn("HealthNuggetItem",pos);
|
||||
SWWMUtility.TransferItemProp(self,b);
|
||||
|
|
@ -1032,7 +1032,7 @@ Class Chancebox : Actor
|
|||
if ( tbox[3] < l.bbox[2] ) continue;
|
||||
if ( tbox[0] < l.bbox[1] ) continue;
|
||||
if ( tbox[1] > l.bbox[0] ) continue;
|
||||
if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue;
|
||||
if ( Level.BoxOnLineSide(testpos.xy,32,l) != -1 ) continue;
|
||||
blocked = true;
|
||||
break;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -457,7 +457,7 @@ Class CompanionLamp : Actor
|
|||
{
|
||||
// push away from wall
|
||||
Vector3 normal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit();
|
||||
if ( !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) ) normal *= -1;
|
||||
if ( !Level.PointOnLineSide(pos.xy,BlockingLine) ) normal *= -1;
|
||||
vel += 4.*normal;
|
||||
blocked = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,13 +42,14 @@ Class Demolitionist : PlayerPawn
|
|||
|
||||
double guideangle, guidepitch, guideroll;
|
||||
|
||||
// for weapon bobbing stuff
|
||||
// for weapon bobbing and stuff
|
||||
double bumpvelz, bumpangle, bumppitch, bumproll;
|
||||
double oldangle, oldpitch, oldroll;
|
||||
double oldlagangle, oldlagpitch, oldlagroll, oldlagready;
|
||||
Vector3 oldlagvel;
|
||||
double lagangle, lagpitch, lagroll, lagready;
|
||||
Vector3 lagvel;
|
||||
|
||||
Vector3 oldangles;
|
||||
Vector3 oldlagangles, lagangles;
|
||||
Vector3 oldlagdangles, lagdangles;
|
||||
Vector3 oldlagvel, lagvel;
|
||||
double oldlagready, lagready;
|
||||
|
||||
enum EUnderType
|
||||
{
|
||||
|
|
@ -143,6 +144,8 @@ Class Demolitionist : PlayerPawn
|
|||
Player.ForwardMove 1., 1.;
|
||||
Player.SideMove 1., 1.;
|
||||
Player.SoundClass "demolitionist";
|
||||
Player.FlyBob 0.;
|
||||
Player.WaterClimbSpeed 0.;
|
||||
DamageFactor "Drowning", 0.;
|
||||
DamageFactor "Poison", 0.;
|
||||
DamageFactor "PoisonCloud", 0.;
|
||||
|
|
@ -180,6 +183,8 @@ Class Demolitionist : PlayerPawn
|
|||
Super.PostBeginPlay();
|
||||
lastground = true; // prevent sudden landing sound on map start
|
||||
blinktime = 30;
|
||||
// prevent jumpy weapon bob on game start
|
||||
oldangles = (angle,pitch,roll);
|
||||
// swap ourselves for a voodoo doll
|
||||
if ( !player || (player.mo != self) )
|
||||
{
|
||||
|
|
@ -327,7 +332,7 @@ Class Demolitionist : PlayerPawn
|
|||
if ( tbox[3] < l.bbox[2] ) continue;
|
||||
if ( tbox[0] < l.bbox[1] ) continue;
|
||||
if ( tbox[1] > l.bbox[0] ) continue;
|
||||
if ( SWWMUtility.BoxOnLineSide(tbox[0],tbox[1],tbox[2],tbox[3],l) != -1 ) continue;
|
||||
if ( Level.BoxOnLineSide(pos.xy,radius+8,l) != -1 ) continue;
|
||||
touching.Push(l);
|
||||
}
|
||||
let pi = swwm_PolyobjectIterator.Create();
|
||||
|
|
@ -441,8 +446,8 @@ Class Demolitionist : PlayerPawn
|
|||
return SWWMUtility.LerpVector2(prevbob,bob,ticfrac)*bobstr*clamp(viewbob,0.,1.5);
|
||||
}
|
||||
|
||||
// [4.11] proper 3D/2D weapon bob separation
|
||||
/*override Vector3, Vector3 BobWeapon3D( double ticfrac )
|
||||
// proper 3D weapon bob
|
||||
override Vector3, Vector3 BobWeapon3D( double ticfrac )
|
||||
{
|
||||
if ( !player || !player.ReadyWeapon || player.ReadyWeapon.bDontBob )
|
||||
return (0,0,0), (0,0,0);
|
||||
|
|
@ -450,33 +455,26 @@ Class Demolitionist : PlayerPawn
|
|||
player.WeaponState |= WF_WEAPONBOBBING; // always bob
|
||||
Vector2 cur = BobWeaponAngle(ticfrac);
|
||||
if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING;
|
||||
double fangle = SWWMUtility.Lerp(oldangle,angle,ticfrac);
|
||||
double fpitch = SWWMUtility.Lerp(oldpitch,pitch,ticfrac);
|
||||
double froll = SWWMUtility.Lerp(oldroll,roll,ticfrac);
|
||||
double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac);
|
||||
double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac);
|
||||
double flagroll = SWWMUtility.Lerp(oldlagroll,lagroll,ticfrac);
|
||||
double diffang = fangle-flagangle;
|
||||
double diffpitch = fpitch-flagpitch;
|
||||
double diffroll = froll-flagroll;
|
||||
if ( abs(diffang) > 1. )
|
||||
Vector3 angles = SWWMUtility.LerpVector3(oldlagangles,lagangles,ticfrac);
|
||||
Vector3 dangles = SWWMUtility.LerpVector3(oldlagdangles,lagdangles,ticfrac);
|
||||
if ( abs(dangles.x) > 1. )
|
||||
{
|
||||
int sgn = (diffang>0)?1:-1;
|
||||
diffang = abs(diffang)**.7*sgn;
|
||||
int sgn = (dangles.x>0)?1:-1;
|
||||
dangles.x = abs(dangles.x)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffpitch) > 1. )
|
||||
if ( abs(dangles.y) > 1. )
|
||||
{
|
||||
int sgn = (diffpitch>0)?1:-1;
|
||||
diffpitch = abs(diffpitch)**.7*sgn;
|
||||
int sgn = (dangles.y>0)?1:-1;
|
||||
dangles.y = abs(dangles.y)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffroll) > 1. )
|
||||
if ( abs(dangles.z) > 1. )
|
||||
{
|
||||
int sgn = (diffroll>0)?1:-1;
|
||||
diffroll = abs(diffroll)**.7*sgn;
|
||||
int sgn = (dangles.z>0)?1:-1;
|
||||
dangles.z = abs(dangles.z)**.75*sgn;
|
||||
}
|
||||
Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(flagangle,flagpitch,flagroll);
|
||||
let [x2, y2, z2] = SWWMUtility.GetAxes(flagangle,0,flagroll);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(angles.x,angles.y,angles.z);
|
||||
let [x2, y2, z2] = SWWMUtility.GetAxes(angles.x,0,angles.z);
|
||||
double diffx = flagvel dot x;
|
||||
double diffy = flagvel dot y;
|
||||
double diffz = flagvel dot z;
|
||||
|
|
@ -485,35 +483,35 @@ Class Demolitionist : PlayerPawn
|
|||
if ( abs(diffx) > 1. )
|
||||
{
|
||||
int sgn = (diffx>0)?1:-1;
|
||||
diffx = abs(diffx)**.5*sgn;
|
||||
diffx = abs(diffx)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffy) > 1. )
|
||||
{
|
||||
int sgn = (diffy>0)?1:-1;
|
||||
diffy = abs(diffy)**.5*sgn;
|
||||
diffy = abs(diffy)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffz) > 1. )
|
||||
{
|
||||
int sgn = (diffz>0)?1:-1;
|
||||
diffz = abs(diffz)**.5*sgn;
|
||||
diffz = abs(diffz)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffy2) > 1. )
|
||||
{
|
||||
int sgn = (diffy2>0)?1:-1;
|
||||
diffy2 = abs(diffy2)**.5*sgn;
|
||||
diffy2 = abs(diffy2)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffz2) > 1. )
|
||||
{
|
||||
int sgn = (diffz2>0)?1:-1;
|
||||
diffz2 = abs(diffz2)**.5*sgn;
|
||||
diffz2 = abs(diffz2)**.75*sgn;
|
||||
}
|
||||
Vector3 bobvec = (diffy,-diffz,diffx)*20. + (cur.x,-cur.y,0)*10.;
|
||||
Vector3 bobang = (diffang,diffpitch,diffroll)*.1 - (cur.x,cur.y,0)*.04 - (diffy2,diffz2,0)*.2;
|
||||
Vector3 bobvec = (diffy,-diffz,diffx)*20. + (cur.x,-cur.y,cur.y)*15.;
|
||||
Vector3 bobang = (dangles.x,dangles.y,dangles.z)*.15 - (cur.x,cur.y,-cur.x*2.)*.05 - (diffy2,diffz2,0)*.02;
|
||||
double fready = SWWMUtility.Lerp(oldlagready,lagready,ticfrac);
|
||||
return bobvec*fready, bobang*fready;
|
||||
}
|
||||
|
||||
// compatibility with 2D weapons
|
||||
// compatibility with 2D weapons (may cause sprite cutoff)
|
||||
override Vector2 BobWeapon( double ticfrac )
|
||||
{
|
||||
if ( !player || !player.ReadyWeapon || player.ReadyWeapon.bDontBob )
|
||||
|
|
@ -522,88 +520,36 @@ Class Demolitionist : PlayerPawn
|
|||
player.WeaponState |= WF_WEAPONBOBBING; // always bob
|
||||
Vector2 cur = BobWeaponAngle(ticfrac);
|
||||
if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING;
|
||||
double fangle = SWWMUtility.Lerp(oldangle,angle,ticfrac);
|
||||
double fpitch = SWWMUtility.Lerp(oldpitch,pitch,ticfrac);
|
||||
double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac);
|
||||
double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac);
|
||||
double diffang = fangle-flagangle;
|
||||
double diffpitch = fpitch-flagpitch;
|
||||
if ( abs(diffang) > 1. )
|
||||
Vector3 angles = SWWMUtility.LerpVector3(oldlagangles,lagangles,ticfrac);
|
||||
Vector3 dangles = SWWMUtility.LerpVector3(oldlagdangles,lagdangles,ticfrac);
|
||||
if ( abs(dangles.x) > 1. )
|
||||
{
|
||||
int sgn = (diffang>0)?1:-1;
|
||||
diffang = abs(diffang)**.7*sgn;
|
||||
int sgn = (dangles.x>0)?1:-1;
|
||||
dangles.x = abs(dangles.x)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffpitch) > 1. )
|
||||
if ( abs(dangles.y) > 1. )
|
||||
{
|
||||
int sgn = (diffpitch>0)?1:-1;
|
||||
diffpitch = abs(diffpitch)**.7*sgn;
|
||||
int sgn = (dangles.y>0)?1:-1;
|
||||
dangles.y = abs(dangles.y)**.75*sgn;
|
||||
}
|
||||
cur.x += diffang*.4;
|
||||
cur.y -= diffpitch*.4;
|
||||
cur.x += dangles.x*.4;
|
||||
cur.y -= dangles.y*.4;
|
||||
Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac);
|
||||
double flagroll = SWWMUtility.Lerp(oldlagroll,lagroll,ticfrac);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(flagangle,0,flagroll);
|
||||
let [x, y, z] = SWWMUtility.GetAxes(angles.x,0,angles.z);
|
||||
double diffy = flagvel dot y;
|
||||
double diffz = flagvel dot z;
|
||||
if ( abs(diffy) > 1. )
|
||||
{
|
||||
int sgn = (diffy>0)?1:-1;
|
||||
diffy = abs(diffy)**.5*sgn;
|
||||
diffy = abs(diffy)**.75*sgn;
|
||||
}
|
||||
if ( abs(diffz) > 1. )
|
||||
{
|
||||
int sgn = (diffz>0)?1:-1;
|
||||
diffz = abs(diffz)**.5*sgn;
|
||||
diffz = abs(diffz)**.75*sgn;
|
||||
}
|
||||
cur.x -= diffy*.8;
|
||||
cur.y += diffz*.8;
|
||||
return cur*SWWMUtility.Lerp(oldlagready,lagready,ticfrac);
|
||||
}*/
|
||||
|
||||
override Vector2 BobWeapon( double ticfrac )
|
||||
{
|
||||
if ( !player || !player.ReadyWeapon || player.ReadyWeapon.bDontBob )
|
||||
return (0,0);
|
||||
bool oldbob = !!(player.WeaponState&WF_WEAPONBOBBING);
|
||||
player.WeaponState |= WF_WEAPONBOBBING; // always bob
|
||||
Vector2 cur = BobWeaponAngle(ticfrac);
|
||||
if ( !oldbob ) player.WeaponState &= ~WF_WEAPONBOBBING;
|
||||
double fangle = SWWMUtility.Lerp(oldangle,angle,ticfrac);
|
||||
double fpitch = SWWMUtility.Lerp(oldpitch,pitch,ticfrac);
|
||||
double flagangle = SWWMUtility.Lerp(oldlagangle,lagangle,ticfrac);
|
||||
double flagpitch = SWWMUtility.Lerp(oldlagpitch,lagpitch,ticfrac);
|
||||
double diffang = fangle-flagangle;
|
||||
double diffpitch = fpitch-flagpitch;
|
||||
if ( abs(diffang) > 1. )
|
||||
{
|
||||
int sgn = (diffang>0)?1:-1;
|
||||
diffang = abs(diffang)**.7*sgn;
|
||||
}
|
||||
if ( abs(diffpitch) > 1. )
|
||||
{
|
||||
int sgn = (diffpitch>0)?1:-1;
|
||||
diffpitch = abs(diffpitch)**.7*sgn;
|
||||
}
|
||||
cur.x += diffang*.4;
|
||||
cur.y -= diffpitch*.4;
|
||||
Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac);
|
||||
double flagroll = SWWMUtility.Lerp(oldlagroll,lagroll,ticfrac);
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = SWWMUtility.GetAxes(flagangle,0,flagroll);
|
||||
double diffy = flagvel dot y;
|
||||
double diffz = flagvel dot z;
|
||||
if ( abs(diffy) > 1. )
|
||||
{
|
||||
int sgn = (diffy>0)?1:-1;
|
||||
diffy = abs(diffy)**.5*sgn;
|
||||
}
|
||||
if ( abs(diffz) > 1. )
|
||||
{
|
||||
int sgn = (diffz>0)?1:-1;
|
||||
diffz = abs(diffz)**.5*sgn;
|
||||
}
|
||||
cur.x -= diffy*.8;
|
||||
cur.y += diffz*.8;
|
||||
cur.x -= diffy*.4;
|
||||
cur.y += diffz*.4;
|
||||
return cur*SWWMUtility.Lerp(oldlagready,lagready,ticfrac);
|
||||
}
|
||||
|
||||
|
|
@ -752,6 +698,13 @@ Class Demolitionist : PlayerPawn
|
|||
dashboost = 0.;
|
||||
// prevent sudden stomping if we were previously falling
|
||||
lastvelz = vel.z;
|
||||
// clear bob data
|
||||
oldlagangles = lagangles = oldangles = (angle,pitch,roll);
|
||||
oldlagdangles = lagdangles = (0.,0.,0.);
|
||||
oldlagvel = lagvel = vel;
|
||||
bumpvelz = bumpangle = bumppitch = bumproll = 0.;
|
||||
ViewAngle = ViewPitch = ViewRoll = 0.;
|
||||
SetViewPos((0.,0.,0.));
|
||||
// early cancel gestures
|
||||
if ( player )
|
||||
{
|
||||
|
|
@ -783,14 +736,15 @@ Class Demolitionist : PlayerPawn
|
|||
// reset all smooth bob variables if angles/velocity aren't carried over
|
||||
if ( !(flags&TELF_KEEPORIENTATION) )
|
||||
{
|
||||
oldlagangle = lagangle = oldangle = angle;
|
||||
oldlagpitch = lagpitch = oldpitch = pitch;
|
||||
oldlagroll = lagroll = oldroll = roll;
|
||||
oldlagangles = lagangles = oldangles = (angle,pitch,roll);
|
||||
oldlagdangles = lagdangles = (0.,0.,0.);
|
||||
bumpangle = bumppitch = bumproll = 0.;
|
||||
}
|
||||
if ( !(flags&TELF_KEEPVELOCITY) )
|
||||
{
|
||||
oldlagvel = lagvel = vel;
|
||||
lastvelz = vel.z;
|
||||
bumpvelz = 0.;
|
||||
}
|
||||
// notify carried lamp that we just moved
|
||||
let l = SWWMLamp(FindInventory("SWWMLamp"));
|
||||
|
|
|
|||
|
|
@ -185,9 +185,7 @@ extend Class Demolitionist
|
|||
|
||||
override void PlayerThink()
|
||||
{
|
||||
oldangle = angle;
|
||||
oldpitch = pitch;
|
||||
oldroll = roll;
|
||||
oldangles = (angle,pitch,roll);
|
||||
if ( player && (player.mo == self) && (player.playerstate != PST_DEAD) && (player.cmd.buttons&BT_USE) )
|
||||
{
|
||||
if ( !player.usedown ) lastuse = gametic;
|
||||
|
|
@ -219,12 +217,10 @@ extend Class Demolitionist
|
|||
}
|
||||
}
|
||||
else if ( gametic > lastuse+50 ) failcounter = 0;
|
||||
oldlagangle = lagangle;
|
||||
oldlagpitch = lagpitch;
|
||||
oldlagroll = lagroll;
|
||||
lagangle = lagangle*.8+angle*.2;
|
||||
lagpitch = lagpitch*.8+pitch*.2;
|
||||
lagroll = lagroll*.8+roll*.2;
|
||||
oldlagangles = lagangles;
|
||||
lagangles = lagangles*.8+(angle,pitch,roll)*.2;
|
||||
oldlagdangles = lagdangles;
|
||||
lagdangles = lagdangles*.8+(deltaangle(oldangles.x,angle),deltaangle(oldangles.y,pitch),deltaangle(oldangles.z,roll))*.2;
|
||||
if ( !player || (player.mo != self) ) return;
|
||||
if ( (player.playerstate != PST_DEAD) && (player.jumptics != 0) )
|
||||
{
|
||||
|
|
@ -246,6 +242,7 @@ extend Class Demolitionist
|
|||
|
||||
override void DeathThink()
|
||||
{
|
||||
oldangles = (angle,pitch,roll);
|
||||
player.Uncrouch();
|
||||
TickPSprites();
|
||||
player.onground = (pos.Z<=floorz);
|
||||
|
|
@ -261,6 +258,11 @@ extend Class Demolitionist
|
|||
double droll = clamp(deltaangle(roll,50)*.5,-5,5);
|
||||
if ( abs(droll) < 2. ) roll = 50.;
|
||||
else A_SetRoll(roll+droll,SPF_INTERPOLATE);
|
||||
// bob interpolation still active
|
||||
oldlagangles = lagangles;
|
||||
lagangles = lagangles*.8+(angle,pitch,roll)*.2;
|
||||
oldlagdangles = lagdangles;
|
||||
lagdangles = lagdangles*.8+(deltaangle(oldangles.x,angle),deltaangle(oldangles.y,pitch),deltaangle(oldangles.z,roll))*.2;
|
||||
player.mo.CalcHeight();
|
||||
if ( player.damagecount ) player.damagecount--;
|
||||
if ( player.poisoncount ) player.poisoncount--;
|
||||
|
|
|
|||
|
|
@ -427,7 +427,7 @@ extend Class Demolitionist
|
|||
}
|
||||
if ( abs(bumpvelz) > double.epsilon )
|
||||
{
|
||||
lagvel.z += bumpvelz*.2;
|
||||
lagvel.z += bumpvelz*.5;
|
||||
bumpvelz *= .8;
|
||||
}
|
||||
Vector3 temp = (ViewAngle,ViewPitch,ViewRoll);
|
||||
|
|
@ -712,7 +712,7 @@ extend Class Demolitionist
|
|||
{
|
||||
Vector3 wallnorm = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit();
|
||||
int lside = 1;
|
||||
if ( !BlockingLine.sidedef[1] || !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) )
|
||||
if ( !BlockingLine.sidedef[1] || !Level.PointOnLineSide(pos.xy,BlockingLine) )
|
||||
{
|
||||
lside = 0;
|
||||
wallnorm *= -1;
|
||||
|
|
|
|||
|
|
@ -216,7 +216,7 @@ Class LoveHeart : Actor
|
|||
{
|
||||
HitLine = BlockingLine;
|
||||
// which side and part we hit?
|
||||
LineSide = SWWMUtility.PointOnLineSide(pos.xy,BlockingLine);
|
||||
LineSide = Level.PointOnLineSide(pos.xy,BlockingLine);
|
||||
double fl, cl;
|
||||
if ( BlockingLine.sidedef[1] )
|
||||
{
|
||||
|
|
@ -433,7 +433,7 @@ Class LoveHeart : Actor
|
|||
// use line
|
||||
if ( BlockingLine )
|
||||
{
|
||||
int s = SWWMUtility.PointOnLineSide(pos.xy,BlockingLine);
|
||||
int s = Level.PointOnLineSide(pos.xy,BlockingLine);
|
||||
int locknum = SWWMUtility.GetLineLock(BlockingLine);
|
||||
if ( !locknum || (target && target.CheckKeys(locknum,false,true)) )
|
||||
BlockingLine.RemoteActivate(target,s,SPAC_Use,pos);
|
||||
|
|
|
|||
|
|
@ -169,58 +169,6 @@ Class SWWMCrusherBroken : Thinker
|
|||
}
|
||||
}
|
||||
|
||||
// cache data for manual lockdefs parsing nonsense
|
||||
Class LIEntry
|
||||
{
|
||||
int locknumber;
|
||||
bool hascolor;
|
||||
Color mapcolor;
|
||||
}
|
||||
|
||||
Class SWWMCachedLockInfo : SWWMStaticThinker
|
||||
{
|
||||
Array<LIEntry> ent;
|
||||
|
||||
static clearscope bool IsValidLock( int l )
|
||||
{
|
||||
let ti = ThinkerIterator.Create("SWWMCachedLockInfo",STAT_STATIC);
|
||||
SWWMCachedLockInfo cli = SWWMCachedLockInfo(ti.Next());
|
||||
if ( !cli ) return false;
|
||||
foreach ( e:cli.ent )
|
||||
{
|
||||
if ( e.locknumber == l )
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static clearscope Color GetLockColor( int l )
|
||||
{
|
||||
let ti = ThinkerIterator.Create("SWWMCachedLockInfo",STAT_STATIC);
|
||||
SWWMCachedLockInfo cli = SWWMCachedLockInfo(ti.Next());
|
||||
if ( !cli ) return -1;
|
||||
foreach ( e:cli.ent )
|
||||
{
|
||||
if ( e.locknumber == l )
|
||||
{
|
||||
if ( e.hascolor ) return e.mapcolor;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
static SWWMCachedLockInfo GetInstance()
|
||||
{
|
||||
let ti = ThinkerIterator.Create("SWWMCachedLockInfo",STAT_STATIC);
|
||||
SWWMCachedLockInfo cli = SWWMCachedLockInfo(ti.Next());
|
||||
if ( cli ) return cli;
|
||||
cli = new("SWWMCachedLockInfo");
|
||||
cli.ChangeStatNum(STAT_STATIC);
|
||||
return cli;
|
||||
}
|
||||
}
|
||||
|
||||
Class SWWMCorpseCleaner : Thinker
|
||||
{
|
||||
transient ThinkerIterator ti;
|
||||
|
|
|
|||
|
|
@ -9,68 +9,6 @@ enum EExitType
|
|||
|
||||
extend Class SWWMUtility
|
||||
{
|
||||
// how the fuck is this not available to ZScript?
|
||||
// copied from P_PointOnLineSidePrecise()
|
||||
deprecated("4.11", "Use Level.PointOnLineSide() instead") static int PointOnLineSide( Vector2 p, Line l )
|
||||
{
|
||||
if ( !l ) return 0;
|
||||
return (((p.y-l.v1.p.y)*l.delta.x+(l.v1.p.x-p.x)*l.delta.y) > double.epsilon);
|
||||
}
|
||||
|
||||
// haha another one
|
||||
// copied from BoxOnLineSide()
|
||||
deprecated("4.11", "Use Level.BoxOnLineSide() instead") static int BoxOnLineSide( double top, double bottom, double left, double right, Line l )
|
||||
{
|
||||
if ( !l ) return 0;
|
||||
int p1, p2;
|
||||
if ( l.delta.x == 0 )
|
||||
{
|
||||
// ST_VERTICAL:
|
||||
p1 = (right < l.v1.p.x);
|
||||
p2 = (left < l.v1.p.x);
|
||||
if ( l.delta.y < 0 )
|
||||
{
|
||||
p1 ^= 1;
|
||||
p2 ^= 1;
|
||||
}
|
||||
}
|
||||
else if ( l.delta.y == 0 )
|
||||
{
|
||||
// ST_HORIZONTAL:
|
||||
p1 = (top > l.v1.p.y);
|
||||
p2 = (bottom > l.v1.p.y);
|
||||
if ( l.delta.x < 0 )
|
||||
{
|
||||
p1 ^= 1;
|
||||
p2 ^= 1;
|
||||
}
|
||||
}
|
||||
else if ( (l.delta.x*l.delta.y) >= 0 )
|
||||
{
|
||||
// ST_POSITIVE:
|
||||
p1 = PointOnLineSide((left,top),l);
|
||||
p2 = PointOnLineSide((right,bottom),l);
|
||||
}
|
||||
else
|
||||
{
|
||||
// ST_NEGATIVE:
|
||||
p1 = PointOnLineSide((right,top),l);
|
||||
p2 = PointOnLineSide((left,bottom),l);
|
||||
}
|
||||
return (p1==p2)?p1:-1;
|
||||
}
|
||||
|
||||
// wrapper
|
||||
deprecated("4.11", "Use Level.ActorOnLineSide() instead") static int ActorOnLineSide( Actor a, Line l )
|
||||
{
|
||||
double box[4];
|
||||
box[0] = a.pos.y+a.radius;
|
||||
box[1] = a.pos.y-a.radius;
|
||||
box[2] = a.pos.x-a.radius;
|
||||
box[3] = a.pos.x+a.radius;
|
||||
return BoxOnLineSide(box[0],box[1],box[2],box[3],l);
|
||||
}
|
||||
|
||||
// Thanks to ZZYZX and Nash
|
||||
static play void SetToSlopeSpecific( Actor a, double dang, SecPlane plane, bool flipnorm )
|
||||
{
|
||||
|
|
@ -208,17 +146,6 @@ extend Class SWWMUtility
|
|||
return false;
|
||||
}
|
||||
|
||||
deprecated("4.11","Use Key.IsLockDefined() instead") static bool IsValidLockNum( int l )
|
||||
{
|
||||
if ( (l < 1) || (l > 255) ) return true;
|
||||
return SWWMCachedLockInfo.IsValidLock(l);
|
||||
}
|
||||
|
||||
deprecated("4.11","Use Key.GetMapColorForLock() instead") static Color GetLockColor( int l )
|
||||
{
|
||||
return SWWMCachedLockInfo.GetLockColor(l);
|
||||
}
|
||||
|
||||
static bool IsDoorSector( Sector s, int part )
|
||||
{
|
||||
// super-easy mode: check for boss special sectors
|
||||
|
|
@ -586,7 +513,7 @@ extend Class SWWMUtility
|
|||
else if ( a.BlockingLine && BlockingLineIsBlocking(a,Line.ML_BLOCKEVERYTHING|Line.ML_BLOCKPROJECTILE,a.BlockingLine) )
|
||||
{
|
||||
HitNormal = (-a.BlockingLine.delta.y,a.BlockingLine.delta.x,0).unit();
|
||||
if ( !SWWMUtility.PointOnLineSide(a.pos.xy,a.BlockingLine) )
|
||||
if ( !Level.PointOnLineSide(a.pos.xy,a.BlockingLine) )
|
||||
HitNormal *= -1;
|
||||
}
|
||||
else
|
||||
|
|
@ -747,6 +674,6 @@ extend Class SWWMUtility
|
|||
}
|
||||
}
|
||||
// is the point behind both lines?
|
||||
return (PointOnLineSide(p,a) && PointOnLineSide(p,b));
|
||||
return (Level.PointOnLineSide(p,a) && Level.PointOnLineSide(p,b));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -223,7 +223,7 @@ Class BusterWall : Thinker
|
|||
else if ( a.BlockingLine && SWWMUtility.BlockingLineIsBlocking(a,Line.ML_BLOCKEVERYTHING|Line.ML_BLOCKPROJECTILE,a.BlockingLine) )
|
||||
{
|
||||
HitNormal = (-a.BlockingLine.delta.y,a.BlockingLine.delta.x,0).unit();
|
||||
int wside = SWWMUtility.PointOnLineSide(a.pos.xy,a.BlockingLine);
|
||||
int wside = Level.PointOnLineSide(a.pos.xy,a.BlockingLine);
|
||||
if ( !wside ) HitNormal *= -1;
|
||||
faketracer.Results.HitType = TRACE_HitWall;
|
||||
faketracer.Results.HitLine = a.BlockingLine;
|
||||
|
|
|
|||
|
|
@ -440,7 +440,7 @@ Class EvisceratorProj : Actor
|
|||
else if ( BlockingLine )
|
||||
{
|
||||
spawnofs = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit()*4;
|
||||
if ( !SWWMUtility.PointOnLineSide(pos.xy,BlockingLine) )
|
||||
if ( !Level.PointOnLineSide(pos.xy,BlockingLine) )
|
||||
spawnofs *= -1;
|
||||
}
|
||||
int trail = 0;
|
||||
|
|
|
|||
|
|
@ -393,7 +393,7 @@ Class ExplodiumMagAttach : ExplodiumMagProj
|
|||
{
|
||||
atline = BlockingLine;
|
||||
normal = (-BlockingLine.delta.y,BlockingLine.delta.x,0).unit();
|
||||
atside = SWWMUtility.PointOnLineSide(pos.xy,BlockingLine);
|
||||
atside = Level.PointOnLineSide(pos.xy,BlockingLine);
|
||||
if ( !atside ) normal *= -1;
|
||||
Vector3 orig = (BlockingLine.v1.p.x,BlockingLine.v1.p.y,0);
|
||||
Vector3 onwall = pos-(normal dot (pos-orig))*normal;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue