var targetTransformComp = Transform(uid);
+ if (configuration.PolymorphSound != null)
+ _audio.PlayPvs(configuration.PolymorphSound, targetTransformComp.Coordinates);
+
var child = Spawn(configuration.Entity, _transform.GetMapCoordinates(uid, targetTransformComp), rotation: _transform.GetWorldRotation(uid));
MakeSentientCommand.MakeSentient(child, EntityManager);
var uidXform = Transform(uid);
var parentXform = Transform(parent);
+ if (component.Configuration.ExitPolymorphSound != null)
+ _audio.PlayPvs(component.Configuration.ExitPolymorphSound, uidXform.Coordinates);
+
_transform.SetParent(parent, parentXform, uidXform.ParentUid);
_transform.SetCoordinates(parent, parentXform, uidXform.Coordinates, uidXform.LocalRotation);
--- /dev/null
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Jaunt;
+
+/// <summary>
+/// Used to control various aspects of a Jaunt.
+/// Can be used in place of giving a jaunt-action directly.
+/// </summary>
+[RegisterComponent, NetworkedComponent]
+public sealed partial class JauntComponent : Component
+{
+ /// <summary>
+ /// Which Jaunt Action the component should grant.
+ /// </summary>
+ [DataField]
+ public EntProtoId JauntAction = "ActionPolymorphJaunt";
+
+ /// <summary>
+ /// The jaunt action itself.
+ /// </summary>
+ public EntityUid? Action;
+
+ // TODO: Enter & Exit Times and Whitelist when Actions are reworked and can support it
+ // TODO: Cooldown pausing when Actions can support it
+}
--- /dev/null
+using Content.Shared.Actions;
+
+namespace Content.Shared.Jaunt;
+public sealed class JauntSystem : EntitySystem
+{
+ [Dependency] private readonly SharedActionsSystem _actions = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent<JauntComponent, MapInitEvent>(OnInit);
+ SubscribeLocalEvent<JauntComponent, ComponentShutdown>(OnShutdown);
+ }
+
+ private void OnInit(Entity<JauntComponent> ent, ref MapInitEvent args)
+ {
+ _actions.AddAction(ent.Owner, ref ent.Comp.Action, ent.Comp.JauntAction);
+ }
+
+ private void OnShutdown(Entity<JauntComponent> ent, ref ComponentShutdown args)
+ {
+ _actions.RemoveAction(ent.Owner, ent.Comp.Action);
+ }
+
+}
+
+using Robust.Shared.Audio;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;
[DataField(serverOnly: true)]
[ViewVariables(VVAccess.ReadWrite)]
public TimeSpan Cooldown = TimeSpan.Zero;
+
+ /// <summary>
+ /// If not null, this sound will be played when being polymorphed into something.
+ /// </summary>
+ [DataField]
+ public SoundSpecifier? PolymorphSound;
+
+ /// <summary>
+ /// If not null, this sound will be played when being reverted from a polymorph.
+ /// </summary>
+ [DataField]
+ public SoundSpecifier? ExitPolymorphSound;
}
public enum PolymorphInventoryChange : byte
- forcewall.ogg
- knock.ogg
- blink.ogg
- copyright: '"ForceWall.ogg", "Knock.ogg", and "blink.ogg" by Citadel Station 13'
+ - ethereal_enter.ogg
+ - ethereal_exit.ogg
+ copyright: '"forcewall.ogg", "knock.ogg", "blink.ogg", "ethereal_enter.ogg", and "ethereal_exit.ogg" by Citadel Station 13'
license: CC-BY-SA-3.0
source: https://github.com/Citadel-Station-13/Citadel-Station-13/commit/35a1723e98a60f375df590ca572cc90f1bb80bd5
spellbook-charge-name = Charge
spellbook-charge-desc = Adds a charge back to your wand!
+spellbook-ethereal-jaunt-name = Ethereal Jaunt
+spellbook-ethereal-jaunt-description = Slip into the ethereal plane to slip away from your enemies!
+
# Equipment
spellbook-wand-polymorph-door-name = Wand of Entrance
# Upgrades
spellbook-upgrade-fireball-name = Upgrade Fireball
spellbook-upgrade-fireball-description = Upgrades Fireball to a maximum of level 3!
+
+spellbook-upgrade-jaunt-name = Upgrade Ethereal Jaunt
+spellbook-upgrade-jaunt-description = Upgrades Jaunt to a maximum of level 3!
icon:
sprite: Objects/Fun/immovable_rod.rsi
state: icon
+
+- type: entity
+ id: ActionPolymorphJaunt
+ name: Ethereal Jaunt
+ description: Melt into the Ethereal Plane for a quick getaway!
+ components:
+ - type: Magic
+ - type: InstantAction
+ useDelay: 30
+ event: !type:PolymorphActionEvent
+ protoId: Jaunt
+ itemIconStyle: NoItem
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: jaunt
+ # TODO: Effect ECS (from cardboard box)
+ - type: ActionUpgrade
+ effectedLevels:
+ 2: ActionPolymorphJauntII
+ 3: ActionPolymorphJauntIII
+
+- type: entity
+ id: ActionPolymorphJauntII
+ parent: ActionPolymorphJaunt
+ name: Ethereal Jaunt II
+ description: Melt into the Ethereal Plane for an even quicker getaway!
+ components:
+ - type: InstantAction
+ useDelay: 25
+ event: !type:PolymorphActionEvent
+ protoId: Jaunt
+ itemIconStyle: NoItem
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: jaunt
+
+- type: entity
+ id: ActionPolymorphJauntIII
+ parent: ActionPolymorphJaunt
+ name: Ethereal Jaunt III
+ description: Are you even tangible anymore?
+ components:
+ - type: InstantAction
+ useDelay: 20
+ event: !type:PolymorphActionEvent
+ protoId: Jaunt
+ itemIconStyle: NoItem
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: jaunt
- !type:ListingLimitedStockCondition
stock: 1
+- type: listing
+ id: SpellbookJaunt
+ name: spellbook-ethereal-jaunt-name
+ description: spellbook-ethereal-jaunt-description
+ productAction: ActionPolymorphJaunt
+ productUpgradeId: SpellbookJauntUpgrade
+ cost:
+ WizCoin: 2
+ categories:
+ - SpellbookUtility
+ conditions:
+ - !type:ListingLimitedStockCondition
+ stock: 1
+
# Equipment
- type: listing
id: SpellbookWandDoor
# manual for now
- !type:ListingLimitedStockCondition
stock: 2
+
+- type: listing
+ id: SpellbookJauntUpgrade
+ productUpgradeId: SpellbookJauntUpgrade
+ name: spellbook-upgrade-jaunt-name
+ description: spellbook-upgrade-jaunt-description
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: jaunt
+ cost:
+ WizCoin: 2
+ categories:
+ - SpellbookUtility
+ conditions:
+ - !type:BuyBeforeCondition
+ whitelist:
+ - SpellbookJaunt
+ - !type:ListingLimitedStockCondition
+ stock: 2
--- /dev/null
+- type: entity
+ name: jaunt
+ parent: [Incorporeal, BaseMob]
+ id: BaseMobJaunt
+ description: Faint traces of a humanoid figure linger here
+ suffix: Ethereal
+ components:
+ - type: ContentEye
+ maxZoom: 1.44,1.44
+ - type: Eye
+ drawFov: false
+ - type: Input
+ context: "ghost"
+ - type: InputMover
+ - type: MovementSpeedModifier
+ baseSprintSpeed: 12
+ baseWalkSpeed: 8
+ - type: Visibility
+ layer: 2
+ - type: Spectral
+
+# Should be slow, for balance
+- type: entity
+ name: jaunt
+ parent: BaseMobJaunt
+ id: EtherealJaunt
+ suffix: Wizard
+ components:
+ - type: Sprite
+ sprite: Mobs/Ghosts/ghost_human.rsi
+ color: "#60f7eb"
+ layers:
+ - state: animated
+ shader: unshaded
+ noRot: true
+ overrideContainerOcclusion: true
+ drawdepth: Ghosts
+ - type: MovementSpeedModifier
+ baseSprintSpeed: 6
+ baseWalkSpeed: 4
forced: true
revertOnCrit: false
revertOnDeath: false
+
+# Temporary Jaunt
+# Don't make permanent jaunts until action system can be reworked to allow do afters and cooldown pausing
+- type: polymorph
+ id: Jaunt
+ configuration:
+ entity: EtherealJaunt
+ transferName: true
+ inventory: None
+ forced: true
+ revertOnDeath: true
+ revertOnCrit: true
+ allowRepeatedMorphs: false
+ polymorphSound: /Audio/Magic/ethereal_enter.ogg
+ exitPolymorphSound: /Audio/Magic/ethereal_exit.ogg
+ duration: 3
{
"name": "magicmissile"
},
+ {
+ "name": "jaunt"
+ },
{
"name": "gib"
}
]
-}
\ No newline at end of file
+}