Back to the Vavoom Forum Archives
Firebrand
Index: basev/common/actors/doom/doomdecorations.txt
===================================================================
--- basev/common/actors/doom/doomdecorations.txt (revision 4300)
+++ basev/common/actors/doom/doomdecorations.txt (working copy)
@@ -138,7 +138,7 @@
{
Game Doom
Radius 16
- Height 16
+ Height 54
+Solid
states
{
Index: basev/common/actors/nativeclasses.txt
===================================================================
--- basev/common/actors/nativeclasses.txt (revision 4300)
+++ basev/common/actors/nativeclasses.txt (working copy)
@@ -17,7 +17,7 @@
action native A_ExtChase(eval bool usemelee, eval bool usemissile,
optional evalnot bool playactive, optional eval bool nightmarefast);
action native A_FaceTarget();
- action native A_Die();
+ action native A_Die(optional DamageType);
action native A_CentaurDefend();
action native A_AlertMonsters();
action native A_ClearTarget();
@@ -168,7 +168,7 @@
action native A_SeekerMissile(eval int threshold, eval int turnmax);
action native A_Tracer();
action native A_Tracer2();
- action native A_Fire();
+ action native A_Fire(optional int Height);
action native A_BishopMissileWeave();
action native A_CStaffMissileSlither();
action native A_Countdown();
Index: basev/common/actors/raven/ravenartifacts.txt
===================================================================
--- basev/common/actors/raven/ravenartifacts.txt (revision 4300)
+++ basev/common/actors/raven/ravenartifacts.txt (working copy)
@@ -10,6 +10,7 @@
+CountItem
+FloatBob
+Inventory.PickupFlash
+ HealthPickup.Autouse 1
states
{
Spawn:
@@ -30,6 +31,7 @@
+CountItem
+FloatBob
+Inventory.PickupFlash
+ HealthPickup.Autouse 2
states
{
Spawn:
Index: basev/common/actors/strife/strifeitems.txt
===================================================================
--- basev/common/actors/strife/strifeitems.txt (revision 4300)
+++ basev/common/actors/strife/strifeitems.txt (working copy)
@@ -10,6 +10,7 @@
Inventory.MaxAmount 20
Inventory.Icon "i_stmp"
+FloorClip
+ HealthPickup.Autouse 3
states
{
Spawn:
@@ -30,6 +31,7 @@
Inventory.MaxAmount 15
Inventory.Icon "i_mdkt"
+FloorClip
+ HealthPickup.Autouse 3
states
{
Spawn:
Index: basev/common/vavoom_decorate_defs.xml
===================================================================
--- basev/common/vavoom_decorate_defs.xml (revision 4300)
+++ basev/common/vavoom_decorate_defs.xml (working copy)
@@ -321,6 +321,10 @@
<prop_low_message name="Health.LowMessage" />
</class>
+ <class name="HealthPickup">
+ <prop_int name="HealthPickup.AutoUse" property="AutoUseMode" />
+ </class>
+
<class name="PowerupGiver">
<prop_powerup_colour name="Powerup.Color" />
<prop_tics name="Powerup.Duration" property="EffectTime" />
Index: progs/common/linespec/Actor.MissileMovement.vc
===================================================================
--- progs/common/linespec/Actor.MissileMovement.vc (revision 4300)
+++ progs/common/linespec/Actor.MissileMovement.vc (working copy)
@@ -178,7 +178,7 @@
//
//==========================================================================
-final void A_Fire()
+final void A_Fire(optional int Height)
{
if (!Target || !Tracer)
{
@@ -194,7 +194,14 @@
UnlinkFromWorld();
Origin.x = Tracer.Origin.x + 24.0 * cos(Tracer.Angles.yaw);
Origin.y = Tracer.Origin.y + 24.0 * sin(Tracer.Angles.yaw);
- Origin.z = Tracer.Origin.z;
+ if (!specified_Height)
+ {
+ Origin.z = Tracer.Origin.z;
+ }
+ else
+ {
+ Origin.z = Tracer.Origin.z + itof(Height);
+ }
LinkToWorld();
}
Index: progs/common/linespec/Actor.MonsterAi.vc
===================================================================
--- progs/common/linespec/Actor.MonsterAi.vc (revision 4300)
+++ progs/common/linespec/Actor.MonsterAi.vc (working copy)
@@ -1004,9 +1004,16 @@
//
//==========================================================================
-final void A_Die()
+final void A_Die(optional name DamageType)
{
- Damage(none, none, Health);
+ if (!specified_DamageType)
+ {
+ Damage(none, none, Health);
+ }
+ else
+ {
+ Damage(none, none, Health, DamageType);
+ }
}
//==========================================================================
Index: progs/common/linespec/EntityEx.Misc.vc
===================================================================
--- progs/common/linespec/EntityEx.Misc.vc (revision 4300)
+++ progs/common/linespec/EntityEx.Misc.vc (working copy)
@@ -2790,65 +2790,174 @@
{
int i;
int count;
+ int normalhealth = 0;
+ int superhealth = 0;
+ array<Inventory> normal;
+ array<Inventory> super;
+ Inventory inv;
+ int saved = 0;
- Inventory normal = FindInventory(ArtiHealth);
- Inventory super = FindInventory(ArtiSuperHealth);
- if (Level.World.bSkillAutoUseHealth && normal &&
- (normal.Amount * 25 >= saveHealth))
+ for(inv = Inventory; inv; inv = inv.Inventory)
{
+ if (inv.Amount > 0 && ClassIsChildOf(inv.Class, HealthPickup))
+ {
+ int mode = HealthPickup(inv).AutoUseMode;
+
+ if (mode == 1)
+ {
+ normal.Num = normal.Num + 1;
+ normal[normal.Num] = inv;
+ }
+ else if (mode == 2)
+ {
+ super.Num = super.Num + 1;
+ super[super.Num] = inv;
+ }
+ }
+ }
+
+ for(i = 0; i < normal.Num; i++)
+ {
+ normalhealth += normal.Amount * normal.Health;
+ }
+
+ for(i = 0; i < super.Num; i++)
+ {
+ superhealth += super.Amount * super.Health;
+ }
+
+ if (Level.World.bSkillAutoUseHealth && normalhealth >= saveHealth)
+ {
// Use quartz flasks
- count = (saveHealth + 24) / 25;
- for (i = 0; i < count; i++)
+ while (normal.Num > 0 && saveHealth > 0)
{
- Health += 25;
- if (!(--normal.Amount))
+ int maxhealth = 0;
+ int index = -1;
+
+ // Find the largest item in the list
+ for(i = 0; i < normal.Num; i++)
{
- // Used last of a type - compact the artifact list
- normal.Destroy();
+ if (normal.Health > maxhealth)
+ {
+ index = i;
+ maxhealth = normal.Health;
+ }
}
+
+ // Now apply the health items, using the same logic as Heretic and Hexen.
+ count = (saveHealth + maxhealth - 1) / maxhealth;
+ for(i = 0; i < count; i++)
+ {
+ saved += maxhealth;
+ saveHealth -= maxhealth;
+ if (!(--normal[index].Amount))
+ {
+ // Used last of a type - compact the artifact list
+ normal[index].Destroy();
+ }
+ }
}
+
+ Health += saved;
}
- else if (super && super.Amount * 100 >= saveHealth)
- {
+ else if (superhealth >= saveHealth)
+ {
// Use mystic urns
- count = (saveHealth + 99) / 100;
- for (i = 0; i < count; i++)
+ while (super.Num > 0 && saveHealth > 0)
{
- Health += 100;
- if (!(--super.Amount))
+ int maxhealth = 0;
+ int index = -1;
+
+ // Find the largest item in the list
+ for(i = 0; i < super.Num; i++)
{
- // Used last of a type - compact the artifact list
- super.Destroy();
+ if (super.Health > maxhealth)
+ {
+ index = i;
+ maxhealth = super.Health;
+ }
}
+
+ // Now apply the health items, using the same logic as Heretic and Hexen.
+ count = (saveHealth + maxhealth - 1) / maxhealth;
+ for(i = 0; i < count; i++)
+ {
+ saved += maxhealth;
+ saveHealth -= maxhealth;
+ if (!(--super[index].Amount))
+ {
+ // Used last of a type - compact the artifact list
+ super[index].Destroy();
+ }
+ }
}
+
+ Health += saved;
}
- else if (Level.World.bSkillAutoUseHealth &&
- ((super ? super.Amount * 100 : 0) +
- (normal ? normal.Amount * 25 : 0) >= saveHealth))
- {
- // Use mystic urns and quartz flasks
- count = (saveHealth + 24) / 25;
- saveHealth -= count * 25;
- for (i = 0; normal && i < count; i++)
+ else if (Level.World.bSkillAutoUseHealth && normalhealth + superhealth >= saveHealth)
+ { // Use mystic urns and quartz flasks
+ while (normal.Num > 0 && saveHealth > 0)
{
- Health += 25;
- if (!(--normal.Amount))
+ int maxhealth = 0;
+ int index = -1;
+
+ // Find the largest item in the list
+ for(i = 0; i < normal.Num; i++)
{
- // Used last of a type - compact the artifact list
- normal.Destroy();
- normal = none;
+ if (normal.Health > maxhealth)
+ {
+ index = i;
+ maxhealth = normal.Health;
+ }
}
+
+ // Now apply the health items, using the same logic as Heretic and Hexen.
+ count = (saveHealth + maxhealth - 1) / maxhealth;
+ for(i = 0; i < count; i++)
+ {
+ saved += maxhealth;
+ saveHealth -= maxhealth;
+ if (!(--normal[index].Amount))
+ {
+ // Used last of a type - compact the artifact list
+ normal[index].Destroy();
+ }
+ }
}
- count = (saveHealth + 99) / 100;
- for (i = 0; super && i < count; i++)
+
+ Health += saved;
+ if (saveHealth > 0)
{
- Health += 100;
- if (!(--super.Amount))
+ while (super.Num > 0 && saveHealth > 0)
{
- // Used last of a type - compact the artifact list
- super.Destroy();
- super = none;
+ int maxhealth = 0;
+ int index = -1;
+
+ // Find the largest item in the list
+ for(i = 0; i < super.Num; i++)
+ {
+ if (super.Health > maxhealth)
+ {
+ index = i;
+ maxhealth = super.Health;
+ }
+ }
+
+ // Now apply the health items, using the same logic as Heretic and Hexen.
+ count = (saveHealth + maxhealth - 1) / maxhealth;
+ for(i = 0; i < count; i++)
+ {
+ saved += maxhealth;
+ saveHealth -= maxhealth;
+ if (!(--super[index].Amount))
+ {
+ // Used last of a type - compact the artifact list
+ super[index].Destroy();
+ }
+ }
}
+
+ Health += saved;
}
}
Player.Health = Health;
@@ -2863,38 +2972,61 @@
final void AutoUseStrifeHealth(int saveHealth)
{
int i;
+ array<Inventory> Items;
+ Inventory inv;
+ int itemshealth;
- Inventory Item = FindInventory(MedicalKit);
- if (Item && Item.Amount * 25 >= saveHealth)
+ for(inv = Inventory; inv; inv = inv.Inventory)
{
- // Use medical kits
- i = (saveHealth + 24) / 25;
- while (i--)
+ if (inv.Amount > 0 && ClassIsChildOf(inv.Class, HealthPickup))
{
- Health += 25;
- saveHealth -= 25;
- if (!(--Item.Amount))
+ int mode = HealthPickup(inv).AutoUseMode;
+
+ if (mode == 3)
{
- Item.Destroy();
+ Items.Num = Items.Num + 1;
+ Items[Items.Num] = inv;
}
- PlaySound('misc/invuse', CHAN_BODY);
}
}
-
- Item = FindInventory(MedPatch);
- if (saveHealth > 0 && Item && Item.Amount * 10 >= saveHealth)
+
+ for(i = 0; i < Items.Num; i++)
{
- i = (saveHealth + 9) / 10;
- while (i--)
+ itemshealth += Items.Amount * Items.Health;
+ }
+
+ while (Items.Num > 0)
+ {
+ int maxhealth = 0;
+ int index = -1;
+
+ // Find the largest item in the list
+ for(i = 0; i < Items.Num; i++)
{
- Health += 10;
- if (!(--Item.Amount))
+ if (Items.Health > maxhealth)
{
- Item.Destroy();
+ index = i;
+ maxhealth = Items.Amount;
}
- PlaySound('misc/invuse', CHAN_BODY);
}
+
+ while (Health < 50)
+ {
+ if (!UseInventory(Items[index]))
+ {
+ break;
+ }
+ }
+ if (Health >= 50)
+ {
+ Player.Health = Health;
+ return;
+ }
+ // Using all of this item was not enough so delete it and restart with the next best one
+ Items[index] = none;
+ Items.Num = Items.Num - 1;
}
+
Player.Health = Health;
}
Index: progs/common/linespec/HealthPickup.vc
===================================================================
--- progs/common/linespec/HealthPickup.vc (revision 4300)
+++ progs/common/linespec/HealthPickup.vc (working copy)
@@ -26,6 +26,8 @@
class HealthPickup : Inventory
abstract;
+int AutoUseMode;
+
//==========================================================================
//
// CreateCopy
@@ -91,4 +93,5 @@
{
MaxAmount = DefMaxAmount;
bInvBar = true;
+ AutoUseMode = 0;
}
Index: progs/common/linespec/RandomSpawner.vc
===================================================================
--- progs/common/linespec/RandomSpawner.vc (revision 4300)
+++ progs/common/linespec/RandomSpawner.vc (working copy)
@@ -58,6 +58,15 @@
n += DropItemList.Amount;
i++;
}
+ else
+ {
+ // Send a warning that this class can't be found and continue the loop
+ print("WARNING: RandomSpawner type definition is incorrect at element %i", DropItemList.Num - i);
+ // Show that there's a problem.
+ Spawn(Unknown, Origin,,, false);
+ Destroy();
+ return;
+ }
}
// Then we reset the iterator to the start position...
i = 0;
@@ -119,8 +128,9 @@
if (NewEntity)
{
- // copy everything relevant
+ // Copy everything that is relevant
NewEntity.Angles = Angles;
+ NewEntity.Origin = Origin;
NewEntity.Special = Special;
NewEntity.Args[0] = Args[0];
NewEntity.Args[1] = Args[1];
@@ -129,11 +139,30 @@
NewEntity.Args[4] = Args[4];
EntityEx(NewEntity).Special1 = Special1;
EntityEx(NewEntity).Special2 = Special2;
- // EntityEx(NewEntity).TID = TID;
+ NewEntity.SetTID(TID);
EntityEx(NewEntity).Master = Master;
EntityEx(NewEntity).Target = Target;
EntityEx(NewEntity).Tracer = Tracer;
EntityEx(NewEntity).CopyFriendliness(self, false);
+
+ // Copy Map Spawn flags
+ EntityEx(NewEntity).bAmbush = bAmbush;
+ EntityEx(NewEntity).bStanding = bStanding;
+ if (bDormant)
+ {
+ EntityEx(NewEntity).Deactivate(none);
+ }
+ if (bShadow && RenderStyle == STYLE_Translucent && Alpha == 0.25)
+ {
+ EntityEx(NewEntity).bShadow = true;
+ EntityEx(NewEntity).RenderStyle = STYLE_Translucent;
+ EntityEx(NewEntity).Alpha = 0.25;
+ }
+ if (RenderStyle == STYLE_None)
+ {
+ EntityEx(NewEntity).RenderStyle = STYLE_None;
+ }
+
// This handles things such as projectiles with the MF4_SPECTRAL flag that have
// a health set to -2 after spawning, for internal reasons.
if (Health != default.Health)
Index: source/r_data.cpp
===================================================================
--- source/r_data.cpp (revision 4300)
+++ source/r_data.cpp (working copy)
@@ -1783,8 +1783,13 @@
{
VTempClassEffects& CD = ClassDefs;
VClass* Cls = VClass::FindClass(*CD.ClassName);
- if (!Cls)
+ if (Cls)
{
+ // Get class replacement
+ Cls = Cls->GetReplacement();
+ }
+ else
+ {
GCon->Logf(NAME_Init, "No such class %s", *CD.ClassName);
continue;
}
Index: source/vc_decorate.cpp
===================================================================
--- source/vc_decorate.cpp (revision 4300)
+++ source/vc_decorate.cpp (working copy)
@@ -4155,7 +4155,7 @@
{
if (GArgs.CheckParm("-debug_decorate"))
{
- GCon->Logf("Class %s", *DecPkg->ParsedClasses->GetFullName());
+ GCon->Logf("Emiting Class %s", *DecPkg->ParsedClasses->GetFullName());
}
DecPkg->ParsedClasses->DecorateEmit();
}
@@ -4164,7 +4164,7 @@
{
if (GArgs.CheckParm("-debug_decorate"))
{
- GCon->Logf("Class %s", *DecPkg->ParsedClasses->GetFullName());
+ GCon->Logf("Compiling Class %s", *DecPkg->ParsedClasses->GetFullName());
}
DecPkg->ParsedClasses->DecoratePostLoad();
}
Janis Legzdinsh