diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs
index 3065b1c4172..073a97076e8 100644
--- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs
+++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/ChemicalPuddleArtifactComponent.cs
@@ -2,6 +2,7 @@
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Reagent;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
+using Content.Shared.FixedPoint; // Frontier
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
@@ -29,4 +30,10 @@ public sealed partial class ChemicalPuddleArtifactComponent : Component
///
[DataField("chemAmount")]
public int ChemAmount = 3;
+
+ ///
+ /// Frontier: the total maximum volume of chemicals to spawn.
+ ///
+ [DataField]
+ public FixedPoint2 MaximumVolume = 100.0f;
}
diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs
index 542d8bb84cc..c698578855a 100644
--- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs
+++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ChemicalPuddleArtifactSystem.cs
@@ -1,6 +1,7 @@
using Content.Server.Fluids.EntitySystems;
using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components;
using Content.Server.Xenoarchaeology.XenoArtifacts.Events;
+using Content.Shared.FixedPoint;
using Robust.Shared.Random;
namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems;
@@ -19,6 +20,11 @@ public sealed class ChemicalPuddleArtifactSystem : EntitySystem
/// the chemicals that the puddle is made of.
///
public const string NodeDataChemicalList = "nodeDataChemicalList";
+ ///
+ /// Frontier: the key for the node data entry containing
+ /// the amount of chemicals spawned so far from this node.
+ ///
+ public const string NodeDataVolumeSpawned = "nodeDataVolumeSpawned";
///
public override void Initialize()
@@ -43,7 +49,15 @@ private void OnActivated(EntityUid uid, ChemicalPuddleArtifactComponent componen
_artifact.SetNodeData(uid, NodeDataChemicalList, chemicalList, artifact);
}
- var amountPerChem = component.ChemicalSolution.MaxVolume / component.ChemAmount;
+ // Frontier: maximum volume per node
+ if (!_artifact.TryGetNodeData(uid, NodeDataVolumeSpawned, out FixedPoint2 volumeSpawned))
+ volumeSpawned = 0;
+ FixedPoint2 volumeToSpawn = FixedPoint2.Min(component.ChemicalSolution.MaxVolume, component.MaximumVolume - volumeSpawned);
+ volumeToSpawn = FixedPoint2.Max(0, volumeToSpawn);
+ _artifact.SetNodeData(uid, NodeDataVolumeSpawned, volumeSpawned + volumeToSpawn, artifact);
+
+ var amountPerChem = volumeToSpawn / component.ChemAmount;
+ // End Frontier
foreach (var reagent in chemicalList)
{
component.ChemicalSolution.AddReagent(reagent, amountPerChem);
diff --git a/Resources/Locale/en-US/_NF/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/_NF/interaction/interaction-popup-component.ftl
index a02fa77dc31..9c91c3643ef 100644
--- a/Resources/Locale/en-US/_NF/interaction/interaction-popup-component.ftl
+++ b/Resources/Locale/en-US/_NF/interaction/interaction-popup-component.ftl
@@ -1,5 +1,7 @@
## Petting animals
petting-failure-mistake = Ymg' reach yog l' pet {THE($target)}, mgng ahlloig vulgtmnahor ot h'.
+petting-success-artifact = You pet {THE($target)} on {POSS-ADJ($target)} bizarre surfaces.
+petting-failure-artifact = You reach out to pet {THE($target)}, but a voice in your head tells you not to.
## Patting players
pat-success-generic = You pet {THE($target)} on {POSS-ADJ($target)} soft fluffy head.
diff --git a/Resources/Locale/en-US/_NF/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/_NF/xenoarchaeology/artifact-hints.ftl
new file mode 100644
index 00000000000..ab64ba1f737
--- /dev/null
+++ b/Resources/Locale/en-US/_NF/xenoarchaeology/artifact-hints.ftl
@@ -0,0 +1,3 @@
+artifact-effect-hint-reclaimer = Matter repurposing
+artifact-effect-hint-petting = Reciprocal affection
+artifact-effect-hint-mop = Fluid absorbancy
diff --git a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml
index 588f532729a..ba8a4862d5d 100644
--- a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml
+++ b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml
@@ -120,13 +120,14 @@
targetDepth: 0
effectHint: artifact-effect-hint-creation
components:
- - type: SpawnArtifact
- maxSpawns: 20
- spawns:
- - id: FoodBanana
- amount: 2 # Frontier 3<2
- maxAmount: 4 # Frontier 6<4
+ # - type: SpawnArtifact
+ # maxSpawns: 20
+ # spawns:
+ # - id: FoodBanana
+ # amount: 3
+ # maxAmount: 6
- type: ChemicalPuddleArtifact
+ maximumVolume: 200 # Frontier
chemicalSolution:
maxVol: 100
canReact: false
@@ -156,8 +157,9 @@
effectHint: artifact-effect-hint-biochemical
components:
- type: ChemicalPuddleArtifact
+ maximumVolume: 600 # Frontier
chemicalSolution:
- maxVol: 500
+ maxVol: 300 # Frontier: 500<300
canReact: false
possibleChemicals:
- Aluminium
@@ -489,8 +491,9 @@
effectHint: artifact-effect-hint-biochemical
components:
- type: ChemicalPuddleArtifact
+ maximumVolume: 600 # Frontier
chemicalSolution:
- maxVol: 500
+ maxVol: 300 # Frontier: 500<300
canReact: false
possibleChemicals:
- Dermaline
@@ -590,24 +593,6 @@
messages:
- shuffle-artifact-popup
-- type: artifactEffect
- id: EffectT4PartsSpawn
- targetDepth: 3
- effectHint: artifact-effect-hint-creation
- components:
- - type: SpawnArtifact
- maxSpawns: 10
- spawns:
- - id: QuadraticCapacitorStockPart
- prob: 0.5
- maxAmount: 3
- - id: FemtoManipulatorStockPart
- prob: 0.5
- maxAmount: 3
- - id: BluespaceMatterBinStockPart
- prob: 0.5
- maxAmount: 3
-
- type: artifactEffect
id: EffectFoamDangerous
targetDepth: 3
@@ -674,14 +659,14 @@
maxIntensity: 50
canCreateVacuum: false
-#- type: artifactEffect # Frontier
-# id: EffectPortal
-# targetDepth: 3
-# effectHint: artifact-effect-hint-displacement
-# components:
-# - type: PortalArtifact
+# - type: artifactEffect
+ # id: EffectPortal
+ # targetDepth: 3
+ # effectHint: artifact-effect-hint-displacement
+ # components:
+ # - type: PortalArtifact
-# - type: artifactEffect # Frontier
+# - type: artifactEffect
# id: EffectSingulo
# targetDepth: 10
# effectHint: artifact-effect-hint-destruction
@@ -690,3 +675,13 @@
# maxSpawns: 1
# spawns:
# - id: Singularity
+
+# - type: artifactEffect
+ # id: EffectTesla
+ # targetDepth: 10
+ # effectHint: artifact-effect-hint-destruction
+ # components:
+ # - type: SpawnArtifact
+ # maxSpawns: 1
+ # spawns:
+ # - id: TeslaEnergyBall
diff --git a/Resources/Prototypes/_NF/XenoArch/Effects/normal_effects.yml b/Resources/Prototypes/_NF/XenoArch/Effects/normal_effects.yml
new file mode 100644
index 00000000000..1ff72e650cc
--- /dev/null
+++ b/Resources/Prototypes/_NF/XenoArch/Effects/normal_effects.yml
@@ -0,0 +1,28 @@
+- type: artifactEffect
+ id: EffectT4PartsSpawn
+ targetDepth: 3
+ effectHint: artifact-effect-hint-creation
+ components:
+ - type: SpawnArtifact
+ maxSpawns: 10
+ spawns:
+ - id: QuadraticCapacitorStockPart
+ prob: 0.5
+ maxAmount: 3
+ - id: FemtoManipulatorStockPart
+ prob: 0.5
+ maxAmount: 3
+ - id: BluespaceMatterBinStockPart
+ prob: 0.5
+ maxAmount: 3
+
+- type: artifactEffect
+ id: EffectBluespaceCrystalSpawn
+ targetDepth: 3
+ effectHint: artifact-effect-hint-creation
+ components:
+ - type: SpawnArtifact
+ maxSpawns: 5
+ spawns:
+ - id: MaterialBluespace1
+ maxAmount: 3
diff --git a/Resources/Prototypes/_NF/XenoArch/Effects/utility_effects.yml b/Resources/Prototypes/_NF/XenoArch/Effects/utility_effects.yml
new file mode 100644
index 00000000000..d7bd2f0fb85
--- /dev/null
+++ b/Resources/Prototypes/_NF/XenoArch/Effects/utility_effects.yml
@@ -0,0 +1,96 @@
+# # Utility effects permanently modify the entity in some way when triggered, and they generally make it 'useful' for some purpose,
+# # like turning the artifact into a tool, or gun, or whatever.
+- type: artifactEffect
+ id: EffectReclaimer
+ targetDepth: 3
+ effectHint: artifact-effect-hint-reclaimer
+ blacklist:
+ components:
+ - Item
+ permanentComponents:
+ - type: MaterialReclaimer
+ whitelist:
+ components:
+ - PhysicalComposition
+ - SpaceGarbage
+ - Log # Frontier
+ tags:
+ - Trash
+ - Recyclable
+ blacklist:
+ components:
+ - Material
+ - Pda
+ - IdCard
+ - Brain
+ tags:
+ - HighRiskItem
+ soundCooldown: 0
+ sound:
+ path: /Audio/Ambience/Objects/crushing.ogg
+ params:
+ volume: 5
+ maxDistance: 5
+ loop: true
+ useOldSolutionLogic: true
+ solutionContainerId: output
+ powered: true
+ - type: MaterialStorage
+ insertOnInteract: false
+ - type: SolutionContainerManager
+ solutions:
+ output:
+ maxVol: 1000 # Frontier 100<1000
+ - type: DrainableSolution
+ solution: output
+ - type: ExaminableSolution
+ solution: output
+ - type: MaterialReclaimerMagnetPickup # Frontier
+ range: 0.30
+ magnetEnabled: true
+
+- type: artifactEffect
+ id: EffectInteractionPopup
+ targetDepth: 2
+ effectHint: artifact-trigger-hint-petting
+ blacklist:
+ components:
+ - Item
+ permanentComponents:
+ - type: InteractionPopup
+ successChance: 0.5
+ interactSuccessString: petting-success-artifact
+ interactFailureString: petting-failure-artifact
+ interactSuccessSpawn: EffectHearts
+ interactSuccessSound:
+ collection: RadiationPulse
+
+- type: artifactEffect
+ id: EffectAdvMop
+ targetDepth: 3
+ effectHint: artifact-trigger-hint-mop
+ whitelist:
+ components:
+ - Item
+ permanentComponents:
+ - type: Spillable
+ solution: absorbed
+ - type: Absorbent
+ pickupAmount: 100
+ - type: UseDelay
+ delay: 1.0
+ - type: SolutionRegeneration
+ solution: absorbed
+ generated:
+ reagents:
+ - ReagentId: Water
+ Quantity: 5
+ - type: SolutionPurge
+ solution: absorbed
+ preserve:
+ - Water
+ quantity: 10
+ - type: SolutionContainerManager
+ solutions:
+ absorbed:
+ maxVol: 100