Silva species gameplay difference (#701)

* plant growth spell, silva photosyntesis

* playable species guidebook

* fixes
This commit is contained in:
Ed
2025-01-06 03:31:59 +03:00
committed by GitHub
parent ed75beb0fb
commit b647583b7b
27 changed files with 414 additions and 155 deletions

View File

@@ -0,0 +1,47 @@
using System.Text;
using Content.Shared._CP14.Farming;
using Content.Shared.EntityEffects;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.Chemistry.ReagentEffect;
[UsedImplicitly]
[DataDefinition]
public sealed partial class CP14PlantResourceModify : EntityEffect
{
[DataField]
public float Energy = 0f;
[DataField]
public float Resourse = 0f;
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
{
var sb = new StringBuilder();
if (Energy != 0)
sb.Append(Loc.GetString(Energy > 0 ? "cp14-reagent-effect-guidebook-plant-add-energy" : "cp14-reagent-effect-guidebook-plant-remove-energy", ("amount", Energy), ("chance", Probability)));
if (Resourse != 0)
sb.Append(Loc.GetString(Resourse > 0 ? "cp14-reagent-effect-guidebook-plant-add-resource" : "cp14-reagent-effect-guidebook-plant-remove-resource", ("amount", Resourse), ("chance", Probability)));
return sb.ToString();
}
public override void Effect(EntityEffectBaseArgs args)
{
var scale = 1f;
if (args is EntityEffectReagentArgs reagentArgs)
{
scale = reagentArgs.Quantity.Float() * reagentArgs.Scale.Float();
}
if (!args.EntityManager.TryGetComponent<CP14PlantComponent>(args.TargetEntity, out var plantComp))
return;
var plantSystem = args.EntityManager.System<CP14SharedFarmingSystem>();
plantSystem.AffectEnergy((args.TargetEntity, plantComp), Energy * scale);
plantSystem.AffectResource((args.TargetEntity, plantComp), Resourse * scale);
}
}

View File

@@ -1,24 +1,16 @@
using System.Numerics;
using Content.Server._CP14.MagicEnergy.Components;
using Content.Shared._CP14.DayCycle;
using Content.Shared._CP14.MagicEnergy.Components;
namespace Content.Server._CP14.MagicEnergy;
public partial class CP14MagicEnergySystem
{
[Dependency] private readonly CP14SharedDayCycleSystem _dayCycle = default!;
private void InitializeDraw()
{
SubscribeLocalEvent<CP14MagicEnergyDrawComponent, MapInitEvent>(OnDrawMapInit);
SubscribeLocalEvent<CP14RandomAuraNodeComponent, MapInitEvent>(OnRandomRangeMapInit);
}
private void OnRandomRangeMapInit(Entity<CP14RandomAuraNodeComponent> random, ref MapInitEvent args)
{
if (!TryComp<CP14AuraNodeComponent>(random, out var draw))
return;
draw.Energy = _random.NextFloat(random.Comp.MinDraw, random.Comp.MaxDraw);
draw.Range = _random.NextFloat(random.Comp.MinRange, random.Comp.MaxRange);
}
private void OnDrawMapInit(Entity<CP14MagicEnergyDrawComponent> ent, ref MapInitEvent args)
@@ -30,7 +22,6 @@ public partial class CP14MagicEnergySystem
{
UpdateEnergyContainer();
UpdateEnergyCrystalSlot();
UpdateEnergyRadiusDraw();
}
private void UpdateEnergyContainer()
@@ -38,12 +29,26 @@ public partial class CP14MagicEnergySystem
var query = EntityQueryEnumerator<CP14MagicEnergyDrawComponent, CP14MagicEnergyContainerComponent>();
while (query.MoveNext(out var uid, out var draw, out var magicContainer))
{
if (!draw.Enable)
continue;
if (draw.NextUpdateTime >= _gameTiming.CurTime)
continue;
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
ChangeEnergy(uid, magicContainer, draw.Energy, safe: draw.Safe);
ChangeEnergy(uid, magicContainer, draw.Energy, draw.Safe);
}
var query2 = EntityQueryEnumerator<CP14MagicEnergyPhotosynthesisComponent, CP14MagicEnergyContainerComponent>();
while (query2.MoveNext(out var uid, out var draw, out var magicContainer))
{
if (draw.NextUpdateTime >= _gameTiming.CurTime)
continue;
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
ChangeEnergy(uid, magicContainer, _dayCycle.TryDaylightThere(uid) ? draw.DaylightEnergy : draw.DarknessEnergy, true);
}
}
@@ -66,28 +71,4 @@ public partial class CP14MagicEnergySystem
ChangeEnergy(energyEnt.Value, energyComp, draw.Energy, draw.Safe);
}
}
private void UpdateEnergyRadiusDraw()
{
var query = EntityQueryEnumerator<CP14AuraNodeComponent>();
while (query.MoveNext(out var uid, out var draw))
{
if (!draw.Enable)
continue;
if (draw.NextUpdateTime >= _gameTiming.CurTime)
continue;
draw.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(draw.Delay);
var containers = _lookup.GetEntitiesInRange<CP14MagicEnergyContainerComponent>(Transform(uid).Coordinates, draw.Range);
foreach (var container in containers)
{
var distance = Vector2.Distance(_transform.GetWorldPosition(uid), _transform.GetWorldPosition(container));
var energyDraw = draw.Energy * (1 - distance / draw.Range);
ChangeEnergy(container, container.Comp, energyDraw, true);
}
}
}
}

View File

@@ -17,8 +17,6 @@ public partial class CP14MagicEnergySystem
SubscribeLocalEvent<CP14MagicEnergyExaminableComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<CP14MagicEnergyScannerComponent, CP14MagicEnergyScanEvent>(OnMagicScanAttempt);
SubscribeLocalEvent<CP14MagicEnergyScannerComponent, InventoryRelayedEvent<CP14MagicEnergyScanEvent>>((e, c, ev) => OnMagicScanAttempt(e, c, ev.Args));
SubscribeLocalEvent<CP14AuraScannerComponent, UseInHandEvent>(OnAuraScannerUseInHand);
}
private void OnMagicScanAttempt(EntityUid uid, CP14MagicEnergyScannerComponent component, CP14MagicEnergyScanEvent args)
@@ -42,22 +40,4 @@ public partial class CP14MagicEnergySystem
args.PushMarkup(GetEnergyExaminedText(ent, magicContainer));
}
private void OnAuraScannerUseInHand(Entity<CP14AuraScannerComponent> scanner, ref UseInHandEvent args)
{
FixedPoint2 sumDraw = 0f;
var query = EntityQueryEnumerator<CP14AuraNodeComponent, TransformComponent>();
while (query.MoveNext(out var auraUid, out var node, out var xform))
{
if (xform.MapUid != Transform(scanner).MapUid)
continue;
var distance = Vector2.Distance(_transform.GetWorldPosition(auraUid), _transform.GetWorldPosition(scanner));
if (distance > node.Range)
continue;
sumDraw += node.Energy * (1 - distance / node.Range);
}
_popup.PopupCoordinates(Loc.GetString("cp14-magic-scanner", ("power", sumDraw)), Transform(scanner).Coordinates, args.User);
}
}

View File

@@ -1,50 +0,0 @@
using Content.Shared.FixedPoint;
namespace Content.Server._CP14.MagicEnergy.Components;
[RegisterComponent, Access(typeof(CP14MagicEnergySystem))]
public sealed partial class CP14AuraNodeComponent : Component
{
[DataField]
public bool Enable = true;
[DataField]
public FixedPoint2 Energy = 1f;
[DataField]
public float Range = 10f;
/// <summary>
/// If not safe, restoring or drawing power across boundaries call dangerous events, that may destroy crystals
/// </summary>
[DataField]
public bool Safe = true;
/// <summary>
/// how often objects will try to change magic energy. In Seconds
/// </summary>
[DataField]
public float Delay = 5f;
/// <summary>
/// the time of the next magic energy change
/// </summary>
[DataField]
public TimeSpan NextUpdateTime { get; set; } = TimeSpan.Zero;
}
[RegisterComponent, Access(typeof(CP14MagicEnergySystem))]
public sealed partial class CP14RandomAuraNodeComponent : Component
{
[DataField]
public float MinDraw = -2f;
[DataField]
public float MaxDraw = 2f;
[DataField]
public float MinRange = 5f;
[DataField]
public float MaxRange = 10f;
}

View File

@@ -1,6 +1,7 @@
using Content.Shared._CP14.DayCycle.Components;
using Content.Shared._CP14.DayCycle.Prototypes;
using Content.Shared.Maps;
using Content.Shared.Weather;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Shared.Prototypes;
@@ -13,27 +14,42 @@ public abstract class CP14SharedDayCycleSystem : EntitySystem
[Dependency] private readonly SharedMapSystem _maps = default!;
[Dependency] private readonly ITileDefinitionManager _tileDefManager = default!;
[Dependency] private readonly SharedWeatherSystem _weather = default!;
private EntityQuery<MapGridComponent> _mapGridQuery;
public override void Initialize()
{
base.Initialize();
_mapGridQuery = GetEntityQuery<MapGridComponent>();
}
/// <summary>
/// Checks to see if the specified entity is on the map where it's daytime.
/// </summary>
/// <param name="target">An entity being tested to see if it is in daylight</param>
/// <param name="checkRoof">Checks if the tile covers the weather (the only "roof" factor at the moment)</param>
public bool TryDaylightThere(EntityUid target, bool checkRoof)
public bool TryDaylightThere(EntityUid target, bool checkRoof = true)
{
var xform = Transform(target);
if (!TryComp<CP14DayCycleComponent>(xform.MapUid, out var dayCycle))
return false;
var day = dayCycle.CurrentPeriod == DayPeriod;
if (!checkRoof || !TryComp<MapGridComponent>(xform.GridUid, out var mapGrid))
return dayCycle.CurrentPeriod == DayPeriod;
return day;
var tileRef = _maps.GetTileRef(xform.GridUid.Value, mapGrid, xform.Coordinates);
var tileDef = (ContentTileDefinition) _tileDefManager[tileRef.Tile.TypeId];
var grid = xform.GridUid;
if (grid is null)
return day;
if (!tileDef.Weather)
if (!_mapGridQuery.TryComp(grid, out var gridComp))
return day;
if (!_weather.CanWeatherAffect(grid.Value, gridComp, _maps.GetTileRef(xform.GridUid.Value, mapGrid, xform.Coordinates)))
return false;
return dayCycle.CurrentPeriod == DayPeriod;
return day;
}
}

View File

@@ -0,0 +1,31 @@
using Content.Shared.FixedPoint;
using Content.Shared.Guidebook;
namespace Content.Shared._CP14.MagicEnergy.Components;
/// <summary>
/// Restores mana if the entity is in the sun, and wastes it if not
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14MagicEnergySystem))]
public sealed partial class CP14MagicEnergyPhotosynthesisComponent : Component
{
[DataField]
[GuidebookData]
public FixedPoint2 DaylightEnergy = 2f;
[DataField]
[GuidebookData]
public FixedPoint2 DarknessEnergy = -2f;
/// <summary>
/// how often objects will try to change magic energy. In Seconds
/// </summary>
[DataField]
public float Delay = 3f;
/// <summary>
/// the time of the next magic energy change
/// </summary>
[DataField]
public TimeSpan NextUpdateTime { get; set; } = TimeSpan.Zero;
}

View File

@@ -42,22 +42,24 @@ public sealed partial class CP14SpellStorageSystem : EntitySystem
/// <summary>
/// When we initialize, we create action entities, and add them to this item.
/// </summary>
private void OnMagicStorageInit(Entity<CP14SpellStorageComponent> mStorage, ref MapInitEvent args)
private void OnMagicStorageInit(Entity<CP14SpellStorageComponent> storage, ref MapInitEvent args)
{
if (_net.IsClient)
return;
foreach (var spell in mStorage.Comp.Spells)
foreach (var spell in storage.Comp.Spells)
{
var spellEnt = _actionContainer.AddAction(mStorage, spell);
var spellEnt = _actionContainer.AddAction(storage, spell);
if (spellEnt is null)
continue;
var provided = EntityManager.EnsureComponent<CP14MagicEffectComponent>(spellEnt.Value);
provided.SpellStorage = mStorage;
provided.SpellStorage = storage;
mStorage.Comp.SpellEntities.Add(spellEnt.Value);
storage.Comp.SpellEntities.Add(spellEnt.Value);
}
if (storage.Comp.GrantAccessToSelf)
_actions.GrantActions(storage, storage.Comp.SpellEntities, storage);
}
private void OnMagicStorageShutdown(Entity<CP14SpellStorageComponent> mStorage, ref ComponentShutdown args)

View File

@@ -8,6 +8,12 @@ namespace Content.Shared._CP14.MagicSpellStorage.Components;
[RegisterComponent, Access(typeof(CP14SpellStorageSystem))]
public sealed partial class CP14SpellStorageComponent : Component
{
/// <summary>
/// Set true when giving starting abilities to creatures in this way
/// </summary>
[DataField]
public bool GrantAccessToSelf = false;
/// <summary>
/// list of spell prototypes used for initialization.
/// </summary>

View File

@@ -20,4 +20,28 @@ cp14-reagent-effect-guidebook-mana-remove =
{ $chance ->
[1] Burns off {$amount} mana
*[other] to burn {$amount} mana
}
cp14-reagent-effect-guidebook-plant-add-resource =
{ $chance ->
[1] Restores {$amount} plant resource
*[other] to restore {$amount} plant resource
}
cp14-reagent-effect-guidebook-plant-remove-resource =
{ $chance ->
[1] Absorbes {$amount} plant resource
*[other] to abrorb {$amount} plant resource
}
cp14-reagent-effect-guidebook-plant-add-energy =
{ $chance ->
[1] Restores {$amount} plant energy
*[other] to restore {$amount} plant energy
}
cp14-reagent-effect-guidebook-plant-remove-energy =
{ $chance ->
[1] Absorbes {$amount} plant energy
*[other] to abrorb {$amount} plant energy
}

View File

@@ -20,4 +20,28 @@ cp14-reagent-effect-guidebook-mana-remove =
{ $chance ->
[1] Выжигает {$amount} единиц маны
*[other] выжечь {$amount} единиц маны
}
cp14-reagent-effect-guidebook-plant-add-resource =
{ $chance ->
[1] Восстанавливает {$amount} ресурсов растения
*[other] восстановить {$amount} ресурсов растения
}
cp14-reagent-effect-guidebook-plant-remove-resource =
{ $chance ->
[1] Поглощает {$amount} ресурсов растения
*[other] поглотить {$amount} ресурсов растения
}
cp14-reagent-effect-guidebook-plant-add-energy =
{ $chance ->
[1] Восстанавливает {$amount} энергии растения
*[other] восстановить {$amount} энергии растения
}
cp14-reagent-effect-guidebook-plant-remove-energy =
{ $chance ->
[1] Поглощает {$amount} энергии растения
*[other] поглотить {$amount} энергии растения
}

View File

@@ -0,0 +1,113 @@
- type: entity
id: CP14ActionSpellPlantGrowth
name: Plant growth
description: You restore health and internal resources to the selected plant.
components:
- type: Sprite
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: plant_growth
- type: CP14MagicEffectCastSlowdown
speedMultiplier: 0.8
- type: CP14MagicEffectManaCost
manaCost: 5
- type: CP14MagicEffect
magicType: Healing
telegraphyEffects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectPlantGrowth
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectCureWounds
- !type:CP14SpellApplyEntityEffect
effects:
- !type:HealthChange
damage:
types:
Asphyxiation: -1
Bloodloss: -1
Blunt: -1
Cellular: -0.1
Caustic: -1
Cold: -1
Heat: -1
Piercing: -1
Poison: -1
Radiation: -1
Shock: -1
Slash: -1
- !type:SatiateThirst
factor: 3
- !type:SatiateHunger
factor: 3
- !type:CP14PlantResourceModify
energy: 3
resourse: 3
- !type:Jitter
- type: CP14MagicEffectVerbalAspect
startSpeech: "Plantae durant..."
- type: CP14MagicEffectCastingVisual
proto: CP14RunePlantGrowth
- type: EntityTargetAction
whitelist:
components:
- CP14Plant
- CP14MagicEnergyPhotosynthesis
range: 2
itemIconStyle: BigAction
interactOnMiss: false
sound: !type:SoundPathSpecifier
path: /Audio/Magic/rumble.ogg
icon:
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: plant_growth
event: !type:CP14ToggleableEntityTargetActionEvent
cooldown: 15
castTime: 10
breakOnMove: true
- type: entity
parent: CP14ActionSpellPlantGrowth
id: CP14ActionSpellPlantGrowthSilva
name: Blessing of silvas
components:
- type: CP14MagicEffectManaCost
manaCost: 3
# Scrolls
- type: entity
parent: CP14BaseSpellScrollHealing
id: CP14SpellScrollPlantGrowth
name: plant growth spell scroll
components:
- type: CP14SpellStorage
spells:
- CP14ActionSpellPlantGrowth
# Effects
- type: entity
id: CP14ImpactEffectPlantGrowth
parent: CP14BaseMagicImpact
categories: [ HideSpawnMenu ]
components:
- type: Sprite
layers:
- state: wave_up
color: "#5096d4"
shader: unshaded
- type: entity
id: CP14RunePlantGrowth
parent: CP14BaseMagicRune
categories: [ HideSpawnMenu ]
components:
- type: PointLight
color: "#328643"
- type: Sprite
layers:
- state: medium_circle
color: "#79b330"
shader: unshaded

View File

@@ -43,6 +43,7 @@
event: !type:CP14ToggleableEntityTargetActionEvent
cooldown: 5
castTime: 10
breakOnMove: true
- type: entity
id: CP14RuneManaGift

View File

@@ -46,6 +46,7 @@
- id: CP14SpellScrollEarthWall
- id: CP14SpellScrollFlashLight
- id: CP14SpellScrollWaterCreation
- id: CP14SpellScrollPlantGrowth
- id: CP14EnergyCrystalSmall
- id: CP14BaseSharpeningStone
- id: CP14GlassShard

View File

@@ -1,14 +0,0 @@
- type: entity
id: CP14AuraNodeBase
parent: MarkerBase
name: aura node
description: An energy node that affects the elemental energy in the surrounding space.
categories: [ ForkFiltered ]
components:
- type: Sprite
layers:
- state: green
- sprite: Mobs/Animals/mouse.rsi
state: icon-2 #TODO lol
- type: CP14AuraNode
- type: CP14RandomAuraNode

View File

@@ -64,6 +64,13 @@
spawned:
- id: FoodMeatHuman
amount: 5
- type: CP14MagicEnergyPhotosynthesis # Silva special feature
- type: CP14SpellStorage
grantAccessToSelf: true
spells:
- CP14ActionSpellPlantGrowthSilva
- type: CP14MagicEnergyDraw
enable: false
- type: Body
prototype: CP14Silva
requiredLegs: 2

View File

@@ -1,24 +1,3 @@
- type: entity
id: CP14AuraScanner
parent: BaseItem
name: aura scanner
description: Scans the polarity of the elemental energy flows in this place.
categories: [ ForkFiltered ]
components:
- type: Sprite
sprite: _CP14/Objects/Specific/Thaumaturgy/aura_scanner.rsi
state: icon
- type: Item
sprite: _CP14/Objects/Specific/Thaumaturgy/aura_scanner.rsi
- type: CP14AuraScanner
- type: EmitSoundOnUse
sound:
path: /Audio/_CP14/Effects/aura_scanner.ogg
params:
variation: 0.03
- type: UseDelay
delay: 4
- type: entity
id: CP14RitualChalk
parent: BaseItem

View File

@@ -35,3 +35,19 @@
name: Imperial laws
text: "/ServerInfo/_CP14/Guidebook_EN/ImperialLaws.xml"
filterEnabled: True
- type: guideEntry
crystallPunkAllowed: true
id: CP14_EN_Species
name: Playable species
text: "/ServerInfo/_CP14/Guidebook_EN/Species.xml"
children:
- CP14_EN_Silva
filterEnabled: True
- type: guideEntry
crystallPunkAllowed: true
id: CP14_EN_Silva
name: Silva
text: "/ServerInfo/_CP14/Guidebook_EN/SpeciesTabs/Silva.xml"
filterEnabled: True

View File

@@ -35,3 +35,19 @@
name: Имперские законы
text: "/ServerInfo/_CP14/Guidebook_RU/ImperialLaws.xml"
filterEnabled: True
- type: guideEntry
crystallPunkAllowed: true
id: CP14_RU_Species
name: Играбельные расы
text: "/ServerInfo/_CP14/Guidebook_RU/Species.xml"
children:
- CP14_RU_Silva
filterEnabled: True
- type: guideEntry
crystallPunkAllowed: true
id: CP14_RU_Silva
name: Сильва
text: "/ServerInfo/_CP14/Guidebook_RU/SpeciesTabs/Silva.xml"
filterEnabled: True

View File

@@ -5,6 +5,7 @@
name: Welcome to CrystallEdge
text: "/ServerInfo/_CP14/Guidebook_EN/Welcome.xml"
children:
- CP14_EN_Species
- CP14_EN_Alchemy
- CP14_EN_Demiplanes
- CP14_EN_Imperial_Laws
@@ -16,6 +17,7 @@
name: Добро пожаловать в CrystallEdge
text: "/ServerInfo/_CP14/Guidebook_RU/Welcome.xml"
children:
- CP14_RU_Species
- CP14_RU_Alchemy
- CP14_RU_Demiplanes
- CP14_RU_Imperial_Laws

View File

@@ -438,6 +438,7 @@
- CP14ActionSpellWaterCreation
- CP14ActionSpellBeerCreation
- CP14ActionSpellSprint
- CP14ActionSpellPlantGrowth
- type: loadout
id: CP14ActionSpellFlameCreation
@@ -514,4 +515,17 @@
id: CP14ActionSpellSprint
dummyEntity: CP14ActionSpellSprint
actions:
- CP14ActionSpellSprint
- CP14ActionSpellSprint
- type: loadout
id: CP14ActionSpellPlantGrowth
dummyEntity: CP14ActionSpellPlantGrowth
actions:
- CP14ActionSpellPlantGrowth
effects:
- !type:JobRequirementLoadoutEffect
requirement:
!type:SpeciesRequirement
species:
- CP14Silva
inverted: true # Silvas cannot take this spell, thwy have buffed version by default

View File

@@ -0,0 +1,6 @@
<Document>
# Playable species
TODO
</Document>

View File

@@ -0,0 +1,22 @@
<Document>
# Silva
<Box>
<GuideEntityEmbed Entity="CP14MobSilva" Caption="Silva"/>
</Box>
Silvas - Don't have a lore description of the race in the guidebook yet. We await the text from the Wanderer.
## Magical photosynthesis
Silvas regenerate [protodata="CP14MobSilva" comp="CP14MagicEnergyPhotosynthesis" member="DaylightEnergy"/] mana while in sunlight, but without it they gradually lose [protodata="CP14MobSilva" comp="CP14MagicEnergyPhotosynthesis" member="DarknessEnergy"/] mana.
## Blessing of the silvas
Silvas cannot take the Plant Growth spell, but they have an improved version of it that uses less mana. Silvas are considered plants for these spells, so you can use them to restore hunger, thirst, and health to silvas just like you can restore health and resources to regular plants.
<Box>
<GuideEntityEmbed Entity="CP14ActionSpellPlantGrowthSilva"/>
</Box>
</Document>

View File

@@ -0,0 +1,6 @@
<Document>
# Игровые расы
TODO
</Document>

View File

@@ -0,0 +1,22 @@
<Document>
# Сильвы
<Box>
<GuideEntityEmbed Entity="CP14MobSilva" Caption="Сильва"/>
</Box>
Сильвы - пока что не имеют лорное описание расы в гайдбуке. Ждем текста от летописи.
## Магический фотосинтез
Сильвы регенерируют [protodata="CP14MobSilva" comp="CP14MagicEnergyPhotosynthesis" member="DaylightEnergy"/] маны находясь под солнечным светом, но без него постепенно теряют [protodata="CP14MobSilva" comp="CP14MagicEnergyPhotosynthesis" member="DarknessEnergy"/] маны.
## Благословение сильв
Сильвы не могут взять заклинание "Взращивание растений", но они имеют его улучшенную версию, которая затрачивает меньшее количество маны. Сильвы считаются растениями для этих заклинаний, так что с их помощью вы можете восстанавливать голод, жажду и здоровье сильв, как и восстанавливать здоровье и ресурсы обычных растений.
<Box>
<GuideEntityEmbed Entity="CP14ActionSpellPlantGrowthSilva"/>
</Box>
</Document>

View File

@@ -5,7 +5,7 @@
"y": 32
},
"license": "CLA",
"copyright": "Created by .kreks., cure_poison, cure_burn, mana_gift, water creation, beer creation, sprint and resurrection by TheShuEd",
"copyright": "Created by .kreks., cure_poison, cure_burn, mana_gift, water creation, plant_growth, beer creation, sprint and resurrection by TheShuEd",
"states": [
{
"name": "beer_creation"
@@ -43,6 +43,9 @@
{
"name": "mana_gift"
},
{
"name": "plant_growth"
},
{
"name": "resurrection"
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 B

View File

@@ -208,6 +208,10 @@ CP14BaseBroom: null
CP14DemiplanKey: CP14DemiplaneKeyT1
CP14SpawnerExpeditionLootCommon: CP14SpawnerDemiplaneLootT1
#2024-06-01
CP14AuraNodeBase: null
CP14AuraScanner: null
# <---> CrystallEdge migration zone end