Merge pull request #8563 from matija-hustic/tesla_boost
Tesla boost for RA2 mod
This commit is contained in:
@@ -13,23 +13,24 @@ using OpenRA.Traits;
|
|||||||
namespace OpenRA.Mods.Common.Traits
|
namespace OpenRA.Mods.Common.Traits
|
||||||
{
|
{
|
||||||
[Desc("Needs power to operate.")]
|
[Desc("Needs power to operate.")]
|
||||||
class RequiresPowerInfo : ITraitInfo
|
class RequiresPowerInfo : UpgradableTraitInfo, ITraitInfo
|
||||||
{
|
{
|
||||||
public object Create(ActorInitializer init) { return new RequiresPower(init.Self); }
|
public override object Create(ActorInitializer init) { return new RequiresPower(init.Self, this); }
|
||||||
}
|
}
|
||||||
|
|
||||||
class RequiresPower : IDisable, INotifyOwnerChanged
|
class RequiresPower : UpgradableTrait<RequiresPowerInfo>, IDisable, INotifyOwnerChanged
|
||||||
{
|
{
|
||||||
PowerManager playerPower;
|
PowerManager playerPower;
|
||||||
|
|
||||||
public RequiresPower(Actor self)
|
public RequiresPower(Actor self, RequiresPowerInfo info)
|
||||||
|
: base(info)
|
||||||
{
|
{
|
||||||
playerPower = self.Owner.PlayerActor.Trait<PowerManager>();
|
playerPower = self.Owner.PlayerActor.Trait<PowerManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Disabled
|
public bool Disabled
|
||||||
{
|
{
|
||||||
get { return playerPower.PowerProvided < playerPower.PowerDrained; }
|
get { return playerPower.PowerProvided < playerPower.PowerDrained && !IsTraitDisabled; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
|
public void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner)
|
||||||
|
|||||||
@@ -85,13 +85,13 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Upgrade level increments are limited to one per source, i.e., if a single source
|
/// <summary>Upgrade level increments are limited to dupesAllowed per source, i.e., if a single
|
||||||
/// attempts granting multiple upgrades, they will not accumulate. They will replace each other
|
/// source attempts granting more upgrades than dupesAllowed, they will not accumulate. They will
|
||||||
/// instead, leaving only the last granted upgrade active. An upgrade from each new distinct
|
/// replace each other instead, leaving only the most recently granted upgrade active. Each new
|
||||||
/// source will increment the upgrade's level until AcceptsUpgrade starts returning false. Then,
|
/// upgrade granting request will increment the upgrade's level until AcceptsUpgrade starts
|
||||||
/// when no new levels are accepted, the upgrade source with the shortest remaining upgrade
|
/// returning false. Then, when no new levels are accepted, the upgrade source with the shortest
|
||||||
/// duration will be replaced by the new source.</summary>
|
/// remaining upgrade duration will be replaced by the new source.</summary>
|
||||||
public void GrantTimedUpgrade(Actor self, string upgrade, int duration, object source = null)
|
public void GrantTimedUpgrade(Actor self, string upgrade, int duration, object source = null, int dupesAllowed = 1)
|
||||||
{
|
{
|
||||||
var timed = timedUpgrades.FirstOrDefault(u => u.Upgrade == upgrade);
|
var timed = timedUpgrades.FirstOrDefault(u => u.Upgrade == upgrade);
|
||||||
if (timed == null)
|
if (timed == null)
|
||||||
@@ -102,17 +102,17 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var src = timed.Sources.FirstOrDefault(s => s.Source == source);
|
var srcs = timed.Sources.Where(s => s.Source == source);
|
||||||
if (src == null)
|
if (srcs.Count() < dupesAllowed)
|
||||||
{
|
{
|
||||||
timed.Sources.Add(new TimedUpgrade.UpgradeSource(duration, source));
|
timed.Sources.Add(new TimedUpgrade.UpgradeSource(duration, source));
|
||||||
if (AcceptsUpgrade(self, upgrade))
|
if (AcceptsUpgrade(self, upgrade))
|
||||||
GrantUpgrade(self, upgrade, timed);
|
GrantUpgrade(self, upgrade, timed);
|
||||||
else
|
else
|
||||||
timed.Sources.Remove(timed.Sources.OrderByDescending(s => s.Remaining).Last());
|
timed.Sources.Remove(timed.Sources.MinBy(s => s.Remaining));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
src.Remaining = duration;
|
srcs.MinBy(s => s.Remaining).Remaining = duration;
|
||||||
|
|
||||||
timed.Remaining = Math.Max(duration, timed.Remaining);
|
timed.Remaining = Math.Max(duration, timed.Remaining);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Warheads
|
|||||||
if (Duration > 0)
|
if (Duration > 0)
|
||||||
{
|
{
|
||||||
if (um.AcknowledgesUpgrade(a, u))
|
if (um.AcknowledgesUpgrade(a, u))
|
||||||
um.GrantTimedUpgrade(a, u, Duration, firedBy);
|
um.GrantTimedUpgrade(a, u, Duration, firedBy, Upgrades.Count(upg => upg == u));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
BIN
mods/ra/bits/litningupg.shp
Normal file
BIN
mods/ra/bits/litningupg.shp
Normal file
Binary file not shown.
BIN
mods/ra/bits/teslacharge.aud
Normal file
BIN
mods/ra/bits/teslacharge.aud
Normal file
Binary file not shown.
@@ -475,6 +475,17 @@ SHOK:
|
|||||||
Armament@GARRISONED:
|
Armament@GARRISONED:
|
||||||
Name: garrisoned
|
Name: garrisoned
|
||||||
Weapon: PortaTesla
|
Weapon: PortaTesla
|
||||||
|
Armament@CHARGE:
|
||||||
|
Weapon: PortaCharge
|
||||||
|
LocalOffset: 427,0,341
|
||||||
|
TargetStances: Ally
|
||||||
|
ForceTargetStances: None
|
||||||
|
Cursor: ability
|
||||||
|
OutsideRangeCursor: ability
|
||||||
|
AmmoPool:
|
||||||
|
PipCount: 0
|
||||||
|
SelfReloads: true
|
||||||
|
SelfReloadTicks: 70
|
||||||
AttackFrontal:
|
AttackFrontal:
|
||||||
Voice: Attack
|
Voice: Attack
|
||||||
AttackMove:
|
AttackMove:
|
||||||
|
|||||||
@@ -387,6 +387,9 @@ TSLA:
|
|||||||
Footprint: _ x
|
Footprint: _ x
|
||||||
Dimensions: 1,2
|
Dimensions: 1,2
|
||||||
RequiresPower:
|
RequiresPower:
|
||||||
|
UpgradeTypes: tesla
|
||||||
|
UpgradeMaxEnabledLevel: 2
|
||||||
|
UpgradeMaxAcceptedLevel: 3
|
||||||
Selectable:
|
Selectable:
|
||||||
Bounds: 24,24,0,16
|
Bounds: 24,24,0,16
|
||||||
SelectionDecorations:
|
SelectionDecorations:
|
||||||
@@ -403,8 +406,17 @@ TSLA:
|
|||||||
HasMinibib: Yes
|
HasMinibib: Yes
|
||||||
WithChargeAnimation:
|
WithChargeAnimation:
|
||||||
Armament:
|
Armament:
|
||||||
|
UpgradeTypes: tesla
|
||||||
|
UpgradeMaxEnabledLevel: 1
|
||||||
|
UpgradeMaxAcceptedLevel: 3
|
||||||
Weapon: TeslaZap
|
Weapon: TeslaZap
|
||||||
LocalOffset: 0,0,427
|
LocalOffset: 0,0,427
|
||||||
|
Armament@Upgraded:
|
||||||
|
UpgradeTypes: tesla
|
||||||
|
UpgradeMinEnabledLevel: 2
|
||||||
|
UpgradeMaxAcceptedLevel: 3
|
||||||
|
Weapon: TeslaZap.Upgraded
|
||||||
|
LocalOffset: 0,0,427
|
||||||
AttackCharge:
|
AttackCharge:
|
||||||
ChargeAudio: tslachg2.aud
|
ChargeAudio: tslachg2.aud
|
||||||
MaxCharges: 3
|
MaxCharges: 3
|
||||||
@@ -414,6 +426,8 @@ TSLA:
|
|||||||
DetectCloaked:
|
DetectCloaked:
|
||||||
Range: 8c0
|
Range: 8c0
|
||||||
ProvidesPrerequisite@buildingname:
|
ProvidesPrerequisite@buildingname:
|
||||||
|
Targetable:
|
||||||
|
TargetTypes: Ground, C4, DetonateAttack, Structure, TeslaBoost
|
||||||
|
|
||||||
AGUN:
|
AGUN:
|
||||||
Inherits: ^Defense
|
Inherits: ^Defense
|
||||||
|
|||||||
@@ -563,6 +563,17 @@ TTNK:
|
|||||||
Armament:
|
Armament:
|
||||||
Weapon: TTankZap
|
Weapon: TTankZap
|
||||||
LocalOffset: 0,0,213
|
LocalOffset: 0,0,213
|
||||||
|
Armament@charge:
|
||||||
|
Weapon: TTankCharge
|
||||||
|
LocalOffset: 0,0,213
|
||||||
|
TargetStances: Ally
|
||||||
|
ForceTargetStances: None
|
||||||
|
Cursor: ability
|
||||||
|
OutsideRangeCursor: ability
|
||||||
|
AmmoPool:
|
||||||
|
PipCount: 0
|
||||||
|
SelfReloads: true
|
||||||
|
SelfReloadTicks: 120
|
||||||
AttackFrontal:
|
AttackFrontal:
|
||||||
WithIdleOverlay@SPINNER:
|
WithIdleOverlay@SPINNER:
|
||||||
Sequence: spinner
|
Sequence: spinner
|
||||||
|
|||||||
@@ -160,6 +160,13 @@ litning:
|
|||||||
Start: 4
|
Start: 4
|
||||||
Length: 4
|
Length: 4
|
||||||
|
|
||||||
|
litningupg:
|
||||||
|
bright:
|
||||||
|
Length: 4
|
||||||
|
dim: litning
|
||||||
|
Start: 4
|
||||||
|
Length: 4
|
||||||
|
|
||||||
fb1:
|
fb1:
|
||||||
idle:
|
idle:
|
||||||
Length: *
|
Length: *
|
||||||
|
|||||||
@@ -151,6 +151,21 @@ TeslaZap:
|
|||||||
Wood: 60
|
Wood: 60
|
||||||
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
||||||
|
|
||||||
|
TeslaZap.Upgraded:
|
||||||
|
ReloadDelay: 3
|
||||||
|
Charges: true
|
||||||
|
Range: 9c512
|
||||||
|
Report: TESLA1.AUD
|
||||||
|
Projectile: TeslaZap
|
||||||
|
Image: litningupg
|
||||||
|
Warhead@1Dam: SpreadDamage
|
||||||
|
Spread: 42
|
||||||
|
Damage: 120
|
||||||
|
Versus:
|
||||||
|
None: 1000
|
||||||
|
Wood: 60
|
||||||
|
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
||||||
|
|
||||||
PortaTesla:
|
PortaTesla:
|
||||||
ReloadDelay: 70
|
ReloadDelay: 70
|
||||||
Range: 6c0
|
Range: 6c0
|
||||||
@@ -164,6 +179,22 @@ PortaTesla:
|
|||||||
None: 1000
|
None: 1000
|
||||||
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
||||||
|
|
||||||
|
PortaCharge:
|
||||||
|
ReloadDelay: 70
|
||||||
|
Range: 2c0
|
||||||
|
Report: teslacharge.aud
|
||||||
|
Charges: yes
|
||||||
|
ValidStances: Ally
|
||||||
|
ValidTargets: TeslaBoost
|
||||||
|
Projectile: TeslaZap
|
||||||
|
Image: litningupg
|
||||||
|
Warhead@charge: GrantUpgrade
|
||||||
|
Range: 42
|
||||||
|
Duration: 75
|
||||||
|
Upgrades: tesla
|
||||||
|
ValidStances: Ally
|
||||||
|
ValidTargets: TeslaBoost
|
||||||
|
|
||||||
TTankZap:
|
TTankZap:
|
||||||
ReloadDelay: 120
|
ReloadDelay: 120
|
||||||
Range: 7c0
|
Range: 7c0
|
||||||
@@ -177,6 +208,22 @@ TTankZap:
|
|||||||
None: 1000
|
None: 1000
|
||||||
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
DamageTypes: Prone50Percent, TriggerProne, ElectricityDeath
|
||||||
|
|
||||||
|
TTankCharge:
|
||||||
|
ReloadDelay: 120
|
||||||
|
Range: 2c0
|
||||||
|
Report: teslacharge.aud
|
||||||
|
Charges: yes
|
||||||
|
ValidStances: Ally
|
||||||
|
ValidTargets: TeslaBoost
|
||||||
|
Projectile: TeslaZap
|
||||||
|
Image: litningupg
|
||||||
|
Warhead@charge: GrantUpgrade
|
||||||
|
Range: 42
|
||||||
|
Duration: 125
|
||||||
|
Upgrades: tesla, tesla, tesla
|
||||||
|
ValidStances: Ally
|
||||||
|
ValidTargets: TeslaBoost
|
||||||
|
|
||||||
DogJaw:
|
DogJaw:
|
||||||
ValidTargets: Infantry
|
ValidTargets: Infantry
|
||||||
ReloadDelay: 10
|
ReloadDelay: 10
|
||||||
|
|||||||
Reference in New Issue
Block a user