refactor: Magic system (#1138)

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
This commit is contained in:
Tornado Tech
2025-04-15 00:32:41 +10:00
committed by GitHub
parent e7cd69e383
commit 52f31e4403
14 changed files with 266 additions and 262 deletions

View File

@@ -15,12 +15,12 @@ public sealed partial class CP14ManaChange : EntityEffect
public float ManaDelta = 1;
[DataField]
public bool Safe = false;
public bool Safe;
[DataField]
public bool ScaleByQuantity;
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
protected override string ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
{
return Loc.GetString(ManaDelta >= 0 ? "cp14-reagent-effect-guidebook-mana-add" : "cp14-reagent-effect-guidebook-mana-remove",
("chance", Probability),
@@ -29,23 +29,21 @@ public sealed partial class CP14ManaChange : EntityEffect
public override void Effect(EntityEffectBaseArgs args)
{
var entityManager = args.EntityManager;
var scale = FixedPoint2.New(1);
if (args is EntityEffectReagentArgs reagentArgs)
{
scale = ScaleByQuantity ? reagentArgs.Quantity * reagentArgs.Scale : reagentArgs.Scale;
}
var magicSystem = args.EntityManager.System<CP14MagicEnergySystem>();
var magicSystem = entityManager.System<CP14MagicEnergySystem>();
magicSystem.ChangeEnergy(args.TargetEntity, ManaDelta * scale, out var changed, out var overload, safe: Safe);
scale -= FixedPoint2.Abs(changed + overload);
if (args.EntityManager.TryGetComponent<CP14MagicEnergyCrystalSlotComponent>(args.TargetEntity,
out var crystalSlot))
{
var slotSystem = args.EntityManager.System<CP14MagicEnergyCrystalSlotSystem>();
slotSystem.TryChangeEnergy(args.TargetEntity, ManaDelta * scale, crystalSlot);
}
if (!args.EntityManager.TryGetComponent<CP14MagicEnergyCrystalSlotComponent>(args.TargetEntity, out var crystalSlot))
return;
var slotSystem = entityManager.System<CP14MagicEnergyCrystalSlotSystem>();
slotSystem.TryChangeEnergy((args.TargetEntity, crystalSlot), ManaDelta * scale);
}
}

View File

@@ -9,7 +9,7 @@ using Robust.Shared.Containers;
namespace Content.Server._CP14.MagicEnergy;
public sealed partial class CP14MagicEnergyCrystalSlotSystem : SharedCP14MagicEnergyCrystalSlotSystem
public sealed class CP14MagicEnergyCrystalSlotSystem : SharedCP14MagicEnergyCrystalSlotSystem
{
[Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
[Dependency] private readonly CP14MagicEnergySystem _magicEnergy = default!;
@@ -19,125 +19,120 @@ public sealed partial class CP14MagicEnergyCrystalSlotSystem : SharedCP14MagicEn
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14MagicEnergyCrystalComponent, CP14MagicEnergyLevelChangeEvent>(OnEnergyChanged);
SubscribeLocalEvent<CP14MagicEnergyCrystalSlotComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<CP14MagicEnergyCrystalSlotComponent, CP14SlotCrystalChangedEvent>(OnCrystalChanged);
}
private void OnCrystalChanged(Entity<CP14MagicEnergyCrystalSlotComponent> ent, ref CP14SlotCrystalChangedEvent args)
{
var realPowered = TryGetEnergyCrystalFromSlot(ent, out var energyEnt, out var energyComp);
var realPowered = TryGetEnergyCrystalFromSlot((ent, ent), out var energyComp);
if (energyComp is not null)
realPowered = energyComp.Value.Comp.Energy > 0;
if (energyComp != null)
realPowered = energyComp.Energy > 0;
if (ent.Comp.Powered == realPowered)
return;
if (ent.Comp.Powered != realPowered)
{
ent.Comp.Powered = realPowered;
_appearance.SetData(ent, CP14MagicSlotVisuals.Powered, realPowered);
RaiseLocalEvent(ent, new CP14SlotCrystalPowerChangedEvent(realPowered));
}
ent.Comp.Powered = realPowered;
_appearance.SetData(ent, CP14MagicSlotVisuals.Powered, realPowered);
RaiseLocalEvent(ent, new CP14SlotCrystalPowerChangedEvent(realPowered));
}
private void OnEnergyChanged(Entity<CP14MagicEnergyCrystalComponent> crystal, ref CP14MagicEnergyLevelChangeEvent args)
{
if (_container.TryGetContainingContainer(crystal, out var container)
&& TryComp(container.Owner, out CP14MagicEnergyCrystalSlotComponent? slot)
&& _itemSlots.TryGetSlot(container.Owner, slot.SlotId, out var itemSlot))
{
if (itemSlot.Item == crystal)
{
RaiseLocalEvent(container.Owner, new CP14SlotCrystalChangedEvent(false));
}
}
if (!_container.TryGetContainingContainer((crystal.Owner, null, null), out var container))
return;
if (!TryComp(container.Owner, out CP14MagicEnergyCrystalSlotComponent? slot))
return;
if (!_itemSlots.TryGetSlot(container.Owner, slot.SlotId, out var itemSlot))
return;
if (itemSlot.Item != crystal)
return;
RaiseLocalEvent(container.Owner, new CP14SlotCrystalChangedEvent(false));
}
private void OnExamined(Entity<CP14MagicEnergyCrystalSlotComponent> ent, ref ExaminedEvent args)
{
if (!TryGetEnergyCrystalFromSlot(ent, out var crystalUid, out var crystalComp, ent.Comp))
if (!TryGetEnergyCrystalFromSlot((ent, ent), out var energyEnt))
return;
if (!args.IsInDetailsRange)
return;
//var scanEvent = new CP14MagicEnergyScanEvent();
//RaiseLocalEvent(args.Examiner, scanEvent);
//
//if (!scanEvent.CanScan)
// TODO: scan energy ability
// var scanEvent = new CP14MagicEnergyScanEvent();
// RaiseLocalEvent(args.Examiner, scanEvent);
//
// if (!scanEvent.CanScan)
// return;
args.PushMarkup(_magicEnergy.GetEnergyExaminedText(crystalUid.Value, crystalComp));
args.PushMarkup(_magicEnergy.GetEnergyExaminedText((energyEnt.Value, energyEnt)));
}
public bool TryGetEnergyCrystalFromSlot(EntityUid uid,
[NotNullWhen(true)] out CP14MagicEnergyContainerComponent? energyComp,
CP14MagicEnergyCrystalSlotComponent? component = null)
public bool TryGetEnergyCrystalFromSlot(Entity<CP14MagicEnergyCrystalSlotComponent?> ent,
[NotNullWhen(true)] out Entity<CP14MagicEnergyContainerComponent>? energyEnt)
{
return TryGetEnergyCrystalFromSlot(uid, out _, out energyComp, component);
energyEnt = null;
if (!Resolve(ent, ref ent.Comp, false))
return false;
if (!_itemSlots.TryGetSlot(ent, ent.Comp.SlotId, out var slot))
return false;
if (slot.Item is null)
return false;
if (!TryComp<CP14MagicEnergyContainerComponent>(slot.Item, out var energyComp))
return false;
energyEnt = (slot.Item.Value, energyComp);
return true;
}
public bool TryGetEnergyCrystalFromSlot(EntityUid uid,
[NotNullWhen(true)] out EntityUid? energyEnt,
[NotNullWhen(true)] out CP14MagicEnergyContainerComponent? energyComp,
CP14MagicEnergyCrystalSlotComponent? component = null)
public bool HasEnergy(Entity<CP14MagicEnergyCrystalSlotComponent?> ent,
FixedPoint2 energy,
EntityUid? user = null)
{
if (!Resolve(uid, ref component, false))
if (!TryGetEnergyCrystalFromSlot(ent, out var energyEnt))
{
energyEnt = null;
energyComp = null;
if (user is not null)
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), ent,user.Value);
return false;
}
if (_itemSlots.TryGetSlot(uid, component.SlotId, out ItemSlot? slot))
{
energyEnt = slot.Item;
return TryComp(slot.Item, out energyComp);
}
if (energyEnt.Value.Comp.Energy >= energy)
return true;
if (user is not null)
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-insufficient"), ent, user.Value);
energyEnt = null;
energyComp = null;
return false;
}
public bool HasEnergy(EntityUid uid,
public bool TryChangeEnergy(Entity<CP14MagicEnergyCrystalSlotComponent?> ent,
FixedPoint2 energy,
CP14MagicEnergyCrystalSlotComponent? component = null,
EntityUid? user = null)
{
if (!TryGetEnergyCrystalFromSlot(uid, out var energyEnt, out var energyComp, component))
{
if (user != null)
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), uid,user.Value);
return false;
}
if (energyComp.Energy < energy)
{
if (user != null)
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-insufficient"), uid, user.Value);
return false;
}
return true;
}
public bool TryChangeEnergy(EntityUid uid,
FixedPoint2 energy,
CP14MagicEnergyCrystalSlotComponent? component = null,
EntityUid? user = null,
bool safe = false)
{
if (!TryGetEnergyCrystalFromSlot(uid, out var energyEnt, out var energyComp, component))
if (!TryGetEnergyCrystalFromSlot(ent, out var energyEnt))
{
if (user != null)
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), uid, user.Value);
if (user is not null)
_popup.PopupEntity(Loc.GetString("cp14-magic-energy-no-crystal"), ent, user.Value);
return false;
}
_magicEnergy.ChangeEnergy(energyEnt.Value, energy, out _, out _, energyComp, safe);
_magicEnergy.ChangeEnergy((energyEnt.Value, energyEnt.Value), energy, out _, out _, safe);
return true;
}
}

View File

@@ -30,7 +30,7 @@ public partial class CP14MagicEnergySystem
if (!ent.Comp.Damage.TryGetValue(dict.Key, out var modifier))
continue;
ChangeEnergy(ent, modifier * dict.Value, out _, out _, safe: true);
ChangeEnergy(ent.Owner, modifier * dict.Value, out _, out _, safe: true);
}
}
@@ -61,7 +61,7 @@ public partial class CP14MagicEnergySystem
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
ChangeEnergy(uid, draw.Energy, out _, out _, magicContainer, draw.Safe);
ChangeEnergy((uid, magicContainer), draw.Energy, out _, out _, draw.Safe);
}
var query2 = EntityQueryEnumerator<CP14MagicEnergyPhotosynthesisComponent, CP14MagicEnergyContainerComponent>();
@@ -86,7 +86,7 @@ public partial class CP14MagicEnergySystem
// daylight = true;
//}
ChangeEnergy(uid, daylight ? draw.DaylightEnergy : draw.DarknessEnergy, out _, out _, magicContainer, true);
ChangeEnergy((uid, magicContainer), daylight ? draw.DaylightEnergy : draw.DarknessEnergy, out _, out _, true);
}
}
@@ -103,10 +103,10 @@ public partial class CP14MagicEnergySystem
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
if (!_magicSlot.TryGetEnergyCrystalFromSlot(uid, out var energyEnt, out var energyComp))
if (!_magicSlot.TryGetEnergyCrystalFromSlot(uid, out var energyEnt))
continue;
ChangeEnergy(energyEnt.Value, draw.Energy, out _, out _, energyComp, draw.Safe);
ChangeEnergy((energyEnt.Value, energyEnt.Value), draw.Energy, out _, out _, draw.Safe);
}
}
}

View File

@@ -41,9 +41,7 @@ public partial class CP14MagicEnergySystem
}
if (passed)
{
TransferEnergy(uid, sinkUid, relay.Energy, out _, out _, container, safe: relay.Safe);
}
TransferEnergy((uid, container), sinkUid, relay.Energy, out _, out _, safe: relay.Safe);
}
relay.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(relay.Delay);

View File

@@ -10,6 +10,8 @@ public sealed partial class CP14MagicEnergySystem : SharedCP14MagicEnergySystem
public override void Initialize()
{
base.Initialize();
InitializeDraw();
InitializePortRelay();
}

View File

@@ -18,7 +18,7 @@ using Robust.Shared.Random;
namespace Content.Server._CP14.MagicSpell;
public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
public sealed class CP14MagicSystem : CP14SharedMagicSystem
{
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly TransformSystem _transform = default!;
@@ -26,7 +26,6 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly SharedActionsSystem _action = default!;
public override void Initialize()
{
@@ -132,16 +131,14 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
var spellEv = new CP14SpellFromSpellStorageUsedEvent(args.Performer, (ent, magicEffect), requiredMana);
RaiseLocalEvent(magicEffect.SpellStorage.Value, ref spellEv);
_magicEnergy.ChangeEnergy(magicEffect.SpellStorage.Value, -requiredMana, out var changedEnergy, out var overloadedEnergy, magicStorage, safe: false);
_magicEnergy.ChangeEnergy((magicEffect.SpellStorage.Value, magicStorage), -requiredMana, out var changedEnergy, out var overloadedEnergy, safe: false);
requiredMana -= FixedPoint2.Abs(changedEnergy + overloadedEnergy);
}
//Second - action user
if (requiredMana > 0 &&
TryComp<CP14MagicEnergyContainerComponent>(args.Performer, out var playerMana))
{
_magicEnergy.ChangeEnergy(args.Performer.Value, -requiredMana, out _, out _, playerMana, safe: false);
}
_magicEnergy.ChangeEnergy((args.Performer.Value, playerMana), -requiredMana, out _, out _, safe: false);
}
private void OnMusicCheck(Entity<CP14MagicEffectRequiredMusicToolComponent> ent, ref CP14CastMagicEffectAttemptEvent args)
@@ -160,10 +157,10 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
break;
}
if (!passed)
{
args.PushReason(Loc.GetString("cp14-magic-music-aspect"));
args.Cancel();
}
if (passed)
return;
args.PushReason(Loc.GetString("cp14-magic-music-aspect"));
args.Cancel();
}
}