diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 09c9e76b19..0000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,7 +0,0 @@ -contact_links: - - name: Report a Security Vulnerability - url: https://github.com/space-wizards/space-station-14/blob/master/SECURITY.md - about: Please report security vulnerabilities privately so we can fix them before they are publicly disclosed. - - name: Request a Feature - url: https://discord.gg/rGvu9hKffJ - about: Submit feature requests on our Discord server (https://discord.gg/rGvu9hKffJ). diff --git a/.github/ISSUE_TEMPLATE/issue_report.md b/.github/ISSUE_TEMPLATE/issue_report.md deleted file mode 100644 index 9bc805b74e..0000000000 --- a/.github/ISSUE_TEMPLATE/issue_report.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Report an Issue -about: "..." -title: '' -labels: '' -assignees: '' - ---- - -## Description - - -**Reproduction** - - -**Screenshots** - - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/toolshed-feature-request.md b/.github/ISSUE_TEMPLATE/toolshed-feature-request.md deleted file mode 100644 index dae84c3e25..0000000000 --- a/.github/ISSUE_TEMPLATE/toolshed-feature-request.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: Toolshed feature request -about: Suggest a feature for Toolshed (for game admins/developers) -title: "[TOOLSHED REQUEST]" -labels: Toolshed -assignees: moonheart08 - ---- - -**Is your feature request related to a problem/bug? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the command you'd like** -A clear and concise description of what you want and what it should do. -If you're a technical user (i.e. programmer) including type signatures is helpful. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/Content.Client/_CP14/Religion/CP14ClientReligionGodSystem.cs b/Content.Client/_CP14/Religion/CP14ClientReligionGodSystem.cs new file mode 100644 index 0000000000..d2beb082c0 --- /dev/null +++ b/Content.Client/_CP14/Religion/CP14ClientReligionGodSystem.cs @@ -0,0 +1,83 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Client._CP14.Religion; + +public sealed partial class CP14ClientReligionGodSystem : CP14SharedReligionGodSystem +{ + [Dependency] private readonly IOverlayManager _overlayMgr = default!; + [Dependency] private readonly IPlayerManager _player = default!; + + private CP14ReligionVisionOverlay? _overlay; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); + SubscribeLocalEvent(OnOverlayInit); + SubscribeLocalEvent(OnOverlayRemove); + } + + public override void SendMessageToGods(ProtoId religion, string msg, EntityUid source) { } + + public override void Shutdown() + { + base.Shutdown(); + _overlayMgr.RemoveOverlay(); + } + + private void OnPlayerAttached(Entity ent, ref LocalPlayerAttachedEvent args) + { + AddOverlay(); + } + + private void OnPlayerDetached(Entity ent, ref LocalPlayerDetachedEvent args) + { + RemoveOverlay(); + } + + private void OnOverlayInit(Entity ent, ref ComponentInit args) + { + var attachedEnt = _player.LocalEntity; + + if (attachedEnt != ent.Owner) + return; + + AddOverlay(); + } + + private void OnOverlayRemove(Entity ent, ref ComponentRemove args) + { + var attachedEnt = _player.LocalEntity; + + if (attachedEnt != ent.Owner) + return; + + RemoveOverlay(); + } + + private void AddOverlay() + { + if (_overlay != null) + return; + + _overlay = new CP14ReligionVisionOverlay(); + _overlayMgr.AddOverlay(_overlay); + } + + private void RemoveOverlay() + { + if (_overlay == null) + return; + + _overlayMgr.RemoveOverlay(_overlay); + _overlay = null; + } +} diff --git a/Content.Client/_CP14/Religion/CP14ReligionEntityBoundUserInterface.cs b/Content.Client/_CP14/Religion/CP14ReligionEntityBoundUserInterface.cs new file mode 100644 index 0000000000..8be8e1f51c --- /dev/null +++ b/Content.Client/_CP14/Religion/CP14ReligionEntityBoundUserInterface.cs @@ -0,0 +1,34 @@ +using Content.Client._CP14.DemiplaneTraveling; +using Content.Shared._CP14.DemiplaneTraveling; +using Content.Shared._CP14.Religion.Systems; +using Robust.Client.UserInterface; + +namespace Content.Client._CP14.Religion; + +public sealed class CP14ReligionEntityBoundUserInterface : BoundUserInterface +{ + private CP14ReligionEntityWindow? _window; + + public CP14ReligionEntityBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _window = this.CreateWindow(); + + _window.OnTeleportAttempt += netId => SendMessage(new CP14ReligionEntityTeleportAttempt(netId)); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (_window == null || state is not CP14ReligionEntityUiState mapState) + return; + + _window?.UpdateState(mapState); + } +} diff --git a/Content.Client/_CP14/Religion/CP14ReligionEntityWindow.xaml b/Content.Client/_CP14/Religion/CP14ReligionEntityWindow.xaml new file mode 100644 index 0000000000..5242a4bbdf --- /dev/null +++ b/Content.Client/_CP14/Religion/CP14ReligionEntityWindow.xaml @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/Content.Client/_CP14/Religion/CP14ReligionEntityWindow.xaml.cs b/Content.Client/_CP14/Religion/CP14ReligionEntityWindow.xaml.cs new file mode 100644 index 0000000000..629a90e894 --- /dev/null +++ b/Content.Client/_CP14/Religion/CP14ReligionEntityWindow.xaml.cs @@ -0,0 +1,74 @@ +using System.Text; +using Content.Shared._CP14.Religion.Systems; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Client.UserInterface.XAML; + +namespace Content.Client._CP14.Religion; + +[GenerateTypedNameReferences] +public sealed partial class CP14ReligionEntityWindow : DefaultWindow +{ + [Dependency] private readonly ILogManager _log = default!; + + private ISawmill Sawmill { get; init; } + + public event Action? OnTeleportAttempt; + + public CP14ReligionEntityWindow() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + + Sawmill = _log.GetSawmill("cp14_religion_entity_window"); + } + + public void UpdateState(CP14ReligionEntityUiState state) + { + AltarsContainer.RemoveAllChildren(); + FollowersContainer.RemoveAllChildren(); + + Altars.Visible = state.Altars.Count > 0; + Followers.Visible = state.Followers.Count > 0; + + foreach (var (netId, name) in state.Altars) + { + var btn = new Button + { + Text = name, + HorizontalAlignment = HAlignment.Center + }; + + btn.OnPressed += _ => + { + OnTeleportAttempt?.Invoke(netId); + }; + AltarsContainer.AddChild(btn); + } + + foreach (var (netId, name) in state.Followers) + { + var btn = new Button + { + Text = name, + HorizontalAlignment = HAlignment.Center + }; + + btn.OnPressed += _ => + { + OnTeleportAttempt?.Invoke(netId); + }; + FollowersContainer.AddChild(btn); + } + Status.Text = GetStatusText(state); + } + + private string GetStatusText(CP14ReligionEntityUiState state) + { + var sb = new StringBuilder(); + sb.Append(Loc.GetString("cp14-god-ui-follower-percentage", ("count", state.FollowerPercentage * 100)) + "\n"); + sb.Append(Loc.GetString("cp14-god-ui-mana-percentage", ("count", state.ManaPercentage * 100)) + "\n"); + return sb.ToString(); + } +} diff --git a/Content.Client/_CP14/Religion/CP14ReligionVisionOverlay.cs b/Content.Client/_CP14/Religion/CP14ReligionVisionOverlay.cs new file mode 100644 index 0000000000..6c837e0713 --- /dev/null +++ b/Content.Client/_CP14/Religion/CP14ReligionVisionOverlay.cs @@ -0,0 +1,146 @@ +using System.Numerics; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Enums; +using Robust.Shared.Prototypes; + +namespace Content.Client._CP14.Religion; + +public sealed class CP14ReligionVisionOverlay : Overlay +{ + [Dependency] private readonly IEntityManager _entManager = default!; + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + private readonly SharedTransformSystem _transform; + + /// + /// Maximum number of observers zones that can be shown on screen at a time. + /// If this value is changed, the shader itself also needs to be updated. + /// + public const int MaxCount = 64; + + public override bool RequestScreenTexture => true; + public override OverlaySpace Space => OverlaySpace.WorldSpace; + + private readonly ProtoId? _religion = null; + + private readonly ShaderInstance _religionShader; + private readonly Vector2[] _positions = new Vector2[MaxCount]; + private readonly float[] _radii = new float[MaxCount]; + private int _count = 0; + + public CP14ReligionVisionOverlay() + { + IoCManager.InjectDependencies(this); + + _religionShader = _proto.Index("CP14ReligionVision").InstanceUnique(); + + _transform = _entManager.System(); + + if (_entManager.TryGetComponent(_player.LocalEntity, out var vision)) + _religion = vision.Religion; + } + + protected override bool BeforeDraw(in OverlayDrawArgs args) + { + if (args.Viewport.Eye == null) + return false; + + _count = 0; + + var clusters = new List(); + var religionQuery = _entManager.AllEntityQueryEnumerator(); + while (religionQuery.MoveNext(out var uid, out var rel, out var xform)) + { + if (_religion is null) + continue; + + var observation = rel.Observation; + if (!observation.ContainsKey(_religion.Value)) + continue; + + if (!rel.Active || xform.MapID != args.MapId) + continue; + + var mapPos = _transform.GetWorldPosition(uid); + + // To be clear, this needs to use "inside-viewport" pixels. + // In other words, specifically NOT IViewportControl.WorldToScreen (which uses outer coordinates). + var tempCoords = args.Viewport.WorldToLocal(mapPos); + tempCoords.Y = args.Viewport.Size.Y - tempCoords.Y; // Local space to fragment space. + + // try find cluster to merge with + bool merged = false; + foreach (var cluster in clusters) + { + if ((cluster.Position - tempCoords).Length() < 150f) + { + cluster.Add(tempCoords, rel.Observation[_religion.Value]); + merged = true; + break; + } + } + + if (!merged) + clusters.Add(new Cluster(tempCoords, rel.Observation[_religion.Value])); + + if (clusters.Count >= MaxCount) + break; + } + + _count = 0; + foreach (var cluster in clusters) + { + _positions[_count] = cluster.Position; + _radii[_count] = cluster.Radius; + _count++; + } + + return true; + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (ScreenTexture == null || args.Viewport.Eye == null) + return; + + if (!_entManager.TryGetComponent(_player.LocalEntity, out var visionComponent)) + return; + + _religionShader?.SetParameter("shaderColor", visionComponent.ShaderColor); + _religionShader?.SetParameter("renderScale", args.Viewport.RenderScale * args.Viewport.Eye.Scale); + _religionShader?.SetParameter("count", _count); + _religionShader?.SetParameter("position", _positions); + _religionShader?.SetParameter("radius", _radii); + _religionShader?.SetParameter("SCREEN_TEXTURE", ScreenTexture); + + var worldHandle = args.WorldHandle; + worldHandle.UseShader(_religionShader); + worldHandle.DrawRect(args.WorldAABB, Color.White); + worldHandle.UseShader(null); + } + + private sealed class Cluster + { + public Vector2 Position; + public float Radius; + public int Count; + + public Cluster(Vector2 pos, float radius) + { + Position = pos; + Radius = radius; + Count = 1; + } + + public void Add(Vector2 pos, float radius) + { + Position = (Position * Count + pos) / (Count + 1); + Radius = Math.Max(Radius, radius); + Count++; + } + } +} diff --git a/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs b/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs index 8107104289..9453417c32 100644 --- a/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs +++ b/Content.Client/_CP14/UserInterface/Systems/NodeTree/CP14NodeTreeGraphControl.xaml.cs @@ -13,6 +13,9 @@ namespace Content.Client._CP14.UserInterface.Systems.NodeTree; [GenerateTypedNameReferences] public sealed partial class CP14NodeTreeGraphControl : BoxContainer { + private const float LocalUIScaleMax = 4f; + private const float LocalUIScaleMin = 1f; + [Dependency] private readonly IEntityManager _entManager = default!; private CP14NodeTreeUiState? _state; @@ -25,6 +28,9 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer private bool _dragging = false; private Vector2 _previousMousePosition = Vector2.Zero; private Vector2 _globalOffset = new (60,60); + private float _localUIScale = LocalUIScaleMin; + + private float Scale => UIScale * _localUIScale; public event Action? OnNodeSelected; public event Action? OnOffsetChanged; @@ -50,6 +56,16 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer OnOffsetChanged?.Invoke(_globalOffset); } + protected override void MouseWheel(GUIMouseWheelEventArgs args) + { + base.MouseWheel(args); + + if (args.Handled) + return; + + _localUIScale = MathHelper.Clamp(_localUIScale + 0.1f * args.Delta.Y, LocalUIScaleMin, LocalUIScaleMax); + } + protected override void KeyBindDown(GUIBoundKeyEventArgs args) { base.KeyBindDown(args); @@ -72,6 +88,7 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer if (args.Function == EngineKeyFunctions.UIRightClick) { _globalOffset = new Vector2(60, 60); // Reset offset on right click + _localUIScale = LocalUIScaleMin; OnOffsetChanged?.Invoke(_globalOffset); } } @@ -107,7 +124,7 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer if (_dragging) { var delta = cursor - _previousMousePosition; - _globalOffset += delta; + _globalOffset += delta; OnOffsetChanged?.Invoke(_globalOffset); } @@ -118,8 +135,8 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer { var node1 = _nodeDict[edge.Item1]; var node2 = _nodeDict[edge.Item2]; - var fromPos = node1.UiPosition * UIScale + _globalOffset; - var toPos = node2.UiPosition * UIScale + _globalOffset; + var fromPos = node1.UiPosition * Scale + _globalOffset; + var toPos = node2.UiPosition * Scale + _globalOffset; var lineColor = node1.Gained || node2.Gained ? _state.ActiveLineColor : _state.LineColor; handle.DrawLine(fromPos, toPos, lineColor); @@ -128,11 +145,11 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer //Draw Node icons over lines foreach (var node in _state.Nodes) { - var pos = node.UiPosition * UIScale + _globalOffset; + var pos = node.UiPosition * Scale + _globalOffset; // Frame var frameTexture = _state.FrameIcon.Frame0(); - var frameSize = new Vector2(frameTexture.Width, frameTexture.Height) * 1.5f * UIScale; + var frameSize = new Vector2(frameTexture.Width, frameTexture.Height) * 1.5f * Scale; var frameQuad = new UIBox2(pos - frameSize / 2, pos + frameSize / 2); handle.DrawTextureRect(frameTexture, frameQuad); @@ -140,7 +157,7 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer if (_selectedNode == node) { var selectedTexture = _state.SelectedIcon.Frame0(); - var selectedSize = new Vector2(selectedTexture.Width, selectedTexture.Height) * 1.5f * UIScale; + var selectedSize = new Vector2(selectedTexture.Width, selectedTexture.Height) * 1.5f * Scale; var selectedQuad = new UIBox2(pos - selectedSize / 2, pos + selectedSize / 2); handle.DrawTextureRect(selectedTexture, selectedQuad); } @@ -151,7 +168,7 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer { _hoveredNode = node; var hoveredTexture = _state.HoveredIcon.Frame0(); - var hoveredSize = new Vector2(hoveredTexture.Width, hoveredTexture.Height) * 1.5f * UIScale; + var hoveredSize = new Vector2(hoveredTexture.Width, hoveredTexture.Height) * 1.5f * Scale; var hoveredQuad = new UIBox2(pos - hoveredSize / 2, pos + hoveredSize / 2); handle.DrawTextureRect(hoveredTexture, hoveredQuad); } @@ -160,7 +177,7 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer if (node.Gained) { var learnedTexture = _state.LearnedIcon.Frame0(); - var learnedSize = new Vector2(learnedTexture.Width, learnedTexture.Height) * 1.5f * UIScale; + var learnedSize = new Vector2(learnedTexture.Width, learnedTexture.Height) * 1.5f * Scale; var learnedQuad = new UIBox2(pos - learnedSize / 2, pos + learnedSize / 2); handle.DrawTextureRect(learnedTexture, learnedQuad); } @@ -169,7 +186,7 @@ public sealed partial class CP14NodeTreeGraphControl : BoxContainer if (node.Icon is not null) { var baseTexture = node.Icon.Frame0(); - var baseSize = new Vector2(baseTexture.Width, baseTexture.Height) * 1.5f * UIScale; + var baseSize = new Vector2(baseTexture.Width, baseTexture.Height) * 1.5f * Scale; var baseQuad = new UIBox2(pos - baseSize / 2, pos + baseSize / 2); var tint = node.Gained || node.Active ? Color.White : Color.FromSrgb(new Color(0.6f, 0.6f, 0.6f)); handle.DrawTextureRect(baseTexture, baseQuad, tint); diff --git a/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs b/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs index 3dfd6f5667..27c0992964 100644 --- a/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs +++ b/Content.Client/_CP14/UserInterface/Systems/Skill/CP14SkillUIController.cs @@ -37,7 +37,6 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered _allSkills = []; - private IEnumerable _allTrees = []; private CP14SkillPrototype? _selectedSkill; private CP14SkillTreePrototype? _selectedSkillTree; @@ -72,7 +71,6 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered(); - _allTrees = _proto.EnumeratePrototypes().OrderBy(tree => Loc.GetString(tree.Name)); } public void OnStateExited(GameplayState state) @@ -293,9 +291,9 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered { - SelectTree(tree, storage); + SelectTree(indexedTree); }; _window.TreeTabsContainer.AddChild(treeButton2); } } - private void SelectTree(CP14SkillTreePrototype tree, CP14SkillStorageComponent storage) + private void SelectTree(ProtoId tree) { if (_window == null) return; - _selectedSkillTree = tree; - _window.ParallaxBackground.ParallaxPrototype = tree.Parallax; - _window.TreeName.Text = Loc.GetString(tree.Name); + if (!_proto.TryIndex(tree, out var indexedTree)) + return; + + _selectedSkillTree = indexedTree; + _window.ParallaxBackground.ParallaxPrototype = indexedTree.Parallax; + _window.TreeName.Text = Loc.GetString(indexedTree.Name); UpdateGraphControl(); } diff --git a/Content.IntegrationTests/Tests/PostMapInitTest.cs b/Content.IntegrationTests/Tests/PostMapInitTest.cs index 78ae7ff7e6..03642a957f 100644 --- a/Content.IntegrationTests/Tests/PostMapInitTest.cs +++ b/Content.IntegrationTests/Tests/PostMapInitTest.cs @@ -401,7 +401,7 @@ namespace Content.IntegrationTests.Tests var jobs = new HashSet>(comp.SetupAvailableJobs.Keys); var spawnPoints = entManager.EntityQuery() - .Where(x => x.SpawnType == SpawnPointType.Job && x.Job != null) + .Where(x => x.SpawnType is SpawnPointType.Job or SpawnPointType.Unset && x.Job != null) //CP14 Job or Unset (only Job in upstream) .Select(x => x.Job.Value); jobs.ExceptWith(spawnPoints); diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index fd8c1b9d5c..0a7087f152 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -1,11 +1,11 @@ using System.Globalization; using System.Linq; using System.Text; +using Content.Server._CP14.Religion; using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.GameTicking; -using Content.Server.Players.RateLimiting; using Content.Server.Speech.Prototypes; using Content.Server.Speech.EntitySystems; using Content.Server.Station.Components; @@ -193,6 +193,13 @@ public sealed partial class ChatSystem : SharedChatSystem if (!CanSendInGame(message, shell, player)) return; + //CP14 Prevent god from default speaking. In waiting of chatcode refactor + var ev = new CP14SpokeAttemptEvent(message, desiredType, player); + RaiseLocalEvent(source, ev); + if (ev.Cancelled) + return; + //CP14 end + ignoreActionBlocker = CheckIgnoreSpeechBlocker(source, ignoreActionBlocker); // this method is a disaster diff --git a/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs b/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs index bd905e2982..1a399a8678 100644 --- a/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs +++ b/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs @@ -32,6 +32,15 @@ public sealed class SpawnPointSystem : EntitySystem if (args.Station != null && _stationSystem.GetOwningStation(uid, xform) != args.Station) continue; + //CP14 always spawn gods on gods spawnpoints + if (spawnPoint.SpawnType == SpawnPointType.Unset && (args.Job == null || spawnPoint.Job == args.Job)) + { + possiblePositions.Clear(); + possiblePositions.Add(xform.Coordinates); + break; + } + //CP14end + if (_gameTicker.RunLevel == GameRunLevel.InRound && spawnPoint.SpawnType == SpawnPointType.LateJoin) { possiblePositions.Add(xform.Coordinates); diff --git a/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.Stabilization.cs b/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.Stabilization.cs index a89bfd7e76..4d4f055000 100644 --- a/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.Stabilization.cs +++ b/Content.Server/_CP14/Demiplane/CP14DemiplaneSystem.Stabilization.cs @@ -83,26 +83,13 @@ public sealed partial class CP14DemiplaneSystem while (query.MoveNext(out var uid, out var stabilizer, out var xform)) { - if (!stabilizer.Enabled) - continue; - if (TryTeleportOutDemiplane(demiplane, uid)) { if (!safe) - { - var ev = new CP14DemiplaneUnsafeExit(); - RaiseLocalEvent(uid, ev); - _body.GibBody(uid); - } } } QueueDel(demiplane); } } - -public sealed class CP14DemiplaneUnsafeExit : EntityEventArgs -{ - -} diff --git a/Content.Server/_CP14/DemiplaneTraveling/CP14DemiplaneTravelingSystem.cs b/Content.Server/_CP14/DemiplaneTraveling/CP14DemiplaneTravelingSystem.cs index 2361534bfd..b1978c537c 100644 --- a/Content.Server/_CP14/DemiplaneTraveling/CP14DemiplaneTravelingSystem.cs +++ b/Content.Server/_CP14/DemiplaneTraveling/CP14DemiplaneTravelingSystem.cs @@ -6,6 +6,7 @@ using Content.Server.Popups; using Content.Shared._CP14.Demiplane; using Content.Shared._CP14.Demiplane.Components; using Content.Shared._CP14.DemiplaneTraveling; +using Content.Shared._CP14.Religion.Components; using Content.Shared.Ghost; using Content.Shared.Item; using Content.Shared.Movement.Pulling.Components; @@ -58,6 +59,8 @@ public sealed partial class CP14DemiplaneTravelingSystem : EntitySystem { if (HasComp(ent)) continue; + if (HasComp(ent)) //TODO: make some generic way to whitelist entities from teleporting + continue; if (!_mind.TryGetMind(ent, out var mindId, out var mind)) continue; @@ -114,6 +117,8 @@ public sealed partial class CP14DemiplaneTravelingSystem : EntitySystem { if (HasComp(ent)) continue; + if (HasComp(ent)) //TODO: make some generic way to whitelist entities from teleporting + continue; if (!_mind.TryGetMind(ent, out var mindId, out var mind)) continue; diff --git a/Content.Server/_CP14/Passport/CP14PassportSystem.cs b/Content.Server/_CP14/Passport/CP14PassportSystem.cs index 80ab0fcc4f..1b60833551 100644 --- a/Content.Server/_CP14/Passport/CP14PassportSystem.cs +++ b/Content.Server/_CP14/Passport/CP14PassportSystem.cs @@ -25,6 +25,9 @@ public sealed partial class CP14PassportSystem : EntitySystem private void OnPlayerSpawning(PlayerSpawnCompleteEvent ev) { + if (!TryComp(ev.Mob, out var inventory)) + return; + var passport = Spawn(PassportProto, Transform(ev.Mob).Coordinates); if (!TryComp(passport, out var paper)) @@ -39,7 +42,7 @@ public sealed partial class CP14PassportSystem : EntitySystem StampedName = Loc.GetString("cp14-passport-stamp") }, ""); - _inventory.TryEquip(ev.Mob, passport, "pocket1"); + _inventory.TryEquip(ev.Mob, passport, "pocket1", inventory: inventory); } private string GeneratePassportText(PlayerSpawnCompleteEvent ev) diff --git a/Content.Server/_CP14/RandomJobs/CP14StationRandomJobsComponent.cs b/Content.Server/_CP14/RandomJobs/CP14StationRandomJobsComponent.cs new file mode 100644 index 0000000000..b269c243e8 --- /dev/null +++ b/Content.Server/_CP14/RandomJobs/CP14StationRandomJobsComponent.cs @@ -0,0 +1,26 @@ + +using Content.Shared.Destructible.Thresholds; +using Content.Shared.Roles; +using Robust.Shared.Prototypes; + +namespace Content.Server._CP14.RandomJobs; + +[RegisterComponent, Access(typeof(CP14StationRandomJobsSystem))] +public sealed partial class CP14StationRandomJobsComponent : Component +{ + [DataField] + public List Entries = new(); +} + +[Serializable, DataDefinition] +public sealed partial class CP14RandomJobEntry +{ + [DataField(required: true)] + public List> Jobs = new(); + + [DataField(required: true)] + public MinMax Count = new(1, 1); + + [DataField] + public float Prob = 1f; +} diff --git a/Content.Server/_CP14/RandomJobs/CP14StationRandomJobsSystem.cs b/Content.Server/_CP14/RandomJobs/CP14StationRandomJobsSystem.cs new file mode 100644 index 0000000000..3440696304 --- /dev/null +++ b/Content.Server/_CP14/RandomJobs/CP14StationRandomJobsSystem.cs @@ -0,0 +1,52 @@ + +using Content.Server.Station.Events; +using Content.Server.Station.Systems; +using Content.Shared.Roles; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server._CP14.RandomJobs; + +public sealed partial class CP14StationRandomJobsSystem : EntitySystem +{ + [Dependency] private readonly StationJobsSystem _jobs = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInit, after: new[] { typeof(StationJobsSystem) }); + } + + private void OnInit(StationInitializedEvent args) + { + if (!TryComp(args.Station, out var randomJobs)) + return; + + foreach (var entry in randomJobs.Entries) + { + if (!_random.Prob(entry.Prob)) + continue; + + var count = entry.Count.Next(_random); + + var tempList = new List>(entry.Jobs); + + for (var i = 0; i < count; i++) + { + if (tempList.Count == 0) + break; + + var job = _random.Pick(tempList); + tempList.Remove(job); + + if (!_proto.TryIndex(job, out var jobProto)) + continue; + + _jobs.TryAdjustJobSlot(args.Station, jobProto, 1, createSlot: true); + } + } + } +} diff --git a/Content.Server/_CP14/Religion/CP14ReligionSystem.UI.cs b/Content.Server/_CP14/Religion/CP14ReligionSystem.UI.cs new file mode 100644 index 0000000000..96bf35ac03 --- /dev/null +++ b/Content.Server/_CP14/Religion/CP14ReligionSystem.UI.cs @@ -0,0 +1,79 @@ +using Content.Shared._CP14.MagicEnergy.Components; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.FixedPoint; +using Content.Shared.Follower; +using Robust.Server.GameObjects; + +namespace Content.Server._CP14.Religion; + +public sealed partial class CP14ReligionGodSystem +{ + [Dependency] private readonly UserInterfaceSystem _userInterface = default!; + [Dependency] private readonly FollowerSystem _follower = default!; + private void InitializeUI() + { + SubscribeLocalEvent(OnOpenInterface); + SubscribeLocalEvent(OnTeleportAttempt); + } + + private void OnTeleportAttempt(Entity ent, ref CP14ReligionEntityTeleportAttempt args) + { + var target = GetEntity(args.Entity); + + var canTeleport = false; + if (TryComp(target, out var altar)) + { + if (altar.Religion == ent.Comp.Religion) + canTeleport = true; + } + else if (TryComp(target, out var follower)) + { + if (follower.Religion == ent.Comp.Religion) + canTeleport = true; + } + + if (!canTeleport) + return; + + _follower.StartFollowingEntity(ent, target); + } + + private void OnOpenInterface(Entity ent, ref OpenBoundInterfaceMessage args) + { + if (ent.Comp.Religion is null) + return; + + var altars = new Dictionary(); + var queryAltars = EntityQueryEnumerator(); + while (queryAltars.MoveNext(out var uid, out var altar, out var meta)) + { + if (altar.Religion != ent.Comp.Religion) + continue; + + altars.TryAdd(GetNetEntity(uid), meta.EntityName); + } + + var followers = new Dictionary(); + var queryFollowers = EntityQueryEnumerator(); + while (queryFollowers.MoveNext(out var uid, out var follower, out var meta)) + { + if (follower.Religion != ent.Comp.Religion) + continue; + + followers.TryAdd(GetNetEntity(uid), meta.EntityName); + } + + var followerPercentage = GetFollowerPercentage(ent); + ent.Comp.FollowerPercentage = followerPercentage; + Dirty(ent); + + FixedPoint2 manaPercentage = 0f; + if (TryComp(ent, out var manaContainerComponent)) + { + manaPercentage = manaContainerComponent.Energy / manaContainerComponent.MaxEnergy; + } + + _userInterface.SetUiState(ent.Owner, CP14ReligionEntityUiKey.Key, new CP14ReligionEntityUiState(altars, followers, followerPercentage, manaPercentage)); + } +} diff --git a/Content.Server/_CP14/Religion/CP14ReligionSystem.cs b/Content.Server/_CP14/Religion/CP14ReligionSystem.cs new file mode 100644 index 0000000000..991f620cbd --- /dev/null +++ b/Content.Server/_CP14/Religion/CP14ReligionSystem.cs @@ -0,0 +1,247 @@ +using Content.Server._CP14.MagicEnergy; +using Content.Server.Chat.Managers; +using Content.Server.Chat.Systems; +using Content.Server.Speech; +using Content.Shared._CP14.MagicEnergy.Components; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.Chat; +using Content.Shared.FixedPoint; +using Robust.Server.GameStates; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Server._CP14.Religion; + +public sealed partial class CP14ReligionGodSystem : CP14SharedReligionGodSystem +{ + [Dependency] private readonly IChatManager _chat = default!; + [Dependency] private readonly ChatSystem _chatSys = default!; + [Dependency] private readonly PvsOverrideSystem _pvs = default!; + [Dependency] private readonly CP14MagicEnergySystem _magicEnergy = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + + /// + /// If ReligionObserver receives a radius higher than this value, this entity will automatically be placed in PvsOverride for the god in order to function correctly outside of the player's PVS. + /// + /// Maybe there is a variable for the distance outside the screen in PVS, I don't know. This number works best + private const float ObservationOverrideRadius = 6.5f; + + public override void Initialize() + { + base.Initialize(); + InitializeUI(); + + SubscribeLocalEvent(OnObserverInit); + SubscribeLocalEvent(OnObserverHandleState); + + SubscribeLocalEvent(OnGodInit); + SubscribeLocalEvent(OnGodShutdown); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); + SubscribeLocalEvent(OnSpokeAttempt); + + SubscribeLocalEvent(OnListen); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var follower, out var energy)) + { + if (follower.NextUpdateTime >= _gameTiming.CurTime) + continue; + + if (follower.Religion is null) + continue; + + follower.NextUpdateTime = _gameTiming.CurTime + TimeSpan.FromSeconds(follower.ManaTransferDelay); + + foreach (var god in GetGods(follower.Religion.Value)) + { + _magicEnergy.TransferEnergy((uid, energy), god.Owner, follower.EnergyToGodTransfer, out _, out _, safe: true); + } + } + } + + private void OnSpokeAttempt(Entity ent, ref CP14SpokeAttemptEvent args) + { + args.Cancel(); + + if (!TryComp(ent, out var god) || god.Religion is null) + return; + + if (ent.Comp.RestrictedReligionZone && !InVision(ent, (ent, god))) + return; + + _magicEnergy.ChangeEnergy(ent.Owner, -ent.Comp.ManaCost, out _, out _); + + var speaker = Spawn(ent.Comp.Speaker); + _transform.DropNextTo(speaker, ent.Owner); + + var message = args.Message; + var type = args.Type; + Timer.Spawn(333, + () => + { + _chatSys.TrySendInGameICMessage(speaker, message, type, ChatTransmitRange.Normal, nameOverride: MetaData(ent).EntityName, ignoreActionBlocker: true); + }); + } + + private void OnObserverHandleState(Entity ent, ref AfterAutoHandleStateEvent args) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var god)) + { + UpdatePvsOverrides(new Entity(uid, god)); + } + } + + private void OnObserverInit(Entity ent, ref ComponentInit args) + { + foreach (var (religion, _) in ent.Comp.Observation) + { + var gods = GetGods(religion); + + foreach (var god in gods) + { + UpdatePvsOverrides(god); + } + } + } + + private void OnGodInit(Entity ent, ref ComponentInit args) + { + AddPvsOverrides(ent); + } + + private void OnGodShutdown(Entity ent, ref ComponentShutdown args) + { + RemovePvsOverrides(ent); + } + + private void OnPlayerAttached(Entity ent, ref PlayerAttachedEvent args) + { + AddPvsOverrides(ent); + } + + private void OnPlayerDetached(Entity ent, ref PlayerDetachedEvent args) + { + RemovePvsOverrides(ent); + } + + private void OnListen(Entity ent, ref ListenEvent args) + { + if (ent.Comp.Religion is null) + return; + + var wrappedMessage = + Loc.GetString("cp14-altar-wrapped-message", ("name", MetaData(args.Source).EntityName), ("msg", args.Message)); + + SendMessageToGods(ent.Comp.Religion.Value, wrappedMessage, args.Source); + } + + public override void SendMessageToGods(ProtoId religion, string msg, EntityUid source) + { + var gods = GetGods(religion); + + HashSet channels = new(); + foreach (var god in gods) + { + if (!TryComp(god, out var godActor)) + continue; + + channels.Add(godActor.PlayerSession.Channel); + } + + _chat.ChatMessageToMany(ChatChannel.Notifications, msg, msg, source, false, true, channels, colorOverride: Color.Aqua); + } + + public FixedPoint2 GetFollowerPercentage(Entity god) + { + FixedPoint2 total = 0; + FixedPoint2 followers = 0; + + var allHumans = Mind.GetAliveHumans(); + foreach (var human in allHumans) + { + total += 1; + + if (!TryComp(human.Comp.CurrentEntity, out var relFollower)) + continue; + if (relFollower.Religion != god.Comp.Religion) + continue; + + followers += 1; + } + + if (total == 0) + return 0f; + + return followers / total; + } + + private void AddPvsOverrides(Entity ent) + { + if (ent.Comp.Religion is null) + return; + + if (!TryComp(ent, out var actor)) + return; + + ent.Comp.Session = actor.PlayerSession; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var observer)) + { + if (!observer.Observation.ContainsKey(ent.Comp.Religion.Value)) + continue; + + if (observer.Observation[ent.Comp.Religion.Value] <= ObservationOverrideRadius) + continue; + + ent.Comp.PvsOverridedObservers.Add(uid); + _pvs.AddSessionOverride(uid, actor.PlayerSession); + } + } + + private void RemovePvsOverrides(Entity ent) + { + if (ent.Comp.Religion is null) + return; + + if (ent.Comp.Session is null) + return; + + foreach (var altar in ent.Comp.PvsOverridedObservers) + { + _pvs.RemoveSessionOverride(altar, ent.Comp.Session); + } + + ent.Comp.Session = null; + ent.Comp.PvsOverridedObservers.Clear(); + } + + private void UpdatePvsOverrides(Entity ent) + { + if (ent.Comp.Session is null) + return; + + RemovePvsOverrides(ent); + AddPvsOverrides(ent); + } +} + +public sealed class CP14SpokeAttemptEvent(string message, InGameICChatType type, ICommonSession? player) : CancellableEntityEventArgs +{ + public string Message = message; + public InGameICChatType Type = type; + public ICommonSession? Player = player; +} + diff --git a/Content.Server/_CP14/Trading/CP14PriceScannerSystem.cs b/Content.Server/_CP14/Trading/CP14PriceScannerSystem.cs new file mode 100644 index 0000000000..90baf91166 --- /dev/null +++ b/Content.Server/_CP14/Trading/CP14PriceScannerSystem.cs @@ -0,0 +1,63 @@ +using System.Text; +using Content.Server.Cargo.Systems; +using Content.Shared._CP14.Currency; +using Content.Shared.Examine; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Tag; +using Content.Shared._CP14.Trading.Components; + + +namespace Content.Server._CP14.Trading; + +public sealed class CP14PriceScannerSystem : EntitySystem +{ + [Dependency] private readonly PricingSystem _price = default!; + [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly InventorySystem _invSystem = default!; + [Dependency] private readonly CP14SharedCurrencySystem _currency = default!; + + + public override void Initialize() + { + SubscribeLocalEvent(OnExamined); + } + + private bool IsAbleExamine(EntityUid uid) + { + if (_invSystem.TryGetSlotEntity(uid, "eyes", out var huds) + && HasComp(huds)) + { + return true; + } + else if (HasComp(uid)) + { + return true; + } + + return false; + } + + private void OnExamined(EntityUid eid, MetaDataComponent component, ExaminedEvent args) + { + if (!IsAbleExamine(args.Examiner)) + { + return; + } + else if (_tag.HasTag(args.Examined, "CP14Coin")) + { + return; + } + + var getPrice = _price.GetPrice(args.Examined); + + var price = Math.Round(getPrice); + + var priceMsg = Loc.GetString("cp14-currency-examine-title"); + + priceMsg += _currency.GetCurrencyPrettyString((int)price); + + args.PushMarkup(priceMsg); + } + +} diff --git a/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs b/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs index 181994632a..f70091884b 100644 --- a/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs +++ b/Content.Server/_CP14/WeatherControl/CP14WeatherControllerComponent.cs @@ -1,6 +1,5 @@ using Content.Server._CP14.GameTicking.Rules; using Content.Shared._CP14.WeatherControl; -using Content.Shared.Destructible.Thresholds; namespace Content.Server._CP14.WeatherControl; diff --git a/Content.Server/_CP14/ZLevels/EntitySystems/CP14StationZLevelsSystem.Actions.cs b/Content.Server/_CP14/ZLevels/EntitySystems/CP14StationZLevelsSystem.Actions.cs index 682d9e2383..b083cb61f8 100644 --- a/Content.Server/_CP14/ZLevels/EntitySystems/CP14StationZLevelsSystem.Actions.cs +++ b/Content.Server/_CP14/ZLevels/EntitySystems/CP14StationZLevelsSystem.Actions.cs @@ -1,4 +1,3 @@ -using System.Numerics; using Content.Shared._CP14.ZLevel; using Content.Shared.Ghost; using Robust.Shared.Map; @@ -9,11 +8,13 @@ public sealed partial class CP14StationZLevelsSystem { private void InitActions() { - SubscribeLocalEvent(OnZLevelUp); - SubscribeLocalEvent(OnZLevelDown); + SubscribeLocalEvent(OnZLevelUpGhost); + SubscribeLocalEvent(OnZLevelDownGhost); + SubscribeLocalEvent(OnZLevelUp); + SubscribeLocalEvent(OnZLevelDown); } - private void OnZLevelDown(Entity ent, ref CP14ZLevelActionDown args) + private void OnZLevelDownGhost(Entity ent, ref CP14ZLevelActionDown args) { if (args.Handled) return; @@ -23,7 +24,27 @@ public sealed partial class CP14StationZLevelsSystem args.Handled = true; } - private void OnZLevelUp(Entity ent, ref CP14ZLevelActionUp args) + private void OnZLevelUpGhost(Entity ent, ref CP14ZLevelActionUp args) + { + if (args.Handled) + return; + + ZLevelMove(ent, 1); + + args.Handled = true; + } + + private void OnZLevelDown(Entity ent, ref CP14ZLevelActionDown args) + { + if (args.Handled) + return; + + ZLevelMove(ent, -1); + + args.Handled = true; + } + + private void OnZLevelUp(Entity ent, ref CP14ZLevelActionUp args) { if (args.Handled) return; diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index dee1c7333c..4cfa10d53c 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,5 +1,6 @@ using Content.Shared._CP14.MagicEssence; using Content.Shared._CP14.MagicSpell.Events; +using Content.Shared._CP14.Skill; using Content.Shared.Armor; using Content.Shared.Atmos; using Content.Shared.Chat; @@ -39,6 +40,7 @@ public partial class InventorySystem //CP14 Relayed events SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); //CP14 End SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Content.Shared/Verbs/VerbCategory.cs b/Content.Shared/Verbs/VerbCategory.cs index d418f80579..8e4665352a 100644 --- a/Content.Shared/Verbs/VerbCategory.cs +++ b/Content.Shared/Verbs/VerbCategory.cs @@ -49,12 +49,6 @@ namespace Content.Shared.Verbs public static readonly VerbCategory CP14RitualBook = new("cp14-verb-categories-ritual-book", null); public static readonly VerbCategory CP14CurrencyConvert = new("cp14-verb-categories-currency-converter", null); //CP14 - - public static readonly VerbCategory CP14AdminSkillAdd = - new ("cp14-verb-categories-admin-skill-add", null, iconsOnly: true) { Columns = 6 }; - - public static readonly VerbCategory CP14AdminSkillRemove = - new ("cp14-verb-categories-admin-skill-remove", null, iconsOnly: true) { Columns = 6 }; //CP14 verbs public static readonly VerbCategory Admin = diff --git a/Content.Shared/_CP14/Currency/CP14SharedCurrencySystem.cs b/Content.Shared/_CP14/Currency/CP14SharedCurrencySystem.cs index 7db235fc84..ff51a576ed 100644 --- a/Content.Shared/_CP14/Currency/CP14SharedCurrencySystem.cs +++ b/Content.Shared/_CP14/Currency/CP14SharedCurrencySystem.cs @@ -14,8 +14,7 @@ public partial class CP14SharedCurrencySystem : EntitySystem { var total = currency; - if (total <= 0) - return string.Empty; + var sb = new StringBuilder(); var gp = total / 100; total %= 100; @@ -25,14 +24,15 @@ public partial class CP14SharedCurrencySystem : EntitySystem var cp = total; - var sb = new StringBuilder(); - if (gp > 0) - sb.Append( " " + Loc.GetString("cp14-currency-examine-gp", ("coin", gp))); + sb.Append(" " + Loc.GetString("cp14-currency-examine-gp", ("coin", gp))); if (sp > 0) - sb.Append( " " + Loc.GetString("cp14-currency-examine-sp", ("coin", sp))); + sb.Append(" " + Loc.GetString("cp14-currency-examine-sp", ("coin", sp))); if (cp > 0) - sb.Append( " " + Loc.GetString("cp14-currency-examine-cp", ("coin", cp))); + sb.Append(" " + Loc.GetString("cp14-currency-examine-cp", ("coin", cp))); + if (gp <= 0 && sp <= 0 && cp <= 0) + sb.Append(" " + Loc.GetString("cp14-trading-empty-price")); + return sb.ToString(); return sb.ToString(); } diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs index efa751e987..98f786ae94 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.Checks.cs @@ -1,5 +1,8 @@ using Content.Shared._CP14.MagicSpell.Components; using Content.Shared._CP14.MagicSpell.Events; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage.Components; using Content.Shared.Hands.Components; @@ -7,12 +10,14 @@ using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Popups; using Content.Shared.Speech.Muting; +using Robust.Shared.Prototypes; namespace Content.Shared._CP14.MagicSpell; public abstract partial class CP14SharedMagicSystem { [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly CP14SharedReligionGodSystem _god = default!; private void InitializeChecks() { @@ -22,12 +27,14 @@ public abstract partial class CP14SharedMagicSystem SubscribeLocalEvent(OnStaminaCheck); SubscribeLocalEvent(OnPacifiedCheck); SubscribeLocalEvent(OnMobStateCheck); + SubscribeLocalEvent(OnReligionRestrictedCheck); //Verbal speaking SubscribeLocalEvent(OnVerbalAspectStartCast); SubscribeLocalEvent(OnVerbalAspectAfterCast); SubscribeLocalEvent(OnEmoteStartCast); SubscribeLocalEvent(OnEmoteEndCast); + } /// @@ -148,6 +155,35 @@ public abstract partial class CP14SharedMagicSystem } } + private void OnReligionRestrictedCheck(Entity ent, + ref CP14CastMagicEffectAttemptEvent args) + { + if (!TryComp(args.Performer, out var religionComp)) + return; + + var position = args.Position; + + if (args.Target is not null) + position ??= Transform(args.Target.Value).Coordinates; + + if (ent.Comp.OnlyInReligionZone) + { + if (position is null || !_god.InVision(position.Value, (args.Performer, religionComp))) + { + args.Cancel(); + } + } + + if (ent.Comp.OnlyOnFollowers) + { + if (args.Target is null || !TryComp(args.Target, out var follower) || follower.Religion != religionComp.Religion) + { + args.PushReason(Loc.GetString("cp14-magic-spell-target-god-follower")); + args.Cancel(); + } + } + } + private void OnVerbalAspectStartCast(Entity ent, ref CP14StartCastMagicEffectEvent args) { diff --git a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.InstantActions.cs b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.InstantActions.cs index 019c80e677..e51d4a9941 100644 --- a/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.InstantActions.cs +++ b/Content.Shared/_CP14/MagicSpell/CP14SharedMagicSystem.InstantActions.cs @@ -10,6 +10,7 @@ public abstract partial class CP14SharedMagicSystem { SubscribeLocalEvent(OnMagicInstantAction); SubscribeLocalEvent(OnMagicEntityWorldTargetAction); + SubscribeLocalEvent(OnMagicWorldTargetAction); SubscribeLocalEvent(OnMagicEntityTargetAction); } @@ -47,6 +48,23 @@ public abstract partial class CP14SharedMagicSystem _action.SetCooldown(args.Action.Owner, args.Cooldown); } + private void OnMagicWorldTargetAction(CP14WorldTargetActionEvent args) + { + if (args.Handled) + return; + + if (!TryComp(args.Action, out var magicEffect)) + return; + + var spellArgs = new CP14SpellEffectBaseArgs(args.Performer, magicEffect.SpellStorage, null, args.Target); + + if (!CanCastSpell((args.Action, magicEffect), spellArgs)) + return; + + CastSpell((args.Action, magicEffect), spellArgs); + _action.CP14StartCustomDelay(args.Action, args.Cooldown); + } + private void OnMagicEntityTargetAction(CP14EntityTargetActionEvent args) { if (args.Handled) diff --git a/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectReligionRestrictedComponent.cs b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectReligionRestrictedComponent.cs new file mode 100644 index 0000000000..25eca4eb4b --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Components/CP14MagicEffectReligionRestrictedComponent.cs @@ -0,0 +1,20 @@ +namespace Content.Shared._CP14.MagicSpell.Components; + +/// +/// If the user belongs to a religion, this spell can only be used within the area of influence of that religion +/// +[RegisterComponent, Access(typeof(CP14SharedMagicSystem))] +public sealed partial class CP14MagicEffectReligionRestrictedComponent : Component +{ + /// + /// does not allow the spell to be used outside the god's area of influence + /// + [DataField] + public bool OnlyInReligionZone = true; + + /// + /// allows the spell to be used only on followers + /// + [DataField] + public bool OnlyOnFollowers = false; +} diff --git a/Content.Shared/_CP14/MagicSpell/Events/CP14ActionsEvents.cs b/Content.Shared/_CP14/MagicSpell/Events/CP14ActionsEvents.cs index 6d90ed75aa..dec202c4da 100644 --- a/Content.Shared/_CP14/MagicSpell/Events/CP14ActionsEvents.cs +++ b/Content.Shared/_CP14/MagicSpell/Events/CP14ActionsEvents.cs @@ -13,6 +13,12 @@ public sealed partial class CP14EntityWorldTargetActionEvent : WorldTargetAction public TimeSpan Cooldown { get; private set; } = TimeSpan.FromSeconds(1f); } +public sealed partial class CP14WorldTargetActionEvent : WorldTargetActionEvent, ICP14MagicEffect +{ + [DataField] + public TimeSpan Cooldown { get; private set; } = TimeSpan.FromSeconds(1f); +} + public sealed partial class CP14EntityTargetActionEvent : EntityTargetActionEvent, ICP14MagicEffect { [DataField] diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellAddMemoryPoint.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellAddMemoryPoint.cs new file mode 100644 index 0000000000..590a699fd0 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellAddMemoryPoint.cs @@ -0,0 +1,22 @@ +using Content.Shared._CP14.Skill; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellAddMemoryPoint : CP14SpellEffect +{ + [DataField] + public float AddedPoints = 0.5f; + + [DataField] + public float Limit = 6.5f; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Target is null) + return; + + var skillSys = entManager.System(); + + skillSys.AddMemoryPoints(args.Target.Value, AddedPoints, Limit); + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellGodRenounce.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellGodRenounce.cs new file mode 100644 index 0000000000..747d7fff7e --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellGodRenounce.cs @@ -0,0 +1,23 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Systems; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellGodRenounce : CP14SpellEffect +{ + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Target is null) + return; + + if (!entManager.TryGetComponent(args.User, out var god) || god.Religion is null) + return; + + if (!entManager.TryGetComponent(args.Target.Value, out var follower) || follower.Religion != god.Religion) + return; + + var religionSys = entManager.System(); + + religionSys.ToDisbelieve(args.Target.Value); + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellGodTouch.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellGodTouch.cs new file mode 100644 index 0000000000..1fe4675080 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellGodTouch.cs @@ -0,0 +1,25 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellGodTouch : CP14SpellEffect +{ + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Target is null) + return; + + if (!entManager.TryGetComponent(args.User, out var god) || god.Religion is null) + return; + + var ev = new CP14GodTouchEvent(god.Religion.Value); + entManager.EventBus.RaiseLocalEvent(args.Target.Value, ev); + } +} + +public sealed class CP14GodTouchEvent(ProtoId religion) : EntityEventArgs +{ + public ProtoId Religion = religion; +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs index 50deac91d5..1e77e3991c 100644 --- a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellProjectile.cs @@ -1,7 +1,9 @@ +using System.Numerics; using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Prototypes; +using Robust.Shared.Random; namespace Content.Shared._CP14.MagicSpell.Spells; @@ -10,6 +12,15 @@ public sealed partial class CP14SpellProjectile : CP14SpellEffect [DataField(required: true)] public EntProtoId Prototype; + [DataField] + public float ProjectileSpeed = 20f; + + [DataField] + public float Spread = 0f; + + [DataField] + public int ProjectileCount = 1; + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { EntityCoordinates? targetPoint = null; @@ -27,6 +38,7 @@ public sealed partial class CP14SpellProjectile : CP14SpellEffect var physics = entManager.System(); var gunSystem = entManager.System(); var mapManager = IoCManager.Resolve(); + var random = IoCManager.Resolve(); if (!entManager.TryGetComponent(args.User, out var xform)) return; @@ -40,14 +52,24 @@ public sealed partial class CP14SpellProjectile : CP14SpellEffect // If applicable, this ensures the projectile is parented to grid on spawn, instead of the map. var fromMap = transform.ToMapCoordinates(fromCoords); + var spawnCoords = mapManager.TryFindGridAt(fromMap, out var gridUid, out _) ? transform.WithEntityId(fromCoords, gridUid) : new(mapManager.GetMapEntityId(fromMap.MapId), fromMap.Position); + for (var i = 0; i < ProjectileCount; i++) + { + //Apply spread to target point + var offsetedTargetPoint = targetPoint.Value.Offset(new Vector2( + (float) (random.NextDouble() * 2 - 1) * Spread, + (float) (random.NextDouble() * 2 - 1) * Spread)); - var ent = entManager.SpawnAtPosition(Prototype, spawnCoords); - var direction = targetPoint.Value.ToMapPos(entManager, transform) - - spawnCoords.ToMapPos(entManager, transform); - gunSystem.ShootProjectile(ent, direction, userVelocity, args.User.Value, args.User); + var ent = entManager.SpawnAtPosition(Prototype, spawnCoords); + + var direction = offsetedTargetPoint.ToMapPos(entManager, transform) - + spawnCoords.ToMapPos(entManager, transform); + + gunSystem.ShootProjectile(ent, direction, userVelocity, args.User.Value, args.User, ProjectileSpeed); + } } } diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs new file mode 100644 index 0000000000..393628d7d4 --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellRemoveMemoryPoint.cs @@ -0,0 +1,19 @@ +using Content.Shared._CP14.Skill; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellRemoveMemoryPoint : CP14SpellEffect +{ + [DataField] + public float RemovedPoints = 0.5f; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.Target is null) + return; + + var skillSys = entManager.System(); + + skillSys.RemoveMemoryPoints(args.Target.Value, RemovedPoints); + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSendMessageToGod.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSendMessageToGod.cs new file mode 100644 index 0000000000..2298a3116e --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellSendMessageToGod.cs @@ -0,0 +1,25 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Systems; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellSendMessageToGod : CP14SpellEffect +{ + [DataField] + public LocId? Message; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (!entManager.TryGetComponent(args.User, out var follower)) + return; + if (!entManager.TryGetComponent(args.User, out var metaData)) + return; + + if (follower.Religion is null) + return; + + var religionSys = entManager.System(); + + religionSys.SendMessageToGods(follower.Religion.Value, Loc.GetString("cp14-call-follower-message", ("name", metaData.EntityName)) + " " + Loc.GetString(Message?? ""), args.User.Value); + } +} diff --git a/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTransferManaToGod.cs b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTransferManaToGod.cs new file mode 100644 index 0000000000..4a8803979b --- /dev/null +++ b/Content.Shared/_CP14/MagicSpell/Spells/CP14SpellTransferManaToGod.cs @@ -0,0 +1,37 @@ +using Content.Shared._CP14.MagicEnergy; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.FixedPoint; + +namespace Content.Shared._CP14.MagicSpell.Spells; + +public sealed partial class CP14SpellTransferManaToGod : CP14SpellEffect +{ + [DataField] + public FixedPoint2 Amount = 10f; + + [DataField] + public bool Safe = false; + + public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) + { + if (args.User is null) + return; + + if (!entManager.TryGetComponent(args.User, out var follower)) + return; + + if (follower.Religion is null) + return; + + var religionSys = entManager.System(); + var magicEnergySys = entManager.System(); + + var gods = religionSys.GetGods(follower.Religion.Value); + var manaAmount = Amount / gods.Count; + foreach (var god in gods) + { + magicEnergySys.TransferEnergy(args.User.Value, god.Owner, manaAmount, out _, out _, safe: Safe); + } + } +} diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionAltarComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionAltarComponent.cs new file mode 100644 index 0000000000..b561fa3f7c --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionAltarComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionAltarComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId? Religion; + + [DataField, AutoNetworkedField] + public bool CanBeConverted = true; +} diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionEntityComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionEntityComponent.cs new file mode 100644 index 0000000000..2f04dd8440 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionEntityComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Components; + +/// +/// +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionEntityComponent : Component +{ + [DataField(required: true)] + public ProtoId? Religion; + + public HashSet PvsOverridedObservers = new(); + public ICommonSession? Session; + + /// + /// Number of followers as a percentage. Automatically calculated on the server and sent to the client for data synchronization. + /// + [DataField, AutoNetworkedField] + public FixedPoint2 FollowerPercentage = 0; +} diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionFollowerComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionFollowerComponent.cs new file mode 100644 index 0000000000..2f9a4d1c93 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionFollowerComponent.cs @@ -0,0 +1,50 @@ +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Components; + +/// +/// Determines whether the entity is a follower of God, or may never be able to become one +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionFollowerComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId? Religion; + + [DataField, AutoNetworkedField] + public HashSet> RejectedReligions = new(); + + [DataField] + public EntProtoId RenounceActionProto = "CP14ActionRenounceFromGod"; + + [DataField] + public EntProtoId AppealToGofProto = "CP14ActionAppealToGod"; + + [DataField] + public EntityUid? RenounceAction; + + [DataField] + public EntityUid? AppealAction; + + /// + /// how much energy does the entity transfer to its god + /// + [DataField] + public FixedPoint2 EnergyToGodTransfer = 0.5f; + + /// + /// how often will the entity transfer mana to its patreon + /// + [DataField] + public float ManaTransferDelay = 3f; + + /// + /// the time of the next magic energy change + /// + [DataField] + public TimeSpan NextUpdateTime { get; set; } = TimeSpan.Zero; +} diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionObserverComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionObserverComponent.cs new file mode 100644 index 0000000000..5d9b31e6c5 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionObserverComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Components; + +/// +/// Allows the god of a particular religion to see within a radius around the observer. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionObserverComponent : Component +{ + [DataField, AutoNetworkedField] + public Dictionary, float> Observation = new(); //DAMNATION + + [DataField, AutoNetworkedField] + public bool Active = true; +} diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionPendingFollowerComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionPendingFollowerComponent.cs new file mode 100644 index 0000000000..f7c384cac4 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionPendingFollowerComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.Alert; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Components; + +/// +/// This entity has not yet become a follower of God, but wants to become one. Confirmation from god is expected +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionPendingFollowerComponent : Component +{ + [DataField, AutoNetworkedField] + public ProtoId? Religion; +} diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionSpeakerComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionSpeakerComponent.cs new file mode 100644 index 0000000000..f7c06110dc --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionSpeakerComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared._CP14.Religion.Systems; +using Content.Shared.FixedPoint; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Components; + +/// +/// Disables standard communication. Instead, attempts to say anything will consume mana, will be limited by the zone +/// of influence of religion, and will be spoken through the created entity of the “speaker.” +/// +[RegisterComponent, NetworkedComponent, Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionSpeakerComponent : Component +{ + [DataField] + public FixedPoint2 ManaCost = 5f; + + [DataField(required: true)] + public EntProtoId Speaker; + + /// + /// You can only talk within the sphere of influence of religion. + /// + [DataField] + public bool RestrictedReligionZone = true; +} + + diff --git a/Content.Shared/_CP14/Religion/Components/CP14ReligionVisionComponent.cs b/Content.Shared/_CP14/Religion/Components/CP14ReligionVisionComponent.cs new file mode 100644 index 0000000000..9c7727b37b --- /dev/null +++ b/Content.Shared/_CP14/Religion/Components/CP14ReligionVisionComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared._CP14.Religion.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Religion.Components; + +/// +/// Limits the vision of entities, allowing them to see only areas within a radius around observers of their religion. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(CP14SharedReligionGodSystem))] +public sealed partial class CP14ReligionVisionComponent : Component +{ + [DataField] + public Vector3 ShaderColor = new (1f, 1f, 1f); +} diff --git a/Content.Shared/_CP14/Religion/Prototypes/CP14ReligionPrototype.cs b/Content.Shared/_CP14/Religion/Prototypes/CP14ReligionPrototype.cs new file mode 100644 index 0000000000..01639cb564 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Prototypes/CP14ReligionPrototype.cs @@ -0,0 +1,18 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Prototypes; + +/// +/// +/// +[Prototype("cp14Religion")] +public sealed partial class CP14ReligionPrototype : IPrototype +{ + [IdDataField] public string ID { get; } = default!; + + [DataField] + public float FollowerObservationRadius = 8f; + + [DataField] + public float AltarObservationRadius = 25f; +} diff --git a/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Altars.cs b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Altars.cs new file mode 100644 index 0000000000..e9e29777d9 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Altars.cs @@ -0,0 +1,100 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared.DoAfter; +using Content.Shared.Verbs; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared._CP14.Religion.Systems; + +public abstract partial class CP14SharedReligionGodSystem +{ + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + + private void InitializeAltars() + { + SubscribeLocalEvent>(GetAltVerb); + } + + private void GetAltVerb(Entity ent, ref GetVerbsEvent args) + { + if (ent.Comp.Religion is null) + return; + + var disabled = !CanBecomeFollower(args.User, ent.Comp.Religion.Value); + + if (!disabled && TryComp(args.User, out var pendingFollower)) + { + if (pendingFollower.Religion is not null) + disabled = true; + } + + if (disabled) + return; + + var user = args.User; + args.Verbs.Add(new AlternativeVerb() + { + Text = Loc.GetString("cp14-altar-become-follower"), + Message = Loc.GetString("cp14-altar-become-follower-desc"), + Act = () => + { + var doAfterArgs = new DoAfterArgs(EntityManager, user, 5f, new CP14AltarOfferDoAfter(), ent, used: ent) + { + BreakOnDamage = true, + BreakOnMove = true, + }; + _doAfter.TryStartDoAfter(doAfterArgs); + }, + }); + } + + public bool TryConvertAltar(EntityUid target, ProtoId religion) + { + if (!_proto.TryIndex(religion, out var indexedReligion)) + return false; + + EnsureComp(target, out var altar); + + if (!altar.CanBeConverted) + return false; + + var oldReligion = altar.Religion; + altar.Religion = religion; + Dirty(target, altar); + + EditObservation(target, religion, indexedReligion.AltarObservationRadius); + + var ev = new CP14ReligionChangedEvent(oldReligion, religion); + RaiseLocalEvent(target, ev); + + return true; + } + + public void DeconvertAltar(EntityUid target) + { + if (!TryComp(target, out var altar)) + return; + + if (altar.Religion is null) + return; + + if (!_proto.TryIndex(altar.Religion, out var indexedReligion)) + return; + + EditObservation(target, altar.Religion.Value, -indexedReligion.AltarObservationRadius); + + var oldReligion = altar.Religion; + altar.Religion = null; + + var ev = new CP14ReligionChangedEvent(oldReligion, null); + RaiseLocalEvent(target, ev); + + Dirty(target, altar); + } +} + +[Serializable, NetSerializable] +public sealed partial class CP14AltarOfferDoAfter : SimpleDoAfterEvent +{ +} diff --git a/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Followers.cs b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Followers.cs new file mode 100644 index 0000000000..4ad072f40e --- /dev/null +++ b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Followers.cs @@ -0,0 +1,204 @@ +using Content.Shared._CP14.MagicSpell.Spells; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared.Actions; +using Content.Shared.Alert; +using Content.Shared.Follower; +using Content.Shared.Mind; +using Content.Shared.Mobs; +using Content.Shared.Verbs; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Systems; + +public abstract partial class CP14SharedReligionGodSystem +{ + [Dependency] private readonly AlertsSystem _alerts = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] protected readonly SharedMindSystem Mind = default!; + [Dependency] private readonly FollowerSystem _follower = default!; + + [ValidatePrototypeId] + public const string AlertProto = "CP14DivineOffer"; + + private void InitializeFollowers() + { + SubscribeLocalEvent(OnPendingFollowerInit); + SubscribeLocalEvent(OnPendingFollowerShutdown); + SubscribeLocalEvent(OnBreakDivineOffer); + SubscribeLocalEvent(OnGodTouch); + + SubscribeLocalEvent(OnOfferDoAfter); + + SubscribeLocalEvent(OnRenounceFromGod); + SubscribeLocalEvent>(OnGetAltVerbs); + SubscribeLocalEvent(OnFollowerStateChange); + } + + private void OnFollowerStateChange(Entity ent, ref MobStateChangedEvent args) + { + if (ent.Comp.Religion is null) + return; + + switch (args.NewMobState) + { + case MobState.Critical: + SendMessageToGods(ent.Comp.Religion.Value, Loc.GetString("cp14-critical-follower-message", ("name", MetaData(ent).EntityName)), ent); + break; + + case MobState.Dead: + SendMessageToGods(ent.Comp.Religion.Value, Loc.GetString("cp14-dead-follower-message", ("name", MetaData(ent).EntityName)), ent); + break; + } + } + + private void OnGetAltVerbs(EntityUid uid, CP14ReligionFollowerComponent component, GetVerbsEvent args) + { + if (!TryComp(args.User, out var god)) + return; + + if (god.Religion != component.Religion) + return; + + args.Verbs.Add(new AlternativeVerb + { + Text = Loc.GetString("admin-player-actions-follow"), + Act = () => + { + _follower.StartFollowingEntity(args.User, uid); + }, + }); + } + + private void OnRenounceFromGod(Entity ent, ref CP14RenounceFromGodEvent args) + { + ToDisbelieve(ent); + } + + private void OnOfferDoAfter(Entity ent, ref CP14AltarOfferDoAfter args) + { + if (args.Handled || args.Cancelled) + return; + + if (ent.Comp.Religion is null) + return; + + TryAddPendingFollower(args.User, ent.Comp.Religion.Value); + + args.Handled = true; + } + + private void OnGodTouch(Entity ent, ref CP14GodTouchEvent args) + { + if (args.Religion != ent.Comp.Religion) + return; + + TryToBelieve(ent); + } + + private void OnBreakDivineOffer(Entity ent, ref CP14BreakDivineOfferEvent args) + { + RemCompDeferred(ent); + + if (ent.Comp.Religion is null) + return; + + SendMessageToGods(ent.Comp.Religion.Value, Loc.GetString("cp14-unoffer-soul-god-message", ("name", MetaData(ent).EntityName)), ent); + } + + private void OnPendingFollowerInit(Entity ent, ref MapInitEvent args) + { + _alerts.ShowAlert(ent, AlertProto); + } + + private void OnPendingFollowerShutdown(Entity ent, ref ComponentShutdown args) + { + _alerts.ClearAlert(ent, AlertProto); + } + + private bool CanBecomeFollower(EntityUid target, ProtoId religion) + { + if (HasComp(target)) + return false; + + EnsureComp(target, out var follower); + + if (follower.Religion is not null) + return false; + + return !follower.RejectedReligions.Contains(religion); + } + + private void TryAddPendingFollower(EntityUid target, ProtoId religion) + { + if (!CanBecomeFollower(target, religion)) + return; + + EnsureComp(target, out var pendingFollower); + pendingFollower.Religion = religion; + + SendMessageToGods(religion, Loc.GetString("cp14-offer-soul-god-message", ("name", MetaData(target).EntityName)), target); + } + + private bool TryToBelieve(Entity pending) + { + if (pending.Comp.Religion is null) + return false; + + if (!_proto.TryIndex(pending.Comp.Religion, out var indexedReligion)) + return false; + + if (!CanBecomeFollower(pending, pending.Comp.Religion.Value)) + return false; + + EnsureComp(pending, out var follower); + + var oldReligion = follower.Religion; + follower.Religion = pending.Comp.Religion; + Dirty(pending, follower); + + EditObservation(pending, pending.Comp.Religion.Value, indexedReligion.FollowerObservationRadius); + + var ev = new CP14ReligionChangedEvent(oldReligion, pending.Comp.Religion); + RaiseLocalEvent(pending, ev); + + RemCompDeferred(pending); + SendMessageToGods(pending.Comp.Religion.Value, Loc.GetString("cp14-become-follower-message", ("name", MetaData(pending).EntityName)), pending); + + _actions.AddAction(pending, ref follower.RenounceAction, follower.RenounceActionProto); + _actions.AddAction(pending, ref follower.AppealAction, follower.AppealToGofProto); + return true; + } + + public void ToDisbelieve(EntityUid target) + { + if (!TryComp(target, out var follower)) + return; + + if (follower.Religion is null) + return; + + if (!_proto.TryIndex(follower.Religion, out var indexedReligion)) + return; + + SendMessageToGods(follower.Religion.Value, Loc.GetString("cp14-remove-follower-message", ("name", MetaData(target).EntityName)), target); + EditObservation(target, follower.Religion.Value, -indexedReligion.FollowerObservationRadius); + + var oldReligion = follower.Religion; + follower.Religion = null; + if (oldReligion is not null) + follower.RejectedReligions.Add(oldReligion.Value); + + var ev = new CP14ReligionChangedEvent(oldReligion, null); + RaiseLocalEvent(target, ev); + + Dirty(target, follower); + + _actions.RemoveAction(target, follower.RenounceAction); + _actions.RemoveAction(target, follower.AppealAction); + } +} + +public sealed partial class CP14BreakDivineOfferEvent : BaseAlertEvent; + +public sealed partial class CP14RenounceFromGodEvent : InstantActionEvent; diff --git a/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Observation.cs b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Observation.cs new file mode 100644 index 0000000000..dc5a3f5174 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.Observation.cs @@ -0,0 +1,93 @@ +using System.Numerics; +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Content.Shared.Interaction; +using Content.Shared.Verbs; +using Robust.Shared.Map; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Systems; + +public abstract partial class CP14SharedReligionGodSystem +{ + private void InitializeObservation() + { + SubscribeLocalEvent(OnGodInRange); + SubscribeLocalEvent(OnGodMenu); + } + + private void OnGodInRange(Entity ent, ref InRangeOverrideEvent args) + { + args.Handled = true; + + args.InRange = InVision(args.Target, ent); + } + + private void OnGodMenu(Entity ent, ref MenuVisibilityEvent args) + { + args.Visibility &= ~MenuVisibility.NoFov; + } + + public void EditObservation(EntityUid target, ProtoId religion, float range) + { + EnsureComp(target, out var observer); + + if (observer.Observation.ContainsKey(religion)) + { + var newRange = Math.Clamp(observer.Observation[religion] + range, 0, float.MaxValue); + + if (newRange <= 0) + observer.Observation.Remove(religion); + else + observer.Observation[religion] = newRange; + } + else + { + // Otherwise, add a new observation for the religion. + observer.Observation.Add(religion, range); + } + + Dirty(target, observer); + } + + public bool InVision(EntityUid target, Entity user) + { + var position = Transform(target).Coordinates; + + return InVision(position, user); + } + + public bool InVision(EntityCoordinates coords, Entity user) + { + if (!HasComp(user)) + return true; + + var userXform = Transform(user); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var observer, out var xform)) + { + if (!observer.Active) + continue; + + if (xform.MapID != userXform.MapID) + continue; + + if (user.Comp.Religion is null) + continue; + + if (!observer.Observation.ContainsKey(user.Comp.Religion.Value)) + continue; + + + var obsPos = _transform.GetWorldPosition(uid); + var targetPos = coords.Position; + if (Vector2.Distance(obsPos, targetPos) <= observer.Observation[user.Comp.Religion.Value]) + { + // If the observer is within range of the target, they can see it. + return true; + } + } + + return false; + } +} diff --git a/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.UI.cs b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.UI.cs new file mode 100644 index 0000000000..bc5d83c6f6 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.UI.cs @@ -0,0 +1,25 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization; + +namespace Content.Shared._CP14.Religion.Systems; + +[Serializable, NetSerializable] +public enum CP14ReligionEntityUiKey +{ + Key, +} + +[Serializable, NetSerializable] +public sealed class CP14ReligionEntityUiState(Dictionary altars, Dictionary followers, FixedPoint2 followerPercentage, FixedPoint2 manaPercentage) : BoundUserInterfaceState +{ + public Dictionary Altars = altars; + public Dictionary Followers = followers; + public FixedPoint2 FollowerPercentage = followerPercentage; + public FixedPoint2 ManaPercentage = manaPercentage; +} + +[Serializable, NetSerializable] +public sealed class CP14ReligionEntityTeleportAttempt(NetEntity entity) : BoundUserInterfaceMessage +{ + public readonly NetEntity Entity = entity; +} diff --git a/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.cs b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.cs new file mode 100644 index 0000000000..88e49d8402 --- /dev/null +++ b/Content.Shared/_CP14/Religion/Systems/CP14SharedReligionGodSystem.cs @@ -0,0 +1,46 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Religion.Prototypes; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Religion.Systems; + +public abstract partial class CP14SharedReligionGodSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + public override void Initialize() + { + base.Initialize(); + InitializeObservation(); + InitializeFollowers(); + InitializeAltars(); + } + + public HashSet> GetGods(ProtoId religion) + { + HashSet> gods = new(); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var god)) + { + if (god.Religion != religion) + continue; + + gods.Add(new Entity(uid, god)); + } + + return gods; + } + + public abstract void SendMessageToGods(ProtoId religion, string msg, EntityUid source); +} + +/// +/// It is invoked on altars and followers when they change their religion. +/// +public sealed class CP14ReligionChangedEvent(ProtoId? oldRel, ProtoId? newRel) : EntityEventArgs +{ + public ProtoId? OldReligion = oldRel; + public ProtoId? NewReligion = newRel; +} diff --git a/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs b/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs index 1649c30677..04f3046b33 100644 --- a/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs +++ b/Content.Shared/_CP14/Skill/CP14SharedSkillSystem.cs @@ -2,8 +2,10 @@ using System.Linq; using System.Text; using Content.Shared._CP14.Skill.Components; using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared._CP14.Skill.Restrictions; using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; +using Robust.Shared.Random; namespace Content.Shared._CP14.Skill; @@ -21,6 +23,7 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem InitializeAdmin(); InitializeChecks(); + InitializeScanning(); } private void OnMapInit(Entity ent, ref MapInitEvent args) @@ -174,6 +177,10 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem if (HaveSkill(target, skill, component)) return false; + //Check if the skill is in the available skill trees + if (!component.AvailableSkillTrees.Contains(skill.Tree)) + return false; + //Check max cap if (component.SkillsSumExperience + skill.LearnCost > component.ExperienceMaxCap) return false; @@ -244,6 +251,39 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem return sb.ToString(); } + + /// + /// Obtaining all skills that are not prerequisites for other skills of this creature + /// + public HashSet> GetFrontierSkills(EntityUid target, + CP14SkillStorageComponent? component = null) + { + var skills = new HashSet>(); + if (!Resolve(target, ref component, false)) + return skills; + + var frontier = component.LearnedSkills.ToHashSet(); + foreach (var skill in component.LearnedSkills) + { + if (!_proto.TryIndex(skill, out var indexedSkill)) + continue; + + if (HaveFreeSkill(target, skill)) + continue; + + foreach (var req in indexedSkill.Restrictions) + { + if (req is NeedPrerequisite prerequisite) + { + if (frontier.Contains(prerequisite.Prerequisite)) + frontier.Remove(prerequisite.Prerequisite); + } + } + } + + return frontier; + } + /// /// Helper function to reset skills to only learned skills /// @@ -264,6 +304,45 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem } return true; } + + /// + /// Increases the number of memory points for a character, limited to a certain amount. + /// + public void AddMemoryPoints(EntityUid target, FixedPoint2 points, FixedPoint2 limit, CP14SkillStorageComponent? component = null) + { + if (!Resolve(target, ref component, false)) + return; + + component.ExperienceMaxCap = FixedPoint2.Min(component.ExperienceMaxCap + points, limit); + Dirty(target, component); + + _popup.PopupEntity(Loc.GetString("cp14-skill-popup-added-points", ("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, FixedPoint2 points, CP14SkillStorageComponent? component = null) + { + if (!Resolve(target, ref component, false)) + return; + + component.ExperienceMaxCap = FixedPoint2.Max(component.ExperienceMaxCap - points, 0); + Dirty(target, component); + + _popup.PopupEntity(Loc.GetString("cp14-skill-popup-removed-points", ("count", points)), target, target); + + while (component.SkillsSumExperience > component.ExperienceMaxCap) + { + var frontier = GetFrontierSkills(target, component); + if (frontier.Count == 0) + break; + + //Randomly remove one of the frontier skills + var skill = _random.Pick(frontier); + TryRemoveSkill(target, skill, component); + } + } } [ByRefEvent] diff --git a/Content.Shared/_CP14/Skill/CP14SkillSystem.Admin.cs b/Content.Shared/_CP14/Skill/CP14SkillSystem.Admin.cs index 326377d8a4..4c78e77ba3 100644 --- a/Content.Shared/_CP14/Skill/CP14SkillSystem.Admin.cs +++ b/Content.Shared/_CP14/Skill/CP14SkillSystem.Admin.cs @@ -51,58 +51,16 @@ public abstract partial class CP14SharedSkillSystem var target = args.Target; - //Add Skill - foreach (var skill in _allSkills) - { - if (ent.Comp.LearnedSkills.Contains(skill)) - continue; - - var name = Loc.GetString(GetSkillName(skill)); - args.Verbs.Add(new Verb - { - Text = name, - Message = name + ": " + Loc.GetString(GetSkillDescription(skill)), - Category = VerbCategory.CP14AdminSkillAdd, - Icon = skill.Icon, - Act = () => - { - TryAddSkill(target, skill); - }, - }); - } - - //Remove Skill - foreach (var skill in ent.Comp.LearnedSkills) - { - if (!_proto.TryIndex(skill, out var indexedSkill)) - continue; - - var name = Loc.GetString(GetSkillName(skill)); - args.Verbs.Add(new Verb - { - Text = name, - Message = name + ": " + Loc.GetString(GetSkillDescription(skill)), - Category = VerbCategory.CP14AdminSkillRemove, - Icon = indexedSkill.Icon, - Act = () => - { - TryRemoveSkill(target, skill); - }, - }); - } - //Reset/Remove All Skills args.Verbs.Add(new Verb { Text = "Reset skills", Message = "Remove all learned skills", - Category = VerbCategory.CP14AdminSkillRemove, Icon = new SpriteSpecifier.Rsi(new("/Textures/_CP14/Interface/Misc/reroll.rsi"), "reroll"), Act = () => { TryResetSkills(target); }, }); - } } diff --git a/Content.Shared/_CP14/Skill/CP14SkillSystem.Scanning.cs b/Content.Shared/_CP14/Skill/CP14SkillSystem.Scanning.cs new file mode 100644 index 0000000000..7191253a95 --- /dev/null +++ b/Content.Shared/_CP14/Skill/CP14SkillSystem.Scanning.cs @@ -0,0 +1,75 @@ +using System.Text; +using Content.Shared._CP14.Skill.Components; +using Content.Shared.Examine; +using Content.Shared.Inventory; +using Content.Shared.Verbs; +using Robust.Shared.Utility; + +namespace Content.Shared._CP14.Skill; + +public abstract partial class CP14SharedSkillSystem +{ + [Dependency] private readonly ExamineSystemShared _examine = default!; + + private void InitializeScanning() + { + SubscribeLocalEvent(OnSkillScan); + SubscribeLocalEvent>((e, c, ev) => OnSkillScan(e, c, ev.Args)); + + SubscribeLocalEvent>(OnExamined); + } + + private void OnExamined(Entity ent, ref GetVerbsEvent args) + { + var scanEvent = new CP14SkillScanEvent(); + RaiseLocalEvent(args.User, scanEvent); + + if (!scanEvent.CanScan) + return; + + var markup = GetSkillExamine(ent); + + _examine.AddDetailedExamineVerb( + args, + ent.Comp, + markup, + Loc.GetString("cp14-skill-info-title"), + "/Textures/Interface/students-cap.svg.192dpi.png"); + } + + private FormattedMessage GetSkillExamine(Entity ent) + { + var msg = new FormattedMessage(); + + var sb = new StringBuilder(); + + sb.Append(Loc.GetString("cp14-skill-examine-title") + "\n"); + + foreach (var skill in ent.Comp.LearnedSkills) + { + if (!_proto.TryIndex(skill, out var indexedSkill)) + continue; + + if(!_proto.TryIndex(indexedSkill.Tree, out var indexedTree)) + continue; + + var skillName = GetSkillName(skill); + sb.Append($"• [color={indexedTree.Color.ToHex()}]{skillName}[/color]\n"); + } + + sb.Append($"\n{Loc.GetString("cp14-skill-menu-level")} {ent.Comp.SkillsSumExperience}/{ent.Comp.ExperienceMaxCap}\n"); + msg.AddMarkupOrThrow(sb.ToString()); + return msg; + } + + private void OnSkillScan(EntityUid uid, CP14SkillScannerComponent component, CP14SkillScanEvent args) + { + args.CanScan = true; + } +} + +public sealed class CP14SkillScanEvent : EntityEventArgs, IInventoryRelayEvent +{ + public bool CanScan; + public SlotFlags TargetSlots { get; } = SlotFlags.EYES; +} diff --git a/Content.Shared/_CP14/Skill/Components/CP14SkillScannerComponent.cs b/Content.Shared/_CP14/Skill/Components/CP14SkillScannerComponent.cs new file mode 100644 index 0000000000..d5653364a7 --- /dev/null +++ b/Content.Shared/_CP14/Skill/Components/CP14SkillScannerComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Skill.Components; + +/// +/// Allows you to see what skills the creature possesses +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class CP14SkillScannerComponent : Component +{ +} diff --git a/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs b/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs index bfb11e4776..12b8c47bd6 100644 --- a/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs +++ b/Content.Shared/_CP14/Skill/Components/CP14SkillStorageComponent.cs @@ -14,9 +14,15 @@ namespace Content.Shared._CP14.Skill.Components; [Access(typeof(CP14SharedSkillSystem), typeof(CP14SharedResearchSystem))] 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] + public HashSet> AvailableSkillTrees = new(); + /// /// Tracks skills that are learned without spending memory points. - /// the skills that are here are DUBLED in the LearnedSkills, + /// the skills that are here are DOUBLED in the LearnedSkills, /// [DataField, AutoNetworkedField] public List> FreeLearnedSkills = new(); diff --git a/Content.Shared/_CP14/Skill/Prototypes/CP14SkillTreePrototype.cs b/Content.Shared/_CP14/Skill/Prototypes/CP14SkillTreePrototype.cs index 8a00c6e2b6..6057dc0e67 100644 --- a/Content.Shared/_CP14/Skill/Prototypes/CP14SkillTreePrototype.cs +++ b/Content.Shared/_CP14/Skill/Prototypes/CP14SkillTreePrototype.cs @@ -41,7 +41,4 @@ public sealed partial class CP14SkillTreePrototype : IPrototype [DataField] public SoundSpecifier LearnSound = new SoundCollectionSpecifier("CP14LearnSkill"); - - [DataField] - public SpriteSpecifier? Icon = null; } diff --git a/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs b/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs new file mode 100644 index 0000000000..aafe472d7d --- /dev/null +++ b/Content.Shared/_CP14/Skill/Restrictions/GodFollowerPercentage.cs @@ -0,0 +1,27 @@ +using Content.Shared._CP14.Religion.Components; +using Content.Shared._CP14.Skill.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; + +namespace Content.Shared._CP14.Skill.Restrictions; + +public sealed partial class GodFollowerPercentage : CP14SkillRestriction +{ + [DataField] + public FixedPoint2 Percentage = 0.5f; + public override bool Check(IEntityManager entManager, EntityUid target, CP14SkillPrototype skill) + { + if (!entManager.TryGetComponent(target, out var god)) + return false; + + if (god.Religion is null) + return false; + + return god.FollowerPercentage >= Percentage; + } + + public override string GetDescription(IEntityManager entManager, IPrototypeManager protoManager) + { + return Loc.GetString("cp14-skill-req-god-follower-percentage", ("count", Percentage * 100)); + } +} diff --git a/Content.Shared/_CP14/Trading/Components/CP14PriceScannerComponent.cs b/Content.Shared/_CP14/Trading/Components/CP14PriceScannerComponent.cs new file mode 100644 index 0000000000..3c7668dbbc --- /dev/null +++ b/Content.Shared/_CP14/Trading/Components/CP14PriceScannerComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Trading.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class CP14PriceScannerComponent : Component { } diff --git a/Content.Shared/_CP14/WeatherControl/CP14WeatherData.cs b/Content.Shared/_CP14/WeatherControl/CP14WeatherData.cs index c77d2f1257..5755e881c7 100644 --- a/Content.Shared/_CP14/WeatherControl/CP14WeatherData.cs +++ b/Content.Shared/_CP14/WeatherControl/CP14WeatherData.cs @@ -11,7 +11,7 @@ public sealed class CP14WeatherData public ProtoId? Visuals { get; set; } = null; [DataField] - public MinMax Duration { get; set; } = new(30, 300); + public MinMax Duration { get; set; } = new(120, 600); [DataField] public float Weight { get; set; } = 1f; diff --git a/Resources/Audio/_CP14/Animals/attributions.yml b/Resources/Audio/_CP14/Animals/attributions.yml index 40e12e1430..9e92d865f1 100644 --- a/Resources/Audio/_CP14/Animals/attributions.yml +++ b/Resources/Audio/_CP14/Animals/attributions.yml @@ -67,3 +67,8 @@ license: "CC-BY-4.0" copyright: 'by iainmccurdy of Freesound.org. Cropped and mixed from stereo to mono.' source: "https://freesound.org/people/iainmccurdy/sounds/743820/" + +- files: ["flem1.ogg, flem2.ogg, flem3.ogg"] + license: "CC0-1.0" + copyright: 'by muckypete7 of Freesound.org. Cropped and mixed from stereo to mono.' + source: "https://freesound.org/people/mucky_pete7/sounds/574208/" diff --git a/Resources/Audio/_CP14/Animals/flem1.ogg b/Resources/Audio/_CP14/Animals/flem1.ogg new file mode 100644 index 0000000000..fb2fe01588 Binary files /dev/null and b/Resources/Audio/_CP14/Animals/flem1.ogg differ diff --git a/Resources/Audio/_CP14/Animals/flem2.ogg b/Resources/Audio/_CP14/Animals/flem2.ogg new file mode 100644 index 0000000000..f2347e9b4c Binary files /dev/null and b/Resources/Audio/_CP14/Animals/flem2.ogg differ diff --git a/Resources/Audio/_CP14/Animals/flem3.ogg b/Resources/Audio/_CP14/Animals/flem3.ogg new file mode 100644 index 0000000000..8a2d6855ed Binary files /dev/null and b/Resources/Audio/_CP14/Animals/flem3.ogg differ diff --git a/Resources/Audio/_CP14/Effects/attributions.yml b/Resources/Audio/_CP14/Effects/attributions.yml index 1c3c18d4ea..3c17d8a357 100644 --- a/Resources/Audio/_CP14/Effects/attributions.yml +++ b/Resources/Audio/_CP14/Effects/attributions.yml @@ -91,4 +91,14 @@ - files: ["cash.ogg"] license: "CC0-1.0" copyright: 'Created by Zott820 on Freesound.org' - source: "https://freesound.org/people/Zott820/sounds/209578/" \ No newline at end of file + source: "https://freesound.org/people/Zott820/sounds/209578/" + +- files: ["ritual_begin.ogg", "ritual_end.ogg"] + license: "CC-BY-4.0" + copyright: 'Created by SilverIllusionist on Freesound.org' + source: "https://freesound.org/people/SilverIllusionist/sounds/671928/" + +- files: ["moon_strike1.ogg", "moon_strike2.ogg", "moon_strike3.ogg", "moon_strike4.ogg"] + license: "CC-BY-4.0" + copyright: 'Created by EminYILDIRIM on Freesound.org' + source: "https://freesound.org/people/EminYILDIRIM/sounds/668244/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Effects/moon_strike1.ogg b/Resources/Audio/_CP14/Effects/moon_strike1.ogg new file mode 100644 index 0000000000..d83a00f3f8 Binary files /dev/null and b/Resources/Audio/_CP14/Effects/moon_strike1.ogg differ diff --git a/Resources/Audio/_CP14/Effects/moon_strike2.ogg b/Resources/Audio/_CP14/Effects/moon_strike2.ogg new file mode 100644 index 0000000000..dadb098323 Binary files /dev/null and b/Resources/Audio/_CP14/Effects/moon_strike2.ogg differ diff --git a/Resources/Audio/_CP14/Effects/moon_strike3.ogg b/Resources/Audio/_CP14/Effects/moon_strike3.ogg new file mode 100644 index 0000000000..bbd3cdda7d Binary files /dev/null and b/Resources/Audio/_CP14/Effects/moon_strike3.ogg differ diff --git a/Resources/Audio/_CP14/Effects/moon_strike4.ogg b/Resources/Audio/_CP14/Effects/moon_strike4.ogg new file mode 100644 index 0000000000..c6ca0da5be Binary files /dev/null and b/Resources/Audio/_CP14/Effects/moon_strike4.ogg differ diff --git a/Resources/Audio/_CP14/Effects/ritual_begin.ogg b/Resources/Audio/_CP14/Effects/ritual_begin.ogg new file mode 100644 index 0000000000..1c56bd3fa1 Binary files /dev/null and b/Resources/Audio/_CP14/Effects/ritual_begin.ogg differ diff --git a/Resources/Audio/_CP14/Effects/ritual_end.ogg b/Resources/Audio/_CP14/Effects/ritual_end.ogg new file mode 100644 index 0000000000..bc433868fd Binary files /dev/null and b/Resources/Audio/_CP14/Effects/ritual_end.ogg differ diff --git a/Resources/Changelog/CP14_Changelog.yml b/Resources/Changelog/CP14_Changelog.yml index 94ee3d3dec..6741521935 100644 --- a/Resources/Changelog/CP14_Changelog.yml +++ b/Resources/Changelog/CP14_Changelog.yml @@ -320,3 +320,93 @@ id: 8084 time: '2025-06-10T08:07:13.0000000+00:00' url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1412 +- author: gogenych + changes: + - message: Copper tools and weapons are now displayed correctly in loadout + type: Fix + id: 8085 + time: '2025-06-10T10:40:19.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1414 +- author: firebat4321 + changes: + - message: Added new combat-focused T2 Pryokinetic spell, Firebolt! + type: Add + id: 8086 + time: '2025-06-10T11:14:08.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1354 +- author: Sefaia + changes: + - message: Added Quiver filled with Big Iron Crossbow Bolts to Entity Spawn Menu + for Admins/Testers + type: Add + - message: Fixed Quiver to hold Big Crossbow Bolts. + type: Fix + id: 8087 + time: '2025-06-13T07:34:32.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1418 +- author: SenorJaba + changes: + - message: Merchant's monocle has been added to replace appraisal tool. + type: Add + - message: Added a new trader's wit skill which works similarly to merchant's monocle. + type: Add + - message: Alchemist's glasses and monocle, and merchant's monocle were added into + the buying platform. + type: Add + - message: Appraisal tool has been removed from the merchant's closet. + type: Remove + - message: Alchemist's glasses and monocle were removed from the alchemist's loadout. + type: Remove + id: 8088 + time: '2025-06-13T09:24:36.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1413 +- author: Fr0goo + changes: + - message: Added new creature named Flem! You can find them in demiplanes. + type: Add + - message: Added fish suit and mask! + type: Add + - message: Added a probaly temporary way to make fish pie! + type: Add + id: 8089 + time: '2025-06-13T10:25:33.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1402 +- author: TheShuEd + changes: + - message: A patron system has been added. By interacting with the primordial statues, + you can become a follower of a patron. For more details, please refer to the + in-game guidebooks. + type: Add + - message: "The divine patron of the night sky and knowledge, \u201CLumera,\u201D\ + \ has been added. This is a game role that gains new abilities based on the\ + \ number of followers and is capable of interacting with areas of visibility\ + \ and granting (or taking away) memory points from other players." + type: Add + id: 8090 + time: '2025-06-15T15:00:33.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1427 +- author: TheShuEd + changes: + - message: Added firewave spell. Now it looks like a shotgun, only made of fire. + type: Add + - message: Removed firebolt spell. + type: Remove + - message: Spiders' health reduced by half + type: Tweak + id: 8091 + time: '2025-06-15T15:03:38.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1430 +- author: TheShuEd + changes: + - message: you can buy wheat and cotton into victorian gardens trade faction + type: Add + - message: Demiplanes can no longer devour patrons if they close while the patron + is inside the demoplan. + type: Fix + - message: Patron saints can no longer occupy entry slots into the demiplane. + type: Fix + - message: Passports removed from the gods-patrons + type: Fix + id: 8092 + time: '2025-06-15T18:25:58.0000000+00:00' + url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1432 diff --git a/Resources/Locale/en-US/_CP14/currency/currency_comp.ftl b/Resources/Locale/en-US/_CP14/currency/currency_comp.ftl index b8976db6ad..628de32fbe 100644 --- a/Resources/Locale/en-US/_CP14/currency/currency_comp.ftl +++ b/Resources/Locale/en-US/_CP14/currency/currency_comp.ftl @@ -4,7 +4,7 @@ cp14-currency-examine-gp = [color=#ebad3b]{$coin}gp[/color] cp14-currency-examine-sp = [color=#bad1d6]{$coin}sp[/color] cp14-currency-examine-cp = [color=#824e27]{$coin}cp[/color] -cp14-currency-converter-insert = {$cash}cp ddeposited! +cp14-currency-converter-insert = {$cash}cp deposited! cp14-verb-categories-currency-converter = Withdraw currency: cp14-currency-converter-get-cp = As cp (1cp) cp14-currency-converter-get-sp = As sp (10cp) diff --git a/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl b/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl index 8d49bea216..d4f4905706 100644 --- a/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl +++ b/Resources/Locale/en-US/_CP14/demiplane/modifiers.ftl @@ -24,6 +24,7 @@ cp14-modifier-air-lily = air lilies cp14-modifier-shadow-kudzu = spreading astral haze cp14-modifier-night = darkness cp14-modifier-spiders = spider's web +cp14-modifier-flem = flemings cp14-modifier-storm = storm cp14-modifier-fire-storm = fire storm diff --git a/Resources/Locale/en-US/_CP14/job/department.ftl b/Resources/Locale/en-US/_CP14/job/department.ftl index bc604e6f8c..4e2b78f247 100644 --- a/Resources/Locale/en-US/_CP14/job/department.ftl +++ b/Resources/Locale/en-US/_CP14/job/department.ftl @@ -11,4 +11,7 @@ department-CP14Guard = Guards department-CP14Guard-desc = Protectors and warriors who oversee security and law and order in all corners of the Empire. department-CP14Artisan = Artisans -department-CP14Artisan-desc = People who have learnt peaceful professions, people who help the settlement with their knowledge and skills. \ No newline at end of file +department-CP14Artisan-desc = People who have learnt peaceful professions, people who help the settlement with their knowledge and skills. + +department-CP14Demigods = Patrons +department-CP14Demigods-desc = Higher beings playing their own games, where ordinary creatures are merely pawns in their plans. \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/job/job.ftl b/Resources/Locale/en-US/_CP14/job/job.ftl index 76908b9b79..3cc550a40f 100644 --- a/Resources/Locale/en-US/_CP14/job/job.ftl +++ b/Resources/Locale/en-US/_CP14/job/job.ftl @@ -34,4 +34,12 @@ cp14-job-name-blacksmith = Blacksmith cp14-job-desc-blacksmith = Create and improve equipment for everyone in need! You have the power of metal and fire in your hands, and only you know how to use them carefully to create masterpieces. cp14-job-name-apprentice = Apprentice -cp14-job-desc-apprentice = A peaceful citizen of the empire, just beginning to learn the subtleties of various sciences. Choose a specialisation in equipment, and try to help others in their work, in exchange for a salary and invaluable experience. \ No newline at end of file +cp14-job-desc-apprentice = A peaceful citizen of the empire, just beginning to learn the subtleties of various sciences. Try to help others in their work, in exchange for a salary and invaluable experience. + +# Demigods + +cp14-job-name-god-merkas = Merkas +cp14-job-desc-god-merkas = God of purity and healing. TODO + +cp14-job-name-god-lumera = Lumera +cp14-job-desc-god-lumera = Patroness of the night sky and knowledge. Expand your influence by helping mortals gain new knowledge. \ 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 856cf0a331..2923b1e1f2 100644 --- a/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl +++ b/Resources/Locale/en-US/_CP14/magicEnergy/magic-spells.ftl @@ -22,4 +22,5 @@ cp14-magic-spell-pacified = It could hurt someone! cp14-magic-spell-target-not-mob = The target must be a living thing! cp14-magic-spell-target-dead = Can't be used on the dead! -cp14-magic-spell-target-alive = Can't be used on the living! \ No newline at end of file +cp14-magic-spell-target-alive = Can't be used on the living! +cp14-magic-spell-target-god-follower = Your target should be your follower! \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/religion/altar.ftl b/Resources/Locale/en-US/_CP14/religion/altar.ftl new file mode 100644 index 0000000000..3f8301ee75 --- /dev/null +++ b/Resources/Locale/en-US/_CP14/religion/altar.ftl @@ -0,0 +1,23 @@ +cp14-altar-wrapped-message = [bold]{$name}[/bold] prays, {$msg} +cp14-offer-soul-god-message = [bold]{$name}[/bold] [color=green]wants to become your follower[/color]. Touch him to establish a connection. +cp14-unoffer-soul-god-message = [bold]{$name}[/bold] [color=red]has changed his mind about becoming your follower.[/color] +cp14-become-follower-message = [bold]{$name}[/bold] [color=green]becomes your follower[/color]! +cp14-remove-follower-message = [bold]{$name}[/bold] [color=red]rejects you and will never be able to return to you![/color] +cp14-call-follower-message = [bold]{$name}[/bold] appeals to you! +cp14-critical-follower-message = [bold]{$name}[/bold] is falling into critical condition! +cp14-dead-follower-message = [bold]{$name}[/bold] is dead! + +cp14-renounce-action-popup = YOU ARE RENOUNCING YOUR PATRON! To confirm, perform the action again. +cp-renounce-action-god-popup = YOU ARE REJECTING YOUR FOLLOWER! To confirm, perform the action again. + +cp14-god-ui-title = Fast Travel +cp14-god-ui-follower = Followers +cp14-god-ui-altars = Altars +cp14-god-ui-follower-percentage = Follower percentage: {$count}% +cp14-god-ui-mana-percentage = Divine energy: {$count}% + +cp14-altar-become-follower = Become a follower +cp14-altar-become-follower-desc = You offer yourself into the service of your patron. If he agrees, your bond will be strengthened. + +cp14-alert-offer = Offer of patronage +cp14-alert-offer-desc = You want to become a follower of the patron, but there is no response from him yet. Click to cancel the offer. \ No newline at end of file diff --git a/Resources/Locale/en-US/_CP14/skill/requirements.ftl b/Resources/Locale/en-US/_CP14/skill/requirements.ftl index e9756629bf..0e15c7f90e 100644 --- a/Resources/Locale/en-US/_CP14/skill/requirements.ftl +++ b/Resources/Locale/en-US/_CP14/skill/requirements.ftl @@ -1,4 +1,5 @@ cp14-skill-req-prerequisite = Skill "{$name}" must be learned cp14-skill-req-species = You must be the race of “{$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 \ No newline at end of file +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 diff --git a/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl b/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl index 50644b7e6e..cd5ea1be7d 100644 --- a/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl +++ b/Resources/Locale/en-US/_CP14/skill/skill_meta.ftl @@ -31,4 +31,7 @@ cp14-skill-copper-melt-name = Copper melting cp14-skill-iron-melt-name = Iron melting cp14-skill-gold-melt-name = Gold melting cp14-skill-mithril-melt-name = Mithril melting -cp14-skill-glass-melt-name = Glasswork \ No newline at end of file +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 diff --git a/Resources/Locale/en-US/_CP14/skill/skill_meta_gods.ftl b/Resources/Locale/en-US/_CP14/skill/skill_meta_gods.ftl new file mode 100644 index 0000000000..0a6297a92b --- /dev/null +++ b/Resources/Locale/en-US/_CP14/skill/skill_meta_gods.ftl @@ -0,0 +1,6 @@ +cp14-skill-lumera-t1-name = The origins of the secret night +cp14-skill-lumera-t2-name = The waxing moon +cp14-skill-lumera-t3-name = The full moon of Lumera + +cp14-skill-lumera-mind-scan-name = Study of minds +cp14-skill-lumera-mind-scan-desc = You are able to discern the skills possessed by mortals. You can see what spells they are capable of casting and what they are capable of doing. \ 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 a29e6edd76..ca386fa6ac 100644 --- a/Resources/Locale/en-US/_CP14/skill/skill_tree.ftl +++ b/Resources/Locale/en-US/_CP14/skill/skill_tree.ftl @@ -29,8 +29,14 @@ cp14-skill-tree-martial-desc = Master the secrets of deadly weapons, or make you # Job -cp14-skill-tree-thaumaturgy-name = Alchemy -cp14-skill-tree-thaumaturgy-desc = The art of creating magical potions that can kill, raise from the dead, or turn creatures into sheep. +#cp14-skill-tree-thaumaturgy-name = Alchemy +#cp14-skill-tree-thaumaturgy-desc = The art of creating magical potions that can kill, raise from the dead, or turn creatures into sheep. -cp14-skill-tree-blacksmithing-name = Blacksmithing -cp14-skill-tree-blacksmithing-desc = The art of turning metal into various useful things. \ No newline at end of file +#cp14-skill-tree-blacksmithing-name = Blacksmithing +#cp14-skill-tree-blacksmithing-desc = The art of turning metal into various useful things. + +#cp14-skill-tree-trading-name = Trading +#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 diff --git a/Resources/Locale/en-US/_CP14/skill/ui.ftl b/Resources/Locale/en-US/_CP14/skill/ui.ftl index c7a86baaa5..2935519aa3 100644 --- a/Resources/Locale/en-US/_CP14/skill/ui.ftl +++ b/Resources/Locale/en-US/_CP14/skill/ui.ftl @@ -14,4 +14,9 @@ cp14-research-recipe-list = Research costs: cp14-research-craft = Research cp14-skill-desc-add-mana = Increases your character's mana amount by {$mana}. -cp14-skill-desc-unlock-recipes = Opens up the possibility of crafting: \ No newline at end of file +cp14-skill-desc-unlock-recipes = Opens up the possibility of crafting: + +cp14-skill-popup-added-points = The boundaries of your consciousness are expanding. New memory points: {$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 diff --git a/Resources/Locale/en-US/_CP14/trading/ui.ftl b/Resources/Locale/en-US/_CP14/trading/ui.ftl index a8dd5a8f04..0cf8c06490 100644 --- a/Resources/Locale/en-US/_CP14/trading/ui.ftl +++ b/Resources/Locale/en-US/_CP14/trading/ui.ftl @@ -8,4 +8,6 @@ cp14-trading-faction-prefix = Trading with: cp14-trading-failure-popup-money = Not enough funds on the platform! -cp14-trading-contract-use = Trade with "{$name}" unlocked! \ No newline at end of file +cp14-trading-contract-use = Trade with "{$name}" unlocked! + +cp14-trading-empty-price = None! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl b/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl index ca45030507..320ff2fb53 100644 --- a/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl +++ b/Resources/Locale/ru-RU/_CP14/_PROTO/entities/entities.ftl @@ -754,6 +754,9 @@ ent-CP14ClothingEyesAlchemyGlasses = алхимические очки ent-CP14ClothingEyesAlchemyMonocle = алхимический монокль .desc = Специальный магический монокль, позволяющий четко видеть состав любых смесей. +ent-CP14ClothingEyesMerchantMonocle = монокль торговца + .desc = Магический увеличительный монокль высочайшего качества, позволяющий вам определить точную цену любого товара. + ent-CP14ClothingEyesThaumaturgyGlasses = тауматургические очки .desc = Очки, позволяющие сканировать магические предметы и существ, чтобы четко видеть количество оставшейся в них энергии. diff --git a/Resources/Locale/ru-RU/_CP14/job/department.ftl b/Resources/Locale/ru-RU/_CP14/job/department.ftl index d8f03718fe..1463c2921b 100644 --- a/Resources/Locale/ru-RU/_CP14/job/department.ftl +++ b/Resources/Locale/ru-RU/_CP14/job/department.ftl @@ -11,4 +11,7 @@ department-CP14Guard = Стража department-CP14Guard-desc = Защитники и войны, следящие за безопасностью и правопорядком во всех уголках империи. department-CP14Artisan = Ремесленники -department-CP14Artisan-desc = Освоившие мирные профессии, люди, которые помогают поселению своими знаниями и умениями. \ No newline at end of file +department-CP14Artisan-desc = Освоившие мирные профессии, люди, которые помогают поселению своими знаниями и умениями. + +department-CP14Demigods = Покровители +department-CP14Demigods-desc = Высшие сущности, играющие в свои собственные игры, где обычные существа лишь пешки в их планах. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/job/job.ftl b/Resources/Locale/ru-RU/_CP14/job/job.ftl index 985eab7686..fa674aaafe 100644 --- a/Resources/Locale/ru-RU/_CP14/job/job.ftl +++ b/Resources/Locale/ru-RU/_CP14/job/job.ftl @@ -34,4 +34,12 @@ cp14-job-name-blacksmith = Кузнец cp14-job-desc-blacksmith = Создавайте и улучшайте экипировку для всех нуждающихся! В ваших руках мощь металла и огня, и только вы знаете как аккуратно использовать их, чтобы создавать шедевры. cp14-job-name-apprentice = Подмастерье -cp14-job-desc-apprentice = Мирный житель империи, только начинающий постигать тонкости различных наук. Выберите специализацию в экипировке, и постарайтесь помочь другим в их работе, в обмен на зарплату и бесценный опыт. \ No newline at end of file +cp14-job-desc-apprentice = Мирный житель империи, только начинающий постигать тонкости различных наук. Постарайтесь помочь другим в их работе, в обмен на зарплату и бесценный опыт. + +# Demigods + +cp14-job-name-god-merkas = Меркас +cp14-job-desc-god-merkas = Бог света и исцеления. TODO + +cp14-job-name-god-lumera = Лумера +cp14-job-desc-god-lumera = Покровительница ночного неба и знаний. Расширяйте свое влияние, помогая смертным обретать новые знания. \ 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 16299ddc79..c554421f7f 100644 --- a/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl +++ b/Resources/Locale/ru-RU/_CP14/magicEnergy/magic-spells.ftl @@ -22,4 +22,5 @@ cp14-magic-spell-pacified = Это может навредить кому либ cp14-magic-spell-target-not-mob = Цель должна быть живым существом! cp14-magic-spell-target-dead = Нельзя использовать на мертвых! -cp14-magic-spell-target-alive = Нельзя использовать на живых! \ No newline at end of file +cp14-magic-spell-target-alive = Нельзя использовать на живых! +cp14-magic-spell-target-god-follower = Цель должна быть вашим последователем! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/religion/altar.ftl b/Resources/Locale/ru-RU/_CP14/religion/altar.ftl new file mode 100644 index 0000000000..df2322485d --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/religion/altar.ftl @@ -0,0 +1,23 @@ +cp14-altar-wrapped-message = [bold]{$name}[/bold] молится, {$msg} +cp14-offer-soul-god-message = [bold]{$name}[/bold] [color=green]хочет стать вашим последователем[/color]. Прикоснитесь к нему, чтобы установить связь. +cp14-unoffer-soul-god-message = [bold]{$name}[/bold] [color=red]передумал становиться вашим последователем.[/color] +cp14-become-follower-message = [bold]{$name}[/bold] [color=green]становится вашим последователем[/color]! +cp14-remove-follower-message = [bold]{$name}[/bold] [color=red]отвергает вас, и больше никогда не сможет вернться к вам![/color] +cp14-call-follower-message = [bold]{$name}[/bold] взывает к вам! +cp14-critical-follower-message = [bold]{$name}[/bold] падает в критическое состояние! +cp14-dead-follower-message = [bold]{$name}[/bold] погибает! + +cp14-renounce-action-popup = ВЫ ОТРЕКАЕТЕСЬ ОТ ПОКРОВИТЕЛЯ! Для подтверждения выполните действие еще раз. +cp-renounce-action-god-popup = ВЫ ОТВЕРГАЕТЕ СВОЕГО ПОСЛЕДОВАТЕЛЯ! Для подтверждения выполните действие еще раз. + +cp14-god-ui-title = Быстрое перемещение +cp14-god-ui-follower = Последователи +cp14-god-ui-altars = Алтари +cp14-god-ui-follower-percentage = Процент последователей: {$count}% +cp14-god-ui-mana-percentage = Божественная энергия: {$count}% + +cp14-altar-become-follower = Стать последователем +cp14-altar-become-follower-desc = Вы предлагаете себя в службу покровителю. Если он согласится, ваша связь укрепится. + +cp14-alert-offer = Предложение о покровительстве +cp14-alert-offer-desc = Вы хотите стать последователем покровителя, но пока от него нет ответа. Нажмите, чтобы отменить предложение. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl b/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl index f174639cf1..1eede4ac12 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/requirements.ftl @@ -1,4 +1,5 @@ cp14-skill-req-prerequisite = Навык "{$name}" должен быть изучен cp14-skill-req-species = Вы должны быть расы "{$name}" cp14-skill-req-researched = Необходимо провести исследование на исследовательском столе -cp14-skill-req-impossible = Невозможно изучить во время раунда на текущий момент \ No newline at end of file +cp14-skill-req-impossible = Невозможно изучить во время раунда на текущий момент +cp14-skill-req-god-follower-percentage = Количество ваших последователей должно быть больше {$count}% \ 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 c62c84b2e0..20d16236c4 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/skill_meta.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/skill_meta.ftl @@ -31,4 +31,7 @@ cp14-skill-copper-melt-name = Плавка меди cp14-skill-iron-melt-name = Плавка железа cp14-skill-gold-melt-name = Плавка золота cp14-skill-mithril-melt-name = Плавка мифрила -cp14-skill-glass-melt-name = Работа со стеклом \ No newline at end of file +cp14-skill-glass-melt-name = Работа со стеклом + +cp14-skill-trader-wit-name = Торговая смекалка +cp14-skill-trader-wit-desc = Вы способны одним взглядом оценить и вычислить точную стоимость предмета в империи. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/skill/skill_meta_gods.ftl b/Resources/Locale/ru-RU/_CP14/skill/skill_meta_gods.ftl new file mode 100644 index 0000000000..14138cb193 --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/skill/skill_meta_gods.ftl @@ -0,0 +1,6 @@ +cp14-skill-lumera-t1-name = Истоки тайной ночи +cp14-skill-lumera-t2-name = Растущая луна +cp14-skill-lumera-t3-name = Полнолуние Лумеры + +cp14-skill-lumera-mind-scan-name = Изучение разумов +cp14-skill-lumera-mind-scan-desc = Вы способны узнавать какими навыками владеют смертные. Видеть, какие заклинания им подвластны, и на что они способны. \ 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 fc6e87d21d..acd5460f0b 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/skill_tree.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/skill_tree.ftl @@ -1,6 +1,3 @@ -cp14-skill-tree-blaksmithing-name = Кузнечное дело -cp14-skill-tree-blaksmithing-desc = Исследуйте и создавайте новые предметы из металла. - # Magic cp14-skill-tree-pyrokinetic-name = Пирокинетика @@ -31,8 +28,14 @@ cp14-skill-tree-martial-desc = Овладейте секретами смерт # Job -cp14-skill-tree-thaumaturgy-name = Алхимия -cp14-skill-tree-thaumaturgy-desc = Исскуство создания волшебных зелий, способных убивать, воскрешать из мертвых или превращать существ в овечек. +#cp14-skill-tree-thaumaturgy-name = Алхимия +#cp14-skill-tree-thaumaturgy-desc = Исскуство создания волшебных зелий, способных убивать, воскрешать из мертвых или превращать существ в овечек. -cp14-skill-tree-blacksmithing-name = Кузнечное дело -cp14-skill-tree-blacksmithing-desc = Исскуство превращения металла в различные полезные вещи. \ No newline at end of file +#cp14-skill-tree-blacksmithing-name = Кузнечное дело +#cp14-skill-tree-blacksmithing-desc = Исскуство превращения металла в различные полезные вещи. + +#cp14-skill-tree-trading-name = Торговля +#cp14-skill-tree-trading-desc = Исскуство познания где, когда, и за сколько продавать и покупать различные предметы. + +cp14-skill-tree-craftsman-name = Ремесленничество +cp14-skill-tree-craftsman-desc = Изучайте навыки и умения для создания и использования различных полезных вещей. \ 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 10933366e6..3aa48bd593 100644 --- a/Resources/Locale/ru-RU/_CP14/skill/ui.ftl +++ b/Resources/Locale/ru-RU/_CP14/skill/ui.ftl @@ -14,4 +14,9 @@ cp14-research-recipe-list = Затраты на исследование: cp14-research-craft = Исследовать cp14-skill-desc-add-mana = Увеличивает объем маны вашего персонажа на {$mana}. -cp14-skill-desc-unlock-recipes = Открывает возможность создания: \ No newline at end of file +cp14-skill-desc-unlock-recipes = Открывает возможность создания: + +cp14-skill-popup-added-points = Границы вашего сознания расширяются. Новых очков памяти: {$count} +cp14-skill-popup-forced-remove-skill = Вы начинаете забывать свое прошлое... Потеряно очков памяти: {$count} + +cp14-skill-examine-title = Этот персонаж владеет следующими навыками: \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/trading/ui.ftl b/Resources/Locale/ru-RU/_CP14/trading/ui.ftl index a512847922..42f8dd7b80 100644 --- a/Resources/Locale/ru-RU/_CP14/trading/ui.ftl +++ b/Resources/Locale/ru-RU/_CP14/trading/ui.ftl @@ -8,4 +8,6 @@ cp14-trading-faction-prefix = Торговля с: cp14-trading-failure-popup-money = Недостаточно средств на платформе! -cp14-trading-contract-use = Торговля с "{$name}" разблокирована! \ No newline at end of file +cp14-trading-contract-use = Торговля с "{$name}" разблокирована! + +cp14-trading-empty-price = Отсутствует! \ No newline at end of file diff --git a/Resources/Maps/_CP14/comoss.yml b/Resources/Maps/_CP14/comoss.yml index ccc102b69c..3225112c8b 100644 --- a/Resources/Maps/_CP14/comoss.yml +++ b/Resources/Maps/_CP14/comoss.yml @@ -4,8 +4,8 @@ meta: engineVersion: 260.2.0 forkId: "" forkVersion: "" - time: 06/04/2025 21:43:51 - entityCount: 15261 + time: 06/15/2025 11:12:00 + entityCount: 15254 maps: - 1 grids: @@ -190,7 +190,7 @@ entities: version: 7 0,-3: ind: 0,-3 - tiles: AgAAAAAAAAIAAAAAAAAcAAAAAAAAAgAAAAABAAIAAAAADwAcAAAAAAUAAgAAAAAHAAIAAAAACgACAAAAAAIAHAAAAAAEABwAAAAABQAcAAAAAAEAHAAAAAABABwAAAAAAQAeAAAAAAEAHgAAAAAAAAMAAAAAAAADAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAADAAAAAAgAAwAAAAAAAAMAAAAAAAADAAAAAAQAAwAAAAAAAAMAAAAAAAAQAAAAAAAAEAAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAAAwAAAAAAAAMAAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAAMAAAAABAABAAAAAAIAAQAAAAADAAEAAAAAAgANAAAAAAAAHgAAAAAAACEAAAAAAAACAAAAAAYAHAAAAAAAABwAAAAAAAAcAAAAAAAAHAAAAAAAABwAAAAAAAAcAAAAAAAAHAAAAAAAAB4AAAAAAgADAAAAAAAAAQAAAAACAB4AAAAAAAABAAAAAAQAAQAAAAABAAEAAAAAAwAhAAAAAAAAAgAAAAANAB4AAAAAAAAcAAAAAAAAHAAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAAeAAAAAAIAAwAAAAAAAB4AAAAAAwABAAAAAAQAAQAAAAADAAEAAAAAAQABAAAAAAQAIQAAAAAAAAIAAAAABAAeAAAAAAAAHgAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAB4AAAAAAAAdAAAAAAAAHgAAAAAFAAMAAAAAAAABAAAAAAAAAQAAAAACAAEAAAAAAgABAAAAAAQAHgAAAAAEACEAAAAAAAAeAAAAAAUAHAAAAAAAAB4AAAAAAAAdAAAAAAAAHQAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAABQADAAAAAAAAAQAAAAADAAEAAAAAAAABAAAAAAEAAQAAAAACAAEAAAAAAgAhAAAAAAAAHgAAAAAAAB0AAAAAAAAeAAAAAAAAHQAAAAAAAB0AAAAAAAAcAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAMAAwAAAAAAAAEAAAAAAQABAAAAAAQAAQAAAAAEAAEAAAAAAgABAAAAAAAAIQAAAAAAAB4AAAAAAQAdAAAAAAAAHQAAAAAAAB0AAAAAAAAcAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAAMAAAAAAAABAAAAAAEAAQAAAAACAAEAAAAAAQABAAAAAAQAAQAAAAAAACEAAAAAAAACAAAAAA0AHAAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAAdAAAAAAAAHgAAAAAAAB4AAAAAAQADAAAAAAAAAQAAAAACAAEAAAAAAgABAAAAAAQAAQAAAAADAAEAAAAAAgAhAAAAAAAAHAAAAAAAAB4AAAAAAQAeAAAAAAAAHgAAAAACAB4AAAAABAAeAAAAAAIAHQAAAAAAAAIAAAAABgAeAAAAAAEAAwAAAAAAAAEAAAAAAwABAAAAAAAAAQAAAAADAAEAAAAAAwABAAAAAAEAIQAAAAAAAB4AAAAABQAGAAAAAAIABgAAAAAAAAYAAAAAAgAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAIAHgAAAAABAAMAAAAAAgAeAAAAAAUAAQAAAAADAAEAAAAABAABAAAAAAAAAQAAAAACACEAAAAAAAAeAAAAAAEABgAAAAACAAUAAAAAAwAFAAAAAAMABQAAAAADAAUAAAAAAgAFAAAAAAIABgAAAAADAB4AAAAABAADAAAAAAAAHgAAAAAAAB4AAAAAAgAeAAAAAAQAHgAAAAAAAAEAAAAAAAACAAAAAAAAAgAAAAAEAAYAAAAAAgAFAAAAAAMABQAAAAABAAUAAAAAAQAGAAAAAAEABgAAAAADAAYAAAAAAQAeAAAAAAEAAwAAAAAAAB4AAAAABQAeAAAAAAIAHgAAAAABAB4AAAAAAwAeAAAAAAUAAgAAAAAAAAIAAAAACgAGAAAAAAEABQAAAAACAAUAAAAAAAAFAAAAAAAABQAAAAABAAUAAAAAAgAGAAAAAAEAHgAAAAAFAAMAAAAABgADAAAAAAQAAwAAAAADAAMAAAAABAADAAAAAAMAAwAAAAABAA== + tiles: AgAAAAAAAAIAAAAAAAAcAAAAAAAAAgAAAAABAAIAAAAADwAcAAAAAAUAAgAAAAAHAAIAAAAACgACAAAAAAIAHAAAAAAEABwAAAAABQAcAAAAAAEAHAAAAAABABwAAAAAAQAeAAAAAAEAHgAAAAAAAAMAAAAAAAADAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAADAAAAAAgAAwAAAAAAAAMAAAAAAAADAAAAAAQAAwAAAAAAAAMAAAAAAAAQAAAAAAAAEAAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAAAwAAAAAAAAMAAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAA0AAAAAAAANAAAAAAAADQAAAAAAAAMAAAAABAABAAAAAAIAAQAAAAADAAEAAAAAAgANAAAAAAAAHgAAAAAAACEAAAAAAAACAAAAAAYAHAAAAAAAABwAAAAAAAAcAAAAAAAAHAAAAAAAABwAAAAAAAAcAAAAAAAAHAAAAAAAAB4AAAAAAgADAAAAAAAAAQAAAAACAB4AAAAAAAABAAAAAAQAAQAAAAABAAEAAAAAAwAhAAAAAAAAAgAAAAANAB4AAAAAAAAcAAAAAAAAHAAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAB0AAAAAAAAeAAAAAAIAAwAAAAAAAB4AAAAAAwABAAAAAAQAAQAAAAADAAEAAAAAAQABAAAAAAQAIQAAAAAAAAIAAAAABAAeAAAAAAAAHgAAAAAAAB0AAAAAAAAdAAAAAAAAHQAAAAAAAB4AAAAAAAAdAAAAAAAAHgAAAAAFAAMAAAAAAAABAAAAAAAAAQAAAAACAAEAAAAAAgABAAAAAAQAHgAAAAAEACEAAAAAAAAeAAAAAAUAHAAAAAAAAB4AAAAAAAAdAAAAAAAAHQAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAB4AAAAABQADAAAAAAAAAQAAAAADAAEAAAAAAAABAAAAAAEAAQAAAAACAAEAAAAAAgAhAAAAAAAAHgAAAAAAAB0AAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAcAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAMAAwAAAAAAAAEAAAAAAQABAAAAAAQAAQAAAAAEAAEAAAAAAgABAAAAAAAAIQAAAAAAAB4AAAAAAQAdAAAAAAAAEAAAAAAAABEAAAAAAAAQAAAAAAAAHgAAAAAAAB4AAAAAAAAeAAAAAAAAHgAAAAAAAAMAAAAAAAABAAAAAAEAAQAAAAACAAEAAAAAAQABAAAAAAQAAQAAAAAAACEAAAAAAAACAAAAAA0AHAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAB0AAAAAAAAdAAAAAAAAHgAAAAAAAB4AAAAAAQADAAAAAAAAAQAAAAACAAEAAAAAAgABAAAAAAQAAQAAAAADAAEAAAAAAgAhAAAAAAAAHAAAAAAAAB4AAAAAAQAeAAAAAAAAHgAAAAACAB4AAAAABAAeAAAAAAIAHQAAAAAAAAIAAAAABgAeAAAAAAEAAwAAAAAAAAEAAAAAAwABAAAAAAAAAQAAAAADAAEAAAAAAwABAAAAAAEAIQAAAAAAAB4AAAAABQAGAAAAAAIABgAAAAAAAAYAAAAAAgAGAAAAAAAABgAAAAAAAAYAAAAAAAAGAAAAAAIAHgAAAAABAAMAAAAAAgAeAAAAAAUAAQAAAAADAAEAAAAABAABAAAAAAAAAQAAAAACACEAAAAAAAAeAAAAAAEABgAAAAACAAUAAAAAAwAFAAAAAAMABQAAAAADAAUAAAAAAgAFAAAAAAIABgAAAAADAB4AAAAABAADAAAAAAAAHgAAAAAAAB4AAAAAAgAeAAAAAAQAHgAAAAAAAAEAAAAAAAACAAAAAAAAAgAAAAAEAAYAAAAAAgAFAAAAAAMABQAAAAABAAUAAAAAAQAGAAAAAAEABgAAAAADAAYAAAAAAQAeAAAAAAEAAwAAAAAAAB4AAAAABQAeAAAAAAIAHgAAAAABAB4AAAAAAwAeAAAAAAUAAgAAAAAAAAIAAAAACgAGAAAAAAEABQAAAAACAAUAAAAAAAAFAAAAAAAABQAAAAABAAUAAAAAAgAGAAAAAAEAHgAAAAAFAAMAAAAABgADAAAAAAQAAwAAAAADAAMAAAAABAADAAAAAAMAAwAAAAABAA== version: 7 1,-3: ind: 1,-3 @@ -730,6 +730,26 @@ entities: decals: 168: -22,-69 169: -22,-71 + - node: + color: '#FFFFFFFF' + id: CP14BrickTileStoneInnerNe + decals: + 231: 3,-40 + - node: + color: '#FFFFFFFF' + id: CP14BrickTileStoneInnerNw + decals: + 232: 5,-40 + - node: + color: '#FFFFFFFF' + id: CP14BrickTileStoneInnerSe + decals: + 229: 3,-38 + - node: + color: '#FFFFFFFF' + id: CP14BrickTileStoneInnerSw + decals: + 230: 5,-38 - node: color: '#FFFFFFFF' id: CP14BrickTileStoneLineE @@ -738,6 +758,7 @@ entities: 115: 21,-44 128: 18,-44 129: 18,-43 + 228: 3,-39 - node: color: '#FFFFFFFF' id: CP14BrickTileStoneLineN @@ -756,6 +777,7 @@ entities: 203: -3,-20 204: -10,-20 205: -9,-20 + 225: 4,-40 - node: color: '#FFFFFFFF' id: CP14BrickTileStoneLineS @@ -764,6 +786,7 @@ entities: 119: 19,-45 120: 20,-42 121: 19,-42 + 226: 4,-38 - node: color: '#FFFFFFFF' id: CP14BrickTileStoneLineW @@ -772,6 +795,7 @@ entities: 117: 21,-43 126: 18,-44 127: 18,-43 + 227: 5,-39 - node: cleanable: True color: '#6EAAEBFF' @@ -892,6 +916,14 @@ entities: - type: Transform pos: 15.5,0.5 parent: 1 +- proto: CP14AltarPrimordialGodLumera + entities: + - uid: 7335 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 4.5,-38.5 + parent: 1 - proto: CP14BarrelWater entities: - uid: 10 @@ -10860,12 +10892,6 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,-38.5 parent: 1 - - uid: 26 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-39.5 - parent: 1 - uid: 1861 components: - type: Transform @@ -30774,18 +30800,6 @@ entities: - type: Transform pos: 103.5,59.5 parent: 1 - - uid: 7335 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-38.5 - parent: 1 - - uid: 8737 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 5.5,-38.5 - parent: 1 - uid: 8901 components: - type: Transform @@ -30923,18 +30937,6 @@ entities: - type: Transform pos: 109.5,58.5 parent: 1 - - uid: 11070 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 5.5,-37.5 - parent: 1 - - uid: 11140 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-37.5 - parent: 1 - uid: 11141 components: - type: Transform @@ -30987,12 +30989,6 @@ entities: - type: Transform pos: 34.5,-2.5 parent: 1 - - uid: 13907 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-38.5 - parent: 1 - uid: 14556 components: - type: Transform @@ -31034,12 +31030,6 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,-39.5 parent: 1 - - uid: 14623 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 5.5,-40.5 - parent: 1 - uid: 14624 components: - type: Transform @@ -31052,24 +31042,12 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,-40.5 parent: 1 - - uid: 14626 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-39.5 - parent: 1 - uid: 14632 components: - type: Transform rot: -1.5707963267948966 rad pos: 2.5,-41.5 parent: 1 - - uid: 14633 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-37.5 - parent: 1 - uid: 14636 components: - type: Transform @@ -31100,12 +31078,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,-40.5 parent: 1 - - uid: 14946 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 5.5,-39.5 - parent: 1 - uid: 14963 components: - type: Transform @@ -38165,6 +38137,13 @@ entities: - type: Transform pos: 18.607292,16.662266 parent: 1 +- proto: CP14BlueAmanita + entities: + - uid: 26 + components: + - type: Transform + pos: 4.5032434,-39.154808 + parent: 1 - proto: CP14BlueBottle entities: - uid: 7125 @@ -38296,6 +38275,28 @@ entities: - type: Transform pos: -17.264824,5.8419228 parent: 1 +- proto: CP14CandleBlue + entities: + - uid: 8737 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 5.330699,-38.98751 + parent: 1 + - uid: 9582 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.902204,-39.324844 + parent: 1 +- proto: CP14CandleBlueSmall + entities: + - uid: 9583 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.6772437,-38.26787 + parent: 1 - proto: CP14CandleGreen entities: - uid: 7165 @@ -40719,17 +40720,17 @@ entities: rot: 3.141592653589793 rad pos: -5.5,-34.5 parent: 1 - - uid: 11655 + - uid: 11140 components: - type: Transform - rot: 3.141592653589793 rad - pos: 5.5,-34.5 + rot: 1.5707963267948966 rad + pos: 3.5,-31.5 parent: 1 - - uid: 11656 + - uid: 11311 components: - type: Transform - rot: 3.141592653589793 rad - pos: 4.5,-34.5 + rot: 1.5707963267948966 rad + pos: 3.5,-32.5 parent: 1 - proto: CP14Dayflin entities: @@ -65910,12 +65911,6 @@ entities: rot: 1.5707963267948966 rad pos: -7.5,-43.5 parent: 1 - - uid: 15366 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 6.5,-36.5 - parent: 1 - uid: 15367 components: - type: Transform @@ -67628,11 +67623,6 @@ entities: - type: Transform pos: 12.5,-43.5 parent: 1 - - uid: 15370 - components: - - type: Transform - pos: 3.5,-36.5 - parent: 1 - uid: 15371 components: - type: Transform @@ -68827,6 +68817,14 @@ entities: fixtures: {} - proto: CP14WallmountLampEmpty entities: + - uid: 11070 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 3.5,-30.5 + parent: 1 + - type: Fixtures + fixtures: {} - uid: 11758 components: - type: Transform @@ -68956,14 +68954,6 @@ entities: parent: 1 - type: Fixtures fixtures: {} - - uid: 11836 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 3.5,-32.5 - parent: 1 - - type: Fixtures - fixtures: {} - uid: 11837 components: - type: Transform @@ -82689,6 +82679,16 @@ entities: - type: Transform pos: 2.5,21.5 parent: 1 + - uid: 11393 + components: + - type: Transform + pos: 4.5,-35.5 + parent: 1 + - uid: 11394 + components: + - type: Transform + pos: 5.5,-35.5 + parent: 1 - uid: 14358 components: - type: Transform @@ -83812,16 +83812,6 @@ entities: - type: Transform pos: -6.5,1.5 parent: 1 - - uid: 14579 - components: - - type: Transform - pos: 2.5,-32.5 - parent: 1 - - uid: 14581 - components: - - type: Transform - pos: 2.5,-31.5 - parent: 1 - uid: 14582 components: - type: Transform @@ -85516,15 +85506,17 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,19.5 parent: 1 - - uid: 14592 + - uid: 11312 components: - type: Transform - pos: 4.5,-35.5 + rot: 1.5707963267948966 rad + pos: 2.5,-32.5 parent: 1 - - uid: 14608 + - uid: 11370 components: - type: Transform - pos: 5.5,-35.5 + rot: 1.5707963267948966 rad + pos: 2.5,-31.5 parent: 1 - uid: 14695 components: diff --git a/Resources/Maps/_CP14/venicialis.yml b/Resources/Maps/_CP14/venicialis.yml index ebabe9c81b..dff7dd07f1 100644 --- a/Resources/Maps/_CP14/venicialis.yml +++ b/Resources/Maps/_CP14/venicialis.yml @@ -4,8 +4,8 @@ meta: engineVersion: 260.2.0 forkId: "" forkVersion: "" - time: 06/07/2025 21:12:48 - entityCount: 15201 + time: 06/15/2025 11:14:05 + entityCount: 15204 maps: - 2 grids: @@ -96,7 +96,7 @@ entities: version: 7 0,-1: ind: 0,-1 - tiles: IAAAAAAEACAAAAAABAAgAAAAAAEAIAAAAAAEACAAAAAABAAgAAAAAAEAIAAAAAAEACAAAAAAAwACAAAAAAoAAgAAAAAEAAIAAAAAAAACAAAAAAkAAgAAAAACAAIAAAAABwACAAAAAAcAAgAAAAALACAAAAAAAwAgAAAAAAEAIAAAAAAEACAAAAAAAwAgAAAAAAMAAgAAAAAGACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAwACAAAAAAsAAgAAAAAOAAIAAAAAAwACAAAAAAsAAgAAAAAJACAAAAAAAQAgAAAAAAEAIAAAAAADACAAAAAABAAgAAAAAAMAIAAAAAADAAIAAAAADQACAAAAAAwAIAAAAAABAAIAAAAADgACAAAAAA8AAgAAAAAGACAAAAAAAAAgAAAAAAQAIAAAAAADACAAAAAABAAgAAAAAAMAAgAAAAAMAAIAAAAAAgACAAAAAAkAAgAAAAAAAAIAAAAABAACAAAAAAkAIAAAAAADACAAAAAAAgACAAAAAAkAAgAAAAACAAIAAAAADwAgAAAAAAQAIAAAAAADAAIAAAAABAACAAAAAA8AAgAAAAAMAAIAAAAAAQACAAAAAA8AAgAAAAADAAIAAAAAAgACAAAAAAsAAgAAAAAJAAIAAAAADgACAAAAAAgAAgAAAAAEAAIAAAAABAACAAAAAAgAAgAAAAACAB0AAAAAAAAeAAAAAAIAHgAAAAACAB4AAAAAAwAdAAAAAAMAHQAAAAADAB4AAAAAAwAeAAAAAAQAHgAAAAACAB4AAAAAAQAeAAAAAAIAHQAAAAACAB0AAAAAAAAdAAAAAAEAHQAAAAAEAB4AAAAAAAAeAAAAAAQAHQAAAAABAAIAAAAAAgAgAAAAAAMAAgAAAAALAAIAAAAACAACAAAAAA0AAgAAAAANAAIAAAAACwACAAAAAAMAAgAAAAAKAAIAAAAABwAgAAAAAAEAIAAAAAACACAAAAAAAgACAAAAAAoAAgAAAAACAAIAAAAADAACAAAAAAAAAgAAAAALACAAAAAAAQACAAAAAA4AAgAAAAAGACAAAAAAAQAgAAAAAAAAIAAAAAADACAAAAAAAQACAAAAAAgAAgAAAAABAAIAAAAAAQACAAAAAAsAAgAAAAAFAAIAAAAACQACAAAAAAQAIAAAAAADAAIAAAAACgAcAAAAAAUAHAAAAAAAABwAAAAAAgAcAAAAAAUAHAAAAAAFAB0AAAAABAAdAAAAAAEAHQAAAAACAB0AAAAAAgAdAAAAAAQAHQAAAAAFAB0AAAAABAAdAAAAAAMAHQAAAAADACAAAAAAAwAgAAAAAAIAHAAAAAACABwAAAAAAQAcAAAAAAMAHAAAAAABAB0AAAAAAgAdAAAAAAQAHQAAAAADAB4AAAAABAAFAAAAAAAABQAAAAABAAUAAAAAAAAFAAAAAAMABQAAAAADAB0AAAAABQAgAAAAAAIAIAAAAAAEAB0AAAAAAQAdAAAAAAAAHAAAAAABABwAAAAAAwAdAAAAAAEAHQAAAAADAB4AAAAABAAeAAAAAAUABQAAAAABAAUAAAAAAQAFAAAAAAMABQAAAAAAAAUAAAAAAAAHAAAAAAIABQAAAAAAAAUAAAAAAAAeAAAAAAEAHQAAAAACABwAAAAAAgAcAAAAAAMABQAAAAADAAUAAAAAAwAHAAAAAAMABwAAAAACAAcAAAAAAAAHAAAAAAAABQAAAAACAAYAAAAAAwAFAAAAAAEABQAAAAACAAUAAAAAAQAFAAAAAAEAHgAAAAABAB0AAAAAAgAdAAAAAAAAHAAAAAADAAUAAAAAAwAFAAAAAAMABwAAAAADAAcAAAAAAAAHAAAAAAMABwAAAAACAAUAAAAAAQAGAAAAAAAABQAAAAABAAUAAAAAAgAHAAAAAAAABwAAAAACAA4AAAAAAAAOAAAAAAQAHgAAAAABAB0AAAAABQAFAAAAAAEABQAAAAACAAcAAAAAAAAHAAAAAAMABwAAAAACAAcAAAAAAAAFAAAAAAMABQAAAAACAAUAAAAAAgAFAAAAAAAABwAAAAABAAcAAAAAAAAOAAAAAAQADgAAAAAEAA4AAAAAAAAdAAAAAAQABQAAAAADAAUAAAAAAwAFAAAAAAEABQAAAAADAAUAAAAAAQAFAAAAAAEABQAAAAACAAUAAAAAAgAFAAAAAAMABQAAAAAAAAcAAAAAAwAHAAAAAAAAIQAAAAAEAA4AAAAAAgAOAAAAAAMAHQAAAAAAAAUAAAAAAAAFAAAAAAIABQAAAAADAAYAAAAAAQAGAAAAAAMABgAAAAADAAUAAAAAAgAFAAAAAAIABQAAAAACAAUAAAAAAwAFAAAAAAMABQAAAAACAA== + tiles: IAAAAAAEACAAAAAABAAgAAAAAAEAIAAAAAAEACAAAAAABAAgAAAAAAEAIAAAAAAEACAAAAAAAwACAAAAAAoAAgAAAAAEAAIAAAAAAAACAAAAAAkAAgAAAAACAAIAAAAABwACAAAAAAcAAgAAAAALACAAAAAAAwAgAAAAAAEAIAAAAAAEACAAAAAAAwAgAAAAAAMAAgAAAAAGACAAAAAAAgAgAAAAAAEAIAAAAAAAACAAAAAAAwACAAAAAAsAAgAAAAAOAAIAAAAAAwACAAAAAAsAAgAAAAAJACAAAAAAAQAgAAAAAAEAIAAAAAADACAAAAAABAAgAAAAAAMAIAAAAAADAAIAAAAADQACAAAAAAwAIAAAAAABAAIAAAAADgACAAAAAA8AAgAAAAAGACAAAAAAAAAgAAAAAAQAIAAAAAADACAAAAAABAAgAAAAAAMAAgAAAAAMAAIAAAAAAgACAAAAAAkAAgAAAAAAAAIAAAAABAACAAAAAAkAIAAAAAADACAAAAAAAgACAAAAAAkAAgAAAAACAAIAAAAADwAgAAAAAAQAIAAAAAADAAIAAAAABAACAAAAAA8AAgAAAAAMAAIAAAAAAQACAAAAAA8AAgAAAAADAAIAAAAAAgACAAAAAAsAAgAAAAAJAAIAAAAADgACAAAAAAgAAgAAAAAEAAIAAAAABAACAAAAAAgAAgAAAAACAB0AAAAAAAAeAAAAAAIAHgAAAAACAB4AAAAAAwAdAAAAAAMAHQAAAAADAB4AAAAAAwAeAAAAAAQAHgAAAAACAB4AAAAAAQAeAAAAAAIAHQAAAAACAB0AAAAAAAAdAAAAAAEAHQAAAAAEAB4AAAAAAAAeAAAAAAQAHQAAAAABAAIAAAAAAgAgAAAAAAMAAgAAAAALAAIAAAAACAACAAAAAA0AAgAAAAANAAIAAAAACwACAAAAAAMAAgAAAAAKAAIAAAAABwAgAAAAAAEAIAAAAAACACAAAAAAAgACAAAAAAoAAgAAAAACAAIAAAAADAACAAAAAAAAAgAAAAALACAAAAAAAQACAAAAAA4AAgAAAAAGACAAAAAAAQAgAAAAAAAAIAAAAAADACAAAAAAAQACAAAAAAgAAgAAAAABAAIAAAAAAQACAAAAAAsAAgAAAAAFAAIAAAAACQACAAAAAAQAIAAAAAADAAIAAAAACgAcAAAAAAUAHAAAAAAAABwAAAAAAgAcAAAAAAUAHAAAAAAFAB0AAAAABAAdAAAAAAEAHQAAAAACAB0AAAAAAgAdAAAAAAQAHQAAAAAFAB0AAAAABAAdAAAAAAMAHQAAAAADACAAAAAAAwAgAAAAAAIAEAAAAAAAABAAAAAAAAAQAAAAAAAAHAAAAAABAB0AAAAAAgAdAAAAAAQAHQAAAAADAB4AAAAABAAFAAAAAAAABQAAAAABAAUAAAAAAAAFAAAAAAMABQAAAAADAB0AAAAABQAgAAAAAAIAIAAAAAAEABAAAAAAAAARAAAAAAAAEAAAAAAAABwAAAAAAwAdAAAAAAEAHQAAAAADAB4AAAAABAAeAAAAAAUABQAAAAABAAUAAAAAAQAFAAAAAAMABQAAAAAAAAUAAAAAAAAHAAAAAAIABQAAAAAAAAUAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAcAAAAAAMABQAAAAADAAUAAAAAAwAHAAAAAAMABwAAAAACAAcAAAAAAAAHAAAAAAAABQAAAAACAAYAAAAAAwAFAAAAAAEABQAAAAACAAUAAAAAAQAFAAAAAAEAHgAAAAABAB0AAAAAAgAdAAAAAAAAHAAAAAADAAUAAAAAAwAFAAAAAAMABwAAAAADAAcAAAAAAAAHAAAAAAMABwAAAAACAAUAAAAAAQAGAAAAAAAABQAAAAABAAUAAAAAAgAHAAAAAAAABwAAAAACAA4AAAAAAAAOAAAAAAQAHgAAAAABAB0AAAAABQAFAAAAAAEABQAAAAACAAcAAAAAAAAHAAAAAAMABwAAAAACAAcAAAAAAAAFAAAAAAMABQAAAAACAAUAAAAAAgAFAAAAAAAABwAAAAABAAcAAAAAAAAOAAAAAAQADgAAAAAEAA4AAAAAAAAdAAAAAAQABQAAAAADAAUAAAAAAwAFAAAAAAEABQAAAAADAAUAAAAAAQAFAAAAAAEABQAAAAACAAUAAAAAAgAFAAAAAAMABQAAAAAAAAcAAAAAAwAHAAAAAAAAIQAAAAAEAA4AAAAAAgAOAAAAAAMAHQAAAAAAAAUAAAAAAAAFAAAAAAIABQAAAAADAAYAAAAAAQAGAAAAAAMABgAAAAADAAUAAAAAAgAFAAAAAAIABQAAAAACAAUAAAAAAwAFAAAAAAMABQAAAAACAA== version: 7 0,0: ind: 0,0 @@ -500,11 +500,24 @@ entities: id: CP14BrickTileStoneInnerNe decals: 79: 8,-31 + 142: 0,-7 + 143: 0,-7 + - node: + color: '#FFFFFFFF' + id: CP14BrickTileStoneInnerNw + decals: + 144: 2,-7 - node: color: '#FFFFFFFF' id: CP14BrickTileStoneInnerSe decals: 78: 8,-28 + 140: 0,-5 + - node: + color: '#FFFFFFFF' + id: CP14BrickTileStoneInnerSw + decals: + 141: 2,-5 - node: color: '#DE3A3A96' id: CP14BrickTileStoneLineE @@ -519,6 +532,7 @@ entities: 51: 24,-24 74: 8,-30 75: 8,-29 + 138: 0,-6 - node: color: '#DE3A3A96' id: CP14BrickTileStoneLineN @@ -532,6 +546,7 @@ entities: 47: 22,-23 48: 23,-23 77: 9,-31 + 139: 1,-7 - node: color: '#DE3A3A96' id: CP14BrickTileStoneLineS @@ -545,6 +560,7 @@ entities: 42: 22,-27 43: 23,-27 76: 9,-28 + 136: 1,-5 - node: color: '#DE3A3A96' id: CP14BrickTileStoneLineW @@ -557,6 +573,7 @@ entities: 44: 21,-26 45: 21,-25 46: 21,-24 + 137: 2,-6 - node: color: '#FFFFFFFF' id: CP14FloraGrass10 @@ -753,6 +770,13 @@ entities: rot: 1.5707963267948966 rad pos: 5.5,0.5 parent: 2 +- proto: CP14AltarPrimordialGodLumera + entities: + - uid: 12327 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 2 - proto: CP14BarrelBloodGoblin entities: - uid: 8065 @@ -30239,6 +30263,25 @@ entities: rot: -1.5707963267948966 rad pos: 48.210453,-20.351133 parent: 2 +- proto: CP14CandleBlue + entities: + - uid: 12328 + components: + - type: Transform + pos: 0.7710935,-5.9935446 + parent: 2 + - uid: 15201 + components: + - type: Transform + pos: 2.2783234,-5.80239 + parent: 2 +- proto: CP14CandleBlueSmall + entities: + - uid: 15202 + components: + - type: Transform + pos: 1.5022119,-4.666708 + parent: 2 - proto: CP14CarpetBlue entities: - uid: 1836 @@ -33924,6 +33967,13 @@ entities: - type: Transform pos: -25.5,-33.5 parent: 2 +- proto: CP14ClothingBlueCollarDress + entities: + - uid: 15203 + components: + - type: Transform + pos: 1.5201155,-6.2672186 + parent: 2 - proto: CP14ClothingSatchelLeather entities: - uid: 1484 @@ -34254,7 +34304,7 @@ entities: pos: 14.5,-24.5 parent: 2 - type: Door - secondsUntilStateChange: -8969.771 + secondsUntilStateChange: -9077.496 state: Closing - uid: 1792 components: @@ -52183,12 +52233,6 @@ entities: - type: Transform pos: 24.5,-42.5 parent: 2 - - uid: 12328 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 - parent: 2 - uid: 12329 components: - type: Transform @@ -52292,12 +52336,6 @@ entities: rot: -1.5707963267948966 rad pos: -0.5,-10.5 parent: 2 - - uid: 12327 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,-4.5 - parent: 2 - uid: 12334 components: - type: Transform @@ -77711,6 +77749,13 @@ entities: rot: 3.141592653589793 rad pos: 44.5,-28.5 parent: 2 +- proto: CP14TableMarble + entities: + - uid: 15204 + components: + - type: Transform + pos: 1.5,-6.5 + parent: 2 - proto: CP14TableWooden entities: - uid: 1459 @@ -79091,13 +79136,6 @@ entities: parent: 2 - type: Fixtures fixtures: {} - - uid: 15201 - components: - - type: Transform - pos: 4.5,-5.5 - parent: 2 - - type: Fixtures - fixtures: {} - proto: CP14WallmountFlagBank entities: - uid: 7830 diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index e566708af0..247d13ecda 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -88,6 +88,7 @@ #- type: WirelessNetworkConnection # range: 500 #- type: StationLimitedNetwork + - type: CP14SkillScanner - type: Thieving stripTimeReduction: 9999 stealthy: true diff --git a/Resources/Prototypes/_CP14/Alerts/alerts.yml b/Resources/Prototypes/_CP14/Alerts/alerts.yml index e6336b3570..9d37b892cd 100644 --- a/Resources/Prototypes/_CP14/Alerts/alerts.yml +++ b/Resources/Prototypes/_CP14/Alerts/alerts.yml @@ -48,3 +48,11 @@ name: alerts-hunger-name description: alerts-hunger-desc +- type: alert + id: CP14DivineOffer + icons: + - sprite: /Textures/_CP14/Interface/Alerts/divine_offer.rsi + state: offer + name: cp14-alert-offer + description: cp14-alert-offer-desc + clickEvent: !type:CP14BreakDivineOfferEvent \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Catalog/Fills/closets.yml b/Resources/Prototypes/_CP14/Catalog/Fills/closets.yml index 9af536d05e..b2187da044 100644 --- a/Resources/Prototypes/_CP14/Catalog/Fills/closets.yml +++ b/Resources/Prototypes/_CP14/Catalog/Fills/closets.yml @@ -47,7 +47,6 @@ - id: CP14StampDenied - id: CP14StampApproved - id: CP14ManaOperationGlove - - id: AppraisalTool - id: CP14PaperFolderRed amount: 2 - id: CP14PaperFolderBlue diff --git a/Resources/Prototypes/_CP14/Damage/containers.yml b/Resources/Prototypes/_CP14/Damage/containers.yml index 7817e90c0c..9977dbe5c0 100644 --- a/Resources/Prototypes/_CP14/Damage/containers.yml +++ b/Resources/Prototypes/_CP14/Damage/containers.yml @@ -16,3 +16,8 @@ - Toxin - Genetic - CP14Magic + +- type: damageContainer + id: CP14Spectral + supportedGroups: + - CP14Magic \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/darkmist.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/darkmist.yml new file mode 100644 index 0000000000..8673a34bc7 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/darkmist.yml @@ -0,0 +1,73 @@ +- type: entity + id: CP14ActionSpellGodLumeraDarkmist + name: Impenetrable darkness + description: You summon a thick fog that obscures vision and disorients mortals. + components: + - type: CP14MagicEffectReligionRestricted + - type: CP14MagicEffectManaCost + manaCost: 10 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectFlashLight + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14LumeraDarkMist + - type: WorldTargetAction + repeat: true + checkCanAccess: false + range: 100 + itemIconStyle: BigAction + sound: !type:SoundPathSpecifier + path: /Audio/Magic/Eldritch/voidblink.ogg + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: mist + event: !type:CP14WorldTargetActionEvent + cooldown: 0.15 + +- type: entity + parent: + - BaseStructure + - BaseShadow + id: CP14LumeraDarkMist + categories: [ HideSpawnMenu ] + components: + - type: SyncSprite + - type: TimedDespawn + lifetime: 60 + - type: Occluder + - type: Sprite + drawdepth: Effects + sprite: Effects/spookysmoke.rsi + layers: + - state: spookysmoke + color: "#3266a8" + map: [base] + - type: OptionsVisualizer + visuals: + base: + - options: Default + data: { state: spookysmoke } + - options: ReducedMotion + data: { state: spookysmoke_static } + - type: Physics + bodyType: Static + canCollide: false + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + layer: + - SlipLayer + mask: + - ItemMask + density: 1000 + hard: false + - type: Tag + tags: + - HideContextMenu diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/mind_degrade.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/mind_degrade.yml new file mode 100644 index 0000000000..2f244a9ecf --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/mind_degrade.yml @@ -0,0 +1,126 @@ +- type: entity + id: CP14ActionSpellGodLumeraMindDegrade + name: The Wrath of Lumera + description: "You unleash your anger on the creature, stunning it, inflicting damage, and burning its mind, removing 0.5 memory points." + components: + - type: CP14MagicEffectReligionRestricted + - type: CP14MagicEffectManaCost + manaCost: 300 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14RuneMindDegrade + - !type:CP14SpellApplyEntityEffect + effects: + - !type:ChemVomit + - !type:Jitter + time: 16 + - !type:HealthChange + damage: + types: + Slash: 10 + Blunt: 10 + Piercing: 10 + - !type:MovespeedModifier + walkSpeedModifier: 0.02 + sprintSpeedModifier: 0.02 + statusLifetime: 19 + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14LumeraMindDegradeImpact + - !type:CP14SpellRemoveMemoryPoint + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Jitter + time: 16 + - !type:Paralyze + paralyzeTime: 16 + - !type:Drunk + boozePower: 20 + - !type:HealthChange + damage: + types: + Slash: 10 + Blunt: 10 + Piercing: 10 + - !type:MovespeedModifier + walkSpeedModifier: 0.5 + sprintSpeedModifier: 0.5 + statusLifetime: 30 + - type: EntityTargetAction + canTargetSelf: false + blacklist: + components: + - CP14ReligionEntity + whitelist: + components: + - CP14SkillStorage + range: 100 + itemIconStyle: BigAction + checkCanAccess: false + sound: !type:SoundPathSpecifier + path: /Audio/Magic/rumble.ogg + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: wrath + event: !type:CP14DelayedEntityTargetActionEvent + cooldown: 300 + castDelay: 16 + breakOnMove: false + breakOnDamage: false + +- type: entity + id: CP14RuneMindDegrade + parent: CP14BaseMagicRune + categories: [ HideSpawnMenu ] + save: false + components: + - type: TimedDespawn + lifetime: 16 + - type: PointLight + color: "#ae424d" + radius: 5 + energy: 8 + - type: LightFade + duration: 10 + - type: Sprite + layers: + - state: medium_circle + scale: 1.5, 1.5 + color: "#ae424d" + shader: unshaded + - type: EmitSoundOnSpawn + sound: + path: /Audio/_CP14/Effects/ritual_begin.ogg + params: + pitch: 1 + +- type: entity + id: CP14LumeraMindDegradeImpact + categories: [ HideSpawnMenu ] + parent: CP14BaseMagicImpact + save: false + components: + - type: PointLight + color: "#ae424d" + enabled: true + radius: 15 + energy: 8 + netsync: false + - type: Sprite + layers: + - state: stars + scale: 2, 2 + color: "#ae424d" + shader: unshaded + - type: LightFade + duration: 1 + - type: TimedDespawn + lifetime: 3 + - type: EmitSoundOnSpawn + sound: + path: /Audio/Effects/inneranomaly.ogg + params: + pitch: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/mind_upgrade.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/mind_upgrade.yml new file mode 100644 index 0000000000..ef7efce2de --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/mind_upgrade.yml @@ -0,0 +1,123 @@ +- type: entity + id: CP14ActionSpellGodLumeraMindUpgrade + name: Expansion of consciousness + description: "You expand the boundaries of what is possible for the chosen creature, revealing to it the secrets of the universe. The target gains +0.5 memory points, up to a maximum of 6.5" + components: + - type: CP14MagicEffectReligionRestricted + onlyOnFollowers: true + - type: CP14MagicEffectManaCost + manaCost: 300 + - type: CP14MagicEffect + telegraphyEffects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14RuneMindImprove + - !type:CP14SpellApplyEntityEffect + effects: + - !type:ChemVomit + - !type:Jitter + time: 16 + - !type:HealthChange + damage: + types: + Slash: 10 + Blunt: 10 + Piercing: 10 + - !type:MovespeedModifier + walkSpeedModifier: 0.02 + sprintSpeedModifier: 0.02 + statusLifetime: 19 + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14LumeraMindImproveImpact + - !type:CP14SpellAddMemoryPoint + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Jitter + time: 16 + - !type:Paralyze + paralyzeTime: 16 + - !type:Drunk + boozePower: 20 + - !type:HealthChange + damage: + types: + Slash: 10 + Blunt: 10 + Piercing: 10 + - !type:MovespeedModifier + walkSpeedModifier: 0.5 + sprintSpeedModifier: 0.5 + statusLifetime: 30 + - type: EntityTargetAction + canTargetSelf: false + blacklist: + components: + - CP14ReligionEntity + whitelist: + components: + - CP14SkillStorage + range: 100 + itemIconStyle: BigAction + checkCanAccess: false + sound: !type:SoundPathSpecifier + path: /Audio/Magic/rumble.ogg + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: mind_upgrade + event: !type:CP14DelayedEntityTargetActionEvent + cooldown: 300 + castDelay: 16 + breakOnMove: false + breakOnDamage: false + +- type: entity + id: CP14RuneMindImprove + parent: CP14BaseMagicRune + categories: [ HideSpawnMenu ] + save: false + components: + - type: TimedDespawn + lifetime: 16 + - type: PointLight + color: "#586dcc" + radius: 5 + energy: 8 + - type: LightFade + duration: 10 + - type: Sprite + layers: + - state: medium_circle + scale: 1.5, 1.5 + color: "#586dcc" + shader: unshaded + - type: EmitSoundOnSpawn + sound: + path: /Audio/_CP14/Effects/ritual_begin.ogg + +- type: entity + id: CP14LumeraMindImproveImpact + categories: [ HideSpawnMenu ] + parent: CP14BaseMagicImpact + save: false + components: + - type: PointLight + color: "#3843a8" + enabled: true + radius: 15 + energy: 8 + netsync: false + - type: Sprite + layers: + - state: stars + scale: 2, 2 + color: "#9fb0fc" + shader: unshaded + - type: LightFade + duration: 1 + - type: TimedDespawn + lifetime: 3 + - type: EmitSoundOnSpawn + sound: + path: /Audio/_CP14/Effects/ritual_end.ogg \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/moon_strike.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/moon_strike.yml new file mode 100644 index 0000000000..e4de1739c2 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/moon_strike.yml @@ -0,0 +1,71 @@ +- type: entity + id: CP14ActionSpellGodLumeraMoonStrike + name: Lunar strike + description: You focus the concentrated light of the stars into a single point, blinding and damaging everything that comes within reach of the angry goddess. + components: + - type: CP14MagicEffectReligionRestricted + - type: CP14MagicEffectManaCost + manaCost: 30 + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14SkyLumeraStrike + - type: WorldTargetAction + repeat: true + checkCanAccess: false + range: 100 + itemIconStyle: BigAction + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: moon_beam + event: !type:CP14WorldTargetActionEvent + cooldown: 0.5 + +- type: entity + id: CP14SkyLumeraStrike + categories: [ ForkFiltered ] + name: lumera strike + save: false + components: + - type: Sprite + sprite: _CP14/Effects/lumera_strike.rsi + drawdepth: Mobs + noRot: true + offset: 0,3 + layers: + - state: pewpew + shader: unshaded + - type: TimedDespawn + lifetime: 2 + - type: Tag + tags: + - HideContextMenu + - type: PointLight + color: "#7ca5d8" + enabled: true + radius: 10 + energy: 8 + netsync: false + - type: LightFade + duration: 1 + - type: CP14AreaEntityEffect + range: 1 + effects: + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Jitter + - !type:HealthChange + damage: + types: + Heat: 10 + - type: TriggerOnSpawn + - type: FlashOnTrigger + range: 2 + - type: CP14FarSound + closeSound: + collection: CP14MoonStrike + params: + variation: 0.2 + maxDistance: 20 + volume: 20 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/renounce.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/renounce.yml new file mode 100644 index 0000000000..1278e09fa6 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/renounce.yml @@ -0,0 +1,45 @@ +- type: entity + id: CP14ActionSpellGodLumeraRenounce + name: Renunciation of a follower + description: You are rejecting the chosen follower. They lose the opportunity to become your follower at any time. + components: + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14LumeraRenounceImpact + - !type:CP14SpellGodRenounce + - type: ConfirmableAction + popup: cp-renounce-action-god-popup + - type: EntityWorldTargetAction + repeat: true + checkCanAccess: false + itemIconStyle: BigAction + range: 100 + sound: !type:SoundPathSpecifier + path: /Audio/Magic/rumble.ogg + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: renounce + event: !type:CP14EntityWorldTargetActionEvent + cooldown: 0.5 + +- type: entity + id: CP14LumeraRenounceImpact + categories: [ HideSpawnMenu ] + parent: CP14BaseMagicImpact + save: false + components: + - type: PointLight + color: "#94154e" + enabled: true + radius: 5 + energy: 4 + netsync: false + - type: Sprite + layers: + - state: stars + color: "#94154e" + shader: unshaded + - type: LightFade + duration: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/speak.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/speak.yml new file mode 100644 index 0000000000..e0db8b0c53 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/speak.yml @@ -0,0 +1,21 @@ +- type: entity + id: CP14LumeraSpeakImpact + categories: [ HideSpawnMenu ] + parent: CP14BaseMagicImpact + save: false + components: + - type: PointLight + color: "#3843a8" + enabled: true + radius: 5 + energy: 4 + netsync: false + - type: Sprite + layers: + - state: stars + color: "#3843a8" + shader: unshaded + - type: LightFade + duration: 1 + - type: TimedDespawn + lifetime: 2 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/touch.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/touch.yml new file mode 100644 index 0000000000..134c1d0fe0 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/touch.yml @@ -0,0 +1,49 @@ +- type: entity + id: CP14ActionSpellGodLumeraTouch + name: Touch of Lumera + description: "Multitasking effects on the world: depending on what you click on, the effect may vary. Using it on an empty space will create a glowing sign that attracts the attention of mortals." + components: + - type: CP14MagicEffectReligionRestricted + - type: CP14MagicEffectManaCost + manaCost: 5 + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14LumeraTouchImpact + - !type:CP14SpellGodTouch + - !type:CP14SpellApplyEntityEffect + effects: + - !type:Jitter + - type: EntityWorldTargetAction + repeat: true + checkCanAccess: false + itemIconStyle: BigAction + range: 100 + sound: !type:SoundPathSpecifier + path: /Audio/Magic/rumble.ogg + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: touch + event: !type:CP14EntityWorldTargetActionEvent + cooldown: 0.5 + +- type: entity + id: CP14LumeraTouchImpact + categories: [ HideSpawnMenu ] + parent: CP14BaseMagicImpact + save: false + components: + - type: PointLight + color: "#3843a8" + enabled: true + radius: 5 + energy: 4 + netsync: false + - type: Sprite + layers: + - state: stars + color: "#3843a8" + shader: unshaded + - type: LightFade + duration: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/warp.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/warp.yml new file mode 100644 index 0000000000..de354f4db0 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/Lumera/warp.yml @@ -0,0 +1,12 @@ +- type: entity + id: CP14ActionSpellGodLumeraWarp + name: Fast travel + description: Allows you to quickly teleport to your altars and followers. + components: + - type: InstantAction + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: warp + priority: -8 + event: !type:ToggleIntrinsicUIEvent + key: enum.CP14ReligionEntityUiKey.Key \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/generic.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/generic.yml new file mode 100644 index 0000000000..8ca6e6df6e --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Demigods/generic.yml @@ -0,0 +1,41 @@ +- type: entity + id: CP14ActionRenounceFromGod + name: Renounce patron + description: You renounce your patron by severing your connection with him. After that, you can never become his follower again, but you can become a follower of another patron. + components: + - type: InstantAction + checkCanInteract: false + checkConsciousness: false + icon: + sprite: _CP14/Interface/Alerts/divine_offer.rsi + state: unoffer + priority: -8 + event: !type:CP14RenounceFromGodEvent + - type: ConfirmableAction + popup: cp14-renounce-action-popup + +- type: entity + id: CP14ActionAppealToGod + name: Appeal to god + description: You call upon your patron! He will hear your call wherever he may be. + components: + - type: CP14MagicEffect + effects: + - !type:CP14SpellSpawnEntityOnTarget + spawns: + - CP14ImpactEffectSphereOfLight + - !type:CP14SpellTransferManaToGod + amount: 20 + safe: true + - !type:CP14SpellSendMessageToGod + - type: InstantAction + sound: !type:SoundPathSpecifier + path: /Audio/Magic/rumble.ogg + icon: + sprite: _CP14/Actions/DemigodSpells/generic.rsi + state: appeal + priority: -8 + event: !type:CP14DelayedInstantActionEvent + cooldown: 15 + castDelay: 1.5 + breakOnMove: true \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml new file mode 100644 index 0000000000..efea7753e0 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/firewave.yml @@ -0,0 +1,104 @@ +- type: entity + id: CP14ActionSpellFirewave + name: Firewave + description: You release a wave of hot fire that strikes multiple targets in an area. + components: + - type: Sprite + sprite: _CP14/Actions/Spells/fire.rsi + state: firewave + - type: CP14MagicEffectCastSlowdown + speedMultiplier: 0.75 + - type: CP14MagicEffectManaCost + manaCost: 10 + - type: CP14MagicEffect + magicType: Fire + effects: + - !type:CP14SpellProjectile + prototype: CP14Firebolt + spread: 2 + projectileSpeed: 5 + projectileCount: 6 + - type: CP14MagicEffectVerbalAspect + endSpeech: "Ignis acus!" + - type: CP14MagicEffectCastingVisual + proto: CP14RuneFirebolt + - type: CP14MagicEffectPacifiedBlock + - type: EntityWorldTargetAction + repeat: true + checkCanAccess: false + raiseOnUser: true + range: 60 + itemIconStyle: BigAction + sound: !type:SoundPathSpecifier + path: /Audio/Magic/rumble.ogg + icon: + sprite: _CP14/Actions/Spells/fire.rsi + state: firewave + event: !type:CP14EntityWorldTargetActionEvent + cooldown: 1.0 + +- type: entity + id: CP14RuneFirebolt + parent: CP14BaseMagicRune + categories: [ HideSpawnMenu ] + save: false + components: + - type: PointLight + color: "#eea911" + - type: Sprite + layers: + - state: medium_circle + color: "#fdda5d" + shader: unshaded + +- type: entity + id: CP14ImpactEffectFirebolt + parent: CP14BaseMagicImpact + categories: [ HideSpawnMenu ] + save: false + components: + - type: PointLight + color: "#E25822" + radius: 2.0 + energy: 2.0 + - type: LightFade + +- type: entity + id: CP14Firebolt + parent: BaseBullet + name: firebolt + categories: [ HideSpawnMenu ] + save: false + components: + - type: TimedDespawn + lifetime: 1 + - type: SpawnOnDespawn + prototype: CP14ImpactEffectFirebolt + - type: PointLight + color: "#E25822" + radius: 2.0 + energy: 2.0 + - type: Projectile + impactEffect: CP14ImpactEffectFirebolt + damage: + types: + Heat: 2 + soundHit: + path: /Audio/Weapons/Guns/Hits/energy_metal1.ogg + - type: Sprite + sprite: _CP14/Effects/fire.rsi + layers: + - state: small + shader: unshaded + - type: ChangeTemperatureOnCollide + heat: 10000 + +- type: entity + parent: CP14BaseSpellScrollFire + id: CP14SpellScrollFirewave + name: firewave spell scroll + components: + - type: CP14SpellStorage + spells: + - CP14ActionSpellFirewave + diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Belt/quiver.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Belt/quiver.yml index 7f30df98d8..2663adffed 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Belt/quiver.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Belt/quiver.yml @@ -26,6 +26,7 @@ tags: - CP14CrossbowBolt - CP14Arrow + - CP14BigCrossbowBolt - type: Appearance - type: StorageContainerVisuals maxFillLevels: 3 @@ -74,3 +75,14 @@ contents: - id: CP14CrossboltIron amount: 32 + +- type: entity + parent: CP14ClothingBeltQuiver + id: CP14ClothingBeltQuiverBigCrossbolt + categories: [ ForkFiltered ] + suffix: Full. Iron. BigCrossbolt + components: + - type: StorageFill + contents: + - id: CP14BigCrossboltIron + amount: 16 diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Eyes/eyes.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Eyes/eyes.yml index 93e0d1dd15..205c481146 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Eyes/eyes.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Eyes/eyes.yml @@ -62,6 +62,8 @@ - type: Clothing sprite: _CP14/Clothing/Eyes/alchemy_glasses.rsi - type: SolutionScanner + - type: StaticPrice + price: 30 - type: GuideHelp guides: - CP14_RU_Alchemy @@ -79,6 +81,8 @@ - type: Clothing sprite: _CP14/Clothing/Eyes/alchemy_monocle.rsi - type: SolutionScanner + - type: StaticPrice + price: 30 - type: GuideHelp guides: - CP14_RU_Alchemy @@ -122,3 +126,18 @@ sprite: _CP14/Clothing/Eyes/eye_patch.rsi - type: Clothing sprite: _CP14/Clothing/Eyes/eye_patch.rsi + +- type: entity + parent: CP14ClothingEyesBase + id: CP14ClothingEyesMerchantMonocle + name: merchant's monocle + description: High-quality magnifiyng monocle infused with magic to help you determine the exact price of any item. + components: + - type: Sprite + sprite: _CP14/Clothing/Eyes/merchant_monocle.rsi + - type: Clothing + sprite: _CP14/Clothing/Eyes/merchant_monocle.rsi + - type: CP14PriceScanner + - type: StaticPrice + price: 30 + - type: VisionCorrection diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Head/Produced/armor.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Head/Produced/armor.yml index 6296a2a7d9..a9f3db186d 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Head/Produced/armor.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Head/Produced/armor.yml @@ -17,3 +17,28 @@ - type: ClothingSpeedModifier walkModifier: 0.95 sprintModifier: 0.95 + +- type: entity + parent: CP14ClothingHeadBase + id: CP14ClothingHeadFishMask + name: fish mask + description: SALUTATIONS!!! + components: + - type: Sprite + sprite: _CP14/Clothing/Head/Produced/Armor/fish_mask.rsi + - type: Clothing + sprite: _CP14/Clothing/Head/Produced/Armor/fish_mask.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Cold: 0.92 + - type: FactionClothing + faction: CP14Fishies + - type: HideLayerClothing + slots: + - Hair + - type: TypingIndicatorClothing + proto: alien + - type: IdentityBlocker + - type: IngestionBlocker diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/Head/Roles/general.yml b/Resources/Prototypes/_CP14/Entities/Clothing/Head/Roles/general.yml index 596f76d979..a743c47f75 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/Head/Roles/general.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/Head/Roles/general.yml @@ -121,3 +121,4 @@ #- type: Construction # graph: CP14StrawHat # node: cp14headstrawhat + diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/Roles/general.yml b/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/Roles/general.yml index bc08a0a968..ec0f48312e 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/Roles/general.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/Roles/general.yml @@ -102,3 +102,5 @@ - type: Clothing sprite: _CP14/Clothing/OuterClothing/Roles/General/purple.rsi + + diff --git a/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/armor.yml index 75f709b0c4..f361880065 100644 --- a/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/_CP14/Entities/Clothing/OuterClothing/armor.yml @@ -55,3 +55,22 @@ Slash: 0.80 Piercing: 0.90 +- type: entity + parent: CP14ClothingOuterClothingBase + id: CP14ClothingOuterClothingFish + name: fish suit + description: smells horible.... + components: + - type: Sprite + sprite: _CP14/Clothing/OuterClothing/fish_suit.rsi + - type: Clothing + sprite: _CP14/Clothing/OuterClothing/fish_suit.rsi + - type: Armor + modifiers: + coefficients: + Blunt: 0.95 + Cold: 0.9 + Slash: 0.92 + - type: FactionClothing + faction: CP14Fishies + diff --git a/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml b/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml index 65b9755a82..433a114e84 100644 --- a/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml +++ b/Resources/Prototypes/_CP14/Entities/Effects/sky_lightning.yml @@ -89,5 +89,4 @@ collection: CP14LightningFar params: variation: 0.2 - volume: -5 - + volume: -5 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml index 503847f332..8571450808 100644 --- a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml +++ b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/demiplane_rifts.yml @@ -209,3 +209,17 @@ range: 2, 3 children: - id: CP14MobSlimeBase + +- type: entity + parent: CP14BaseMobGroupSpawner + id: CP14MobGroupSpawnerFlem + suffix: 2-3 Flems + components: + - type: EntityTableSpawner + deleteSpawnerAfterSpawn: false + offset: 1 + table: !type:GroupSelector + rolls: !type:RangeNumberSelector + range: 1, 3 + children: + - id: CP14MobMonsterFlem diff --git a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml index 60a5f2584a..1dd001c5c0 100644 --- a/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml +++ b/Resources/Prototypes/_CP14/Entities/Markers/Spawners/mobs.yml @@ -188,3 +188,19 @@ - type: ConditionalSpawner prototypes: - CP14MobMonsterInvisibleWhistler + +- type: entity + name: flem spawner + id: CP14SpawnMobMonsterFlem + parent: MarkerBase + categories: [ ForkFiltered ] + components: + - type: Sprite + layers: + - sprite: Markers/cross.rsi + state: green + - sprite: _CP14/Mobs/Monster/flem.rsi + state: flem_live + - type: ConditionalSpawner + prototypes: + - CP14MobMonsterFlem diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/Flem.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/Flem.yml new file mode 100644 index 0000000000..bd111c5a59 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/Flem.yml @@ -0,0 +1,100 @@ +- type: entity + id: CP14MobMonsterFlem + parent: CP14SimpleMobBase + name: Flem + description: an odd looking fish standing on two stubby legs. you know what that means... + categories: [ ForkFiltered ] + components: + - type: HTN + rootTask: + task: CP14MonsterCompound + blackboard: + NavSmash: !type:Bool + true + VisionRadius: !type:Single + 3 + AggroVisionRadius: !type:Single + 1 + - type: NpcFactionMember + factions: + - CP14Fishies + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + sprite: _CP14/Mobs/Monster/flem.rsi + state: flem_live + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.20 + density: 100 + mask: + - MobMask + layer: + - MobLayer + - type: Appearance + - type: Body + prototype: Animal + - type: MobThresholds + thresholds: + 0: Alive + 30: Dead + - type: Stamina + critThreshold: 200 + - type: CombatMode + - type: MeleeWeapon + angle: 0 + animation: WeaponArcPunch + damage: + types: + Blunt: 8 + Structural: 20 + - type: MovementSpeedModifier + baseWalkSpeed: 2.6 + baseSprintSpeed: 2.6 + - type: DamageStateVisuals + states: + Alive: + Base: flem_live + Dead: + Base: flem_dead + - type: Butcherable + spawned: + - id: CP14FoodMeatFlemHead + amount: 1 + - id: CP14FoodMeatFlemTorso + amount: 1 + - id: CP14FoodMeatFlemLeg + amount: 2 + prob: 0.6 + - type: Bloodstream + bloodMaxVolume: 200 + bloodReagent: CP14BloodAnimal + - type: Grammar + attributes: + gender: epicene + - type: TypingIndicator + proto: alien + - type: CP14MagicCasterSlowdown + - type: CP14MagicEnergyContainer + magicAlert: CP14MagicEnergy + maxEnergy: 100 + energy: 100 + - type: CP14MagicEnergyDraw + energy: 2 + delay: 4 + - type: SpamEmitSound + minInterval: 10 + maxInterval: 30 + sound: + collection: CP14Flem + params: + variation: 0.125 + - type: SoundWhileAlive + - type: Tag + tags: + - FootstepSound + - CP14Mosquito diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/spider.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/spider.yml index 1079d70f4b..d7f42c4b4a 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/spider.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/spider.yml @@ -49,7 +49,7 @@ - type: MobThresholds thresholds: 0: Alive - 90: Dead + 40: Dead #- type: SolutionContainerManager # solutions: # melee: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Player/Patrons/gods.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Player/Patrons/gods.yml new file mode 100644 index 0000000000..1cf05530eb --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Player/Patrons/gods.yml @@ -0,0 +1,127 @@ +- type: entity + id: CP14MobGodBase + parent: + - Incorporeal + - BaseMob + - CP14MobMagical + name: god + description: The supreme entity formed from the beliefs, desires, and fears of the human race. + abstract: true + components: + - type: Sprite + sprite: _CP14/Mobs/Demigods/temp_icons.rsi + color: "#ffffff99" + - type: PointLight + radius: 10 + softness: 1 + castShadows: false + - type: Input + context: "ghost" + - type: Spectral + - type: MovementSpeedModifier + baseWalkSpeed: 3 + baseSprintSpeed: 6 + friction: 0.5 + acceleration: 3 + - type: NoSlip + - type: Eye + drawFov: false + visMask: + - Normal + - Ghost + - type: Visibility + layer: 2 #ghost vis layer + - type: ContentEye + maxZoom: 1.2, 1.2 + - type: Speech + speechVerb: Ghost + - type: CP14ReligionVision + - type: CP14MagicEnergyContainer + magicAlert: CP14MagicEnergy + maxEnergy: 500 + energy: 500 + unsafeSupport: true + - type: Damageable + damageContainer: CP14Spectral + - type: MobState + - type: MobThresholds + thresholds: + 0: Alive + 100: Dead + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:PlaySoundBehavior + sound: + path: /Audio/Effects/eye_close.ogg + params: + volume: -6 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: CP14MagicUnsafeDamage + damagePerEnergy: + types: + CP14ManaDepletion: 1 + - type: CP14SpellStorage + grantAccessToSelf: true + spells: + - CP14ActionZLevelUp + - CP14ActionZLevelDown + - ActionToggleLighting + - ActionToggleFov + - type: CP14DemiplaneStabilizer # teleports gods outside when the demiplane closes + enabled: false + - type: UserInterface + interfaces: + enum.CP14ReligionEntityUiKey.Key: + type: CP14ReligionEntityBoundUserInterface + +- type: entity + parent: CP14MobGodBase + id: CP14MobGodMerkas + name: Merkas + categories: [ HideSpawnMenu ] + description: Merkas is the god of purity and healing. In his presence, decay is destroyed. He does not save — he purifies. Those who remain can start anew. + components: + - type: Sprite + layers: + - state: merkas + shader: unshaded + - type: PointLight + color: "#9bf2b5" + - type: CP14SkillStorage + availableSkillTrees: + - GodMerkas + - type: CP14ReligionEntity + religion: Merkas + - type: CP14ReligionVision + shaderColor: 0.02, 0.36, 0.05 + +- type: entity + parent: CP14MobGodBase + id: CP14MobGodLumera + name: Lumera + description: The goddess of the night and the night sky. Her stars hold so many secrets, which she protects with her wings. + components: + - type: Sprite + layers: + - state: lumera + shader: unshaded + - type: PointLight + color: "#4367ba" + - type: CP14SkillStorage + availableSkillTrees: + - GodLumera + - type: CP14ReligionEntity + religion: Lumera + - type: CP14ReligionVision + shaderColor: 0.29, 0.66, 0.87 + - type: IntrinsicUI + uis: + enum.CP14ReligionEntityUiKey.Key: + toggleAction: CP14ActionSpellGodLumeraWarp + - type: CP14ReligionSpeaker + speaker: CP14LumeraSpeakImpact \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml index b7c92bfd61..822bad3780 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml @@ -231,7 +231,6 @@ types: Cold: 0.25 Bloodloss: 0.25 - - type: CP14SkillStorage - type: CP14TradingReputation diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/base.yml b/Resources/Prototypes/_CP14/Entities/Mobs/base.yml index 5b13e55d92..08b348a2a9 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/base.yml @@ -57,6 +57,16 @@ delay: 3 # 5m to full restore - type: CP14MagicUnsafeDamage - type: CP14MagicUnsafeSleep + - type: CP14SkillStorage + availableSkillTrees: + - Pyrokinetic + - Hydrosophistry + - Illusion + - Metamagic + - Healing + - Atlethic + - MartialArts + - Craftsmanship - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/meat.yml index 9945de8b2e..8c28950142 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Consumable/Food/meat.yml @@ -930,3 +930,235 @@ entries: - temperatureRange: 400, 500 transformTo: CP14Ash1 + + #Flem meat + +- type: entity + id: CP14FoodMeatFlemHead + parent: CP14FoodMeatBase + name: raw flem head + description: honestly looks quite tasty + components: + - type: FlavorProfile + flavors: + - fishy + - type: Sprite + sprite: _CP14/Objects/Consumable/Food/meat.rsi + state: flem_head + - type: Item + size: Large + shape: + - 0,0,1,1 + - type: SolutionContainerManager + solutions: + food: + maxVol: 30 + reagents: + - ReagentId: Nutriment + Quantity: 7 + - ReagentId: UncookedAnimalProteins + Quantity: 18 + - ReagentId: Fat + Quantity: 5 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14FoodMeatFlemHeadCooked + +- type: entity + id: CP14FoodMeatFlemHeadCooked + parent: CP14FoodMeatFlemHead + name: cooked flem head + components: + - type: Sprite + state: flem_head_cooked + - type: SolutionContainerManager + solutions: + food: + maxVol: 30 + reagents: + - ReagentId: Nutriment + Quantity: 7 + - ReagentId: Protein + Quantity: 18 + - ReagentId: Fat + Quantity: 5 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14Ash1 + +- type: entity + id: CP14FoodMeatFlemTorso + parent: CP14FoodMeatBase + name: raw flem torso + description: seems to be hollow + components: + - type: FlavorProfile + flavors: + - fishy + - type: Sprite + sprite: _CP14/Objects/Consumable/Food/meat.rsi + state: flem_torso + - type: SliceableFood + count: 3 + slice: CP14FoodMeatFlemTorsoCut + - type: Item + size: Large + shape: + - 0,0,1,1 + - type: SolutionContainerManager + solutions: + food: + maxVol: 35 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: UncookedAnimalProteins + Quantity: 24 + - ReagentId: Fat + Quantity: 2 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14FoodMeatFlemTorsoCooked + +- type: entity + id: CP14FoodMeatFlemTorsoCooked + parent: CP14FoodMeatFlemTorso + name: cooked flem torso + components: + - type: Sprite + state: flem_torso_cooked + - type: SliceableFood + count: 3 + slice: CP14FoodMeatFlemTorsoCookedCut + - type: SolutionContainerManager + solutions: + food: + maxVol: 35 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Protein + Quantity: 24 + - ReagentId: Fat + Quantity: 2 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14Ash1 + +- type: entity + id: CP14FoodMeatFlemTorsoCut + parent: CP14FoodMeatSliceBase + name: raw flem ring + description: onions not included + components: + - type: FlavorProfile + flavors: + - fishy + - type: Item + size: Small + - type: Sprite + sprite: _CP14/Objects/Consumable/Food/meat.rsi + layers: + - state: flem_torso_cut + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 2 + - ReagentId: UncookedAnimalProteins + Quantity: 5 + - ReagentId: Fat + Quantity: 0.5 + - type: Tag + tags: + - CP14RawMeatSlice + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14FoodMeatFlemTorsoCookedCut + +- type: entity + id: CP14FoodMeatFlemTorsoCookedCut + parent: CP14FoodMeatFlemTorsoCut + name: fishy rings + components: + - type: Sprite + layers: + - state: flem_torso_cut_cooked + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 2 + - ReagentId: Protein + Quantity: 5 + - ReagentId: Fat + Quantity: 0.5 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14Ash1 + +- type: entity + id: CP14FoodMeatFlemLeg + parent: CP14FoodMeatBase + name: raw flem leg + description: probally not the best part to eat. but you never know until you try + components: + - type: FlavorProfile + flavors: + - fishy + - type: Sprite + sprite: _CP14/Objects/Consumable/Food/meat.rsi + state: flem_leg + - type: Item + size: Tiny + shape: + - 0,0,0,0 + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 0.2 + - ReagentId: UncookedAnimalProteins + Quantity: 5 + - ReagentId: Fat + Quantity: 0.1 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14FoodMeatFlemLegCooked + +- type: entity + id: CP14FoodMeatFlemLegCooked + parent: CP14FoodMeatFlemLeg + name: fish sticks + description: like freis. but fish! + components: + - type: Sprite + state: flem_leg_cooked + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 0.2 + - ReagentId: UncookedAnimalProteins + Quantity: 5 + - ReagentId: Fat + Quantity: 0.1 + - type: CP14TemperatureTransformation + entries: + - temperatureRange: 400, 500 + transformTo: CP14Ash1 diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/pickaxe.yml b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/pickaxe.yml index d5a7f2d21c..abd3e5f281 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/pickaxe.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/pickaxe.yml @@ -24,6 +24,7 @@ - state: icon - sprite: _CP14/Objects/ModularTools/Blade/Pickaxe/metall_pickaxe.rsi state: icon + color: "#e28f08" - type: CP14ModularCraftAutoAssemble details: - BladeCopperPickaxe \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/rapier.yml b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/rapier.yml index 97f633ed52..34a27badd0 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/rapier.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/rapier.yml @@ -16,7 +16,7 @@ - type: entity id: CP14ModularCopperRapier parent: CP14ModularGripWooden - name: iron rapier + name: copper rapier description: You'll be lucky if it even pierces the paper. components: - type: Sprite @@ -24,6 +24,7 @@ - state: icon - sprite: _CP14/Objects/ModularTools/Blade/Rapier/metall_rapier.rsi state: icon + color: "#e28f08" - type: CP14ModularCraftAutoAssemble details: - BladeCopperRapier diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/skimitar.yml b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/skimitar.yml index 20899afe8f..961e2e65f4 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/skimitar.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/skimitar.yml @@ -24,6 +24,7 @@ - state: icon - sprite: _CP14/Objects/ModularTools/Blade/Skimitar/metall_skimitar.rsi state: icon + color: "#e28f08" - type: CP14ModularCraftAutoAssemble details: - BladeCopperSkimitar diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/sword.yml b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/sword.yml index bdd72cdd7f..7760d0a63f 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/sword.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Weapons/ModularPresets/sword.yml @@ -16,7 +16,7 @@ - type: entity id: CP14ModularCopperSword parent: CP14ModularGripWooden - name: iron sword + name: copper sword description: You'll be lucky if it even pierces the paper. components: - type: Sprite @@ -24,6 +24,7 @@ - state: icon - sprite: _CP14/Objects/ModularTools/Blade/Sword/metall_sword.rsi state: icon + color: "#e28f08" - type: CP14ModularCraftAutoAssemble details: - BladeCopperSword diff --git a/Resources/Prototypes/_CP14/Entities/Stations/base.yml b/Resources/Prototypes/_CP14/Entities/Stations/base.yml index f3ed2fed25..68f5be042e 100644 --- a/Resources/Prototypes/_CP14/Entities/Stations/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Stations/base.yml @@ -10,6 +10,7 @@ - CP14BaseStationCommonObjectives - CP14BaseStationDemiplaneMap - CP14BaseStationEconomy + #- CP14BaseStationGods - type: entity id: CP14BaseStationCommonObjectives @@ -35,3 +36,16 @@ abstract: true components: - type: CP14StationEconomy + +#- type: entity +# id: CP14BaseStationGods +# abstract: true +# components: +# - type: CP14StationRandomJobs +# entries: +# - jobs: +# - CP14GodMerkas +# - CP14GodLumera +# count: +# min: 2 +# max: 2 \ 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 7d4833105f..4011a695e9 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Flora/trees.yml @@ -470,4 +470,3 @@ CP14BirchWoodLog: min: 3 max: 6 - diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Religion/base.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Religion/base.yml new file mode 100644 index 0000000000..1ca572b8da --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Religion/base.yml @@ -0,0 +1,43 @@ +- type: entity + id: CP14BaseAltar + parent: BaseStructure + abstract: true + name: altar + description: TODO + categories: [ ForkFiltered ] + components: + - type: Sprite + noRot: true + #drawdepth: Mobs + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.45,-0.45,0.45,0.45" + density: 60 + mask: + - MachineMask + layer: + - MachineLayer + - type: CP14ReligionAltar + - type: ActiveListener + range: 1 + - type: InteractionOutline + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: Rock + - type: GuideHelp + guides: + - CP14_RU_Patrons + - CP14_EN_Patrons + +- type: entity + parent: CP14BaseAltar + id: CP14BaseAltarPrimordial + abstract: true + components: + - type: CP14ReligionAltar + canBeConverted: false + - type: SpawnPoint + spawn_type: Unset \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Religion/primordial.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Religion/primordial.yml new file mode 100644 index 0000000000..0d7619dd74 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Religion/primordial.yml @@ -0,0 +1,37 @@ +- type: entity + parent: CP14BaseAltarPrimordial + id: CP14AltarPrimordialGodLumera + name: primordial statue of Lumera + description: "The enchanting statue of Lumera, patroness of the starry sky, night, and mysteries. She does not demand worship—she simply observes. And waits for you to ask." + components: + - type: Sprite + drawdepth: Mobs + offset: "0.0,0.8" + sprite: _CP14/Structures/Specific/Religion/lumera_statue.rsi + layers: + - state: statue1 + - type: CP14ReligionAltar + religion: Lumera + - type: CP14ReligionObserver + observation: + Lumera: 10 + - type: SpawnPoint + job_id: CP14GodLumera + +#- type: entity +# parent: CP14BaseAltarPrimordial +# id: CP14AltarPrimordialGodMerkas +# name: primordial statue of Merkas +# description: A beautiful, overgrown statue of Sylvania, revered as a goddess of nature. +# components: +# - type: Sprite +# sprite: Structures/Furniture/Altars/Gods/nanotrasen.rsi +# layers: +# - state: druid +# - type: CP14ReligionAltar +# religion: Merkas +# - type: CP14ReligionObserver +# observation: +# Merkas: 10 +# - type: SpawnPoint +# job_id: CP14GodMerkas \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Guidebook/Eng/jobs.yml b/Resources/Prototypes/_CP14/Guidebook/Eng/jobs.yml index 4fbe206d06..c53946e76c 100644 --- a/Resources/Prototypes/_CP14/Guidebook/Eng/jobs.yml +++ b/Resources/Prototypes/_CP14/Guidebook/Eng/jobs.yml @@ -7,6 +7,7 @@ - CP14_EN_JobAdventurer - CP14_EN_JobAlchemist - CP14_EN_JobInnkeeper + - CP14_EN_Patrons filterEnabled: True @@ -34,3 +35,10 @@ name: Innkeepers text: "/ServerInfo/_CP14/Guidebook_EN/JobsTabs/Innkeepers.xml" filterEnabled: True + +- type: guideEntry + crystallPunkAllowed: true + id: CP14_EN_Patrons + name: Patrons + text: "/ServerInfo/_CP14/Guidebook_EN/JobsTabs/Patrons.xml" + filterEnabled: True diff --git a/Resources/Prototypes/_CP14/Guidebook/Ru/jobs.yml b/Resources/Prototypes/_CP14/Guidebook/Ru/jobs.yml index 06d5d162cb..c4090d4d51 100644 --- a/Resources/Prototypes/_CP14/Guidebook/Ru/jobs.yml +++ b/Resources/Prototypes/_CP14/Guidebook/Ru/jobs.yml @@ -7,6 +7,7 @@ - CP14_RU_JobAdventurer - CP14_RU_JobAlchemist - CP14_RU_JobInnkeeper + - CP14_RU_Patrons filterEnabled: True @@ -32,6 +33,13 @@ - type: guideEntry crystallPunkAllowed: true id: CP14_RU_JobInnkeeper - name: Innkeepers + name: Трактирщик text: "/ServerInfo/_CP14/Guidebook_RU/JobsTabs/Innkeepers.xml" filterEnabled: True + +- type: guideEntry + crystallPunkAllowed: true + id: CP14_RU_Patrons + name: Покровители + text: "/ServerInfo/_CP14/Guidebook_RU/JobsTabs/Patrons.xml" + filterEnabled: True diff --git a/Resources/Prototypes/_CP14/Loadouts/Jobs/alchemist.yml b/Resources/Prototypes/_CP14/Loadouts/Jobs/alchemist.yml index 137089b23b..79a99423f2 100644 --- a/Resources/Prototypes/_CP14/Loadouts/Jobs/alchemist.yml +++ b/Resources/Prototypes/_CP14/Loadouts/Jobs/alchemist.yml @@ -37,25 +37,6 @@ equipment: cloak: CP14ClothingCloakAlchemistMantle -# Eyes - -- type: loadoutGroup - id: CP14AlchemistEyes - name: cp14-loadout-alchemist-eyes - loadouts: - - CP14ClothingEyesAlchemyGlasses - - CP14ClothingEyesAlchemyMonocle - -- type: loadout - id: CP14ClothingEyesAlchemyGlasses - equipment: - eyes: CP14ClothingEyesAlchemyGlasses - -- type: loadout - id: CP14ClothingEyesAlchemyMonocle - equipment: - eyes: CP14ClothingEyesAlchemyMonocle - # Belt - type: loadoutGroup diff --git a/Resources/Prototypes/_CP14/Loadouts/role_loadouts.yml b/Resources/Prototypes/_CP14/Loadouts/role_loadouts.yml index 1c80592644..b7c384f055 100644 --- a/Resources/Prototypes/_CP14/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/_CP14/Loadouts/role_loadouts.yml @@ -34,7 +34,7 @@ groups: - CP14AlchemistHead # - CP14GeneralOuterClothing - - CP14AlchemistEyes # + - CP14GeneralEyes # - CP14AlchemistCloak # - CP14GeneralGloves - CP14GeneralShirt diff --git a/Resources/Prototypes/_CP14/Maps/comoss.yml b/Resources/Prototypes/_CP14/Maps/comoss.yml index 72a84b95c3..1e6525b1be 100644 --- a/Resources/Prototypes/_CP14/Maps/comoss.yml +++ b/Resources/Prototypes/_CP14/Maps/comoss.yml @@ -13,6 +13,8 @@ mapNameTemplate: "Comoss island" - type: StationJobs availableJobs: + #Demigods + CP14GodLumera: [ 1, 1 ] #Mercenary #CP14Guildmaster: [1, 1] CP14Adventurer: [ -1, -1 ] diff --git a/Resources/Prototypes/_CP14/Maps/venicialis.yml b/Resources/Prototypes/_CP14/Maps/venicialis.yml index 6b710c6ffb..4340dcadd8 100644 --- a/Resources/Prototypes/_CP14/Maps/venicialis.yml +++ b/Resources/Prototypes/_CP14/Maps/venicialis.yml @@ -13,6 +13,8 @@ mapNameTemplate: "Venicialis fort" - type: StationJobs availableJobs: + #Demigods + CP14GodLumera: [ 1, 1 ] #Mercenary #CP14Guildmaster: [1, 1] CP14Adventurer: [ -1, -1 ] diff --git a/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml b/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml index 052923805c..fabfb73637 100644 --- a/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml +++ b/Resources/Prototypes/_CP14/Procedural/Demiplane/Modifiers/Danger/mobs.yml @@ -72,6 +72,25 @@ minGroupSize: 2 maxGroupSize: 3 +- type: cp14DemiplaneModifier + id: EnemyFlem + levels: + min: 1 + max: 8 + name: cp14-modifier-flem + generationWeight: 0.33 + categories: + Danger: 0.25 + requiredTags: + - CP14DemiplaneOpenSky + - CP14DemiplaneHerbals + layers: + - !type:CP14OreDunGen + entity: CP14MobMonsterFlem + count: 3 + minGroupSize: 3 + maxGroupSize: 4 + # TIER 2 - type: cp14DemiplaneModifier @@ -256,3 +275,4 @@ maxGroupSize: 15 + diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml index 62d8e729de..76d48b733b 100644 --- a/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/CookingTable/pies.yml @@ -43,3 +43,21 @@ protoId: CP14FoodPumpkinSlice count: 5 result: CP14FoodPiePumpkinRaw + +# preobaly just a placeholder until we get actaul fish + +- type: CP14Recipe + id: CP14FoodPieFishRaw + tag: CP14RecipeCooking + craftTime: 5 + requirements: + - !type:ProtoIdResource + protoId: CP14PlatePie + - !type:ProtoIdResource + protoId: CP14FoodDoughMediumFlat + - !type:ProtoIdResource + protoId: CP14FoodMeatFlemTorso + - !type:ProtoIdResource + protoId: CP14FoodMeatFlemLeg + count: 2 + result: CP14FoodPieFishRaw diff --git a/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml b/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml index a630151e0f..17f01d9208 100644 --- a/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml +++ b/Resources/Prototypes/_CP14/Recipes/Workbench/sewing_table.yml @@ -251,6 +251,34 @@ count: 2 result: CP14ClothingPantsMercenaryTrousers +- type: CP14Recipe + id: CP14ClothingOuterClothingFish + tag: CP14RecipeSewing + craftTime: 4 + requirements: + - !type:ProtoIdResource + protoId: CP14FoodMeatFlemTorso + - !type:ProtoIdResource + protoId: CP14String + - !type:StackResource + stack: CP14Cloth + count: 3 + result: CP14ClothingOuterClothingFish + +- type: CP14Recipe + id: CP14ClothingHeadFishMask + tag: CP14RecipeSewing + craftTime: 5 + requirements: + - !type:ProtoIdResource + protoId: CP14FoodMeatFlemHead + - !type:ProtoIdResource + protoId: CP14String + - !type:StackResource + stack: CP14Cloth + count: 2 + result: CP14ClothingHeadFishMask + # Misc - type: CP14Recipe diff --git a/Resources/Prototypes/_CP14/Religion/religions.yml b/Resources/Prototypes/_CP14/Religion/religions.yml new file mode 100644 index 0000000000..da2846cb79 --- /dev/null +++ b/Resources/Prototypes/_CP14/Religion/religions.yml @@ -0,0 +1,5 @@ +- type: cp14Religion + id: Merkas + +- type: cp14Religion + id: Lumera \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Demigods/lumera.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Demigods/lumera.yml new file mode 100644 index 0000000000..88cfc32447 --- /dev/null +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Demigods/lumera.yml @@ -0,0 +1,16 @@ +- type: job + id: CP14GodLumera + name: cp14-job-name-god-lumera + description: cp14-job-desc-god-lumera + setPreference: true + playTimeTracker: CP14GodLumera + requirements: + - !type:OverallPlaytimeRequirement + time: 36000 # 10 hrs + canBeAntag: false + icon: CP14JobIconGodLumera + jobEntity: CP14MobGodLumera + joinNotifyCrew: false + requireAdminNotify: true + jobPreviewEntity: CP14MobGodLumera + applyTraits: false \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Demigods/merkas.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Demigods/merkas.yml new file mode 100644 index 0000000000..de2828a4d5 --- /dev/null +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Demigods/merkas.yml @@ -0,0 +1,16 @@ +- type: job + id: CP14GodMerkas + name: cp14-job-name-god-merkas + description: cp14-job-desc-god-merkas + setPreference: false + playTimeTracker: CP14GodMerkas + requirements: + - !type:OverallPlaytimeRequirement + time: 36000 # 10 hrs + canBeAntag: false + icon: CP14JobIconGodMerkas + jobEntity: CP14MobGodMerkas + joinNotifyCrew: false + requireAdminNotify: true + jobPreviewEntity: CP14MobGodMerkas + applyTraits: false \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml b/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml index f62212e0cc..337f986836 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/Traders/merchant.yml @@ -12,6 +12,9 @@ time: 3600 # 1 hours special: - !type:CP14AddGlobalReputationSpecial + - !type:CP14LearnSkillsSpecial + skills: + - TraderWit - type: startingGear id: CP14MerchantGear diff --git a/Resources/Prototypes/_CP14/Roles/Jobs/departments.yml b/Resources/Prototypes/_CP14/Roles/Jobs/departments.yml index c769d2d731..977d25a627 100644 --- a/Resources/Prototypes/_CP14/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/_CP14/Roles/Jobs/departments.yml @@ -1,3 +1,14 @@ +- type: department + id: CP14Demigods + name: department-CP14Demigods + description: department-CP14Demigods-desc + weight: 666 # >:) + color: "#ffffff" + editorHidden: false + roles: + - CP14GodLumera + - CP14GodMerkas + - type: department id: CP14Command name: department-CP14Command @@ -5,6 +16,7 @@ primary: false weight: 10 color: "#3ec8fa" + editorHidden: true #temp roles: - CP14GuardCommander - CP14Guildmaster @@ -15,6 +27,7 @@ description: department-CP14Guard-desc weight: 9 color: "#576384" + editorHidden: true #temp roles: - CP14GuardCommander - CP14Guard @@ -40,5 +53,4 @@ color: "#588151" roles: - CP14Guildmaster - - CP14Adventurer - + - CP14Adventurer \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Roles/play_time_tracker.yml b/Resources/Prototypes/_CP14/Roles/play_time_tracker.yml index 521b6a568c..e0b11fe95f 100644 --- a/Resources/Prototypes/_CP14/Roles/play_time_tracker.yml +++ b/Resources/Prototypes/_CP14/Roles/play_time_tracker.yml @@ -37,3 +37,9 @@ - type: playTimeTracker id: CP14JobMerchant +# Gods +- type: playTimeTracker + id: CP14GodMerkas + +- type: playTimeTracker + id: CP14GodLumera \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Shaders/shaders.yml b/Resources/Prototypes/_CP14/Shaders/shaders.yml index 468675576d..abe9eaf7b2 100644 --- a/Resources/Prototypes/_CP14/Shaders/shaders.yml +++ b/Resources/Prototypes/_CP14/Shaders/shaders.yml @@ -19,3 +19,8 @@ FalloffStrength: 0.75 FalloffPow: 3.0 HDR: 1.5 + +- type: shader + id: CP14ReligionVision + kind: source + path: "/Textures/_CP14/Shaders/religion.swsl" \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/atlethic.yml b/Resources/Prototypes/_CP14/Skill/Basic/atlethic.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/atlethic.yml rename to Resources/Prototypes/_CP14/Skill/Basic/atlethic.yml diff --git a/Resources/Prototypes/_CP14/Skill/blacksmithing.yml b/Resources/Prototypes/_CP14/Skill/Basic/craftsmanship.yml similarity index 58% rename from Resources/Prototypes/_CP14/Skill/blacksmithing.yml rename to Resources/Prototypes/_CP14/Skill/Basic/craftsmanship.yml index 6cf804e1a8..1319dd4bc1 100644 --- a/Resources/Prototypes/_CP14/Skill/blacksmithing.yml +++ b/Resources/Prototypes/_CP14/Skill/Basic/craftsmanship.yml @@ -1,7 +1,22 @@ +- type: cp14Skill + id: TraderWit + skillUiPosition: 0, 0 + tree: Craftsmanship + name: cp14-skill-trader-wit-name + desc: cp14-skill-trader-wit-desc + learnCost: 1 + icon: + sprite: _CP14/Objects/Economy/pp_coin.rsi + state: coin8 + effects: + - !type:AddComponents + components: + - type: CP14PriceScanner + - type: cp14Skill id: CopperMelting - skillUiPosition: 1, 0 - tree: Blacksmithing + skillUiPosition: 4, 0 + tree: Craftsmanship name: cp14-skill-copper-melt-name learnCost: 0.5 icon: @@ -12,8 +27,8 @@ - type: cp14Skill id: IronMelting - skillUiPosition: 1, 2 - tree: Blacksmithing + skillUiPosition: 4, 2 + tree: Craftsmanship name: cp14-skill-iron-melt-name learnCost: 0.5 icon: @@ -27,8 +42,8 @@ - type: cp14Skill id: GoldMelting - skillUiPosition: 0, 4 - tree: Blacksmithing + skillUiPosition: 3, 4 + tree: Craftsmanship name: cp14-skill-gold-melt-name learnCost: 0.5 icon: @@ -42,8 +57,8 @@ - type: cp14Skill id: MithrilMelting - skillUiPosition: 2, 4 - tree: Blacksmithing + skillUiPosition: 5, 4 + tree: Craftsmanship name: cp14-skill-mithril-melt-name learnCost: 0.5 icon: @@ -57,8 +72,8 @@ - type: cp14Skill id: GlassMelting - skillUiPosition: 3, 0 - tree: Blacksmithing + skillUiPosition: 6, 0 + tree: Craftsmanship name: cp14-skill-glass-melt-name learnCost: 0.5 icon: @@ -67,3 +82,17 @@ effects: - !type:UnlockRecipes +- type: cp14Skill + id: AlchemyVision + skillUiPosition: 10, 0 + tree: Craftsmanship + name: cp14-skill-alchemy-vision-name + desc: cp14-skill-alchemy-vision-desc + learnCost: 1 + icon: + sprite: _CP14/Clothing/Eyes/alchemy_glasses.rsi + state: icon + effects: + - !type:AddComponents + components: + - type: SolutionScanner \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/dimension.yml b/Resources/Prototypes/_CP14/Skill/Basic/dimension.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/dimension.yml rename to Resources/Prototypes/_CP14/Skill/Basic/dimension.yml diff --git a/Resources/Prototypes/_CP14/Skill/healing.yml b/Resources/Prototypes/_CP14/Skill/Basic/healing.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/healing.yml rename to Resources/Prototypes/_CP14/Skill/Basic/healing.yml diff --git a/Resources/Prototypes/_CP14/Skill/hydrosophistry.yml b/Resources/Prototypes/_CP14/Skill/Basic/hydrosophistry.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/hydrosophistry.yml rename to Resources/Prototypes/_CP14/Skill/Basic/hydrosophistry.yml diff --git a/Resources/Prototypes/_CP14/Skill/illusion.yml b/Resources/Prototypes/_CP14/Skill/Basic/illusion.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/illusion.yml rename to Resources/Prototypes/_CP14/Skill/Basic/illusion.yml diff --git a/Resources/Prototypes/_CP14/Skill/martial_arts.yml b/Resources/Prototypes/_CP14/Skill/Basic/martial_arts.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/martial_arts.yml rename to Resources/Prototypes/_CP14/Skill/Basic/martial_arts.yml diff --git a/Resources/Prototypes/_CP14/Skill/metamagic.yml b/Resources/Prototypes/_CP14/Skill/Basic/metamagic.yml similarity index 100% rename from Resources/Prototypes/_CP14/Skill/metamagic.yml rename to Resources/Prototypes/_CP14/Skill/Basic/metamagic.yml diff --git a/Resources/Prototypes/_CP14/Skill/pyrokinetic.yml b/Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml similarity index 89% rename from Resources/Prototypes/_CP14/Skill/pyrokinetic.yml rename to Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml index 2aa5256173..1991782db8 100644 --- a/Resources/Prototypes/_CP14/Skill/pyrokinetic.yml +++ b/Resources/Prototypes/_CP14/Skill/Basic/pyrokinetic.yml @@ -102,6 +102,20 @@ - !type:NeedPrerequisite prerequisite: PyrokineticT2 +- type: cp14Skill + id: CP14ActionSpellFirewave + skillUiPosition: 8, 4 + tree: Pyrokinetic + icon: + sprite: _CP14/Actions/Spells/fire.rsi + state: firewave + effects: + - !type:AddAction + action: CP14ActionSpellFirewave + restrictions: + - !type:NeedPrerequisite + prerequisite: PyrokineticT2 + # T3 - type: cp14Skill diff --git a/Resources/Prototypes/_CP14/Skill/skill_tree.yml b/Resources/Prototypes/_CP14/Skill/Basic/trees.yml similarity index 58% rename from Resources/Prototypes/_CP14/Skill/skill_tree.yml rename to Resources/Prototypes/_CP14/Skill/Basic/trees.yml index 223474eee3..fa7cf18678 100644 --- a/Resources/Prototypes/_CP14/Skill/skill_tree.yml +++ b/Resources/Prototypes/_CP14/Skill/Basic/trees.yml @@ -3,84 +3,71 @@ name: cp14-skill-tree-pyrokinetic-name desc: cp14-skill-tree-pyrokinetic-desc color: "#d6933c" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: pyro - type: cp14SkillTree id: Hydrosophistry name: cp14-skill-tree-hydrosophistry-name desc: cp14-skill-tree-hydrosophistry-desc color: "#1554a1" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: water - type: cp14SkillTree id: Illusion name: cp14-skill-tree-illusion-name desc: cp14-skill-tree-illusion-desc color: "#f55faf" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: light - type: cp14SkillTree id: Metamagic name: cp14-skill-tree-metamagic-name desc: cp14-skill-tree-metamagic-desc color: "#56e5f5" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: meta - type: cp14SkillTree id: Healing name: cp14-skill-tree-healing-name desc: cp14-skill-tree-healing-desc color: "#51cf72" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: heal - type: cp14SkillTree id: Atlethic name: cp14-skill-tree-atlethic-name desc: cp14-skill-tree-atlethic-desc color: "#b32e37" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: atlethic #- type: cp14SkillTree # id: Dimension # name: cp14-skill-tree-dimension-name # desc: cp14-skill-tree-dimension-desc # color: "#ac66be" -# icon: -# sprite: _CP14/Actions/skill_tree.rsi -# state: dimension - type: cp14SkillTree id: MartialArts name: cp14-skill-tree-martial-name desc: cp14-skill-tree-martial-desc color: "#f54242" - icon: - sprite: _CP14/Actions/skill_tree.rsi - state: martial # -- type: cp14SkillTree - id: Thaumaturgy - name: cp14-skill-tree-thaumaturgy-name - desc: cp14-skill-tree-thaumaturgy-desc - color: "#7c52bf" +#- type: cp14SkillTree +# id: Thaumaturgy +# name: cp14-skill-tree-thaumaturgy-name +# desc: cp14-skill-tree-thaumaturgy-desc +# color: "#7c52bf" + +#- type: cp14SkillTree +# id: Blacksmithing +# name: cp14-skill-tree-blacksmithing-name +# desc: cp14-skill-tree-blacksmithing-desc +# color: "#6b3200" + +#- type: cp14SkillTree +# id: Trading +# name: cp14-skill-tree-trading-name +# desc: cp14-skill-tree-trading-desc +# color: "#f5edaa" - type: cp14SkillTree - id: Blacksmithing - name: cp14-skill-tree-blacksmithing-name - desc: cp14-skill-tree-blacksmithing-desc - color: "#6b3200" - + id: Craftsmanship + name: cp14-skill-tree-craftsman-name + desc: cp14-skill-tree-craftsman-desc + color: "#a04b00" diff --git a/Resources/Prototypes/_CP14/Skill/Demigods/lumera.yml b/Resources/Prototypes/_CP14/Skill/Demigods/lumera.yml new file mode 100644 index 0000000000..d90834111a --- /dev/null +++ b/Resources/Prototypes/_CP14/Skill/Demigods/lumera.yml @@ -0,0 +1,153 @@ +# T1 + +- type: cp14Skill + id: LumeraT1 + skillUiPosition: 1, 0 + tree: GodLumera + name: cp14-skill-lumera-t1-name + learnCost: 0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: t1 + +- type: cp14Skill + id: LumeraTouch + skillUiPosition: 0, 3 + tree: GodLumera + learnCost: 0.0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: touch + effects: + - !type:AddAction + action: CP14ActionSpellGodLumeraTouch + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT1 + +- type: cp14Skill + id: LumeraRenounce + skillUiPosition: 2, 3 + tree: GodLumera + learnCost: 0.0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: renounce + effects: + - !type:AddAction + action: CP14ActionSpellGodLumeraRenounce + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT1 + +- type: cp14Skill + id: LumeraMindScan + name: cp14-skill-lumera-mind-scan-name + desc: cp14-skill-lumera-mind-scan-desc + skillUiPosition: 0, 5 + tree: GodLumera + learnCost: 0.5 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: mind_scan + effects: + - !type:AddComponents + components: + - type: CP14SkillScanner + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT1 + +# T2 + +- type: cp14Skill + id: LumeraT2 + skillUiPosition: 7, 0 + tree: GodLumera + name: cp14-skill-lumera-t2-name + learnCost: 0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: t2 + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT1 + - !type:GodFollowerPercentage + percentage: 0.25 + +- type: cp14Skill + id: LumeraDarkMist + skillUiPosition: 6, 3 + tree: GodLumera + learnCost: 1.0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: mist + effects: + - !type:AddAction + action: CP14ActionSpellGodLumeraDarkmist + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT2 + +- type: cp14Skill + id: LumeraMoonStrike + skillUiPosition: 8, 3 + tree: GodLumera + learnCost: 1.0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: moon_beam + effects: + - !type:AddAction + action: CP14ActionSpellGodLumeraMoonStrike + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT2 + +# T3 + +- type: cp14Skill + id: LumeraT3 + skillUiPosition: 13, 0 + tree: GodLumera + name: cp14-skill-lumera-t3-name + learnCost: 0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: t3 + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT2 + - !type:GodFollowerPercentage + percentage: 0.5 + +- type: cp14Skill + id: LumeraMindUpgrade + skillUiPosition: 12, 3 + tree: GodLumera + learnCost: 1.0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: mind_upgrade + effects: + - !type:AddAction + action: CP14ActionSpellGodLumeraMindUpgrade + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT3 + +- type: cp14Skill + id: LumeraMindDegrade + skillUiPosition: 14, 3 + tree: GodLumera + learnCost: 1.0 + icon: + sprite: _CP14/Actions/DemigodSpells/lumera.rsi + state: wrath + effects: + - !type:AddAction + action: CP14ActionSpellGodLumeraMindDegrade + restrictions: + - !type:NeedPrerequisite + prerequisite: LumeraT3 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/Demigods/merkas.yml b/Resources/Prototypes/_CP14/Skill/Demigods/merkas.yml new file mode 100644 index 0000000000..53c5d70e09 --- /dev/null +++ b/Resources/Prototypes/_CP14/Skill/Demigods/merkas.yml @@ -0,0 +1,12 @@ +- type: cp14Skill + id: NatureGodT1 + skillUiPosition: 1, 0 + tree: GodMerkas + name: cp14-skill-life-t1-name + learnCost: 0.5 + icon: + sprite: _CP14/Actions/skill_tree.rsi + state: heal + effects: + - !type:AddAction + action: CP14ActionSpellBloodPurification \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/Demigods/trees.yml b/Resources/Prototypes/_CP14/Skill/Demigods/trees.yml new file mode 100644 index 0000000000..45f51c7847 --- /dev/null +++ b/Resources/Prototypes/_CP14/Skill/Demigods/trees.yml @@ -0,0 +1,12 @@ +- type: cp14SkillTree + id: GodMerkas + name: cp14-job-name-god-merkas + desc: cp14-job-desc-god-merkas + color: "#51cf72" + +- type: cp14SkillTree + id: GodLumera + name: cp14-job-name-god-lumera + desc: cp14-job-desc-god-lumera + color: "#5632a8" + parallax: Default \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Skill/thaumaturgy.yml b/Resources/Prototypes/_CP14/Skill/thaumaturgy.yml deleted file mode 100644 index d9dd600b3c..0000000000 --- a/Resources/Prototypes/_CP14/Skill/thaumaturgy.yml +++ /dev/null @@ -1,15 +0,0 @@ -- type: cp14Skill - id: AlchemyVision - skillUiPosition: 0, 0 - tree: Thaumaturgy - name: cp14-skill-alchemy-vision-name - desc: cp14-skill-alchemy-vision-desc - learnCost: 1 - icon: - sprite: _CP14/Clothing/Eyes/alchemy_glasses.rsi - state: icon - effects: - - !type:AddComponents - components: - - type: SolutionScanner - diff --git a/Resources/Prototypes/_CP14/SoundCollections/animals.yml b/Resources/Prototypes/_CP14/SoundCollections/animals.yml index 60103c7d1c..af741fe249 100644 --- a/Resources/Prototypes/_CP14/SoundCollections/animals.yml +++ b/Resources/Prototypes/_CP14/SoundCollections/animals.yml @@ -11,3 +11,11 @@ - /Audio/_CP14/Animals/frog1.ogg - /Audio/_CP14/Animals/frog2.ogg - /Audio/_CP14/Animals/frog3.ogg + +- type: soundCollection + id: CP14Flem + files: + - /Audio/_CP14/Animals/flem1.ogg + - /Audio/_CP14/Animals/flem2.ogg + - /Audio/_CP14/Animals/flem3.ogg + - /Audio/_CP14/Effects/bubbles.ogg diff --git a/Resources/Prototypes/_CP14/SoundCollections/misc.yml b/Resources/Prototypes/_CP14/SoundCollections/misc.yml index c9c5bf5a90..1069061784 100644 --- a/Resources/Prototypes/_CP14/SoundCollections/misc.yml +++ b/Resources/Prototypes/_CP14/SoundCollections/misc.yml @@ -42,3 +42,11 @@ - /Audio/_CP14/Effects/coin_impact2.ogg - /Audio/_CP14/Effects/coin_impact3.ogg +- type: soundCollection + id: CP14MoonStrike + files: + - /Audio/_CP14/Effects/moon_strike1.ogg + - /Audio/_CP14/Effects/moon_strike2.ogg + - /Audio/_CP14/Effects/moon_strike3.ogg + - /Audio/_CP14/Effects/moon_strike4.ogg + diff --git a/Resources/Prototypes/_CP14/StatusIcon/god_job.yml b/Resources/Prototypes/_CP14/StatusIcon/god_job.yml new file mode 100644 index 0000000000..071828dcdd --- /dev/null +++ b/Resources/Prototypes/_CP14/StatusIcon/god_job.yml @@ -0,0 +1,15 @@ +- type: jobIcon + parent: CP14JobIcon + id: CP14JobIconGodMerkas + icon: + sprite: /Textures/_CP14/Interface/Misc/job_god_icons.rsi + state: Merkas + jobName: cp14-job-name-god-merkas + +- type: jobIcon + parent: CP14JobIcon + id: CP14JobIconGodLumera + icon: + sprite: /Textures/_CP14/Interface/Misc/job_god_icons.rsi + state: Lumera + jobName: cp14-job-name-god-lumera \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Trading/brad_potions.yml b/Resources/Prototypes/_CP14/Trading/brad_potions.yml index d92d5aff34..76bca77408 100644 --- a/Resources/Prototypes/_CP14/Trading/brad_potions.yml +++ b/Resources/Prototypes/_CP14/Trading/brad_potions.yml @@ -139,6 +139,28 @@ service: !type:CP14BuyItemsService product: CP14Syringe +- type: cp14TradingPosition + id: CP14ClothingEyesAlchemyGlasses + faction: BradPotions + reputationLevel: 1 + uiPosition: 9 + icon: + sprite: _CP14/Clothing/Eyes/alchemy_glasses.rsi + state: icon + service: !type:CP14BuyItemsService + product: CP14ClothingEyesAlchemyGlasses + +- type: cp14TradingPosition + id: CP14ClothingEyesAlchemyMonocle + faction: BradPotions + reputationLevel: 1 + uiPosition: 10 + icon: + sprite: _CP14/Clothing/Eyes/alchemy_monocle.rsi + state: icon + service: !type:CP14BuyItemsService + product: CP14ClothingEyesAlchemyMonocle + # Rep 2 - type: cp14TradingPosition diff --git a/Resources/Prototypes/_CP14/Trading/contracts.yml b/Resources/Prototypes/_CP14/Trading/contracts.yml index a357cc77a5..af0f86b118 100644 --- a/Resources/Prototypes/_CP14/Trading/contracts.yml +++ b/Resources/Prototypes/_CP14/Trading/contracts.yml @@ -51,4 +51,4 @@ state: house service: !type:CP14BuyItemsService product: CP14TradeContractHomeDecor - count: 1 + count: 1 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Trading/thaumaturgy.yml b/Resources/Prototypes/_CP14/Trading/thaumaturgy.yml index e3a55570c2..300348a192 100644 --- a/Resources/Prototypes/_CP14/Trading/thaumaturgy.yml +++ b/Resources/Prototypes/_CP14/Trading/thaumaturgy.yml @@ -113,6 +113,17 @@ # Rep 1 +- type: cp14TradingPosition + id: CP14ClothingEyesMerchantMonocle + faction: Thaumaturgy + reputationLevel: 1 + uiPosition: 1 + icon: + sprite: _CP14/Clothing/Eyes/merchant_monocle.rsi + state: icon + service: !type:CP14BuyItemsService + product: CP14ClothingEyesMerchantMonocle + - type: cp14TradingPosition id: CP14ManaOperationGlove faction: Thaumaturgy diff --git a/Resources/Prototypes/_CP14/Trading/victoria_gardens.yml b/Resources/Prototypes/_CP14/Trading/victoria_gardens.yml index f9cb01c667..7ebaf31212 100644 --- a/Resources/Prototypes/_CP14/Trading/victoria_gardens.yml +++ b/Resources/Prototypes/_CP14/Trading/victoria_gardens.yml @@ -66,13 +66,24 @@ product: CP14FoodOnion count: 3 +- type: cp14TradingPosition + id: CP14Wheat + faction: VictoriaGardens + uiPosition: 6 + icon: + sprite: _CP14/Objects/Flora/Farm/wheat.rsi + state: base1 + service: !type:CP14BuyItemsService + product: CP14Wheat + count: 3 + - type: cp14TradingPosition id: CP14FloorTileGrassBag faction: VictoriaGardens priceMarkup: 2 reputationLevel: 0 - uiPosition: 7 + uiPosition: 8 icon: sprite: _CP14/Objects/Specific/Farming/grass_seeds.rsi state: grass @@ -85,7 +96,7 @@ faction: VictoriaGardens priceMarkup: 2 reputationLevel: 0 - uiPosition: 8 + uiPosition: 9 icon: sprite: _CP14/Objects/Specific/Farming/grass_seeds.rsi state: grass2 @@ -98,7 +109,7 @@ faction: VictoriaGardens priceMarkup: 2 reputationLevel: 0 - uiPosition: 9 + uiPosition: 10 icon: sprite: _CP14/Objects/Specific/Farming/grass_seeds.rsi state: grass3 @@ -130,4 +141,16 @@ state: base1 service: !type:CP14BuyItemsService product: CP14FoodPumpkin + count: 3 + +- type: cp14TradingPosition + id: CP14Cotton + faction: VictoriaGardens + reputationLevel: 1 + uiPosition: 2 + icon: + sprite: _CP14/Objects/Flora/Farm/cotton.rsi + state: base1 + service: !type:CP14BuyItemsService + product: CP14Cotton count: 3 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/ai_factions.yml b/Resources/Prototypes/_CP14/ai_factions.yml index f8375b7f1d..85b02a011b 100644 --- a/Resources/Prototypes/_CP14/ai_factions.yml +++ b/Resources/Prototypes/_CP14/ai_factions.yml @@ -7,6 +7,7 @@ - CP14Monster - CP14Insects - CP14Slimes + - CP14Fishies - type: npcFaction id: CP14HostileEveryone @@ -17,6 +18,7 @@ - CP14AggressiveAnimals - CP14Monster - CP14Slimes + - CP14Fishies - type: npcFaction id: CP14Undead @@ -25,6 +27,7 @@ - CP14HostileEveryone - CP14PeacefulAnimals - CP14AggressiveAnimals + - CP14Fishies - type: npcFaction id: CP14PeacefulAnimals @@ -41,6 +44,7 @@ - CP14Monster - CP14Slimes - CP14HostileEveryone + - CP14Fishies - type: npcFaction id: CP14Monster @@ -56,6 +60,7 @@ - CP14Adventurers - CP14AggressiveAnimals - CP14PeacefulAnimals + - CP14Fishies - type: npcFaction id: CP14Slimes @@ -64,3 +69,13 @@ - CP14HostileEveryone - CP14PeacefulAnimals - CP14AggressiveAnimals + +- type: npcFaction + id: CP14Fishies + hostile: + - CP14Adventurers + - CP14HostileEveryone + - CP14PeacefulAnimals + - CP14AggressiveAnimals + - CP14Insects + - CP14Undead diff --git a/Resources/ServerInfo/_CP14/Guidebook_EN/JobsTabs/Patrons.xml b/Resources/ServerInfo/_CP14/Guidebook_EN/JobsTabs/Patrons.xml new file mode 100644 index 0000000000..4b8b701566 --- /dev/null +++ b/Resources/ServerInfo/_CP14/Guidebook_EN/JobsTabs/Patrons.xml @@ -0,0 +1,35 @@ + + +# Patrons + +Patrons are a unique game role representing incorporeal spirits capable of helping or hindering mortals. + +## Lore + +Mortals believe that patrons are gods. This is not true. True gods have no interest in what happens on Silite. Nevertheless, the beliefs, desires, fears, and emotions of mortals can create "patron spirits" — incorporeal energy entities that take on the form and powers associated with what mortals believe in. + +Such entities can be described as energetic parasites or symbionts—constantly sucking energy from their followers, they can exist and in return help them with their life problems. + +But if those who believe in the patrons spirit die or reject it, the spirit, deprived of energy, gradually dies. + +Because of this, patrons try with all their might to spread their influence, because the more people know about them and believe in them, the stronger the spirit becomes, gaining more opportunities to influence the world. + +## Area of influence + +Patron deities are not omnipotent and can only act within their area of influence. Most often, a patron deity's area of influence is provided by things associated with them: altars, their own followers, or anything directly related to their power. + +Outside their area of influence, patron deities can only silently observe. + +## Primordial statues and followers + +Each patron has an anchor connecting them to the real world. Most often, these are primordial statues depicting that god. + +Any intelligent being can become a follower of a god by touching a primordial statue and making an agreement with the patron. This establishes a "communication channel". The follower provides the patron with a zone of influence around themselves, allowing the patron to communicate with the follower at any time or influence the environment around them. + +The “channel” between the follower and the patron can be severed at any time, either by renouncing the patron or by expelling the follower. Once an intelligent being has severed its connection with the patron, it can never return to it in that round. + + + + + + \ No newline at end of file diff --git a/Resources/ServerInfo/_CP14/Guidebook_RU/JobsTabs/Patrons.xml b/Resources/ServerInfo/_CP14/Guidebook_RU/JobsTabs/Patrons.xml new file mode 100644 index 0000000000..41c0ea8701 --- /dev/null +++ b/Resources/ServerInfo/_CP14/Guidebook_RU/JobsTabs/Patrons.xml @@ -0,0 +1,35 @@ + + +# Покровители + +Покровители - это уникальная игровая роль, представляющая из себя бестелесных духов, способных помогать смертным, или мешать им. + +## Лор + +Смертные верят - что покровители это боги. Это не так. Настоящим богам нет дела до происходящего на Силейте. Тем не менее, вера, желания, страхи и эмоции смертных могут создавать "Духов-покровителей" - бестелесных энергетических сущностей, которые принимают форму и силы, связанные с тем, во что верят смертные. + +Такие сущности, можно сказать, являются энергитическими паразитами, или симбиотами - постоянно высасывая энергию из своих последователей, они могут существовать и взамен помогать им в их жизненных проблемах. + +Но если те кто верят в Духа-покровителя погибают, или отвергают его, дух, оставаясь без подпитки энергией, постепенно погибает. + +Из-за этого, покровители всеми силами пытаются распространять свое влияние, ведь чем больше людей знают о нем и верят в него - тем дух становится сильнее, получая больше возможностей влиять на мир. + +## Область влияния + +Покровители не всесильны, и способны действовать только в области своего влияния. Чаще всего область влияния для покровителя предоставляют те вещи, которые с ним связаны: Алтари, собственные последователи, или что-либо связанное напрямую с его силой. + +Вне зоны своего влияния покровители могут лишь молчаливо наблюдать. + +## Первоводные статуи и последователи + +У каждого покровителя есть якорь, соединяющий его с реальным миром. Чаще всего это первородные статуи, изображающие этого бога. + +Любое разумное существо способно стать последователем бога, прикоснувшись к первородной статуе, и договорившись с покровителем. Это устанавливает "канал связи". Последователь предоставляет покровителю зону влияния вокруг себя, что позволяет тому в любое время общаться с последователем, или влиять на окружение вокруг него. + +"Канал" между последователем и покровителем может быть в любой момент разорван, либо отречением от покровителя, либо изгнанием последователя. После того как разумное существо разорвало связь с покровителем, в этом раунде оно больше никогда не сможет вернуться к нему. + + + + + + \ No newline at end of file diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/generic.rsi/appeal.png b/Resources/Textures/_CP14/Actions/DemigodSpells/generic.rsi/appeal.png new file mode 100644 index 0000000000..905788b6f2 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/generic.rsi/appeal.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/generic.rsi/meta.json b/Resources/Textures/_CP14/Actions/DemigodSpells/generic.rsi/meta.json new file mode 100644 index 0000000000..70a3e715dd --- /dev/null +++ b/Resources/Textures/_CP14/Actions/DemigodSpells/generic.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "All right reserved", + "copyright": "Created by TheShuEd", + "states": [ + { + "name": "appeal" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/meta.json b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/meta.json new file mode 100644 index 0000000000..943e1d015a --- /dev/null +++ b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/meta.json @@ -0,0 +1,44 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "All right reserved", + "copyright": "Created by TheShuEd", + "states": [ + { + "name": "touch" + }, + { + "name": "warp" + }, + { + "name": "renounce" + }, + { + "name": "mist" + }, + { + "name": "mind_upgrade" + }, + { + "name": "mind_scan" + }, + { + "name": "moon_beam" + }, + { + "name": "wrath" + }, + { + "name": "t1" + }, + { + "name": "t2" + }, + { + "name": "t3" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mind_scan.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mind_scan.png new file mode 100644 index 0000000000..f8f2f9e13b Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mind_scan.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mind_upgrade.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mind_upgrade.png new file mode 100644 index 0000000000..a24589c274 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mind_upgrade.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mist.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mist.png new file mode 100644 index 0000000000..78491c7003 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/mist.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/moon_beam.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/moon_beam.png new file mode 100644 index 0000000000..7a2bbf3e6c Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/moon_beam.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/renounce.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/renounce.png new file mode 100644 index 0000000000..04a67e9dfc Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/renounce.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t1.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t1.png new file mode 100644 index 0000000000..7e39d4d0b9 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t1.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t2.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t2.png new file mode 100644 index 0000000000..a66b969e53 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t2.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t3.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t3.png new file mode 100644 index 0000000000..4905793060 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/t3.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/touch.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/touch.png new file mode 100644 index 0000000000..f41f19d474 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/touch.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/warp.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/warp.png new file mode 100644 index 0000000000..a158ac6ded Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/warp.png differ diff --git a/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/wrath.png b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/wrath.png new file mode 100644 index 0000000000..e129b1ec72 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/DemigodSpells/lumera.rsi/wrath.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/fire.rsi/firewave.png b/Resources/Textures/_CP14/Actions/Spells/fire.rsi/firewave.png new file mode 100644 index 0000000000..efcc421ef5 Binary files /dev/null and b/Resources/Textures/_CP14/Actions/Spells/fire.rsi/firewave.png differ diff --git a/Resources/Textures/_CP14/Actions/Spells/fire.rsi/meta.json b/Resources/Textures/_CP14/Actions/Spells/fire.rsi/meta.json index 2838006a31..8dee19ade6 100644 --- a/Resources/Textures/_CP14/Actions/Spells/fire.rsi/meta.json +++ b/Resources/Textures/_CP14/Actions/Spells/fire.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "All right reserved", - "copyright": "Created by .kreks., tiefling_revenge, fire_music by TheShuEd", + "copyright": "Created by .kreks., tiefling_revenge, fire_music, firewave by TheShuEd", "states": [ { "name": "fire_music" @@ -21,6 +21,9 @@ }, { "name": "heat" + }, + { + "name": "firewave" } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/equipped-EYES.png b/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/equipped-EYES.png new file mode 100644 index 0000000000..3d89ed45d3 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/equipped-EYES.png differ diff --git a/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/icon.png new file mode 100644 index 0000000000..0e7e99c9c6 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/meta.json new file mode 100644 index 0000000000..d164be5c36 --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Eyes/merchant_monocle.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by Jaba", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-EYES", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET-carcat.png b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET-carcat.png new file mode 100644 index 0000000000..4c66761572 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET-carcat.png differ diff --git a/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET-goblin.png b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET-goblin.png new file mode 100644 index 0000000000..00c468d1d3 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET-goblin.png differ diff --git a/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET.png b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..1f90f622b1 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/icon.png b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/icon.png new file mode 100644 index 0000000000..8397aaf22f Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/meta.json b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/meta.json new file mode 100644 index 0000000000..c2910829fc --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/Head/Produced/Armor/fish_mask.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by Frogoo", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "equipped-HELMET-carcat", + "directions": 4 + }, + { + "name": "equipped-HELMET-goblin", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING-carcat.png b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING-carcat.png new file mode 100644 index 0000000000..d79f9316ee Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING-carcat.png differ diff --git a/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING-goblin.png b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING-goblin.png new file mode 100644 index 0000000000..2dbbd9cace Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING-goblin.png differ diff --git a/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 0000000000..0e828e19c5 Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/icon.png b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/icon.png new file mode 100644 index 0000000000..844ce06d7b Binary files /dev/null and b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/icon.png differ diff --git a/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/meta.json b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/meta.json new file mode 100644 index 0000000000..2d9be1ca9e --- /dev/null +++ b/Resources/Textures/_CP14/Clothing/OuterClothing/fish_suit.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by Frogoo", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-carcat", + "directions": 4 + }, + { + "name": "equipped-OUTERCLOTHING-goblin", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json index 035f9b2875..b47d09c742 100644 --- a/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json +++ b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/meta.json @@ -81,6 +81,21 @@ 0.2 ] ] + }, + { + "name": "stars", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] } ] } diff --git a/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/stars.png b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/stars.png new file mode 100644 index 0000000000..d251ee68ed Binary files /dev/null and b/Resources/Textures/_CP14/Effects/Magic/cast_impact.rsi/stars.png differ diff --git a/Resources/Textures/_CP14/Effects/lumera_strike.rsi/meta.json b/Resources/Textures/_CP14/Effects/lumera_strike.rsi/meta.json new file mode 100644 index 0000000000..2fe0e6da9e --- /dev/null +++ b/Resources/Textures/_CP14/Effects/lumera_strike.rsi/meta.json @@ -0,0 +1,29 @@ +{ + "version": 1, + "copyright": "Created bby TheShuEd", + "license": "CC-BY-SA-3.0", + "size": { + "x": 38, + "y": 200 + }, + "states": [ + { + "name": "pewpew", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 2 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CP14/Effects/lumera_strike.rsi/pewpew.png b/Resources/Textures/_CP14/Effects/lumera_strike.rsi/pewpew.png new file mode 100644 index 0000000000..4c7d53d2bd Binary files /dev/null and b/Resources/Textures/_CP14/Effects/lumera_strike.rsi/pewpew.png differ diff --git a/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/meta.json b/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/meta.json new file mode 100644 index 0000000000..2258f53b3c --- /dev/null +++ b/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by TheShuEd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "offer", + "directions": 1 + }, + { + "name": "unoffer", + "directions": 1 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/offer.png b/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/offer.png new file mode 100644 index 0000000000..fddb53ff1b Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/offer.png differ diff --git a/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/unoffer.png b/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/unoffer.png new file mode 100644 index 0000000000..48ba096c90 Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Alerts/divine_offer.rsi/unoffer.png differ diff --git a/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/Lumera.png b/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/Lumera.png new file mode 100644 index 0000000000..898473374e Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/Lumera.png differ diff --git a/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/Merkas.png b/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/Merkas.png new file mode 100644 index 0000000000..7480f9aa75 Binary files /dev/null and b/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/Merkas.png differ diff --git a/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/meta.json b/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/meta.json new file mode 100644 index 0000000000..752f9b0614 --- /dev/null +++ b/Resources/Textures/_CP14/Interface/Misc/job_god_icons.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "size": { + "x": 13, + "y": 13 + }, + "license": "CC-BY-SA-4.0", + "copyright": "Created by TheShuEd (Github)", + "states": [ + { + "name": "Merkas" + }, + { + "name": "Lumera" + } + ] +} diff --git a/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/lumera.png b/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/lumera.png new file mode 100644 index 0000000000..47725ded6e Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/lumera.png differ diff --git a/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/merkas.png b/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/merkas.png new file mode 100644 index 0000000000..4d2d27105d Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/merkas.png differ diff --git a/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/meta.json b/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/meta.json new file mode 100644 index 0000000000..61384f54bd --- /dev/null +++ b/Resources/Textures/_CP14/Mobs/Demigods/temp_icons.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by Jaraten (discord/Github)", + "size": { + "x": 48, + "y": 48 + }, + "states": [ + { + "name": "lumera", + "directions": 4 + }, + { + "name": "merkas", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/flem_dead.png b/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/flem_dead.png new file mode 100644 index 0000000000..4e8e022637 Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/flem_dead.png differ diff --git a/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/flem_live.png b/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/flem_live.png new file mode 100644 index 0000000000..3179d6ae7c Binary files /dev/null and b/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/flem_live.png differ diff --git a/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/meta.json b/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/meta.json new file mode 100644 index 0000000000..3b8f438424 --- /dev/null +++ b/Resources/Textures/_CP14/Mobs/Monster/flem.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "All right reserved", + "copyright": "Created by Frogoo (discord)", + "states": [ + { + "name": "flem_live", + "directions": 4 + }, + { + "name": "flem_dead" + } + ] +} diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_head.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_head.png new file mode 100644 index 0000000000..f561b1ea90 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_head.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_head_cooked.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_head_cooked.png new file mode 100644 index 0000000000..73414215c2 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_head_cooked.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_leg.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_leg.png new file mode 100644 index 0000000000..a754176833 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_leg.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_leg_cooked.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_leg_cooked.png new file mode 100644 index 0000000000..017492542f Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_leg_cooked.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso.png new file mode 100644 index 0000000000..10c9c8940d Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cooked.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cooked.png new file mode 100644 index 0000000000..344eb30815 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cooked.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cut.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cut.png new file mode 100644 index 0000000000..6b5baabd77 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cut.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cut_cooked.png b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cut_cooked.png new file mode 100644 index 0000000000..11b106e901 Binary files /dev/null and b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/flem_torso_cut_cooked.png differ diff --git a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/meta.json b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/meta.json index 8c9437e21a..6713b24a90 100644 --- a/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/meta.json +++ b/Resources/Textures/_CP14/Objects/Consumable/Food/meat.rsi/meta.json @@ -147,6 +147,30 @@ }, { "name": "different_meat_slice" + }, + { + "name": "flem_head" + }, + { + "name": "flem_head_cooked" + }, + { + "name": "flem_torso" + }, + { + "name": "flem_torso_cut" + }, + { + "name": "flem_torso_cut_cooked" + }, + { + "name": "flem_torso_cooked" + }, + { + "name": "flem_leg" + }, + { + "name": "flem_leg_cooked" } ] } \ No newline at end of file diff --git a/Resources/Textures/_CP14/Shaders/religion.swsl b/Resources/Textures/_CP14/Shaders/religion.swsl new file mode 100644 index 0000000000..d3deb8a7de --- /dev/null +++ b/Resources/Textures/_CP14/Shaders/religion.swsl @@ -0,0 +1,84 @@ +uniform sampler2D SCREEN_TEXTURE; +uniform lowp int count; +uniform highp vec2[64] position; +uniform highp float[64] radius; +uniform highp vec2 renderScale; +uniform highp vec3 shaderColor; + +const highp float radiusFalloff = 60.0; +const highp float noiseScale = 6; +const highp float timeScale = 0.1; + +highp float noise( highp vec2 p ) { + const highp float K1 = 0.366025404; + const highp float K2 = 0.211324865; + + highp vec2 i = floor( p + (p.x+p.y)*K1 ); + highp vec2 a = p - i + (i.x+i.y)*K2; + highp float m = step(a.y,a.x); + highp vec2 o = vec2(m,1.0-m); + highp vec2 b = a - o + K2; + highp vec2 c = a - 1.0 + 2.0*K2; + highp vec3 h = max( 0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 ); + highp vec3 n = h*h*h*h*vec3( dot(a,zRandom(i+0.0)), dot(b,zRandom(i+o)), dot(c,zRandom(i+1.0))); + return dot( n, vec3(70.0) ); +} + +highp vec3 gradientColor(highp float t) { + if (t < 0.5) { + highp float f = t / 0.5; + return mix(vec3(0.0), shaderColor * vec3(0.05, 0.05, 0.15), f); + } else { + highp float f = (t - 0.5) / 0.5; + return mix(shaderColor * vec3(0.05, 0.05, 0.15), shaderColor * vec3(0.15, 0.15, 0.25), f); + } +} + +void fragment() { + highp vec2 fragPos = FRAGCOORD.xy; + highp float visibility = 0.0; + highp float edgeHighlight = 0.0; + highp float scale = renderScale.x; + + highp vec2 uv = fragPos * SCREEN_PIXEL_SIZE; + highp float t = TIME * timeScale; + highp vec2 noiseUV = uv * noiseScale + vec2(t); + + highp float n = noise(noiseUV); + highp vec3 colorOverlay = gradientColor(n); + + highp float nX = noise(noiseUV + vec2(3.1, 7.7)); + highp float nY = noise(noiseUV + vec2(9.3, 2.4)); + highp vec2 distortion = vec2(nX - 0.5, nY - 0.5) * 15.0 * scale; + + for (lowp int i = 0; i < 64 && i < count; i++) { + highp float scaledRadius = radius[i] * 33.0 * scale; + highp float dist = length((fragPos + distortion) - position[i]); + + highp float fade = smoothstep(scaledRadius - radiusFalloff * scale, scaledRadius, dist); + visibility = max(visibility, 1.0 - fade); + + // Узкая кромка по расстоянию до радиуса + highp float offset = -60; + highp float edgeWidth = 8.0 * scale; // ширина кромки в пикселях + highp float edgeDist = abs(dist - (scaledRadius + offset)) * (1 / scale); + highp float edge = smoothstep(edgeWidth, 0.0, edgeDist); + edgeHighlight = max(edgeHighlight, edge); + } + + + highp vec4 baseColor = zTextureSpec(SCREEN_TEXTURE, fragPos * SCREEN_PIXEL_SIZE); + highp vec3 finalColor = mix(colorOverlay, baseColor.rgb, visibility); + + // Наложим бордовую кромку + finalColor = mix( + finalColor, + shaderColor, + edgeHighlight * step(0.5, 1.0 - visibility) + ); + + highp float minAlpha = 0.8; + COLOR = vec4(finalColor, mix(minAlpha, 1.0, visibility)); +} + + diff --git a/Resources/Textures/_CP14/Structures/Specific/Religion/lumera_statue.rsi/meta.json b/Resources/Textures/_CP14/Structures/Specific/Religion/lumera_statue.rsi/meta.json new file mode 100644 index 0000000000..c908e37f2c --- /dev/null +++ b/Resources/Textures/_CP14/Structures/Specific/Religion/lumera_statue.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "All right reserved", + "copyright": "Created by Jaraten, edited by TheShuEd", + "size": { + "x": 112, + "y": 80 + }, + "states": [ + { + "name": "statue1" + } + ] +} diff --git a/Resources/Textures/_CP14/Structures/Specific/Religion/lumera_statue.rsi/statue1.png b/Resources/Textures/_CP14/Structures/Specific/Religion/lumera_statue.rsi/statue1.png new file mode 100644 index 0000000000..2fdfa28604 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Specific/Religion/lumera_statue.rsi/statue1.png differ