qzdoom/wadsrc/static/zscript/hexen/healingradius.txt
Christoph Oelckers 69d4d36429 - scriptified ArtiHealingRadius.
- allow switch/case with names.
- fixed break jump target handling for switch/case. This only worked when the break was in the outermost compound statement, those in inner ones were missed.
2016-11-27 00:18:07 +01:00

92 lines
1.8 KiB
Text

// Healing Radius Artifact --------------------------------------------------
class ArtiHealingRadius : Inventory
{
const HEAL_RADIUS_DIST = 255.;
Default
{
+COUNTITEM
+FLOATBOB
Inventory.DefMaxAmount;
+INVENTORY.INVBAR
+INVENTORY.FANCYPICKUPSOUND
Inventory.PickupFlash "PickupFlash";
Inventory.Icon "ARTIHRAD";
Inventory.PickupSound "misc/p_pkup";
Inventory.PickupMessage "$TXT_ARTIHEALINGRADIUS";
Tag "$TAG_ARTIHEALINGRADIUS";
}
States
{
Spawn:
HRAD ABCDEFGHIJKLMNOP 4 Bright;
Loop;
}
override bool Use (bool pickup)
{
bool effective = false;
Name mode = 'Health';
PlayerPawn pp = PlayerPawn(Owner);
if (pp) mode = pp.HealingRadiusType;
for (int i = 0; i < MAXPLAYERS; ++i)
{
PlayerPawn mo = players[i].mo;
if (playeringame[i] && mo != null && mo.health > 0 && mo.Distance2D (Owner) <= HEAL_RADIUS_DIST)
{
// Q: Is it worth it to make this selectable as a player property?
// A: Probably not - but it sure doesn't hurt.
bool gotsome=false;
switch (mode)
{
case 'Armor':
for (int j = 0; j < 4; ++j)
{
HexenArmor armor = HexenArmor(Spawn("HexenArmor"));
armor.health = j;
armor.Amount = 1;
if (!armor.CallTryPickup (mo))
{
armor.Destroy ();
}
else
{
gotsome = true;
}
}
break;
case 'Mana':
{
int amount = 50 + (random[HealRadius]() % 50);
if (mo.GiveAmmo ("Mana1", amount) ||
mo.GiveAmmo ("Mana2", amount))
{
gotsome = true;
}
break;
}
default:
//case NAME_Health:
gotsome = mo.GiveBody (50 + (random[HealRadius]() % 50));
break;
}
if (gotsome)
{
mo.A_PlaySound ("MysticIncant", CHAN_AUTO);
effective=true;
}
}
}
return effective;
}
}