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..1a03888f33 --- /dev/null +++ b/Content.Client/_CP14/Vampire/CP14ShowVampireIconsSystem.cs @@ -0,0 +1,47 @@ +using Content.Client.Administration.Managers; +using Content.Client.Overlays; +using Content.Shared._CP14.Vampire; +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/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/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/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..218ceceb93 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs @@ -1,10 +1,14 @@ 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; @@ -18,6 +22,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,6 +31,7 @@ public abstract partial class CP14SharedMagicSystem SubscribeLocalEvent(OnMaterialCheck); SubscribeLocalEvent(OnManaCheck); SubscribeLocalEvent(OnStaminaCheck); + SubscribeLocalEvent(OnSkillPointCheck); SubscribeLocalEvent(OnPacifiedCheck); SubscribeLocalEvent(OnMobStateCheck); SubscribeLocalEvent(OnReligionRestrictedCheck); @@ -33,9 +39,15 @@ public abstract partial class CP14SharedMagicSystem //Verbal speaking SubscribeLocalEvent(OnVerbalAspectStartCast); SubscribeLocalEvent(OnVerbalAspectAfterCast); + SubscribeLocalEvent(OnEmoteStartCast); SubscribeLocalEvent(OnEmoteEndCast); + + //Consuming resources SubscribeLocalEvent(OnMaterialAspectEndCast); + SubscribeLocalEvent(OnStaminaConsume); + SubscribeLocalEvent(OnManaConsume); + SubscribeLocalEvent(OnSkillPointConsume); } /// @@ -85,6 +97,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) { @@ -259,4 +300,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/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/Skill/CP14SharedSkillSystem.cs b/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs index 1515e13525..c432fc0d67 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) + _popup.PopupPredicted(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) + _popup.PopupPredicted(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 index 0abb1670d9..739a8489ba 100644 --- a/Content.Shared/_CP14/Skill/Restrictions/SpeciesBlacklist.cs +++ b/Content.Shared/_CP14/Skill/Restrictions/SpeciesBlacklist.cs @@ -7,10 +7,12 @@ 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, 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/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..394a40b5aa --- /dev/null +++ b/Content.Shared/_CP14/Vampire/CP14SharedVampireSystem.cs @@ -0,0 +1,218 @@ +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 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!; + + 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) + 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..9a73ee05bf --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14ShowVampireFactionComponent.cs @@ -0,0 +1,15 @@ +using Content.Shared.StatusIcon; +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..79ad22d1e7 --- /dev/null +++ b/Content.Shared/_CP14/Vampire/Components/CP14VampireComponent.cs @@ -0,0 +1,61 @@ +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 = 1f; + + [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; + + public override bool SendOnlyToOwner => true; +} 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/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/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/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..9f8f6b4627 100644 --- a/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl +++ b/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl @@ -29,4 +29,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/skill/requirements.ftl b/Resources/Locale/en-US/_CP14/skill/requirements.ftl index b07b767839..71fece68f9 100644 --- a/Resources/Locale/en-US/_CP14/skill/requirements.ftl +++ b/Resources/Locale/en-US/_CP14/skill/requirements.ftl @@ -1,6 +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/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..692d1b9bb3 100644 --- a/Resources/Locale/en-US/_CP14/vampire/vampire.ftl +++ b/Resources/Locale/en-US/_CP14/vampire/vampire.ftl @@ -1,3 +1,32 @@ +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 altars: +cp14-vampire-tree-other-info = "{$name}": [color=red]({$essence}/{$left})[/color] essences, [color=red]{$lvl}[/color] level. + +## 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/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/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/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..a6822528ab 100644 --- a/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl +++ b/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl @@ -29,4 +29,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/skill/requirements.ftl b/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl index 27c79bc9dd..678891c4d0 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl @@ -1,6 +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/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..79ce6af2ce 100644 --- a/Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl +++ b/Resources/Locale/ru-RU/_CP14/vampire/vampire.ftl @@ -1,3 +1,31 @@ +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] уровень. + +## 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/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/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/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/Vampire/T1_Hypnosis.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T1_Hypnosis.yml deleted file mode 100644 index 9ea543952e..0000000000 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/T1_Hypnosis.yml +++ /dev/null @@ -1,73 +0,0 @@ -- type: entity - id: CP14ActionSpellVampireHypnosis - parent: CP14ActionSpellBase - name: Hypnosis - description: You look at the victim with your OWN gaze, shutting down their consciousness and putting them to sleep. - components: - - type: Sprite - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon - - type: CP14MagicEffectCastSlowdown - speedMultiplier: 0.5 - - type: CP14MagicEffect - telegraphyEffects: - - !type:CP14SpellSpawnEntityOnTarget - spawns: - - CP14ImpactEffectVampireHypnosis - effects: - - !type:CP14SpellSpawnEntityOnTarget - spawns: - - CP14ImpactEffectVampireHypnosis - - !type:CP14SpellApplyEntityEffect - effects: - - !type:Jitter - - !type:GenericStatusEffect - key: ForcedSleep - time: 20 - component: ForcedSleeping - type: Add - - type: CP14MagicEffectCastingVisual - proto: CP14RuneVampireHypnosis - - type: Action - icon: - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon - - type: TargetAction - interactOnMiss: false - range: 5 - - type: EntityTargetAction - whitelist: - components: - - MobState - canTargetSelf: false - event: !type:CP14DelayedEntityTargetActionEvent - cooldown: 30 - castDelay: 1.5 - breakOnMove: false - -- type: entity - id: CP14RuneVampireHypnosis - parent: CP14BaseMagicRune - categories: [ HideSpawnMenu ] - components: - - type: PointLight - color: red - - type: Sprite - layers: - - state: double_outer - color: red - shader: unshaded - -- type: entity - id: CP14ImpactEffectVampireHypnosis - parent: CP14BaseMagicImpact - categories: [ HideSpawnMenu ] - save: false - components: - - type: Sprite - sprite: Effects/electricity.rsi - layers: - - state: electrified - color: red - shader: unshaded - 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 65% 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..a362f751a0 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,18 @@ 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: CP14MagicEffectTargetMobStatusRequired + allowedStates: + - Alive - type: CP14MagicEffect telegraphyEffects: - !type:CP14SpellSpawnEntityOnTarget + clientside: true spawns: - CP14ImpactEffectVampireBite - !type:CP14SpellApplyEntityEffect @@ -19,18 +21,23 @@ - !type:Jitter effects: - !type:CP14SpellSuckBlood - - !type:CP14SpellSpawnEntityOnTarget + suckAmount: 10 + - !type:CP14SpellVampireGatherEssence + - !type:CP14SpellSpawnEntityOnUser + clientside: true spawns: - - CP14ImpactEffectVampireBite + - CP14ImpactEffectBloodEssence - !type:CP14SpellApplyEntityEffect effects: - !type:Jitter - !type:ModifyBloodLevel - amount: -15 + amount: -10 - 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 +45,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 +70,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/bloodlust.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bloodlust.yml deleted file mode 100644 index 65a03dd1a6..0000000000 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/bloodlust.yml +++ /dev/null @@ -1,56 +0,0 @@ -- type: entity - id: CP14ActionSpellBloodlust - parent: CP14ActionSpellBase - name: Bloodlust - description: you sense all living things in a large radius around you that you want to KILL. - components: - - type: Sprite - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon - - type: CP14MagicEffect - effects: - - !type:CP14SpellSpawnEntityOnTarget - spawns: - - CP14ImpactEffectVampireHypnosis - - !type:CP14SpellPointerToAlive - pointerEntity: CP14BloodlustPointer - searchRange: 60 - - type: CP14MagicEffectVerbalAspect - startSpeech: "Ego vultus..." - endSpeech: "parumper vita" - - type: CP14MagicEffectSomaticAspect - - type: CP14MagicEffectCastingVisual - proto: CP14RuneVampireHypnosis - - type: Action - icon: - sprite: _CP14/Actions/Spells/vampire.rsi - state: blood_moon - - type: InstantAction - event: !type:CP14DelayedInstantActionEvent - cooldown: 30 - castDelay: 1.5 - -- type: entity - id: CP14BloodlustPointer - name: pointer - categories: [ HideSpawnMenu ] - components: - - type: Sprite - color: red - sprite: /Textures/_CP14/Effects/Magic/pointer.rsi - offset: 0, -1 - layers: - - state: pointer - shader: unshaded - drawdepth: LowFloors - - type: PointLight - netSync: false - radius: 3 - color: red - energy: 0.2 - - type: TimedDespawn - lifetime: 8 - - type: Tag - tags: - - HideContextMenu - 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/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..0f33c29c1c --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/power_punch.yml @@ -0,0 +1,101 @@ +- 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: CP14MagicEffectCastSlowdown + speedMultiplier: 0.4 + - type: CP14MagicEffectPacifiedBlock + - type: CP14MagicEffectVampire + - type: CP14MagicEffectManaCost + manaCost: 20 + - type: CP14MagicEffect + effects: + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Paralyze + paralyzeTime: 1 + - !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: 15 + whitelist: + components: + - Body + - Item + - Anchorable + +- type: entity + id: CP14ActionSpellVampirePower2 + parent: CP14ActionSpellVampirePower + name: Demonstration of strength II + description: By channeling the power of the oldest vampire clan, you instantly strike your target, causing them to fly back and lose their balance. This powerful version stuns for a longer period of time. + components: + - type: CP14MagicEffectManaCost + manaCost: 30 + - type: CP14MagicEffect + effects: + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Paralyze + paralyzeTime: 2 + - !type:CP14SpellThrowFromUser + throwPower: 15 + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectVampireKick + - !type:CP14SpellApplyEntityEffect + effects: + - !type:HealthChange + ignoreResistances: false + damage: + types: + Blunt: 15 + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick_2 + +- 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/search_vampire.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/search_vampire.yml new file mode 100644 index 0000000000..0ee1add948 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Vampire/search_vampire.yml @@ -0,0 +1,96 @@ +- type: entity + id: CP14ActionSpellBloodConnection + parent: CP14ActionSpellBase + name: Blood connection + description: You can sense the location of vampires from your clan from miles away. + components: + - type: CP14MagicEffectManaCost + manaCost: 10 + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectVampireHypnosis + - !type:CP14SpellPointerToVampireClan + searchRange: 60 + pointerEntity: CP14BloodlustPointer + - type: CP14MagicEffectCastingVisual + proto: CP14RuneVampireHypnosis + - type: Action + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: search_clan + - type: InstantAction + event: !type:CP14DelayedInstantActionEvent + 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 + categories: [ HideSpawnMenu ] + components: + - type: Sprite + color: red + sprite: /Textures/_CP14/Effects/Magic/pointer.rsi + offset: 0, -1 + layers: + - state: pointer + shader: unshaded + drawdepth: LowFloors + - type: PointLight + netSync: false + radius: 3 + color: red + energy: 0.2 + - type: TimedDespawn + lifetime: 8 + - type: Tag + tags: + - HideContextMenu + +- type: entity + id: CP14RuneVampireHypnosis + parent: CP14BaseMagicRune + categories: [ HideSpawnMenu ] + components: + - type: PointLight + color: red + - type: Sprite + layers: + - state: double_outer + color: red + shader: unshaded + +- type: entity + id: CP14ImpactEffectVampireHypnosis + parent: CP14BaseMagicImpact + categories: [ HideSpawnMenu ] + save: false + components: + - type: Sprite + sprite: Effects/electricity.rsi + layers: + - state: electrified + color: red + shader: unshaded \ 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/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 3584278b3e..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,12 +95,6 @@ - type: AddAccentClothing accent: ReplacementAccent replacement: cp14skeleton - - type: Armor - modifiers: - coefficients: - Blunt: 0.90 - Slash: 0.95 - Piercing: 0.95 - type: entity parent: CP14ClothingMaskBase @@ -123,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/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/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/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/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/skeleton.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/skeleton.yml index 03398ad3dc..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" ] 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/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/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/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/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/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..862e07837d --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Vampire/vampire.yml @@ -0,0 +1,334 @@ +- 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: 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:SpawnEntitiesBehavior + spawn: + CP14ScrapIron: + min: 1 + max: 2 + - !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:SpawnEntitiesBehavior + spawn: + CP14ScrapIron: + min: 1 + max: 2 + - !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:SpawnEntitiesBehavior + spawn: + CP14ScrapIron: + min: 1 + max: 2 + - !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: + CP14ScrapIron: + min: 1 + max: 2 + - !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: + CP14ScrapIron: + min: 1 + max: 3 + - !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/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..e1645e9f4f 100644 --- a/Resources/Prototypes/_CP14/GameRules/subgamemodes.yml +++ b/Resources/Prototypes/_CP14/GameRules/subgamemodes.yml @@ -1,31 +1,30 @@ - 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: @@ -45,7 +44,77 @@ 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 + baseDecayRate: 0.07 + starvationDamage: + types: + Cold: 0.25 + Bloodloss: 0.25 + 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 + baseDecayRate: 0.07 + starvationDamage: + types: + Cold: 0.25 + Bloodloss: 0.25 + 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/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/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..62501cdff5 --- /dev/null +++ b/Resources/Prototypes/_CP14/Recipes/Construction/Graphs/Vampire/workbench.yml @@ -0,0 +1,115 @@ +- 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: CP14IronBar + amount: 2 + doAfter: 2 + + - node: CP14VampireClanHeartUnnameableFrame + entity: CP14VampireClanHeartFrameUnnameable + edges: + - to: CP14VampireClanHeartUnnameable + completed: + - !type:SnapToGrid + conditions: + - !type:CP14AllVampireClanRequired + faction: Unnameable + steps: + - material: CP14IronBar + amount: 2 + doAfter: 2 + - material: CP14BloodEssence + amount: 1 + doAfter: 2 + - node: CP14VampireClanHeartUnnameable + entity: CP14VampireClanHeartUnnameable + +- type: constructionGraph + id: CP14VampireClanHeartDevourers + start: start + graph: + - node: start + edges: + - to: CP14VampireClanHeartDevourersFrame + completed: + - !type:SnapToGrid + steps: + - material: CP14IronBar + amount: 2 + doAfter: 2 + + - node: CP14VampireClanHeartDevourersFrame + entity: CP14VampireClanHeartFrameDevourers + edges: + - to: CP14VampireClanHeartDevourers + completed: + - !type:SnapToGrid + conditions: + - !type:CP14AllVampireClanRequired + faction: Unnameable + steps: + - material: CP14IronBar + amount: 2 + doAfter: 2 + - 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: CP14IronBar + amount: 2 + doAfter: 2 + + - node: CP14VampireClanHeartNightChildrenFrame + entity: CP14VampireClanHeartFrameNightChildrens + edges: + - to: CP14VampireClanHeartNightChildren + completed: + - !type:SnapToGrid + conditions: + - !type:CP14AllVampireClanRequired + faction: Unnameable + steps: + - material: CP14IronBar + amount: 2 + doAfter: 2 + - 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..04c23aba43 --- /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: construction-category-furniture + 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: construction-category-furniture + 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: construction-category-furniture + 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: construction-category-furniture + 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: construction-category-furniture + 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: construction-category-furniture + 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: construction-category-furniture + 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: construction-category-furniture + 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/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/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..f7ecf96b24 --- /dev/null +++ b/Resources/Prototypes/_CP14/Skill/Vampire/vampire.yml @@ -0,0 +1,272 @@ +# 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: PowerKick + skillUiPosition: 2, 0 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick + effects: + - !type:AddAction + action: CP14ActionSpellVampirePower + restrictions: + - !type:NeedPrerequisite + prerequisite: Bite + - !type:VampireClanLevel + level: 1 + +- type: cp14Skill + id: PowerKick2 + skillUiPosition: 6, 0 + learnCost: 1 + tree: Vampire + icon: + sprite: _CP14/Actions/Spells/vampire.rsi + state: power_kick_2 + effects: + - !type:ReplaceAction + oldAction: CP14ActionSpellVampirePower + newAction: CP14ActionSpellVampirePower2 + restrictions: + - !type:NeedPrerequisite + prerequisite: PowerKick + - !type:VampireClanLevel + level: 2 + +- type: cp14Skill + id: PowerKick3 + 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: PowerKick2 + - !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.5 + 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: 0.5 + 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/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/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/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/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