Today's progress. A whole lot of stuff added, and some cleanup too.
Fixed the sizes and offsets of player models. Adjusted weapon offsets to be more in line with the originals. Implemented all armors and most of the usable items. Add lights to some item pickups. This might get done to DT too. Key display on both HUD types, along with some fixes. ASMD has complete animations. Other weapons will follow.
This commit is contained in:
parent
76cd3a5207
commit
8da5167e59
39 changed files with 1488 additions and 371 deletions
|
|
@ -88,14 +88,15 @@ Class UnrealBackpack : BackpackItem replaces Backpack
|
|||
Super.DoPickupSpecial(toucher);
|
||||
if ( gameinfo.gametype&GAME_DOOMCHEX )
|
||||
{
|
||||
static const Class<Inventory> xitems[] = {"Flare", "Seeds", "SentryItem", "VoiceBox", "ForceField", "Dampener"};
|
||||
int xitemn[6];
|
||||
xitemn[0] = max(0,Random[BackpackExtra](-3,5));
|
||||
xitemn[1] = max(0,Random[BackpackExtra](-3,5));
|
||||
xitemn[2] = max(0,Random[BackpackExtra](-4,1));
|
||||
static const Class<Inventory> xitems[] = {"Flare", "Seeds", "SentryItem", "VoiceBox", "ForceField", "Dampener", "Peacemaker"};
|
||||
int xitemn[7];
|
||||
xitemn[0] = max(0,Random[BackpackExtra](-1,3));
|
||||
xitemn[1] = max(0,Random[BackpackExtra](-1,3));
|
||||
xitemn[2] = max(0,Random[BackpackExtra](-2,1));
|
||||
xitemn[3] = max(0,Random[BackpackExtra](-2,1));
|
||||
xitemn[4] = max(0,Random[BackpackExtra](-3,1));
|
||||
xitemn[5] = max(0,Random[BackpackExtra](-2,1));
|
||||
xitemn[4] = max(0,Random[BackpackExtra](-2,1));
|
||||
xitemn[5] = max(0,Random[BackpackExtra](-1,1));
|
||||
xitemn[6] = max(0,Random[BackpackExtra](-2,1));
|
||||
// random doubling
|
||||
if ( !Random[BackpackExtra](0,4) ) xitemn[0] *= 2;
|
||||
if ( !Random[BackpackExtra](0,4) ) xitemn[1] *= 2;
|
||||
|
|
@ -103,11 +104,12 @@ Class UnrealBackpack : BackpackItem replaces Backpack
|
|||
if ( !Random[BackpackExtra](0,7) ) xitemn[3] *= 2;
|
||||
if ( !Random[BackpackExtra](0,6) ) xitemn[4] *= 2;
|
||||
if ( !Random[BackpackExtra](0,5) ) xitemn[5] *= 2;
|
||||
if ( !Random[BackpackExtra](0,9) ) xitemn[6] *= 2;
|
||||
int total = 0;
|
||||
for ( int i=0; i<6; i++ ) total += xitemn[i];
|
||||
for ( int i=0; i<7; i++ ) total += xitemn[i];
|
||||
if ( total <= 0 ) return;
|
||||
String extratxt = StringTable.Localize("$I_BACKPACKEXTRA");
|
||||
for ( int i=0; i<6; i++ )
|
||||
for ( int i=0; i<7; i++ )
|
||||
{
|
||||
if ( xitemn[i] <= 0 ) continue;
|
||||
extratxt = extratxt..String.Format("%dx %s, ",xitemn[i],GetDefaultByType(xitems[i]).GetTag());
|
||||
|
|
@ -187,6 +189,167 @@ Class UTranslator : UnrealInventory
|
|||
|
||||
Class VoiceBox : UnrealInventory
|
||||
{
|
||||
Actor box;
|
||||
|
||||
Default
|
||||
{
|
||||
Tag "$T_VOICEBOX";
|
||||
Inventory.PickupMessage "$I_VOICEBOX";
|
||||
Inventory.Icon "I_VoiceB";
|
||||
Inventory.MaxAmount 5;
|
||||
UnrealInventory.Charge 600;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( bActive )
|
||||
{
|
||||
if ( box ) Charge = box.ReactionTime;
|
||||
else
|
||||
{
|
||||
Charge = DefaultCharge;
|
||||
bActive = false;
|
||||
Amount--;
|
||||
if ( Amount <= 0 ) DepleteOrDestroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
override bool Use( bool pickup )
|
||||
{
|
||||
if ( pickup || bActive ) return false;
|
||||
bActive = true;
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = dt_CoordUtil.GetAxes(Owner.pitch,Owner.angle,Owner.roll);
|
||||
Vector3 origin = Owner.Vec2OffsetZ(0,0,Owner.player.viewz);
|
||||
origin = level.Vec3Offset(origin,x*20.-z*8.);
|
||||
box = Spawn("VoiceBoxActive",origin);
|
||||
box.ReactionTime = Charge;
|
||||
box.vel = x*12.;
|
||||
box.vel.z += 3.;
|
||||
box.target = Owner;
|
||||
box.angle = Owner.angle;
|
||||
box.pitch = Owner.pitch;
|
||||
return false;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
VBOX A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class VoiceBoxHitbox : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "$T_VOICEBOX";
|
||||
Radius 6;
|
||||
Height 9;
|
||||
Health 60;
|
||||
+SHOOTABLE;
|
||||
+NOGRAVITY;
|
||||
+NOCLIP;
|
||||
+DONTSPLASH;
|
||||
+NOBLOOD;
|
||||
+NOTELEPORT;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !master )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
SetOrigin(master.pos,true);
|
||||
}
|
||||
override void Die( Actor source, Actor inflictor, int dmgflags, Name MeansOfDeath )
|
||||
{
|
||||
if ( master ) master.ReactionTime = 0;
|
||||
Super.Die(source,inflictor,dmgflags,MeansOfDeath);
|
||||
}
|
||||
}
|
||||
|
||||
Class VoiceBoxActive : Actor
|
||||
{
|
||||
Actor b;
|
||||
bool alreadyhit;
|
||||
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
b = Spawn("VoiceBoxHitbox",pos);
|
||||
b.master = self;
|
||||
}
|
||||
action void A_VoiceBoxPlay()
|
||||
{
|
||||
static const String BattleSounds[] =
|
||||
{
|
||||
"automag/shot",
|
||||
"utrl/explode",
|
||||
"automag/shot",
|
||||
"automag/shot",
|
||||
"flak/altfire",
|
||||
"utrl/explode",
|
||||
"flak/fire",
|
||||
"shock/fire",
|
||||
"stinger/hit2",
|
||||
"automag/shot"
|
||||
};
|
||||
if ( invoker.b ) invoker.b.A_AlertMonsters(0,AMF_TARGETEMITTER);
|
||||
for ( int i=0; i<10; i++ ) if ( !Random[Voicebox](0,30) ) A_PlaySound(BattleSounds[i],CHAN_AUTO,FRandom[Voicebox](0.5,1.0));
|
||||
}
|
||||
Default
|
||||
{
|
||||
Radius 6;
|
||||
Height 6;
|
||||
PROJECTILE;
|
||||
-NOGRAVITY;
|
||||
+USEBOUNCESTATE;
|
||||
+SKYEXPLODE;
|
||||
+MOVEWITHSECTOR;
|
||||
+CANBOUNCEWATER;
|
||||
BounceType "Hexen";
|
||||
BounceFactor 0.3;
|
||||
WallBounceFactor 0.3;
|
||||
Gravity 0.35;
|
||||
ReactionTime 200;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
VBOX A -1;
|
||||
Stop;
|
||||
Bounce:
|
||||
VBOX A 0
|
||||
{
|
||||
if ( alreadyhit )
|
||||
{
|
||||
ClearBounce();
|
||||
ExplodeMissile();
|
||||
}
|
||||
else
|
||||
{
|
||||
A_SetPitch(0);
|
||||
A_PlaySound("transloc/bounce");
|
||||
if ( BlockingFloor ) alreadyhit = true;
|
||||
}
|
||||
}
|
||||
Goto Spawn;
|
||||
Death:
|
||||
VBOX A 30;
|
||||
VBOX ABCDEFGHIJ 1
|
||||
{
|
||||
A_VoiceBoxPlay();
|
||||
ReactionTime--;
|
||||
return A_JumpIf(ReactionTime<=0,"Death2");
|
||||
}
|
||||
Goto Death+1;
|
||||
Death2:
|
||||
TNT1 A 1 A_Log("// TODO explosion");
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class Flare : UnrealInventory
|
||||
|
|
@ -209,14 +372,200 @@ Class Dampener : UnrealInventory
|
|||
if ( d && d.bActive ) return true;
|
||||
return false;
|
||||
}
|
||||
override bool Use( bool pickup )
|
||||
{
|
||||
if ( pickup ) return false;
|
||||
bActive = !bActive;
|
||||
Owner.A_PlaySound(bActive?"dampener/on":"dampener/off",CHAN_ITEM);
|
||||
return false;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !bActive ) return;
|
||||
if ( DrainCharge(1) )
|
||||
{
|
||||
Owner.A_PlaySound("dampener/off",CHAN_ITEM);
|
||||
PrintPickupMessage(true,StringTable.Localize("$D_DAMPENER"));
|
||||
}
|
||||
}
|
||||
Default
|
||||
{
|
||||
Tag "$T_DAMPENER";
|
||||
Inventory.PickupMessage "$I_DAMPENER";
|
||||
Inventory.Icon "I_Dampen";
|
||||
Inventory.MaxAmount 5;
|
||||
UnrealInventory.Charge 1000;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
DAMP A 8 A_CheckProximity(1,"PlayerPawn",80,1,CPXF_ANCESTOR|CPXF_CHECKSIGHT);
|
||||
Wait;
|
||||
DAMP ABC 8;
|
||||
DAMP DEFGHIJ 3;
|
||||
DAMP D 0 A_CheckProximity(1,"PlayerPawn",80,0,CPXF_ANCESTOR|CPXF_CHECKSIGHT|CPXF_EXACT);
|
||||
Goto Spawn+4;
|
||||
DAMP CBA 8;
|
||||
Goto Spawn;
|
||||
}
|
||||
}
|
||||
|
||||
Class Forcefield : UnrealInventory
|
||||
{
|
||||
Default
|
||||
{
|
||||
Tag "$T_FORCEFIELD";
|
||||
Inventory.PickupMessage "$I_FORCEFIELD";
|
||||
Inventory.Icon "I_ForceF";
|
||||
Inventory.MaxAmount 5;
|
||||
}
|
||||
override bool Use( bool pickup )
|
||||
{
|
||||
if ( pickup ) return false;
|
||||
Vector3 x, y, z;
|
||||
[x, y, z] = dt_CoordUtil.GetAxes(Owner.pitch,Owner.angle,Owner.roll);
|
||||
Vector3 origin = level.Vec3Offset(Owner.Vec2OffsetZ(0,0,Owner.player.viewz),x*90.);
|
||||
origin = level.Vec3Offset(origin,(0,0,-GetDefaultByType("ForceFieldEffect").Height*.5));
|
||||
if ( !level.IsPointInLevel(origin) )
|
||||
{
|
||||
PrintPickupMessage(true,StringTable.Localize("$M_FFNOROOM"));
|
||||
return false;
|
||||
}
|
||||
let a = Spawn("ForceFieldEffect",origin);
|
||||
if ( !a.TestMobjLocation() )
|
||||
{
|
||||
PrintPickupMessage(true,StringTable.Localize("$M_FFNOROOM"));
|
||||
a.Destroy();
|
||||
return false;
|
||||
}
|
||||
a.target = Owner;
|
||||
a.angle = Owner.angle;
|
||||
return true;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
tracer = Spawn("ForcefieldX",pos);
|
||||
tracer.angle = angle;
|
||||
tracer.target = self;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FFPK A -1;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class ForcefieldX : Actor
|
||||
{
|
||||
Default
|
||||
{
|
||||
RenderStyle "Add";
|
||||
+NOGRAVITY;
|
||||
+NOCLIP;
|
||||
+DONTSPLASH;
|
||||
Radius 0.1;
|
||||
Height 0;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !target )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
Warp(target,flags:WARPF_COPYINTERPOLATION|WARPF_NOCHECKPOSITION);
|
||||
bInvisible = target.bInvisible||!target.InStateSequence(target.CurState,target.FindState("Spawn"));
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FFPK A -1 Bright;
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class ForceFieldLight : DynamicLight
|
||||
{
|
||||
double cdown;
|
||||
Default
|
||||
{
|
||||
DynamicLight.Type "Point";
|
||||
+DYNAMICLIGHT.ATTENUATE;
|
||||
Args 0,0,0,100;
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !target )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
SetOrigin(target.Vec3Offset(0,0,target.height/2.),true);
|
||||
if ( isFrozen() ) return;
|
||||
args[LIGHT_RED] = int(255*cdown);
|
||||
args[LIGHT_BLUE] = int(255*cdown);
|
||||
if ( target.bSOLID )
|
||||
{
|
||||
cdown = min(1.,cdown+1./27);
|
||||
return;
|
||||
}
|
||||
cdown = max(0.,cdown-1./35);
|
||||
if ( cdown <= 0. ) Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
Class ForcefieldEffect : Actor
|
||||
{
|
||||
double nvol;
|
||||
|
||||
Default
|
||||
{
|
||||
Tag "$T_FORCEFIELD";
|
||||
RenderStyle "Add";
|
||||
+NOGRAVITY;
|
||||
+NOTELEPORT;
|
||||
+DONTSPLASH;
|
||||
+CANNOTPUSH;
|
||||
+SHOOTABLE;
|
||||
+SOLID;
|
||||
+NODAMAGE;
|
||||
+NOBLOOD;
|
||||
Mass int.max;
|
||||
Health int.max;
|
||||
Radius 15;
|
||||
Height 45;
|
||||
}
|
||||
override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle )
|
||||
{
|
||||
A_PlaySound("ffield/hit",CHAN_BODY);
|
||||
return Super.DamageMobj(inflictor,source,damage,mod,flags,angle);
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_PlaySound("ffield/on",CHAN_ITEM);
|
||||
A_PlaySound("ffield/active",CHAN_VOICE,0.6,true);
|
||||
let tracer = Spawn("ForceFieldLight",pos);
|
||||
tracer.target = self;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FFLD ABCDEFGHI 3 Bright;
|
||||
FFLD J 700 Bright;
|
||||
FFLD J 35 Bright
|
||||
{
|
||||
A_UnsetShootable();
|
||||
A_UnsetSolid();
|
||||
}
|
||||
FFLD A 1 Bright A_PlaySound("ffield/hit",CHAN_VOICE);
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
||||
Class UFlashlight : UnrealInventory
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue