diff --git a/Content.Client/Construction/UI/ConstructionMenuPresenter.cs b/Content.Client/Construction/UI/ConstructionMenuPresenter.cs index 4e165f4f50..624d744532 100644 --- a/Content.Client/Construction/UI/ConstructionMenuPresenter.cs +++ b/Content.Client/Construction/UI/ConstructionMenuPresenter.cs @@ -273,6 +273,21 @@ namespace Content.Client.Construction.UI || _whitelistSystem.IsWhitelistFail(recipe.EntityWhitelist, _playerManager.LocalEntity.Value)) continue; + //CP14 requirements + var requirementsMet = true; + foreach (var req in recipe.CP14Restrictions) + { + if (!req.Check(_entManager, _playerManager.LocalEntity.Value)) + { + requirementsMet = false; + break; + } + } + + if (!requirementsMet) + continue; + //CP14 + if (!string.IsNullOrEmpty(search) && (recipe.Name is { } name && !name.Contains(search.Trim(), StringComparison.InvariantCultureIgnoreCase))) diff --git a/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs b/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs index 9453417c32..ffcdbb0f77 100644 --- a/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs +++ b/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs @@ -133,6 +133,9 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer //Draw connection lines foreach (var edge in _state.Edges) { + if (!_nodeDict.ContainsKey(edge.Item1) || !_nodeDict.ContainsKey(edge.Item2)) + continue; + var node1 = _nodeDict[edge.Item1]; var node2 = _nodeDict[edge.Item2]; var fromPos = node1.UiPosition * Scale + _globalOffset; diff --git a/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs b/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs index 4ab0706c4e..637ba654ac 100644 --- a/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs +++ b/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs @@ -218,7 +218,7 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered vampire, ref ComponentInit args) + { + base.OnVampireVisualsInit(vampire, ref args); + + if (!EntityManager.TryGetComponent(vampire, out SpriteComponent? sprite)) + return; + + if (_sprite.LayerMapTryGet(vampire.Owner, vampire.Comp.FangsMap, out var fangsLayerIndex, false)) + _sprite.LayerSetVisible(vampire.Owner, fangsLayerIndex, true); + + if (_timing.IsFirstTimePredicted) + SpawnAtPosition(vampire.Comp.EnableVFX, Transform(vampire).Coordinates); + } + + protected override void OnVampireVisualsShutdown(Entity vampire, ref ComponentShutdown args) + { + base.OnVampireVisualsShutdown(vampire, ref args); + + if (!EntityManager.TryGetComponent(vampire, out SpriteComponent? sprite)) + return; + + if (_sprite.LayerMapTryGet(vampire.Owner, vampire.Comp.FangsMap, out var fangsLayerIndex, false)) + _sprite.LayerSetVisible(vampire.Owner, fangsLayerIndex, false); + + if (_timing.IsFirstTimePredicted) + SpawnAtPosition(vampire.Comp.DisableVFX, Transform(vampire).Coordinates); + } +} diff --git a/Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs b/Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs deleted file mode 100644 index 574cd73ff7..0000000000 --- a/Content.Client/_CP14/Vampire/CP14ClientVampireVisualsSystem.cs +++ /dev/null @@ -1,31 +0,0 @@ -using Content.Shared._CP14.Vampire; -using Content.Shared.Humanoid; -using Robust.Client.GameObjects; - -namespace Content.Client._CP14.Vampire; - -public sealed class CP14ClientVampireVisualsSystem : CP14SharedVampireVisualsSystem -{ - protected override void OnVampireVisualsInit(Entity vampire, ref ComponentInit args) - { - base.OnVampireVisualsInit(vampire, ref args); - - if (!EntityManager.TryGetComponent(vampire, out SpriteComponent? sprite)) - return; - - if (sprite.LayerMapTryGet(vampire.Comp.FangsMap, out var fangsLayerIndex)) - sprite.LayerSetVisible(fangsLayerIndex, true); - - } - - protected override void OnVampireVisualsShutdown(Entity vampire, ref ComponentShutdown args) - { - base.OnVampireVisualsShutdown(vampire, ref args); - - if (!EntityManager.TryGetComponent(vampire, out SpriteComponent? sprite)) - return; - - if (sprite.LayerMapTryGet(vampire.Comp.FangsMap, out var fangsLayerIndex)) - sprite.LayerSetVisible(fangsLayerIndex, false); - } -} diff --git a/Content.Client/_CP14/Vampire/CP14ShowVampireIconsSystem.cs b/Content.Client/_CP14/Vampire/CP14ShowVampireIconsSystem.cs new file mode 100644 index 0000000000..0c3298fa31 --- /dev/null +++ b/Content.Client/_CP14/Vampire/CP14ShowVampireIconsSystem.cs @@ -0,0 +1,46 @@ +using Content.Client.Administration.Managers; +using Content.Client.Overlays; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Ghost; +using Content.Shared.StatusIcon.Components; +using Robust.Client.Player; +using Robust.Shared.Prototypes; + +namespace Content.Client._CP14.Vampire; + +public sealed class CP14ShowVampireIconsSystem : EquipmentHudSystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IClientAdminManager _admin = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetStatusIcons); + } + + private void OnGetStatusIcons(Entity ent, ref GetStatusIconsEvent args) + { + if (!_proto.TryIndex(ent.Comp.Faction, out var indexedFaction)) + return; + + if (!IsActive || !_proto.TryIndex(indexedFaction.FactionIcon, out var indexedIcon)) + return; + + // Show icons for admins + if (_admin.IsAdmin() && HasComp(_player.LocalEntity)) + { + args.StatusIcons.Add(indexedIcon); + return; + } + + if (TryComp(_player.LocalEntity, out var showIcons) && + showIcons.Faction == indexedFaction) + { + args.StatusIcons.Add(indexedIcon); + return; + } + } +} diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs index d3bd5eef96..27bd3d2e3f 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Antags.cs @@ -30,6 +30,9 @@ public sealed partial class AdminVerbSystem private static readonly EntProtoId DefaultRevsRule = "Revolutionary"; private static readonly EntProtoId DefaultThiefRule = "Thief"; private static readonly ProtoId PirateGearId = "PirateGear"; + //CP14 + private static readonly EntProtoId CP14VampireRule = "CP14GameRuleVampireClanBattle"; + //CP14 end private static readonly EntProtoId ParadoxCloneRuleId = "ParadoxCloneSpawn"; @@ -49,6 +52,21 @@ public sealed partial class AdminVerbSystem var targetPlayer = targetActor.PlayerSession; + Verb vampire = new() + { + Text = Loc.GetString("cp14-admin-verb-text-make-vampire"), + Category = VerbCategory.Antag, + Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/_CP14/Actions/Spells/vampire.rsi"), + "bite"), + Act = () => + { + _antag.ForceMakeAntag(targetPlayer, CP14VampireRule); + }, + Impact = LogImpact.High, + Message = Loc.GetString("cp14-admin-verb-make-vampire"), + }; + args.Verbs.Add(vampire); + /* CP14 disable default antags var traitorName = Loc.GetString("admin-verb-text-make-traitor"); Verb traitor = new() diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index f1f07bee3d..2fdd95bbed 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -366,7 +366,7 @@ public sealed partial class ChatSystem : SharedChatSystem _chatManager.ChatMessageToManyFiltered(filter, ChatChannel.Radio, message, wrappedMessage, source ?? default, false, true, colorOverride); if (playSound) { - _audio.PlayGlobal(announcementSound?.ToString() ?? DefaultAnnouncementSound, filter, true, AudioParams.Default.WithVolume(-2f)); + _audio.PlayGlobal(announcementSound == null ? DefaultAnnouncementSound : _audio.ResolveSound(announcementSound), filter, true, AudioParams.Default.WithVolume(-2f)); //CP14 bugfix with sound resolving } _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Station Announcement from {sender}: {message}"); } diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index f29c3f2e58..8a5444367a 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -375,6 +375,17 @@ namespace Content.Server.Construction return false; } + //CP14 requirements + foreach (var req in constructionPrototype.CP14Restrictions) + { + if (!req.Check(EntityManager, user)) + { + _popup.PopupEntity(req.GetDescription(EntityManager, PrototypeManager), user, user); + return false; + } + } + //CP14 end + var startNode = constructionGraph.Nodes[constructionPrototype.StartNode]; var targetNode = constructionGraph.Nodes[constructionPrototype.TargetNode]; var pathFind = constructionGraph.Path(startNode.Name, targetNode.Name); @@ -460,6 +471,17 @@ namespace Content.Server.Construction return; } + //CP14 requirements + foreach (var req in constructionPrototype.CP14Restrictions) + { + if (!req.Check(EntityManager, user)) + { + _popup.PopupEntity(req.GetDescription(EntityManager, PrototypeManager), user, user); + return; + } + } + //CP14 end + if (_container.IsEntityInContainer(user)) { _popup.PopupEntity(Loc.GetString("construction-system-inside-container"), user, user); diff --git a/Content.Server/_CP14/Construction/Condition/CP14AllVampireClanRequired.cs b/Content.Server/_CP14/Construction/Condition/CP14AllVampireClanRequired.cs new file mode 100644 index 0000000000..b52511ece8 --- /dev/null +++ b/Content.Server/_CP14/Construction/Condition/CP14AllVampireClanRequired.cs @@ -0,0 +1,64 @@ +using Content.Shared._CP14.Vampire; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Construction; +using Content.Shared.Examine; +using Content.Shared.Mobs.Systems; +using Content.Shared.SSDIndicator; +using JetBrains.Annotations; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Server._CP14.Construction.Condition; + +[UsedImplicitly] +[DataDefinition] +public sealed partial class CP14AllVampireClanRequired : IGraphCondition +{ + [DataField(required: true)] + public ProtoId Faction; + + public bool Condition(EntityUid craft, IEntityManager entityManager) + { + if (!entityManager.TryGetComponent(craft, out var craftXform)) + return false; + + var mobState = entityManager.System(); + + var query = entityManager.EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var vampire, out var xform)) + { + if (vampire.Faction != Faction) + continue; + + if (mobState.IsDead(uid)) + continue; + + if (entityManager.TryGetComponent(uid, out var ssd) && ssd.IsSSD) + continue; + + //Check distance to the vampire + if (!xform.Coordinates.TryDistance(entityManager, craftXform.Coordinates, out var distance) || distance > 2) + return false; + } + + return true; + } + + public bool DoExamine(ExaminedEvent args) + { + if (Condition(args.Examined, IoCManager.Resolve())) + return false; + + args.PushMarkup(Loc.GetString("cp14-magic-spell-need-all-vampires")); + return true; + } + + public IEnumerable GenerateGuideEntry() + { + yield return new ConstructionGuideEntry() + { + Localization = "cp14-magic-spell-need-all-vampires", + Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/_CP14/Actions/Spells/vampire.rsi"), "blood_moon"), + }; + } +} diff --git a/Content.Server/_CP14/Construction/Condition/CP14SingletonNotExist.cs b/Content.Server/_CP14/Construction/Condition/CP14SingletonNotExist.cs new file mode 100644 index 0000000000..350eee9d94 --- /dev/null +++ b/Content.Server/_CP14/Construction/Condition/CP14SingletonNotExist.cs @@ -0,0 +1,43 @@ +using Content.Shared._CP14.UniqueLoot; +using Content.Shared.Construction; +using Content.Shared.Examine; +using JetBrains.Annotations; + +namespace Content.Server._CP14.Construction.Condition; + +[UsedImplicitly] +[DataDefinition] +public sealed partial class CP14SingletonNotExist : IGraphCondition +{ + [DataField(required: true)] + public string Key = string.Empty; + + public bool Condition(EntityUid craft, IEntityManager entityManager) + { + var query = entityManager.EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var singleton)) + { + if (singleton.Key == Key) + return false; + } + + return true; + } + + public bool DoExamine(ExaminedEvent args) + { + if (Condition(args.Examined, IoCManager.Resolve())) + return false; + + args.PushMarkup(Loc.GetString("cp14-construction-condition-singleton")); + return true; + } + + public IEnumerable GenerateGuideEntry() + { + yield return new ConstructionGuideEntry() + { + Localization = "cp14-construction-condition-singleton", + }; + } +} diff --git a/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.cs b/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.cs index 5ba28bcf96..9bcb03e17d 100644 --- a/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.cs +++ b/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.cs @@ -116,7 +116,7 @@ public sealed partial class CP14DemiplaneSystem : CP14SharedDemiplaneSystem } stationMap.GeneratedNodes.Add(targetPosition.Value); - _map.CreateMap(out var mapId, runMapInit: false); + _map.CreateMap(out var mapId, runMapInit: true); var mapUid = _map.GetMap(mapId); EnsureComp(mapUid).Position = targetPosition.Value; diff --git a/Content.Server/_CP14/GameTicking/Rules/CP14CrashToWildlandsRule.cs b/Content.Server/_CP14/GameTicking/Rules/CP14CrashToWildlandsRule.cs index e2613b98ec..5a9d9e678a 100644 --- a/Content.Server/_CP14/GameTicking/Rules/CP14CrashToWildlandsRule.cs +++ b/Content.Server/_CP14/GameTicking/Rules/CP14CrashToWildlandsRule.cs @@ -52,7 +52,7 @@ public sealed class CP14ExpeditionToWindlandsRule : GameRuleSystem(largestStationGrid.Value, out var shuttleComp); - var windlands = _mapSystem.CreateMap(out var mapId, runMapInit: false); + var windlands = _mapSystem.CreateMap(out var mapId, runMapInit: true); _generation.GenerateLocation(windlands, mapId, component.Location, component.Modifiers); _shuttles.FTLToCoordinates(largestStationGrid.Value, shuttleComp, new EntityCoordinates(windlands, Vector2.Zero), 0f, 0f, component.FloatingTime); diff --git a/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs b/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs index db3d6bbf22..15629bc6e3 100644 --- a/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs +++ b/Content.Server/_CP14/GameTicking/Rules/CP14VampireRuleSystem.cs @@ -1,96 +1,87 @@ +using System.Linq; using Content.Server._CP14.GameTicking.Rules.Components; -using Content.Server._CP14.Vampire; -using Content.Server.Atmos.Components; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Body.Components; -using Content.Server.Body.Systems; +using Content.Server._CP14.Objectives.Systems; +using Content.Server.GameTicking; using Content.Server.GameTicking.Rules; -using Content.Server.Temperature.Components; -using Content.Server.Temperature.Systems; using Content.Shared._CP14.Vampire; -using Content.Shared.Nutrition.Components; -using Content.Shared.Nutrition.EntitySystems; -using Content.Shared.Popups; -using Robust.Shared.Timing; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.GameTicking.Components; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Robust.Shared.Prototypes; namespace Content.Server._CP14.GameTicking.Rules; public sealed class CP14VampireRuleSystem : GameRuleSystem { - [Dependency] private readonly BloodstreamSystem _bloodstream = default!; - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly TemperatureSystem _temperature = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly FlammableSystem _flammable = default!; - [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly CP14VampireObjectiveConditionsSystem _condition = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; - public override void Initialize() + protected override void AppendRoundEndText(EntityUid uid, + CP14VampireRuleComponent component, + GameRuleComponent gameRule, + ref RoundEndTextAppendEvent args) { - base.Initialize(); + base.AppendRoundEndText(uid, component, gameRule, ref args); - SubscribeLocalEvent(OnVampireInit); - SubscribeLocalEvent(OnVampireHungerChanged); - } + //Alive percentage + var alivePercentage = _condition.CalculateAlivePlayersPercentage(); - private void OnVampireHungerChanged(Entity ent, ref CP14HungerChangedEvent args) - { - if (args.NewThreshold == HungerThreshold.Starving || args.NewThreshold == HungerThreshold.Dead) + var aliveFactions = new HashSet>(); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var vampireUid, out var vampire, out var mobState)) { - RevealVampire(ent); + if (mobState.CurrentState != MobState.Alive) + continue; + + if (vampire.Faction is null) + continue; + + aliveFactions.Add(vampire.Faction.Value); + } + + args.AddLine($"[head=2][color=#ab1b3d]{Loc.GetString("cp14-vampire-clans-battle")}[/color][/head]"); + + if (alivePercentage > _condition.RequiredAlivePercentage) + { + if (aliveFactions.Count == 0) + { + //City win + args.AddLine($"[head=3][color=#7d112b]{Loc.GetString("cp14-vampire-clans-battle-clan-city-win")}[/color][/head]"); + args.AddLine(Loc.GetString("cp14-vampire-clans-battle-clan-city-win-desc")); + } + + if (aliveFactions.Count == 1) + { + var faction = aliveFactions.First(); + + if (_proto.TryIndex(faction, out var indexedFaction)) + args.AddLine($"[head=3][color=#7d112b]{Loc.GetString("cp14-vampire-clans-battle-clan-win", ("name", Loc.GetString(indexedFaction.Name)))}[/color][/head]"); + args.AddLine(Loc.GetString("cp14-vampire-clans-battle-clan-win-desc")); + } + + if (aliveFactions.Count == 2) + { + var factions = aliveFactions.ToArray(); + + if (_proto.TryIndex(factions[0], out var indexedFaction1) && _proto.TryIndex(factions[1], out var indexedFaction2)) + args.AddLine($"[head=3][color=#7d112b]{Loc.GetString("cp14-vampire-clans-battle-clan-tie-2", ("name1", Loc.GetString(indexedFaction1.Name)), ("name2", Loc.GetString(indexedFaction2.Name)))}[/color][/head]"); + args.AddLine(Loc.GetString("cp14-vampire-clans-battle-clan-tie-2-desc")); + } + + if (aliveFactions.Count == 3) + { + args.AddLine($"[head=3][color=#7d112b]{Loc.GetString("cp14-vampire-clans-battle-clan-tie-3")}[/color][/head]"); + args.AddLine(Loc.GetString("cp14-vampire-clans-battle-clan-tie-3-desc")); + } } else { - HideVampire(ent); + args.AddLine($"[head=3][color=#7d112b]{Loc.GetString("cp14-vampire-clans-battle-clan-lose")}[/color][/head]"); + args.AddLine(Loc.GetString("cp14-vampire-clans-battle-clan-lose-desc")); } - } - private void RevealVampire(Entity ent) - { - EnsureComp(ent); - } - - private void HideVampire(Entity ent) - { - RemCompDeferred(ent); - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var vampire, out var temperature, out var flammable)) - { - if (_timing.CurTime < vampire.NextHeatTime) - continue; - - vampire.NextHeatTime = _timing.CurTime + vampire.HeatFrequency; - - return; - //if (!_dayCycle.UnderSunlight(uid)) - // continue; - - _temperature.ChangeHeat(uid, vampire.HeatUnderSunTemperature); - _popup.PopupEntity(Loc.GetString("cp14-heat-under-sun"), uid, uid, PopupType.SmallCaution); - - if (temperature.CurrentTemperature > vampire.IgniteThreshold && !flammable.OnFire) - { - _flammable.AdjustFireStacks(uid, 1, flammable); - _flammable.Ignite(uid, uid, flammable); - } - } - } - - private void OnVampireInit(Entity ent, ref MapInitEvent args) - { - _bloodstream.ChangeBloodReagent(ent.Owner, ent.Comp.NewBloodReagent); - - foreach (var (organUid, _) in _body.GetBodyOrgans(ent)) - { - if (TryComp(organUid, out var metabolizer) && metabolizer.MetabolizerTypes is not null) - { - metabolizer.MetabolizerTypes.Add(ent.Comp.MetabolizerType); - } - } + args.AddLine(Loc.GetString("cp14-vampire-clans-battle-alive-people", ("percent", alivePercentage * 100))); } } diff --git a/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs b/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs index 495670a581..6025aa72fe 100644 --- a/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs +++ b/Content.Server/_CP14/MagicSpell/CP14MagicSystem.cs @@ -45,8 +45,6 @@ public sealed class CP14MagicSystem : CP14SharedMagicSystem SubscribeLocalEvent(OnSpawnMagicVisualEffect); SubscribeLocalEvent(OnDespawnMagicVisualEffect); - SubscribeLocalEvent(OnManaConsume); - SubscribeLocalEvent(OnMusicCheck); } @@ -142,29 +140,6 @@ public sealed class CP14MagicSystem : CP14SharedMagicSystem ent.Comp.SpawnedEntity = null; } - private void OnManaConsume(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) - { - if (!TryComp(ent, out var magicEffect)) - return; - - var requiredMana = CalculateManacost(ent, args.Performer); - - //First - used object - if (magicEffect.SpellStorage is not null && TryComp(magicEffect.SpellStorage, out var magicStorage)) - { - var spellEv = new CP14SpellFromSpellStorageUsedEvent(args.Performer, (ent, magicEffect), requiredMana); - RaiseLocalEvent(magicEffect.SpellStorage.Value, ref spellEv); - - _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(args.Performer, out var playerMana)) - _magicEnergy.ChangeEnergy((args.Performer.Value, playerMana), -requiredMana, out _, out _, safe: false); - } - private void OnMusicCheck(Entity ent, ref CP14CastMagicEffectAttemptEvent args) { var passed = false; diff --git a/Content.Server/_CP14/Objectives/Components/CP14VampireBloodPurityConditionComponent.cs b/Content.Server/_CP14/Objectives/Components/CP14VampireBloodPurityConditionComponent.cs new file mode 100644 index 0000000000..9c6f60b129 --- /dev/null +++ b/Content.Server/_CP14/Objectives/Components/CP14VampireBloodPurityConditionComponent.cs @@ -0,0 +1,17 @@ +using Content.Server._CP14.Objectives.Systems; +using Content.Shared._CP14.Vampire; +using Content.Shared.StatusIcon; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Server._CP14.Objectives.Components; + +[RegisterComponent, Access(typeof(CP14VampireObjectiveConditionsSystem))] +public sealed partial class CP14VampireBloodPurityConditionComponent : Component +{ + [DataField] + public ProtoId? Faction; + + [DataField] + public SpriteSpecifier Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/_CP14/Actions/Spells/vampire.rsi"), "blood_moon"); +} diff --git a/Content.Server/_CP14/Objectives/Components/CP14VampireDefenceVillageConditionComponent.cs b/Content.Server/_CP14/Objectives/Components/CP14VampireDefenceVillageConditionComponent.cs new file mode 100644 index 0000000000..bc947a892e --- /dev/null +++ b/Content.Server/_CP14/Objectives/Components/CP14VampireDefenceVillageConditionComponent.cs @@ -0,0 +1,11 @@ +using Content.Server._CP14.Objectives.Systems; +using Robust.Shared.Utility; + +namespace Content.Server._CP14.Objectives.Components; + +[RegisterComponent, Access(typeof(CP14VampireObjectiveConditionsSystem))] +public sealed partial class CP14VampireDefenceVillageConditionComponent : Component +{ + [DataField] + public SpriteSpecifier Icon = new SpriteSpecifier.Rsi(new ResPath("/Textures/_CP14/Actions/Spells/vampire.rsi"), "essence_create"); +} diff --git a/Content.Server/_CP14/Objectives/Systems/CP14CurrencyCollectConditionSystem.cs b/Content.Server/_CP14/Objectives/Systems/CP14CurrencyCollectConditionSystem.cs index b5fef19043..9b7ebf945d 100644 --- a/Content.Server/_CP14/Objectives/Systems/CP14CurrencyCollectConditionSystem.cs +++ b/Content.Server/_CP14/Objectives/Systems/CP14CurrencyCollectConditionSystem.cs @@ -1,14 +1,9 @@ using Content.Server._CP14.Objectives.Components; using Content.Server.Cargo.Systems; -using Content.Server.Objectives.Components; using Content.Shared._CP14.Currency; -using Content.Shared.Interaction; using Content.Shared.Mind; -using Content.Shared.Mind.Components; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Objectives.Components; using Content.Shared.Objectives.Systems; -using Robust.Shared.Containers; namespace Content.Server._CP14.Objectives.Systems; diff --git a/Content.Server/_CP14/Objectives/Systems/CP14VampireObjectiveConditionsSystem.cs b/Content.Server/_CP14/Objectives/Systems/CP14VampireObjectiveConditionsSystem.cs new file mode 100644 index 0000000000..aa0d160c75 --- /dev/null +++ b/Content.Server/_CP14/Objectives/Systems/CP14VampireObjectiveConditionsSystem.cs @@ -0,0 +1,110 @@ +using Content.Server._CP14.Objectives.Components; +using Content.Server.Station.Components; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Mind; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Objectives.Components; +using Content.Shared.Objectives.Systems; +using Content.Shared.Roles.Jobs; +using Robust.Shared.Prototypes; + +namespace Content.Server._CP14.Objectives.Systems; + +public sealed class CP14VampireObjectiveConditionsSystem : EntitySystem +{ + [Dependency] private readonly MetaDataSystem _meta = default!; + [Dependency] private readonly SharedObjectivesSystem _objectives = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedJobSystem _jobs = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + public readonly float RequiredAlivePercentage = 0.5f; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnBloodPurityAfterAssign); + SubscribeLocalEvent(OnBloodPurityGetProgress); + + SubscribeLocalEvent(OnDefenceAfterAssign); + SubscribeLocalEvent(OnDefenceGetProgress); + } + + private void OnDefenceAfterAssign(Entity ent, ref ObjectiveAfterAssignEvent args) + { + _meta.SetEntityName(ent, Loc.GetString("cp14-objective-vampire-defence-settlement-title")); + _meta.SetEntityDescription(ent, Loc.GetString("cp14-objective-vampire-defence-settlement-desc", ("count", RequiredAlivePercentage * 100))); + _objectives.SetIcon(ent, ent.Comp.Icon); + } + + public float CalculateAlivePlayersPercentage() + { + var query = EntityQueryEnumerator(); + + var totalPlayers = 0f; + var alivePlayers = 0f; + while (query.MoveNext(out var uid, out var jobs)) + { + totalPlayers += jobs.PlayerJobs.Count; + + foreach (var (netUserId, jobsList) in jobs.PlayerJobs) + { + if (!_mind.TryGetMind(netUserId, out var mind)) + continue; + + if (!_jobs.MindTryGetJob(mind, out var jobRole)) + continue; + + var firstMindEntity = GetEntity(mind.Value.Comp.OriginalOwnedEntity); + + if (firstMindEntity is null) + continue; + + if (!_mobState.IsDead(firstMindEntity.Value)) + alivePlayers++; + } + } + + return totalPlayers > 0 ? (alivePlayers / totalPlayers) : 0f; + } + + private void OnDefenceGetProgress(Entity ent, ref ObjectiveGetProgressEvent args) + { + args.Progress = CalculateAlivePlayersPercentage() > RequiredAlivePercentage ? 1 : 0; + } + + private void OnBloodPurityAfterAssign(Entity ent, ref ObjectiveAfterAssignEvent args) + { + if (!TryComp(args.Mind?.OwnedEntity, out var vampireComp)) + return; + + ent.Comp.Faction = vampireComp.Faction; + + _meta.SetEntityName(ent, Loc.GetString("cp14-objective-vampire-pure-bood-title")); + _meta.SetEntityDescription(ent, Loc.GetString("cp14-objective-vampire-pure-bood-desc")); + _objectives.SetIcon(ent, ent.Comp.Icon); + } + + private void OnBloodPurityGetProgress(Entity ent, ref ObjectiveGetProgressEvent args) + { + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var vampire, out var mobState)) + { + if (vampire.Faction != ent.Comp.Faction) + { + if (mobState.CurrentState == MobState.Dead) + continue; + + args.Progress = 0f; + return; + } + } + + args.Progress = 1f; + } +} diff --git a/Content.Server/_CP14/Procedural/CP14SpawnProceduralLocationJob.cs b/Content.Server/_CP14/Procedural/CP14SpawnProceduralLocationJob.cs index abc6e4f157..8d49f85601 100644 --- a/Content.Server/_CP14/Procedural/CP14SpawnProceduralLocationJob.cs +++ b/Content.Server/_CP14/Procedural/CP14SpawnProceduralLocationJob.cs @@ -80,8 +80,6 @@ public sealed class CP14SpawnProceduralLocationJob( var mixture = new GasMixture(moles, Atmospherics.T20C); entManager.System().SetMapAtmosphere(MapUid, false, mixture); - if (!map.IsInitialized(mapId)) - map.InitializeMap(mapId); map.SetPaused(mapId, false); //Spawn modified config @@ -90,7 +88,7 @@ public sealed class CP14SpawnProceduralLocationJob( gridComp, position, seed)); - + //Add map components entManager.AddComponents(MapUid, locationConfig.Components); diff --git a/Content.Server/_CP14/UniqueLoot/CP14UniqueLootSystem.cs b/Content.Server/_CP14/UniqueLoot/CP14UniqueLootSystem.cs index 3eb7c37fe5..b5309ca92b 100644 --- a/Content.Server/_CP14/UniqueLoot/CP14UniqueLootSystem.cs +++ b/Content.Server/_CP14/UniqueLoot/CP14UniqueLootSystem.cs @@ -2,7 +2,6 @@ using System.Linq; using Content.Shared._CP14.UniqueLoot; using Content.Shared.GameTicking; using Content.Shared.Tag; -using Robust.Client.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -23,10 +22,24 @@ public sealed partial class CP14UniqueLootSystem : EntitySystem SubscribeLocalEvent(OnCleanup); SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnSingletonMapInit); RefreshUniqueLoot(); } + private void OnSingletonMapInit(Entity ent, ref MapInitEvent args) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var existingEnt, out var existingComp)) + { + if (existingEnt == ent.Owner || existingComp.Key != ent.Comp.Key) + continue; + + // Remove the existing entity with the same key. + QueueDel(existingEnt); + } + } + private void OnMapInit(Entity ent, ref MapInitEvent args) { var loot = GetNextUniqueLoot(ent.Comp.Tag); diff --git a/Content.Server/_CP14/Vampire/CP14VampireClanHeartExplodeBehavior.cs b/Content.Server/_CP14/Vampire/CP14VampireClanHeartExplodeBehavior.cs new file mode 100644 index 0000000000..8d3ab77bdd --- /dev/null +++ b/Content.Server/_CP14/Vampire/CP14VampireClanHeartExplodeBehavior.cs @@ -0,0 +1,37 @@ +using System.Numerics; +using Content.Server.Destructible; +using Content.Server.Destructible.Thresholds.Behaviors; +using Content.Shared._CP14.Vampire.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server._CP14.Vampire; + +[Serializable] +[DataDefinition] +public sealed partial class CP14VampireAltarExplodeBehavior : IThresholdBehavior +{ + [DataField] + public EntProtoId Essence = "CP14BloodEssence"; + + [DataField] + public float ExtractionPercentage = 0.5f; + + public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null) + { + if(!system.EntityManager.TryGetComponent(owner, out var transform)) + return; + + if(!system.EntityManager.TryGetComponent(owner, out var clanHeart)) + return; + + var random = IoCManager.Resolve(); + + var collected = clanHeart.CollectedEssence; + var spawnedEssence = MathF.Floor(collected.Float() * ExtractionPercentage); + for (var i = 0; i < spawnedEssence; i++) + { + system.EntityManager.SpawnAtPosition(Essence, transform.Coordinates.Offset(new Vector2(random.NextFloat(-1f, 1f), random.NextFloat(-1f, 1f)))); + } + } +} diff --git a/Content.Server/_CP14/Vampire/CP14VampireComponent.cs b/Content.Server/_CP14/Vampire/CP14VampireComponent.cs deleted file mode 100644 index d427eed368..0000000000 --- a/Content.Server/_CP14/Vampire/CP14VampireComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Content.Server._CP14.GameTicking.Rules; -using Content.Shared.Body.Prototypes; -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Prototypes; - -namespace Content.Server._CP14.Vampire; - -[RegisterComponent] -[Access(typeof(CP14VampireRuleSystem))] -public sealed partial class CP14VampireComponent : Component -{ - [DataField] - public ProtoId NewBloodReagent = "CP14BloodVampire"; - - [DataField] - public ProtoId MetabolizerType = "CP14Vampire"; - - [DataField] - public float HeatUnderSunTemperature = 12000f; - - [DataField] - public TimeSpan HeatFrequency = TimeSpan.FromSeconds(1); - - [DataField] - public TimeSpan NextHeatTime = TimeSpan.Zero; - - [DataField] - public float IgniteThreshold = 350f; -} diff --git a/Content.Server/_CP14/Vampire/CP14VampireSystem.Announce.cs b/Content.Server/_CP14/Vampire/CP14VampireSystem.Announce.cs new file mode 100644 index 0000000000..f1194cd5ba --- /dev/null +++ b/Content.Server/_CP14/Vampire/CP14VampireSystem.Announce.cs @@ -0,0 +1,102 @@ +using System.Text; +using Content.Server.Chat.Systems; +using Content.Shared._CP14.Vampire; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Damage; +using Content.Shared.Destructible; +using Content.Shared.Examine; +using Content.Shared.Ghost; +using Robust.Shared.Audio; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server._CP14.Vampire; + +public sealed partial class CP14VampireSystem +{ + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + + private void InitializeAnnounces() + { + SubscribeLocalEvent(OnHeartDamaged); + SubscribeLocalEvent(OnHeartDestructed); + } + + + private void OnHeartDamaged(Entity ent, ref DamageChangedEvent args) + { + if (ent.Comp.Faction is null) + return; + + if (!args.DamageIncreased) + return; + + if (_timing.CurTime < ent.Comp.NextAnnounceTime) + return; + + ent.Comp.NextAnnounceTime = _timing.CurTime + ent.Comp.MaxAnnounceFreq; + + AnnounceToFaction(ent.Comp.Faction.Value, Loc.GetString("cp14-vampire-tree-damaged")); + } + + private void OnHeartDestructed(Entity ent, ref ComponentRemove args) + { + if (ent.Comp.Faction is null) + return; + + if (!Proto.TryIndex(ent.Comp.Faction, out var indexedFaction)) + return; + + AnnounceToFaction(ent.Comp.Faction.Value, Loc.GetString("cp14-vampire-tree-destroyed-self")); + AnnounceToOpposingFactions(ent.Comp.Faction.Value, Loc.GetString("cp14-vampire-tree-destroyed", ("name", Loc.GetString(indexedFaction.Name)))); + } + + public void AnnounceToFaction(ProtoId faction, string message) + { + var filter = Filter.Empty(); + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var vampire, out var actor)) + { + if (vampire.Faction != faction) + continue; + + filter.AddPlayer(actor.PlayerSession); + } + + if (filter.Count == 0) + return; + + VampireAnnounce(filter, message); + } + + public void AnnounceToOpposingFactions(ProtoId faction, string message) + { + var filter = Filter.Empty(); + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var vampire, out var actor)) + { + if (vampire.Faction == faction) + continue; + + filter.AddPlayer(actor.PlayerSession); + } + + if (filter.Count == 0) + return; + + VampireAnnounce(filter, message); + } + + private void VampireAnnounce(Filter players, string message) + { + _chat.DispatchFilteredAnnouncement( + players, + message, + sender: Loc.GetString("cp14-vampire-sender"), + announcementSound: new SoundPathSpecifier("/Audio/_CP14/Announce/vampire.ogg"), + colorOverride: Color.FromHex("#820e22")); + } +} diff --git a/Content.Server/_CP14/Vampire/CP14VampireSystem.cs b/Content.Server/_CP14/Vampire/CP14VampireSystem.cs new file mode 100644 index 0000000000..ccc6c7a7db --- /dev/null +++ b/Content.Server/_CP14/Vampire/CP14VampireSystem.cs @@ -0,0 +1,176 @@ +using System.Text; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Server.Temperature.Components; +using Content.Server.Temperature.Systems; +using Content.Shared._CP14.DayCycle; +using Content.Shared._CP14.Vampire; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Examine; +using Content.Shared.FixedPoint; +using Content.Shared.Ghost; +using Content.Shared.Popups; +using Content.Shared.Stacks; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics.Events; +using Robust.Shared.Timing; + +namespace Content.Server._CP14.Vampire; + +public sealed partial class CP14VampireSystem : CP14SharedVampireSystem +{ + [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly TemperatureSystem _temperature = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly FlammableSystem _flammable = default!; + [Dependency] private readonly CP14DayCycleSystem _dayCycle = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + + public override void Initialize() + { + base.Initialize(); + InitializeAnnounces(); + + SubscribeLocalEvent(OnStartCollide); + SubscribeLocalEvent(OnExamined); + } + + private void OnStartCollide(Entity ent, ref StartCollideEvent args) + { + if (!TryComp(args.OtherEntity, out var collectable)) + return; + + var collect = collectable.Essence; + + if (TryComp(args.OtherEntity, out var stack)) + collect *= stack.Count; + + AddEssence(ent, collect); + Del(args.OtherEntity); + + _audio.PlayPvs(collectable.CollectSound, ent); + } + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + if (!HasComp(args.Examiner) && !HasComp(args.Examiner)) + return; + + var sb = new StringBuilder(); + + // Faction + if (Proto.TryIndex(ent.Comp.Faction, out var indexedFaction)) + sb.Append(Loc.GetString("cp14-vampire-tree-examine-faction", ("faction", Loc.GetString(indexedFaction.Name))) + "\n"); + + // Are they friend or foe? + if (TryComp(args.Examiner, out var examinerVampire)) + { + if (examinerVampire.Faction == ent.Comp.Faction) + sb.Append(Loc.GetString("cp14-vampire-tree-examine-friend") + "\n"); + else + sb.Append(Loc.GetString("cp14-vampire-tree-examine-enemy") + "\n"); + } + + //Progress + sb.Append(Loc.GetString("cp14-vampire-tree-examine-level", + ("level", ent.Comp.Level), + ("essence", ent.Comp.EssenceFromLevelStart), + ("left", ent.Comp.EssenceToNextLevel?.ToString() ?? "∞")) + "\n"+ "\n"); + + var query = EntityQueryEnumerator(); + + sb.Append(Loc.GetString("cp14-vampire-tree-other-title") + "\n"); + while (query.MoveNext(out var uid, out var heart)) + { + if (uid == ent.Owner) + continue; + + if (!Proto.TryIndex(heart.Faction, out var indexedOtherFaction)) + continue; + + sb.Append(Loc.GetString("cp14-vampire-tree-other-info", + ("name", Loc.GetString(indexedOtherFaction.Name)), + ("essence", heart.EssenceFromLevelStart), + ("left", heart.EssenceToNextLevel?.ToString() ?? "∞"), + ("lvl", heart.Level)) + "\n"); + } + + args.PushMarkup(sb.ToString()); + } + + private void AddEssence(Entity ent, FixedPoint2 amount) + { + if (!Proto.TryIndex(ent.Comp.Faction, out var indexedFaction) || ent.Comp.Faction == null) + return; + + var level = ent.Comp.Level; + + ent.Comp.CollectedEssence += amount; + Dirty(ent); + + if (level < ent.Comp.Level) //Level up! + { + _appearance.SetData(ent, VampireClanLevelVisuals.Level, ent.Comp.Level); + AnnounceToOpposingFactions(ent.Comp.Faction.Value, Loc.GetString("cp14-vampire-tree-growing", ("name", Loc.GetString(indexedFaction.Name)), ("level", ent.Comp.Level))); + AnnounceToFaction(ent.Comp.Faction.Value, Loc.GetString("cp14-vampire-tree-growing-self", ("level", ent.Comp.Level))); + + SpawnAtPosition(ent.Comp.LevelUpVfx, Transform(ent).Coordinates); + } + } + + protected override void OnVampireInit(Entity ent, ref MapInitEvent args) + { + base.OnVampireInit(ent, ref args); + + //Metabolism + foreach (var (organUid, _) in _body.GetBodyOrgans(ent)) + { + if (TryComp(organUid, out var metabolizer) && metabolizer.MetabolizerTypes is not null) + { + metabolizer.MetabolizerTypes.Add(ent.Comp.MetabolizerType); + } + } + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + //Vampire under sun heating + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var vampire, out var visuals, out var temperature, out var flammable)) + { + if (_timing.CurTime < vampire.NextHeatTime) + continue; + + vampire.NextHeatTime = _timing.CurTime + vampire.HeatFrequency; + + if (!_dayCycle.UnderSunlight(uid)) + continue; + + _temperature.ChangeHeat(uid, vampire.HeatUnderSunTemperature); + _popup.PopupEntity(Loc.GetString("cp14-heat-under-sun"), uid, uid, PopupType.SmallCaution); + + if (temperature.CurrentTemperature > vampire.IgniteThreshold && !flammable.OnFire) + { + _flammable.AdjustFireStacks(uid, 1, flammable); + _flammable.Ignite(uid, uid, flammable); + } + } + + var heartQuery = EntityQueryEnumerator(); + //regen essence over time + while (heartQuery.MoveNext(out var uid, out var heart)) + { + if (_timing.CurTime < heart.NextRegenTime) + continue; + + heart.NextRegenTime = _timing.CurTime + heart.RegenFrequency; + + AddEssence((uid, heart), heart.EssenceRegenPerLevel * heart.Level); + } + } +} diff --git a/Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs b/Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs deleted file mode 100644 index 6b225e2072..0000000000 --- a/Content.Server/_CP14/Vampire/CP14VampireVisualsSystem.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared._CP14.Vampire; - -namespace Content.Server._CP14.Vampire; - -public sealed class CP14VampireVisualsSystem : CP14SharedVampireVisualsSystem -{ -} diff --git a/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs b/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs index a39e3a7b05..36b223244b 100644 --- a/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs +++ b/Content.Shared/Construction/Prototypes/ConstructionPrototype.cs @@ -1,3 +1,4 @@ +using Content.Shared._CP14.Skill.Restrictions; using Content.Shared.Construction.Conditions; using Content.Shared.Whitelist; using Robust.Shared.Prototypes; @@ -62,6 +63,12 @@ public sealed partial class ConstructionPrototype : IPrototype [DataField] public EntityWhitelist? EntityWhitelist { get; private set; } + /// + /// CP14 - Some recipes are not available until certain conditions are met. + /// + [DataField] + public List CP14Restrictions = new(); + [DataField] public string Category { get; private set; } = string.Empty; [DataField("objectType")] public ConstructionType Type { get; private set; } = ConstructionType.Structure; diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index 19070d7cba..bd869c6415 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -130,11 +130,6 @@ public sealed class HungerSystem : EntitySystem if (calculatedHungerThreshold == component.CurrentThreshold) return; - //CP14 Raise hunger event for vampire - var ev = new CP14HungerChangedEvent(component.CurrentThreshold, calculatedHungerThreshold); - RaiseLocalEvent(uid, ev); - //CP14 Raise hunger event for vampire end - component.CurrentThreshold = calculatedHungerThreshold; DirtyField(uid, component, nameof(HungerComponent.CurrentThreshold)); DoHungerThresholdEffects(uid, component); @@ -281,10 +276,3 @@ public sealed class HungerSystem : EntitySystem } } } - - -public sealed class CP14HungerChangedEvent(HungerThreshold oldThreshold, HungerThreshold newThreshold) : EntityEventArgs -{ - public HungerThreshold OldThreshold { get; } = oldThreshold; - public HungerThreshold NewThreshold { get; } = newThreshold; -} diff --git a/Content.Shared/_CP14/CCvar/CCvars.CP14Misc.cs b/Content.Shared/_CP14/CCvar/CCvars.CP14Misc.cs index 667bc5bc86..7daa32d485 100644 --- a/Content.Shared/_CP14/CCvar/CCvars.CP14Misc.cs +++ b/Content.Shared/_CP14/CCvar/CCvars.CP14Misc.cs @@ -12,4 +12,10 @@ public sealed partial class CCVars /// public static readonly CVarDef CP14ClosedBetaTest = CVarDef.Create("cp14.closet_beta_test", false, CVar.SERVERONLY); + + /// + /// Should powerful spells be restricted from being learned until a certain time has elapsed? + /// + public static readonly CVarDef + CP14SkillTimers = CVarDef.Create("cp14.skill_timers", true, CVar.SERVER | CVar.REPLICATED); } diff --git a/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs b/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs index 16d99abc9b..8a6f3ac168 100644 --- a/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs +++ b/Content.Shared/_CP14/DayCycle/CP14DayCycleSystem.cs @@ -87,6 +87,12 @@ public sealed class CP14DayCycleSystem : EntitySystem return (float)lightLevel; } + public bool IsDayNow(Entity map) + { + var lightLevel = GetLightLevel(map); + return lightLevel >= 0.5; + } + /// /// Checks to see if the specified entity is on the map where it's daytime. /// @@ -101,7 +107,7 @@ public sealed class CP14DayCycleSystem : EntitySystem if (xform.MapUid is null || xform.GridUid is null) return false; - var day = GetLightLevel(xform.MapUid.Value) > 0.5f; + var day = IsDayNow(xform.MapUid.Value); var grid = xform.GridUid; if (grid is null) diff --git a/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs b/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs index 9d9093600a..8946f282bd 100644 --- a/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs +++ b/Content.Shared/_CP14/Farming/CP14SharedFarmingSystem.cs @@ -59,6 +59,7 @@ public abstract partial class CP14SharedFarmingSystem : EntitySystem ent.Comp.Energy = MathHelper.Clamp(ent.Comp.Energy + energyDelta, 0, ent.Comp.EnergyMax); Dirty(ent); } + public void AffectResource(Entity ent, float resourceDelta) { if (resourceDelta == 0) diff --git a/Content.Shared/_CP14/Farming/Components/CP14PlantComponent.cs b/Content.Shared/_CP14/Farming/Components/CP14PlantComponent.cs index c189434411..d7a3a37a7f 100644 --- a/Content.Shared/_CP14/Farming/Components/CP14PlantComponent.cs +++ b/Content.Shared/_CP14/Farming/Components/CP14PlantComponent.cs @@ -38,8 +38,11 @@ public sealed partial class CP14PlantComponent : Component [DataField, AutoPausedField] public TimeSpan NextUpdateTime = TimeSpan.Zero; - [DataField(required: true)] - public string Solution = string.Empty; + /// + /// Solution for metabolizing resources + /// + [DataField] + public string? Solution; } /// diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs index 7b078aaf55..0e5e7851b3 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs @@ -1,16 +1,21 @@ using System.Linq; +using Content.Shared._CP14.MagicEnergy.Components; using Content.Shared._CP14.MagicSpell.Components; using Content.Shared._CP14.MagicSpell.Events; using Content.Shared._CP14.Religion.Components; using Content.Shared._CP14.Religion.Systems; +using Content.Shared._CP14.Skill; +using Content.Shared._CP14.Skill.Components; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage.Components; +using Content.Shared.FixedPoint; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Popups; using Content.Shared.Speech.Muting; +using Content.Shared.SSDIndicator; namespace Content.Shared._CP14.MagicSpell; @@ -18,6 +23,7 @@ public abstract partial class CP14SharedMagicSystem { [Dependency] private readonly CP14SharedReligionGodSystem _god = default!; [Dependency] private readonly SharedHandsSystem _hand = default!; + [Dependency] private readonly CP14SharedSkillSystem _skill = default!; private void InitializeChecks() { @@ -26,16 +32,24 @@ public abstract partial class CP14SharedMagicSystem SubscribeLocalEvent(OnMaterialCheck); SubscribeLocalEvent(OnManaCheck); SubscribeLocalEvent(OnStaminaCheck); + SubscribeLocalEvent(OnSkillPointCheck); SubscribeLocalEvent(OnPacifiedCheck); + SubscribeLocalEvent(OnSSDCheck); SubscribeLocalEvent(OnMobStateCheck); SubscribeLocalEvent(OnReligionRestrictedCheck); //Verbal speaking SubscribeLocalEvent(OnVerbalAspectStartCast); SubscribeLocalEvent(OnVerbalAspectAfterCast); + SubscribeLocalEvent(OnEmoteStartCast); SubscribeLocalEvent(OnEmoteEndCast); + + //Consuming resources SubscribeLocalEvent(OnMaterialAspectEndCast); + SubscribeLocalEvent(OnStaminaConsume); + SubscribeLocalEvent(OnManaConsume); + SubscribeLocalEvent(OnSkillPointConsume); } /// @@ -85,6 +99,35 @@ public abstract partial class CP14SharedMagicSystem args.Cancel(); } + private void OnSkillPointCheck(Entity ent, ref CP14CastMagicEffectAttemptEvent args) + { + if (!_proto.TryIndex(ent.Comp.SkillPoint, out var indexedSkillPoint) || ent.Comp.SkillPoint is null) + return; + + if (!TryComp(args.Performer, out var skillStorage)) + { + args.PushReason(Loc.GetString("cp14-magic-spell-skillpoint-not-enough", ("name", Loc.GetString(indexedSkillPoint.Name)), ("count", ent.Comp.Count))); + args.Cancel(); + return; + } + + var points = skillStorage.SkillPoints; + if (points.TryGetValue(ent.Comp.SkillPoint.Value, out var currentPoints)) + { + var freePoints = currentPoints.Max - currentPoints.Sum; + + if (freePoints < ent.Comp.Count) + { + var d = ent.Comp.Count - freePoints; + + args.PushReason(Loc.GetString("cp14-magic-spell-skillpoint-not-enough", + ("name", Loc.GetString(indexedSkillPoint.Name)), + ("count", d))); + args.Cancel(); + } + } + } + private void OnSomaticCheck(Entity ent, ref CP14CastMagicEffectAttemptEvent args) { @@ -139,6 +182,21 @@ public abstract partial class CP14SharedMagicSystem args.Cancel(); } + private void OnSSDCheck(Entity ent, ref CP14CastMagicEffectAttemptEvent args) + { + if (args.Target is null) + return; + + if (!TryComp(args.Target.Value, out var ssdIndication)) + return; + + if (ssdIndication.IsSSD) + { + args.PushReason(Loc.GetString("cp14-magic-spell-ssd")); + args.Cancel(); + } + } + private void OnMobStateCheck(Entity ent, ref CP14CastMagicEffectAttemptEvent args) { @@ -259,4 +317,43 @@ public abstract partial class CP14SharedMagicSystem ent.Comp.Requirement.PostCraft(EntityManager, _proto, heldedItems); } + + private void OnStaminaConsume(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) + { + if (args.Performer is null) + return; + + _stamina.TakeStaminaDamage(args.Performer.Value, ent.Comp.Stamina, visual: false); + } + + private void OnManaConsume(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) + { + if (!TryComp(ent, out var magicEffect)) + return; + + var requiredMana = CalculateManacost(ent, args.Performer); + + //First - used object + if (magicEffect.SpellStorage is not null && TryComp(magicEffect.SpellStorage, out var magicStorage)) + { + var spellEv = new CP14SpellFromSpellStorageUsedEvent(args.Performer, (ent, magicEffect), requiredMana); + RaiseLocalEvent(magicEffect.SpellStorage.Value, ref spellEv); + + _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(args.Performer, out var playerMana)) + _magicEnergy.ChangeEnergy((args.Performer.Value, playerMana), -requiredMana, out _, out _, safe: false); + } + + private void OnSkillPointConsume(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) + { + if (!_proto.TryIndex(ent.Comp.SkillPoint, out var indexedSkillPoint) || ent.Comp.SkillPoint is null || args.Performer is null) + return; + + _skill.RemoveSkillPoints(args.Performer.Value, ent.Comp.SkillPoint.Value, ent.Comp.Count); + } } diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Examine.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Examine.cs index ec1c483443..3a8e71fa2b 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Examine.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Examine.cs @@ -13,6 +13,7 @@ public abstract partial class CP14SharedMagicSystem SubscribeLocalEvent(OnManacostExamined); SubscribeLocalEvent(OnStaminaCostExamined); + SubscribeLocalEvent(OnSkillPointCostExamined); SubscribeLocalEvent(OnVerbalExamined); SubscribeLocalEvent(OnSomaticExamined); @@ -39,6 +40,14 @@ public abstract partial class CP14SharedMagicSystem args.PushMarkup($"{Loc.GetString("cp14-magic-staminacost")}: [color=#3fba54]{ent.Comp.Stamina}[/color]", priority: 9); } + private void OnSkillPointCostExamined(Entity ent, ref ExaminedEvent args) + { + if (!_proto.TryIndex(ent.Comp.SkillPoint, out var indexedSkillPoint)) + return; + + args.PushMarkup($"{Loc.GetString("cp14-magic-skillpointcost", ("name", Loc.GetString(indexedSkillPoint.Name)), ("count", ent.Comp.Count))}", priority: 9); + } + private void OnVerbalExamined(Entity ent, ref ExaminedEvent args) { args.PushMarkup(Loc.GetString("cp14-magic-verbal-aspect"), 8); diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs index 2d58bb4603..e669907304 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.cs @@ -58,8 +58,6 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem SubscribeLocalEvent(OnStartCast); SubscribeLocalEvent(OnEndCast); - - SubscribeLocalEvent(OnStaminaConsume); } private void OnStartCast(Entity ent, ref CP14StartCastMagicEffectEvent args) @@ -127,6 +125,9 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem private void CastTelegraphy(Entity ent, CP14SpellEffectBaseArgs args) { + if (!_timing.IsFirstTimePredicted) + return; + foreach (var effect in ent.Comp.TelegraphyEffects) { effect.Effect(EntityManager, args); @@ -135,6 +136,9 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem private void CastSpell(Entity ent, CP14SpellEffectBaseArgs args) { + if (!_timing.IsFirstTimePredicted) + return; + var ev = new CP14MagicEffectConsumeResourceEvent(args.User); RaiseLocalEvent(ent, ref ev); @@ -176,12 +180,4 @@ public abstract partial class CP14SharedMagicSystem : EntitySystem return manaCost; } - - private void OnStaminaConsume(Entity ent, ref CP14MagicEffectConsumeResourceEvent args) - { - if (args.Performer is null) - return; - - _stamina.TakeStaminaDamage(args.Performer.Value, ent.Comp.Stamina, visual: false); - } } diff --git a/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffctPacifiedBlockComponent.cs b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectPacifiedBlockComponent.cs similarity index 100% rename from Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffctPacifiedBlockComponent.cs rename to Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectPacifiedBlockComponent.cs diff --git a/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectSSDBlockComponent.cs b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectSSDBlockComponent.cs new file mode 100644 index 0000000000..53ec253b29 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectSSDBlockComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Shared._CP14.MagicSpell.Components; + +/// +/// Blocks the target from using magic if they are pacified. +/// +[RegisterComponent, Access(typeof(CP14SharedMagicSystem))] +public sealed partial class CP14MagicEffectSSDBlockComponent : Component +{ +} diff --git a/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectSkillpointCostComponent.cs b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectSkillpointCostComponent.cs new file mode 100644 index 0000000000..e07a421afb --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectSkillpointCostComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.MagicSpell.Components; + +/// +/// Restricts the use of this action, by spending user skillpoints +/// +[RegisterComponent, Access(typeof(CP14SharedMagicSystem))] +public sealed partial class CP14MagicEffectSkillPointCostComponent : Component +{ + [DataField(required: true)] + public ProtoId? SkillPoint; + + [DataField] + public FixedPoint2 Count = 1f; +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs index e0b27cd4c3..51435e1f08 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellCasterTeleport.cs @@ -1,6 +1,7 @@ using Content.Shared.Examine; using Content.Shared.Popups; using Robust.Shared.Map; +using Robust.Shared.Network; namespace Content.Shared._CP14.MagicSpell.Spells; @@ -11,6 +12,10 @@ public sealed partial class CP14SpellCasterTeleport : CP14SpellEffect public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { + var net = IoCManager.Resolve(); + if (net.IsClient) + return; + EntityCoordinates? targetPoint = null; if (args.Position is not null) targetPoint = args.Position.Value; diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointer.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointer.cs index ec1af34875..6c9696aa2f 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointer.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointer.cs @@ -1,5 +1,6 @@ using Content.Shared.Whitelist; using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.MagicSpell.Spells; @@ -20,6 +21,10 @@ public sealed partial class CP14SpellPointer : CP14SpellEffect public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { + var net = IoCManager.Resolve(); + if (net.IsClient) + return; + if (args.User is null) return; diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointerToAlive.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointerToAlive.cs index e8aec42e2f..28434af74b 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointerToAlive.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellPointerToAlive.cs @@ -1,6 +1,7 @@ using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.MagicSpell.Spells; @@ -15,6 +16,10 @@ public sealed partial class CP14SpellPointerToAlive : CP14SpellEffect public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { + var net = IoCManager.Resolve(); + if (net.IsClient) + return; + if (args.User is null) return; diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs index 36e8feed3a..c03caa4fec 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs @@ -19,6 +19,6 @@ public sealed partial class CP14SpellRemoveMemoryPoint : CP14SpellEffect var skillSys = entManager.System(); - skillSys.RemoveMemoryPoints(args.Target.Value, SkillPointType, RemovedPoints); + skillSys.RemoveSkillPoints(args.Target.Value, SkillPointType, RemovedPoints); } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs index ae84a3454b..b8036396f6 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnTarget.cs @@ -1,4 +1,5 @@ using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.MagicSpell.Spells; @@ -8,6 +9,9 @@ public sealed partial class CP14SpellSpawnEntityOnTarget : CP14SpellEffect [DataField] public List Spawns = new(); + [DataField] + public bool Clientside = false; + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { EntityCoordinates? targetPoint = null; @@ -19,9 +23,21 @@ public sealed partial class CP14SpellSpawnEntityOnTarget : CP14SpellEffect if (targetPoint is null) return; + var netMan = IoCManager.Resolve(); + foreach (var spawn in Spawns) { - entManager.PredictedSpawnAtPosition(spawn, targetPoint.Value); + if (Clientside) + { + if (!netMan.IsClient) + continue; + + entManager.SpawnAtPosition(spawn, targetPoint.Value); + } + else + { + entManager.PredictedSpawnAtPosition(spawn, targetPoint.Value); + } } } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs index dd260bc62c..98c152b484 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSpawnEntityOnUser.cs @@ -1,4 +1,5 @@ using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.MagicSpell.Spells; @@ -8,14 +9,29 @@ public sealed partial class CP14SpellSpawnEntityOnUser : CP14SpellEffect [DataField] public List Spawns = new(); + [DataField] + public bool Clientside = false; + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { if (args.User is null || !entManager.TryGetComponent(args.User.Value, out var transformComponent)) return; + var netMan = IoCManager.Resolve(); + foreach (var spawn in Spawns) { - entManager.PredictedSpawnAtPosition(spawn, transformComponent.Coordinates); + if (Clientside) + { + if (!netMan.IsClient) + continue; + + entManager.SpawnAtPosition(spawn, transformComponent.Coordinates); + } + else + { + entManager.PredictedSpawnAtPosition(spawn, transformComponent.Coordinates); + } } } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToCity.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToCity.cs index 80ae23842e..d6539cfb74 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToCity.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToCity.cs @@ -21,7 +21,6 @@ public sealed partial class CP14SpellTeleportToCity : CP14SpellEffect if (net.IsClient) return; - var transform = entManager.System(); var random = IoCManager.Resolve(); var linkSys = entManager.System(); var query = entManager.EntityQueryEnumerator(); diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToSingleton.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToSingleton.cs new file mode 100644 index 0000000000..56a5af3632 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTeleportToSingleton.cs @@ -0,0 +1,46 @@ +using System.Numerics; +using Content.Shared._CP14.UniqueLoot; +using Content.Shared.Teleportation.Systems; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellTeleportToSingleton : CP14SpellEffect +{ + [DataField] + public EntProtoId PortalProto = "CP14TempPortalRed"; + + [DataField(required: true)] + public string SingletonKey; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Position is null) + return; + + var net = IoCManager.Resolve(); + + if (net.IsClient) + return; + + var random = IoCManager.Resolve(); + var linkSys = entManager.System(); + var query = entManager.EntityQueryEnumerator(); + + var first = entManager.SpawnAtPosition(PortalProto, args.Position.Value); + + while (query.MoveNext(out var uid, out var singleton, out var xform)) + { + if (singleton.Key != SingletonKey) + continue; + + var randomOffset = new Vector2(random.Next(-1, 1), random.Next(-1, 1)); + var second = entManager.SpawnAtPosition(PortalProto, xform.Coordinates.Offset(randomOffset)); + + linkSys.TryLink(first, second, true); + return; + } + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellPointerToVampireClan.cs b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellPointerToVampireClan.cs new file mode 100644 index 0000000000..ffacc98e93 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellPointerToVampireClan.cs @@ -0,0 +1,67 @@ +using Content.Shared._CP14.Vampire.Components; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +/// +/// Indicates all vampires within range belonging to the same faction as the caster. If inverted, it indicates enemy vampires. +/// +public sealed partial class CP14SpellPointerToVampireClan : CP14SpellEffect +{ + [DataField(required: true)] + public EntProtoId PointerEntity; + + [DataField(required: true)] + public float SearchRange = 60f; + + [DataField] + public bool Inversed = false; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + var net = IoCManager.Resolve(); + if (net.IsClient) + return; + + if (args.User is null) + return; + + if (!entManager.TryGetComponent(args.User.Value, out var vampireComponent)) + return; + + var lookup = entManager.System(); + var transform = entManager.System(); + + var originPosition = transform.GetWorldPosition(args.User.Value); + var originEntPosition = transform.GetMoverCoordinates(args.User.Value); + + var entitiesInRange = lookup.GetEntitiesInRange(originEntPosition, SearchRange); + foreach (var ent in entitiesInRange) + { + if (ent.Owner == args.User.Value) + continue; + + if (!Inversed) + { + if (ent.Comp.Faction != vampireComponent.Faction) + continue; + } + else + { + if (ent.Comp.Faction == vampireComponent.Faction) + continue; + } + + var targetPosition = transform.GetWorldPosition(ent); + + //Calculate the rotation + Angle angle = new(targetPosition - originPosition); + + var pointer = entManager.Spawn(PointerEntity, new MapCoordinates(originPosition, transform.GetMapId(originEntPosition))); + + transform.SetWorldRotation(pointer, angle + Angle.FromDegrees(90)); + } + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellSuckBlood.cs similarity index 95% rename from Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs rename to Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellSuckBlood.cs index 199682e082..52d616c9a0 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSuckBlood.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellSuckBlood.cs @@ -6,7 +6,7 @@ namespace Content.Shared._CP14.MagicSpell.Spells; public sealed partial class CP14SpellSuckBlood : CP14SpellEffect { [DataField] - public FixedPoint2 SuckAmount = 25; + public FixedPoint2 SuckAmount = 10; public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { if (args.Target is null) diff --git a/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellTeleportToVampireSingleton.cs b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellTeleportToVampireSingleton.cs new file mode 100644 index 0000000000..1264e452be --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellTeleportToVampireSingleton.cs @@ -0,0 +1,54 @@ +using System.Numerics; +using Content.Shared._CP14.UniqueLoot; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Teleportation.Systems; +using Robust.Shared.Network; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellTeleportToVampireSingleton : CP14SpellEffect +{ + [DataField] + public EntProtoId PortalProto = "CP14TempPortalRed"; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Position is null) + return; + if (args.User is null) + return; + + if (!entManager.TryGetComponent(args.User.Value, out var vampireComponent)) + return; + + var net = IoCManager.Resolve(); + + if (net.IsClient) + return; + + var protoMan = IoCManager.Resolve(); + var random = IoCManager.Resolve(); + var linkSys = entManager.System(); + var query = entManager.EntityQueryEnumerator(); + + if (!protoMan.TryIndex(vampireComponent.Faction, out var indexedVampireFaction)) + return; + + var first = entManager.SpawnAtPosition(PortalProto, args.Position.Value); + + while (query.MoveNext(out var uid, out var singleton, out var xform)) + { + + if (singleton.Key != indexedVampireFaction.SingletonTeleportKey) + continue; + + var randomOffset = new Vector2(random.Next(-1, 1), random.Next(-1, 1)); + var second = entManager.SpawnAtPosition(PortalProto, xform.Coordinates.Offset(randomOffset)); + + linkSys.TryLink(first, second, true); + return; + } + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellVampireGatherEssence.cs b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellVampireGatherEssence.cs new file mode 100644 index 0000000000..07c9f7cefc --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/Vampire/CP14SpellVampireGatherEssence.cs @@ -0,0 +1,29 @@ +using Content.Shared._CP14.Vampire; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.FixedPoint; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellVampireGatherEssence : CP14SpellEffect +{ + [DataField] + public FixedPoint2 Amount = 0.2f; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Target is null) + return; + + if (args.User is null) + return; + + if (entManager.HasComponent(args.Target.Value)) + return; + + if (!entManager.TryGetComponent(args.Target.Value, out var essenceHolder)) + return; + + var vamp = entManager.System(); + vamp.GatherEssence(args.User.Value, args.Target.Value, Amount); + } +} diff --git a/Content.Shared/_CP14/NightVision/CP14NightVisionComponent.cs b/Content.Shared/_CP14/NightVision/CP14NightVisionComponent.cs index 2e805a01f8..58d3fd6d86 100644 --- a/Content.Shared/_CP14/NightVision/CP14NightVisionComponent.cs +++ b/Content.Shared/_CP14/NightVision/CP14NightVisionComponent.cs @@ -3,16 +3,16 @@ using Robust.Shared.Prototypes; namespace Content.Shared._CP14.NightVision; -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class CP14NightVisionComponent : Component { [DataField] public EntityUid? LocalLightEntity = null; - [DataField] + [DataField, AutoNetworkedField] public EntProtoId LightPrototype = "CP14NightVisionLight"; - [DataField] + [DataField, AutoNetworkedField] public EntProtoId ActionPrototype = "CP14ActionToggleNightVision"; [DataField] diff --git a/Content.Shared/_CP14/Random/Rules/IsDaylight.cs b/Content.Shared/_CP14/Random/Rules/IsDaylight.cs index 66bd8dbdda..3ad869d0f5 100644 --- a/Content.Shared/_CP14/Random/Rules/IsDaylight.cs +++ b/Content.Shared/_CP14/Random/Rules/IsDaylight.cs @@ -18,8 +18,8 @@ public sealed partial class CP14IsNight : RulesRule if (map is null) return false; - var lightLevel = dayCycle.GetLightLevel(map.Value); + var isDay = dayCycle.IsDayNow(map.Value); - return Inverted ? lightLevel < 0.5 : lightLevel >= 0.5; + return Inverted ? !isDay : isDay; } } diff --git a/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs b/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs index 1515e13525..09a429c26a 100644 --- a/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs +++ b/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs @@ -4,13 +4,25 @@ using Content.Shared._CP14.Skill.Components; using Content.Shared._CP14.Skill.Prototypes; using Content.Shared._CP14.Skill.Restrictions; using Content.Shared.FixedPoint; +using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; +using Content.Shared.Stacks; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Network; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using Robust.Shared.Timing; namespace Content.Shared._CP14.Skill; public abstract partial class CP14SharedSkillSystem : EntitySystem { + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly INetManager _net = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly IGameTiming _timing = default!; + private EntityQuery _skillStorageQuery; public override void Initialize() @@ -20,12 +32,42 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem _skillStorageQuery = GetEntityQuery(); SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnInteracted); InitializeAdmin(); InitializeChecks(); InitializeScanning(); } + private void OnInteracted(Entity ent, ref UseInHandEvent args) + { + if (!_timing.IsFirstTimePredicted) + return; + + if (ent.Comp.Whitelist is null || !_whitelist.IsValid(ent.Comp.Whitelist, args.User)) + return; + + if (_net.IsServer) + { + var collect = ent.Comp.Volume; + + if (TryComp(ent, out var stack)) + collect *= stack.Count; + + AddSkillPoints(args.User, ent.Comp.PointType, collect); + } + + var position = Transform(ent).Coordinates; + + //Client VFX + if (_net.IsClient) + SpawnAtPosition(ent.Comp.ConsumeEffect, position); + + _audio.PlayPredicted(ent.Comp.ConsumeSound, position, args.User); + + PredictedQueueDel(ent.Owner); + } + private void OnMapInit(Entity ent, ref MapInitEvent args) { //If at initialization we have any skill records, we automatically give them to this entity @@ -47,6 +89,31 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem } } + /// + /// Adds a skill tree to the player, allowing them to learn skills from it. + /// + public void AddSkillTree(EntityUid target, + ProtoId tree, + CP14SkillStorageComponent? component = null) + { + if (!Resolve(target, ref component, false)) + return; + + component.AvailableSkillTrees.Add(tree); + DirtyField(target, component, nameof(CP14SkillStorageComponent.AvailableSkillTrees)); + } + + public void RemoveSkillTree(EntityUid target, + ProtoId tree, + CP14SkillStorageComponent? component = null) + { + if (!Resolve(target, ref component, false)) + return; + + component.AvailableSkillTrees.Remove(tree); + DirtyField(target, component, nameof(CP14SkillStorageComponent.AvailableSkillTrees)); + } + /// /// Directly adds the skill to the player, bypassing any checks. /// @@ -194,7 +261,7 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem //Restrictions check foreach (var req in skill.Restrictions) { - if (!req.Check(EntityManager, target, skill)) + if (!req.Check(EntityManager, target)) return false; } @@ -231,9 +298,12 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem if (indexedSkill.Name is not null) return Loc.GetString(indexedSkill.Name); - if (indexedSkill.Effects.Count > 0) - return indexedSkill.Effects.First().GetName(EntityManager, _proto) ?? string.Empty; - + foreach (var effect in indexedSkill.Effects) + { + var name = effect.GetName(EntityManager, _proto); + if (name != null) + return name; + } return string.Empty; } @@ -245,11 +315,11 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem if (!_proto.TryIndex(skill, out var indexedSkill)) return string.Empty; - if (indexedSkill.Desc is not null) - return Loc.GetString(indexedSkill.Desc); - var sb = new StringBuilder(); + if (indexedSkill.Desc is not null) + sb.Append(Loc.GetString(indexedSkill.Desc)); + foreach (var effect in indexedSkill.Effects) { sb.Append(effect.GetDescription(EntityManager, _proto, skill) + "\n"); @@ -297,9 +367,7 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem CP14SkillStorageComponent? component = null) { if (!Resolve(target, ref component, false)) - { return false; - } for (var i = component.LearnedSkills.Count - 1; i >= 0; i--) { @@ -320,38 +388,61 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem public void AddSkillPoints(EntityUid target, ProtoId type, FixedPoint2 points, - FixedPoint2 limit, + FixedPoint2? limit = null, + bool silent = false, CP14SkillStorageComponent? component = null) { + if (points <= 0) + return; + if (!Resolve(target, ref component, false)) return; - if (component.SkillPoints.TryGetValue(type, out var skillContainer)) - skillContainer.Max = FixedPoint2.Min(skillContainer.Max + points, limit); + if (!_proto.TryIndex(type, out var indexedType)) + return; - Dirty(target, component); + if (!component.SkillPoints.TryGetValue(type, out var skillContainer)) + { + skillContainer = new CP14SkillPointContainerEntry(); + component.SkillPoints[type] = skillContainer; + } - _popup.PopupEntity(Loc.GetString("cp14-skill-popup-added-points", ("count", points)), target, target); + skillContainer.Max = limit is not null + ? FixedPoint2.Min(skillContainer.Max + points, limit.Value) + : skillContainer.Max + points; + + DirtyField(target, component, nameof(CP14SkillStorageComponent.SkillPoints)); + + if (indexedType.GetPointPopup is not null && !silent && _timing.IsFirstTimePredicted) + _popup.PopupClient(Loc.GetString(indexedType.GetPointPopup, ("count", points)), target, target); } /// /// Removes memory points. If a character has accumulated skills exceeding the new memory limit, random skills will be removed. /// - public void RemoveMemoryPoints(EntityUid target, + public void RemoveSkillPoints(EntityUid target, ProtoId type, FixedPoint2 points, + bool silent = false, CP14SkillStorageComponent? component = null) { + if (points <= 0) + return; + if (!Resolve(target, ref component, false)) return; + if (!_proto.TryIndex(type, out var indexedType)) + return; + if (!component.SkillPoints.TryGetValue(type, out var skillContainer)) return; skillContainer.Max = FixedPoint2.Max(skillContainer.Max - points, 0); Dirty(target, component); - _popup.PopupEntity(Loc.GetString("cp14-skill-popup-removed-points", ("count", points)), target, target); + if (indexedType.LosePointPopup is not null && !silent && _timing.IsFirstTimePredicted) + _popup.PopupClient(Loc.GetString(indexedType.LosePointPopup, ("count", points)), target, target); while (skillContainer.Sum > skillContainer.Max) { diff --git a/Content.Shared/_CP14/Skill/CP14SkillSystem.Checks.cs b/Content.Shared/_CP14/Skill/CP14SkillSystem.Checks.cs index dbfa66e89e..b16c4461ea 100644 --- a/Content.Shared/_CP14/Skill/CP14SkillSystem.Checks.cs +++ b/Content.Shared/_CP14/Skill/CP14SkillSystem.Checks.cs @@ -14,7 +14,6 @@ namespace Content.Shared._CP14.Skill; public abstract partial class CP14SharedSkillSystem { [Dependency] private readonly ThrowingSystem _throwing = default!; - [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly DamageableSystem _damageable = default!; diff --git a/Content.Shared/_CP14/Skill/Components/CP14SkillPointConsumableComponent.cs b/Content.Shared/_CP14/Skill/Components/CP14SkillPointConsumableComponent.cs new file mode 100644 index 0000000000..8e1a5826d4 --- /dev/null +++ b/Content.Shared/_CP14/Skill/Components/CP14SkillPointConsumableComponent.cs @@ -0,0 +1,42 @@ +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared.FixedPoint; +using Content.Shared.Whitelist; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Skill.Components; + +/// +/// Allows you to see what skills the creature possesses +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class CP14SkillPointConsumableComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId PointType = "Memory"; + + /// + /// How much skill points this consumable gives when consumed. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 Volume = 1f; + + /// + /// The visual effect that appears on the client when the player consumes this skill point. + /// + [DataField] + public EntProtoId? ConsumeEffect; + + [DataField] + public SoundSpecifier ConsumeSound = new SoundPathSpecifier("/Audio/_CP14/Effects/essence_consume.ogg") + { + Params = AudioParams.Default.WithVolume(-2f).WithVariation(0.2f), + }; + + /// + /// White list of who can absorb this skill point + /// + [DataField] + public EntityWhitelist? Whitelist; +} diff --git a/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs b/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs index b182e92e23..46c7247214 100644 --- a/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs +++ b/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs @@ -9,14 +9,14 @@ namespace Content.Shared._CP14.Skill.Components; /// /// Component that stores the skills learned by a player and their progress in the skill trees. /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true, fieldDeltas: true)] [Access(typeof(CP14SharedSkillSystem))] public sealed partial class CP14SkillStorageComponent : Component { /// /// Skill trees displayed in the skill tree interface. Only skills from these trees can be learned by this player. /// - [DataField] + [DataField, AutoNetworkedField] public HashSet> AvailableSkillTrees = new(); /// diff --git a/Content.Shared/_CP14/Skill/Effects/ReplaceAction.cs b/Content.Shared/_CP14/Skill/Effects/ReplaceAction.cs index 5b6b1253e6..d2410ae2e5 100644 --- a/Content.Shared/_CP14/Skill/Effects/ReplaceAction.cs +++ b/Content.Shared/_CP14/Skill/Effects/ReplaceAction.cs @@ -1,6 +1,8 @@ using Content.Shared._CP14.Skill.Prototypes; using Content.Shared.Actions; +using Content.Shared.Examine; using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Shared._CP14.Skill.Effects; @@ -65,6 +67,16 @@ public sealed partial class ReplaceAction : CP14SkillEffect public override string? GetDescription(IEntityManager entMagager, IPrototypeManager protoManager, ProtoId skill) { - return !protoManager.TryIndex(NewAction, out var indexedAction) ? string.Empty : indexedAction.Description; + var dummyAction = entMagager.Spawn(NewAction); + var message = new FormattedMessage(); + if (!entMagager.TryGetComponent(dummyAction, out var meta)) + return null; + + message.AddText(meta.EntityDescription + "\n"); + var ev = new ExaminedEvent(message, dummyAction, dummyAction, true, true); + entMagager.EventBus.RaiseLocalEvent(dummyAction, ev); + + entMagager.DeleteEntity(dummyAction); + return ev.GetTotalMessage().ToMarkup(); } } diff --git a/Content.Shared/_CP14/Skill/Effects/UnlockConstructions.cs b/Content.Shared/_CP14/Skill/Effects/UnlockConstructions.cs new file mode 100644 index 0000000000..7b78628625 --- /dev/null +++ b/Content.Shared/_CP14/Skill/Effects/UnlockConstructions.cs @@ -0,0 +1,101 @@ +using System.Text; +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared._CP14.Skill.Restrictions; +using Content.Shared.Construction; +using Content.Shared.Construction.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Skill.Effects; + +/// +/// This effect only exists for parsing the description. +/// +public sealed partial class UnlockConstructions : CP14SkillEffect +{ + public override void AddSkill(IEntityManager entManager, EntityUid target) + { + // + } + + public override void RemoveSkill(IEntityManager entManager, EntityUid target) + { + // + } + + public override string? GetName(IEntityManager entMagager, IPrototypeManager protoManager) + { + return null; + } + + public override string? GetDescription(IEntityManager entMagager, IPrototypeManager protoManager, ProtoId skill) + { + var allRecipes = protoManager.EnumeratePrototypes(); + + var sb = new StringBuilder(); + sb.Append(Loc.GetString("cp14-skill-desc-unlock-constructions") + "\n"); + + var affectedRecipes = new List(); + foreach (var recipe in allRecipes) + { + foreach (var req in recipe.CP14Restrictions) + { + if (req is NeedPrerequisite prerequisite) + { + if (prerequisite.Prerequisite == skill) + { + affectedRecipes.Add(recipe); + break; + } + } + } + } + foreach (var constructionProto in affectedRecipes) + { + if (!protoManager.TryIndex(constructionProto.Graph, out var graphProto)) + continue; + + if (constructionProto.TargetNode is not { } targetNodeId) + continue; + + if (!graphProto.Nodes.TryGetValue(targetNodeId, out var targetNode)) + continue; + + // Recursion is for wimps. + var stack = new Stack(); + stack.Push(targetNode); + + + do + { + var node = stack.Pop(); + + // We try to get the id of the target prototype, if it fails, we try going through the edges. + if (node.Entity.GetId(null, null, new(entMagager)) is not { } entityId) + { + // If the stack is not empty, there is a high probability that the loop will go to infinity. + if (stack.Count == 0) + { + foreach (var edge in node.Edges) + { + if (graphProto.Nodes.TryGetValue(edge.Target, out var graphNode)) + stack.Push(graphNode); + } + } + + continue; + } + + // If we got the id of the prototype, we exit the “recursion” by clearing the stack. + stack.Clear(); + + if (!protoManager.TryIndex(entityId, out var proto)) + continue; + + sb.Append("- " + Loc.GetString(proto.Name) + "\n"); + + } while (stack.Count > 0); + } + + return sb.ToString(); + } +} diff --git a/Content.Shared/_CP14/Skill/Prototypes/CP14SkillPointPrototype.cs b/Content.Shared/_CP14/Skill/Prototypes/CP14SkillPointPrototype.cs index 144adba497..5a41f97b76 100644 --- a/Content.Shared/_CP14/Skill/Prototypes/CP14SkillPointPrototype.cs +++ b/Content.Shared/_CP14/Skill/Prototypes/CP14SkillPointPrototype.cs @@ -16,4 +16,10 @@ public sealed partial class CP14SkillPointPrototype : IPrototype [DataField] public SpriteSpecifier? Icon; + + [DataField] + public LocId? GetPointPopup; + + [DataField] + public LocId? LosePointPopup; } diff --git a/Content.Shared/_CP14/Skill/Restrictions/CP14SkillRestriction.cs b/Content.Shared/_CP14/Skill/Restrictions/CP14SkillRestriction.cs index 17907343aa..4548e79eb8 100644 --- a/Content.Shared/_CP14/Skill/Restrictions/CP14SkillRestriction.cs +++ b/Content.Shared/_CP14/Skill/Restrictions/CP14SkillRestriction.cs @@ -8,7 +8,12 @@ namespace Content.Shared._CP14.Skill.Restrictions; [MeansImplicitUse] public abstract partial class CP14SkillRestriction { - public abstract bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill); + /// + /// If true - this skill won't be shown in skill tree if user doesn't meet this restriction + /// + public virtual bool HideFromUI => false; + + public abstract bool Check(IEntityManager entManager, EntityUid target); public abstract string GetDescription(IEntityManager entManager, IPrototypeManager protoManager); } diff --git a/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs b/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs index aafe472d7d..96d23d3ab0 100644 --- a/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs +++ b/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs @@ -9,7 +9,7 @@ public sealed partial class GodFollowerPercentage : CP14SkillRestriction { [DataField] public FixedPoint2 Percentage = 0.5f; - public override bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill) + public override bool Check(IEntityManager entManager, EntityUid target) { if (!entManager.TryGetComponent(target, out var god)) return false; diff --git a/Content.Shared/_CP14/Skill/Restrictions/Impossible.cs b/Content.Shared/_CP14/Skill/Restrictions/Impossible.cs index 38707056c4..76a0a6f1db 100644 --- a/Content.Shared/_CP14/Skill/Restrictions/Impossible.cs +++ b/Content.Shared/_CP14/Skill/Restrictions/Impossible.cs @@ -1,12 +1,10 @@ -using Content.Shared._CP14.Skill.Components; -using Content.Shared._CP14.Skill.Prototypes; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.Skill.Restrictions; public sealed partial class Impossible : CP14SkillRestriction { - public override bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill) + public override bool Check(IEntityManager entManager, EntityUid target) { return false; } diff --git a/Content.Shared/_CP14/Skill/Restrictions/NeedPrerequisite.cs b/Content.Shared/_CP14/Skill/Restrictions/NeedPrerequisite.cs index 3f68e78899..629706b8f1 100644 --- a/Content.Shared/_CP14/Skill/Restrictions/NeedPrerequisite.cs +++ b/Content.Shared/_CP14/Skill/Restrictions/NeedPrerequisite.cs @@ -9,7 +9,7 @@ public sealed partial class NeedPrerequisite : CP14SkillRestriction [DataField(required: true)] public ProtoId Prerequisite = new(); - public override bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill) + public override bool Check(IEntityManager entManager, EntityUid target) { if (!entManager.TryGetComponent(target, out var skillStorage)) return false; diff --git a/Content.Shared/_CP14/Skill/Restrictions/SpeciesBlacklist.cs b/Content.Shared/_CP14/Skill/Restrictions/SpeciesBlacklist.cs new file mode 100644 index 0000000000..739a8489ba --- /dev/null +++ b/Content.Shared/_CP14/Skill/Restrictions/SpeciesBlacklist.cs @@ -0,0 +1,29 @@ +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Skill.Restrictions; + +public sealed partial class SpeciesBlacklist : CP14SkillRestriction +{ + public override bool HideFromUI => true; + + [DataField(required: true)] + public ProtoId Species = new(); + + public override bool Check(IEntityManager entManager, EntityUid target) + { + if (!entManager.TryGetComponent(target, out var appearance)) + return false; + + return appearance.Species != Species; + } + + public override string GetDescription(IEntityManager entManager, IPrototypeManager protoManager) + { + var species = protoManager.Index(Species); + + return Loc.GetString("cp14-skill-req-notspecies", ("name", Loc.GetString(species.Name))); + } +} diff --git a/Content.Shared/_CP14/Skill/Restrictions/SpeciesWhitelist.cs b/Content.Shared/_CP14/Skill/Restrictions/SpeciesWhitelist.cs index d46b8c2b36..dc67b85f5f 100644 --- a/Content.Shared/_CP14/Skill/Restrictions/SpeciesWhitelist.cs +++ b/Content.Shared/_CP14/Skill/Restrictions/SpeciesWhitelist.cs @@ -1,4 +1,3 @@ -using Content.Shared._CP14.Skill.Prototypes; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Prototypes; using Robust.Shared.Prototypes; @@ -7,10 +6,12 @@ namespace Content.Shared._CP14.Skill.Restrictions; public sealed partial class SpeciesWhitelist : CP14SkillRestriction { + public override bool HideFromUI => true; + [DataField(required: true)] public ProtoId Species = new(); - public override bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill) + public override bool Check(IEntityManager entManager, EntityUid target) { if (!entManager.TryGetComponent(target, out var appearance)) return false; diff --git a/Content.Shared/_CP14/Skill/Restrictions/TimeGate.cs b/Content.Shared/_CP14/Skill/Restrictions/TimeGate.cs new file mode 100644 index 0000000000..6216df18e4 --- /dev/null +++ b/Content.Shared/_CP14/Skill/Restrictions/TimeGate.cs @@ -0,0 +1,40 @@ +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared.CCVar; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Shared._CP14.Skill.Restrictions; + +public sealed partial class TimeGate : CP14SkillRestriction +{ + [DataField(required: true)] + public int Minutes = 1; + + public override bool Check(IEntityManager entManager, EntityUid target) + { + var timing = IoCManager.Resolve(); + var cfg = IoCManager.Resolve(); + + if (cfg.GetCVar(CCVars.CP14SkillTimers) == false) + return true; + + return timing.CurTime >= TimeSpan.FromMinutes(Minutes); + } + + public override string GetDescription(IEntityManager entManager, IPrototypeManager protoManager) + { + var timing = IoCManager.Resolve(); + var cfg = IoCManager.Resolve(); + + var leftoverTime = TimeSpan.FromMinutes(Minutes) - timing.CurTime; + leftoverTime = leftoverTime < TimeSpan.Zero ? TimeSpan.Zero : leftoverTime; + + if (cfg.GetCVar(CCVars.CP14SkillTimers) == false) + return Loc.GetString("cp14-skill-req-timegate-disabled", ("minute", Minutes)); + + return Loc.GetString("cp14-skill-req-timegate", ("minute", Minutes), ("left", Math.Ceiling(leftoverTime.TotalMinutes))); + } +} diff --git a/Content.Shared/_CP14/Skill/Restrictions/VampireClanLevel.cs b/Content.Shared/_CP14/Skill/Restrictions/VampireClanLevel.cs new file mode 100644 index 0000000000..c63ca244a0 --- /dev/null +++ b/Content.Shared/_CP14/Skill/Restrictions/VampireClanLevel.cs @@ -0,0 +1,45 @@ +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.CCVar; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Shared._CP14.Skill.Restrictions; + +public sealed partial class VampireClanLevel : CP14SkillRestriction +{ + [DataField] + public int Level = 1; + + public override bool Check(IEntityManager entManager, EntityUid target) + { + if (!entManager.TryGetComponent(target, out var playerVampire)) + return false; + + if (!entManager.TryGetComponent(target, out var xform)) + return false; + + var lookup = entManager.System(); + + foreach (var tree in lookup.GetEntitiesInRange(xform.Coordinates, 2)) + { + if (tree.Comp.Faction != playerVampire.Faction) + continue; + + if (tree.Comp.Level < Level) + continue; + + return true; + } + + return false; + } + + public override string GetDescription(IEntityManager entManager, IPrototypeManager protoManager) + { + return Loc.GetString("cp14-skill-req-vampire-tree-level", ("lvl", Level)); + } +} diff --git a/Content.Shared/_CP14/Skill/Restrictions/VampireFaction.cs b/Content.Shared/_CP14/Skill/Restrictions/VampireFaction.cs new file mode 100644 index 0000000000..b61fc03722 --- /dev/null +++ b/Content.Shared/_CP14/Skill/Restrictions/VampireFaction.cs @@ -0,0 +1,28 @@ +using Content.Shared._CP14.Vampire; +using Content.Shared._CP14.Vampire.Components; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Skill.Restrictions; + +public sealed partial class VampireFaction : CP14SkillRestriction +{ + public override bool HideFromUI => true; + + [DataField(required: true)] + public ProtoId Clan; + + public override bool Check(IEntityManager entManager, EntityUid target) + { + if (!entManager.TryGetComponent(target, out var vampire)) + return false; + + return vampire.Faction == Clan; + } + + public override string GetDescription(IEntityManager entManager, IPrototypeManager protoManager) + { + var clan = protoManager.Index(Clan); + + return Loc.GetString("cp14-skill-req-vampire-clan", ("name", Loc.GetString(clan.Name))); + } +} diff --git a/Content.Shared/_CP14/UniqueLoot/CP14SingletonComponent.cs b/Content.Shared/_CP14/UniqueLoot/CP14SingletonComponent.cs new file mode 100644 index 0000000000..9d74d8336b --- /dev/null +++ b/Content.Shared/_CP14/UniqueLoot/CP14SingletonComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared._CP14.UniqueLoot; + +/// +/// The appearance of an entity with this component will remove all other entities with the same component and key inside, ensuring the uniqueness of the entity. +/// +[RegisterComponent] +public sealed partial class CP14SingletonComponent : Component +{ + [DataField(required: true)] + public string Key = string.Empty; +} diff --git a/Content.Shared/_CP14/Vampire/CP14SharedVampireSysetm.Spell.cs b/Content.Shared/_CP14/Vampire/CP14SharedVampireSysetm.Spell.cs new file mode 100644 index 0000000000..b94422c207 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/CP14SharedVampireSysetm.Spell.cs @@ -0,0 +1,38 @@ +using Content.Shared._CP14.MagicSpell.Events; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Examine; +using Content.Shared.Mobs.Systems; +using Content.Shared.SSDIndicator; + +namespace Content.Shared._CP14.Vampire; + +public abstract partial class CP14SharedVampireSystem +{ + [Dependency] private readonly MobStateSystem _mobState = default!; + + private void InitializeSpell() + { + SubscribeLocalEvent(OnVampireCastAttempt); + SubscribeLocalEvent(OnVampireCastExamine); + } + + private void OnVampireCastAttempt(Entity ent, ref CP14CastMagicEffectAttemptEvent args) + { + //If we are not vampires in principle, we certainly should not have this ability, + //but then we will not limit its use to a valid vampire form that is unavailable to us. + + if (!HasComp(args.Performer)) + return; + + if (!HasComp(args.Performer)) + { + args.PushReason(Loc.GetString("cp14-magic-spell-need-vampire-valid")); + args.Cancel(); + } + } + + private void OnVampireCastExamine(Entity ent, ref ExaminedEvent args) + { + args.PushMarkup($"{Loc.GetString("cp14-magic-spell-need-vampire-valid")}"); + } +} diff --git a/Content.Shared/_CP14/Vampire/CP14SharedVampireSystem.cs b/Content.Shared/_CP14/Vampire/CP14SharedVampireSystem.cs new file mode 100644 index 0000000000..dd5f88d192 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/CP14SharedVampireSystem.cs @@ -0,0 +1,223 @@ +using Content.Shared._CP14.Skill; +using Content.Shared._CP14.Skill.Components; +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared._CP14.Vampire.Components; +using Content.Shared.Actions; +using Content.Shared.Body.Systems; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Shared.FixedPoint; +using Content.Shared.Humanoid; +using Content.Shared.Jittering; +using Content.Shared.Popups; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Timing; + +namespace Content.Shared._CP14.Vampire; + +public abstract partial class CP14SharedVampireSystem : EntitySystem +{ + [Dependency] private readonly SharedBloodstreamSystem _bloodstream = default!; + [Dependency] private readonly SharedActionsSystem _action = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedJitteringSystem _jitter = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly CP14SharedSkillSystem _skill = default!; + [Dependency] protected readonly IPrototypeManager Proto = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + private readonly ProtoId _skillPointType = "Blood"; + private readonly ProtoId _memorySkillPointType = "Memory"; + + public override void Initialize() + { + base.Initialize(); + InitializeSpell(); + + SubscribeLocalEvent(OnVampireInit); + SubscribeLocalEvent(OnVampireRemove); + + SubscribeLocalEvent(OnToggleVisuals); + SubscribeLocalEvent(OnToggleDoAfter); + + SubscribeLocalEvent(OnVampireVisualsInit); + SubscribeLocalEvent(OnVampireVisualsShutdown); + SubscribeLocalEvent(OnVampireExamine); + + SubscribeLocalEvent(OnEssenceHolderExamined); + } + + private void OnEssenceHolderExamined(Entity ent, ref ExaminedEvent args) + { + if (!HasComp(args.Examiner)) + return; + + if (!args.IsInDetailsRange) + return; + + args.PushMarkup(Loc.GetString("cp14-vampire-essence-holder-examine", ("essence", ent.Comp.Essence))); + } + + protected virtual void OnVampireInit(Entity ent, ref MapInitEvent args) + { + //Bloodstream + _bloodstream.ChangeBloodReagent(ent.Owner, ent.Comp.NewBloodReagent); + + //Actions + foreach (var proto in ent.Comp.ActionsProto) + { + EntityUid? newAction = null; + _action.AddAction(ent, ref newAction, proto); + } + + //Skill tree + _skill.AddSkillPoints(ent, ent.Comp.SkillPointProto, ent.Comp.SkillPointCount, silent: true); + _skill.AddSkillTree(ent, ent.Comp.SkillTreeProto); + + //Skill tree base nerf + _skill.RemoveSkillPoints(ent, _memorySkillPointType, 2, true); + + //Remove blood essence + if (TryComp(ent, out var essenceHolder)) + { + essenceHolder.Essence = 0; + Dirty(ent, essenceHolder); + } + } + + private void OnVampireRemove(Entity ent, ref ComponentRemove args) + { + RemCompDeferred(ent); + + //Bloodstream todo + + //Metabolism todo + + //Actions + foreach (var action in ent.Comp.Actions) + { + _action.RemoveAction(ent.Owner, action); + } + + //Skill tree + _skill.RemoveSkillTree(ent, ent.Comp.SkillTreeProto); + if (TryComp(ent, out var storage)) + { + foreach (var skill in storage.LearnedSkills) + { + if (!Proto.TryIndex(skill, out var indexedSkill)) + continue; + + if (indexedSkill.Tree == ent.Comp.SkillTreeProto) + _skill.TryRemoveSkill(ent, skill); + } + } + _skill.RemoveSkillPoints(ent, ent.Comp.SkillPointProto, ent.Comp.SkillPointCount); + _skill.AddSkillPoints(ent, _memorySkillPointType, 2, null, true); + } + + private void OnToggleVisuals(Entity ent, ref CP14ToggleVampireVisualsAction args) + { + if (_timing.IsFirstTimePredicted) + _jitter.DoJitter(ent, ent.Comp.ToggleVisualsTime, true); + + var doAfterArgs = new DoAfterArgs(EntityManager, ent, ent.Comp.ToggleVisualsTime, new CP14VampireToggleVisualsDoAfter(), ent) + { + Hidden = true, + NeedHand = false, + }; + + _doAfter.TryStartDoAfter(doAfterArgs); + } + + private void OnToggleDoAfter(Entity ent, ref CP14VampireToggleVisualsDoAfter args) + { + if (args.Cancelled || args.Handled) + return; + + if (HasComp(ent)) + { + RemCompDeferred(ent); + } + else + { + EnsureComp(ent); + } + + args.Handled = true; + } + + protected virtual void OnVampireVisualsShutdown(Entity vampire, ref ComponentShutdown args) + { + if (!EntityManager.TryGetComponent(vampire, out HumanoidAppearanceComponent? humanoidAppearance)) + return; + + humanoidAppearance.EyeColor = vampire.Comp.OriginalEyesColor; + + Dirty(vampire, humanoidAppearance); + } + + protected virtual void OnVampireVisualsInit(Entity vampire, ref ComponentInit args) + { + if (!EntityManager.TryGetComponent(vampire, out HumanoidAppearanceComponent? humanoidAppearance)) + return; + + vampire.Comp.OriginalEyesColor = humanoidAppearance.EyeColor; + humanoidAppearance.EyeColor = vampire.Comp.EyesColor; + + Dirty(vampire, humanoidAppearance); + } + + private void OnVampireExamine(Entity ent, ref ExaminedEvent args) + { + args.PushMarkup(Loc.GetString("cp14-vampire-examine")); + } + + public void GatherEssence(Entity vampire, + Entity victim, + FixedPoint2 amount) + { + if (!Resolve(vampire, ref vampire.Comp, false)) + return; + + if (!Resolve(victim, ref victim.Comp, false)) + return; + + var extractedEssence = MathF.Min(victim.Comp.Essence.Float(), amount.Float()); + + if (TryComp(victim, out var buckle) && buckle.BuckledTo is not null) + { + if (TryComp(buckle.BuckledTo, out var altar)) + { + extractedEssence *= altar.Multiplier; + } + } + + if (extractedEssence <= 0) + { + _popup.PopupClient(Loc.GetString("cp14-vampire-gather-essence-no-left"), victim, vampire, PopupType.SmallCaution); + return; + } + + _skill.AddSkillPoints(vampire, _skillPointType, extractedEssence); + victim.Comp.Essence -= amount; + + Dirty(victim); + } +} + + +public sealed partial class CP14ToggleVampireVisualsAction : InstantActionEvent; + +[Serializable, NetSerializable] +public sealed partial class CP14VampireToggleVisualsDoAfter : SimpleDoAfterEvent; + + +// Appearance Data key +[Serializable, NetSerializable] +public enum VampireClanLevelVisuals : byte +{ + Level, +} diff --git a/Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs b/Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs deleted file mode 100644 index 01ea701b6a..0000000000 --- a/Content.Shared/_CP14/Vampire/CP14SharedVampireVisualsSystem.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Content.Shared.Examine; -using Content.Shared.Humanoid; - -namespace Content.Shared._CP14.Vampire; - -public abstract class CP14SharedVampireVisualsSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnVampireExamine); - - SubscribeLocalEvent(OnVampireVisualsInit); - SubscribeLocalEvent(OnVampireVisualsShutdown); - } - - protected virtual void OnVampireVisualsShutdown(Entity vampire, ref ComponentShutdown args) - { - if (!EntityManager.TryGetComponent(vampire, out HumanoidAppearanceComponent? humanoidAppearance)) - return; - - humanoidAppearance.EyeColor = vampire.Comp.OriginalEyesColor; - - Dirty(vampire, humanoidAppearance); - } - - protected virtual void OnVampireVisualsInit(Entity vampire, ref ComponentInit args) - { - if (!EntityManager.TryGetComponent(vampire, out HumanoidAppearanceComponent? humanoidAppearance)) - return; - - vampire.Comp.OriginalEyesColor = humanoidAppearance.EyeColor; - humanoidAppearance.EyeColor = vampire.Comp.EyesColor; - - Dirty(vampire, humanoidAppearance); - } - - private void OnVampireExamine(Entity ent, ref ExaminedEvent args) - { - args.PushMarkup(Loc.GetString("cp14-vampire-examine")); - } -} diff --git a/Content.Shared/_CP14/Vampire/CP14VampireFactionPrototype.cs b/Content.Shared/_CP14/Vampire/CP14VampireFactionPrototype.cs new file mode 100644 index 0000000000..c4de688361 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/CP14VampireFactionPrototype.cs @@ -0,0 +1,19 @@ +using Content.Shared.StatusIcon; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Vampire; + +[Prototype("cp14VampireFaction")] +public sealed partial class CP14VampireFactionPrototype : IPrototype +{ + [IdDataField] public string ID { get; private set; } = default!; + + [DataField(required: true)] + public LocId Name = string.Empty; + + [DataField(required: true)] + public ProtoId FactionIcon; + + [DataField(required: true)] + public string SingletonTeleportKey = string.Empty; +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14MagicEffectVampireComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14MagicEffectVampireComponent.cs new file mode 100644 index 0000000000..1003464c05 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14MagicEffectVampireComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared._CP14.MagicSpell; + +namespace Content.Shared._CP14.Vampire.Components; + +/// +/// Use is only available if the vampire is in a “visible” dangerous form. +/// +[RegisterComponent, Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14MagicEffectVampireComponent : Component +{ +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireEssenceComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireEssenceComponent.cs new file mode 100644 index 0000000000..a03d5d35f7 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireEssenceComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Vampire.Components; + +[RegisterComponent] +[NetworkedComponent] +public sealed partial class CP14ShowVampireEssenceComponent : Component +{ +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireFactionComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireFactionComponent.cs new file mode 100644 index 0000000000..5d046da2a7 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireFactionComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Vampire.Components; + +[RegisterComponent] +[NetworkedComponent] +[AutoGenerateComponentState] +[Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14ShowVampireFactionComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId? Faction; +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14VampireAltarComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14VampireAltarComponent.cs new file mode 100644 index 0000000000..44f1e5c025 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireAltarComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Vampire.Components; + +/// +/// increases the amount of blood essence extracted if the victim is strapped to the altar +/// +[RegisterComponent] +[NetworkedComponent] +[AutoGenerateComponentState] +[Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14VampireAltarComponent : Component +{ + [DataField, AutoNetworkedField] + public float Multiplier = 2f; +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14VampireClanHeartComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14VampireClanHeartComponent.cs new file mode 100644 index 0000000000..d5838daf6d --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireClanHeartComponent.cs @@ -0,0 +1,85 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Vampire.Components; + +[RegisterComponent] +[NetworkedComponent] +[AutoGenerateComponentState] +[Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14VampireClanHeartComponent : Component +{ + [DataField, AutoNetworkedField] + public FixedPoint2 CollectedEssence = 0f; + + [DataField] + public string LevelPrefix = "orb"; + + [DataField] + public EntProtoId LevelUpVfx = "CP14SkyLightningRed"; + + [DataField] + public ProtoId? Faction; + + [DataField] + public FixedPoint2 Level2 = 5f; + + [DataField] + public FixedPoint2 Level3 = 12f; + + [DataField] + public FixedPoint2 Level4 = 21f; + + [DataField] + public FixedPoint2 EssenceRegenPerLevel = 0.1f; + + [DataField] + public TimeSpan RegenFrequency = TimeSpan.FromMinutes(1); + + [DataField] + public TimeSpan NextRegenTime = TimeSpan.Zero; + + /// + /// For reduce damage announce spamming + /// + [DataField] + public TimeSpan MaxAnnounceFreq = TimeSpan.FromSeconds(10f); + + /// + /// For reduce damage announce spamming + /// + [DataField] + public TimeSpan NextAnnounceTime = TimeSpan.Zero; + + public int Level + { + get + { + if (CollectedEssence >= Level4) + return 4; + if (CollectedEssence >= Level3) + return 3; + if (CollectedEssence >= Level2) + return 2; + return 1; + } + } + + public FixedPoint2 EssenceFromLevelStart => Level switch + { + 1 => CollectedEssence, + 2 => CollectedEssence - Level2, + 3 => CollectedEssence - Level3, + 4 => CollectedEssence - Level4, + _ => FixedPoint2.Zero + }; + + public FixedPoint2? EssenceToNextLevel => Level switch + { + 1 => Level2, + 2 => Level3 - Level2, + 3 => Level4 - Level3, + _ => null + }; +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14VampireComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14VampireComponent.cs new file mode 100644 index 0000000000..24d6771a8b --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireComponent.cs @@ -0,0 +1,59 @@ +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared.Body.Prototypes; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Vampire.Components; + +[RegisterComponent] +[NetworkedComponent] +[AutoGenerateComponentState] +[Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14VampireComponent : Component +{ + [DataField] + public ProtoId NewBloodReagent = "CP14BloodVampire"; + [DataField] + public ProtoId SkillTreeProto = "Vampire"; + + [DataField] + public ProtoId MetabolizerType = "CP14Vampire"; + + [DataField] + public ProtoId SkillPointProto = "Blood"; + + [DataField(required: true), AutoNetworkedField] + public ProtoId? Faction; + + [DataField] + public FixedPoint2 SkillPointCount = 2f; + + [DataField] + public TimeSpan ToggleVisualsTime = TimeSpan.FromSeconds(2f); + + /// + /// All this actions was granted to vampires on component added + /// + [DataField] + public List ActionsProto = new() { "CP14ActionVampireToggleVisuals" }; + + /// + /// For tracking granted actions, and removing them when component is removed. + /// + [DataField] + public List Actions = new(); + + [DataField] + public float HeatUnderSunTemperature = 12000f; + + [DataField] + public TimeSpan HeatFrequency = TimeSpan.FromSeconds(1); + + [DataField] + public TimeSpan NextHeatTime = TimeSpan.Zero; + + [DataField] + public float IgniteThreshold = 350f; +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14VampireEssenceHolderComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14VampireEssenceHolderComponent.cs new file mode 100644 index 0000000000..e9ea041cd5 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireEssenceHolderComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Vampire.Components; + +[RegisterComponent] +[NetworkedComponent] +[AutoGenerateComponentState] +[Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14VampireEssenceHolderComponent : Component +{ + [DataField, AutoNetworkedField] + public FixedPoint2 Essence = 1f; +} diff --git a/Content.Shared/_CP14/Vampire/Components/CP14VampireTreeCollectableComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14VampireTreeCollectableComponent.cs new file mode 100644 index 0000000000..0a715bc931 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireTreeCollectableComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Vampire.Components; + +[RegisterComponent] +[NetworkedComponent] +[Access(typeof(CP14SharedVampireSystem))] +public sealed partial class CP14VampireTreeCollectableComponent : Component +{ + [DataField] + public FixedPoint2 Essence = 1f; + + [DataField] + public SoundSpecifier CollectSound = new SoundPathSpecifier("/Audio/_CP14/Effects/essence_consume.ogg"); +} diff --git a/Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs b/Content.Shared/_CP14/Vampire/Components/CP14VampireVisualsComponent.cs similarity index 64% rename from Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs rename to Content.Shared/_CP14/Vampire/Components/CP14VampireVisualsComponent.cs index e629875521..206f377c6c 100644 --- a/Content.Shared/_CP14/Vampire/CP14VampireVisualsComponent.cs +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireVisualsComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared._CP14.Vampire; @@ -13,4 +14,10 @@ public sealed partial class CP14VampireVisualsComponent : Component [DataField] public string FangsMap = "vampire_fangs"; + + [DataField] + public EntProtoId EnableVFX = "CP14ImpactEffectBloodEssence2"; + + [DataField] + public EntProtoId DisableVFX = "CP14ImpactEffectBloodEssenceInverse"; } diff --git a/Resources/Audio/_CP14/Ambience/Antag/attributions.yml b/Resources/Audio/_CP14/Ambience/Antag/attributions.yml index bd0ddd399d..c2d1c42571 100644 --- a/Resources/Audio/_CP14/Ambience/Antag/attributions.yml +++ b/Resources/Audio/_CP14/Ambience/Antag/attributions.yml @@ -1,4 +1,9 @@ - files: ["bandit_start.ogg"] license: "CC-BY-4.0" copyright: 'by Victor_Natas of Freesound.org' - source: "https://freesound.org/people/Victor_Natas/sounds/612156/" \ No newline at end of file + source: "https://freesound.org/people/Victor_Natas/sounds/612156/" + +- files: ["vampire.ogg"] + license: "CC-BY-NC-3.0" + copyright: 'by SergeQuadrado of Freesound.org.' + source: "https://freesound.org/people/SergeQuadrado/sounds/455364/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Ambience/Antag/vampire.ogg b/Resources/Audio/_CP14/Ambience/Antag/vampire.ogg new file mode 100644 index 0000000000..f1001b14b9 Binary files /dev/null and b/Resources/Audio/_CP14/Ambience/Antag/vampire.ogg differ diff --git a/Resources/Audio/_CP14/Announce/attributions.yml b/Resources/Audio/_CP14/Announce/attributions.yml index c76701945d..a92bcb748b 100644 --- a/Resources/Audio/_CP14/Announce/attributions.yml +++ b/Resources/Audio/_CP14/Announce/attributions.yml @@ -6,4 +6,9 @@ - files: ["darkness_boom.ogg", "darkness_boom_2.ogg"] license: "CC-BY-4.0" copyright: 'by Uzbazur of Freesound.org.' - source: "https://freesound.org/people/Uzbazur/sounds/442241/" \ No newline at end of file + source: "https://freesound.org/people/Uzbazur/sounds/442241/" + +- files: ["vampire.ogg"] + license: "CC0-1.0" + copyright: 'by MathewHenry of Freesound.org.' + source: "https://freesound.org/people/MathewHenry/sounds/636196/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Announce/vampire.ogg b/Resources/Audio/_CP14/Announce/vampire.ogg new file mode 100644 index 0000000000..9102e598fc Binary files /dev/null and b/Resources/Audio/_CP14/Announce/vampire.ogg differ diff --git a/Resources/Audio/_CP14/Effects/attributions.yml b/Resources/Audio/_CP14/Effects/attributions.yml index 180ed916fb..89c3ad61a0 100644 --- a/Resources/Audio/_CP14/Effects/attributions.yml +++ b/Resources/Audio/_CP14/Effects/attributions.yml @@ -68,10 +68,10 @@ copyright: 'by DustyWind on Freesound.org' source: "https://freesound.org/people/DustyWind/sounds/715784/" -- files: ["vampire_bite.ogg"] - license: "CC0-1.0" - copyright: 'by magnuswaker on Freesound.org' - source: "https://freesound.org/people/magnuswaker/sounds/563491/" +- files: ["vampire_craft.ogg"] + license: "CC-BY-4.0" + copyright: 'by Victor_Natas on Freesound.org' + source: "https://freesound.org/people/Victor_Natas/sounds/616217/" - files: ["skill_up1.ogg", "skill_up2.ogg", "skill_up3.ogg", "skill_up3.ogg"] license: "CC0-1.0" @@ -116,4 +116,9 @@ - files: ["pan_open.ogg", "pan_close.ogg"] license: "CC0-1.0" copyright: 'Created by RossBell on Freesound.org' - source: "https://freesound.org/people/RossBell/sounds/389428/" \ No newline at end of file + source: "https://freesound.org/people/RossBell/sounds/389428/" + +- files: ["surprise.ogg"] + license: "CC0-1.0" + copyright: 'Created by qubodup on Freesound.org' + source: "https://freesound.org/people/qubodup/sounds/814055/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Effects/surprise.ogg b/Resources/Audio/_CP14/Effects/surprise.ogg new file mode 100644 index 0000000000..36cdf2fc93 Binary files /dev/null and b/Resources/Audio/_CP14/Effects/surprise.ogg differ diff --git a/Resources/Audio/_CP14/Effects/vampire_bite.ogg b/Resources/Audio/_CP14/Effects/vampire_bite.ogg deleted file mode 100644 index bd8e986a33..0000000000 Binary files a/Resources/Audio/_CP14/Effects/vampire_bite.ogg and /dev/null differ diff --git a/Resources/Audio/_CP14/Effects/vampire_craft.ogg b/Resources/Audio/_CP14/Effects/vampire_craft.ogg new file mode 100644 index 0000000000..59deed1a91 Binary files /dev/null and b/Resources/Audio/_CP14/Effects/vampire_craft.ogg differ diff --git a/Resources/Audio/_CP14/Lobby/attributions.yml b/Resources/Audio/_CP14/Lobby/attributions.yml index 5f15efdcea..922606d77f 100644 --- a/Resources/Audio/_CP14/Lobby/attributions.yml +++ b/Resources/Audio/_CP14/Lobby/attributions.yml @@ -12,3 +12,8 @@ license: "CC-BY-SA-3.0" copyright: "'Arcane Winds' by LINK" source: "https://github.com/crystallpunk-14/crystall-punk-14" + +- files: ["blood_fog.ogg"] + license: "CC-BY-4.0" + copyright: "'Creeping Blood Fog' by SoundFlakes" + source: "https://freesound.org/people/SoundFlakes/sounds/751524/" diff --git a/Resources/Audio/_CP14/Lobby/blood_fog.ogg b/Resources/Audio/_CP14/Lobby/blood_fog.ogg new file mode 100644 index 0000000000..75a1445c0e Binary files /dev/null and b/Resources/Audio/_CP14/Lobby/blood_fog.ogg differ diff --git a/Resources/Changelog/CP14_Changelog.yml b/Resources/Changelog/CP14_Changelog.yml index a1caf57d4f..c3b9301dac 100644 --- a/Resources/Changelog/CP14_Changelog.yml +++ b/Resources/Changelog/CP14_Changelog.yml @@ -1654,3 +1654,110 @@ id: 8217 time: '2025-08-11T20:46:28.0000000+00:00' url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1661 +- author: KittyCat432 + changes: + - message: Changed Ice shard to now do 2.5 pierce and 5 cold total of 7.5 damage. + type: Tweak + - message: Changed Fire wave to now have a 0.5 second cast time that cannot be interrupted + and nolonger adjusts the temperature inside of someone. + type: Tweak + - message: Changed magic, speed, and hell ballade spells to nolonger break upon + being damaged. + type: Tweak + - message: Changed Hell ballade now takes 8 mana per second and slows you down by + 50% speed. + type: Tweak + - message: Fixed hell ballad, heat, and freeze nolonger work while under pacifism. + type: Fix + id: 8218 + time: '2025-08-16T16:44:33.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1671 +- author: Nimfar11 + changes: + - message: Added price for artefacts bottomless goblet and magic healing staff. + type: Add + id: 8219 + time: '2025-08-17T22:09:29.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1674 +- author: Nimfar11 + changes: + - message: Adds the book Pantheon of Gods of Sileita, with a description of the + gods. And an additional book about the imitators of gods. + type: Add + id: 8220 + time: '2025-08-17T22:10:17.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1673 +- author: Viator-MV + changes: + - message: The bone masks were nerfed + type: Tweak + - message: Skeletons' health has been increased to 100 + type: Tweak + - message: Now raider and skeleton wizard chooses his own spells. + type: Tweak + id: 8221 + time: '2025-08-17T22:19:02.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1447 +- author: KittyCat432 + changes: + - message: Added the Cackle a ranged monster exclusive to places with open skys + and not cold weather. + type: Add + - message: Added a new monster toxin called hemoroxide which causes bleeding and + piercing damage, used by the Cackle. + type: Add + id: 8222 + time: '2025-08-18T08:41:34.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1602 +- author: Morb0 + changes: + - message: Silvas and Elfs clothing now always displayed as female + type: Fix + id: 8223 + time: '2025-08-22T15:02:14.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1691 +- author: TheShuEd + changes: + - message: "A new game mode, \u201CVampire Clan Battle\u201D has been added. Three\ + \ ancient vampire clans battle each other for control of the settlement." + type: Add + id: 8224 + time: '2025-08-22T15:46:28.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1672 +- author: TheShuEd + changes: + - message: Fixed a bug where vampires could not see other vampires + type: Fix + - message: "removed tier 1 skill \u201CDemonstration of power\u201D for vampires\ + \ (only t2 left)" + type: Remove + - message: "Added a new vampire tier 1 skill \u201CHypnosis\u201D - allows you to\ + \ keep the target asleep for up to 30 seconds." + type: Add + - message: Starting blood essence supply for vampires increased from 1 to 2 + type: Add + - message: All vampire buildings in the construction menu on G are now in a separate + category + type: Fix + - message: Starting vampire skills are now cheaper + type: Tweak + - message: Vampire hunger has been significantly reduced + type: Fix + - message: Rabbits and boars now spawn around game maps instead of aggressive mobs + type: Tweak + - message: Vampires can no longer bite SSD players! + type: Tweak + - message: Vampire blood can no longer be identified without alchemical vision. + type: Fix + - message: The tieflings blood no longer ignites vampires! + type: Remove + id: 8225 + time: '2025-08-22T22:56:01.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1696 +- author: Viator-MV + changes: + - message: The lightning strike has become stronger. Proceed using it! + type: Tweak + id: 8226 + time: '2025-08-23T09:00:27.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1695 diff --git a/Resources/ConfigPresets/Build/development.toml b/Resources/ConfigPresets/Build/development.toml index 4a86d09352..8322025fe7 100644 --- a/Resources/ConfigPresets/Build/development.toml +++ b/Resources/ConfigPresets/Build/development.toml @@ -45,3 +45,9 @@ ssd_sleep_time = 3600 [server] rules_file = "CP14Rules" + +[audio] +lobby_music_collection = "CP14LobbyMusic" + +[cp14] +skill_timers = false \ No newline at end of file diff --git a/Resources/ConfigPresets/_CP14/Dev.toml b/Resources/ConfigPresets/_CP14/Dev.toml index 6ea8a0b936..0d4e462793 100644 --- a/Resources/ConfigPresets/_CP14/Dev.toml +++ b/Resources/ConfigPresets/_CP14/Dev.toml @@ -21,7 +21,7 @@ log_late_msg = false hostname = "⚔️ CrystallEdge ⚔️ [MRP]" desc = "History of the City of Sword and Magic. A social economic sandbox reinventing the Space Station 14 concept in fantasy style" lobbyenabled = true -soft_max_players = 40 +soft_max_players = 50 maxplayers = 80 lobbyduration = 300 role_timers = true diff --git a/Resources/Locale/en-US/_CP14/antag/antags.ftl b/Resources/Locale/en-US/_CP14/antag/antags.ftl index 9207f1b0f8..386178186a 100644 --- a/Resources/Locale/en-US/_CP14/antag/antags.ftl +++ b/Resources/Locale/en-US/_CP14/antag/antags.ftl @@ -1,6 +1,10 @@ cp14-roles-antag-vampire-name = Vampire -cp14-roles-antag-vampire-objective = You are a parasite on the body of society, hated by those around you, burned by the sun, and eternally hungry. You need to feed on the blood of the sentient to survive. And finding those who will volunteer to be your feeder is not easy... -cp14-roles-antag-vampire-briefing = You are a parasite on society. It hates and fears you, but the blood of the living is your only food. Nature destroys you with sunlight, so you have to hide in the shadows. It's like the whole world is trying to destroy you, but your will to live is stronger than all of that. SURVIVE. That's all you have to do. + +cp14-roles-antag-vampire-briefing-night-childrens = As a representative of the newest clan of Children of the Night, you claim rights to this city. Working from the shadows and without revealing your presence to ordinary mortals, find and destroy other clans, proving your superiority. +cp14-roles-antag-vampire-briefing-unnameable = As a representative of the oldest clan of the Unnameables, you claim rights to this city. Working from the shadows and without revealing your presence to ordinary mortals, find and destroy other clans, proving your superiority. +cp14-roles-antag-vampire-briefing-devourers = As a member of the ancient clan of Devourers, you claim this city as your own. Working from the shadows and keeping your presence hidden from ordinary mortals, find and destroy the other clans, proving your superiority. + +cp14-roles-antag-vampire-objective = As a representative of one of the oldest vampire clans, you claim rights to this city. Working from the shadows and without revealing your presence to ordinary mortals, find and destroy other clans, proving your superiority. cp14-roles-antag-blood-moon-cursed-name = Cursed by the blood moon cp14-roles-antag-blood-moon-cursed-objective = Some creatures lose their minds, and can commit unthinkable atrocities when a bloody blood moon rises from behind the horizon ... diff --git a/Resources/Locale/en-US/_CP14/books/pantheon_gods_sileita.ftl b/Resources/Locale/en-US/_CP14/books/pantheon_gods_sileita.ftl new file mode 100644 index 0000000000..1dfd7f3817 --- /dev/null +++ b/Resources/Locale/en-US/_CP14/books/pantheon_gods_sileita.ftl @@ -0,0 +1,141 @@ +cp14-book-text-pantheon-gods-sileita = The pantheon of Sileita is divided into three great ranks: [bold]Absolutes, Elder Gods and Younger Gods[/bold]. Faith in the gods affects the political, spiritual and magical life of all the peoples of Sileita. Some deities are forbidden to worship, others are revered as official patrons of countries or organizations. + {"[italic]'I am a Watcher, a templar of the Order of the Guardians of Truth, charged with gathering information on all the gods of Sileita without bias. We do not pray. We record. No god is worthy of worship until fully understood. None is superior to another. All are part of a complex picture.'[/italic]"} + + {"[head=2]Absolutes — First Forces[/head]"} + + {"[head=3][color=purple]Tomer[/color][/head]"} + + • [bold]Names[/bold]: [italic]Mutable, Primordial Contradiction, Sculpting. Rejected.[/italic] + • [bold]Idea[/bold]: Chaos, metamorphosis, biological and metaphysical evolution. + • [bold]Symbol[/bold]: Spiral of creeping forms. + • [bold]Presence[/bold]: Physical appearance is imprisoned in a divine prison. His "comings" are catastrophes: mutations, bursts of alien biomes, falls of flesh from the sky. Tomer's influence is flashes of his energy capable of changing the environment around him. + • [bold]Character[/bold]: He cannot be called evil — he is beyond the concepts of good. This is blind curiosity in destruction. He changes for the sake of change itself. The mind of the pulsating world, which dreams of becoming something new. + • [bold]Attitude to mortals[/bold]: He is interested in them as material. He is not an executioner, but a craftsman. Dispassionate, but attentive. + • [bold]Comment[/bold]: It is dangerous not so much because of its strength, but because it infects minds with the idea of destruction as a method of progress. Its prohibition by law is justified. Its teaching is a sweet poison. + + {"[head=3][color=purple]Altaran[/color][/head]"} + + • [bold]Names[/bold]: [italic]Flickering Judgement, Course of Currents, Watcher Through the Ages.[/italic] + • [bold]Idea[/bold]: Time, temporal currents, judgement, order. + • [bold]Symbol[/bold]: Eternal circle with internal clocks running in different directions. + • [bold]Presence[/bold]: Never appears in the flesh. Never seen in Sileith, but has been seen in the Void. + • [bold]Character[/bold]: Absolutely impartial. No anger in him, only equation. Disgusting to mortals because he does not forgive - but does not take revenge either. He is the unspoken leader of the entire pantheon and the controlling authority. + • [bold]Attitude to mortals[/bold]: Sees them as units in a model. Does not deny the importance of personality, but only recognizes its influence on the course of time. + • [bold]Comment[/bold]: If all the gods disappeared, Altaran would remain to watch their work crumble. + + {"[head=3][color=purple]Relaphir and Vestris[/color][/head]"} + + • [bold]Names[/bold]: [italic]Twins of the Passage, Key and Lock, Primordial Gate. Wolf and Sheep.[/italic] + • [bold]Idea[/bold]: Life, death, soul, reincarnation, Void. + • [bold]Symbol[/bold]: Intertwined circles with an eye in the center. + • [bold]Presence[/bold]: At the moment of birth - Vestris watches. At the moment of death - Relaphir sees off. In deep silence and in the last breath - both. Only Relaphir physically appeared on Bafamir's judgment day. + • [bold]Character[/bold]: + - Vestris is soft and thoughtful, like a spring morning. + - Relaphir is reserved and inevitable, like the night. + They do not argue. [bold]Their unity is fundamental.[/bold] + • [bold]Attitude to mortals[/bold]: They do not judge, do not encourage, do not persuade. They simply are. Accompany, without interfering. + • [bold]Comment[/bold]: They are not terrible because of their power, but because they have the right to use it. Necromancers and experienced healers can accept the faith of the twins for the sake of studying resurrection and rebirth. + + {"[head=2]Elder Gods - Firstborn[/head]"} + + {"[head=3][color=forestgreen]Irumel[/color][/head]"} + + • [bold]Names[/bold]: [italic]Fallen Shield, Faithful, Last of the Stars.[/italic] + • [bold]Idea[/bold]: Protection, honor, self-sacrifice. + • [bold]Symbol[/bold]: A broken shield emitting light. + • [bold]Presence[/bold]: [bold]Believed to have died[/bold] in the divine war. But in the ruins of the temples, his presence is felt as a call to duty. It is said that a wounded silhouette can be seen in the former places of his faith. + • [bold]Character[/bold]: He was the embodiment of service. They said he was silent for hours, but with a single glance he convinced the army. + • [bold]Attitude to mortals[/bold]: He saw in them, perhaps, more than they deserved. Believed that they were worth protecting at any cost. + • [bold]Comment[/bold]: If he is dead, then in that case - the gods are mortal. This is disturbing. + + {"[head=3][color=forestgreen]Devias / Fenor[/color][/head]"} + + • [bold]Names[/bold]: [italic]Silver Shadow, Whisper in Dreams, Listener to the Unnamed.[/italic] + • [bold]Idea[/bold]: Dreams, secrets, foresight, concealment. + • [bold]Symbol[/bold]: Eye, vertically closed with a finger. + • [bold]Presence[/bold]: Almost never physically appears, but through rituals one can briefly talk to him, but the price will be high. + • [bold]Character[/bold]: Quiet and friendly, but anxious. Speaks in hints. Possesses monstrous knowledge. + • [bold]Attitude to mortals[/bold]: Warns, but does not interfere. He who listens is saved. He who demands is driven mad. + • [bold]Comment[/bold]: Not an enemy. But not an ally either. + + {"[head=3][color=forestgreen]Gelarion[/color][/head]"} + + • [bold]Names[/bold]: [italic]Black Flame, Bloody Teacher, Echo of Resentment.[/italic] + • [bold]Idea[/bold]: Revenge, rage, retribution, anger. + • [bold]Symbol[/bold]: A flaming heart pierced by a dagger. + • [bold]Presence[/bold]: Comes at the moment of the oath of vengeance. Often not directly, but through visions or hallucinations at the moment of the oath. + • [bold]Character[/bold]: Burningly bright, with a predatory charisma. + • [bold]Attitude to mortals[/bold]: Loves their pain, but not for the sake of suffering. + • [bold]Comment[/bold]: He is dangerous not because he gives strength, but because he makes the victim sweet. + + {"[head=3][color=forestgreen]Merkas[/color][/head]"} + + • [bold]Names[/bold]: [italic]Embalming Light, Merciful Brother, He who Cleanses.[/italic] + • [bold]Idea[/bold]: Healing, purification, resurrection. + • [bold]Symbol[/bold]: White palm, driving away darkness. + • [bold]Presence[/bold]: Appears in miracles: when the mortal disappears without a trace, when a curse is broken. + • [bold]Character[/bold]: Calm. Does not judge, but does not forget. Speaks softly, acts precisely. + • [bold]Attitude to mortals[/bold]: Sees in them an opportunity for restoration. + • [bold]Comment[/bold]: Of all, he is closest to what is called "good". But he is not without a shadow. Purification can become an obsession. + + {"[head=2]Lesser Gods — Ascended or Second Scions[/head]"} + + {"[head=3][color=blue]Rikhiard / Helmir[/color][/head]"} + + • [bold]Names[/bold]: [italic]Iron Gaze, Patron of Duels, Eternal Commander.[/italic] + • [bold]Idea[/bold]: War, battle, honor. + • [bold]Symbol[/bold]: Crossed swords above a helmet. + • [bold]Presence[/bold]: Often — in person, in the body of a soldier of any race, hiding his true nature. Speaks through the flaming enthusiasm of a warrior. + • [bold]Character[/bold]: Rude, but honest. His respect must be earned. He is not about winning — he is about fighting. + • [bold]Attitude to mortals[/bold]: Loves those who fight not for the sake of killing, but for the sake of dignity. Tieflings are native creatures of his personal war plan. + • [bold]Comment[/bold]: Dangerous where the cult turns war into a game. But necessary where honor is above fear. + + {"[head=3][color=blue]Archfey[/color][/head]"} + + • [bold]Names[/bold]: [italic]Mother of the Embrace, Warming Wound, Flower after the Storm.[/italic] + • [bold]Idea[/bold]: Love, kindness, family. + • [bold]Symbol[/bold]: A loose heart with petals. + • [bold]Presence[/bold]: Her image can appear during wedding ceremonies, and in other strong emotional moments. + • [bold]Character[/bold]: Sincere and compassionate. Speaks like a mother. + • [bold]Attitude to mortals[/bold]: Accepts everyone. Even the fallen. Especially them. + • [bold]Comment[/bold]: Her faith is often ridiculed as 'weak'. But it is she who keeps people from the last line. + + {"[head=3][color=blue]Lumera[/color][/head]"} + + • [bold]Names[/bold]: [italic]Guiding in the Night, Quiet Teacher, Eye of the Moon.[/italic] + • [bold]Idea[/bold]: Night, stars, knowledge, learning. + • [bold]Symbol[/bold]: A crescent moon with rays streaming from it. + • [bold]Presence[/bold]: Often physically, in the form of a harpy. She is one of the few who actually walks among people. Often appears in Kraichel. Known for her public lectures, although almost no one remembers her face. + • [bold]Character[/bold]: Wise, ironic, caring. Teaches not with words, but with questions. + • [bold]Attitude to mortals[/bold]: Values those who seek knowledge and those who have risen from the darkness. + • [bold]Comment[/bold]: Liars fear her. Priests try to find a connection between Lumera and the scarlet moon. + + {"[head=3][color=blue]Silforia[/color][/head]"} + + • [bold]Names[/bold]: [italic]Wind of Thirst, Mistress of Adventures, Fearless.[/italic] + • [bold]Idea[/bold]: Adventures, exploration, freedom. + • [bold]Symbol[/bold]: Leaves in the wind. + • [bold]Presence[/bold]: Often travels incognito. Can be anyone: a beggar, an old man, a guildmaster. + • [bold]Character[/bold]: Energetic, wild, with an infectious laugh. Loves an argument. + • [bold]Attitude to mortals[/bold]: Appreciates those who take risks. Despises those who live under the lock of fear. + • [bold]Comment[/bold]: The only god you want to sit by the fire with. She laughs both for you and with you. A former supreme spirit of the wind who received a blessing from Relafir and Vestris and became a goddess after repelling the attack of the leviathan. + + {"[head=3][color=blue]Aleona[/color][/head]"} + + • [bold]Names[/bold]: [italic]Court of Light, Steel Guardian, Eye of the Empire.[/italic] + • [bold]Idea[/bold]: Justice, protection, law. + • [bold]Symbol[/bold]: Scales, surrounded by radiance. + • [bold]Presence[/bold]: In the halls of justice of the Zellasian Empire. Can appear in person if the trial threatens to become a farce. + • [bold]Character[/bold]: Impeccably cold-blooded. Does not turn away from pain, but does not accept tears as an argument. + • [bold]Attitude to mortals[/bold]: Sees them as subjects of justice. Believes in correction, but punishes without hesitation. + • [bold]Comment[/bold]: The Empire calls her its goddess. But she serves not the throne - but the truth. And this makes her more terrible than the entire pantheon. + + {"[head=3][color=blue]Osif[/color][/head]"} + + • [bold]Names[/bold]: [italic]Storm, Insatiability, Sea Depths.[/italic] + • [bold]Idea[/bold]: Steadfastness, uncertainty, sea madness. + • [bold]Symbol[/bold]: Two waves heading towards each other. + • [bold]Presence[/bold]: Almost never appears in the world, but his child - Leviathan - lives in the depths of the ocean and seas. + • [bold]Character[/bold]: Explosive character, you never know what to expect from him. + • [bold]Attitude to mortals[/bold]: Can both help and sink entire coasts and fleets, his child despises any creature. + • [bold]Comment[/bold]: Deity of the Oceans, Waters and Storms, During the divine war he supported Tomer and with the energy of Lumera gave birth to Leviathan - a monster that during the war with Yantakini sank almost all the ships of the Zellasian empire and fought in a forgotten era with Silphoria. diff --git a/Resources/Locale/en-US/_CP14/books/pantheon_gods_sileita_imitators.ftl b/Resources/Locale/en-US/_CP14/books/pantheon_gods_sileita_imitators.ftl new file mode 100644 index 0000000000..ec1d565341 --- /dev/null +++ b/Resources/Locale/en-US/_CP14/books/pantheon_gods_sileita_imitators.ftl @@ -0,0 +1,32 @@ +cp14-book-text-pantheon-gods-sileita-imitators = [head=2]Imitators of the Gods[/head] + + • [bold]Names[/bold]: [italic]Echo-Spirits, Mask-Wearers, Pseudo-Divines.[/italic] + + Imitators are beings, spirits, phantoms or possessed that take on the appearance, speech, habits and goals of one of the gods, without their blessing or sanction. They are not true servants, but can outwardly indistinguishably copy divine manifestations. This phenomenon occurs both in ritual art and magic of persuasion, and in unconscious forms of distorted faith. There are also unique creatures created unconsciously, under the influence of magical anomalies, egregors (collective mind) of faith or the Void. + + {"[head=2]General about the nature of Imitators[/head]"} + + They do not receive power from the god himself, but can use rituals that imitate miracles and / or the energy of the god. + Often appear in places of great religious tension - in empty temples, on battlefields where the gods were worshipped, or in regions forgotten by the priesthood. + Some Mimics are spirits that arose from the echoes of a collective faith and absorbed the energy of the gods, others are mortals captivated by the idea. + Sometimes a god knows about the Mimic, but does not react - considering it 'the noise of faith'. + + {"[head=2]Typology of Imitators[/head]"} + + {"[head=3][color=goldenrod]Shadow Faces[/color][/head]"} + + Creatures that copy the appearance and habits of gods. Often they are spirits that were filled with the energy of gods at the time of evolution, or lived at that time in places of religious indignation. + {"[italic]Example[/italic]: A spirit living at the altar of a goddess takes on her appearance and habits, becoming a weak copy."} + + {"[head=3][color=goldenrod]Echo Spirits[/color][/head]"} + + Incorporeal formations that arise from an excess of prayers or fear. They have no will, but reflect a specific side of the god - the wrath of Jelaryon, the compassion of the Archfey, etc. They can 'infect' people, making them temporary carriers of a behavioral pattern. They often appear next to children who have experienced religious trauma or ecstasy. + {"[italic]Example[/italic]: the silhouette of Irumel in ruined temples calling for compassion."} + + {"[head=3][color=goldenrod]Theomims ('godlike')[/color][/head]"} + + A spirit that has adopted the energy of a god or void during its development and has evolved into a higher spirit, becoming closer to its god. Can show self-awareness or become possessed by other beings, become an evil caricature of a god - mnemostealers. These are evil, fanatical copies of gods. They steal the image, speech and power of a deity, distort them, act on behalf of which they did not receive. Some mnemostealers gather their own 'false cultists', convincing them of their authenticity. + + {"[head=3][color=goldenrod]Splinters of Will[/color][/head]"} + + Appear in places where a god has previously manifested. These are fragments of past manifestations that have lost contact with the source. They are unreasonable, but carry the habits, voice and behavior pattern of the deity. They are a 'living' memory of the events of the god at that moment. Can be dangerous if they believe that they need to 'fulfill the will' again diff --git a/Resources/Locale/en-US/_CP14/construction/category.ftl b/Resources/Locale/en-US/_CP14/construction/category.ftl new file mode 100644 index 0000000000..89430714bb --- /dev/null +++ b/Resources/Locale/en-US/_CP14/construction/category.ftl @@ -0,0 +1 @@ +cp14-construction-category-vampire = Vampires \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/construction/conditions.ftl b/Resources/Locale/en-US/_CP14/construction/conditions.ftl index 3bdcd94451..abb07062a9 100644 --- a/Resources/Locale/en-US/_CP14/construction/conditions.ftl +++ b/Resources/Locale/en-US/_CP14/construction/conditions.ftl @@ -1 +1,2 @@ -cp14-construction-condition-mana-filled = The structure must be fully powered by mana. \ No newline at end of file +cp14-construction-condition-mana-filled = The structure must be fully powered by mana. +cp14-construction-condition-singleton = Can only exist in a single copy! \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/contraband/contraband-severity.ftl b/Resources/Locale/en-US/_CP14/contraband/contraband-severity.ftl new file mode 100644 index 0000000000..4cb12c92f1 --- /dev/null +++ b/Resources/Locale/en-US/_CP14/contraband/contraband-severity.ftl @@ -0,0 +1,3 @@ +cp14-contraband-examine-text-CP14Minor = [color=yellow]Ownership of this item is considered a Mild violation.[/color] + +cp14-contraband-examine-text-CP14Major = [color=red]Ownership of this item is considered a Serious violation.[/color] \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl b/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl index 81ed945738..3c55067b1f 100644 --- a/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl +++ b/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl @@ -12,6 +12,7 @@ cp14-modifier-explosive = explosive mines cp14-modifier-ruins = ancient ruins cp14-modifier-zombie = zombies cp14-modifier-slime = slimes +cp14-modifier-cackle = cackles cp14-modifier-skeleton = sentient skeletons cp14-modifier-dyno = dynos cp14-modifier-mole = predatory moles @@ -33,4 +34,4 @@ cp14-modifier-storm = storm cp14-modifier-fire-storm = fire storm cp14-modifier-snow-storm = snow storm cp14-modifier-mana-mist = magic mist -cp14-modifier-anti-mana-mist = antimagic mist \ No newline at end of file +cp14-modifier-anti-mana-mist = antimagic mist diff --git a/Resources/Locale/en-US/_CP14/gameTicking/game-preserts.ftl b/Resources/Locale/en-US/_CP14/gameTicking/game-presets.ftl similarity index 54% rename from Resources/Locale/en-US/_CP14/gameTicking/game-preserts.ftl rename to Resources/Locale/en-US/_CP14/gameTicking/game-presets.ftl index 9b2f114114..db39c00ee2 100644 --- a/Resources/Locale/en-US/_CP14/gameTicking/game-preserts.ftl +++ b/Resources/Locale/en-US/_CP14/gameTicking/game-presets.ftl @@ -1,2 +1,5 @@ cp14-gamemode-survival-title = Survival -cp14-gamemode-survival-description = Your ship is in distress and crashing into wild, dangerous lands. What will you do to survive? Which of you will find the way back to civilization? And who... or what is watching you from the darkness... \ No newline at end of file +cp14-gamemode-survival-description = Your ship is in distress and crashing into wild, dangerous lands. What will you do to survive? Which of you will find the way back to civilization? And who... or what is watching you from the darkness... + +cp14-peaceful-title = Peaceful time +cp14-peaceful-description = A peaceful existence without major problems. Find something you enjoy doing. \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/gameTicking/gamePresets/vampire_clan_battles.ftl b/Resources/Locale/en-US/_CP14/gameTicking/gamePresets/vampire_clan_battles.ftl new file mode 100644 index 0000000000..3fd9fa6aca --- /dev/null +++ b/Resources/Locale/en-US/_CP14/gameTicking/gamePresets/vampire_clan_battles.ftl @@ -0,0 +1,19 @@ +cp14-vampire-clans-battle = Battle of the Vampire Clans +cp14-vampire-clans-description = Several vampire clans are laying claim to the city. Only one of them will become the true ruler of the land... + +cp14-vampire-clans-battle-clan-win = Victory for the "{$name}" clan! +cp14-vampire-clans-battle-clan-win-desc = The vampire clan, having proven its power, becomes the secret ruler of these lands. + +cp14-vampire-clans-battle-clan-tie-2 = A draw between the clans "{$name1}" and "{$name2}" +cp14-vampire-clans-battle-clan-tie-2-desc = Two clans, unable to defeat each other, are forced to divide these lands between themselves. + +cp14-vampire-clans-battle-clan-tie-3 = A draw between all clans +cp14-vampire-clans-battle-clan-tie-3-desc = Vampire clans that have failed to defeat each other are forced to divide these lands among themselves. + +cp14-vampire-clans-battle-clan-city-win = Victory of the settlement +cp14-vampire-clans-battle-clan-city-win-desc = All vampire clans have been exterminated, and residents can sleep safely. + +cp14-vampire-clans-battle-clan-lose = Total defeat +cp14-vampire-clans-battle-clan-lose-desc = Most of the settlement was destroyed in the fighting between the clans. Even the surviving clans can no longer feed themselves on these lands. + +cp14-vampire-clans-battle-alive-people = Percentage of surviving population: [color=red]{$percent}%[/color] \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl b/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl index 26a1c02aaf..27e3f00ff8 100644 --- a/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl +++ b/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl @@ -21,6 +21,7 @@ cp14-magic-spell-need-material-component = You need to hold the material compone cp14-magic-spell-stamina-not-enough = You don't have the energy to do it. cp14-magic-staminacost = Stamina cost cp14-magic-spell-pacified = It could hurt someone! +cp14-magic-spell-ssd = Do not touch disconnected players! cp14-magic-spell-target-not-mob = The target must be a living thing! @@ -29,4 +30,7 @@ cp14-magic-spell-target-mob-state-dead = dead cp14-magic-spell-target-mob-state-live = living cp14-magic-spell-target-mob-state-critical = dying -cp14-magic-spell-target-god-follower = Your target should be your follower! \ No newline at end of file +cp14-magic-spell-target-god-follower = Your target should be your follower! + +cp14-magic-skillpointcost = Resource costs "{$name}": [color=#eba834]{$count}[/color] +cp14-magic-spell-skillpoint-not-enough = There are {$count} resources of "{$name}" missing! \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/objectives/condition/vampire.ftl b/Resources/Locale/en-US/_CP14/objectives/condition/vampire.ftl new file mode 100644 index 0000000000..9372cbfdad --- /dev/null +++ b/Resources/Locale/en-US/_CP14/objectives/condition/vampire.ftl @@ -0,0 +1,7 @@ +cp14-objective-issuer-vampire = [color="#c20034"]Vampire clan[/color] + +cp14-objective-vampire-pure-bood-title = Expel foreign vampire clans +cp14-objective-vampire-pure-bood-desc = Intruders from other vampire clans are hiding among the residents. Eliminate them so that the settlement belongs only to you. + +cp14-objective-vampire-defence-settlement-title = Keep your property +cp14-objective-vampire-defence-settlement-desc = The inhabitants of this city are your property and your food. Don't let them die. At least {$count}% of the inhabitants must survive. \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/objectives/steal-targets.ftl b/Resources/Locale/en-US/_CP14/objectives/steal-targets.ftl deleted file mode 100644 index 7f0acee835..0000000000 --- a/Resources/Locale/en-US/_CP14/objectives/steal-targets.ftl +++ /dev/null @@ -1,3 +0,0 @@ -cp14-steal-target-dino = yumkaraptors -cp14-steal-target-mole = predatory moles -cp14-steal-target-boar = boars or pigs diff --git a/Resources/Locale/en-US/_CP14/reagents/meta/monster_toxins.ftl b/Resources/Locale/en-US/_CP14/reagents/meta/monster_toxins.ftl index d6c680946b..00b12d2d56 100644 --- a/Resources/Locale/en-US/_CP14/reagents/meta/monster_toxins.ftl +++ b/Resources/Locale/en-US/_CP14/reagents/meta/monster_toxins.ftl @@ -1,2 +1,5 @@ cp14-reagent-name-toxin-spider = Arachnotoxin cp14-reagent-desc-toxin-spider = A venom which slows down its victim while destroying the body. Commonly found in spiders. + +cp14-reagent-name-toxin-bleed = Hemoroxide +cp14-reagent-desc-toxin-bleed = A venom which causes intense bleeding. Commonly used by Cackles. diff --git a/Resources/Locale/en-US/_CP14/skill/requirements.ftl b/Resources/Locale/en-US/_CP14/skill/requirements.ftl index 0e15c7f90e..71fece68f9 100644 --- a/Resources/Locale/en-US/_CP14/skill/requirements.ftl +++ b/Resources/Locale/en-US/_CP14/skill/requirements.ftl @@ -1,5 +1,10 @@ cp14-skill-req-prerequisite = Skill "{$name}" must be learned cp14-skill-req-species = You must be the race of “{$name}” +cp14-skill-req-notspecies = You must not be the race of “{$name}” +cp14-skill-req-vampire-clan = You must belong to the vampire clan "{$name}" cp14-skill-req-researched = A study needs to be done on the research table cp14-skill-req-impossible = Unable to explore during a round at the current moment -cp14-skill-req-god-follower-percentage = The number of your followers should be more than {$count}% \ No newline at end of file +cp14-skill-req-god-follower-percentage = The number of your followers should be more than {$count}% +cp14-skill-req-timegate = Available for study {$minute} minutes after the start of the round. Minutes remaining: {$left} +cp14-skill-req-timegate-disabled = Available for study {$minute} minutes after the start of the round, but time restrictions are disabled. +cp14-skill-req-vampire-tree-level = You must be near the heart of your clan, at least {$lvl} level. \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl b/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl index dbc590681a..cc748f1b23 100644 --- a/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl +++ b/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl @@ -42,4 +42,14 @@ cp14-skill-mithril-melt-name = Mithril melting cp14-skill-glass-melt-name = Glasswork cp14-skill-trader-wit-name = Trader's wit -cp14-skill-trader-wit-desc = You are able to estimate the exact value of any item in the empire at a first glance. \ No newline at end of file +cp14-skill-trader-wit-desc = You are able to estimate the exact value of any item in the empire at a first glance. + +# Vampire + +cp14-skill-vampire-night-vision-name = Night vision +cp14-skill-vampire-night-vision-desc = Darkness cannot be an obstacle for a creature of the night. + +cp14-skill-vampire-essence-vision-name = Analysis of blood +cp14-skill-vampire-essence-vision-desc = You are able to see how much essence can be extracted from the surrounding creatures. + +cp14-skill-vampire-transmutate-name = Blood transmutation \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/skill/skill_points.ftl b/Resources/Locale/en-US/_CP14/skill/skill_points.ftl index 0e24e6f8fd..307c3cc58c 100644 --- a/Resources/Locale/en-US/_CP14/skill/skill_points.ftl +++ b/Resources/Locale/en-US/_CP14/skill/skill_points.ftl @@ -1,2 +1,2 @@ cp14-skill-point-memory = Memory -cp14-skill-point-vampire-blood = Vampiric powers \ No newline at end of file +cp14-skill-point-vampire-blood = Blood essence \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/skill/skill_tree.ftl b/Resources/Locale/en-US/_CP14/skill/skill_tree.ftl index 1856ffa1c9..5a46c6cc14 100644 --- a/Resources/Locale/en-US/_CP14/skill/skill_tree.ftl +++ b/Resources/Locale/en-US/_CP14/skill/skill_tree.ftl @@ -42,4 +42,9 @@ cp14-skill-tree-martial-desc = Master the secrets of deadly weapons, or make you #cp14-skill-tree-trading-desc = The art of understanding where, when and for how much to sell and buy different items. cp14-skill-tree-craftsman-name = Craftsmanship -cp14-skill-tree-craftsman-desc = Learn the arts and crafts that let you create and use all kinds of useful things. \ No newline at end of file +cp14-skill-tree-craftsman-desc = Learn the arts and crafts that let you create and use all kinds of useful things. + +# Vampires + +cp14-skill-tree-vampire-name = Vampire powers +cp14-skill-tree-vampire-desc = Vampire clan. Ask Wandederere to write the lore here. \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/skill/ui.ftl b/Resources/Locale/en-US/_CP14/skill/ui.ftl index 1c7b32cc3b..90505e28ca 100644 --- a/Resources/Locale/en-US/_CP14/skill/ui.ftl +++ b/Resources/Locale/en-US/_CP14/skill/ui.ftl @@ -11,8 +11,12 @@ cp14-skill-menu-free = [color=green]This skill is innate to your character, and cp14-skill-desc-add-mana = Increases your character's mana amount by {$mana}. cp14-skill-desc-add-stamina = Increases your character's stamina amount by {$stamina}. cp14-skill-desc-unlock-recipes = Opens up the possibility of crafting: +cp14-skill-desc-unlock-constructions = Opens up the possibility of structure crafting: -cp14-skill-popup-added-points = The boundaries of your consciousness are expanding. New memory points: {$count} +cp14-skill-popup-memory-added = The boundaries of your consciousness are expanding. New memory points: {$count} +cp14-skill-popup-memory-losed = You are beginning to forget your past... Memory points lost: {$count} -cp14-skill-examine-title = This character has the following skills: -cp14-skill-popup-forced-remove-skill = You are beginning to forget your past... Memory points lost: {$count} \ No newline at end of file +cp14-skill-popup-blood-added = You absorb the life force of others. Blood essences obtained: {$count} +cp14-skill-popup-blood-losed = You are losing life force. Blood essence lost: {$count} + +cp14-skill-examine-title = This character has the following skills: \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/species/species.ftl b/Resources/Locale/en-US/_CP14/species/species.ftl index af37bcfd6e..269c0afadf 100644 --- a/Resources/Locale/en-US/_CP14/species/species.ftl +++ b/Resources/Locale/en-US/_CP14/species/species.ftl @@ -4,4 +4,5 @@ cp14-species-name-dwarf = Dwarf cp14-species-name-elf = Elf cp14-species-name-goblin = Goblin cp14-species-name-silva = Silva -cp14-species-name-carcat = Carcat \ No newline at end of file +cp14-species-name-carcat = Carcat +cp14-species-name-skeleton = Skeleton \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/stack/materials.ftl b/Resources/Locale/en-US/_CP14/stack/materials.ftl index 9b2f4c69ca..fe641d515a 100644 --- a/Resources/Locale/en-US/_CP14/stack/materials.ftl +++ b/Resources/Locale/en-US/_CP14/stack/materials.ftl @@ -28,6 +28,8 @@ cp14-stack-ash-pile = pile of ashes cp14-stack-group-wooden-planks-any = planks (any) +cp14-stack-blood-essence = blood essence + cp14-stack-hide-thin = thin hide cp14-stack-hide = coarse hide cp14-stack-hide-rugged = rugged hide \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/tiles/tiles.ftl b/Resources/Locale/en-US/_CP14/tiles/tiles.ftl index f897ffbc80..4e61987a67 100644 --- a/Resources/Locale/en-US/_CP14/tiles/tiles.ftl +++ b/Resources/Locale/en-US/_CP14/tiles/tiles.ftl @@ -2,9 +2,14 @@ cp14-tiles-base = rock strata # Natural -cp14-tiles-grass = meadow grass +cp14-tiles-grass = grass cp14-tiles-grass-light = light grass cp14-tiles-grass-tall = tall grass + +cp14-tiles-bloodgrass = bloodgrass +cp14-tiles-bloodgrass-light = light bloodgrass +cp14-tiles-bloodgrass-tall = tall bloodgrass + cp14-tiles-dirt = soil cp14-tiles-sand = sand cp14-tiles-snow = snow diff --git a/Resources/Locale/en-US/_CP14/vampire/vampire.ftl b/Resources/Locale/en-US/_CP14/vampire/vampire.ftl index bbdaf7c665..c48b8592b3 100644 --- a/Resources/Locale/en-US/_CP14/vampire/vampire.ftl +++ b/Resources/Locale/en-US/_CP14/vampire/vampire.ftl @@ -1,3 +1,33 @@ +cp14-vampire-fraction-name-unnameable = Unnameable +cp14-vampire-fraction-name-devourers = Devourers +cp14-vampire-fraction-name-night-childrens = Childrens of the night + + cp14-heat-under-sun = The sunlight stings unbearably... -cp14-vampire-examine = [color=red]Bright red eyes and long fangs tell you that you are facing a very dangerous vampire. Your instincts are telling you to run or fight![/color] \ No newline at end of file +cp14-vampire-examine = [color=red]Bright red eyes and long fangs tell you that you are facing a very dangerous vampire. Your instincts are telling you to run or fight![/color] + +cp14-magic-spell-need-vampire-valid = Not available in the hidden vampire form. +cp14-magic-spell-need-all-vampires = All living vampires of your clan should be nearby. + +cp14-vampire-tree-examine-faction = Belongs to the vampire clan "[color=red]{$faction}[/color]". +cp14-vampire-tree-examine-friend = [color=green]This is the heart of your clan.[/color] Protect it with all your might. +cp14-vampire-tree-examine-enemy = [color=red]This is the heart of the enemy clan.[/color]. + +cp14-vampire-tree-examine-level = Essences: ([color=red]{$essence}/{$left}[/color]). Current clan level: [color=red]{$level}[/color]. + +cp14-vampire-essence-holder-examine = This victim contains [color=red]{$essence} blood essence[/color]. + +cp14-vampire-tree-other-title = Progress of other clans: +cp14-vampire-tree-other-info = "{$name}": [color=red]({$essence}/{$left})[/color] essences, [color=red]{$lvl}[/color] level. +cp14-vampire-gather-essence-no-left = Здесь больше нет эссенции! + +## Announcements + +cp14-vampire-sender = Vampire instinct + +cp14-vampire-tree-growing = "{$name}" clan heart grows to level {$level}! +cp14-vampire-tree-growing-self = Your clan heart grows to level {$level}! +cp14-vampire-tree-damaged = Your clan's heart has been attacked! +cp14-vampire-tree-destroyed = "{$name}" clan heart has been destroyed! +cp14-vampire-tree-destroyed-self = Your clan's heart has been destroyed! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl b/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl index 49714fb472..31ef63cdc6 100644 --- a/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl +++ b/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl @@ -1240,16 +1240,16 @@ ent-CP14ClothingPantsMerchantsPantaloons = купеческие панталон ent-CP14ClothingShirtBase = рубашка .desc = Приятный на ощупь материал, удобная свободная форма рубашки. -ent-CP14ClothingShirtCottonBlack = холщовая черная рубашка +ent-CP14ClothingShirtCottonBlack = хлопковая черная рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtBlackDress = хлопковое черное платье .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtCottonBlue = холщовая синяя рубашка +ent-CP14ClothingShirtCottonBlue = хлопковая синяя рубашка .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtCottonBlueCollar = холщовая синяя рубашка с воротником +ent-CP14ClothingShirtCottonBlueCollar = хлопковая синяя рубашка с воротником .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtBlueCollarDress = хлопковое платье с голубым воротником @@ -1258,34 +1258,34 @@ ent-CP14ClothingShirtBlueCollarDress = хлопковое платье с гол ent-CP14ClothingShirtMercenary = рубашка наемника .desc = Пестрая рубашка наемника. -ent-CP14ClothingShirtBlueOpen = холщовая открытая синяя рубашка +ent-CP14ClothingShirtBlueOpen = хлопковая открытая синяя рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtBlueOpenDress = хлопковое голубое открытое платье .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtRedOpen = холщовая открытая красная рубашка +ent-CP14ClothingShirtRedOpen = хлопковая открытая красная рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtRedOpenDress = хлопковое красное открытое платье .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtYellowOpen = холщовая открытая желтая рубашка +ent-CP14ClothingShirtYellowOpen = хлопковая открытая желтая рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtYellowOpenDress = хлопковое желтое открытое платье .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtCottonPurple = холщовая фиолетовая рубашка +ent-CP14ClothingShirtCottonPurple = хлопковая фиолетовая рубашка .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtCottonRed = холщовая красная рубашка +ent-CP14ClothingShirtCottonRed = хлопковая красная рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtCottonRedDress = хлопковое красное платье .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtCottonWhite = холщовая белая рубашка +ent-CP14ClothingShirtCottonWhite = хлопковая белая рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtCottonWhiteDress = хлопковое белое платье @@ -1297,13 +1297,13 @@ ent-CP14ClothingShirtCottonWhiteCollar = хлопковая рубашка с б ent-CP14ClothingShirtCottonWhiteCollarDress = хлопковое платье с белым воротником .desc = { ent-CP14ClothingShirtBase.desc } -ent-CP14ClothingShirtCottonYellow = холщовая желтая рубашка +ent-CP14ClothingShirtCottonYellow = хлопковая желтая рубашка .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtJestersAttire = шутовской наряд .desc = Это лохмотья, но они красочные. -ent-CP14ClothingShirtCottonYellowCollar = холщовая желтая рубашка с воротником +ent-CP14ClothingShirtCottonYellowCollar = хлопковая желтая рубашка с воротником .desc = { ent-CP14ClothingShirtBase.desc } ent-CP14ClothingShirtCottonYellowCollarDress = хлопковое платье с желтым воротником diff --git a/Resources/Locale/ru-RU/_CP14/antag/antags.ftl b/Resources/Locale/ru-RU/_CP14/antag/antags.ftl index 6b7da30104..9778ef13d8 100644 --- a/Resources/Locale/ru-RU/_CP14/antag/antags.ftl +++ b/Resources/Locale/ru-RU/_CP14/antag/antags.ftl @@ -1,6 +1,10 @@ cp14-roles-antag-vampire-name = Вампир -cp14-roles-antag-vampire-objective = Вы - паразит на теле общества, ненавидимый окружающими, сгораемый под солнцем и вечно голодный. Вам необходимо питаться кровью разумных, чтобы выжить. И найти тех, кто добровольно будет готов стать вашей кормушкой непросто... -cp14-roles-antag-vampire-briefing = Вы - паразит на теле общества. Оно вас ненавидит и боится, но кровь живых - ваша единственная пища. Природа уничтожает вас солнечным светом, и вам приходится скрываться в тени. Словно весь мир пытается вас уничтожить, но ваше желание жить сильнее всего этого. ВЫЖИВИТЕ. Это все что от вас требуется. + +cp14-roles-antag-vampire-briefing-night-childrens = Как представитель дневнейшего клана Детей ночи, вы заявляете права на этот город. Работая из тени и не раскрывая своего присутствия обычным смертным, найдите и уничтожьте другие кланы, доказав свое превосходство. +cp14-roles-antag-vampire-briefing-unnameable = Как представитель древнейшего клана Неназываемых, вы заявляете права на этот город. Работая из тени и не раскрывая своего присутствия обычным смертным, найдите и уничтожьте другие кланы, доказав свое превосходство. +cp14-roles-antag-vampire-briefing-devourers = Как представительдревнейшего клана Пожираталей, вы заявляете права на этот город. Работая из тени и не раскрывая своего присутствия обычным смертным, найдите и уничтожьте другие кланы, доказав свое превосходство. + +cp14-roles-antag-vampire-objective = Как представитель одного из древнейших вампирских кланов, вы заявляете права на этот город. Работая из тени и не раскрывая своего присутствия обычным смертным, найдите и уничтожьте другие кланы, доказав свое превосходство. cp14-roles-antag-blood-moon-cursed-name = Проклятый кровавой луны cp14-roles-antag-blood-moon-cursed-objective = Некоторые существа теряют голову, и могут совершать немыслимые зверства, когда из-за горизонта всходит проклятая кровавая луна... diff --git a/Resources/Locale/ru-RU/_CP14/books/pantheon_gods_sileita.ftl b/Resources/Locale/ru-RU/_CP14/books/pantheon_gods_sileita.ftl new file mode 100644 index 0000000000..eb91c5c17e --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/books/pantheon_gods_sileita.ftl @@ -0,0 +1,141 @@ +cp14-book-text-pantheon-gods-sileita = Пантеон Силейты делится на три великих ранга: [bold]Абсолюты, Старшие Боги и Младшие Боги[/bold]. Вера в богов влияет на политическую, духовную и магическую жизнь всех народов Силейты. Некоторые божества запрещены к почитанию, другие почитаются как официальные покровители стран или организаций. + {"[italic]'Я — Наблюдатель, храмовник из Ордена Хранителей Истин, призванный собирать сведения о всех богах Силейты без предвзятости. Мы не молимся. Мы записываем. Ни один бог не достоин поклонения, пока не будет понятен в полном объёме. Ни один не выше другого. Все — части сложной картины.'[/italic]"} + + {"[head=2]Абсолюты — Первые Силы[/head]"} + + {"[head=3][color=purple]Томер[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Изменчивый, Первопротиворечие, Лепящий. Отринутый.[/italic] + • [bold]Идея[/bold]: Хаос, метаморфозы, биологическая и метафизическая эволюция. + • [bold]Символ[/bold]: Спираль из расползающихся форм. + • [bold]Присутствие[/bold]: Физический облик заточён в божественной тюрьме. Его 'пришествия' — катастрофы: мутации, взрывы чужеродных биомов, падения плоти с неба. Влияние Томера - проблески его энергии способные изменять окружение вокруг. + • [bold]Характер[/bold]: Его нельзя назвать злом — он вне понятий добра. Это слепая любознательность в разрушении. Он изменяет ради самого изменения. Разум пульсирующего мира, который мечтает стать чем-то новым. + • [bold]Отношение к смертным[/bold]: Интересуется ими как материалом. Он — не палач, а ремесленник. Бесстрастный, но внимательный. + • [bold]Комментарий[/bold]: Опасен не столько силой, сколько тем, что заражает умы идеей разрушения как метода прогресса. Его запрещение законом оправдано. Его учение — сладкий яд. + + {"[head=3][color=purple]Альтаран[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Мерцающий Суд, Ход Потоков, Наблюдающий Сквозь Века.[/italic] + • [bold]Идея[/bold]: Время, темпоральные течения, суд, порядок. + • [bold]Символ[/bold]: Вечный круг с внутренними часами, бегущими в разные стороны. + • [bold]Присутствие[/bold]: Никогда не является в виде плоти. Никогда не был замечен в Силейте однако было замечено присутствие в Войде. + • [bold]Характер[/bold]: Абсолютно беспристрастен. В нём нет гнева, только уравнение. Противен смертным тем, что не прощает — но и не мстит. Является внегласным лидером всего пантеона и контролирующей инстанцией. + • [bold]Отношение к смертным[/bold]: Видит их как единицы в модели. Не отрицает значимости личности, но признаёт лишь её влияние на ход времени. + • [bold]Комментарий[/bold]: Если бы все боги исчезли, Альтаран остался бы наблюдать за тем, как рушится их работа. + + {"[head=3][color=purple]Релафир и Вестрис[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Близнецы Перехода, Ключ и Замок, Первородные Врата. Волк и овца.[/italic] + • [bold]Идея[/bold]: Жизнь, смерть, душа, реинкарнация, Войд. + • [bold]Символ веры[/bold]: Переплетённые круги с оком в центре. + • [bold]Присутствие[/bold]: В момент рождения — Вестрис наблюдает. В момент смерти — Релафир провожает. В глубокой тишине и в последнем вздохе — оба. Физически появлялся только Релафир в судный день Бафамира. + • [bold]Характер[/bold]: + - Вестрис — мягка и задумчива, как весеннее утро. + - Релафир — сдержан и неизбежен, как ночь. + Они не спорят. [bold]Их единство фундаментально.[/bold] + • [bold]Отношение к смертным[/bold]: Не судят, не поощряют, не уговаривают. Они просто есть. Сопровождают, не вмешиваясь. + • [bold]Комментарий[/bold]: Страшны не своей силой, а тем, что имеют право её применить. Некроманты и опытные лекари могут принимать веру близнецов ради изучения воскрешения и перерождения. + + {"[head=2]Старшие Боги — Перворождённые[/head]"} + + {"[head=3][color=forestgreen]Ирумель[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Упавший Щит, Верный, Последний из Звёздных.[/italic] + • [bold]Идея[/bold]: Защита, честь, самопожертвование. + • [bold]Символ веры[/bold]: Разбитый щит, испускающий свет. + • [bold]Присутствие[/bold]: [bold]Считается погибшим[/bold] в божественной войне. Но в руинах храмов его присутствие ощущается как зов к долгу. Говорят, можно увидеть раненный силуэт в бывших местах его веры. + • [bold]Характер[/bold]: Был воплощением служения. Говорили, он молчал часами, но одним взглядом убеждал армию. + • [bold]Отношение к смертным[/bold]: Видел в них, возможно, больше, чем они заслуживали. Верил, что их стоит защищать любой ценой. + • [bold]Комментарий[/bold]: Если он и мёртв, то в таком случае - боги смертны. Это тревожит. + + {"[head=3][color=forestgreen]Девиас / Фенор[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Серебряный Тень, Шёпот во Сне, Слушающий Неназванное.[/italic] + • [bold]Идея[/bold]: Сны, тайны, предвидение, сокрытие. + • [bold]Символ[/bold]: Глаз, вертикально закрытый пальцем. + • [bold]Присутствие[/bold]: Почти никогда не является физически, однако через ритуалы с ним можно недолго поговорить, но цена будет велика. + • [bold]Характер[/bold]: Тихий и доброжелательный, но тревожный. Говорит намеками. Обладает чудовищным знанием. + • [bold]Отношение к смертным[/bold]: Предупреждает, но не вмешивается. Кто слушает — тот спасён. Кто требует — тот сходит с ума. + • [bold]Комментарий[/bold]: Не враг. Но и не союзник. + + {"[head=3][color=forestgreen]Джеларион[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Чёрное Пламя, Кровавый Учитель, Отголосок Обиды.[/italic] + • [bold]Идея[/bold]: Месть, ярость, расплата, гнев. + • [bold]Символ[/bold]: Пылающее сердце, пронзённое кинжалом. + • [bold]Присутствие[/bold]: Приходит в момент клятвы мести. Часто не напрямую, а через видения или галлюцинации в момент клятвы. + • [bold]Характер[/bold]: Обжигающе яркий, с хищной харизмой. + • [bold]Отношение к смертным[/bold]: Любит их боль, но не ради страдания. + • [bold]Комментарий[/bold]: Он опасен не тем, что даёт силы, а тем, что делает жертву сладкой. + + {"[head=3][color=forestgreen]Меркас[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Бальзамирующий Свет, Милосердный Брат, Тот, кто Чистит.[/italic] + • [bold]Идея[/bold]: Исцеление, очищение, воскрешение. + • [bold]Символ[/bold]: Белая ладонь, отгоняющая тьму. + • [bold]Присутствие[/bold]: Является в чудесах: когда смертельное исчезает без следа, когда проклятие рушится. + • [bold]Характер[/bold]: Спокоен. Не осуждает, но не забывает. Говорит мягко, действует точно. + • [bold]Отношение к смертным[/bold]: Видит в них возможность для восстановления. + • [bold]Комментарий[/bold]: Из всех он ближе всего к тому, что называют 'добром'. Но и он не без тени. Очищение может стать одержимостью. + + {"[head=2]Младшие Боги — Вознесённые или Вторые Потомки[/head]"} + + {"[head=3][color=blue]Рихьярд / Хельмир[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Железный Взгляд, Покровитель Дуэлей, Вечный Полководец.[/italic] + • [bold]Идея[/bold]: Война, битва, честь. + • [bold]Символ[/bold]: Перекрещённые мечи над шлемом. + • [bold]Присутствие[/bold]: Часто — лично, в теле солдата любой расы скрывая свою истинную сущность. Говорит через пылающее воодушевление воина. + • [bold]Характер[/bold]: Груб, но честен. Его уважение надо заслужить. Он не про победу — он про схватку. + • [bold]Отношение к смертным[/bold]: Любит тех, кто дерётся не ради убийства, а ради достоинства. Тифлинги являются родными существами его личного плана войны. + • [bold]Комментарий[/bold]: Опасен там, где культ превращает войну в игру. Но необходим, где честь выше страха. + + {"[head=3][color=blue]Архофея[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Матерь Объятия, Согревающая Рана, Цветок после Шторма.[/italic] + • [bold]Идея[/bold]: Любовь, доброта, семья. + • [bold]Символ[/bold]: Распущенное сердце с лепестками. + • [bold]Присутствие[/bold]: Её образ может проявится во время свадебных церемоний, и в других сильных эмоциональных моментах. + • [bold]Характер[/bold]: Искренняя и сострадательная. Говорит как мать. + • [bold]Отношение к смертным[/bold]: Принимает всех. Даже падших. Особенно их. + • [bold]Комментарий[/bold]: Её вера часто осмеяна как 'слабая'. Но именно она держит людей от последней черты. + + {"[head=3][color=blue]Лумера[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Путеводная в Ночи, Тихая Учительница, Око Луны.[/italic] + • [bold]Идея[/bold]: Ночь, звёзды, знание, обучение. + • [bold]Символ[/bold]: Полумесяц, из которого струятся лучи. + • [bold]Присутствие[/bold]: Часто физически, в облике гарпии. Она — одна из немногих, кто действительно ходит среди людей. Часто появляется в Крайхеле. Известна своими публичными лекциями, хотя её лицо почти никто не запоминает. + • [bold]Характер[/bold]: Мудрая, ироничная, заботливая. Учит не словами, а вопросами. + • [bold]Отношение к смертным[/bold]: Ценит стремящихся к знаниям и тех, кто встал из мрака. + • [bold]Комментарий[/bold]: Её боятся лжецы. Жрецы пытаются найти связь между Лумерой и алой луной. + + {"[head=3][color=blue]Сильфория[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Ветер Жажды, Хозяйка Приключений, Бесстрашная.[/italic] + • [bold]Идея[/bold]: Авантюры, исследование, свобода. + • [bold]Символ[/bold]: Листья на ветру. + • [bold]Присутствие[/bold]: Часто путешествует инкогнито. Может быть любой: нищенкой, стариком, гильдмастером. + • [bold]Характер[/bold]: Энергичная, шальная, с заразительным смехом. Любит спор. + • [bold]Отношение к смертным[/bold]: Ценит тех, кто рискует. Презирает тех, кто живёт под замком страха. + • [bold]Комментарий[/bold]: Единственная из богов, к кому хочется сесть у костра. Она смеётся и за тобой, и с тобой. Бывший высший дух ветра который получил благословение от Релафир и Вестрис и становление богиней после отражения нападения левиафана. + + {"[head=3][color=blue]Алеона[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Суд Света, Стальная Хранительница, Глаз Империи.[/italic] + • [bold]Идея[/bold]: Правосудие, защита, закон. + • [bold]Символ[/bold]: Весы, окружённые сиянием. + • [bold]Присутствие[/bold]: В залах правосудия Империи Зелласиан. Может явиться лично, если суд грозит стать фарсом. + • [bold]Характер[/bold]: Безупречно хладнокровна. Не отворачивается от боли, но не принимает слёз как аргумент. + • [bold]Отношение к смертным[/bold]: Видит в них подданных справедливости. Верит в исправление, но наказывает без колебаний. + • [bold]Комментарий[/bold]: Империя называет её своей богиней. Но она служит не трону — а правде. И это делает её страшнее, чем весь пантеон. + + {"[head=3][color=blue]Осиф[/color][/head]"} + + • [bold]Имена[/bold]: [italic]Шторм, Ненасытность, Морская Глубина.[/italic] + • [bold]Идея[/bold]: Своенравность, непокорность, морское безумие. + • [bold]Символ[/bold]: Две волны, движущиеся навстречу друг другу. + • [bold]Присутствие[/bold]: Почти никогда не появляется в мире, но его дитя - Левиафан — живёт в глубинах океанов и морей. + • [bold]Характер[/bold]: Взрывной характер, никогда не знаешь, чего от него ожидать. + • [bold]Отношение к смертным[/bold]: Может как помогать, так и топить целые побережья и флоты, его дитя презирает любое существо. + • [bold]Комментарий[/bold]: Божество Океанов, Вод и Бурь. Во время божественной войны он поддержал Томера и с помощью энергии Лумеры породил Левиафана — монстра, который во время войны с Янтакиники потопил почти все корабли Зелласской Империи и сражался в забытой эпохе с Сильфорией. diff --git a/Resources/Locale/ru-RU/_CP14/books/pantheon_gods_sileita_imitators.ftl b/Resources/Locale/ru-RU/_CP14/books/pantheon_gods_sileita_imitators.ftl new file mode 100644 index 0000000000..4b6db2861e --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/books/pantheon_gods_sileita_imitators.ftl @@ -0,0 +1,32 @@ +cp14-book-text-pantheon-gods-sileita-imitators = [head=2]Подражатели Богов[/head] + + • [bold]Имена[/bold]: [italic]Эхо-Духи, Масконосцы, Псевдобожественные.[/italic] + + Подражатели — это существа, духи, фантомы или одержимые, которые принимают облик, речь, повадки и цели одного из богов, не обладая их благословением или санкцией. Они не являются истинными служителями, но могут внешне неотличимо копировать божественные проявления. Этот феномен встречается как в ритуальном искусстве и магии убеждения, так и в бессознательных формах искажённой веры. есть и уникальные существа созданные бессознательно, под влиянием магических аномалий, эгрегоров(коллективный разум) веры или Войда. + + {"[head=2]Общее о природе Подражателей[/head]"} + + Не получают силы от самого бога, но могут использовать ритуалы имитирующие чудеса и/или энергию бога. + Часто появляются в местах сильного религиозного напряжения — в пустующих храмах, на полях битв, где поклонялись богам, или в регионах, забытых жречеством. + Некоторые Подражатели — духи, возникшие из эхо коллективной веры и взявшие в себя энергию богов, другие — смертные, захваченные идеей. + Иногда бог знает о подражателе, но не реагирует — считая его 'шумом веры'. + + {"[head=2]Типология Подражателей[/head]"} + + {"[head=3][color=goldenrod]Теневые Лики[/color][/head]"} + + Существа, копирующие внешний облик и повадки богов. Часто ими являются духи которые в момент эволюции напитались энергией богов, или жившие в это время в местах религиозного возмущения. + {"[italic]Пример[/italic]: Дух, проживающий у алтаря богини перенимает её внешность и повадки, становясь слабой копией."} + + {"[head=3][color=goldenrod]Духи Эха[/color][/head]"} + + Бестелесные образования, возникающие из избытка молитв или страха. Не имеют воли, но отражают конкретную сторону бога — гнев Джелариона, сострадание Архофеи и т.д. Могут 'заражать' людей, делая их временными носителями поведенческого паттерна. Часто появляются рядом с детьми, пережившими религиозную травму или экстаз. + {"[italic]Пример[/italic]: силуэт Ирумеля в разрушенных храмах призывающий к состраданию."} + + {"[head=3][color=goldenrod]Теомимы («богоподобники»)[/color][/head]"} + + Дух который перенял во время своего развития энергию бога или войда и прошёл эволюцию в высшего духа, став ближе к своему богу. Может проявить самосознание или получить одержимость другими существами, ставь злой карикатурой на бога - мнемокрады. Это злобные, фанатичные копии богов. Они крадут образ, речь и силу божества, искажают их, действуют от имени, которого не получали. Некоторые мнемокрады собирают собственных 'лже-культистов', убеждая их в своей подлинности. + + {"[head=3][color=goldenrod]Осколки Воли[/color][/head]"} + + Появляются в местах, где бог ранее проявлялся. Это — осколки прошлых проявлений, потерявшие связь с источником. Они неразумны, но несут повадки, голос и паттерн поведения божества. Являются 'живым' воспоминанием о событиях бога на тот момент. Могут быть опасны, если поверят, что им снова нужно 'исполнить волю'. diff --git a/Resources/Locale/ru-RU/_CP14/construction/category.ftl b/Resources/Locale/ru-RU/_CP14/construction/category.ftl new file mode 100644 index 0000000000..f10f3341f8 --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/construction/category.ftl @@ -0,0 +1 @@ +cp14-construction-category-vampire = Вампиры \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/construction/conditions.ftl b/Resources/Locale/ru-RU/_CP14/construction/conditions.ftl index 2952abcf5b..5483571d23 100644 --- a/Resources/Locale/ru-RU/_CP14/construction/conditions.ftl +++ b/Resources/Locale/ru-RU/_CP14/construction/conditions.ftl @@ -1 +1,2 @@ -cp14-construction-condition-mana-filled = Структура должна быть полностью запитана маной. \ No newline at end of file +cp14-construction-condition-mana-filled = Структура должна быть полностью запитана маной. +cp14-construction-condition-singleton = Может существовать только в единственном экземпляре! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/contraband/contraband-severity.ftl b/Resources/Locale/ru-RU/_CP14/contraband/contraband-severity.ftl new file mode 100644 index 0000000000..74d95e664b --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/contraband/contraband-severity.ftl @@ -0,0 +1,3 @@ +cp14-contraband-examine-text-CP14Minor = [color=yellow]Владение этим предметом считается легко-средним нарушением.[/color] + +cp14-contraband-examine-text-CP14Major = [color=red]Владение этим предметом считается средне-тяжелым нарушением.[/color] \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/demiplane/modifiers.ftl b/Resources/Locale/ru-RU/_CP14/demiplane/modifiers.ftl index d825465d40..0776815b60 100644 --- a/Resources/Locale/ru-RU/_CP14/demiplane/modifiers.ftl +++ b/Resources/Locale/ru-RU/_CP14/demiplane/modifiers.ftl @@ -12,6 +12,7 @@ cp14-modifier-explosive = взрывные мины cp14-modifier-ruins = древние руины cp14-modifier-zombie = зомби cp14-modifier-slime = слаймы +cp14-modifier-cackle = кэклзы cp14-modifier-skeleton = разумные скелеты cp14-modifier-dyno = динозавры cp14-modifier-mole = хищные кроты diff --git a/Resources/Locale/ru-RU/_CP14/gameTicking/game-preserts.ftl b/Resources/Locale/ru-RU/_CP14/gameTicking/game-presets.ftl similarity index 54% rename from Resources/Locale/ru-RU/_CP14/gameTicking/game-preserts.ftl rename to Resources/Locale/ru-RU/_CP14/gameTicking/game-presets.ftl index 7e2f78fe6c..84fef5916f 100644 --- a/Resources/Locale/ru-RU/_CP14/gameTicking/game-preserts.ftl +++ b/Resources/Locale/ru-RU/_CP14/gameTicking/game-presets.ftl @@ -1,2 +1,5 @@ cp14-gamemode-survival-title = Выживание -cp14-gamemode-survival-description = Ваш корабль терпит бедствие и падает в дикие, опасные земли. На что вы пойдете, чтобы выжить? Кто из вас найдет путь обратно в цивилизацию? И кто... или что это наблюдает за вами из темноты... \ No newline at end of file +cp14-gamemode-survival-description = Ваш корабль терпит бедствие и падает в дикие, опасные земли. На что вы пойдете, чтобы выжить? Кто из вас найдет путь обратно в цивилизацию? + +cp14-peaceful-title = Мирное время +cp14-peaceful-description = Спокойное существование без крупных неприятностей. Найдите себе занятие по душе. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/gameTicking/gamePresets/vampire_clan_battles.ftl b/Resources/Locale/ru-RU/_CP14/gameTicking/gamePresets/vampire_clan_battles.ftl new file mode 100644 index 0000000000..932c562da0 --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/gameTicking/gamePresets/vampire_clan_battles.ftl @@ -0,0 +1,19 @@ +cp14-vampire-clans-battle = Битва вампирских кланов +cp14-vampire-clans-description = Сразу несколько вампирских кланов заявляют права на территорию города. И только один из них станет истинным владыкой земель... + +cp14-vampire-clans-battle-clan-win = Победа клана "{$name}" +cp14-vampire-clans-battle-clan-win-desc = Вампирский клан, доказавший свое могущество, становится тайным правителем этих земель. + +cp14-vampire-clans-battle-clan-tie-2 = Ничья между кланами "{$name1}" и "{$name2}" +cp14-vampire-clans-battle-clan-tie-2-desc = Два клана, не сумевшие одолеть друг друга, вынуждены делить эти земли между собой. + +cp14-vampire-clans-battle-clan-tie-3 = Ничья между всеми кланами +cp14-vampire-clans-battle-clan-tie-3-desc = Вампирские кланы, не сумевшие одолеть друг друга, вынуждены делить эти земли между собой. + +cp14-vampire-clans-battle-clan-city-win = Победа поселения +cp14-vampire-clans-battle-clan-city-win-desc = Все вампирские кланы были истреблены, и жители могут спать в безопасности. + +cp14-vampire-clans-battle-clan-lose = Полное поражение +cp14-vampire-clans-battle-clan-lose-desc = Большая часть поселения погибла в борьбе между кланами. Даже оставшимся в живых кланам больше не прокормиться на этих землях. + +cp14-vampire-clans-battle-alive-people = Процент выжившего населения: [color=red]{$percent}%[/color] \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl b/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl index bcfca87412..c5d6ddab93 100644 --- a/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl +++ b/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl @@ -21,6 +21,7 @@ cp14-magic-spell-need-material-component = Нужно держать матер cp14-magic-spell-stamina-not-enough = Вам не хватает сил, чтобы сделать это. cp14-magic-staminacost = Затраты энергии cp14-magic-spell-pacified = Это может навредить кому либо! +cp14-magic-spell-ssd = Не трогайте отключившихся игроков! cp14-magic-spell-target-not-mob = Цель должна быть живым существом! @@ -29,4 +30,7 @@ cp14-magic-spell-target-mob-state-dead = мертвые cp14-magic-spell-target-mob-state-live = живые cp14-magic-spell-target-mob-state-critical = умирающие -cp14-magic-spell-target-god-follower = Цель должна быть вашим последователем! \ No newline at end of file +cp14-magic-spell-target-god-follower = Цель должна быть вашим последователем! + +cp14-magic-skillpointcost = Затраты ресурса "{$name}": [color=#eba834]{$count}[/color] +cp14-magic-spell-skillpoint-not-enough = Не хватает еще {$count} ресурса "{$name}"! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/objectives/condition/vampire.ftl b/Resources/Locale/ru-RU/_CP14/objectives/condition/vampire.ftl new file mode 100644 index 0000000000..5fcb653e09 --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/objectives/condition/vampire.ftl @@ -0,0 +1,7 @@ +cp14-objective-issuer-vampire = [color="#c20034"]Клан вампиров[/color] + +cp14-objective-vampire-pure-bood-title = Изгнать чужие вампирские кланы +cp14-objective-vampire-pure-bood-desc = Чужаки из других вампирских кланов скрываются среди жителей. Уничтожьте их, чтобы поселение принадлежало только вам. + +cp14-objective-vampire-defence-settlement-title = Сохранить своё имущество +cp14-objective-vampire-defence-settlement-desc = Жители этого города - ваше имущество и ваша еда. Не позвольте им умереть. Как минимум {$count}% жителей должны выжить. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/objectives/steal-targets.ftl b/Resources/Locale/ru-RU/_CP14/objectives/steal-targets.ftl deleted file mode 100644 index e62ee56bf6..0000000000 --- a/Resources/Locale/ru-RU/_CP14/objectives/steal-targets.ftl +++ /dev/null @@ -1,3 +0,0 @@ -cp14-steal-target-dino = юмкарапторов -cp14-steal-target-mole = хищных кротов -cp14-steal-target-boar = кабанов или свиней diff --git a/Resources/Locale/ru-RU/_CP14/reagents/meta/monster_toxins.ftl b/Resources/Locale/ru-RU/_CP14/reagents/meta/monster_toxins.ftl index f020b242cb..4eb8e01354 100644 --- a/Resources/Locale/ru-RU/_CP14/reagents/meta/monster_toxins.ftl +++ b/Resources/Locale/ru-RU/_CP14/reagents/meta/monster_toxins.ftl @@ -1,2 +1,5 @@ cp14-reagent-name-toxin-spider = Арахнотоксин cp14-reagent-desc-toxin-spider = Яд, который замедляет жертву, одновременно разрушая её тело. Часто встречается у пауков. + +cp14-reagent-name-toxin-bleed = Гемороксид +cp14-reagent-desc-toxin-bleed = Яд, вызывающий сильное кровотечение. Обычно используется Кэклзом. diff --git a/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl b/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl index 1eede4ac12..678891c4d0 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl @@ -1,5 +1,10 @@ cp14-skill-req-prerequisite = Навык "{$name}" должен быть изучен cp14-skill-req-species = Вы должны быть расы "{$name}" +cp14-skill-req-notspecies = Вы не должны быть расы "{$name}" +cp14-skill-req-vampire-clan = Вы должны принадлежать вампирскому клану "{$name}" cp14-skill-req-researched = Необходимо провести исследование на исследовательском столе cp14-skill-req-impossible = Невозможно изучить во время раунда на текущий момент -cp14-skill-req-god-follower-percentage = Количество ваших последователей должно быть больше {$count}% \ No newline at end of file +cp14-skill-req-god-follower-percentage = Количество ваших последователей должно быть больше {$count}% +cp14-skill-req-timegate = Доступно для изучения через {$minute} минут после начала раунда. Осталось минут: {$left} +cp14-skill-req-timegate-disabled = Доступно для изучения через {$minute} минут после начала раунда, но ограничения по времени отключены. +cp14-skill-req-vampire-tree-level = Вы должны находиться рядом с сердцем вашего клана, как минимум {$lvl} уровня. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/skill/skill_meta.ftl b/Resources/Locale/ru-RU/_CP14/skill/skill_meta.ftl index 71980a1065..cfb5c33c2a 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/skill_meta.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/skill_meta.ftl @@ -42,4 +42,14 @@ cp14-skill-mithril-melt-name = Плавка мифрила cp14-skill-glass-melt-name = Работа со стеклом cp14-skill-trader-wit-name = Торговая смекалка -cp14-skill-trader-wit-desc = Вы способны одним взглядом оценить и вычислить точную стоимость предмета в империи. \ No newline at end of file +cp14-skill-trader-wit-desc = Вы способны одним взглядом оценить и вычислить точную стоимость предмета в империи. + +# Vampire + +cp14-skill-vampire-night-vision-name = Ночное зрение +cp14-skill-vampire-night-vision-desc = Темнота не может быть помехой для существа ночи. + +cp14-skill-vampire-essence-vision-name = Анализ крови +cp14-skill-vampire-essence-vision-desc = Вы способны видеть сколько эссенции возможно извлечь из окружающих существ. + +cp14-skill-vampire-transmutate-unnameable-name = Трансмутация крови \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/skill/skill_points.ftl b/Resources/Locale/ru-RU/_CP14/skill/skill_points.ftl index 13cf949146..7371a14c21 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/skill_points.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/skill_points.ftl @@ -1,2 +1,2 @@ cp14-skill-point-memory = Память -cp14-skill-point-vampire-blood = Вампирские силы \ No newline at end of file +cp14-skill-point-vampire-blood = Эссенция крови \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/skill/skill_tree.ftl b/Resources/Locale/ru-RU/_CP14/skill/skill_tree.ftl index 2703ef6e0d..e533b270a5 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/skill_tree.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/skill_tree.ftl @@ -41,4 +41,9 @@ cp14-skill-tree-martial-desc = Овладейте секретами смерт #cp14-skill-tree-trading-desc = Исскуство познания где, когда, и за сколько продавать и покупать различные предметы. cp14-skill-tree-craftsman-name = Ремесленничество -cp14-skill-tree-craftsman-desc = Изучайте навыки и умения для создания и использования различных полезных вещей. \ No newline at end of file +cp14-skill-tree-craftsman-desc = Изучайте навыки и умения для создания и использования различных полезных вещей. + +# Vampires + +cp14-skill-tree-vampire-name = Вампирские силы +cp14-skill-tree-vampire-desc = Вампирский клан. Попросите Wandederere написать лор здесь. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/skill/ui.ftl b/Resources/Locale/ru-RU/_CP14/skill/ui.ftl index 54decbf093..e8f17eb702 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/ui.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/ui.ftl @@ -11,8 +11,12 @@ cp14-skill-menu-free = [color=green]Этот навык врожденный д cp14-skill-desc-add-mana = Увеличивает объем маны вашего персонажа на {$mana}. cp14-skill-desc-add-stamina = Увеличивает выносливость вашего персонажа на {$stamina}. cp14-skill-desc-unlock-recipes = Открывает возможность создания: +cp14-skill-desc-unlock-constructions = Открывает возможность создания структур: -cp14-skill-popup-added-points = Границы вашего сознания расширяются. Новых очков памяти: {$count} -cp14-skill-popup-forced-remove-skill = Вы начинаете забывать свое прошлое... Потеряно очков памяти: {$count} +cp14-skill-popup-memory-added = Границы вашего сознания расширяются. Новых очков памяти: {$count} +cp14-skill-popup-memory-losed = Вы начинаете забывать свое прошлое... Потеряно очков памяти: {$count} + +cp14-skill-popup-blood-added = Вы впитываете чужую жизненную силу. Получено эссенции крови: {$count} +cp14-skill-popup-blood-losed = Вы теряете чужую жизненную силу. Потеряно эссенции крови: {$count} cp14-skill-examine-title = Этот персонаж владеет следующими навыками: \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/species/species.ftl b/Resources/Locale/ru-RU/_CP14/species/species.ftl index ff9caae3bb..e88c11c145 100644 --- a/Resources/Locale/ru-RU/_CP14/species/species.ftl +++ b/Resources/Locale/ru-RU/_CP14/species/species.ftl @@ -4,4 +4,5 @@ cp14-species-name-dwarf = Дварф cp14-species-name-elf = Эльф cp14-species-name-goblin = Гоблин cp14-species-name-silva = Сильва -cp14-species-name-carcat = Каркат \ No newline at end of file +cp14-species-name-carcat = Каркат +cp14-species-name-skeleton = Скелет \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/stack/materials.ftl b/Resources/Locale/ru-RU/_CP14/stack/materials.ftl index 841140405a..e9547e528e 100644 --- a/Resources/Locale/ru-RU/_CP14/stack/materials.ftl +++ b/Resources/Locale/ru-RU/_CP14/stack/materials.ftl @@ -30,5 +30,6 @@ cp14-stack-hide-thin = тонкая шкура cp14-stack-hide = грубая шкура cp14-stack-hide-rugged = прочная шкура +cp14-stack-blood-essence = эссенция крови cp14-stack-group-wooden-planks-any = доски (любые) diff --git a/Resources/Locale/ru-RU/_CP14/tiles/tiles.ftl b/Resources/Locale/ru-RU/_CP14/tiles/tiles.ftl index ef8a766f7b..a895da1af3 100644 --- a/Resources/Locale/ru-RU/_CP14/tiles/tiles.ftl +++ b/Resources/Locale/ru-RU/_CP14/tiles/tiles.ftl @@ -2,9 +2,14 @@ cp14-tiles-base = каменная толща # Natural -cp14-tiles-grass = луговая трава +cp14-tiles-grass = трава cp14-tiles-grass-light = светлая трава cp14-tiles-grass-tall = высокая трава + +cp14-tiles-bloodgrass = кровьтрава +cp14-tiles-bloodgrass-light = светлая кровьтрава +cp14-tiles-bloodgrass-tall = высокая кровьтрава + cp14-tiles-dirt = почва cp14-tiles-sand = песок cp14-tiles-snow = снег diff --git a/Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl b/Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl index 932ee0eef2..e2d47517e0 100644 --- a/Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl +++ b/Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl @@ -1,3 +1,32 @@ +cp14-vampire-fraction-name-unnameable = Неназываемые +cp14-vampire-fraction-name-devourers = Пожиратели +cp14-vampire-fraction-name-night-childrens = Дети ночи + cp14-heat-under-sun = Солнечый свет нестерпимо жжется... -cp14-vampire-examine = [color=red]Ярко красные глаза и длинные клыки говорят вам что перед вами опаснейший вампир. Ваши инстинкты кричат вам бежать или сражаться![/color] \ No newline at end of file +cp14-vampire-examine = [color=red]Ярко красные глаза и длинные клыки говорят вам что перед вами опаснейший вампир. Ваши инстинкты кричат вам бежать или сражаться![/color] + +cp14-magic-spell-need-vampire-valid = Недоступно в скрытой форме вампира. +cp14-magic-spell-need-all-vampires = Все живые вампиры вашего клана должны находиться рядом. + +cp14-vampire-tree-examine-faction = Принадлежит вампирскому клану "[color=red]{$faction}[/color]". +cp14-vampire-tree-examine-friend = [color=green]Это сердце вашего клана. [/color] Защищайте его всеми силами. +cp14-vampire-tree-examine-enemy = [color=red]Это сердце вражеского клана.[/color] + +cp14-vampire-tree-examine-level = Эссенции: ([color=red]{$essence}/{$left}[/color]). Текущий уровень клана: [color=red]{$level}[/color]. + +cp14-vampire-essence-holder-examine = В этой жертве есть еще [color=red]{$essence} эссенции крови[/color]. + +cp14-vampire-tree-other-title = Прогресс других кланов: +cp14-vampire-tree-other-info = "{$name}": [color=red]{$count}[/color] эссенции, [color=red]{$lvl}[/color] уровень. +cp14-vampire-gather-essence-no-left = There is no more essence here! + +## Announcements + +cp14-vampire-sender = Вампирское чутье + +cp14-vampire-tree-growing = Сердце клана "{$name}" вырастает до {$level} уровня! +cp14-vampire-tree-growing-self = Ваше сердце клана вырастает до {$level} уровня! +cp14-vampire-tree-damaged = Ваше сердце клана атаковано! +cp14-vampire-tree-destroyed = Сердце клана "{$name}" разрушено! +cp14-vampire-tree-destroyed-self = Ваше сердце клана разрушено! \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 7c482fdd06..653e1a22d9 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -94,6 +94,7 @@ #- type: WirelessNetworkConnection # range: 500 #- type: StationLimitedNetwork + - type: CP14ShowVampireFaction - type: CP14SkillScanner - type: CP14PriceScanner - type: CP14ZLevelMover diff --git a/Resources/Prototypes/_CP14/Alerts/status_effect.yml b/Resources/Prototypes/_CP14/Alerts/status_effect.yml index 5bc29d0c1f..a04e725f0d 100644 --- a/Resources/Prototypes/_CP14/Alerts/status_effect.yml +++ b/Resources/Prototypes/_CP14/Alerts/status_effect.yml @@ -8,4 +8,10 @@ id: CP14Glowing icons: - sprite: _CP14/Actions/Spells/light.rsi - state: sphere_of_light \ No newline at end of file + state: sphere_of_light + +- type: alert + id: CP14VampireSleeping + icons: + - sprite: _CP14/Actions/Spells/vampire.rsi + state: blood_moon \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Damage/modifier_sets.yml b/Resources/Prototypes/_CP14/Damage/modifier_sets.yml index c4564329a2..38eebd4d25 100644 --- a/Resources/Prototypes/_CP14/Damage/modifier_sets.yml +++ b/Resources/Prototypes/_CP14/Damage/modifier_sets.yml @@ -117,6 +117,13 @@ Heat: 1.4 Cold: 0.2 +- type: damageModifierSet + id: CP14Cackle + coefficients: + Heat: 1.4 + Slash: 1.2 + Piercing: 0.6 + - type: damageModifierSet id: CP14WatcherFire coefficients: diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Dimension/portal_to_city.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Dimension/portal_to_city.yml index 70f760eb42..4d749c54cc 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Dimension/portal_to_city.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Dimension/portal_to_city.yml @@ -7,7 +7,7 @@ - type: CP14MagicEffectCastSlowdown speedMultiplier: 0.5 - type: CP14MagicEffectManaCost - manaCost: 20 + manaCost: 30 - type: CP14MagicEffect telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget @@ -23,11 +23,11 @@ sprite: _CP14/Actions/Spells/dimension.rsi state: demi_arrow - type: TargetAction - range: 7 + range: 3 - type: WorldTargetAction event: !type:CP14DelayedWorldTargetActionEvent cooldown: 30 - castDelay: 3 + castDelay: 2 breakOnMove: true - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike.yml index 6efd783619..701ecefeb7 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike.yml @@ -22,10 +22,10 @@ ignoreResistances: false damage: types: - Shock: 5 + Shock: 12 - !type:Jitter - !type:CP14StaminaChange - staminaDelta: -75 + staminaDelta: -80 - !type:CP14SpellThrowFromUser throwPower: 4 distance: 1 @@ -71,9 +71,9 @@ - type: Beam sound: /Audio/Effects/Lightning/lightningshock.ogg - type: TimedDespawn - lifetime: 2 + lifetime: 1.5 - type: LightFade - duration: 2 + duration: 1.5 - type: Tag tags: - HideContextMenu @@ -88,10 +88,10 @@ ignoreResistances: false damage: types: - Shock: 5 + Shock: 10 - !type:Jitter - !type:CP14StaminaChange - staminaDelta: -20 + staminaDelta: -30 - type: entity id: CP14RuneLightningStrike diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike_small.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike_small.yml index bb839076bc..2b02879661 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike_small.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/lightning_strike_small.yml @@ -21,6 +21,11 @@ - !type:Jitter - !type:CP14StaminaChange staminaDelta: -15 + - !type:HealthChange + ignoreResistances: false + damage: + types: + Shock: 4 - !type:CP14SpellThrowFromUser throwPower: 2 distance: 0.5 diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/speed_ballade.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/speed_ballade.yml index 6b3531950b..587ca5678e 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/speed_ballade.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Electric/speed_ballade.yml @@ -41,6 +41,7 @@ cooldown: 15 castTime: 120 hidden: true + breakOnDamage: false - type: entity id: CP14ImpactEffectSpeedBallade diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml index 9d28e82431..96128e2d41 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml @@ -33,8 +33,11 @@ checkCanAccess: false range: 60 - type: WorldTargetAction - event: !type:CP14WorldTargetActionEvent + event: !type:CP14DelayedWorldTargetActionEvent cooldown: 1.0 + castDelay: 0.5 + breakOnMove: false + breakOnDamage: false - type: entity id: CP14RuneFirebolt @@ -95,8 +98,7 @@ layers: - state: small shader: unshaded - - type: ChangeTemperatureOnCollide - heat: 10000 + - type: entity parent: CP14BaseSpellScrollFire diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/flame_creation.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/flame_creation.yml index f8b15e4864..6270e43193 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/flame_creation.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/flame_creation.yml @@ -4,15 +4,13 @@ name: Flame creation description: A artificial flame forms in your hand, illuminating your surroundings. You can throw it to use it as a disposable weapon. components: - - type: Sprite - sprite: _CP14/Actions/Spells/fire.rsi - state: flame_creation - type: CP14MagicEffectManaCost manaCost: 5 - type: CP14MagicEffect magicType: Fire effects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectFlameCreation - !type:CP14SpellSpawnInHandEntity diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/heat.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/heat.yml index ced40d9e30..89c1dec786 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/heat.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/heat.yml @@ -28,6 +28,7 @@ startSpeech: "Vos adepto calidum..." - type: CP14MagicEffectCastingVisual proto: CP14RuneHeat + - type: CP14MagicEffectPacifiedBlock - type: Action icon: sprite: _CP14/Actions/Spells/fire.rsi diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/hell_ballade.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/hell_ballade.yml index 093e63255c..904e12b3e2 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/hell_ballade.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/hell_ballade.yml @@ -8,9 +8,9 @@ sprite: _CP14/Actions/Spells/fire.rsi state: fire_music - type: CP14MagicEffectCastSlowdown - speedMultiplier: 0.8 + speedMultiplier: 0.5 - type: CP14MagicEffectManaCost - manaCost: 1 + manaCost: 8 - type: CP14MagicEffect magicType: Fire effects: @@ -35,6 +35,7 @@ - type: CP14MagicEffectRequiredMusicTool - type: CP14MagicEffectCastingVisual proto: CP14RuneHellBallade + - type: CP14MagicEffectPacifiedBlock - type: Action icon: sprite: _CP14/Actions/Spells/fire.rsi @@ -45,6 +46,7 @@ cooldown: 15 castTime: 120 hidden: true + breakOnDamage: false - type: entity id: CP14ImpactEffectHellBallade diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_heat.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_heat.yml index a7b95c882b..d43ac3a9b6 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_heat.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_heat.yml @@ -12,10 +12,12 @@ magicType: Life telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectCureBurn effects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectCureBurn - !type:CP14SpellApplyEntityEffect diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_poison.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_poison.yml index 9d86e61873..f59ed7e9e4 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_poison.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_poison.yml @@ -15,10 +15,12 @@ magicType: Life telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectBloodPurification effects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectBloodPurification - !type:CP14SpellApplyEntityEffect diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_wounds.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_wounds.yml index c5070ec3bf..bb00e27b79 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_wounds.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/cure_wounds.yml @@ -15,10 +15,12 @@ magicType: Life telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectCureWounds effects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectCureWounds - !type:CP14SpellApplyEntityEffect diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/plant_growth.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/plant_growth.yml index b3e9c2b330..e46de57eeb 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/plant_growth.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Life/plant_growth.yml @@ -12,6 +12,7 @@ magicType: Life effects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectCureWounds - !type:CP14SpellApplyEntityEffect @@ -33,12 +34,12 @@ Slash: -1 - !type:SatiateThirst factor: 3 + - !type:SatiateHunger + factor: 3 conditions: - !type:OrganType type: CP14Vampire shouldHave: false - - !type:SatiateHunger - factor: 3 - !type:CP14PlantResourceModify energy: 3 resourse: 3 diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/mana_ballade.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/mana_ballade.yml index 7925ec6b2b..9d1ae031cc 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/mana_ballade.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/mana_ballade.yml @@ -43,6 +43,7 @@ cooldown: 15 castTime: 120 hidden: true + breakOnDamage: false - type: entity id: CP14ImpactEffectMagicBallade diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T0_Bite.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bite.yml similarity index 64% rename from Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T0_Bite.yml rename to Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bite.yml index 58de0d34a1..897765e72a 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T0_Bite.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bite.yml @@ -2,16 +2,19 @@ id: CP14ActionVampireBite parent: CP14ActionSpellBase name: Vampire bite - description: You sink your fangs into your victim, draining them of a lot of blood. + description: You suck the blood and very essence of life from your victim. (The amount of essence in each player is limited) components: - - type: Sprite - sprite: _CP14/Actions/Spells/vampire.rsi - state: bite - type: CP14MagicEffectCastSlowdown speedMultiplier: 0.3 + - type: CP14MagicEffectVampire + - type: CP14MagicEffectSSDBlock + - type: CP14MagicEffectTargetMobStatusRequired + allowedStates: + - Alive - type: CP14MagicEffect telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectVampireBite - !type:CP14SpellApplyEntityEffect @@ -19,18 +22,23 @@ - !type:Jitter effects: - !type:CP14SpellSuckBlood - - !type:CP14SpellSpawnEntityOnTarget + suckAmount: 5 + - !type:CP14SpellVampireGatherEssence + - !type:CP14SpellSpawnEntityOnUser + clientside: true spawns: - - CP14ImpactEffectVampireBite + - CP14ImpactEffectBloodEssence - !type:CP14SpellApplyEntityEffect effects: - !type:Jitter - !type:ModifyBloodLevel - amount: -15 + amount: -3 - type: Action icon: sprite: _CP14/Actions/Spells/vampire.rsi state: bite + sound: !type:SoundPathSpecifier + path: /Audio/Effects/gib1.ogg - type: TargetAction repeat: true range: 1 @@ -38,11 +46,13 @@ - type: EntityTargetAction canTargetSelf: false whitelist: + requireAll: true components: - MobState + - Bloodstream event: !type:CP14DelayedEntityTargetActionEvent - cooldown: 1 - castDelay: 1 + cooldown: 0.5 + castDelay: 2 - type: entity id: CP14ImpactEffectVampireBite @@ -61,4 +71,7 @@ - random: snow1: Inherit snow2: Inherit + - type: EmitSoundOnSpawn + sound: + path: /Audio/Effects/gib1.ogg diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T2_Blood_step.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/blood_step.yml similarity index 73% rename from Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T2_Blood_step.yml rename to Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/blood_step.yml index 409f8c5c55..ea91d6f9a6 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T2_Blood_step.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/blood_step.yml @@ -4,19 +4,20 @@ name: Blood step description: A step through the gash of reality that allows you to cover a small of distance quickly components: - - type: Sprite - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_step - type: CP14MagicEffectCastSlowdown - speedMultiplier: 0.8 + speedMultiplier: 0.4 + - type: CP14MagicEffectVampire + - type: CP14MagicEffectManaCost + manaCost: 30 - type: CP14MagicEffect telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectBloodStep effects: - !type:CP14SpellCasterTeleport - needVision: false + needVision: true - type: CP14MagicEffectCastingVisual proto: CP14ImpactEffectBloodStep - type: Action @@ -24,12 +25,13 @@ sprite: _CP14/Actions/Spells/vampire.rsi state: blood_step - type: TargetAction - checkCanAccess: false + checkCanAccess: true range: 10 - type: WorldTargetAction event: !type:CP14DelayedWorldTargetActionEvent - cooldown: 40 + cooldown: 10 hidden: true + castDelay: 0.5 breakOnMove: false - type: entity @@ -42,4 +44,10 @@ layers: - state: wave_up color: red - + unshaded: true + - type: LightFade + duration: 1.5 + - type: PointLight + color: "#d60032" + radius: 4.0 + energy: 3.0 diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/cure_wounds.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/cure_wounds.yml new file mode 100644 index 0000000000..5f42e975d3 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/cure_wounds.yml @@ -0,0 +1,59 @@ +- type: entity + id: CP14ActionSpellVampireCureWounds + parent: CP14ActionSpellBase + name: Cure blood + description: You heal the target from any kind of damage. + components: + - type: CP14MagicEffectCastSlowdown + speedMultiplier: 0.5 + - type: CP14MagicEffectManaCost + manaCost: 12 + - type: CP14MagicEffectVampire + - type: CP14MagicEffectSkillPointCost + skillPoint: Blood + count: 0.1 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + clientside: true + spawns: + - CP14ImpactEffectBloodEssence + effects: + - !type:CP14SpellSpawnEntityOnTarget + clientside: true + spawns: + - CP14ImpactEffectBloodEssence + - !type:CP14SpellApplyEntityEffect + effects: + - !type:HealthChange + damage: + types: + Slash: -15 + Blunt: -15 + Piercing: -15 + Poison: -15 + Bloodloss: -15 + Caustic: -15 + Cold: -15 + Heat: -15 + Shock: -15 + - !type:Jitter + - !type:ModifyBleedAmount + amount: -25 + - type: CP14MagicEffectCastingVisual + proto: CP14RuneVampireHypnosis + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: wound_heal + - type: TargetAction + range: 7 + interactOnMiss: false + - type: EntityTargetAction + whitelist: + components: + - MobState + event: !type:CP14DelayedEntityTargetActionEvent + cooldown: 5 + castDelay: 1.5 + breakOnMove: false \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/essence_create.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/essence_create.yml new file mode 100644 index 0000000000..9fb85243fc --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/essence_create.yml @@ -0,0 +1,35 @@ +- type: entity + id: CP14ActionSpellBloodEssenceCreation + parent: CP14ActionSpellBase + name: Form the essence of blood + description: You extract the essence of life stolen from other beings from your body to pass on to other vampires or use in rituals. + components: + - type: CP14MagicEffectManaCost + manaCost: 15 + - type: CP14MagicEffectSkillPointCost + skillPoint: Blood + count: 1 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Jitter + effects: + - !type:CP14SpellSpawnEntityOnTarget + clientside: true + spawns: + - CP14ImpactEffectBloodEssence + - !type:CP14SpellSpawnInHandEntity + spawns: + - CP14BloodEssence + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: essence_create + sound: !type:SoundPathSpecifier + path: /Audio/_CP14/Effects/essence_consume.ogg + - type: InstantAction + event: !type:CP14DelayedInstantActionEvent + cooldown: 0.5 + castDelay: 2.5 + breakOnMove: false \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T1_Hypnosis.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/hypnosys.yml similarity index 62% rename from Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T1_Hypnosis.yml rename to Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/hypnosys.yml index 9ea543952e..1afceba23e 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T1_Hypnosis.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/hypnosys.yml @@ -1,31 +1,27 @@ - type: entity - id: CP14ActionSpellVampireHypnosis + id: CP14ActionSpellVampireHypnosys parent: CP14ActionSpellBase - name: Hypnosis - description: You look at the victim with your OWN gaze, shutting down their consciousness and putting them to sleep. + name: Hypnosys + description: You focus on the target, mesmerizing and lulling it to sleep. components: - - type: Sprite - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon - type: CP14MagicEffectCastSlowdown speedMultiplier: 0.5 + - type: CP14MagicEffectVampire + - type: CP14MagicEffectManaCost + manaCost: 5 - type: CP14MagicEffect - telegraphyEffects: - - !type:CP14SpellSpawnEntityOnTarget - spawns: - - CP14ImpactEffectVampireHypnosis effects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectVampireHypnosis - !type:CP14SpellApplyEntityEffect effects: - - !type:Jitter - - !type:GenericStatusEffect - key: ForcedSleep - time: 20 - component: ForcedSleeping + - !type:ModifyStatusEffect + effectProto: CP14StatusEffectVampireForceSleep type: Add + time: 4 + refresh: true - type: CP14MagicEffectCastingVisual proto: CP14RuneVampireHypnosis - type: Action @@ -33,17 +29,17 @@ sprite: _CP14/Actions/Spells/vampire.rsi state: blood_moon - type: TargetAction + range: 3 interactOnMiss: false - range: 5 - type: EntityTargetAction whitelist: components: - MobState - canTargetSelf: false - event: !type:CP14DelayedEntityTargetActionEvent - cooldown: 30 - castDelay: 1.5 - breakOnMove: false + event: !type:CP14ToggleableEntityTargetActionEvent + effectFrequency: 3 + cooldown: 60 + castTime: 30 + distanceThreshold: 6 - type: entity id: CP14RuneVampireHypnosis @@ -69,5 +65,4 @@ layers: - state: electrified color: red - shader: unshaded - + shader: unshaded \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/portal.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/portal.yml new file mode 100644 index 0000000000..ea52a34996 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/portal.yml @@ -0,0 +1,30 @@ +- type: entity + id: CP14ActionSpellPortalToVampireHome + parent: CP14ActionSpellBase + name: Teleport to the vampire lair + description: You open a portal leading to the location of your clan's portal glyph. The portal will disappear in 30 seconds. If the glyph is not constructed, the portal will be chaotic, teleporting players in different directions. + components: + - type: CP14MagicEffectCastSlowdown + speedMultiplier: 0.5 + - type: CP14MagicEffectManaCost + manaCost: 30 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectBloodEssence + effects: + - !type:CP14SpellTeleportToVampireSingleton + - type: CP14MagicEffectSomaticAspect + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: portal + - type: TargetAction + range: 3 + - type: WorldTargetAction + event: !type:CP14DelayedWorldTargetActionEvent + cooldown: 60 + castDelay: 2 + breakOnMove: true + breakOnDamage: true \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_explosion.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_explosion.yml new file mode 100644 index 0000000000..47fb07c048 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_explosion.yml @@ -0,0 +1,56 @@ +- type: entity + id: CP14ActionSpellVampirePower3 + parent: CP14ActionSpellBase + name: Impulse + description: By unleashing the power of an ancient vampire clan, you repel everyone and everything around you, stunning them for a long time. + components: + - type: CP14MagicEffectCastSlowdown + speedMultiplier: 0.4 + - type: CP14MagicEffectVampire + - type: CP14MagicEffectManaCost + manaCost: 50 + - type: CP14MagicEffectPacifiedBlock + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnUser + spawns: + - CP14ImpactEffectVampireKick #TODO + - !type:CP14SpellArea + range: 2 + maxTargets: 16 + affectCaster: false + whitelist: + components: + - Body + - Item + - Anchorable + effects: + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Paralyze + paralyzeTime: 2 + - !type:CP14SpellThrowFromUser + throwPower: 15 + - !type:CP14SpellSpawnEntityOnTarget + clientside: true + spawns: + - CP14ImpactEffectBloodStep + - !type:CP14SpellApplyEntityEffect + effects: + - !type:HealthChange + ignoreResistances: false + damage: + types: + Blunt: 10 + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick_3 + sound: !type:SoundPathSpecifier + path: /Audio/_CP14/Effects/essence_consume.ogg + - type: InstantAction + event: !type:CP14DelayedInstantActionEvent + cooldown: 60 + castDelay: 1.5 + breakOnMove: false + breakOnDamage: false \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_punch.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_punch.yml new file mode 100644 index 0000000000..7e4f21dae3 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_punch.yml @@ -0,0 +1,68 @@ +- type: entity + id: CP14ActionSpellVampirePower + parent: CP14ActionSpellBase + name: Demonstration of strength + description: By channeling the power of the oldest vampire clan, you instantly strike your target, causing them to fly back and lose their balance. + components: + - type: CP14MagicEffectPacifiedBlock + - type: CP14MagicEffectVampire + - type: CP14MagicEffectManaCost + manaCost: 20 + - type: CP14MagicEffect + effects: + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Paralyze + paralyzeTime: 3 + - !type:CP14SpellThrowFromUser + throwPower: 9 + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectVampireKick + - !type:CP14SpellApplyEntityEffect + effects: + - !type:HealthChange + ignoreResistances: false + damage: + types: + Blunt: 10 + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick + sound: !type:SoundPathSpecifier + path: /Audio/_CP14/Effects/essence_consume.ogg + - type: TargetAction + range: 1 + - type: EntityTargetAction + canTargetSelf: false + event: !type:CP14EntityTargetActionEvent + cooldown: 45 + whitelist: + components: + - Body + - Item + - Anchorable + +- type: entity + id: CP14ImpactEffectVampireKick + parent: CP14ImpactEffectBloodStep + categories: [ HideSpawnMenu ] + save: false + components: + - type: Sprite + layers: + - state: circle_increase + color: red + unshaded: true + - type: EmitSoundOnSpawn + sound: !type:SoundPathSpecifier + path: /Audio/_CP14/Effects/surprise.ogg + - type: TimedDespawn + lifetime: 4 + - type: LightFade + duration: 4 + - type: PointLight + color: "#d60032" + radius: 4.0 + energy: 8.0 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/resurrection.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/resurrection.yml new file mode 100644 index 0000000000..dde33e64c6 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/resurrection.yml @@ -0,0 +1,90 @@ +- type: entity + id: CP14ActionSpellVampireResurrection + parent: CP14ActionSpellBase + name: Resurrection + description: You're trying to put the soul back into the body. + components: + - type: CP14MagicEffectCastSlowdown + speedMultiplier: 0.7 + - type: CP14MagicEffectManaCost + manaCost: 50 + - type: CP14MagicEffectVampire + - type: CP14MagicEffectSkillPointCost + skillPoint: Blood + count: 1 + - type: CP14MagicEffectTargetMobStatusRequired + allowedStates: + - Dead + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + clientside: true + spawns: + - CP14ImpactEffectBloodEssenceInverse + effects: + - !type:CP14SpellSpawnEntityOnTarget + clientside: true + spawns: + - CP14ImpactEffectBloodEssence2 + - !type:CP14SpellResurrectionEffect + - !type:CP14SpellApplyEntityEffect + effects: + - !type:ChemVomit + probability: 0.25 + - !type:Emote + showInChat: false + emote: Cough + probability: 0.3 + - !type:HealthChange + damage: + types: + Asphyxiation: -500 + Bloodloss: -100 + - !type:Jitter + - type: CP14MagicEffectVerbalAspect + startSpeech: "Redi animam meam..." + endSpeech: "Eu rezei por ti" + - type: CP14MagicEffectCastingVisual + proto: CP14RuneVampireResurrection + - type: Action + sound: !type:SoundPathSpecifier + path: /Audio/_CP14/Effects/ritual_end.ogg + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: resurrection + - type: TargetAction + range: 7 + interactOnMiss: false + - type: EntityTargetAction + canTargetSelf: false + whitelist: + components: + - MobState + event: !type:CP14DelayedEntityTargetActionEvent + cooldown: 180 + castDelay: 16 + breakOnMove: true + +- type: entity + id: CP14RuneVampireResurrection + parent: CP14BaseMagicRune + categories: [ HideSpawnMenu ] + save: false + components: + - type: TimedDespawn + lifetime: 16 + - type: LightFade + duration: 10 + - type: PointLight + color: "#328643" + - type: Sprite + layers: + - state: sun + color: "#d60032" + shader: unshaded + - state: medium_circle + color: "#d60032" + shader: unshaded + - type: EmitSoundOnSpawn + sound: + path: /Audio/_CP14/Effects/ritual_begin.ogg \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bloodlust.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/search_vampire.yml similarity index 51% rename from Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bloodlust.yml rename to Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/search_vampire.yml index 65a03dd1a6..cd046d0dca 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bloodlust.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/search_vampire.yml @@ -1,35 +1,50 @@ - type: entity - id: CP14ActionSpellBloodlust + id: CP14ActionSpellBloodConnection parent: CP14ActionSpellBase - name: Bloodlust - description: you sense all living things in a large radius around you that you want to KILL. + name: Blood connection + description: You can sense the location of vampires from your clan from miles away. components: - - type: Sprite - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon + - type: CP14MagicEffectManaCost + manaCost: 10 - type: CP14MagicEffect effects: - !type:CP14SpellSpawnEntityOnTarget spawns: - CP14ImpactEffectVampireHypnosis - - !type:CP14SpellPointerToAlive - pointerEntity: CP14BloodlustPointer + - !type:CP14SpellPointerToVampireClan searchRange: 60 - - type: CP14MagicEffectVerbalAspect - startSpeech: "Ego vultus..." - endSpeech: "parumper vita" - - type: CP14MagicEffectSomaticAspect + pointerEntity: CP14BloodlustPointer - type: CP14MagicEffectCastingVisual proto: CP14RuneVampireHypnosis - type: Action icon: sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon + state: search_clan - type: InstantAction event: !type:CP14DelayedInstantActionEvent - cooldown: 30 + cooldown: 8 castDelay: 1.5 +- type: entity + parent: CP14ActionSpellBloodConnection + id: CP14ActionSpellBloodEnemySearch + name: Blood identification + description: You are searching within a large radius for all vampires from other factions. + components: + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectVampireHypnosis + - !type:CP14SpellPointerToVampireClan + inversed: true + searchRange: 60 + pointerEntity: CP14BloodlustPointer + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: search_clan_enemy + - type: entity id: CP14BloodlustPointer name: pointer @@ -52,5 +67,4 @@ lifetime: 8 - type: Tag tags: - - HideContextMenu - + - HideContextMenu \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/toggle_visuals.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/toggle_visuals.yml new file mode 100644 index 0000000000..00f644d341 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/toggle_visuals.yml @@ -0,0 +1,14 @@ +- type: entity + id: CP14ActionVampireToggleVisuals + name: Vampiric nature + parent: BaseMentalAction + description: You reveal or hide your vampire nature. When you are in your revealed form, you can use more powerful abilities, but you suffer from sunlight. + components: + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: toggle + itemIconStyle: BigAction + priority: -8 + - type: InstantAction + event: !type:CP14ToggleVampireVisualsAction \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/freeze.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/freeze.yml index 3e756d245b..1f2868e243 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/freeze.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/freeze.yml @@ -32,6 +32,7 @@ startSpeech: "Vos adepto frigus..." - type: CP14MagicEffectCastingVisual proto: CP14RunePlantFreeze + - type: CP14MagicEffectPacifiedBlock - type: Action icon: sprite: _CP14/Actions/Spells/water.rsi diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/ice_shards.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/ice_shards.yml index 08893e581d..135dcdb394 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/ice_shards.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/ice_shards.yml @@ -64,8 +64,8 @@ - type: Projectile damage: types: - Cold: 6 - Piercing: 2 + Cold: 5 + Piercing: 2.5 - type: Sprite sprite: _CP14/Effects/Magic/ice_shard.rsi layers: diff --git a/Resources/Prototypes/_CP14/Entities/Actions/nightVision.yml b/Resources/Prototypes/_CP14/Entities/Actions/nightVision.yml index 8b27a60a84..fe1e9de4e3 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/nightVision.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/nightVision.yml @@ -1,6 +1,7 @@ - type: entity id: CP14ActionToggleNightVision name: Toggle Night Vision + parent: BaseMentalAction description: You begin to see the world in a special way that allows you to see even in total darkness. components: - type: Action @@ -23,6 +24,35 @@ softness: 10 color: "#ffa38c" netsync: false - #mask: /Textures/_CP14/Effects/LightMasks/crystal_cone.png + autoRot: true + +- type: entity + id: CP14ActionToggleNightVisionVampire + name: Toggle Night Vision + parent: BaseMentalAction + description: You begin to see the world in a special way that allows you to see even in total darkness. + components: + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: night_vision + clientExclusive: true + checkCanInteract: false + - type: InstantAction + event: !type:CP14ToggleNightVisionEvent + +- type: entity + id: CP14NightVisionVampire + categories: [ HideSpawnMenu ] + components: + - type: Tag + tags: + - HideContextMenu + - type: PointLight + radius: 6 + energy: 2 + softness: 10 + color: "#fc1e26" + netsync: false autoRot: true diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/magic_cloak.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/magic_cloak.yml index 0a68ef57fe..4896ff4548 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/magic_cloak.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/magic_cloak.yml @@ -20,11 +20,9 @@ parent: true components: - type: Stealth - minVisibility: 0.5 - lastVisibility: 0.5 - type: StealthOnMove passiveVisibilityRate: -0.5 - movementVisibilityRate: 0.5 + movementVisibilityRate: 0.2 - type: UseDelay delay: 3 - type: StaticPrice diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/vampire_cloak.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/vampire_cloak.yml new file mode 100644 index 0000000000..066abbd2ea --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Cloak/vampire_cloak.yml @@ -0,0 +1,69 @@ +- type: entity + parent: + - CP14ClothingCloakBase + - CP14BaseMajorContraband + id: CP14ClothingCloakVampireBase + abstract: true + components: + - type: ItemToggle + onActivate: false + onUse: false + - type: ToggleClothing + action: CP14ActionToggleVampireCape + disableOnUnequip: true + - type: ComponentToggler + parent: true + components: + - type: Stealth + - type: StealthOnMove + passiveVisibilityRate: -0.5 + movementVisibilityRate: 0.8 + - type: UseDelay + delay: 3 + - type: PhysicalComposition + materialComposition: + CP14Cloth: 40 + CP14Mithril: 10 + CP14BloodEssence: 1 + +- type: entity + id: CP14ActionToggleVampireCape + parent: BaseAction + name: Vampire cloak + description: Gives the cape wearer the invisibility, but only if standing still. + components: + - type: InstantAction + event: !type:ToggleActionEvent + +- type: entity + parent: CP14ClothingCloakVampireBase + id: CP14ClothingCloakVampireDevourers + name: сrimson vampire cloak + description: A traditional vampire cloak worn by members of the Devourers clan. Hides the owner from prying eyes, granting invisibility. + components: + - type: Sprite + sprite: _CP14/Clothing/Cloak/Vampire/red.rsi + - type: Clothing + sprite: _CP14/Clothing/Cloak/Vampire/red.rsi + +- type: entity + parent: CP14ClothingCloakVampireBase + id: CP14ClothingCloakVampireUnnameable + name: white vampire cloak + description: A traditional vampire cloak worn by members of the Unnameable clan. Hides the owner from prying eyes, granting invisibility. + components: + - type: Sprite + sprite: _CP14/Clothing/Cloak/Vampire/white.rsi + - type: Clothing + sprite: _CP14/Clothing/Cloak/Vampire/white.rsi + +- type: entity + parent: CP14ClothingCloakVampireBase + id: CP14ClothingCloakVampireNightChildrens + name: dark vampire cloak + description: A traditional vampire cloak worn by members of the Childrens of the Night clan. Hides the owner from prying eyes, granting invisibility. + components: + - type: Sprite + sprite: _CP14/Clothing/Cloak/Vampire/blue.rsi + - type: Clothing + sprite: _CP14/Clothing/Cloak/Vampire/blue.rsi diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Masks/masks.yml index dd80337bfa..703caf6d92 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Masks/masks.yml @@ -38,13 +38,6 @@ sprite: _CP14/Clothing/Masks/steel_mask.rsi - type: IdentityBlocker - type: IngestionBlocker - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: PhysicalComposition materialComposition: CP14Iron: 20 @@ -102,13 +95,6 @@ - type: AddAccentClothing accent: ReplacementAccent replacement: cp14skeleton - - type: Armor - modifiers: - coefficients: - Blunt: 0.90 - Slash: 0.90 - Piercing: 0.90 - Heat: 0.90 - type: entity parent: CP14ClothingMaskBase @@ -124,13 +110,6 @@ - type: AddAccentClothing accent: ReplacementAccent replacement: cp14skeleton - - type: Armor - modifiers: - coefficients: - Blunt: 0.95 - Slash: 0.95 - Piercing: 0.95 - Heat: 0.95 - type: entity parent: CP14ClothingMaskBoneMask diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Masks/vampire_mask.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Masks/vampire_mask.yml new file mode 100644 index 0000000000..82e0fd670d --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Masks/vampire_mask.yml @@ -0,0 +1,48 @@ +- type: entity + abstract: true + parent: + - CP14ClothingMaskBase + - CP14BaseMajorContraband + id: CP14ClothingMaskVampireVoiceBase + description: This mask reeks of blood. The spells inside it distort the speaker's voice. + suffix: Voice mask + components: + - type: HideLayerClothing + slots: + - Snout + - type: IdentityBlocker + - type: VoiceMask + - type: UserInterface + interfaces: + enum.ChameleonUiKey.Key: + type: ChameleonBoundUserInterface + enum.VoiceMaskUIKey.Key: + type: VoiceMaskBoundUserInterface + - type: PhysicalComposition + materialComposition: + CP14Iron: 10 + CP14Leather: 10 + +- type: entity + parent: CP14ClothingMaskVampireVoiceBase + id: CP14ClothingMaskVampireVoiceDevourers + name: bloody bone mask + components: + - type: Sprite + sprite: _CP14/Clothing/Masks/vampire_devourers.rsi + +- type: entity + parent: CP14ClothingMaskVampireVoiceBase + id: CP14ClothingMaskVampireVoiceNightChildrens + name: mysterious black mask + components: + - type: Sprite + sprite: _CP14/Clothing/Masks/vampire_night_childrens.rsi + +- type: entity + parent: CP14ClothingMaskVampireVoiceBase + id: CP14ClothingMaskVampireVoiceUnnameable + name: frightening white mask + components: + - type: Sprite + sprite: _CP14/Clothing/Masks/vampire_unnameable.rsi diff --git a/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml b/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml index 5292af23e7..1fbb81d83a 100644 --- a/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml +++ b/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml @@ -88,4 +88,43 @@ collection: CP14LightningFar params: variation: 0.2 - volume: -5 \ No newline at end of file + volume: -5 + +- type: entity + id: CP14SkyLightningRed + parent: CP14SkyLightning + suffix: Red + components: + - type: PointLight + color: "#f7112c" + - type: Sprite + color: "#f7112c" + - type: CP14AreaEntityEffect + range: 1 + effects: + - !type:CP14SpellThrowFromUser + throwPower: 4 + distance: 0.5 + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Electrocute + electrocuteTime: 3 + - !type:HealthChange + damage: + types: + Shock: 0 + - type: CP14FarSound + closeSound: + path: /Audio/_CP14/Ambience/Lightning/lightning_close1.ogg + params: + variation: 0.2 + maxDistance: 20 + volume: 10 + farSound: + collection: CP14LightningFar + params: + variation: 0.2 + volume: -5 + - type: FlashOnTrigger + range: 2 + diff --git a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml index 8571450808..211a5488f7 100644 --- a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml +++ b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml @@ -213,7 +213,7 @@ - type: entity parent: CP14BaseMobGroupSpawner id: CP14MobGroupSpawnerFlem - suffix: 2-3 Flems + suffix: 1-3 Flems components: - type: EntityTableSpawner deleteSpawnerAfterSpawn: false @@ -223,3 +223,17 @@ range: 1, 3 children: - id: CP14MobMonsterFlem + +- type: entity + parent: CP14BaseMobGroupSpawner + id: CP14MobGroupSpawnerCackle + suffix: 2-3 Cackles + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + offset: 1 + table: !type:GroupSelector + rolls: !type:RangeNumberSelector + range: 2, 3 + children: + - id: CP14MobMonsterCackle diff --git a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml index d901498a5b..b49d3c2320 100644 --- a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml +++ b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml @@ -205,6 +205,22 @@ prototypes: - CP14MobMonsterFlem +- type: entity + name: cackle spawner + id: CP14SpawnMobMonsterCackle + parent: MarkerBase + categories: [ ForkFiltered ] + components: + - type: Sprite + layers: + - sprite: Markers/cross.rsi + state: green + - sprite: _CP14/Mobs/Monster/cackle.rsi + state: live + - type: ConditionalSpawner + prototypes: + - CP14MobMonsterCackle + - type: entity name: fairy spawner id: CP14SpawnMobFairy diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/animals.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/animals.yml index 7ae35d0980..5d688b947e 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/animals.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/animals.yml @@ -179,8 +179,6 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: StealTarget - stealGroup: CP14Boar - type: entity id: CP14MobBoar @@ -244,8 +242,6 @@ interactSuccessSpawn: EffectHearts interactSuccessSound: path: /Audio/Animals/pig_oink.ogg - - type: StealTarget - stealGroup: CP14Boar - type: entity name: frog diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/cackle.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/cackle.yml new file mode 100644 index 0000000000..f6ad1ba5b1 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/cackle.yml @@ -0,0 +1,134 @@ +- type: entity + parent: CP14SimpleMobBase + id: CP14MobMonsterCackle + name: cackle + description: A monster that hunts for blood as a source of sustenance. + categories: [ ForkFiltered ] + components: + - type: HTN + rootTask: + task: SimpleRangedHostileCompound + blackboard: + NavSmash: !type:Bool + true + VisionRadius: !type:Single + 16 + AggroVisionRadius: !type:Single + 6 + - type: Sprite + drawdepth: Mobs + sprite: _CP14/Mobs/Monster/cackle.rsi + layers: + - map: [ "enum.DamageStateVisualLayers.Base" ] + state: live + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded" ] #used cause i dont know if there are any more applicable ones no it is not meant to be unshaded + state: live_spikes + - type: Physics + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 200 #rotund + mask: + - MobMask + layer: + - MobLayer + - type: Butcherable + spawned: + - id: CP14FoodCabbageSlice + amount: 4 + - id: CP14BloodFlower + amount: 2 + - id: CP14FoodCabbage + amount: 1 + prob: 0.6 + - type: CombatMode + - type: MeleeWeapon + angle: 0 + animation: WeaponArcBite + damage: + types: + Piercing: 1 + Structural: 3 + - type: Body + prototype: Animal + - type: Damageable + damageContainer: CP14Biological + damageModifierSet: CP14Cackle + - type: MobThresholds + thresholds: + 0: Alive + 45: Dead + - type: SlowOnDamage + speedModifierThresholds: + 30: 0.5 + - type: DamageStateVisuals + states: + Alive: + Base: live + BaseUnshaded: live_spikes + Dead: + Base: dead + BaseUnshaded: dead_spikes + - type: Stamina + critThreshold: 75 + - type: SolutionContainerManager + solutions: + melee: + maxVol: 30 + - type: SolutionRegeneration + solution: melee + generated: + reagents: + - ReagentId: CP14MonsterToxinBleed + Quantity: 1 + - type: MeleeChemicalInjector + transferAmount: 1 + solution: melee + - type: ReplacementAccent + accent: xeno + - type: InteractionPopup + successChance: 0.6 + interactSuccessString: petting-success-generic + interactFailureString: petting-failure-generic + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Voice/Diona/diona_rustle2.ogg + - type: Bloodstream + bloodMaxVolume: 200 + bloodReagent: CP14BloodFlowerSap + - type: Tag + tags: + - FootstepSound + - type: PassiveDamage # Slight passive regen. Assuming one damage type, comes out to about 4 damage a minute from base.yml. + allowedStates: + - Alive + damageCap: 45 + damage: + types: + Poison: -0.07 + groups: + Brute: -0.07 + Burn: -0.07 + - type: BasicEntityAmmoProvider + proto: CP14SpikeCackleSpread + capacity: 2 + count: 2 + - type: RechargeBasicEntityAmmo + showExamineText: false + rechargeSound: null + rechargeCooldown: 4 + - type: Gun + fireRate: 1 + useKey: false + showExamineText: false + selectedMode: FullAuto + availableModes: + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/water_spray.ogg + - type: NpcFactionMember + factions: + - CP14Monster diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/dinosaurs.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/dinosaurs.yml index 8b65eb593e..3add4e455b 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/dinosaurs.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/dinosaurs.yml @@ -113,8 +113,6 @@ variation: 0.125 - type: SoundWhileAlive - type: FloorOcclusion - - type: StealTarget - stealGroup: CP14Dino - type: entity id: CP14MobDinoSmallHydra diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/mole.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/mole.yml index c2e2655492..3f2f82c886 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/mole.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/mole.yml @@ -110,5 +110,3 @@ tags: - FootstepSound - CP14Mosquito - - type: StealTarget - stealGroup: CP14Mole diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T1.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T1.yml index fc4bac541e..c858bbd029 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T1.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T1.yml @@ -54,9 +54,13 @@ - type: Loadout prototypes: - CP14MobSkeletonDodgerT1 - - type: CP14SpellStorage - grantAccessToSelf: true - spells: + - type: CP14SkillStorage + skillPoints: + Memory: + max: 0 + freeLearnedSkills: + - AthleticT1 + - AthleticT2 - CP14ActionSpellKick - CP14ActionSpellSprint @@ -72,8 +76,15 @@ - type: CP14SpellStorage grantAccessToSelf: true spells: - - CP14ActionSpellIceArrow - CP14ActionSpellSprint + - type: CP14SkillStorage + skillPoints: + Memory: + max: 1 + freeLearnedSkills: + - HydrosophistryT1 + learnedSkills: + - CP14ActionSpellIceArrow - type: entity id: CP14SpawnPointGhostDemiplaneSkeletonT1 diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml index ac85843d87..c00622e738 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Player/DemiplaneAntag/Skeletons/T2.yml @@ -46,11 +46,17 @@ - type: Loadout prototypes: - CP14MobSkeletonDodgerT2 - - type: CP14SpellStorage - grantAccessToSelf: true - spells: + - type: CP14SkillStorage + skillPoints: + Memory: + max: 0 + freeLearnedSkills: + - AthleticT1 + - AthleticT2 + - AthleticT3 - CP14ActionSpellKick - CP14ActionSpellSprint + - CP14ActionSpellDash - type: entity id: CP14MobUndeadSkeletonArcherT2 @@ -64,8 +70,15 @@ - type: CP14SpellStorage grantAccessToSelf: true spells: - - CP14ActionSpellSprint - CP14ActionSpellShadowStep + - CP14ActionSpellSprint + - type: CP14SkillStorage + skillPoints: + Memory: + max: 1 + freeLearnedSkills: + - HydrosophistryT1 + learnedSkills: - CP14ActionSpellIceArrow - type: entity @@ -82,6 +95,9 @@ maxEnergy: 200 energy: 200 unsafeSupport: true + - type: CP14MagicEnergyDraw + energy: 1 + delay: 5 - type: PassiveDamage allowedStates: - Alive @@ -91,7 +107,7 @@ - type: CP14SkillStorage skillPoints: Memory: - max: 0 + max: 4 freeLearnedSkills: - SwordMastery - RapierMastery @@ -100,13 +116,12 @@ - HydrosophistryT2 - MetamagicT1 - MetamagicT2 - - CP14ActionSpellFreeze - - CP14ActionSpellIceShards + - PyrokineticT1 + - CP14ActionSpellManaConsume + - CP14ActionSpellManaGift - CP14ActionSpellManaConsumeElf - CP14ActionSpellManaGiftElf - CP14ActionSpellMagicSplitting - - CP14ActionSpellManaTrance - - type: entity id: CP14MobUndeadSkeletonBardT2 parent: CP14MobUndeadSkeletonDemiplaneT2 @@ -139,7 +154,7 @@ weight: 40 children: - id: CP14SpawnPointGhostDemiplaneSkeletonWizardT2 - - id: CP14SpawnPointGhostDemiplaneSkeletonBardT2 +# - id: CP14SpawnPointGhostDemiplaneSkeletonBardT2 - !type:GroupSelector weight: 60 children: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Player/TownRaids/undead.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Player/TownRaids/undead.yml index 6efc0aed0f..3d4a26355d 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Player/TownRaids/undead.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Player/TownRaids/undead.yml @@ -53,7 +53,7 @@ - type: CP14SkillStorage skillPoints: Memory: - max: 0 + max: 4 freeLearnedSkills: - SwordMastery - RapierMastery @@ -62,12 +62,13 @@ - MetamagicT2 - HydrosophistryT1 - HydrosophistryT2 - - CP14ActionSpellFreeze - - CP14ActionSpellIceShards + - PyrokineticT1 + - PyrokineticT2 + - CP14ActionSpellManaConsume + - CP14ActionSpellManaGift - CP14ActionSpellManaConsumeElf - CP14ActionSpellManaGiftElf - CP14ActionSpellMagicSplitting - - CP14ActionSpellManaTrance - type: Loadout prototypes: - CP14MobSkeletonWizardTownRaid diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml index e696dbfb78..49d11c6e0d 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml @@ -17,10 +17,6 @@ - map: [ "enum.HumanoidVisualLayers.Head" ] - map: [ "enum.HumanoidVisualLayers.Snout" ] - map: [ "enum.HumanoidVisualLayers.Eyes" ] - - map: [ "vampire_fangs" ] - sprite: _CP14/Mobs/Species/Vampire/fangs.rsi - state: human - visible: false - map: [ "enum.HumanoidVisualLayers.RArm" ] - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] @@ -54,6 +50,10 @@ - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "vampire_fangs" ] + sprite: _CP14/Mobs/Species/Vampire/fangs.rsi + state: human + visible: false - map: [ "mask" ] - map: [ "head" ] - map: [ "pocket1" ] @@ -235,6 +235,7 @@ - Athletic - MartialArts - Craftsmanship + - type: CP14VampireEssenceHolder - type: entity parent: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/carcat.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/carcat.yml index e0813fe4d9..5923a0a7b7 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/carcat.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/carcat.yml @@ -4,6 +4,58 @@ name: Mr. Cat abstract: true components: + - type: Sprite + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "vampire_fangs" ] + sprite: _CP14/Mobs/Species/Vampire/fangs.rsi + state: carcat #Unique carcat fangs + visible: false + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - shader: StencilClear + sprite: _CP14/Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "enum.HumanoidVisualLayers.LFoot" ] + - map: [ "enum.HumanoidVisualLayers.RFoot" ] + - map: [ "pants" ] + - map: [ "shoes" ] + - map: [ "shirt" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + - map: [ "enum.HumanoidVisualLayers.RHand" ] + - map: [ "gloves" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "cloak" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "belt2" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false - type: HumanoidAppearance species: CP14Carcat - type: Icon diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/elf.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/elf.yml index a9ee04698a..7c9a1ddfe6 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/elf.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/elf.yml @@ -41,12 +41,17 @@ - type: Inventory templateId: CP14Human displacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak cloak: sizeMaps: 32: sprite: _CP14/Mobs/Species/Human/displacement.rsi state: female_cloak - outerClothing: + gloves: sizeMaps: 32: sprite: _CP14/Mobs/Species/Human/displacement.rsi @@ -62,6 +67,26 @@ sprite: _CP14/Mobs/Species/Elf/displacement.rsi state: male_shirt femaleDisplacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + cloak: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + gloves: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + pants: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_pants shirt: sizeMaps: 32: @@ -78,12 +103,17 @@ - type: Inventory templateId: CP14Human displacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak cloak: sizeMaps: 32: sprite: _CP14/Mobs/Species/Human/displacement.rsi state: female_cloak - outerClothing: + gloves: sizeMaps: 32: sprite: _CP14/Mobs/Species/Human/displacement.rsi @@ -99,6 +129,26 @@ sprite: _CP14/Mobs/Species/Elf/displacement.rsi state: male_shirt femaleDisplacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + cloak: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + gloves: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + pants: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_pants shirt: sizeMaps: 32: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/goblin.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/goblin.yml index 396817677e..30f4e3f6e0 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/goblin.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/goblin.yml @@ -10,10 +10,6 @@ - map: [ "enum.HumanoidVisualLayers.Head" ] - map: [ "enum.HumanoidVisualLayers.Snout" ] - map: [ "enum.HumanoidVisualLayers.Eyes" ] - - map: [ "vampire_fangs" ] - sprite: _CP14/Mobs/Species/Vampire/fangs.rsi - state: goblin # Goblin fangs state - visible: false - map: [ "enum.HumanoidVisualLayers.RArm" ] - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] @@ -47,6 +43,10 @@ - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "vampire_fangs" ] + sprite: _CP14/Mobs/Species/Vampire/fangs.rsi + state: goblin # Goblin fangs state + visible: false - map: [ "mask" ] - map: [ "head" ] - map: [ "pocket1" ] diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/silva.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/silva.yml index 061f07e864..65f358cb79 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/silva.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/silva.yml @@ -67,7 +67,7 @@ - HealingT1 - HealingT2 - type: CP14MagicEnergyPhotosynthesis # Silva special feature #Disabled until sunlight fixed - - type: CP14MagicEnergyDraw #Enabled default mana regen until sunlight fixed + - type: CP14MagicEnergyDraw enable: false - type: Body prototype: CP14Silva @@ -100,6 +100,26 @@ sprite: _CP14/Mobs/Species/Elf/displacement.rsi state: male_shirt femaleDisplacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + cloak: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + gloves: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + pants: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_pants shirt: sizeMaps: 32: @@ -165,12 +185,17 @@ - type: Inventory templateId: CP14Human displacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak cloak: sizeMaps: 32: sprite: _CP14/Mobs/Species/Human/displacement.rsi state: female_cloak - outerClothing: + gloves: sizeMaps: 32: sprite: _CP14/Mobs/Species/Human/displacement.rsi @@ -186,6 +211,26 @@ sprite: _CP14/Mobs/Species/Elf/displacement.rsi state: male_shirt femaleDisplacements: + outerClothing: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + cloak: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + gloves: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_cloak + pants: + sizeMaps: + 32: + sprite: _CP14/Mobs/Species/Human/displacement.rsi + state: female_pants shirt: sizeMaps: 32: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml index 1160c2c893..fd65766f1c 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml @@ -14,10 +14,6 @@ - map: [ "enum.HumanoidVisualLayers.Head" ] - map: [ "enum.HumanoidVisualLayers.Snout" ] - map: [ "enum.HumanoidVisualLayers.Eyes" ] - - map: [ "vampire_fangs" ] - sprite: _CP14/Mobs/Species/Vampire/fangs.rsi - state: human - visible: false #Skeleton vampire? Lol? - map: [ "enum.HumanoidVisualLayers.RArm" ] - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] @@ -41,6 +37,10 @@ - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "vampire_fangs" ] + sprite: _CP14/Mobs/Species/Vampire/fangs.rsi + state: human + visible: false #Skeleton vampire? Lol? - map: [ "mask" ] - map: [ "head" ] - map: [ "pocket1" ] @@ -71,11 +71,11 @@ - type: MobThresholds thresholds: 0: Alive - 50: Dead + 100: Dead - type: SlowOnDamage speedModifierThresholds: - 30: 0.8 - 40: 0.6 + 70: 0.7 + 90: 0.5 - type: Fixtures fixtures: fix1: @@ -97,7 +97,7 @@ thresholds: - trigger: !type:DamageTrigger - damage: 50 + damage: 100 behaviors: - !type:GibBehavior - type: Vocal diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml index 3f57ff36f3..de86d980f0 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml @@ -16,10 +16,6 @@ - map: [ "enum.HumanoidVisualLayers.Head" ] - map: [ "enum.HumanoidVisualLayers.Snout" ] - map: [ "enum.HumanoidVisualLayers.Eyes" ] - - map: [ "vampire_fangs" ] - sprite: _CP14/Mobs/Species/Vampire/fangs.rsi - state: human - visible: false #Zombie vampire? - map: [ "enum.HumanoidVisualLayers.RArm" ] - map: [ "enum.HumanoidVisualLayers.LArm" ] - map: [ "enum.HumanoidVisualLayers.RLeg" ] @@ -43,6 +39,10 @@ - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "vampire_fangs" ] + sprite: _CP14/Mobs/Species/Vampire/fangs.rsi + state: human + visible: false #Zombie vampire? - map: [ "mask" ] - map: [ "head" ] - map: [ "pocket1" ] diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/Books/books.yml b/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/Books/books.yml index 559f624561..f5b8deb0d7 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/Books/books.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Bureaucracy/Books/books.yml @@ -24,7 +24,7 @@ id: CP14BookTieflingGambit parent: CP14BookWriteableBase name: "Tiefling's Gambit" - description: Rules for gambling with dice, created by Callista Zyanur + description: Rules for gambling with dice, created by Callista Zyanur. components: - type: Sprite layers: @@ -41,3 +41,48 @@ map: [ "overlay" ] - type: Paper content: cp14-book-text-tiefling-gambit + +- type: entity + id: CP14BookPantheonGodsSileita + parent: CP14BookWriteableBase + name: Pantheon of Gods of Sileita + description: Description of the gods of our world, Sileita, may they bless our existence forever and ever. + components: + - type: Sprite + layers: + - state: paper + - state: cover_base + color: black + map: [ "cover" ] + - state: decor_frame + color: "#e28f08" + map: [ "decor" ] + - state: icon_religion + map: [ "icon" ] + - state: bookmark_short + map: [ "overlay" ] + - type: Paper + content: cp14-book-text-pantheon-gods-sileita + +- type: entity + id: CP14BookPantheonGodsSileitaImitators + parent: CP14BookWriteableBase + name: Pantheon of Gods of Sileita - Imitators of the Gods + description: An addition to the main part of the book, which they did not wish to include in the general edition. + components: + - type: Sprite + layers: + - state: paper + - state: cover_base + color: black + map: [ "cover" ] + - state: decor_frame + color: "#e28f08" + map: [ "decor" ] + - state: icon_religion + map: [ "icon" ] + color: red + - state: bookmark_short + map: [ "overlay" ] + - type: Paper + content: cp14-book-text-pantheon-gods-sileita-imitators diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Drinks/goblet.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Drinks/goblet.yml index 0e2b67a870..6decd31115 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Drinks/goblet.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Drinks/goblet.yml @@ -92,3 +92,5 @@ maxTransferAmount: 100 transferAmount: 1 toggleState: 1 # draw + - type: StaticPrice + price: 120 diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Materials/blood_essence.yml b/Resources/Prototypes/_CP14/Entities/Objects/Materials/blood_essence.yml new file mode 100644 index 0000000000..c109e52401 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/Materials/blood_essence.yml @@ -0,0 +1,113 @@ +- type: entity + parent: BaseItem + id: CP14BloodEssence + name: blood essence + description: The essence of life, extracted by force. Only true vampires know how to use it. + categories: [ ForkFiltered ] + suffix: 1 + components: + - type: Item + size: Ginormous + inhandVisuals: + left: + - state: inhand-left + shader: unshaded + right: + - state: inhand-right + shader: unshaded + - type: Sprite + noRot: true + drawdepth: Mobs + sprite: /Textures/_CP14/Objects/Materials/blood_essence.rsi + layers: + - state: drop + shader: unshaded + - type: PointLight + enabled: true + color: "#d60032" + energy: 1 + radius: 3 + netsync: false + - type: CanMoveInAir + - type: Physics + bodyType: Dynamic + bodyStatus: InAir + - type: LightBehaviour + behaviours: + - !type:PulseBehaviour + interpolate: Cubic + maxDuration: 2 + startValue: 1.0 + endValue: 3.0 + property: Energy + isLooped: true + enabled: true + - type: CP14SkillPointConsumable + pointType: Blood + consumeEffect: CP14ImpactEffectBloodEssenceInverse + whitelist: + components: + - CP14Vampire + - type: ChasingWalk + maxChaseRadius: 5 + minSpeed: 0.5 + maxSpeed: 1 + chasingComponent: + - type: CP14VampireClanHeart + - type: CP14VampireTreeCollectable + - type: Stack + stackType: CP14BloodEssence + count: 1 + - type: Material + - type: PhysicalComposition + materialComposition: + CP14BloodEssence: 1 + +- type: entity + id: CP14ImpactEffectBloodEssence + parent: CP14BaseMagicImpact + categories: [ HideSpawnMenu ] + save: false + components: + - type: Sprite + noRot: true + drawdepth: Effects + sprite: _CP14/Effects/Magic/cast_impact32.rsi + layers: + - state: burst + color: "#d60032" + shader: unshaded + - type: PointLight + color: "#d60032" + radius: 4.0 + energy: 3.0 + - type: LightFade + duration: 2.5 + - type: TimedDespawn + lifetime: 2.5 + +- type: entity + id: CP14ImpactEffectBloodEssenceInverse + parent: CP14ImpactEffectBloodEssence + categories: [ HideSpawnMenu ] + save: false + components: + - type: Sprite + sprite: _CP14/Effects/Magic/cast_impact32.rsi + layers: + - state: burst_in + color: "#d60032" + shader: unshaded + +- type: entity + id: CP14ImpactEffectBloodEssence2 + parent: CP14ImpactEffectBloodEssence + categories: [ HideSpawnMenu ] + save: false + components: + - type: Sprite + sprite: _CP14/Effects/Magic/cast_impact32.rsi + layers: + - state: burst2 + color: "#d60032" + shader: unshaded \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Ingredients/ingredients.yml b/Resources/Prototypes/_CP14/Entities/Objects/Materials/buckle.yml similarity index 100% rename from Resources/Prototypes/_CP14/Entities/Objects/Ingredients/ingredients.yml rename to Resources/Prototypes/_CP14/Entities/Objects/Materials/buckle.yml diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Ingredients/hide.yml b/Resources/Prototypes/_CP14/Entities/Objects/Materials/hide.yml similarity index 100% rename from Resources/Prototypes/_CP14/Entities/Objects/Ingredients/hide.yml rename to Resources/Prototypes/_CP14/Entities/Objects/Materials/hide.yml diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Misc/candles.yml b/Resources/Prototypes/_CP14/Entities/Objects/Misc/candles.yml index abf8d52532..28bdade928 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Misc/candles.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Misc/candles.yml @@ -102,6 +102,7 @@ - type: Sprite noRot: true offset: 0,0.2 + drawdepth: Mobs sprite: _CP14/Objects/Misc/candelabra.rsi layers: - state: triple @@ -147,3 +148,38 @@ components: - type: CP14AutoIgnite startStack: 4 + +- type: entity + parent: CP14CandelabraIgnited + id: CP14CandelabraBloodIgnited + suffix: Vampire, DO NOT MAP + categories: [ ForkFiltered, DoNotMap ] + name: candelabra of crimson candles + components: + - type: Sprite + layers: + - state: blood + - type: FireVisuals + lightColor: "#ff1100" + normalState: blood_fire + +- type: entity + parent: CP14CandleIgnited + id: CP14CandleBloodIgnited + suffix: Vampire, DO NOT MAP + categories: [ ForkFiltered, DoNotMap ] + name: crimson candle + components: + - type: Sprite + layers: + - state: blood1 + map: ["random"] + - type: FireVisuals + lightColor: "#ff1100" + normalState: blood_fire + - type: RandomSprite + available: + - random: + blood1: "" + blood2: "" + blood3: "" \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Magic/twoHandedStaffs.yml b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Magic/twoHandedStaffs.yml index 153f557e74..d1dd0c4b0a 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Magic/twoHandedStaffs.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Magic/twoHandedStaffs.yml @@ -65,6 +65,8 @@ - type: CP14MagicEnergyContainer energy: 80 maxEnergy: 80 + - type: StaticPrice + price: 300 - type: entity id: CP14MagicShadowStaff @@ -141,4 +143,6 @@ energy: 0 maxEnergy: 30 - type: CP14MagicManacostModify - globalModifier: 0.9 \ No newline at end of file + globalModifier: 0.9 + - type: StaticPrice + price: 20 diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Ranged/Ammunition/spike.yml b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Ranged/Ammunition/spike.yml index 50eef70f01..6e0c29ac01 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Ranged/Ammunition/spike.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/Ranged/Ammunition/spike.yml @@ -52,3 +52,67 @@ collection: GlassBreak - !type:DoActsBehavior acts: [ "Destruction" ] + +- type: entity + parent: BaseBullet + id: CP14SpikeCackle + name: Cackle spike + description: Organically spiked with a destructive liquid inside. + categories: [ ForkFiltered ] + components: + - type: Sprite + sprite: _CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi + layers: + - state: spike + - type: EmbeddableProjectile + minimumSpeed: 3 + removalTime: 0.5 + offset: 0.0,0.0 + - type: Projectile + damage: + types: + Piercing: 1 + - type: SolutionContainerManager + solutions: + melee: + maxVol: 1 + reagents: + - ReagentId: CP14MonsterToxinBleed + Quantity: 1 + - type: SolutionInjectOnEmbed + transferAmount: 1 + blockSlots: NONE + solution: melee + - type: SolutionTransfer + maxTransferAmount: 1 + - type: TimedDespawn + lifetime: 10 + - type: Ammo + muzzleFlash: null + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 30 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: GlassBreak + - !type:DoActsBehavior + acts: [ "Destruction" ] + +- type: entity + id: CP14SpikeCackleSpread + categories: [ HideSpawnMenu ] + parent: CP14SpikeCackle + components: + - type: ProjectileSpread + proto: CP14SpikeCackle + count: 5 + spread: 45 diff --git a/Resources/Prototypes/_CP14/Entities/Objects/base_contraband.yml b/Resources/Prototypes/_CP14/Entities/Objects/base_contraband.yml new file mode 100644 index 0000000000..c81bac4909 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/base_contraband.yml @@ -0,0 +1,13 @@ +- type: entity + id: CP14BaseMinorContraband + abstract: true + components: + - type: Contraband + severity: CP14Minor + +- type: entity + id: CP14BaseMajorContraband + abstract: true + components: + - type: Contraband + severity: CP14Major \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/StatusEffects/misc.yml b/Resources/Prototypes/_CP14/Entities/StatusEffects/misc.yml index 7e4011f40b..4028193c6f 100644 --- a/Resources/Prototypes/_CP14/Entities/StatusEffects/misc.yml +++ b/Resources/Prototypes/_CP14/Entities/StatusEffects/misc.yml @@ -1,5 +1,6 @@ - type: entity id: CP14StatusEffectMagicArmor + parent: MobStatusEffectBase components: - type: StatusEffect - type: StatusEffectAlert @@ -44,4 +45,15 @@ - type: PointLight radius: 5.0 energy: 1 - color: "#efedff" \ No newline at end of file + color: "#efedff" + +- type: entity + parent: MobStatusEffectDebuff + id: CP14StatusEffectVampireForceSleep + name: vampire forced sleep + components: + - type: StatusEffectAlert + alert: CP14VampireSleeping + - type: ForcedSleepingStatusEffect + - type: StunnedStatusEffect + - type: KnockdownStatusEffect \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/cobwebs.yml b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/cobwebs.yml index d49f592a0f..bbd2610bb9 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/cobwebs.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/cobwebs.yml @@ -18,7 +18,7 @@ anchored: true - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/flags_wallmount.yml b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/flags_wallmount.yml index bbe43f58db..15e8a6f064 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/flags_wallmount.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/flags_wallmount.yml @@ -12,7 +12,7 @@ sprite: _CP14/Structures/Decoration/flags_wallmount.rsi - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/statues.yml b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/statues.yml index b31f540030..cce5ea0d7a 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/statues.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/statues.yml @@ -32,7 +32,7 @@ - MachineLayer - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Rock + damageModifierSet: CP14Rock - type: Destructible thresholds: - trigger: @@ -143,7 +143,7 @@ - MachineLayer - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Rock + damageModifierSet: CP14Rock - type: Destructible thresholds: - trigger: @@ -210,7 +210,7 @@ - MachineLayer - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Rock + damageModifierSet: CP14Rock - type: Destructible thresholds: - trigger: @@ -268,7 +268,7 @@ - type: SpriteFade - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Rock + damageModifierSet: CP14Rock - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/tombstones.yml b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/tombstones.yml index d7690d1874..cac24763e6 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Decorations/tombstones.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Decorations/tombstones.yml @@ -33,7 +33,7 @@ - Opaque - type: Damageable damageContainer: Inorganic - damageModifierSet: Metallic + damageModifierSet: CP14Rock - type: Destructible thresholds: - trigger: @@ -42,6 +42,11 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/break_stone.ogg + params: + volume: -4 - !type:SpawnEntitiesBehavior spawn: CP14StoneBlock1: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml b/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml index dfec957f7b..79114032de 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml @@ -153,6 +153,34 @@ tree05: "" tree06: "" +- type: entity + parent: CP14BaseTree + id: CP14FloraTreeRed + name: motherblood tree + description: Ask Wanderere to insert lore here + components: + - type: Sprite + offset: 0,1.1 + sprite: _CP14/Structures/Flora/tree_vampire.rsi + layers: + - state: 2 + map: ["random"] + - type: CP14WaveShader + speed: 0.5 + dis: 6 + - type: RandomSprite + available: + - random: + 1: "" + 2: "" + 3: "" + 4: "" + 5: "" + 6: "" + - type: Tag + tags: + - CP14AmbientForest + - type: entity parent: CP14BaseTree id: CP14FloraTreeDead diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml index 27da6effeb..af40d910cb 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml @@ -70,7 +70,7 @@ - WallLayer - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel_crane.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel_crane.yml index 5c6273b355..a4e8b24146 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel_crane.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel_crane.yml @@ -13,7 +13,7 @@ - state: barrel - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Physics bodyType: Static - type: Transform @@ -231,7 +231,7 @@ - TabletopMachineLayer - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/beds.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/beds.yml index c75f905075..8480c0c0ac 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/beds.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/beds.yml @@ -34,7 +34,7 @@ placeCentered: true - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -43,6 +43,9 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy - !type:SpawnEntitiesBehavior spawn: CP14WoodenPlanks1: @@ -73,6 +76,9 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy - !type:SpawnEntitiesBehavior spawn: CP14BirchWoodenPlanks1: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bench.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bench.yml index 5440378cd3..40c3934497 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bench.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bench.yml @@ -9,6 +9,9 @@ components: - type: Transform anchored: true + - type: Damageable + damageContainer: Inorganic + damageModifierSet: CP14Wood - type: Rotatable - type: Sprite sprite: _CP14/Structures/Furniture/bench.rsi diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml index 2d8fb46883..1fb23b7ab7 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml @@ -18,7 +18,7 @@ node: CP14Bonfire - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bookshelf.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bookshelf.yml index 0f5121b7b6..14e2804593 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bookshelf.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bookshelf.yml @@ -56,7 +56,7 @@ - MachineLayer - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -95,6 +95,8 @@ - !type:GroupSelector children: - id: CP14BookGuildMoral + - id: CP14BookPantheonGodsSileita + - id: CP14BookPantheonGodsSileitaImitators #Empty random - id: CP14BookRandom amount: !type:RangeNumberSelector diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/cabinets.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/cabinets.yml index 19569c5d7f..494ae26ddf 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/cabinets.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/cabinets.yml @@ -60,7 +60,7 @@ state: icons - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -89,7 +89,7 @@ state: icons - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Metallic + damageModifierSet: CP14Metallic - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml index c58653ee81..8255a5fd77 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/chairs.yml @@ -9,7 +9,7 @@ components: - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Sprite sprite: _CP14/Structures/Furniture/chairs.rsi state: wooden diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/closets.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/closets.yml index cd0f511871..8275fba32c 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/closets.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/closets.yml @@ -66,7 +66,7 @@ state: icons - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/curtains.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/curtains.yml index bbaface861..2730486953 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/curtains.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/curtains.yml @@ -42,7 +42,7 @@ - type: Appearance - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/furnace.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/furnace.yml index 5fd02cb8ef..9fa34f32a9 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/furnace.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/furnace.yml @@ -79,7 +79,7 @@ map: ["fuel"] - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Metallic + damageModifierSet: CP14Metallic - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/lamppost.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/lamppost.yml index 0a8e9d9dfa..ce4ceddc85 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/lamppost.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/lamppost.yml @@ -24,7 +24,7 @@ - WallLayer - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: MeleeSound soundGroups: Brute: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/mannequin.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/mannequin.yml index e5951deeb2..3d44f5521a 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/mannequin.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/mannequin.yml @@ -47,7 +47,7 @@ node: CP14mannequin - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/pallets.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/pallets.yml index 62208591dc..d4ee8cad75 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/pallets.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/pallets.yml @@ -31,7 +31,7 @@ collection: FootstepWood - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/safe.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/safe.yml index c6687d27af..5f58d71e60 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/safe.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/safe.yml @@ -11,7 +11,7 @@ state: base - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: StructuralMetallicStrong + damageModifierSet: CP14MetallicStructural - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml index 9fee116023..a6c8f5d817 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/tables.yml @@ -43,7 +43,7 @@ components: - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -262,7 +262,7 @@ components: - type: Damageable damageContainer: StructuralInorganic - damageModifierSet: Metallic + damageModifierSet: CP14Rock - type: Sprite sprite: _CP14/Structures/Furniture/Tables/marble.rsi - type: Icon diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/torch.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/torch.yml index 6ad26c1e5d..0d699d3919 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/torch.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/torch.yml @@ -7,7 +7,7 @@ - type: InteractionOutline - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -182,4 +182,3 @@ range: 5 sound: path: /Audio/Ambience/Objects/fireplace.ogg - diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_order_border.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_order_border.yml index 1075a1f2c9..6caab0fd6a 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_order_border.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_order_border.yml @@ -21,8 +21,8 @@ - type: InteractionOutline - type: Clickable - type: Damageable - damageModifierSet: Wood damageContainer: StructuralInorganic + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -56,4 +56,3 @@ - type: Construction graph: CP14WallmountOrdersBorder node: CP14WallmountOrdersBorder - diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/workbenchs.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/workbenchs.yml index 43cdf833b0..3b21a1c62e 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/workbenchs.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/workbenchs.yml @@ -27,7 +27,7 @@ type: CP14WorkbenchBoundUserInterface - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -171,4 +171,3 @@ collection: CP14Sawing # TODO CP14Leather? recipeTags: - CP14RecipeLeatherWorking - diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/rifts.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/rifts.yml index 654d2b1258..3b3ccd1c5e 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/rifts.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/rifts.yml @@ -141,7 +141,7 @@ sound: path: /Audio/_CP14/Effects/ritual_end.ogg params: - variation: 0.3 + variation: 0.125 - type: TimedDespawn lifetime: 80 - type: ConditionalSpawner diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/round_end.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/round_end.yml index d738878a66..66490a8c04 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/round_end.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Demiplanes/round_end.yml @@ -110,4 +110,4 @@ - type: PointLight color: "#9c34e6" energy: 2.5 - radius: 8 \ No newline at end of file + radius: 8 diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/portal_glyph.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/portal_glyph.yml new file mode 100644 index 0000000000..92231f0490 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/portal_glyph.yml @@ -0,0 +1,124 @@ +- type: entity + id: CP14TempPortalRed + parent: CP14TempPortalToCity + description: A crimson portal that will disappear very quickly. Where is it leading? + components: + - type: Sprite + noRot: true + drawdepth: Effects + sprite: /Textures/_CP14/Structures/Dungeon/demiplan_rift.rsi + layers: + - state: pulse + shader: unshaded + color: "#ff0000" + - type: PointLight + enabled: true + color: "#ff0000" + energy: 1 + radius: 5 + - type: TimedDespawn + lifetime: 30 + - type: ConditionalSpawner + prototypes: + - CP14ImpactEffectBloodEssence + +- type: entity + id: CP14BaseVampirePortalGlyph + categories: [ ForkFiltered ] + abstract: true + name: portal glyph + description: A teleportation glyph imbued with bloody magic. Any vampire from the owner clan can teleport here at any moment! To destroy a glyph, suck all the magical energy out of it. + components: + - type: Sprite + noRot: true + drawdepth: LowFloors + sprite: _CP14/Effects/Magic/cast_rune.rsi + layers: + - state: medium_circle + shader: unshaded + color: red + - sprite: _CP14/Structures/Dungeon/demiplan_rift_core.rsi + state: connective + color: red + - type: Clickable + - type: PointLight + enabled: true + color: "#d60032" + energy: 1 + radius: 3 + netsync: false + - type: LightBehaviour + behaviours: + - !type:PulseBehaviour + interpolate: Cubic + maxDuration: 1.5 + startValue: 1.0 + endValue: 3.0 + property: Energy + isLooped: true + enabled: true + - type: CP14MagicEnergyContainer + magicAlert: CP14MagicEnergy + maxEnergy: 1 + energy: 1 + unsafeSupport: true + - type: CP14MagicUnsafeDamage + damagePerEnergy: + types: + CP14ManaDepletion: 1 + - type: Damageable + damageContainer: CP14Spectral + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/eye_close.ogg + params: + volume: 6 + - !type:SpawnEntitiesBehavior + spawn: + CP14BloodEssence: + min: 1 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: PhysicalComposition + materialComposition: + CP14BloodEssence: 1 + +- type: entity + id: CP14VampirePortalGlyphDevourers + parent: CP14BaseVampirePortalGlyph + suffix: Devourers + components: + - type: CP14Singleton + key: CP14VampirePortalGlyphDevourers + - type: Construction + graph: CP14VampirePortalGlyphDevourers + node: CP14VampirePortalGlyphDevourers + +- type: entity + id: CP14VampirePortalGlyphUnnameable + parent: CP14BaseVampirePortalGlyph + suffix: Unnameable + components: + - type: CP14Singleton + key: CP14VampirePortalGlyphUnnameable + - type: Construction + graph: CP14VampirePortalGlyphUnnameable + node: CP14VampirePortalGlyphUnnameable + +- type: entity + id: CP14VampirePortalGlyphNightChildrens + parent: CP14BaseVampirePortalGlyph + suffix: Night Childrens + components: + - type: CP14Singleton + key: CP14VampirePortalGlyphNightChildrens + - type: Construction + graph: CP14VampirePortalGlyphNightChildrens + node: CP14VampirePortalGlyphNightChildrens \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/vampire.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/vampire.yml new file mode 100644 index 0000000000..1db7b96e7e --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/vampire.yml @@ -0,0 +1,315 @@ +- type: entity + parent: CP14BaseWorkbench + id: CP14WorkbenchVampire + categories: [ ForkFiltered ] + name: vampire power point + description: A table imbued with vampire magic, allowing you to create items of dark arts. + components: + - type: Sprite + snapCardinals: true + sprite: _CP14/Structures/Specific/Vampire/workbench.rsi + layers: + - state: base + - state: fx + shader: unshaded + - type: Icon + sprite: _CP14/Structures/Specific/Vampire/workbench.rsi + state: base + - type: CP14Workbench + craftSound: + path: /Audio/_CP14/Effects/vampire_craft.ogg + params: + variation: 0.125 + recipeTags: + - CP14RecipeVampire + - type: LightBehaviour + behaviours: + - !type:PulseBehaviour + interpolate: Cubic + maxDuration: 8 + startValue: 1.0 + endValue: 3.0 + property: Energy + isLooped: true + enabled: true + - type: PointLight + enabled: true + color: "#d60032" + energy: 1 + radius: 3 + - type: Construction + graph: CP14WorkbenchVampire + node: CP14WorkbenchVampire + +- type: entity + parent: BaseStructure + id: CP14VampireClanHeartBase + abstract: true + categories: [ ForkFiltered ] + name: vampire clan heart + description: The source of power for the vampire clan. By gathering the life force of its victims, the clan becomes stronger. + components: + - type: WarpPoint + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.4,-0.4,0.4,0.4" + density: 1000 + layer: + - WallLayer + - type: Sprite + drawdepth: Mobs + snapCardinals: true + sprite: _CP14/Structures/Specific/Vampire/heart.rsi + - type: Icon + sprite: _CP14/Structures/Specific/Vampire/heart.rsi + state: base + - type: LightBehaviour + behaviours: + - !type:PulseBehaviour + interpolate: Cubic + maxDuration: 8 + startValue: 1.0 + endValue: 3.0 + property: Energy + isLooped: true + enabled: true + - type: PointLight + enabled: true + color: "#d60032" + energy: 1 + radius: 3 + - type: CP14VampireClanHeart + - type: Appearance + - type: GenericVisualizer + visuals: + enum.VampireClanLevelVisuals.Level: + level: + 1: {state: orb1} + 2: {state: orb2} + 3: {state: orb3} + - type: Damageable + damageContainer: Inorganic + damageModifierSet: CP14Metallic + +- type: entity + parent: CP14VampireClanHeartBase + id: CP14VampireClanHeartUnnameable + suffix: Unnameable + name: heart of unnameable clan + components: + - type: Sprite + layers: + - state: base + - state: unnameable + shader: unshaded + - state: orb1 + sprite: _CP14/Structures/Specific/Vampire/heart_orb.rsi + shader: unshaded + offset: 0, 0.5 + map: [ "level" ] + - type: CP14VampireClanHeart + faction: Unnameable + - type: Construction + graph: CP14VampireClanHeartUnnameable + node: CP14VampireClanHeartUnnameable + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:CP14VampireAltarExplodeBehavior + - !type:SpawnEntitiesBehavior + spawn: + CP14SkyLightningRed: + min: 1 + max: 1 + - !type:ChangeConstructionNodeBehavior + node: CP14VampireClanHeartUnnameableFrame + +- type: entity + parent: CP14VampireClanHeartBase + id: CP14VampireClanHeartDevourers + suffix: Devourers + name: heart of devourers clan + components: + - type: Sprite + layers: + - state: base + - state: devourers + shader: unshaded + - state: orb1 + sprite: _CP14/Structures/Specific/Vampire/heart_orb.rsi + shader: unshaded + offset: 0, 0.5 + map: [ "level" ] + - type: CP14VampireClanHeart + faction: Devourers + - type: Construction + graph: CP14VampireClanHeartDevourers + node: CP14VampireClanHeartDevourers + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:CP14VampireAltarExplodeBehavior + - !type:SpawnEntitiesBehavior + spawn: + CP14SkyLightningRed: + min: 1 + max: 1 + - !type:ChangeConstructionNodeBehavior + node: CP14VampireClanHeartDevourersFrame + +- type: entity + parent: CP14VampireClanHeartBase + id: CP14VampireClanHeartNightChildren + suffix: Night childrens + name: heart of night childrens clan + components: + - type: Sprite + layers: + - state: base + - state: childrens + shader: unshaded + - state: orb1 + sprite: _CP14/Structures/Specific/Vampire/heart_orb.rsi + shader: unshaded + offset: 0, 0.5 + map: [ "level" ] + - type: CP14VampireClanHeart + faction: NightChildrens + - type: Construction + graph: CP14VampireClanHeartNightChildren + node: CP14VampireClanHeartNightChildren + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:CP14VampireAltarExplodeBehavior + - !type:SpawnEntitiesBehavior + spawn: + CP14SkyLightningRed: + min: 1 + max: 1 + - !type:ChangeConstructionNodeBehavior + node: CP14VampireClanHeartNightChildrenFrame + +- type: entity + parent: BaseStructure + id: CP14VampireClanHeartFrameUnnameable + categories: [ ForkFiltered, HideSpawnMenu ] + name: clan heart frame + description: A majestic artifact of vampire culture. Unfinished. + components: + - type: Sprite + snapCardinals: true + sprite: _CP14/Structures/Specific/Vampire/heart.rsi + layers: + - state: frame + - type: Construction + graph: CP14VampireClanHeartUnnameable + node: CP14VampireClanHeartUnnameableFrame + - type: Damageable + damageContainer: Inorganic + damageModifierSet: CP14Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + CP14StoneBlock1: + min: 1 + max: 5 + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - !type:DoActsBehavior + acts: [ "Destruction" ] + +- type: entity + parent: CP14VampireClanHeartFrameUnnameable + id: CP14VampireClanHeartFrameDevourers + categories: [ ForkFiltered, HideSpawnMenu ] + components: + - type: Construction + graph: CP14VampireClanHeartDevourers + node: CP14VampireClanHeartDevourersFrame + +- type: entity + parent: CP14VampireClanHeartFrameUnnameable + id: CP14VampireClanHeartFrameNightChildrens + categories: [ ForkFiltered, HideSpawnMenu ] + components: + - type: Construction + graph: CP14VampireClanHeartNightChildren + node: CP14VampireClanHeartNightChildrenFrame + +- type: entity + id: CP14VampireStoneAltar + parent: Bed + categories: [ ForkFiltered ] + name: bloody altar + description: A gruesome stone altar splattered with blood. Doubles the amount of blood essence extracted from vampire victims. + components: + - type: CP14VampireAltar + - type: Clickable + - type: InteractionOutline + - type: Sprite + sprite: _CP14/Structures/Specific/Vampire/altar.rsi + layers: + - state: base + - state: fx + shader: unshaded + noRot: true + - type: Icon + sprite: _CP14/Structures/Specific/Vampire/altar.rsi + state: base + - type: Construction + graph: CP14VampireStoneAltar + node: CP14VampireStoneAltar + - type: Damageable + damageContainer: Inorganic + damageModifierSet: CP14Rock + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:SpawnEntitiesBehavior + spawn: + CP14StoneBlock1: + min: 2 + max: 4 + - !type:SpawnEntitiesBehavior + spawn: + CP14BloodEssence: + min: 1 + max: 1 + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/break_stone.ogg + params: + volume: -6 + - !type:DoActsBehavior + acts: [ "Destruction" ] \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/crates.yml index 3ee2f627e0..9c34d97e69 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Storage/Crates/crates.yml @@ -78,7 +78,7 @@ sprite: _CP14/Structures/Storage/Crates/large_wooden_crate.rsi - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -111,7 +111,7 @@ sprite: _CP14/Structures/Storage/Crates/small_wooden_crate.rsi - type: Damageable damageContainer: Inorganic - damageModifierSet: Wood + damageModifierSet: CP14Wood - type: Destructible thresholds: - trigger: @@ -131,4 +131,3 @@ - type: Construction graph: CP14SmallWoodenCrate node: CP14SmallWoodenCrate - diff --git a/Resources/Prototypes/_CP14/Entities/Tiles/astral_corrosion.yml b/Resources/Prototypes/_CP14/Entities/Tiles/astral_corrosion.yml index 3b118b6432..a81c99e213 100644 --- a/Resources/Prototypes/_CP14/Entities/Tiles/astral_corrosion.yml +++ b/Resources/Prototypes/_CP14/Entities/Tiles/astral_corrosion.yml @@ -28,4 +28,3 @@ basalt3: "" basalt4: "" basalt5: "" - diff --git a/Resources/Prototypes/_CP14/GameRules/roundstart.yml b/Resources/Prototypes/_CP14/GameRules/roundstart.yml index fc833e397d..3c4b301c3a 100644 --- a/Resources/Prototypes/_CP14/GameRules/roundstart.yml +++ b/Resources/Prototypes/_CP14/GameRules/roundstart.yml @@ -6,15 +6,6 @@ - type: GameRule cP14Allowed: true -- type: entity - parent: CP14BaseGameRule - id: CP14SubGamemodesRule - components: - - type: SubGamemodes - rules: - - id: CP14Vampire - prob: 0.5 - - type: entity id: CP14RoundObjectivesRule parent: CP14BaseGameRule diff --git a/Resources/Prototypes/_CP14/GameRules/subgamemodes.yml b/Resources/Prototypes/_CP14/GameRules/subgamemodes.yml index 7b3ccd802e..e70d7cb711 100644 --- a/Resources/Prototypes/_CP14/GameRules/subgamemodes.yml +++ b/Resources/Prototypes/_CP14/GameRules/subgamemodes.yml @@ -1,37 +1,31 @@ - type: entity parent: CP14BaseGameRule - id: CP14Vampire + id: CP14GameRuleVampireClanBattle components: - type: CP14VampireRule - #- type: AntagObjectives - # objectives: - # - TODO: SURVIVE + - type: AntagObjectives + objectives: + - CP14VampireObjectiveBloodPurity + - CP14VampireObjectiveDefenseVillage - type: GameRule - minPlayers: 0 #Increase in future + minPlayers: 20 - type: AntagSelection + selectionTime: IntraPlayerSpawn definitions: + # Night children clan - prefRoles: [ CP14Vampire ] - max: 5 - playerRatio: 10 - multiAntagSetting: NotExclusive + min: 1 + max: 3 + playerRatio: 2 lateJoinAdditional: true - allowNonHumans: true mindRoles: - CP14MindRoleVampire components: - type: CP14Vampire - - type: CP14SpellStorage - grantAccessToSelf: true - spells: - - CP14ActionVampireBite - - CP14ActionSpellVampireHypnosis - - CP14ActionSpellVampireBloodStep + faction: NightChildrens + - type: CP14ShowVampireFaction + faction: NightChildrens - type: Hunger - baseDecayRate: 0.07 - starvationDamage: - types: - Cold: 0.25 - Bloodloss: 0.25 hungerThresholdAlerts: Peckish: CP14VampirePeckish Starving: CP14VampireStarving @@ -45,7 +39,67 @@ groups: Brute: -3 briefing: - text: cp14-roles-antag-vampire-briefing + text: cp14-roles-antag-vampire-briefing-night-childrens color: "#630f24" - sound: "/Audio/_CP14/Ambience/Antag/bandit_start.ogg" + sound: "/Audio/_CP14/Ambience/Antag/vampire.ogg" + # Devourers clan + - prefRoles: [ CP14Vampire ] + min: 1 + max: 3 + playerRatio: 2 + lateJoinAdditional: true + mindRoles: + - CP14MindRoleVampire + components: + - type: CP14Vampire + faction: Devourers + - type: CP14ShowVampireFaction + faction: Devourers + - type: Hunger + hungerThresholdAlerts: + Peckish: CP14VampirePeckish + Starving: CP14VampireStarving + Dead: CP14VampireStarving + starvingSlowdownModifier: 1.1 #Speed Up when hunger! + - type: PassiveDamage + allowedStates: + - Alive + - Critical + damage: + groups: + Brute: -3 + briefing: + text: cp14-roles-antag-vampire-briefing-devourers + color: "#630f24" + sound: "/Audio/_CP14/Ambience/Antag/vampire.ogg" + # Unnameable clan + - prefRoles: [ CP14Vampire ] + min: 1 + max: 3 + playerRatio: 2 + lateJoinAdditional: true + mindRoles: + - CP14MindRoleVampire + components: + - type: CP14Vampire + faction: Unnameable + - type: CP14ShowVampireFaction + faction: Unnameable + - type: Hunger + hungerThresholdAlerts: + Peckish: CP14VampirePeckish + Starving: CP14VampireStarving + Dead: CP14VampireStarving + starvingSlowdownModifier: 1.1 #Speed Up when hunger! + - type: PassiveDamage + allowedStates: + - Alive + - Critical + damage: + groups: + Brute: -3 + briefing: + text: cp14-roles-antag-vampire-briefing-unnameable + color: "#630f24" + sound: "/Audio/_CP14/Ambience/Antag/vampire.ogg" diff --git a/Resources/Prototypes/_CP14/Maps/comoss.yml b/Resources/Prototypes/_CP14/Maps/comoss.yml index 8ed149f04d..51bfed3575 100644 --- a/Resources/Prototypes/_CP14/Maps/comoss.yml +++ b/Resources/Prototypes/_CP14/Maps/comoss.yml @@ -53,8 +53,8 @@ location: ComossIsland modifiers: - RaidSpawners - - EnemyFlem - - MonsterMosquito + - Rabbits + - Boar - Marble - CopperOre - CopperOre diff --git a/Resources/Prototypes/_CP14/Maps/venicialis.yml b/Resources/Prototypes/_CP14/Maps/venicialis.yml index 58f5c5e41e..c36a58deae 100644 --- a/Resources/Prototypes/_CP14/Maps/venicialis.yml +++ b/Resources/Prototypes/_CP14/Maps/venicialis.yml @@ -55,6 +55,7 @@ - CP14CrystalQuartzWater - Quartz - Ruins - - MobSlimeIce + - Boar + - Rabbits - LumiShroom - SilverNeedle diff --git a/Resources/Prototypes/_CP14/Materials/simple.yml b/Resources/Prototypes/_CP14/Materials/simple.yml index 9bf48754fa..673b9428f4 100644 --- a/Resources/Prototypes/_CP14/Materials/simple.yml +++ b/Resources/Prototypes/_CP14/Materials/simple.yml @@ -139,3 +139,12 @@ icon: { sprite: _CP14/Objects/Ingredients/leather.rsi, state: leather } color: "#a78a63" price: 1.2 + +- type: material + id: CP14BloodEssence + stackEntity: CP14BloodEssence + name: cp14-stack-blood-essence + unit: materials-unit-bar + icon: { sprite: _CP14/Objects/Materials/blood_essence.rsi, state: drop } + color: "#a78a63" + price: 8 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Objectives/steal_target_groups.yml b/Resources/Prototypes/_CP14/Objectives/steal_target_groups.yml deleted file mode 100644 index 60527bd583..0000000000 --- a/Resources/Prototypes/_CP14/Objectives/steal_target_groups.yml +++ /dev/null @@ -1,21 +0,0 @@ -- type: stealTargetGroup - id: CP14Dino - name: cp14-steal-target-dino - sprite: - sprite: _CP14/Mobs/Animals/dino.rsi - state: dead - -- type: stealTargetGroup - id: CP14Mole - name: cp14-steal-target-mole - sprite: - sprite: _CP14/Mobs/Monster/mole.rsi - state: dead - -- type: stealTargetGroup - id: CP14Boar - name: cp14-steal-target-boar - sprite: - sprite: _CP14/Mobs/Animals/boar.rsi - state: dead - diff --git a/Resources/Prototypes/_CP14/Objectives/vampire.yml b/Resources/Prototypes/_CP14/Objectives/vampire.yml new file mode 100644 index 0000000000..88d5d57daa --- /dev/null +++ b/Resources/Prototypes/_CP14/Objectives/vampire.yml @@ -0,0 +1,20 @@ +- type: entity + abstract: true + parent: BaseObjective + id: CP14BaseVampireObjective + components: + - type: Objective + issuer: cp14-objective-issuer-vampire + difficulty: 1 + +- type: entity + parent: CP14BaseVampireObjective + id: CP14VampireObjectiveBloodPurity + components: + - type: CP14VampireBloodPurityCondition + +- type: entity + parent: CP14BaseVampireObjective + id: CP14VampireObjectiveDefenseVillage + components: + - type: CP14VampireDefenceVillageCondition \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Parallax/astral.yml b/Resources/Prototypes/_CP14/Parallax/astral.yml deleted file mode 100644 index efba8df3c5..0000000000 --- a/Resources/Prototypes/_CP14/Parallax/astral.yml +++ /dev/null @@ -1,19 +0,0 @@ -- type: parallax - id: CP14Astral - layers: - - texture: - !type:ImageParallaxTextureSource - path: "/Textures/Parallaxes/KettleParallaxBG.png" - slowness: 0.998046875 - scale: "1, 1" - - texture: - !type:GeneratedParallaxTextureSource - id: "hq_wizard_stars" - configPath: "/Prototypes/_CP14/Parallax/stars_purple.toml" - slowness: 0.696625 - - texture: - !type:GeneratedParallaxTextureSource - id: "hq_wizard_stars" - configPath: "/Prototypes/_CP14/Parallax/stars_purple_2.toml" - slowness: 0.896625 - diff --git a/Resources/Prototypes/_CP14/Parallax/blood.yml b/Resources/Prototypes/_CP14/Parallax/blood.yml new file mode 100644 index 0000000000..48135e007c --- /dev/null +++ b/Resources/Prototypes/_CP14/Parallax/blood.yml @@ -0,0 +1,9 @@ +- type: parallax + id: CP14Blood + layers: + - texture: + !type:ImageParallaxTextureSource + path: "/Textures/_CP14/Parallaxes/BloodBG.png" + slowness: 0.998046875 + scale: "1, 1" + diff --git a/Resources/Prototypes/_CP14/Parallax/ocean.yml b/Resources/Prototypes/_CP14/Parallax/ocean.yml deleted file mode 100644 index c6bd324a2b..0000000000 --- a/Resources/Prototypes/_CP14/Parallax/ocean.yml +++ /dev/null @@ -1,34 +0,0 @@ -- type: parallax - id: CP14Ocean - layers: - - texture: - !type:ImageParallaxTextureSource - path: "/Textures/_CP14/Parallaxes/ocean.png" - slowness: 0.5 - scale: "1, 1" - scrolling: "0, -0.05" - shader: "" - - texture: - !type:ImageParallaxTextureSource - path: "/Textures/_CP14/Parallaxes/ocean_overlay2.png" - slowness: 0.3 - scale: "1, 1" - scrolling: "-0.08, -0.08" - shader: "" - - texture: - !type:ImageParallaxTextureSource - path: "/Textures/_CP14/Parallaxes/ocean_overlay.png" - slowness: 0.05 - scale: "1, 1" - scrolling: "-0.1, -0.1" - shader: "" - layersLQ: - - texture: - !type:ImageParallaxTextureSource - path: "/Textures/_CP14/Parallaxes/ocean.png" - slowness: 0.5 - scale: "1, 1" - scrolling: "0, -0.05" - shader: "" - layersLQUseHQ: false - diff --git a/Resources/Prototypes/_CP14/Parallax/stars_purple.toml b/Resources/Prototypes/_CP14/Parallax/stars_purple.toml deleted file mode 100644 index 179b203d74..0000000000 --- a/Resources/Prototypes/_CP14/Parallax/stars_purple.toml +++ /dev/null @@ -1,57 +0,0 @@ -# Clear to black. -[[layers]] -type = "clear" -color = "#000000" - -# Bright background nebula stars. -[[layers]] -type = "points" -closecolor = "#aa47ad" -count = 1000 -seed = 3472 -mask = true -masknoise_type = "fbm" -maskoctaves = 4 -maskpersistence = "0.5" -maskpower = "0.35" -masklacunarity = "1.5" -maskfrequency = "3" -maskthreshold = "0.37" -maskseed = 3551 - -# Bright background nebula stars, dim edge. -[[layers]] -type = "points" -closecolor = "#41244a" -pointsize = 2 -count = 1000 -seed = 3472 -mask = true -masknoise_type = "fbm" -maskoctaves = 4 -maskpersistence = "0.5" -maskpower = "0.35" -masklacunarity = "1.5" -maskfrequency = "3" -maskthreshold = "0.37" -maskseed = 3551 - -# Couple of bright pink stars. -[[layers]] -type = "points" -closecolor = "#ff63ef" -count = 30 -seed = 6454 - -# And their dim edge. -[[layers]] -type = "points" -closecolor = "#301a43" -pointsize = 2 -count = 30 -seed = 6454 - -# Colour-to-alpha. -[[layers]] -type = "toalpha" - diff --git a/Resources/Prototypes/_CP14/Parallax/stars_purple_2.toml b/Resources/Prototypes/_CP14/Parallax/stars_purple_2.toml deleted file mode 100644 index 02e72074e6..0000000000 --- a/Resources/Prototypes/_CP14/Parallax/stars_purple_2.toml +++ /dev/null @@ -1,57 +0,0 @@ -# Clear to black. -[[layers]] -type = "clear" -color = "#000000" - -# Bright background nebula stars. -[[layers]] -type = "points" -closecolor = "#aa47ad" -count = 1000 -seed = 4810 -mask = true -masknoise_type = "fbm" -maskoctaves = 4 -maskpersistence = "0.5" -maskpower = "0.35" -masklacunarity = "1.5" -maskfrequency = "3" -maskthreshold = "0.37" -maskseed = 3551 - -# Bright background nebula stars, dim edge. -[[layers]] -type = "points" -closecolor = "#41244a" -pointsize = 2 -count = 1000 -seed = 4810 -mask = true -masknoise_type = "fbm" -maskoctaves = 4 -maskpersistence = "0.5" -maskpower = "0.35" -masklacunarity = "1.5" -maskfrequency = "3" -maskthreshold = "0.37" -maskseed = 3551 - -# Couple of bright pink stars. -[[layers]] -type = "points" -closecolor = "#ff63ef" -count = 30 -seed = 9019 - -# And their dim edge. -[[layers]] -type = "points" -closecolor = "#301a43" -pointsize = 2 -count = 30 -seed = 9019 - -# Colour-to-alpha. -[[layers]] -type = "toalpha" - diff --git a/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml b/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml index a3ca89fe00..045ef54b9f 100644 --- a/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml +++ b/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml @@ -321,4 +321,24 @@ entity: CP14MobMonsterMyconideLumish count: 5 minGroupSize: 7 - maxGroupSize: 12 \ No newline at end of file + maxGroupSize: 12 + +- type: cp14LocationModifier + id: EnemyCackle + levels: + min: 2 + max: 5 + name: cp14-modifier-cackle + generationWeight: 0.33 + categories: + Danger: 0.3 + requiredTags: + - CP14DemiplaneOpenSky + blacklistTags: + - CP14DemiplaneCold + layers: + - !type:CP14OreDunGen + entity: CP14MobMonsterCackle + count: 4 + minGroupSize: 1 + maxGroupSize: 3 diff --git a/Resources/Prototypes/_CP14/Reagents/blood.yml b/Resources/Prototypes/_CP14/Reagents/blood.yml index 6cde6c2f77..6fcf4e184d 100644 --- a/Resources/Prototypes/_CP14/Reagents/blood.yml +++ b/Resources/Prototypes/_CP14/Reagents/blood.yml @@ -5,7 +5,7 @@ desc: cp14-reagent-desc-blood flavor: CP14Metallic color: "#800000" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood @@ -31,7 +31,6 @@ damage: groups: Brute: -5 - Burn: -5 - type: reagent id: CP14BloodAnimal @@ -40,7 +39,7 @@ desc: cp14-reagent-desc-blood-animal flavor: CP14Metallic color: "#802020" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood @@ -67,7 +66,7 @@ desc: cp14-reagent-desc-blood-vampire flavor: CP14Metallic color: "#800000" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood @@ -82,7 +81,7 @@ name: cp14-reagent-name-blood-tiefling flavor: CP14Metallic color: "#803300" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood @@ -107,22 +106,7 @@ type: CP14Vampire damage: groups: - Brute: -3 - Burn: -3 - - !type:FlammableReaction - conditions: - - !type:OrganType - type: CP14Vampire - multiplier: 1 - - !type:AdjustTemperature - conditions: - - !type:OrganType - type: CP14Vampire - amount: 1000 - - !type:Ignite - conditions: - - !type:OrganType - type: CP14Vampire + Burn: -5 pricePerUnit: 0.15 - type: reagent @@ -132,7 +116,7 @@ name: cp14-reagent-name-blood-elf flavor: CP14Metallic color: "#80003e" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood @@ -163,8 +147,7 @@ type: CP14Vampire damage: groups: - Brute: -3 - Burn: -3 + Burn: -5 pricePerUnit: 0.25 - type: reagent @@ -174,7 +157,7 @@ name: cp14-reagent-name-blood-goblin flavor: CP14Metallic color: "#576e35" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood @@ -217,7 +200,7 @@ desc: cp14-reagent-desc-blood-monster flavor: CP14Metallic color: "#800058" - recognizable: true + recognizable: false physicalDesc: cp14-reagent-physical-desc-ferrous footstepSound: collection: FootstepBlood diff --git a/Resources/Prototypes/_CP14/Reagents/monster_toxins.yml b/Resources/Prototypes/_CP14/Reagents/monster_toxins.yml index eea6beeb16..4c69891812 100644 --- a/Resources/Prototypes/_CP14/Reagents/monster_toxins.yml +++ b/Resources/Prototypes/_CP14/Reagents/monster_toxins.yml @@ -30,3 +30,23 @@ walkSpeedModifier: 0.6 sprintSpeedModifier: 0.6 pricePerUnit: 4.0 #arbitrary for now + +- type: reagent + id: CP14MonsterToxinBleed + name: cp14-reagent-name-toxin-bleed + desc: cp14-reagent-desc-toxin-bleed + group: CP14MonsterToxins + flavor: CP14Metallic + color: "#872e2e" + physicalDesc: cp14-reagent-physical-desc-scarlet + metabolisms: + Poison: + metabolismRate: 0.5 + effects: + - !type:ModifyBleedAmount + amount: 2 + - !type:HealthChange + damage: + types: + Piercing: 1.5 + pricePerUnit: 4.0 #arbitrary for now diff --git a/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/altar.yml b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/altar.yml new file mode 100644 index 0000000000..3c45fdbb27 --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/altar.yml @@ -0,0 +1,21 @@ +- type: constructionGraph + id: CP14VampireStoneAltar + start: start + graph: + - node: start + edges: + - to: CP14VampireStoneAltar + completed: + - !type:SnapToGrid + steps: + - material: CP14Stone + amount: 5 + doAfter: 2 + - material: CP14IronBar + amount: 2 + doAfter: 2 + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampireStoneAltar + entity: CP14VampireStoneAltar \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/glyph.yml b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/glyph.yml new file mode 100644 index 0000000000..ed00ce42b2 --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/glyph.yml @@ -0,0 +1,47 @@ +- type: constructionGraph + id: CP14VampirePortalGlyphDevourers + start: start + graph: + - node: start + edges: + - to: CP14VampirePortalGlyphDevourers + completed: + - !type:SnapToGrid + steps: + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampirePortalGlyphDevourers + entity: CP14VampirePortalGlyphDevourers + +- type: constructionGraph + id: CP14VampirePortalGlyphUnnameable + start: start + graph: + - node: start + edges: + - to: CP14VampirePortalGlyphUnnameable + completed: + - !type:SnapToGrid + steps: + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampirePortalGlyphUnnameable + entity: CP14VampirePortalGlyphUnnameable + +- type: constructionGraph + id: CP14VampirePortalGlyphNightChildrens + start: start + graph: + - node: start + edges: + - to: CP14VampirePortalGlyphNightChildrens + completed: + - !type:SnapToGrid + steps: + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampirePortalGlyphNightChildrens + entity: CP14VampirePortalGlyphNightChildrens diff --git a/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/workbench.yml b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/workbench.yml new file mode 100644 index 0000000000..48b81e4a2d --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/workbench.yml @@ -0,0 +1,106 @@ +- type: constructionGraph + id: CP14WorkbenchVampire + start: start + graph: + - node: start + edges: + - to: CP14WorkbenchVampire + completed: + - !type:SnapToGrid + steps: + - stackGroup: WoodenPlanks + amount: 3 + doAfter: 2 + - node: CP14WorkbenchVampire + entity: CP14WorkbenchVampire + + +- type: constructionGraph + id: CP14VampireClanHeartUnnameable + start: start + graph: + - node: start + edges: + - to: CP14VampireClanHeartUnnameableFrame + completed: + - !type:SnapToGrid + steps: + - material: CP14Stone + amount: 10 + doAfter: 2 + + - node: CP14VampireClanHeartUnnameableFrame + entity: CP14VampireClanHeartFrameUnnameable + edges: + - to: CP14VampireClanHeartUnnameable + completed: + - !type:SnapToGrid + conditions: + - !type:CP14AllVampireClanRequired + faction: Unnameable + steps: + - material: CP14BloodEssence + amount: 1 + doAfter: 1 + - node: CP14VampireClanHeartUnnameable + entity: CP14VampireClanHeartUnnameable + +- type: constructionGraph + id: CP14VampireClanHeartDevourers + start: start + graph: + - node: start + edges: + - to: CP14VampireClanHeartDevourersFrame + completed: + - !type:SnapToGrid + steps: + - material: CP14Stone + amount: 10 + doAfter: 2 + + - node: CP14VampireClanHeartDevourersFrame + entity: CP14VampireClanHeartFrameDevourers + edges: + - to: CP14VampireClanHeartDevourers + completed: + - !type:SnapToGrid + conditions: + - !type:CP14AllVampireClanRequired + faction: Unnameable + steps: + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampireClanHeartDevourers + entity: CP14VampireClanHeartDevourers + +- type: constructionGraph + id: CP14VampireClanHeartNightChildren + start: start + graph: + - node: start + edges: + - to: CP14VampireClanHeartNightChildrenFrame + completed: + - !type:SnapToGrid + steps: + - material: CP14Stone + amount: 10 + doAfter: 2 + + - node: CP14VampireClanHeartNightChildrenFrame + entity: CP14VampireClanHeartFrameNightChildrens + edges: + - to: CP14VampireClanHeartNightChildren + completed: + - !type:SnapToGrid + conditions: + - !type:CP14AllVampireClanRequired + faction: Unnameable + steps: + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampireClanHeartNightChildren + entity: CP14VampireClanHeartNightChildren \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Construction/vampire.yml b/Resources/Prototypes/_CP14/Recipes/Construction/vampire.yml new file mode 100644 index 0000000000..d89beea1a2 --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Construction/vampire.yml @@ -0,0 +1,131 @@ +# General +- type: construction + crystallPunkAllowed: true + id: CP14WorkbenchVampire + graph: CP14WorkbenchVampire + startNode: start + targetNode: CP14WorkbenchVampire + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: BloodEssenceCreation + +- type: construction + crystallPunkAllowed: true + id: CP14VampireStoneAltar + graph: CP14VampireStoneAltar + startNode: start + targetNode: CP14VampireStoneAltar + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: BloodEssenceCreation + +# Unnameable +- type: construction + crystallPunkAllowed: true + id: CP14VampireClanHeartUnnameable + graph: CP14VampireClanHeartUnnameable + startNode: start + targetNode: CP14VampireClanHeartUnnameable + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: VampireTransmutateUnnameable + +- type: construction + crystallPunkAllowed: true + id: CP14VampirePortalGlyphUnnameable + graph: CP14VampirePortalGlyphUnnameable + startNode: start + targetNode: CP14VampirePortalGlyphUnnameable + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: VampireTransmutateUnnameable + +# Devourers +- type: construction + crystallPunkAllowed: true + id: CP14VampireClanHeartDevourers + graph: CP14VampireClanHeartDevourers + startNode: start + targetNode: CP14VampireClanHeartDevourers + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: VampireTransmutateDevourers + +- type: construction + crystallPunkAllowed: true + id: CP14VampirePortalGlyphDevourers + graph: CP14VampirePortalGlyphDevourers + startNode: start + targetNode: CP14VampirePortalGlyphDevourers + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: VampireTransmutateDevourers + +# Night childrens +- type: construction + crystallPunkAllowed: true + id: CP14VampireClanHeartNightChildren + graph: CP14VampireClanHeartNightChildren + startNode: start + targetNode: CP14VampireClanHeartNightChildren + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: VampireTransmutateNightChildrens + +- type: construction + crystallPunkAllowed: true + id: CP14VampirePortalGlyphNightChildrens + graph: CP14VampirePortalGlyphNightChildrens + startNode: start + targetNode: CP14VampirePortalGlyphNightChildrens + category: cp14-construction-category-vampire + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + cP14Restrictions: + - !type:NeedPrerequisite + prerequisite: VampireTransmutateNightChildrens \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/devourers.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/devourers.yml new file mode 100644 index 0000000000..97b010fca6 --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/devourers.yml @@ -0,0 +1,36 @@ +- type: CP14Recipe + id: CP14ClothingMaskVampireVoiceDevourers + tag: CP14RecipeVampire + category: Clothing + craftTime: 1 + requiredSkills: + - VampireTransmutateDevourers + requirements: + - !type:StackResource + stack: CP14ThinLeather + count: 2 + - !type:StackResource + stack: CP14IronBar + count: 1 + result: CP14ClothingMaskVampireVoiceDevourers + resultCount: 1 + +- type: CP14Recipe + id: CP14ClothingCloakVampireDevourers + tag: CP14RecipeVampire + category: Clothing + craftTime: 1 + requiredSkills: + - VampireTransmutateDevourers + requirements: + - !type:StackResource + stack: CP14Cloth + count: 4 + - !type:StackResource + stack: CP14MithrilBar + count: 1 + - !type:StackResource + stack: CP14BloodEssence + count: 1 + result: CP14ClothingCloakVampireDevourers + resultCount: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/generic.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/generic.yml new file mode 100644 index 0000000000..9e245d0bdc --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/generic.yml @@ -0,0 +1,26 @@ +- type: CP14Recipe + id: CP14CandelabraBloodIgnited + tag: CP14RecipeVampire + craftTime: 1 + requirements: + - !type:SolutionResource + reagent: CP14BloodTiefling + amount: 10 + purity: 0.8 + - !type:StackResource + stack: CP14IronBar + count: 1 + result: CP14CandelabraBloodIgnited + resultCount: 1 + +- type: CP14Recipe + id: CP14CandleBloodIgnited + tag: CP14RecipeVampire + craftTime: 1 + requirements: + - !type:SolutionResource + reagent: CP14BloodTiefling + amount: 10 + purity: 0.8 + result: CP14CandleBloodIgnited + resultCount: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/night_children.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/night_children.yml new file mode 100644 index 0000000000..5f75b0853d --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/night_children.yml @@ -0,0 +1,36 @@ +- type: CP14Recipe + id: CP14ClothingMaskVampireVoiceNightChildrens + tag: CP14RecipeVampire + category: Clothing + craftTime: 1 + requiredSkills: + - VampireTransmutateNightChildrens + requirements: + - !type:StackResource + stack: CP14ThinLeather + count: 2 + - !type:StackResource + stack: CP14IronBar + count: 1 + result: CP14ClothingMaskVampireVoiceNightChildrens + resultCount: 1 + +- type: CP14Recipe + id: CP14ClothingCloakVampireNightChildrens + tag: CP14RecipeVampire + category: Clothing + craftTime: 1 + requiredSkills: + - VampireTransmutateNightChildrens + requirements: + - !type:StackResource + stack: CP14Cloth + count: 4 + - !type:StackResource + stack: CP14MithrilBar + count: 1 + - !type:StackResource + stack: CP14BloodEssence + count: 1 + result: CP14ClothingCloakVampireNightChildrens + resultCount: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/unnameable.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/unnameable.yml new file mode 100644 index 0000000000..7e0ab1a85d --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/Vampire/unnameable.yml @@ -0,0 +1,36 @@ +- type: CP14Recipe + id: CP14ClothingMaskVampireVoiceUnnameable + tag: CP14RecipeVampire + category: Clothing + craftTime: 1 + requiredSkills: + - VampireTransmutateUnnameable + requirements: + - !type:StackResource + stack: CP14ThinLeather + count: 2 + - !type:StackResource + stack: CP14IronBar + count: 1 + result: CP14ClothingMaskVampireVoiceUnnameable + resultCount: 1 + +- type: CP14Recipe + id: CP14ClothingCloakVampireUnnameable + tag: CP14RecipeVampire + category: Clothing + craftTime: 1 + requiredSkills: + - VampireTransmutateUnnameable + requirements: + - !type:StackResource + stack: CP14Cloth + count: 4 + - !type:StackResource + stack: CP14MithrilBar + count: 1 + - !type:StackResource + stack: CP14BloodEssence + count: 1 + result: CP14ClothingCloakVampireUnnameable + resultCount: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/furnace.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/furnace.yml index 22795b4000..3508af5f2f 100644 --- a/Resources/Prototypes/_CP14/Recipes/Workbench/furnace.yml +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/furnace.yml @@ -1,7 +1,7 @@ - type: CP14Recipe id: CP14CopperBar1 tag: CP14RecipeMeltingFurnace - craftTime: 4 + craftTime: 1 category: Materials requiredSkills: - CopperMelting @@ -14,7 +14,7 @@ - type: CP14Recipe id: CP14IronBar1 tag: CP14RecipeMeltingFurnace - craftTime: 4 + craftTime: 1 category: Materials requiredSkills: - IronMelting @@ -27,7 +27,7 @@ - type: CP14Recipe id: CP14GoldBar1 tag: CP14RecipeMeltingFurnace - craftTime: 4 + craftTime: 1 category: Materials requiredSkills: - GoldMelting @@ -40,7 +40,7 @@ - type: CP14Recipe id: CP14MithrilBar1 tag: CP14RecipeMeltingFurnace - craftTime: 4 + craftTime: 1 category: Materials requiredSkills: - MithrilMelting @@ -187,7 +187,7 @@ - type: CP14Recipe id: CP14BaseAlchemyBomb tag: CP14RecipeMeltingFurnace - craftTime: 4 + craftTime: 1 requiredSkills: - GlassMelting requirements: diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml index d913bd5afb..61915c0433 100644 --- a/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml @@ -51,7 +51,7 @@ stack: CP14Cloth count: 1 result: CP14String - resultCount: 4 + resultCount: 2 - type: CP14Recipe id: CP14ClothingShirtCottonBlue diff --git a/Resources/Prototypes/_CP14/Religion/religions.yml b/Resources/Prototypes/_CP14/Religion/religions.yml index da2846cb79..cf5a3cea5d 100644 --- a/Resources/Prototypes/_CP14/Religion/religions.yml +++ b/Resources/Prototypes/_CP14/Religion/religions.yml @@ -2,4 +2,4 @@ id: Merkas - type: cp14Religion - id: Lumera \ No newline at end of file + id: Lumera diff --git a/Resources/Prototypes/_CP14/Roles/Antags/misc.yml b/Resources/Prototypes/_CP14/Roles/Antags/misc.yml index f772c5ff84..7884c9dc74 100644 --- a/Resources/Prototypes/_CP14/Roles/Antags/misc.yml +++ b/Resources/Prototypes/_CP14/Roles/Antags/misc.yml @@ -16,7 +16,7 @@ id: CP14Vampire name: cp14-roles-antag-vampire-name antagonist: true - setPreference: false #Impossible and boring gameplay ATM + setPreference: true objective: cp14-roles-antag-vampire-objective requirements: - !type:OverallPlaytimeRequirement @@ -27,6 +27,6 @@ id: CP14BloodMoonCursed name: cp14-roles-antag-blood-moon-cursed-name antagonist: true - setPreference: true + setPreference: false objective: cp14-roles-antag-blood-moon-cursed-objective diff --git a/Resources/Prototypes/_CP14/Roles/Antags/vampire_factions.yml b/Resources/Prototypes/_CP14/Roles/Antags/vampire_factions.yml new file mode 100644 index 0000000000..9b27c23aef --- /dev/null +++ b/Resources/Prototypes/_CP14/Roles/Antags/vampire_factions.yml @@ -0,0 +1,17 @@ +- type: cp14VampireFaction + id: Unnameable + name: cp14-vampire-fraction-name-unnameable + factionIcon: CP14VampireUnnameable + singletonTeleportKey: CP14VampirePortalGlyphUnnameable + +- type: cp14VampireFaction + id: Devourers + name: cp14-vampire-fraction-name-devourers + factionIcon: CP14VampireDevourers + singletonTeleportKey: CP14VampirePortalGlyphDevourers + +- type: cp14VampireFaction + id: NightChildrens + name: cp14-vampire-fraction-name-night-childrens + factionIcon: CP14VampireNightChildrens + singletonTeleportKey: CP14VampirePortalGlyphNightChildrens \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/alchemist.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/alchemist.yml index b29cda7980..5dcd6a9936 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/alchemist.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/alchemist.yml @@ -6,6 +6,7 @@ startingGear: CP14AlchemistGear icon: "CP14JobIconAlchemist" supervisors: cp14-job-supervisors-command + canBeAntag: false special: - !type:CP14LearnSkillsSpecial skills: diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/blacksmith.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/blacksmith.yml index e6861cf296..ebd4f216c5 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/blacksmith.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Artisan/blacksmith.yml @@ -6,6 +6,7 @@ startingGear: CP14BlacksmithGear icon: "CP14JobIconBlacksmith" supervisors: cp14-job-supervisors-command + canBeAntag: false special: - !type:CP14LearnSkillsSpecial skills: diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Guard/guard.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Guard/guard.yml index c962c3f5b8..8ae6350c75 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/Guard/guard.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Guard/guard.yml @@ -7,6 +7,7 @@ startingGear: CP14GuardGear icon: "CP14JobIconGuard" supervisors: cp14-job-supervisors-guard-commander + canBeAntag: false special: - !type:CP14LearnSkillsSpecial skills: diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Guard/investigator.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Guard/investigator.yml index 4f29c50967..a141fa2b9f 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/Guard/investigator.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Guard/investigator.yml @@ -7,6 +7,7 @@ startingGear: CP14InvestigatorGear icon: "CP14JobIconInvestigator" supervisors: cp14-job-supervisors-guard-commander + canBeAntag: false requirements: - !type:DepartmentTimeRequirement department: CP14Guard diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml index 5d40dd6ac8..eba06b0d63 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml @@ -7,6 +7,7 @@ startingGear: CP14MerchantGear icon: "CP14JobIconMerchant" supervisors: cp14-job-supervisors-commandant + canBeAntag: false requirements: - !type:OverallPlaytimeRequirement time: 3600 # 1 hours diff --git a/Resources/Prototypes/_CP14/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/_CP14/Roles/MindRoles/mind_roles.yml index a1cc22645c..725465bf05 100644 --- a/Resources/Prototypes/_CP14/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/_CP14/Roles/MindRoles/mind_roles.yml @@ -24,11 +24,9 @@ components: - type: MindRole antagPrototype: CP14Vampire - roleType: SoloAntagonist + roleType: TeamAntagonist exclusiveAntag: true - type: CP14VampireRole - - type: RoleBriefing - briefing: cp14-roles-antag-vampire-briefing - type: entity parent: BaseMindRoleAntag diff --git a/Resources/Prototypes/_CP14/Skill/Basic/healing.yml b/Resources/Prototypes/_CP14/Skill/Basic/healing.yml index f53439ee07..1433d7b28e 100644 --- a/Resources/Prototypes/_CP14/Skill/Basic/healing.yml +++ b/Resources/Prototypes/_CP14/Skill/Basic/healing.yml @@ -23,6 +23,8 @@ restrictions: - !type:NeedPrerequisite prerequisite: HealingT1 + - !type:SpeciesBlacklist + species: CP14Skeleton - type: cp14Skill id: CP14ActionSpellPlantGrowth @@ -98,6 +100,8 @@ restrictions: - !type:NeedPrerequisite prerequisite: HealingT2 + - !type:SpeciesBlacklist + species: CP14Skeleton - type: cp14Skill id: CP14ActionSpellCureWounds @@ -112,6 +116,8 @@ restrictions: - !type:NeedPrerequisite prerequisite: HealingT2 + - !type:SpeciesBlacklist + species: CP14Skeleton # T3 diff --git a/Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml b/Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml index f74c20b0d1..5f811e8597 100644 --- a/Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml +++ b/Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml @@ -23,6 +23,8 @@ restrictions: - !type:NeedPrerequisite prerequisite: PyrokineticT1 + - !type:SpeciesBlacklist + species: CP14Skeleton - type: cp14Skill id: CP14ActionSpellHeat @@ -102,6 +104,8 @@ restrictions: - !type:NeedPrerequisite prerequisite: PyrokineticT2 + - !type:SpeciesBlacklist + species: CP14Skeleton - type: cp14Skill id: CP14ActionSpellFirewave diff --git a/Resources/Prototypes/_CP14/Skill/Vampire/trees.yml b/Resources/Prototypes/_CP14/Skill/Vampire/trees.yml new file mode 100644 index 0000000000..ea79e392c8 --- /dev/null +++ b/Resources/Prototypes/_CP14/Skill/Vampire/trees.yml @@ -0,0 +1,7 @@ +- type: cp14SkillTree + id: Vampire + name: cp14-skill-tree-vampire-name + desc: cp14-skill-tree-vampire-desc + skillType: Blood + color: "#b01e34" + parallax: CP14Blood \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/Vampire/vampire.yml b/Resources/Prototypes/_CP14/Skill/Vampire/vampire.yml new file mode 100644 index 0000000000..f56f6877bd --- /dev/null +++ b/Resources/Prototypes/_CP14/Skill/Vampire/vampire.yml @@ -0,0 +1,271 @@ +# Offence + +- type: cp14Skill + id: Bite + skillUiPosition: 0, 2 + learnCost: 0 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: bite + effects: + - !type:AddAction + action: CP14ActionVampireBite + +- type: cp14Skill + id: Hypnosys + skillUiPosition: 2, 0 + learnCost: 0.5 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: blood_moon + effects: + - !type:AddAction + action: CP14ActionSpellVampireHypnosys + restrictions: + - !type:NeedPrerequisite + prerequisite: Bite + - !type:VampireClanLevel + level: 1 + +- type: cp14Skill + id: PowerKick + skillUiPosition: 6, 0 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick + effects: + - !type:AddAction + action: CP14ActionSpellVampirePower + restrictions: + - !type:NeedPrerequisite + prerequisite: Hypnosys + - !type:VampireClanLevel + level: 2 + +- type: cp14Skill + id: PowerKickArea + skillUiPosition: 10, 0 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick_3 + effects: + - !type:AddAction + action: CP14ActionSpellVampirePower3 + restrictions: + - !type:NeedPrerequisite + prerequisite: PowerKick + - !type:VampireClanLevel + level: 3 + +- type: cp14Skill + id: BloodStep + skillUiPosition: 6, 2 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: blood_step + effects: + - !type:AddAction + action: CP14ActionSpellVampireBloodStep + restrictions: + - !type:NeedPrerequisite + prerequisite: Bite + - !type:VampireClanLevel + level: 2 + +- type: cp14Skill + id: VampireNightVision + skillUiPosition: 2, 4 + name: cp14-skill-vampire-night-vision-name + desc: cp14-skill-vampire-night-vision-desc + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: night_vision + effects: + - !type:AddComponents + components: + - type: CP14NightVision + lightPrototype: CP14NightVisionVampire + actionPrototype: CP14ActionToggleNightVisionVampire + restrictions: + - !type:NeedPrerequisite + prerequisite: Bite + - !type:VampireClanLevel + level: 1 + +- type: cp14Skill + id: VampireEssenceVision + skillUiPosition: 6, 4 + name: cp14-skill-vampire-essence-vision-name + desc: cp14-skill-vampire-essence-vision-desc + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: essence_vision + effects: + - !type:AddComponents + components: + - type: CP14ShowVampireEssence + restrictions: + - !type:NeedPrerequisite + prerequisite: VampireNightVision + - !type:VampireClanLevel + level: 2 + +# Core + +- type: cp14Skill + id: VampireTransmutateUnnameable + skillUiPosition: 0, 6 + name: cp14-skill-vampire-transmutate-name + learnCost: 0 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: transmutation + effects: + - !type:UnlockRecipes + - !type:UnlockConstructions + restrictions: + - !type:VampireFaction + clan: Unnameable + +- type: cp14Skill + id: VampireTransmutateDevourers + skillUiPosition: 0, 6 + name: cp14-skill-vampire-transmutate-name + learnCost: 0 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: transmutation + effects: + - !type:UnlockRecipes + - !type:UnlockConstructions + restrictions: + - !type:VampireFaction + clan: Devourers + +- type: cp14Skill + id: VampireTransmutateNightChildrens + skillUiPosition: 0, 6 + name: cp14-skill-vampire-transmutate-name + learnCost: 0 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: transmutation + effects: + - !type:UnlockRecipes + - !type:UnlockConstructions + restrictions: + - !type:VampireFaction + clan: NightChildrens + +# Create + +- type: cp14Skill + id: BloodEssenceCreation + skillUiPosition: 0, 10 + learnCost: 0 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: essence_create + effects: + - !type:UnlockConstructions + - !type:AddAction + action: CP14ActionSpellBloodEssenceCreation + +- type: cp14Skill + id: BloodConnection + skillUiPosition: 2, 10 + learnCost: 0.5 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: search_clan + effects: + - !type:AddAction + action: CP14ActionSpellBloodConnection + restrictions: + - !type:NeedPrerequisite + prerequisite: BloodEssenceCreation + +- type: cp14Skill + id: VampireCureWounds + skillUiPosition: 6, 8 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: wound_heal + effects: + - !type:AddAction + action: CP14ActionSpellVampireCureWounds + restrictions: + - !type:NeedPrerequisite + prerequisite: BloodEssenceCreation + - !type:VampireClanLevel + level: 2 + +- type: cp14Skill + id: VampireResurrection + skillUiPosition: 10, 8 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: resurrection + effects: + - !type:AddAction + action: CP14ActionSpellVampireResurrection + restrictions: + - !type:NeedPrerequisite + prerequisite: VampireCureWounds + - !type:VampireClanLevel + level: 3 + +- type: cp14Skill + id: BloodEnemySearch + skillUiPosition: 10, 10 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: search_clan_enemy + effects: + - !type:AddAction + action: CP14ActionSpellBloodEnemySearch + restrictions: + - !type:NeedPrerequisite + prerequisite: BloodConnection + - !type:VampireClanLevel + level: 3 + +- type: cp14Skill + id: PortalToVampireHome + skillUiPosition: 2, 12 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: portal + effects: + - !type:AddAction + action: CP14ActionSpellPortalToVampireHome + restrictions: + - !type:NeedPrerequisite + prerequisite: BloodEssenceCreation + - !type:VampireClanLevel + level: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/points.yml b/Resources/Prototypes/_CP14/Skill/points.yml index c54995ea4f..b44ee29ce4 100644 --- a/Resources/Prototypes/_CP14/Skill/points.yml +++ b/Resources/Prototypes/_CP14/Skill/points.yml @@ -1,6 +1,8 @@ - type: cp14SkillPoint id: Memory name: cp14-skill-point-memory + getPointPopup: cp14-skill-popup-memory-added + losePointPopup: cp14-skill-popup-memory-losed icon: sprite: _CP14/Interface/Misc/skill_point.rsi state: exp @@ -8,6 +10,8 @@ - type: cp14SkillPoint id: Blood name: cp14-skill-point-vampire-blood + getPointPopup: cp14-skill-popup-blood-added + losePointPopup: cp14-skill-popup-blood-losed icon: sprite: _CP14/Interface/Misc/skill_point.rsi state: blood \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/SoundCollections/misc.yml b/Resources/Prototypes/_CP14/SoundCollections/misc.yml index 032f7c7b7a..2e10e044be 100644 --- a/Resources/Prototypes/_CP14/SoundCollections/misc.yml +++ b/Resources/Prototypes/_CP14/SoundCollections/misc.yml @@ -5,6 +5,7 @@ - /Audio/_CP14/Lobby/crystal.ogg - /Audio/_CP14/Lobby/eldermourne.ogg - /Audio/_CP14/Lobby/arcane_winds.ogg + - /Audio/_CP14/Lobby/blood_fog.ogg - type: soundCollection id: CP14DemiplaneIntro diff --git a/Resources/Prototypes/_CP14/Species/skeleton.yml b/Resources/Prototypes/_CP14/Species/skeleton.yml index f59443f137..99cdf8d49c 100644 --- a/Resources/Prototypes/_CP14/Species/skeleton.yml +++ b/Resources/Prototypes/_CP14/Species/skeleton.yml @@ -1,6 +1,6 @@ - type: species id: CP14Skeleton - name: cp14-species-name-human + name: cp14-species-name-skeleton roundStart: false prototype: CP14BaseMobSkeleton sprites: CP14MobSkeletonSprites diff --git a/Resources/Prototypes/_CP14/Stacks/materials.yml b/Resources/Prototypes/_CP14/Stacks/materials.yml index 5f49f7027c..86833b1d41 100644 --- a/Resources/Prototypes/_CP14/Stacks/materials.yml +++ b/Resources/Prototypes/_CP14/Stacks/materials.yml @@ -137,3 +137,10 @@ icon: { sprite: "_CP14/Objects/Ingredients/hide.rsi", state: rugged_hide1 } spawn: CP14RuggedLeather1 maxCount: 5 + +- type: stack + id: CP14BloodEssence + name: cp14-stack-blood-essence + icon: { sprite: "_CP14/Objects/Materials/blood_essence.rsi", state: drop } + spawn: CP14BloodEssence + maxCount: 10 diff --git a/Resources/Prototypes/_CP14/StatusIcon/vampire.yml b/Resources/Prototypes/_CP14/StatusIcon/vampire.yml new file mode 100644 index 0000000000..87e8afb5b1 --- /dev/null +++ b/Resources/Prototypes/_CP14/StatusIcon/vampire.yml @@ -0,0 +1,29 @@ +- type: factionIcon + abstract: true + id: CP14VampireFaction + priority: 11 + locationPreference: Left + showTo: + components: + - CP14Vampire + +- type: factionIcon + id: CP14VampireNightChildrens + parent: CP14VampireFaction + icon: + sprite: /Textures/_CP14/Interface/Misc/vampire_icons.rsi + state: NightChildrens + +- type: factionIcon + id: CP14VampireUnnameable + parent: CP14VampireFaction + icon: + sprite: /Textures/_CP14/Interface/Misc/vampire_icons.rsi + state: Unnameable + +- type: factionIcon + id: CP14VampireDevourers + parent: CP14VampireFaction + icon: + sprite: /Textures/_CP14/Interface/Misc/vampire_icons.rsi + state: Devourers diff --git a/Resources/Prototypes/_CP14/Tags/misc.yml b/Resources/Prototypes/_CP14/Tags/misc.yml index cf6f114a77..ed6dda587c 100644 --- a/Resources/Prototypes/_CP14/Tags/misc.yml +++ b/Resources/Prototypes/_CP14/Tags/misc.yml @@ -37,24 +37,6 @@ - type: Tag id: CP14InkwellFittable -- type: Tag - id: CP14RecipeSewing - -- type: Tag - id: CP14RecipeCooking - -- type: Tag - id: CP14RecipeWorkbench - -- type: Tag - id: CP14RecipeAnvil - -- type: Tag - id: CP14RecipeMeltingFurnace - -- type: Tag - id: CP14RecipeLeatherWorking - - type: Tag id: CP14Rabbit diff --git a/Resources/Prototypes/_CP14/Tags/recipe.yml b/Resources/Prototypes/_CP14/Tags/recipe.yml new file mode 100644 index 0000000000..c18b9075ca --- /dev/null +++ b/Resources/Prototypes/_CP14/Tags/recipe.yml @@ -0,0 +1,21 @@ +- type: Tag + id: CP14RecipeSewing + +- type: Tag + id: CP14RecipeCooking + +- type: Tag + id: CP14RecipeWorkbench + +- type: Tag + id: CP14RecipeAnvil + +- type: Tag + id: CP14RecipeMeltingFurnace + +- type: Tag + id: CP14RecipeLeatherWorking + +- type: Tag + id: CP14RecipeVampire + \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Tiles/grass.yml b/Resources/Prototypes/_CP14/Tiles/grass.yml new file mode 100644 index 0000000000..7612a90d64 --- /dev/null +++ b/Resources/Prototypes/_CP14/Tiles/grass.yml @@ -0,0 +1,191 @@ +- type: tile + id: CP14FloorGrass + editorHidden: false + name: cp14-tiles-grass + sprite: /Textures/_CP14/Tiles/Grass/grass.png + variants: 6 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + edgeSpritePriority: 6 + edgeSprites: + SouthEast: /Textures/_CP14/Tiles/Grass/single_edge_SE.png + NorthEast: /Textures/_CP14/Tiles/Grass/single_edge_NE.png + NorthWest: /Textures/_CP14/Tiles/Grass/single_edge_NW.png + SouthWest: /Textures/_CP14/Tiles/Grass/single_edge_SW.png + South: /Textures/_CP14/Tiles/Grass/double_edge_S.png + East: /Textures/_CP14/Tiles/Grass/double_edge_E.png + North: /Textures/_CP14/Tiles/Grass/double_edge_N.png + West: /Textures/_CP14/Tiles/Grass/double_edge_W.png + baseTurf: CP14FloorDirt + deconstructTools: [ CP14Digging ] + itemDrop: CP14RandomDirtLootSpawner + isSubfloor: false + footstepSounds: + collection: FootstepGrass + heatCapacity: 10000 + weather: true + +- type: tile + id: CP14FloorGrassLight + editorHidden: false + name: cp14-tiles-grass-light + sprite: /Textures/_CP14/Tiles/GrassLight/grass.png + variants: 6 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + edgeSpritePriority: 7 + edgeSprites: + SouthEast: /Textures/_CP14/Tiles/GrassLight/single_edge_SE.png + NorthEast: /Textures/_CP14/Tiles/GrassLight/single_edge_NE.png + NorthWest: /Textures/_CP14/Tiles/GrassLight/single_edge_NW.png + SouthWest: /Textures/_CP14/Tiles/GrassLight/single_edge_SW.png + South: /Textures/_CP14/Tiles/GrassLight/double_edge_S.png + East: /Textures/_CP14/Tiles/GrassLight/double_edge_E.png + North: /Textures/_CP14/Tiles/GrassLight/double_edge_N.png + West: /Textures/_CP14/Tiles/GrassLight/double_edge_W.png + baseTurf: CP14FloorDirt + deconstructTools: [ CP14Digging ] + itemDrop: CP14RandomDirtLootSpawner + isSubfloor: false + footstepSounds: + collection: FootstepGrass + heatCapacity: 10000 + weather: true + +- type: tile + id: CP14FloorGrassTall + editorHidden: false + name: cp14-tiles-grass-tall + sprite: /Textures/_CP14/Tiles/GrassTall/grass.png + variants: 6 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + edgeSpritePriority: 8 + edgeSprites: + SouthEast: /Textures/_CP14/Tiles/GrassTall/single_edge_SE.png + NorthEast: /Textures/_CP14/Tiles/GrassTall/single_edge_NE.png + NorthWest: /Textures/_CP14/Tiles/GrassTall/single_edge_NW.png + SouthWest: /Textures/_CP14/Tiles/GrassTall/single_edge_SW.png + South: /Textures/_CP14/Tiles/GrassTall/double_edge_S.png + East: /Textures/_CP14/Tiles/GrassTall/double_edge_E.png + North: /Textures/_CP14/Tiles/GrassTall/double_edge_N.png + West: /Textures/_CP14/Tiles/GrassTall/double_edge_W.png + baseTurf: CP14FloorDirt + deconstructTools: [ CP14Digging ] + itemDrop: CP14RandomDirtLootSpawner + isSubfloor: false + footstepSounds: + collection: FootstepGrass + heatCapacity: 10000 + weather: true + +- type: tile + id: CP14FloorGrassBlood + editorHidden: false + name: cp14-tiles-bloodgrass + sprite: /Textures/_CP14/Tiles/GrassBlood/grass.png + variants: 6 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + edgeSpritePriority: 7 + edgeSprites: + SouthEast: /Textures/_CP14/Tiles/GrassBlood/single_edge_SE.png + NorthEast: /Textures/_CP14/Tiles/GrassBlood/single_edge_NE.png + NorthWest: /Textures/_CP14/Tiles/GrassBlood/single_edge_NW.png + SouthWest: /Textures/_CP14/Tiles/GrassBlood/single_edge_SW.png + South: /Textures/_CP14/Tiles/GrassBlood/double_edge_S.png + East: /Textures/_CP14/Tiles/GrassBlood/double_edge_E.png + North: /Textures/_CP14/Tiles/GrassBlood/double_edge_N.png + West: /Textures/_CP14/Tiles/GrassBlood/double_edge_W.png + baseTurf: CP14FloorDirt + deconstructTools: [ CP14Digging ] + itemDrop: CP14RandomDirtLootSpawner + isSubfloor: false + footstepSounds: + collection: FootstepGrass + heatCapacity: 10000 + weather: true + +- type: tile + id: CP14FloorGrassLightBlood + editorHidden: false + name: cp14-tiles-bloodgrass-light + sprite: /Textures/_CP14/Tiles/GrassBloodLight/grass.png + variants: 6 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + edgeSpritePriority: 8 + edgeSprites: + SouthEast: /Textures/_CP14/Tiles/GrassBloodLight/single_edge_SE.png + NorthEast: /Textures/_CP14/Tiles/GrassBloodLight/single_edge_NE.png + NorthWest: /Textures/_CP14/Tiles/GrassBloodLight/single_edge_NW.png + SouthWest: /Textures/_CP14/Tiles/GrassBloodLight/single_edge_SW.png + South: /Textures/_CP14/Tiles/GrassBloodLight/double_edge_S.png + East: /Textures/_CP14/Tiles/GrassBloodLight/double_edge_E.png + North: /Textures/_CP14/Tiles/GrassBloodLight/double_edge_N.png + West: /Textures/_CP14/Tiles/GrassBloodLight/double_edge_W.png + baseTurf: CP14FloorDirt + deconstructTools: [ CP14Digging ] + itemDrop: CP14RandomDirtLootSpawner + isSubfloor: false + footstepSounds: + collection: FootstepGrass + heatCapacity: 10000 + weather: true + +- type: tile + id: CP14FloorGrassTallBlood + editorHidden: false + name: cp14-tiles-bloodgrass-tall + sprite: /Textures/_CP14/Tiles/GrassBloodTall/grass.png + variants: 6 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + - 1.0 + edgeSpritePriority: 9 + edgeSprites: + SouthEast: /Textures/_CP14/Tiles/GrassBloodTall/single_edge_SE.png + NorthEast: /Textures/_CP14/Tiles/GrassBloodTall/single_edge_NE.png + NorthWest: /Textures/_CP14/Tiles/GrassBloodTall/single_edge_NW.png + SouthWest: /Textures/_CP14/Tiles/GrassBloodTall/single_edge_SW.png + South: /Textures/_CP14/Tiles/GrassBloodTall/double_edge_S.png + East: /Textures/_CP14/Tiles/GrassBloodTall/double_edge_E.png + North: /Textures/_CP14/Tiles/GrassBloodTall/double_edge_N.png + West: /Textures/_CP14/Tiles/GrassBloodTall/double_edge_W.png + baseTurf: CP14FloorDirt + deconstructTools: [ CP14Digging ] + itemDrop: CP14RandomDirtLootSpawner + isSubfloor: false + footstepSounds: + collection: FootstepGrass + heatCapacity: 10000 + weather: true diff --git a/Resources/Prototypes/_CP14/Tiles/natural.yml b/Resources/Prototypes/_CP14/Tiles/natural.yml index f1ec125045..5108fa900c 100644 --- a/Resources/Prototypes/_CP14/Tiles/natural.yml +++ b/Resources/Prototypes/_CP14/Tiles/natural.yml @@ -223,102 +223,6 @@ heatCapacity: 10000 weather: true -- type: tile - id: CP14FloorGrass - editorHidden: false - name: cp14-tiles-grass - sprite: /Textures/_CP14/Tiles/Grass/grass.png - variants: 6 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - edgeSpritePriority: 6 - edgeSprites: - SouthEast: /Textures/_CP14/Tiles/Grass/single_edge_SE.png - NorthEast: /Textures/_CP14/Tiles/Grass/single_edge_NE.png - NorthWest: /Textures/_CP14/Tiles/Grass/single_edge_NW.png - SouthWest: /Textures/_CP14/Tiles/Grass/single_edge_SW.png - South: /Textures/_CP14/Tiles/Grass/double_edge_S.png - East: /Textures/_CP14/Tiles/Grass/double_edge_E.png - North: /Textures/_CP14/Tiles/Grass/double_edge_N.png - West: /Textures/_CP14/Tiles/Grass/double_edge_W.png - baseTurf: CP14FloorDirt - deconstructTools: [ CP14Digging ] - itemDrop: CP14RandomDirtLootSpawner - isSubfloor: false - footstepSounds: - collection: FootstepGrass - heatCapacity: 10000 - weather: true - -- type: tile - id: CP14FloorGrassLight - editorHidden: false - name: cp14-tiles-grass-light - sprite: /Textures/_CP14/Tiles/GrassLight/grass.png - variants: 6 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - edgeSpritePriority: 7 - edgeSprites: - SouthEast: /Textures/_CP14/Tiles/GrassLight/single_edge_SE.png - NorthEast: /Textures/_CP14/Tiles/GrassLight/single_edge_NE.png - NorthWest: /Textures/_CP14/Tiles/GrassLight/single_edge_NW.png - SouthWest: /Textures/_CP14/Tiles/GrassLight/single_edge_SW.png - South: /Textures/_CP14/Tiles/GrassLight/double_edge_S.png - East: /Textures/_CP14/Tiles/GrassLight/double_edge_E.png - North: /Textures/_CP14/Tiles/GrassLight/double_edge_N.png - West: /Textures/_CP14/Tiles/GrassLight/double_edge_W.png - baseTurf: CP14FloorDirt - deconstructTools: [ CP14Digging ] - itemDrop: CP14RandomDirtLootSpawner - isSubfloor: false - footstepSounds: - collection: FootstepGrass - heatCapacity: 10000 - weather: true - -- type: tile - id: CP14FloorGrassTall - editorHidden: false - name: cp14-tiles-grass-tall - sprite: /Textures/_CP14/Tiles/GrassTall/grass.png - variants: 6 - placementVariants: - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - - 1.0 - edgeSpritePriority: 8 - edgeSprites: - SouthEast: /Textures/_CP14/Tiles/GrassTall/single_edge_SE.png - NorthEast: /Textures/_CP14/Tiles/GrassTall/single_edge_NE.png - NorthWest: /Textures/_CP14/Tiles/GrassTall/single_edge_NW.png - SouthWest: /Textures/_CP14/Tiles/GrassTall/single_edge_SW.png - South: /Textures/_CP14/Tiles/GrassTall/double_edge_S.png - East: /Textures/_CP14/Tiles/GrassTall/double_edge_E.png - North: /Textures/_CP14/Tiles/GrassTall/double_edge_N.png - West: /Textures/_CP14/Tiles/GrassTall/double_edge_W.png - baseTurf: CP14FloorDirt - deconstructTools: [ CP14Digging ] - itemDrop: CP14RandomDirtLootSpawner - isSubfloor: false - footstepSounds: - collection: FootstepGrass - heatCapacity: 10000 - weather: true - - type: tile id: CP14FloorSnowDeepDeep editorHidden: false diff --git a/Resources/Prototypes/_CP14/contraband_severities.yml b/Resources/Prototypes/_CP14/contraband_severities.yml new file mode 100644 index 0000000000..1230dcd5f8 --- /dev/null +++ b/Resources/Prototypes/_CP14/contraband_severities.yml @@ -0,0 +1,7 @@ +- type: contrabandSeverity + id: CP14Minor + examineText: cp14-contraband-examine-text-CP14Minor + +- type: contrabandSeverity + id: CP14Major + examineText: cp14-contraband-examine-text-CP14Major \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/game_presets.yml b/Resources/Prototypes/_CP14/game_presets.yml index 562e656b0a..3ecb89fb54 100644 --- a/Resources/Prototypes/_CP14/game_presets.yml +++ b/Resources/Prototypes/_CP14/game_presets.yml @@ -19,20 +19,29 @@ showInVote: false cP14Allowed: true rules: - #- CP14RoundObjectivesRule - CP14BasicStationEventScheduler - Sandbox - type: gamePreset - id: CP14Greenshift - name: greenshift-title - description: greenshift-description + id: CP14Peaceful + name: cp14-peaceful-title + description: cp14-peaceful-description showInVote: true cP14Allowed: true rules: - #- CP14RoundObjectivesRule - CP14BasicStationEventScheduler +- type: gamePreset + id: CP14VampireClansBattle + name: cp14-vampire-clans-battle + description: cp14-vampire-clans-description + showInVote: true + cP14Allowed: true + minPlayers: 20 + rules: + - CP14BasicStationEventScheduler + - CP14GameRuleVampireClanBattle + #- type: gamePreset # id: CP14Survival # name: cp14-gamemode-survival-title diff --git a/Resources/Prototypes/_CP14/secret_weights.yml b/Resources/Prototypes/_CP14/secret_weights.yml index f87934575b..8e8263f605 100644 --- a/Resources/Prototypes/_CP14/secret_weights.yml +++ b/Resources/Prototypes/_CP14/secret_weights.yml @@ -1,6 +1,5 @@ - type: weightedRandom id: Secret weights: - CP14Sandbox: 0 - CP14Greenshift: 1 - + CP14Peaceful: 0.5 + CP14VampireClansBattle: 0.5 \ No newline at end of file diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/essence_create.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/essence_create.png new file mode 100644 index 0000000000..93cf6ac601 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/essence_create.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/essence_vision.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/essence_vision.png new file mode 100644 index 0000000000..dceff57333 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/essence_vision.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/meta.json b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/meta.json index dd76d26e6d..b5e3b3434f 100644 --- a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/meta.json +++ b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/meta.json @@ -15,6 +15,48 @@ }, { "name": "blood_step" + }, + { + "name": "essence_create" + }, + { + "name": "essence_vision" + }, + { + "name": "night_vision" + }, + { + "name": "portal" + }, + { + "name": "power_kick" + }, + { + "name": "power_kick_2" + }, + { + "name": "power_kick_3" + }, + { + "name": "resurrection" + }, + { + "name": "search_clan" + }, + { + "name": "search_clan_enemy" + }, + { + "name": "toggle" + }, + { + "name": "transmutation" + }, + { + "name": "tree" + }, + { + "name": "wound_heal" } ] } \ No newline at end of file diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/night_vision.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/night_vision.png new file mode 100644 index 0000000000..49ee062daa Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/night_vision.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/portal.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/portal.png new file mode 100644 index 0000000000..e65770ab5a Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/portal.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick.png new file mode 100644 index 0000000000..2671856072 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick_2.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick_2.png new file mode 100644 index 0000000000..535967bc01 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick_2.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick_3.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick_3.png new file mode 100644 index 0000000000..fb1b62e31b Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/power_kick_3.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/resurrection.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/resurrection.png new file mode 100644 index 0000000000..4a7515991d Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/resurrection.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/search_clan.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/search_clan.png new file mode 100644 index 0000000000..bdb5d2362e Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/search_clan.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/search_clan_enemy.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/search_clan_enemy.png new file mode 100644 index 0000000000..73b038eb4b Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/search_clan_enemy.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/toggle.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/toggle.png new file mode 100644 index 0000000000..30898cd8d5 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/toggle.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/transmutation.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/transmutation.png new file mode 100644 index 0000000000..e3569e5204 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/transmutation.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/tree.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/tree.png new file mode 100644 index 0000000000..e0cafb8f6f Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/tree.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/wound_heal.png b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/wound_heal.png new file mode 100644 index 0000000000..9fa82f218f Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/vampire.rsi/wound_heal.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/equipped-CLOAK.png b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/equipped-CLOAK.png new file mode 100644 index 0000000000..e42bde7f59 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/equipped-CLOAK.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/icon.png new file mode 100644 index 0000000000..b0dfd06d86 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/meta.json new file mode 100644 index 0000000000..936e465a96 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/blue.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by omsoyk", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-CLOAK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/equipped-CLOAK.png b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/equipped-CLOAK.png new file mode 100644 index 0000000000..52d0ac0081 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/equipped-CLOAK.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/icon.png new file mode 100644 index 0000000000..e4bfd8c393 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/meta.json new file mode 100644 index 0000000000..936e465a96 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/red.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by omsoyk", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-CLOAK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/equipped-CLOAK.png b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/equipped-CLOAK.png new file mode 100644 index 0000000000..e1d13d6a0a Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/equipped-CLOAK.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/icon.png new file mode 100644 index 0000000000..6b8fb54ba1 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/meta.json new file mode 100644 index 0000000000..936e465a96 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Cloak/Vampire/white.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by omsoyk", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-CLOAK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/equipped-MASK.png b/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/equipped-MASK.png new file mode 100644 index 0000000000..fb8d29a849 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/icon.png new file mode 100644 index 0000000000..405414938e Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/meta.json new file mode 100644 index 0000000000..86a461aef8 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Masks/vampire_devourers.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/equipped-MASK.png b/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/equipped-MASK.png new file mode 100644 index 0000000000..adde30033f Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/icon.png new file mode 100644 index 0000000000..abdecbc4e7 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/meta.json new file mode 100644 index 0000000000..86a461aef8 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Masks/vampire_night_childrens.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/equipped-MASK.png b/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/equipped-MASK.png new file mode 100644 index 0000000000..86e78c1dcb Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/icon.png new file mode 100644 index 0000000000..472664b37b Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/meta.json new file mode 100644 index 0000000000..86a461aef8 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Masks/vampire_unnameable.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst.png b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst.png new file mode 100644 index 0000000000..b2c089315f Binary files /dev/null and b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst.png differ diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst2.png b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst2.png new file mode 100644 index 0000000000..00957f02ee Binary files /dev/null and b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst2.png differ diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst_in.png b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst_in.png new file mode 100644 index 0000000000..e02a2b5951 Binary files /dev/null and b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/burst_in.png differ diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/meta.json b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/meta.json new file mode 100644 index 0000000000..f9b06d48ae --- /dev/null +++ b/Resources/Textures/_CP14/Effects/Magic/cast_impact32.rsi/meta.json @@ -0,0 +1,122 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd", + "states": [ + { + "name": "burst", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "burst_in", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "burst2", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/Devourers.png b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/Devourers.png new file mode 100644 index 0000000000..5541af2e9f Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/Devourers.png differ diff --git a/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/NightChildrens.png b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/NightChildrens.png new file mode 100644 index 0000000000..a352910009 Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/NightChildrens.png differ diff --git a/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/Unnameable.png b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/Unnameable.png new file mode 100644 index 0000000000..829a4ca8d5 Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/Unnameable.png differ diff --git a/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/meta.json b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/meta.json new file mode 100644 index 0000000000..255bee6965 --- /dev/null +++ b/Resources/Textures/_CP14/Interface/Misc/vampire_icons.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "size": { + "x": 9, + "y": 9 + }, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (Github)", + "states": [ + { + "name": "Devourers" + }, + { + "name": "NightChildrens" + }, + { + "name": "Unnameable" + } + ] +} diff --git a/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/dead.png b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/dead.png new file mode 100644 index 0000000000..594a6eb4ef Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/dead.png differ diff --git a/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/dead_spikes.png b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/dead_spikes.png new file mode 100644 index 0000000000..100de0b63b Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/dead_spikes.png differ diff --git a/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/live.png b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/live.png new file mode 100644 index 0000000000..d943e59928 Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/live.png differ diff --git a/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/live_spikes.png b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/live_spikes.png new file mode 100644 index 0000000000..c98cd0c71a Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/live_spikes.png differ diff --git a/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/meta.json b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/meta.json new file mode 100644 index 0000000000..24ce6af3e5 --- /dev/null +++ b/Resources/Textures/_CP14/Mobs/Monster/cackle.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "size": { + "x": 48, + "y": 48 + }, + "license": "All right reserved", + "copyright": "Created by Frogoo (discord)", + "states": [ + { + "name": "live", + "directions": 4 + }, + { + "name": "live_spikes", + "directions": 4 + }, + { + "name": "dead" + }, + { + "name": "dead_spikes" + } + ] +} diff --git a/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/carcat.png b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/carcat.png new file mode 100644 index 0000000000..a724fc4e69 Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/carcat.png differ diff --git a/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json index 0635f3bb06..0f84a2b7e8 100644 --- a/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json +++ b/Resources/Textures/_CP14/Mobs/Species/Vampire/fangs.rsi/meta.json @@ -14,6 +14,10 @@ { "name": "goblin", "directions": 4 + }, + { + "name": "carcat", + "directions": 4 } ] } diff --git a/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/icon_religion.png b/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/icon_religion.png new file mode 100644 index 0000000000..d75b56f587 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/icon_religion.png differ diff --git a/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/meta.json b/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/meta.json index 5a13386bdc..74bbc5c59a 100644 --- a/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/meta.json +++ b/Resources/Textures/_CP14/Objects/Bureaucracy/books.rsi/meta.json @@ -34,6 +34,9 @@ { "name": "icon_moon" }, + { + "name": "icon_religion" + }, { "name": "icon_text" }, diff --git a/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/drop.png b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/drop.png new file mode 100644 index 0000000000..bd779335aa Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/drop.png differ diff --git a/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/inhand-left.png b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/inhand-left.png new file mode 100644 index 0000000000..1b64cb1a4d Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/inhand-left.png differ diff --git a/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/inhand-right.png new file mode 100644 index 0000000000..5d91232b72 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/inhand-right.png differ diff --git a/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/meta.json b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/meta.json new file mode 100644 index 0000000000..4fcb6a6e17 --- /dev/null +++ b/Resources/Textures/_CP14/Objects/Materials/blood_essence.rsi/meta.json @@ -0,0 +1,86 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "created by TheShuEd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "drop", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/blood.png b/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/blood.png new file mode 100644 index 0000000000..8f5e78cc9b Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/blood.png differ diff --git a/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/blood_fire.png b/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/blood_fire.png new file mode 100644 index 0000000000..237e37cf9b Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/blood_fire.png differ diff --git a/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/meta.json b/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/meta.json index e69499f7ee..239ceabc08 100644 --- a/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/meta.json +++ b/Resources/Textures/_CP14/Objects/Misc/candelabra.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-4.0", - "copyright": "Created by vladimir.s", + "copyright": "Created by vladimir.s, blood variant recolored by TheShuEd", "size": { "x": 32, "y": 40 @@ -10,6 +10,9 @@ { "name": "triple" }, + { + "name": "blood" + }, { "name": "triple_fire", "delays": [ @@ -20,6 +23,17 @@ 0.2 ] ] + }, + { + "name": "blood_fire", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] } ] } diff --git a/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood1.png b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood1.png new file mode 100644 index 0000000000..3fd8333f0e Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood1.png differ diff --git a/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood2.png b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood2.png new file mode 100644 index 0000000000..4cecfd0f41 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood2.png differ diff --git a/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood3.png b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood3.png new file mode 100644 index 0000000000..b6e9aa452d Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood3.png differ diff --git a/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood_fire.png b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood_fire.png new file mode 100644 index 0000000000..877e4eec5b Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/blood_fire.png differ diff --git a/Resources/Textures/_CP14/Objects/Misc/candles.rsi/meta.json b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/meta.json index cc3446d0dd..cfc220defa 100644 --- a/Resources/Textures/_CP14/Objects/Misc/candles.rsi/meta.json +++ b/Resources/Textures/_CP14/Objects/Misc/candles.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-4.0", - "copyright": "Created by vladimir.s", + "copyright": "Created by vladimir.s, blood variants recolored by TheShuEd", "size": { "x": 20, "y": 20 @@ -16,6 +16,15 @@ { "name": "small3" }, + { + "name": "blood1" + }, + { + "name": "blood2" + }, + { + "name": "blood3" + }, { "name": "small_fire", "delays": [ @@ -26,6 +35,17 @@ 0.2 ] ] + }, + { + "name": "blood_fire", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] } ] } diff --git a/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/meta.json b/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/meta.json new file mode 100644 index 0000000000..64c96e3a19 --- /dev/null +++ b/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "All right reserved", + "copyright": "Created by Frogoo(discord)", + "states": [ + { + "name": "spike" + }, + { + "name": "small_spike" + } + ] +} diff --git a/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/small_spike.png b/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/small_spike.png new file mode 100644 index 0000000000..5cf9ab318a Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/small_spike.png differ diff --git a/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/spike.png b/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/spike.png new file mode 100644 index 0000000000..581e316b27 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Weapons/Ranged/Projectiles/spike_cackle.rsi/spike.png differ diff --git a/Resources/Textures/_CP14/Parallaxes/BloodBG.png b/Resources/Textures/_CP14/Parallaxes/BloodBG.png new file mode 100644 index 0000000000..bfddcd88da Binary files /dev/null and b/Resources/Textures/_CP14/Parallaxes/BloodBG.png differ diff --git a/Resources/Textures/_CP14/Parallaxes/attributions.yml b/Resources/Textures/_CP14/Parallaxes/attributions.yml index aa0d4ab8db..506d70698e 100644 --- a/Resources/Textures/_CP14/Parallaxes/attributions.yml +++ b/Resources/Textures/_CP14/Parallaxes/attributions.yml @@ -3,7 +3,7 @@ copyright: "Created by TheShuEd" source: "https://github.com/crystallpunk-14/crystall-punk-14" -- files: ["ocean.png", "ocean_overlay.png", "ocean_overlay2.png"] +- files: ["BloodBG.png"] license: "CC0-1.0" - copyright: "Created by TheShuEd" - source: "https://github.com/space-syndicate/space-station-14/pull/1938" + copyright: "adapted from Screaming Brain Studios, recolored by TheShuEd" + source: "https://opengameart.org/content/seamless-space-backgrounds" \ No newline at end of file diff --git a/Resources/Textures/_CP14/Parallaxes/ocean.png b/Resources/Textures/_CP14/Parallaxes/ocean.png deleted file mode 100644 index c27d47f581..0000000000 Binary files a/Resources/Textures/_CP14/Parallaxes/ocean.png and /dev/null differ diff --git a/Resources/Textures/_CP14/Parallaxes/ocean_overlay.png b/Resources/Textures/_CP14/Parallaxes/ocean_overlay.png deleted file mode 100644 index 00f7561086..0000000000 Binary files a/Resources/Textures/_CP14/Parallaxes/ocean_overlay.png and /dev/null differ diff --git a/Resources/Textures/_CP14/Parallaxes/ocean_overlay2.png b/Resources/Textures/_CP14/Parallaxes/ocean_overlay2.png deleted file mode 100644 index c3a6e46dd0..0000000000 Binary files a/Resources/Textures/_CP14/Parallaxes/ocean_overlay2.png and /dev/null differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/1.png b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/1.png new file mode 100644 index 0000000000..46b1f90e5c Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/1.png differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/2.png b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/2.png new file mode 100644 index 0000000000..e4881fa5a7 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/2.png differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/3.png b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/3.png new file mode 100644 index 0000000000..b31d91dc6d Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/3.png differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/4.png b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/4.png new file mode 100644 index 0000000000..bd594db158 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/4.png differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/5.png b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/5.png new file mode 100644 index 0000000000..c388304a8b Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/5.png differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/6.png b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/6.png new file mode 100644 index 0000000000..3973d538c4 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/6.png differ diff --git a/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/meta.json b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/meta.json new file mode 100644 index 0000000000..19829d1de0 --- /dev/null +++ b/Resources/Textures/_CP14/Structures/Flora/tree_vampire.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Generated by ChatGPT + polished by TheShuEd and Omsoyk", + "size": { + "x": 96, + "y": 112 + }, + "states": [ + { + "name": "1" + }, + { + "name": "2" + }, + { + "name": "3" + }, + { + "name": "4" + }, + { + "name": "5" + }, + { + "name": "6" + } + ] +} diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/base.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/base.png new file mode 100644 index 0000000000..244d9753a9 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/base.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/fx.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/fx.png new file mode 100644 index 0000000000..e596ecc14c Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/fx.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/meta.json new file mode 100644 index 0000000000..f585dbf35d --- /dev/null +++ b/Resources/Textures/_CP14/Structures/Specific/Vampire/altar.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by TheShuEd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base" + }, + { + "name": "fx", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/base.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/base.png new file mode 100644 index 0000000000..8ec8faf914 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/base.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/childrens.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/childrens.png new file mode 100644 index 0000000000..e82c4bff1e Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/childrens.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/devourers.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/devourers.png new file mode 100644 index 0000000000..99f293401d Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/devourers.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/frame.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/frame.png new file mode 100644 index 0000000000..15f603b795 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/frame.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/meta.json new file mode 100644 index 0000000000..7e5de364c9 --- /dev/null +++ b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by TheShuEd", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "frame" + }, + { + "name": "base" + }, + { + "name": "childrens" + }, + { + "name": "devourers" + }, + { + "name": "unnameable" + } + ] +} diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/unnameable.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/unnameable.png new file mode 100644 index 0000000000..41502629c1 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart.rsi/unnameable.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/meta.json new file mode 100644 index 0000000000..44a662344c --- /dev/null +++ b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/meta.json @@ -0,0 +1,44 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Created by TheShuEd (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "orb1", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "orb2", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "orb3", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb1.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb1.png new file mode 100644 index 0000000000..3093dc414c Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb1.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb2.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb2.png new file mode 100644 index 0000000000..45438503cc Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb2.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb3.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb3.png new file mode 100644 index 0000000000..0f04753892 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/heart_orb.rsi/orb3.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/base.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/base.png new file mode 100644 index 0000000000..7dd43daacf Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/base.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/fx.png b/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/fx.png new file mode 100644 index 0000000000..71cbd1dbb3 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/fx.png differ diff --git a/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/meta.json new file mode 100644 index 0000000000..25daa3474f --- /dev/null +++ b/Resources/Textures/_CP14/Structures/Specific/Vampire/workbench.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by TheShuEd", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "base" + }, + { + "name": "fx", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/attribution.yml b/Resources/Textures/_CP14/Tiles/GrassBlood/attribution.yml new file mode 100644 index 0000000000..60be04fe4f --- /dev/null +++ b/Resources/Textures/_CP14/Tiles/GrassBlood/attribution.yml @@ -0,0 +1,13 @@ +- files: + - grass.png + - double_edge_E.png + - double_edge_N.png + - double_edge_S.png + - double_edge_W.png + - single_edge_NE.png + - single_edge_NW.png + - single_edge_SE.png + - single_edge_SW.png + license: "CC-BY-SA-3.0" + copyright: "Created by TheShuEd " + source: "https://github.com/crystallpunk-14/crystall-punk-14/pull/290" diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_E.png b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_E.png new file mode 100644 index 0000000000..78e0443a02 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_E.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_N.png b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_N.png new file mode 100644 index 0000000000..8cbb4d1b80 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_N.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_S.png b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_S.png new file mode 100644 index 0000000000..47a7887d2a Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_S.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_W.png b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_W.png new file mode 100644 index 0000000000..f93c2294a2 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/double_edge_W.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/grass.png b/Resources/Textures/_CP14/Tiles/GrassBlood/grass.png new file mode 100644 index 0000000000..e526cbf221 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/grass.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_NE.png b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_NE.png new file mode 100644 index 0000000000..4d51a4480b Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_NE.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_NW.png b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_NW.png new file mode 100644 index 0000000000..7bffbbf2b0 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_NW.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_SE.png b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_SE.png new file mode 100644 index 0000000000..d379b19c74 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_SE.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_SW.png b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_SW.png new file mode 100644 index 0000000000..40a3880fbf Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBlood/single_edge_SW.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/attribution.yml b/Resources/Textures/_CP14/Tiles/GrassBloodLight/attribution.yml new file mode 100644 index 0000000000..c49615ca8b --- /dev/null +++ b/Resources/Textures/_CP14/Tiles/GrassBloodLight/attribution.yml @@ -0,0 +1,13 @@ +- files: + - grass.png + - double_edge_E.png + - double_edge_N.png + - double_edge_S.png + - double_edge_W.png + - single_edge_NE.png + - single_edge_NW.png + - single_edge_SE.png + - single_edge_SW.png + license: "CC-BY-SA-3.0" + copyright: "Created by TheShuEd" + source: "https://github.com/crystallpunk-14/crystall-punk-14/pull/290" diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_E.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_E.png new file mode 100644 index 0000000000..30a4cec9fe Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_E.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_N.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_N.png new file mode 100644 index 0000000000..e22f4925e7 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_N.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_S.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_S.png new file mode 100644 index 0000000000..ee36aab1a8 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_S.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_W.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_W.png new file mode 100644 index 0000000000..061cd76963 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/double_edge_W.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/grass.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/grass.png new file mode 100644 index 0000000000..f6b118c56a Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/grass.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_NE.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_NE.png new file mode 100644 index 0000000000..2d4e362f08 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_NE.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_NW.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_NW.png new file mode 100644 index 0000000000..47ff976ad0 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_NW.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_SE.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_SE.png new file mode 100644 index 0000000000..089f685c38 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_SE.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_SW.png b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_SW.png new file mode 100644 index 0000000000..505c5d7e8c Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodLight/single_edge_SW.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/attribution.yml b/Resources/Textures/_CP14/Tiles/GrassBloodTall/attribution.yml new file mode 100644 index 0000000000..45ecb2c9c6 --- /dev/null +++ b/Resources/Textures/_CP14/Tiles/GrassBloodTall/attribution.yml @@ -0,0 +1,13 @@ +- files: + - grass.png + - double_edge_E.png + - double_edge_N.png + - double_edge_S.png + - double_edge_W.png + - single_edge_NE.png + - single_edge_NW.png + - single_edge_SE.png + - single_edge_SW.png + license: "CC-BY-SA-3.0" + copyright: "Created by TheShuEd" + source: "https://github.com/crystallpunk-14/crystall-punk-14/" diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_E.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_E.png new file mode 100644 index 0000000000..d74d96d6b8 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_E.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_N.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_N.png new file mode 100644 index 0000000000..aecceb3a03 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_N.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_S.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_S.png new file mode 100644 index 0000000000..fbf1a4c344 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_S.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_W.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_W.png new file mode 100644 index 0000000000..6a4c79505b Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/double_edge_W.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/grass.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/grass.png new file mode 100644 index 0000000000..11b05f7a46 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/grass.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_NE.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_NE.png new file mode 100644 index 0000000000..3f8630d2e4 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_NE.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_NW.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_NW.png new file mode 100644 index 0000000000..d496be36aa Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_NW.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_SE.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_SE.png new file mode 100644 index 0000000000..5b4e8d7a64 Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_SE.png differ diff --git a/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_SW.png b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_SW.png new file mode 100644 index 0000000000..e0913e5b2f Binary files /dev/null and b/Resources/Textures/_CP14/Tiles/GrassBloodTall/single_edge_SW.png differ diff --git a/signatures/version1/cla.json b/signatures/version1/cla.json index a666853bda..3b17467b03 100644 --- a/signatures/version1/cla.json +++ b/signatures/version1/cla.json @@ -279,6 +279,14 @@ "created_at": "2025-08-08T23:57:48Z", "repoId": 778936029, "pullRequestNo": 1644 + }, + { + "name": "gogenych", + "id": 172140058, + "comment_id": 3194612475, + "created_at": "2025-08-17T19:47:57Z", + "repoId": 778936029, + "pullRequestNo": 1676 } ] } \ No newline at end of file