Merge remote-tracking branch 'upstream/master' into leather_and_backpacks

This commit is contained in:
Alexsey Bezyuk
2025-06-04 17:37:45 +10:00
278 changed files with 2445 additions and 819 deletions

View File

@@ -1,17 +1,23 @@
## About the PR
<!-- What did you change in this PR? -->
<!-- Что вы изменили в своем пулл реквесте? -->
## Why / Balance
<!-- Why was it changed? Link any discussions or issues here. Please discuss how this would affect game balance. -->
<!-- Зачем нужно это изменение? Прикрепите любые обсуждения или проблемы здесь. Опишите, как это повлияет на текущий баланс игры. -->
## Media
<!--
PRs which make ingame changes (adding clothing, items, new features, etc) are required to have media attached that showcase the changes.
Small fixes/refactors are exempt.
-->
**Changelog**
<!-- Add a Changelog entry to make players aware of new features or changes that could affect gameplay.
Make sure to read the guidelines and take this Changelog template out of the comment block in order for it to show up.
Changelog must have a :cl: symbol, so the bot recognizes the changes and adds them to the game's changelog. -->
<!--
Пулл реквесты, которые несут за собой игровые изменения (добавления одежды, предметов и так далее) требуют чтобы вы прикрепили скриншоты или видеоролики, демонстрирующие эти изменения.
Небольшие исправления не считаются.
:cl:
- add: Added fun!
- remove: Removed fun!
- tweak: Changed fun!
- fix: Fixed fun!
-->

View File

@@ -1,4 +1,4 @@
name: Publish
name: Edge Publish
concurrency:
group: publish
@@ -10,6 +10,15 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Install Python dependencies
run: sudo apt-get install -y python3-paramiko python3-lxml
- name: Send POST-request
uses: appleboy/ssh-action@master
with:
@@ -18,3 +27,10 @@ jobs:
password: ${{ secrets.BUILD_PASS }}
port: 22
script: sh update.sh &> /dev/null
- name: Publish changelog (Discord)
continue-on-error: true
run: Tools/actions_changelogs_since_last_run.py
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
DISCORD_WEBHOOK_URL: ${{ secrets.CHANGELOG_DISCORD_WEBHOOK }}

View File

@@ -40,7 +40,7 @@ public sealed class ClientClothingSystem : ClothingSystem
{Jumpsuit, "INNERCLOTHING"},
{"neck", "NECK"},
{"back", "BACKPACK"},
{"belt1", "BELT1"},
{"belt", "BELT"},
{"belt2", "BELT2"},
{"gloves", "HAND"},
{"shoes", "FEET"},

View File

@@ -1,5 +1,6 @@
using Content.Client._CP14.Discord;
using Content.Client._CP14.JoinQueue;
using Content.Client._CP14.Input;
using Content.Client.Administration.Managers;
using Content.Client.Changelog;
using Content.Client.Chat.Managers;
@@ -171,6 +172,7 @@ namespace Content.Client.Entry
_parallaxManager.LoadDefaultParallax();
//CP14
CP14ContentContexts.SetupContexts(_inputManager.Contexts);
_overlayManager.AddOverlay(new CP14BasePostProcessOverlay());
_discordAuth.Initialize();
_joinQueueManager.Initialize();

View File

@@ -26,27 +26,6 @@
<!-- Products will be added as children here -->
</BoxContainer>
</BoxContainer>
<!-- CP14 random reactions begin -->
<!--<BoxContainer Name="RandomVariations"
Orientation="Vertical"
VerticalExpand="True"
VerticalAlignment="Center"
HorizontalAlignment="Center">
<controls:SplitBar MinHeight="10">
</controls:SplitBar>
<Label Name="RandomVariationsLabel"
Text="{Loc 'cp14-guidebook-random-variations-title'}"
Visible="False"
HorizontalAlignment="Center"
FontColorOverride="#1e6651" />
<BoxContainer Orientation="Vertical" HorizontalExpand="True" VerticalAlignment="Center">
<BoxContainer Name="RandomProductsContainer" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Vertical">
~1~ Random products will be added as children here @1@
</BoxContainer>
</BoxContainer>
</BoxContainer>-->
<!-- CP14 random reactions end -->
</BoxContainer>
<PanelContainer StyleClasses="LowDivider" Margin="0 5 0 5" />
</BoxContainer>

View File

@@ -37,7 +37,7 @@ public sealed partial class GuideReagentReaction : BoxContainer, ISearchableCont
Container container = ReactantsContainer;
SetReagents(prototype.Reactants, ref container, protoMan);
Container productContainer = ProductsContainer;
var products = new Dictionary<string, FixedPoint2>(prototype._products); // CP14 random reactions
var products = new Dictionary<string, FixedPoint2>(prototype.Products);
foreach (var (reagent, reactantProto) in prototype.Reactants)
{
if (reactantProto.Catalyst)
@@ -45,14 +45,6 @@ public sealed partial class GuideReagentReaction : BoxContainer, ISearchableCont
}
SetReagents(products, ref productContainer, protoMan, false);
// CP14 random reagents begin
if (prototype.Cp14RandomProducts.Count > 0)
{
var randomProducts = new Dictionary<string, FixedPoint2>(prototype.Cp14RandomProducts[prototype.Cp14RandomProductIndex]);
SetReagents(randomProducts, ref productContainer, protoMan, false);
}
// CP14 random reagents end
var mixingCategories = new List<MixingCategoryPrototype>();
if (prototype.MixingCategories != null)
{

View File

@@ -85,9 +85,6 @@ namespace Content.Client.Input
human.AddFunction(ContentKeyFunctions.Arcade1);
human.AddFunction(ContentKeyFunctions.Arcade2);
human.AddFunction(ContentKeyFunctions.Arcade3);
//CP14 Keys
human.AddFunction(ContentKeyFunctions.CP14OpenSkillMenu);
//CP14 Keys end
// actions should be common (for ghosts, mobs, etc)
common.AddFunction(ContentKeyFunctions.OpenActionsMenu);

View File

@@ -1,3 +1,4 @@
using Content.Shared._CP14.Input;
using System.Numerics;
using Content.Client.Stylesheets;
using Content.Shared.CCVar;
@@ -313,7 +314,9 @@ namespace Content.Client.Options.UI.Tabs
//CP14
AddHeader("ui-options-header-cp14");
AddButton(ContentKeyFunctions.CP14OpenSkillMenu);
AddButton(CP14ContentKeyFunctions.CP14OpenSkillMenu);
AddButton(CP14ContentKeyFunctions.OpenBelt2);
AddButton(CP14ContentKeyFunctions.SmartEquipBelt2);
//CP14 end
foreach (var control in _keyControls.Values)

View File

@@ -3,6 +3,7 @@
xmlns:style="clr-namespace:Content.Client.Stylesheets"
xmlns:ic="clr-namespace:Robust.Shared.Input;assembly=Robust.Shared"
xmlns:is="clr-namespace:Content.Shared.Input;assembly=Content.Shared"
xmlns:isc="clr-namespace:Content.Shared._CP14.Input;assembly=Content.Shared"
xmlns:xe="clr-namespace:Content.Client.UserInterface.XamlExtensions"
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:widgets="clr-namespace:Content.Client.UserInterface.Systems.MenuBar.Widgets"
@@ -39,7 +40,7 @@
Access="Internal"
Icon="{xe:Tex '/Textures/Interface/students-cap.svg.192dpi.png'}"
ToolTip="{Loc 'cp14-game-hud-open-skill-menu-button-tooltip'}"
BoundKey = "{x:Static is:ContentKeyFunctions.CP14OpenSkillMenu}"
BoundKey = "{x:Static isc:CP14ContentKeyFunctions.CP14OpenSkillMenu}"
MinSize="42 64"
HorizontalExpand="True"
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"

View File

@@ -0,0 +1,16 @@
using Content.Shared._CP14.Input;
using Robust.Shared.Input;
namespace Content.Client._CP14.Input
{
public static class CP14ContentContexts
{
public static void SetupContexts(IInputContextContainer contexts)
{
var human = contexts.GetContext("human");
human.AddFunction(CP14ContentKeyFunctions.OpenBelt2);
human.AddFunction(CP14ContentKeyFunctions.SmartEquipBelt2);
human.AddFunction(CP14ContentKeyFunctions.CP14OpenSkillMenu);
}
}
}

View File

@@ -14,7 +14,6 @@ public sealed class CP14TradingPlatformBoundUserInterface(EntityUid owner, Enum
_window = this.CreateWindow<CP14TradingPlatformWindow>();
_window.OnUnlock += pos => SendMessage(new CP14TradingPositionUnlockAttempt(pos));
_window.OnBuy += pos => SendMessage(new CP14TradingPositionBuyAttempt(pos));
}

View File

@@ -35,6 +35,10 @@
<Label Name="Name" Access="Public" StyleClasses="LabelHeadingBigger" VAlign="Center"
HorizontalExpand="True" HorizontalAlignment="Center" />
</BoxContainer>
<BoxContainer Orientation="Horizontal" HorizontalExpand="True" HorizontalAlignment="Center">
<TextureRect VerticalAlignment="Center" Margin="20 0 5 0" HorizontalAlignment="Left" TextureScale="2, 2" TexturePath="/Textures/_CP14/Interface/Misc/star.png"/>
<RichTextLabel Name="UnlockCost" Access="Public" Text="0"/>
</BoxContainer>
<!-- Description -->
<BoxContainer HorizontalExpand="True">
<RichTextLabel Name="Description" HorizontalExpand="True" Access="Public" />
@@ -47,17 +51,6 @@
<!-- Buttons -->
<BoxContainer Orientation="Vertical" HorizontalExpand="True">
<BoxContainer Name="UnlockBox" Orientation="Horizontal" HorizontalExpand="True" Visible="True">
<Button Name="UnlockButton" Text="{Loc 'cp14-trading-ui-button-unlock'}"
ToolTip="{Loc 'cp14-trading-ui-button-unlock-tooltip'}" StyleClasses="OpenRight"
HorizontalExpand="True" MinHeight="35" Access="Public"/>
<BoxContainer SetWidth="100" MaxWidth="100" Orientation="Horizontal">
<TextureRect VerticalAlignment="Center" Margin="20 0 5 0" HorizontalAlignment="Left" TextureScale="2, 2" TexturePath="/Textures/_CP14/Interface/Misc/star.png"/>
<RichTextLabel Name="UnlockCost" Access="Public" Text="0"/>
</BoxContainer>
</BoxContainer>
<BoxContainer Name="BuyBox" Orientation="Horizontal" HorizontalExpand="True" Visible="True">
<Button Name="BuyButton" Text="{Loc 'cp14-trading-ui-button-buy'}"
ToolTip="{Loc 'cp14-trading-ui-button-buy-tooltip'}" StyleClasses="OpenRight"

View File

@@ -6,6 +6,7 @@ using Content.Shared._CP14.Trading;
using Content.Shared._CP14.Trading.Components;
using Content.Shared._CP14.Trading.Prototypes;
using Robust.Client.AutoGenerated;
using Robust.Client.Player;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
@@ -25,6 +26,7 @@ public sealed partial class CP14TradingPlatformWindow : DefaultWindow
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IEntityManager _e = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPlayerManager _player = default!;
private readonly CP14ClientTradingPlatformSystem _tradingSystem;
private readonly CP14ClientStationEconomySystem _economySystem;
@@ -39,8 +41,6 @@ public sealed partial class CP14TradingPlatformWindow : DefaultWindow
private ProtoId<CP14TradingFactionPrototype>? _selectedFaction;
private CP14TradingPositionPrototype? _selectedPosition;
public event Action<ProtoId<CP14TradingPositionPrototype>>? OnUnlock;
public event Action<ProtoId<CP14TradingPositionPrototype>>? OnBuy;
private ISawmill Sawmill { get; init; }
@@ -75,21 +75,9 @@ public sealed partial class CP14TradingPlatformWindow : DefaultWindow
ParallaxBackground.Offset = -offset * 0.25f + new Vector2(1000, 1000); //hardcoding is bad
};
GraphControl.OnNodeSelected += SelectNode;
UnlockButton.OnPressed += UnlockPressed;
BuyButton.OnPressed += BuyPressed;
}
private void UnlockPressed(BaseButton.ButtonEventArgs obj)
{
if (_selectedPosition is null)
return;
OnUnlock?.Invoke(_selectedPosition);
if (_cachedUser is not null)
_audio.PlayGlobal(new SoundCollectionSpecifier("CP14CoinImpact"), _cachedUser.Value);
}
private void BuyPressed(BaseButton.ButtonEventArgs obj)
{
if (_selectedPosition is null)
@@ -133,16 +121,15 @@ public sealed partial class CP14TradingPlatformWindow : DefaultWindow
}
_selectedPosition = node;
var unlocked = _cachedUser.Value.Comp.UnlockedPositions;
var unlocked = _cachedUser.Value.Comp.Reputation[_selectedPosition.Faction] >= _selectedPosition.ReputationLevel;
Name.Text = _tradingSystem.GetTradeName(_selectedPosition);
Description.Text = _tradingSystem.GetTradeDescription(_selectedPosition);
LocationView.Texture = _selectedPosition.Icon.Frame0();
UnlockButton.Disabled = !_tradingSystem.CanUnlockPosition((_cachedUser.Value.Owner, _cachedUser.Value.Comp), _selectedPosition);
BuyButton.Disabled = !unlocked.Contains(_selectedPosition);
BuyButton.Disabled = !unlocked;
UnlockCost.Text = _selectedPosition.UnlockReputationCost.ToString();
UnlockCost.Text = _selectedPosition.ReputationLevel.ToString();
BuyPriceHolder.RemoveAllChildren();
BuyPriceHolder.AddChild(new CP14PriceControl(_economySystem.GetPrice(_selectedPosition) ?? 0));
@@ -153,24 +140,23 @@ public sealed partial class CP14TradingPlatformWindow : DefaultWindow
Name.Text = string.Empty;
Description.Text = string.Empty;
LocationView.Texture = null;
UnlockButton.Disabled = true;
}
private void CacheSkillProto()
{
_allPositions = _proto.EnumeratePrototypes<CP14TradingPositionPrototype>();
_allFactions = _proto.EnumeratePrototypes<CP14TradingFactionPrototype>().OrderBy(tree => Loc.GetString(tree.Name));
UpdateGraphControl();
}
public void UpdateState(CP14TradingPlatformUiState state)
{
_cacheState = state;
var ent = _e.GetEntity(state.User);
if (!_e.TryGetComponent<CP14TradingReputationComponent>(ent, out var repComp))
if (!_e.TryGetComponent<CP14TradingReputationComponent>(_player.LocalEntity, out var repComp))
return;
_cachedUser = (ent, repComp);
_cachedUser = (_player.LocalEntity.Value, repComp);
var plat = _e.GetEntity(state.Platform);
if (!_e.TryGetComponent<CP14TradingPlatformComponent>(plat, out var platComp))
@@ -192,15 +178,10 @@ public sealed partial class CP14TradingPlatformWindow : DefaultWindow
if (position.Faction != _selectedFaction)
continue;
var unlocked = _cachedUser.Value.Comp.UnlockedPositions;
var gained = unlocked.Contains(position);
var active = _tradingSystem.CanUnlockPosition((_cachedUser.Value.Owner, _cachedUser.Value.Comp), position);
var node = new CP14NodeTreeElement(position.ID, gained, active, position.UiPosition * 66, position.Icon);
var unlocked = _cachedUser.Value.Comp.Reputation[position.Faction] >= position.ReputationLevel;
var active = _tradingSystem.CanBuyPosition((_cachedUser.Value.Owner, _cachedUser.Value.Comp), position);
var node = new CP14NodeTreeElement(position.ID, unlocked, active, new Vector2(position.ReputationLevel.Float() * 50, position.UiPosition * 50) , position.Icon);
nodeTreeElements.Add(node);
if (position.Prerequisite != null)
{
edges.Add((position.Prerequisite, position.ID));
}
}
GraphControl.UpdateState(

View File

@@ -11,6 +11,7 @@ using Content.Shared._CP14.Skill.Components;
using Content.Shared._CP14.Skill.Prototypes;
using Content.Shared._CP14.Skill.Restrictions;
using Content.Shared.Input;
using Content.Shared._CP14.Input;
using JetBrains.Annotations;
using Robust.Client.Player;
using Robust.Client.UserInterface;
@@ -53,7 +54,7 @@ public sealed class CP14SkillUIController : UIController, IOnStateEntered<Gamepl
LayoutContainer.SetAnchorPreset(_window, LayoutContainer.LayoutPreset.CenterTop);
CommandBinds.Builder
.Bind(ContentKeyFunctions.CP14OpenSkillMenu,
.Bind(CP14ContentKeyFunctions.CP14OpenSkillMenu,
InputCmdHandler.FromDelegate(_ => ToggleWindow()))
.Register<CP14SkillUIController>();

View File

@@ -1,26 +0,0 @@
using Content.Server.GameTicking.Events;
using Content.Shared.Chemistry.Reaction;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Alchemy.EntitySystems;
public sealed class CP14RandomReagentReactionsSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IRobustRandom _random = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RoundStartingEvent>(OnRoundStart);
}
private void OnRoundStart(RoundStartingEvent ev)
{
foreach (var reaction in _proto.EnumeratePrototypes<ReactionPrototype>())
{
reaction.Cp14RandomProductIndex = _random.Next(reaction.Cp14RandomProducts.Count);
}
}
}

View File

@@ -68,11 +68,19 @@ public sealed partial class CP14DemiplaneSystem
private void GeneratorUsedInHand(Entity<CP14DemiplaneUsingOpenComponent> ent, ref UseInHandEvent args)
{
if (args.Handled)
return;
if (!TryComp<CP14DemiplaneDataComponent>(ent, out var generator))
return;
args.Handled = true;
UseGenerator((ent, generator), args.User);
QueueDel(ent);
}
//Ed: I hate this function.
private void UseGenerator(Entity<CP14DemiplaneDataComponent> generator, EntityUid? user = null)
{
@@ -130,10 +138,6 @@ public sealed partial class CP14DemiplaneSystem
var connection = EnsureComp<CP14DemiplaneRiftComponent>(spawnedRift);
AddDemiplaneRandomExitPoint(demiplane.Value, (spawnedRift, connection));
}
#if !DEBUG
QueueDel(generator); //wtf its crash debug build!
#endif
}
private void OnVerbExamine(Entity<CP14DemiplaneDataComponent> ent, ref GetVerbsEvent<ExamineVerb> args)

View File

@@ -20,6 +20,19 @@ public sealed partial class CP14StationEconomySystem : CP14SharedStationEconomyS
InitPriceEvents();
SubscribeLocalEvent<CP14StationEconomyComponent, StationPostInitEvent>(OnStationPostInit);
SubscribeLocalEvent<PrototypesReloadedEventArgs>(OnPrototypesReloaded);
}
private void OnPrototypesReloaded(PrototypesReloadedEventArgs ev)
{
if (!ev.WasModified<CP14TradingPositionPrototype>())
return;
var query = EntityQueryEnumerator<CP14StationEconomyComponent>();
while (query.MoveNext(out var uid, out var economyComponent))
{
UpdatePricing((uid, economyComponent));
}
}
private void OnStationPostInit(Entity<CP14StationEconomyComponent> ent, ref StationPostInitEvent args)

View File

@@ -31,11 +31,14 @@ public sealed partial class CP14TradingPlatformSystem : CP14SharedTradingPlatfor
base.Initialize();
SubscribeLocalEvent<CP14TradingPlatformComponent, CP14TradingPositionBuyAttempt>(OnBuyAttempt);
SubscribeLocalEvent<CP14SellingPlatformComponent, CP14MagicEnergyOverloadEvent>(OnMagicOverload);
SubscribeLocalEvent<CP14SellingPlatformComponent, CP14MagicEnergyLevelChangeEvent>(OnMagicChange);
}
private void OnMagicOverload(Entity<CP14SellingPlatformComponent> ent, ref CP14MagicEnergyOverloadEvent args)
private void OnMagicChange(Entity<CP14SellingPlatformComponent> ent, ref CP14MagicEnergyLevelChangeEvent args)
{
if (args.NewValue != args.MaxValue)
return;
_magicEnergy.ClearEnergy(ent.Owner);
if (!TryComp<ItemPlacerComponent>(ent, out var itemPlacer))
@@ -69,7 +72,10 @@ public sealed partial class CP14TradingPlatformSystem : CP14SharedTradingPlatfor
public bool TryBuyPosition(Entity<CP14TradingReputationComponent?> user, Entity<CP14TradingPlatformComponent> platform, ProtoId<CP14TradingPositionPrototype> position)
{
if (!CanBuyPosition(user, platform!, position))
if (Timing.CurTime < platform.Comp.NextBuyTime)
return false;
if (!CanBuyPosition(user, position))
return false;
if (!Proto.TryIndex(position, out var indexedPosition))
@@ -112,8 +118,8 @@ public sealed partial class CP14TradingPlatformSystem : CP14SharedTradingPlatfor
if (indexedPosition.Service is not null)
indexedPosition.Service.Buy(EntityManager, Proto, platform);
user.Comp.Reputation[indexedPosition.Faction] += (float)price / 10;
Dirty(user);
AddReputation(user, indexedPosition.Faction, (float)price / 100);
_audio.PlayPvs(platform.Comp.BuySound, Transform(platform).Coordinates);

View File

@@ -51,42 +51,11 @@ namespace Content.Shared.Chemistry.Reaction
[DataField("requiredMixerCategories")]
public List<ProtoId<MixingCategoryPrototype>>? MixingCategories;
// CP14 random reactions begin
/// <summary>
/// Reagents created when the reaction occurs.
/// </summary>
[DataField("products", customTypeSerializer:typeof(PrototypeIdDictionarySerializer<FixedPoint2, ReagentPrototype>))]
public Dictionary<string, FixedPoint2> _products = new(); // CP14 random reactions
public Dictionary<string, FixedPoint2> Products
{
get {
if (Cp14RandomProducts.Count == 0)
return _products;
// New dict because we don't want to modify original products dict
Dictionary<string, FixedPoint2> res = new(_products);
foreach (var product in Cp14RandomProducts[Cp14RandomProductIndex])
{
if (res.ContainsKey(product.Key))
res[product.Key] += product.Value;
else
res[product.Key] = product.Value;
}
return res;
}
set {
_products = value;
}
}
public int Cp14RandomProductIndex = 0;
/// <summary>
/// Random reagents groups, one of which will be selected at the roundstart and will be used as a reaction product.
/// </summary>
[DataField("cp14RandomProducts")]
public List<Dictionary<string, FixedPoint2>> Cp14RandomProducts = new();
// CP14 random reactions end
public Dictionary<string, FixedPoint2> Products = new();
/// <summary>
/// Effects to be triggered when the reaction occurs.

View File

@@ -128,9 +128,5 @@ namespace Content.Shared.Input
public static readonly BoundKeyFunction MappingRemoveDecal = "MappingRemoveDecal";
public static readonly BoundKeyFunction MappingCancelEraseDecal = "MappingCancelEraseDecal";
public static readonly BoundKeyFunction MappingOpenContextMenu = "MappingOpenContextMenu";
//CP14 keys
public static readonly BoundKeyFunction CP14OpenSkillMenu = "CP14OpenSkillMenu";
//CP14 keys end
}
}

View File

@@ -3,6 +3,7 @@ using Content.Shared.Containers.ItemSlots;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Input;
using Content.Shared._CP14.Input;
using Content.Shared.Inventory;
using Content.Shared.Popups;
using Content.Shared.Stacks;
@@ -35,6 +36,9 @@ public sealed class SmartEquipSystem : EntitySystem
CommandBinds.Builder
.Bind(ContentKeyFunctions.SmartEquipBackpack, InputCmdHandler.FromDelegate(HandleSmartEquipBackpack, handle: false, outsidePrediction: false))
.Bind(ContentKeyFunctions.SmartEquipBelt, InputCmdHandler.FromDelegate(HandleSmartEquipBelt, handle: false, outsidePrediction: false))
//CP14
.Bind(CP14ContentKeyFunctions.SmartEquipBelt2, InputCmdHandler.FromDelegate(HandleSmartEquipBelt2, handle: false, outsidePrediction: false))
//CP14 end
.Register<SmartEquipSystem>();
}
@@ -55,6 +59,11 @@ public sealed class SmartEquipSystem : EntitySystem
HandleSmartEquip(session, "belt");
}
private void HandleSmartEquipBelt2(ICommonSession? session)
{
HandleSmartEquip(session, "belt2");
}
//CP14 end
private void HandleSmartEquip(ICommonSession? session, string equipmentSlot)
{
if (session is not { } playerSession)

View File

@@ -12,6 +12,7 @@ using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Implants.Components;
using Content.Shared.Input;
using Content.Shared._CP14.Input;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Components;
using Content.Shared.Inventory;
@@ -172,6 +173,9 @@ public abstract class SharedStorageSystem : EntitySystem
CommandBinds.Builder
.Bind(ContentKeyFunctions.OpenBackpack, InputCmdHandler.FromDelegate(HandleOpenBackpack, handle: false))
.Bind(ContentKeyFunctions.OpenBelt, InputCmdHandler.FromDelegate(HandleOpenBelt, handle: false))
//CP14
.Bind(CP14ContentKeyFunctions.OpenBelt2, InputCmdHandler.FromDelegate(HandleOpenBelt2, handle: false))
//CP14 end
.Register<SharedStorageSystem>();
Subs.CVar(_cfg, CCVars.NestedStorage, OnNestedStorageCvar, true);
@@ -1832,6 +1836,12 @@ public abstract class SharedStorageSystem : EntitySystem
{
HandleToggleSlotUI(session, "belt");
}
//CP14
private void HandleOpenBelt2(ICommonSession? session)
{
HandleToggleSlotUI(session, "belt2");
}
//CP14 end
private void HandleToggleSlotUI(ICommonSession? session, string slot)
{

View File

@@ -0,0 +1,13 @@
using Robust.Shared.Input;
namespace Content.Shared._CP14.Input
{
[KeyFunctions]
public static class CP14ContentKeyFunctions
{
public static readonly BoundKeyFunction OpenBelt2 = "OpenBelt2";
public static readonly BoundKeyFunction SmartEquipBelt2 = "SmartEquipBelt2";
public static readonly BoundKeyFunction CP14OpenSkillMenu = "CP14OpenSkillMenu";
}
}

View File

@@ -0,0 +1,64 @@
using Content.Shared.Whitelist;
using Robust.Shared.Map;
namespace Content.Shared._CP14.MagicSpell.Spells;
public sealed partial class CP14SpellArea : CP14SpellEffect
{
[DataField(required: true)]
public List<CP14SpellEffect> Effects { get; set; } = new();
[DataField]
public EntityWhitelist? Whitelist;
/// <summary>
/// How many entities can be subject to EntityEffect? Leave 0 to remove the restriction.
/// </summary>
[DataField]
public int MaxTargets = 0;
[DataField(required: true)]
public float Range = 1f;
[DataField]
public bool AffectCaster = false;
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
{
EntityCoordinates? targetPoint = null;
if (args.Target is not null &&
entManager.TryGetComponent<TransformComponent>(args.Target.Value, out var transformComponent))
targetPoint = transformComponent.Coordinates;
else if (args.Position is not null)
targetPoint = args.Position;
if (targetPoint is null)
return;
var lookup = entManager.System<EntityLookupSystem>();
var whitelist = entManager.System<EntityWhitelistSystem>();
var entitiesAround = lookup.GetEntitiesInRange(targetPoint.Value, Range, LookupFlags.Uncontained);
var count = 0;
foreach (var entity in entitiesAround)
{
if (entity == args.User && !AffectCaster)
continue;
if (Whitelist is not null && !whitelist.IsValid(Whitelist, entity))
continue;
foreach (var effect in Effects)
{
effect.Effect(entManager, new CP14SpellEffectBaseArgs(args.User, null, entity, targetPoint));
}
count++;
if (MaxTargets > 0 && count >= MaxTargets)
break;
}
}
}

View File

@@ -244,6 +244,26 @@ public abstract partial class CP14SharedSkillSystem : EntitySystem
return sb.ToString();
}
/// <summary>
/// Helper function to reset skills to only learned skills
/// </summary>
public bool TryResetSkills(EntityUid target,
CP14SkillStorageComponent? component = null)
{
if (!Resolve(target, ref component, false))
{
return false;
}
for(var i = component.LearnedSkills.Count - 1; i >= 0; i--)
{
if(HaveFreeSkill(target, component.LearnedSkills[i], component))
{
continue;
}
TryRemoveSkill(target, component.LearnedSkills[i], component);
}
return true;
}
}
[ByRefEvent]

View File

@@ -6,6 +6,7 @@ using Content.Shared.Administration.Managers;
using Content.Shared.FixedPoint;
using Content.Shared.Verbs;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
namespace Content.Shared._CP14.Skill;
@@ -89,5 +90,19 @@ public abstract partial class CP14SharedSkillSystem
},
});
}
//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);
},
});
}
}

View File

@@ -0,0 +1,24 @@
using Content.Shared._CP14.Trading.Prototypes;
using Content.Shared._CP14.Trading.Systems;
using Content.Shared.Roles;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Trading;
public sealed partial class CP14AddGlobalReputationSpecial : JobSpecial
{
[DataField]
public float Reputation = 1f;
public override void AfterEquip(EntityUid mob)
{
var entMan = IoCManager.Resolve<IEntityManager>();
var protoMan = IoCManager.Resolve<IPrototypeManager>();
var tradeSys = entMan.System<CP14SharedTradingPlatformSystem>();
foreach (var faction in protoMan.EnumeratePrototypes<CP14TradingFactionPrototype>())
{
tradeSys.AddReputation(mob, faction, Reputation);
}
}
}

View File

@@ -9,9 +9,8 @@ public enum CP14TradingUiKey
}
[Serializable, NetSerializable]
public sealed class CP14TradingPlatformUiState(NetEntity user, NetEntity platform) : BoundUserInterfaceState
public sealed class CP14TradingPlatformUiState(NetEntity platform) : BoundUserInterfaceState
{
public NetEntity User = user;
public NetEntity Platform = platform;
}

View File

@@ -7,12 +7,6 @@ namespace Content.Shared._CP14.Trading.Components;
[RegisterComponent, Access(typeof(CP14SharedTradingPlatformSystem))]
public sealed partial class CP14TradingContractComponent : Component
{
[DataField]
public TimeSpan Delay = TimeSpan.FromSeconds(2);
[DataField]
public ProtoId<CP14TradingFactionPrototype> Faction;
[DataField]
public float StartReputation = 1f;
}

View File

@@ -18,7 +18,4 @@ public sealed partial class CP14TradingReputationComponent : Component
/// </summary>
[DataField, AutoNetworkedField]
public Dictionary<ProtoId<CP14TradingFactionPrototype>, FixedPoint2> Reputation = new();
[DataField, AutoNetworkedField]
public HashSet<ProtoId<CP14TradingPositionPrototype>> UnlockedPositions = new();
}

View File

@@ -33,17 +33,14 @@ public sealed partial class CP14TradingPositionPrototype : IPrototype
public ProtoId<CP14TradingFactionPrototype> Faction;
[DataField]
public FixedPoint2 UnlockReputationCost = 1f;
public FixedPoint2 ReputationLevel = 0f;
[DataField(required: true)]
public Vector2 UiPosition = default!;
public float UiPosition = default!;
[DataField(required: true)]
public CP14StoreBuyService? Service = null;
[DataField]
public ProtoId<CP14TradingPositionPrototype>? Prerequisite;
[DataField]
public int PriceMarkup = 1;
@@ -51,7 +48,7 @@ public sealed partial class CP14TradingPositionPrototype : IPrototype
/// each round prices will differ within +X percent of the calculated value
/// </summary>
[DataField]
public float PriceFluctuation = 0.2f;
public float PriceFluctuation = 0.6f;
}
[ImplicitDataDefinitionForInheritors]

View File

@@ -8,16 +8,9 @@ public abstract partial class CP14SharedTradingPlatformSystem
{
private void InitializeUI()
{
SubscribeLocalEvent<CP14TradingPlatformComponent, CP14TradingPositionUnlockAttempt>(OnUnlockAttempt);
SubscribeLocalEvent<CP14TradingPlatformComponent, BeforeActivatableUIOpenEvent>(OnBeforeUIOpen);
}
private void OnUnlockAttempt(Entity<CP14TradingPlatformComponent> ent, ref CP14TradingPositionUnlockAttempt args)
{
TryUnlockPosition(args.Actor, args.Position);
UpdateUIState(ent, args.Actor);
}
private void OnBeforeUIOpen(Entity<CP14TradingPlatformComponent> ent, ref BeforeActivatableUIOpenEvent args)
{
UpdateUIState(ent, args.User);

View File

@@ -2,6 +2,8 @@ using Content.Shared._CP14.Trading.Components;
using Content.Shared._CP14.Trading.Prototypes;
using Content.Shared.Interaction.Events;
using Content.Shared.Popups;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
@@ -16,6 +18,7 @@ public abstract partial class CP14SharedTradingPlatformSystem : EntitySystem
[Dependency] protected readonly IGameTiming Timing = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
public override void Initialize()
{
@@ -40,12 +43,18 @@ public abstract partial class CP14SharedTradingPlatformSystem : EntitySystem
private void OnContractUse(Entity<CP14TradingContractComponent> ent, ref UseInHandEvent args)
{
if (args.Handled)
return;
if (!Proto.TryIndex(ent.Comp.Faction, out var indexedFaction))
return;
args.Handled = true;
var repComp = EnsureComp<CP14TradingReputationComponent>(args.User);
repComp.Reputation.TryAdd(ent.Comp.Faction, ent.Comp.StartReputation);
repComp.Reputation.TryAdd(ent.Comp.Faction, 0);
_audio.PlayLocal(new SoundCollectionSpecifier("CP14CoinImpact"), args.User, args.User);
_popup.PopupPredicted(Loc.GetString("cp14-trading-contract-use", ("name", Loc.GetString(indexedFaction.Name))), args.User, args.User);
if (_net.IsServer)
QueueDel(ent);
}
@@ -55,68 +64,35 @@ public abstract partial class CP14SharedTradingPlatformSystem : EntitySystem
if (!TryComp<CP14TradingReputationComponent>(user, out var repComp))
return;
_userInterface.SetUiState(ent.Owner, CP14TradingUiKey.Key, new CP14TradingPlatformUiState(GetNetEntity(user), GetNetEntity(ent)));
_userInterface.SetUiState(ent.Owner, CP14TradingUiKey.Key, new CP14TradingPlatformUiState(GetNetEntity(ent)));
}
public bool TryUnlockPosition(Entity<CP14TradingReputationComponent?> user, ProtoId<CP14TradingPositionPrototype> position)
public bool CanBuyPosition(Entity<CP14TradingReputationComponent?> user, ProtoId<CP14TradingPositionPrototype> position)
{
if (!CanUnlockPosition(user, position))
if (!Resolve(user.Owner, ref user.Comp, false))
return false;
if (!Proto.TryIndex(position, out var indexedPosition))
return false;
if (!Resolve(user.Owner, ref user.Comp, false))
if (user.Comp.Reputation[indexedPosition.Faction] < indexedPosition.ReputationLevel)
return false;
user.Comp.Reputation[indexedPosition.Faction] -= indexedPosition.UnlockReputationCost;
user.Comp.UnlockedPositions.Add(position);
return true;
}
public void AddReputation(Entity<CP14TradingReputationComponent?> user,
ProtoId<CP14TradingFactionPrototype> faction, float rep)
{
if (!Resolve(user.Owner, ref user.Comp, false))
return;
if (!user.Comp.Reputation.ContainsKey(faction))
user.Comp.Reputation.Add(faction, rep);
else
user.Comp.Reputation[faction] += rep;
Dirty(user);
return true;
}
public bool CanUnlockPosition(Entity<CP14TradingReputationComponent?> user, ProtoId<CP14TradingPositionPrototype> position)
{
if (!Resolve(user.Owner, ref user.Comp, false))
return false;
if (!Proto.TryIndex(position, out var indexedPosition))
return false;
if (!user.Comp.Reputation.ContainsKey(indexedPosition.Faction))
return false;
if (user.Comp.UnlockedPositions.Contains(position))
return false;
if (indexedPosition.Prerequisite is not null && !user.Comp.UnlockedPositions.Contains(indexedPosition.Prerequisite.Value))
return false;
return user.Comp.Reputation.GetValueOrDefault(indexedPosition.Faction, 0f) >= indexedPosition.UnlockReputationCost;
}
public bool CanBuyPosition(Entity<CP14TradingReputationComponent?> user, Entity<CP14TradingPlatformComponent?> platform, ProtoId<CP14TradingPositionPrototype> position)
{
if (!Resolve(user.Owner, ref user.Comp, false))
return false;
if (!Resolve(platform.Owner, ref platform.Comp, false))
return false;
if (!user.Comp.UnlockedPositions.Contains(position))
return false;
if (Timing.CurTime < platform.Comp.NextBuyTime)
return false;
return true;
}
}
[Serializable, NetSerializable]
public sealed class CP14TradingPositionUnlockAttempt(ProtoId<CP14TradingPositionPrototype> position) : BoundUserInterfaceMessage
{
public readonly ProtoId<CP14TradingPositionPrototype> Position = position;
}
[Serializable, NetSerializable]

View File

@@ -0,0 +1,141 @@
Entries:
- author: TheShuEd
changes:
- message: Added fun!
type: Add
- message: Removed fun!
type: Remove
- message: Changed fun!
type: Tweak
- message: Fixed fun!
type: Fix
id: 8052
time: '2025-06-02T18:40:15.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1359
- author: TheShuEd
changes:
- message: Added fun!
type: Add
- message: Removed fun!
type: Remove
- message: Changed fun!
type: Tweak
- message: Fixed fun!
type: Fix
id: 8053
time: '2025-06-02T19:33:16.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1364
- author: TheShuEd
changes:
- message: Added fun!
type: Add
- message: Removed fun!
type: Remove
- message: Changed fun!
type: Tweak
- message: Fixed fun!
type: Fix
id: 8054
time: '2025-06-02T20:00:16.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1365
- author: TheShuEd
changes:
- message: "A new trade contract with the \u201CCozy Home\u201D store has been added.\
\ Now you can buy wallpaper, home decorations, and some other items."
type: Add
id: 8055
time: '2025-06-02T21:38:19.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1367
- author: paige404
changes:
- message: Tweaked slime damage resistances and immunities. Elemental slimes are
now immune to their own elements, but weak to an opposing element. Electric
slimes take equal damage from both heat and cold, and have had their oppressive
stunlocking power somewhat reduced. Additionally, all slimes are now immune
to airloss damage.
type: Tweak
id: 8056
time: '2025-06-02T21:59:07.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1300
- author: ArZarLordOfMango
changes:
- message: Fixed Guild moral book
type: Fix
id: 8057
time: '2025-06-02T22:04:33.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1368
- author: TheKittehJesus
changes:
- message: Cash converters can be anchored on tables
type: Fix
id: 8058
time: '2025-06-03T06:41:17.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1371
- author: TheShuEd
changes:
- message: Music magic no longer applies the effect on the musician. Tieflings with
Hell Ballad are now OP
type: Tweak
- message: The radius of action of the peace ballad has been increased by 2 times
and the maximum number of entities that can be affected has been increased from
4 to 8
type: Tweak
- message: The speed increase from the speed ballad is increased by 5%
type: Tweak
id: 8059
time: '2025-06-03T09:43:21.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1372
- author: DeLTaAlarm0
changes:
- message: Added flippable open/closed table sign
type: Add
- message: Added workbench recipe for open/closed sign
type: Add
id: 8060
time: '2025-06-03T11:22:24.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1275
- author: TheKittehJesus
changes:
- message: Added controls for quick pickup both belt slots! Check your controls,
as belt2 controls may be unbound.
type: Add
id: 8061
time: '2025-06-03T11:39:39.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1298
- author: Mandranir
changes:
- message: dropper size is now 1x1
type: Fix
id: 8062
time: '2025-06-03T11:41:00.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1373
- author: Nimfar11
changes:
- message: Adds a new artifact Skeleton Lockpick.
type: Add
id: 8063
time: '2025-06-03T12:37:25.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1374
- author: KittyCat432
changes:
- message: Changed Healing solution to not "waste" any of its healing on types of
brute you do not have.
type: Tweak
id: 8064
time: '2025-06-03T14:10:33.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1340
- author: TheShuEd
changes:
- message: All merchants now gain +1 reputation with each faction at the start of
the round, greatly expanding their range of goods.
type: Tweak
id: 8065
time: '2025-06-03T15:12:44.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1376
- author: Nimfar11
changes:
- message: Adds new carpets in different colours.
type: Add
id: 8066
time: '2025-06-04T06:57:09.0000000+00:00'
url: https://github.com/crystallpunk-14/crystall-punk-14/pull/1375

View File

@@ -0,0 +1 @@
changelog-tab-title-CP14_Changelog = CrystallEdge Changelog

View File

@@ -9,7 +9,7 @@ cp14-ui-options-main-graphics-label = Graphics
cp14-ui-options-main-graphics-wave-shader = Wave shader
cp14-ui-options-postprocess = Cosmetic Post-processing
cp14-ui-options-postprocess-tooltip =
cp14-ui-options-postprocess-tooltip =
When enabled, cosmetic post-processing effects such as
additive lighting will be present. This does not control
post-process effects that affect the game or otherwise
@@ -19,4 +19,6 @@ cp14-ui-options-postprocess-tooltip =
## Controls menu
ui-options-header-cp14 = CrystallEdge
ui-options-function-cp14-open-knowledge-menu = Open character knowledge menu.
ui-options-function-cp14-open-skill-menu = Open character knowledge menu.
ui-options-function-open-belt2 = Open belt 2
ui-options-function-smart-equip-belt2 = Smart-equip to belt 2

View File

@@ -5,4 +5,4 @@ cp14-ghost-role-information-name-lurker = Lurker
cp14-ghost-role-information-description-lurker = A spirit of night and hunger that preys on loners separated from their companions.
cp14-ghost-role-information-name-raid-undead = Undead raid
cp14-ghost-role-information-description-raid-undead = Lead the attack on the city by the forces of the dead. Destroy the demiplane communication crystal at any cost.
cp14-ghost-role-information-description-raid-undead = Lead the attack on the city by the forces of the dead. Destroy the demiplane communication crystal at any cost.

View File

@@ -1,3 +1,6 @@
cp14-trade-faction-contracts = Zellasian Trade Guild
cp14-trade-faction-victoria-gardens = Victoria Gardens
cp14-trade-faction-brad-potions = Brad's marvelous potions
cp14-trade-faction-brad-potions = Brad's marvelous potions
cp14-trade-faction-dwarf-mining = 'Dwarf Steel' mining branch
cp14-trade-faction-thaumaturgy = Academy of Thaumaturgy
cp14-trade-faction-home-decor = Cozy home

View File

@@ -1,6 +1,3 @@
cp14-trading-ui-button-unlock = Unlock contract
cp14-trading-ui-button-unlock-tooltip = You contract to purchase the specified equipment or service by spending your reputation. After that, you can buy that equipment or service with money in unlimited quantities.
cp14-trading-ui-button-buy = Buy
cp14-trading-ui-button-buy-tooltip = You spend the funds on the trading platform and buy the specified equipment or service from the selected vendor, which also increases your reputation. The equipment will be instantly delivered to you by spatial magic, and the service will be rendered as soon as possible.

View File

@@ -5,4 +5,4 @@ cp14-ghost-role-information-name-lurker = Таящийся
cp14-ghost-role-information-description-lurker = Дух ночи и голода, охотящийся за одиночками, отделившихся от своих товарищей.
cp14-ghost-role-information-name-raid-undead = Рейд нежити
cp14-ghost-role-information-description-raid-undead = Возглавьте атаку на город силами мертвых. Уничтожьте кристалл связи с демипланами любой ценой.
cp14-ghost-role-information-description-raid-undead = Возглавьте атаку на город силами мертвых. Уничтожьте кристалл связи с демипланами любой ценой.

View File

@@ -1,3 +1,6 @@
cp14-trade-faction-contracts = Торговая гильдия Зелласиан
cp14-trade-faction-victoria-gardens = Сады Виктории
cp14-trade-faction-brad-potions = Великолепные зелья Брада
cp14-trade-faction-brad-potions = Великолепные зелья Брада
cp14-trade-faction-dwarf-mining = Шахтерский филиал 'Дворфийская сталь'
cp14-trade-faction-thaumaturgy = Тауматургическая академия
cp14-trade-faction-home-decor = Уютный дом

View File

@@ -1,6 +1,3 @@
cp14-trading-ui-button-unlock = Разблокировать контракт
cp14-trading-ui-button-unlock-tooltip = Вы заключаете контракт, затрачивая на это свою репутацию. После этого, вы можете покупать это снаряжение или услугу за деньги в неограниченном количестве.
cp14-trading-ui-button-buy = Купить
cp14-trading-ui-button-buy-tooltip = Вы тратите средства, расположенные на торговой платформе и закупаете указанное снаряжение или услугу у выбранного продавца, что так же увеличивает вашу репутацию. Снаряжение будет мгновенно доставлено вам путем пространственной магии, а услуга оказана в ближайшее время.

View File

@@ -38027,7 +38027,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38086,7 +38086,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38146,7 +38146,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38205,7 +38205,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38265,7 +38265,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38325,7 +38325,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38385,7 +38385,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38444,7 +38444,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38503,7 +38503,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38563,7 +38563,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38623,7 +38623,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38682,7 +38682,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -38741,7 +38741,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null

View File

@@ -47638,7 +47638,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null

View File

@@ -104553,7 +104553,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -104616,7 +104616,7 @@ entities:
showEnts: False
occludes: False
ent: 19735
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -104680,7 +104680,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -104745,7 +104745,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null
@@ -104809,7 +104809,7 @@ entities:
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null

View File

@@ -151,7 +151,7 @@ entities:
rot: -1.5707963267948966 rad
pos: -8.5,3.5
parent: 2
- proto: CP14AlchemyFurnaceDebug
- proto: CP14AlchemyFurnace
entities:
- uid: 301
components:

View File

@@ -18,8 +18,8 @@
type: InstrumentBoundUserInterface
- type: Item
size: Normal
- type: StaticPrice
price: 200
#- type: StaticPrice
# price: 200
#These are for instruments that are larger, can't be picked up, or have collision
- type: entity

View File

@@ -20,7 +20,7 @@
amount: 1.5
- !type:PlantAdjustHealth
amount: 0.75
pricePerUnit: 0.2
pricePerUnit: 0.05
- type: reagent
id: Vitamin #Anything "healthy"
@@ -53,7 +53,7 @@
amount: 0.5
- !type:PlantAdjustHealth
amount: 1.5
pricePerUnit: 0.25
pricePerUnit: 0.07
- type: reagent
id: Protein #Meat and beans
@@ -78,7 +78,7 @@
- !type:OrganType
type: CP14Vampire
shouldHave: false
pricePerUnit: 0.3
pricePerUnit: 0.1
- type: reagent
id: Sugar #Candy and grains

View File

@@ -46,6 +46,8 @@
- id: HandLabeler #TODO custom cp14 labeler
- id: CP14StampDenied
- id: CP14StampApproved
- id: CP14ManaOperationGlove
- id: AppraisalTool
- id: CP14PaperFolderRed
amount: 2
- id: CP14PaperFolderBlue

View File

@@ -30,13 +30,13 @@
- !type:NestedSelector
tableId: CP14StationCrateLootTools
rolls: !type:RangeNumberSelector
range: 1, 5
range: 4, 5
# Fluff
- !type:NestedSelector
tableId: CP14StationCrateLootFluff
prob: 0.33
prob: 0.5
rolls: !type:RangeNumberSelector
range: 0, 2
range: 4, 5
- type: entityTable
id: CP14StationCrateLootTools
@@ -51,11 +51,17 @@
- id: CP14Scissors
- id: CP14Torch
- id: CP14Lighter
- id: CP14ManaOperationGlove
- id: CP14ModularIronShovel
- id: CP14KeyFile
- id: CP14BaseMop
- id: CP14LockCopper
- id: CP14ModularIronPickaxe
- id: CP14ModularIronSickle
- !type:GroupSelector
children:
- id: CP14FluteInstrument
- id: CP14LyraInstrument
- id: CP14LuteInstrument
- !type:GroupSelector
children:
- id: CP14Candle
@@ -88,9 +94,11 @@
id: CP14StationCrateLootFluff
table: !type:GroupSelector
children:
- id: CP14PaperFolderBlue
- id: CP14PaperFolderRed
- id: CP14PenFeather
- id: CP14FoodPotato
- id: CP14FoodOnion
- id: CP14AgaricMushroom #dont eat
- id: CP14Cloth10
- id: CP14CrayonWhite
- !type:GroupSelector
@@ -112,6 +120,17 @@
- id: CP14DyePurple
- id: CP14DyeBlack
- id: CP14DyeBlue
- !type:GroupSelector
children:
- id: CP14BloodFlower
- id: CP14AgaricMushroom
- id: CP14ChromiumSlime
weight: 0.5
- id: CP14WildSage
- id: CP14LumiMushroom
- id: CP14BlueAmanita
- id: CP14Dayflin
- id: CP14AirLily
- type: entityTable
id: CP14RandomVials

View File

@@ -7,3 +7,12 @@
- Airloss
- Genetic
- CP14Magic
- type: damageContainer
id: CP14BiologicalAnaerobic
supportedGroups:
- Brute
- Burn
- Toxin
- Genetic
- CP14Magic

View File

@@ -123,6 +123,49 @@
Heat: 0.2
Cold: 1.4
# Slimes
# TODO: upstream a way to get modifier sets to inherit from each other
- type: damageModifierSet
id: CP14Slime
coefficients:
Blunt: 0.6
Slash: 1.2
Piercing: 1.2
Cold: 1.5
Poison: 0.8
- type: damageModifierSet
id: CP14SlimeElectric
coefficients:
Blunt: 0.6
Slash: 1.2
Piercing: 1.2
Heat: 1.2
Cold: 1.5
Shock: 0.0
Poison: 0.8
- type: damageModifierSet
id: CP14SlimeFire
coefficients:
Blunt: 0.6
Slash: 1.2
Piercing: 1.2
Heat: 0.0
Cold: 2.0
Poison: 0.8
- type: damageModifierSet
id: CP14SlimeIce
coefficients:
Blunt: 0.6
Slash: 1.2
Piercing: 1.2
Heat: 2.0
Cold: 0.0
Poison: 0.8
# Species
- type: damageModifierSet

View File

@@ -11,6 +11,7 @@
- type: CP14MagicEffectManaCost
manaCost: 1
- type: CP14MagicEffect
magicType: Life
effects:
- !type:CP14SpellSpawnEntityOnTarget # TODO заставить работать только на нежить
spawns:

View File

@@ -1,16 +1,19 @@
- type: entity
id: CP14ActionSpellCureFromDeath
name: Cure from death
description: You heal the target from all kinds of damage.
id: CP14ActionSpellResurrectionDead
name: Death resurrection
description: You resurrect the target and cure it from damage.
components:
- type: Sprite
sprite: _CP14/Actions/Spells/necromancy.rsi
state: cure_dead
- type: CP14MagicEffectCastSlowdown
speedMultiplier: 0.7
speedMultiplier: 0.9
- type: CP14MagicEffectManaCost
manaCost: 4
manaCost: 20
- type: CP14MagicEffectAliveTargetRequired
inverted: true
- type: CP14MagicEffect
magicType: Life
telegraphyEffects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
@@ -19,27 +22,27 @@
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectResurrection
- !type:CP14SpellResurrectionEffect # TODO заставить работать только на нежить
- !type:CP14SpellResurrectionEffect
- !type:CP14SpellApplyEntityEffect
effects:
- !type:HealthChange
damage:
types:
Asphyxiation: -2
Bloodloss: -2
Blunt: -2
Cellular: -1
Caustic: -2
Cold: -1
Heat: -1
Piercing: -2
Poison: -2
Radiation: -2
Shock: -2
Slash: -2
- type: CP14MagicEffectSomaticAspect
Asphyxiation: -500
Bloodloss: -100
Blunt: -25
Caustic: -25
Cold: -25
Heat: -50
Piercing: -25
Poison: -25
Radiation: -25
Shock: -25
Slash: -25
- !type:Jitter
- type: CP14MagicEffectVerbalAspect
startSpeech: "Surge, hominem mortuum!"
startSpeech: "Surge..."
endSpeech: "Hominem mortuum"
- type: CP14MagicEffectCastingVisual
proto: CP14RuneResurrection
- type: EntityTargetAction
@@ -49,14 +52,15 @@
range: 10
itemIconStyle: BigAction
interactOnMiss: false
canTargetSelf: false
sound: !type:SoundPathSpecifier
path: /Audio/Magic/rumble.ogg
icon:
sprite: _CP14/Actions/Spells/necromancy.rsi
state: cure_dead
event: !type:CP14ToggleableEntityTargetActionEvent
cooldown: 2
castTime: 10
event: !type:CP14DelayedEntityTargetActionEvent
cooldown: 10
castDelay: 2
breakOnMove: false
breakOnDamage: false

View File

@@ -13,9 +13,24 @@
- type: CP14MagicEffect
magicType: Fire
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14AreaEntityEffectHellBallade
- !type:CP14SpellArea
range: 3
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectHellBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:Jitter
- !type:FlammableReaction
multiplier: 0.5
- !type:AdjustTemperature
amount: 500
- !type:Ignite
- type: CP14MagicEffectRequiredMusicTool
- type: CP14MagicEffectCastingVisual
proto: CP14RuneHellBallade
@@ -32,32 +47,6 @@
castTime: 120
hidden: true
- type: entity
id: CP14AreaEntityEffectHellBallade
categories: [ HideSpawnMenu ]
save: false
components:
- type: TimedDespawn
lifetime: 1.6
- type: CP14AreaEntityEffect
range: 3
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectHellBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:Jitter
- !type:FlammableReaction
multiplier: 0.5
- !type:AdjustTemperature
amount: 500
- !type:Ignite
- type: entity
id: CP14ImpactEffectHellBallade
parent: CP14BaseMagicImpact
@@ -85,4 +74,3 @@
- state: notes_3
color: "#eea911"
shader: unshaded

View File

@@ -13,9 +13,30 @@
- type: CP14MagicEffect
magicType: Life
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14AreaEntityEffectHealBallade
- !type:CP14SpellArea
range: 3
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectHealthBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:HealthChange
damage:
types:
Slash: -0.70
Blunt: -0.70
Piercing: -0.70
Cold: -0.40
Heat: -0.40
Shock: -0.40
Poison: -0.25
Bloodloss: -0.40
Caustic: -0.30
- type: CP14MagicEffectRequiredMusicTool
- type: CP14MagicEffectCastingVisual
proto: CP14RuneHealBallade
@@ -32,38 +53,6 @@
castTime: 120
hidden: true
- type: entity
id: CP14AreaEntityEffectHealBallade
categories: [ HideSpawnMenu ]
save: false
components:
- type: TimedDespawn
lifetime: 1.6
- type: CP14AreaEntityEffect
range: 3
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectHealthBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:HealthChange
damage:
types:
Slash: -0.70
Blunt: -0.70
Piercing: -0.70
Cold: -0.40
Heat: -0.40
Shock: -0.40
Poison: -0.25
Bloodloss: -0.40
Caustic: -0.30
- type: entity
id: CP14ImpactEffectHealthBallade
parent: CP14BaseMagicImpact

View File

@@ -13,9 +13,23 @@
- type: CP14MagicEffect
magicType: Life
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14AreaEntityEffectPeaceBallade
- !type:CP14SpellArea
range: 4
maxTargets: 8
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectPeaceBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:GenericStatusEffect
key: Pacified
component: Pacified
type: Add
time: 1.8
- type: CP14MagicEffectRequiredMusicTool
- type: CP14MagicEffectCastingVisual
proto: CP14RunePeaceBallade
@@ -32,31 +46,6 @@
castTime: 120
hidden: true
- type: entity
id: CP14AreaEntityEffectPeaceBallade
categories: [ HideSpawnMenu ]
save: false
components:
- type: TimedDespawn
lifetime: 1.6
- type: CP14AreaEntityEffect
range: 3
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectPeaceBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:GenericStatusEffect
key: Pacified
component: Pacified
type: Add
time: 1.8
- type: entity
id: CP14ImpactEffectPeaceBallade
parent: CP14BaseMagicImpact

View File

@@ -74,3 +74,11 @@
color: "#db35c8"
shader: unshaded
- type: entity
parent: CP14BaseSpellScrollHealing
id: CP14SpellScrollSheepPolymorph
name: sheep polymorph spell scroll
components:
- type: CP14SpellStorage
spells:
- CP14ActionSpellSheepPolymorph

View File

@@ -13,9 +13,23 @@
- type: CP14MagicEffect
magicType: Life
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14AreaEntityEffectSpeedBallade
- !type:CP14SpellArea
affectCaster: true
range: 5
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectSpeedBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:MovespeedModifier
walkSpeedModifier: 1.2
sprintSpeedModifier: 1.2
statusLifetime: 1.8
- type: CP14MagicEffectRequiredMusicTool
- type: CP14MagicEffectCastingVisual
proto: CP14RuneSpeedBallade
@@ -32,30 +46,6 @@
castTime: 120
hidden: true
- type: entity
id: CP14AreaEntityEffectSpeedBallade
categories: [ HideSpawnMenu ]
save: false
components:
- type: TimedDespawn
lifetime: 1.6
- type: CP14AreaEntityEffect
range: 3
maxTargets: 4
whitelist:
components:
- MobState
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectSpeedBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:MovespeedModifier
walkSpeedModifier: 1.15
sprintSpeedModifier: 1.15
statusLifetime: 1.8
- type: entity
id: CP14ImpactEffectSpeedBallade
parent: CP14BaseMagicImpact

View File

@@ -89,3 +89,11 @@
tags:
- HideContextMenu
- type: entity
parent: CP14BaseSpellScrollLight
id: CP14SpellScrollSearchOfLife
name: search of life spell scroll
components:
- type: CP14SpellStorage
spells:
- CP14ActionSpellSearchOfLife

View File

@@ -13,9 +13,22 @@
canModifyManacost: false
- type: CP14MagicEffect
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14AreaEntityEffectMagicBallade
- !type:CP14SpellArea
range: 5
maxTargets: 5
whitelist:
components:
- CP14MagicEnergyContainer
- CP14MagicEnergyCrystalSlot
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectMagicBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:CP14ManaChange
manaDelta: 1.2
safe: true
- type: CP14MagicEffectRequiredMusicTool
- type: CP14MagicEffectCastingVisual
proto: CP14RuneMagicBallade
@@ -32,30 +45,6 @@
castTime: 120
hidden: true
- type: entity
id: CP14AreaEntityEffectMagicBallade
categories: [ HideSpawnMenu ]
save: false
components:
- type: TimedDespawn
lifetime: 1.6
- type: CP14AreaEntityEffect
range: 5
maxTargets: 5
whitelist:
components:
- CP14MagicEnergyContainer
- CP14MagicEnergyCrystalSlot
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectMagicBallade
- !type:CP14SpellApplyEntityEffect
effects:
- !type:CP14ManaChange
manaDelta: 1.2
safe: true
- type: entity
id: CP14ImpactEffectMagicBallade
parent: CP14BaseMagicImpact

View File

@@ -94,4 +94,6 @@
event: !type:CP14DelayedEntityTargetActionEvent
cooldown: 5
castDelay: 0.4
distanceThreshold: 1.5
breakOnMove: false
breakOnDamage: false

View File

@@ -0,0 +1,28 @@
- type: entity
id: CP14ActionSpellSlimeJump
name: Slime jump
description: Jump! JUMP!
components:
- type: Sprite
sprite: _CP14/Actions/Spells/slime.rsi
state: jump
- type: CP14MagicEffectCastSlowdown
speedMultiplier: 0.1
- type: CP14MagicEffect
effects:
- !type:CP14SpellThrowUserTo
throwPower: 8
- type: EntityWorldTargetAction
useDelay: 8
range: 10
checkCanAccess: false
itemIconStyle: BigAction
icon:
sprite: _CP14/Actions/Spells/slime.rsi
state: jump
event: !type:CP14DelayedEntityWorldTargetActionEvent
hidden: true
breakOnMove: false
breakOnDamage: false
castDelay: 1
raiseOnUser: true

View File

@@ -88,5 +88,4 @@
components:
- type: CP14SpellStorage
spells:
- CP14ActionSpellBeerCreation
- CP14ActionSpellBeerCreation

View File

@@ -63,6 +63,8 @@
energy: 30
maxEnergy: 50
- type: CP14MagicUnsafeDamage
- type: StaticPrice
price: 5
- type: entity
abstract: true

View File

@@ -4,6 +4,7 @@
id: CP14ClothingHeadSlimeCrown
name: slime crown
description: Earl of Ooze. Grand Duke of Goo. Lord of the Slimes.
categories: [ DoNotMap ]
components:
- type: Sprite
sprite: _CP14/Clothing/Head/slime_crown.rsi

View File

@@ -52,8 +52,8 @@
params:
volume: 3
- type: Damageable
damageContainer: CP14Biological
damageModifierSet: Slime
damageContainer: CP14BiologicalAnaerobic
damageModifierSet: CP14Slime
- type: MeleeWeapon
altDisarm: false
soundHit:
@@ -72,6 +72,8 @@
speechSounds: Slime
- type: TypingIndicator
proto: slime
- type: ReplacementAccent
accent: slimes
- type: SolutionContainerManager
solutions:
slime:
@@ -91,6 +93,9 @@
solution: slime
- !type:DoActsBehavior
acts: [ "Destruction" ]
# TODO: shouldn't be openable by others
# TODO: custom sound for opening and closing--shouldn't be a chest
# TODO: allow player-controlled slime to open its own storage?
- type: EntityStorage
isCollidableWhenOpen: true
enteringOffset: 0, 0
@@ -98,6 +103,9 @@
showContents: true
occludesLight: false
- type: CP14MagicCasterSlowdown
- type: Tag
tags:
- FootstepSound
- type: EntityTableContainerFill
containers:
entity_storage: !type:GroupSelector
@@ -110,32 +118,3 @@
- id: CP14ScrapIron
- id: CP14CopperCoin1
weight: 3
- type: entity
id: CP14ActionSpellSlimeJump
name: Slime jump
description: Jump! JUMP!
components:
- type: Sprite
sprite: _CP14/Actions/Spells/physical.rsi
state: kick #TODO
- type: CP14MagicEffectCastSlowdown
speedMultiplier: 0.1
- type: CP14MagicEffect
effects:
- !type:CP14SpellThrowUserTo
throwPower: 8
- type: EntityWorldTargetAction
useDelay: 8
range: 10
checkCanAccess: false
itemIconStyle: BigAction
icon:
sprite: _CP14/Actions/Spells/physical.rsi
state: kick #TODO
event: !type:CP14DelayedEntityWorldTargetActionEvent
hidden: true
breakOnMove: false
breakOnDamage: false
castDelay: 1
raiseOnUser: true

View File

@@ -23,26 +23,23 @@
- ReagentId: CP14EssenceEnergia
Quantity: 30
- type: MeleeWeapon
altDisarm: false
soundHit:
path: /Audio/Weapons/punch3.ogg
angle: 0
animation: WeaponArcPunch
damage:
types:
Blunt: 3
Shock: 3
- type: CP14SpellEffectOnHit
prob: 0.3
prob: 0.15
effects:
- !type:CP14SpellApplyEntityEffect
effects:
- !type:Electrocute
electrocuteTime: 1
electrocuteTime: 0.5
electrocuteDamageScale: 1
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ElectrifiedEffect
- type: Damageable
damageModifierSet: CP14SlimeElectric
- type: Destructible
thresholds:
- trigger:
@@ -102,6 +99,5 @@
- !type:CP14SpellApplyEntityEffect
effects:
- !type:Electrocute
electrocuteTime: 3.5
electrocuteTime: 2
electrocuteDamageScale: 1

View File

@@ -25,15 +25,19 @@
- ReagentId: CP14BasicEffectDamageHeat
Quantity: 10
- type: MeleeWeapon
altDisarm: false
soundHit:
path: /Audio/Weapons/punch3.ogg
angle: 0
animation: WeaponArcPunch
damage:
types:
Blunt: 3
Heat: 3
- type: Damageable
damageModifierSet: CP14SlimeFire
- type: Temperature
coldDamage:
types:
Cold: 1
heatDamage:
types:
Heat: 0
- type: Destructible
thresholds:
- trigger:
@@ -100,4 +104,3 @@
- !type:AdjustTemperature
amount: 6000
- !type:Ignite

View File

@@ -20,14 +20,9 @@
reagents:
- ReagentId: CP14ChromiumSlime
Quantity: 20
- ReagentId: CP14EssenceWater
- ReagentId: CP14EssenceFrost
Quantity: 30
- type: MeleeWeapon
altDisarm: false
soundHit:
path: /Audio/Weapons/punch3.ogg
angle: 0
animation: WeaponArcPunch
damage:
types:
Blunt: 3
@@ -49,6 +44,15 @@
- !type:AdjustTemperature
amount: -6000
- !type:ExtinguishReaction
- type: Damageable
damageModifierSet: CP14SlimeIce
- type: Temperature
coldDamage:
types:
Cold: 0
heatDamage:
types:
Heat: 3
- type: Destructible
thresholds:
- trigger:
@@ -114,4 +118,3 @@
- !type:AdjustTemperature
amount: -82000
- !type:ExtinguishReaction

View File

@@ -8,6 +8,12 @@
- type: NpcFactionMember
factions:
- CP14Monster
- type: CP14SkillStorage
experienceMaxCap: 0
freeLearnedSkills:
- SwordMastery
- RapierMastery
- SkimitarMastery
- type: entity
id: CP14MobUndeadSkeletonHalberdT1

View File

@@ -1,6 +1,6 @@
- type: entity
id: CP14MobUndeadSkeletonDemiplaneT2
parent: CP14BaseMobSkeleton
parent: CP14MobUndeadSkeletonDemiplaneT1
name: skeleton
abstract: true
components:
@@ -77,20 +77,38 @@
- type: Loadout
prototypes:
- CP14MobSkeletonWizardT2
- type: CP14MagicEnergyDraw
energy: 1
delay: 1
- type: CP14MagicEnergyContainer
magicAlert: CP14MagicEnergy
maxEnergy: 200
energy: 200
unsafeSupport: true
- type: PassiveDamage
allowedStates:
- Alive
damage:
types:
CP14ManaDepletion: -0.1
- type: CP14SkillStorage
experienceMaxCap: 0
freeLearnedSkills:
- SwordMastery
- RapierMastery
- SkimitarMastery
- HydrosophistryT1
- HydrosophistryT2
- MetamagicT1
- MetamagicT2
- CP14ActionSpellFreeze
- CP14ActionSpellIceShards
- CP14ActionSpellManaConsumeElf
- CP14ActionSpellManaGiftElf
- CP14ActionSpellMagicSplitting
- CP14ActionSpellManaTrance
- type: CP14SpellStorage
grantAccessToSelf: true
spells:
- CP14ActionSpellFreeze
- CP14ActionSpellIceShards
- CP14ActionSpellIceDagger
- CP14ActionSpellCureFromDeath
- CP14ActionSpellResurrectionDead
- CP14ActionSpellShadowStep
- CP14ActionSpellShadowSwap
- CP14ActionSpellShadowGrab
- type: entity
id: CP14MobUndeadSkeletonBardT2
parent: CP14MobUndeadSkeletonDemiplaneT2

View File

@@ -39,7 +39,7 @@
offset: 1
table: !type:GroupSelector
rolls: !type:RangeNumberSelector
range: 1, 5
range: 3, 5
children:
- id: CP14MobUndeadZombie
weight: 2
@@ -50,6 +50,32 @@
tags:
- FootstepSound
- CP14RaidLeader
- type: CP14SkillStorage
experienceMaxCap: 0
freeLearnedSkills:
- SwordMastery
- RapierMastery
- SkimitarMastery
- MetamagicT1
- MetamagicT2
- HydrosophistryT1
- HydrosophistryT2
- PyrokineticT1
- PyrokineticT2
- CP14ActionSpellFireball
- CP14ActionSpellFreeze
- CP14ActionSpellIceShards
- CP14ActionSpellManaConsumeElf
- CP14ActionSpellManaGiftElf
- CP14ActionSpellMagicSplitting
- CP14ActionSpellManaTrance
- type: CP14SpellStorage
grantAccessToSelf: true
spells:
- CP14ActionSpellResurrectionDead
- type: Loadout
prototypes:
- CP14MobSkeletonWizardTownRaid
- type: entity
id: CP14SpawnPointTownRaidUndeadEasy

View File

@@ -43,7 +43,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]
@@ -210,7 +210,7 @@
attributes:
proper: true
- type: MobPrice
price: 1500 # Kidnapping a living person and selling them for cred is a good move.
price: 150 # Kidnapping a living person and selling them for cred is a good move.
deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less.
- type: Tag
tags:
@@ -365,7 +365,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]
@@ -400,6 +400,7 @@
- BaseMob
- CP14MobDamageable
- CP14MobMagical
- CP14BaseMobSpecies
id: CP14BaseMobSpeciesNoLife
categories: [ ForkFiltered ]
abstract: true
@@ -438,7 +439,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]

View File

@@ -38,7 +38,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]

View File

@@ -42,7 +42,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]
@@ -154,7 +154,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]

View File

@@ -34,7 +34,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]

View File

@@ -36,7 +36,7 @@
- map: [ "cloak" ]
- map: [ "outerClothing" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "back" ]

View File

@@ -109,7 +109,6 @@
- type: entity
parent:
- CP14MobDamageable
- MobRespirator
- MobAtmosStandard
- CP14SimpleSpaceMobNoLifeBase
id: CP14SimpleMobNoLifeBase

View File

@@ -18,4 +18,4 @@
- state: bookmark_short
map: [ "overlay" ]
- type: Paper
content: cp14-book-text-guild_moral
content: cp14-book-text-guild-moral

View File

@@ -35,6 +35,8 @@
- type: ContainerContainer
containers:
storagebase: !type:Container
- type: StaticPrice
price: 1
- type: entity
id: CP14PaperFolderBlue

View File

@@ -60,6 +60,8 @@
- type: Tag
tags:
- Document
- type: StaticPrice
price: 2
- type: entity
parent: CP14BasePaper

View File

@@ -22,6 +22,11 @@
collection: PaperScribbles
params:
variation: 0.1
- type: StaticPrice
price: 3
- type: PhysicalComposition
materialComposition:
Steel: 0 #Parenting from vanilla moment
# TODO: Чернильницу нужно доделать. Перо должно быть видно, пока оно внутри чернильницы. Предмет должен быть через ItemSlots, чтобы перо вставлять забирать можно было кликом. Нужно добавить прикольные звуки вставляния, выставляния. И добавить механ, который будет требовать периодически макать перо в чернильницу.
- type: entity

View File

@@ -39,3 +39,36 @@
- type: CP14TradingContract
faction: BradPotions
- type: entity
parent: CP14TradeContractBase
id: CP14TradeContractDwarfMining
description: Trading contract with the "Dwarf Steel" mining branch. Allows you to purchase various ore and mining tools.
suffix: Dwarf Miners
components:
- type: Sprite
state: dwarf_mining
- type: CP14TradingContract
faction: DwarfMining
- type: entity
parent: CP14TradeContractBase
id: CP14TradeContractThaumaturgy
description: Trading contract with the "Academy of Thaumaturgy". Allows you to purchase various omagic device, tools and scrolls.
suffix: Thaumaturgy
components:
- type: Sprite
state: magic
- type: CP14TradingContract
faction: Thaumaturgy
- type: entity
parent: CP14TradeContractBase
id: CP14TradeContractHomeDecor
description: Trading contract with the "Cozy House" store. Allows you to buy various decorations and nice things to furnish your home.
suffix: Home Decor
components:
- type: Sprite
state: house
- type: CP14TradingContract
faction: HomeDecor

View File

@@ -21,6 +21,8 @@
tags:
- CP14Wheat
- CP14FarmFood
- type: StaticPrice
price: 1
- type: entity
id: CP14Cotton
@@ -45,3 +47,5 @@
- type: Tag
tags:
- CP14FarmFood
- type: StaticPrice
price: 1

View File

@@ -32,6 +32,19 @@
materialComposition:
CP14Mithril: 10
- type: entity
parent: CP14BaseLockpick
id: CP14LockpickSkeletonArtifact
name: lockpick skeleton
description: A lockpick made from the bone of an unknown creature, it can open anything... though not immediately.
categories: [ DoNotMap ]
suffix: Artifact
components:
- type: CP14Lockpick
health: 1000
- type: Sprite
state: lockpick_skeleton
- type: entity
parent: BaseItem
id: CP14KeyFile

View File

@@ -10,6 +10,9 @@
- type: Sprite
sprite: _CP14/Objects/Materials/string.rsi
state: icon
- type: PhysicalComposition
materialComposition:
CP14Cloth: 5
- type: entity
id: CP14Web
@@ -34,6 +37,9 @@
icon2: ""
icon3: ""
icon4: ""
- type: PhysicalComposition
materialComposition:
CP14Cloth: 2
- type: entity
id: CP14Cloth1

View File

@@ -11,6 +11,8 @@
- type: Tag
tags:
- Payload
- type: StaticPrice
price: 5
- type: InteractionPopup
successChance: 1
interactSuccessSound:

View File

@@ -0,0 +1,84 @@
- type: entity
id: CP14OpenSign
name: flip sign "Open"
description: A small double-sided sign that can be turned over
parent:
- BaseItem
- CP14BaseFlammable
categories: [ ForkFiltered ]
components:
- type: Sprite
noRot: true
sprite: _CP14/Objects/Misc/openclosed_sign.rsi
layers:
- state: table_sign
- state: en_open_sign
map: [signState]
- type: Item
size: Small
- type: Flippable
mirrorEntity: CP14ClosedSign
- type: Appearance
- type: InteractionOutline
- type: CP14LocalizationVisuals
mapStates:
signState:
ru-RU: ru_open_sign
en-US: en_open_sign
- type: Damageable
damageContainer: Inorganic
damageModifierSet: Wood
- type: Destructible
thresholds:
- trigger:
!type:DamageTypeTrigger
damageType: Heat
damage: 6
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: WoodDestroy
- !type:SpawnEntitiesBehavior
spawn:
CP14Ash1:
min: 1
max: 2
- trigger:
!type:DamageTrigger
damage: 10
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: WoodDestroy
- !type:SpawnEntitiesBehavior
spawn:
CP14WoodenPlanks1:
min: 1
max: 1
- type: entity
id: CP14ClosedSign
name: flip sign "Closed"
description: A small double-sided sign that can be turned over
parent:
- CP14OpenSign
categories: [ ForkFiltered ]
components:
- type: Sprite
noRot: true
sprite: _CP14/Objects/Misc/openclosed_sign.rsi
layers:
- state: table_sign
- state: en_close_sign
map: [signState]
- type: Flippable
mirrorEntity: CP14OpenSign
- type: CP14LocalizationVisuals
mapStates:
signState:
ru-RU: ru_close_sign
en-US: en_close_sign

View File

@@ -231,6 +231,8 @@
- type: SolutionContainerVisuals
maxFillLevels: 2
fillBaseName: liq-
- type: Item
size: Tiny
- type: entity
id: CP14Syringe

View File

@@ -39,4 +39,7 @@
- state: label
visible: false
map: ["enum.PaperLabelVisuals.Layer"]
- type: PhysicalComposition
materialComposition:
CP14Glass: 10
CP14Gold: 10

View File

@@ -15,6 +15,8 @@
- type: Tag
tags:
- CP14EnergyCrystal
- type: StaticPrice
price: 10
- type: entity
id: CP14EnergyCrystalMedium
@@ -25,7 +27,6 @@
- type: Sprite
layers:
- state: medium
- state: medium_connector
- type: CP14MagicEnergyContainer
energy: 50
maxEnergy: 50

View File

@@ -57,6 +57,8 @@
collection: MetalThud
cPAnimationLength: 0.25
cPAnimationOffset: -1.3
- type: StaticPrice
price: 50
- type: NetworkConfigurator
- type: ActivatableUI
key: enum.NetworkConfiguratorUiKey.List

View File

@@ -60,6 +60,10 @@
- type: Tag
tags:
- CP14Torch
- type: PhysicalComposition
materialComposition:
CP14WoodenPlanks: 10
CP14Cloth: 10
- type: entity
parent: CP14Torch

View File

@@ -11,6 +11,8 @@
sprite: _CP14/Structures/Wallpaper/icons.rsi
- type: Stack
count: 30
- type: StackPrice
price: 0.5
- type: entity
id: CP14WallpaperBlack

View File

@@ -43,5 +43,4 @@
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronDagger
- InlayQuartzElectric
- InlayQuartzElectric

View File

@@ -13,3 +13,49 @@
details:
- BladeIronSkimitar
- type: entity
id: CP14ModularCopperSkimitar
parent: CP14ModularGripWooden
name: copper skimitar
description: the gold standard of edged weapons. Medium length, comfortable grip. No frills.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/Blade/Skimitar/metall_skimitar.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeCopperSkimitar
- type: entity
id: CP14ModularIronSkimitarTundra
parent: CP14ModularGripWooden
name: Skimitar Tundra
description: the gold standard of edged weapons. Medium length, comfortable grip. It has "tundra" engraved on it.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/Blade/Dagger/metall_dagger.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeIronSkimitar
- InlayQuartzWater
- type: entity
id: CP14ModularGoldSkimitarAgony
parent: CP14ModularGripWooden
name: Skimitar Agony
description: the gold standard of edged weapons. Medium length, comfortable grip. It has "agony" engraved on it.
components:
- type: Sprite
layers:
- state: icon
- sprite: _CP14/Objects/ModularTools/Blade/Dagger/metall_dagger.rsi
state: icon
- type: CP14ModularCraftAutoAssemble
details:
- BladeGoldSkimitar
- InlayQuartzElectric

View File

@@ -8,7 +8,7 @@
- type: CP14WaveShader
speed: 2.5
dis: 4
- type: SpriteFade
#- type: SpriteFade #Hard to attack
- type: Clickable
- type: Sprite
noRot: true

View File

@@ -1,6 +1,8 @@
- type: entity
id: CP14CarpetBase
parent: BaseStructure
parent:
- BaseStructure
- CP14BaseFlammableSpreadingStrong
name: carpet
description: "Fancy walking surface."
categories: [ ForkFiltered ]
@@ -57,3 +59,42 @@
- type: Icon
sprite: _CP14/Structures/Furniture/Carpets/red_carpet.rsi
- type: entity
id: CP14CarpetCyan
parent: CP14CarpetBase
suffix: Cyan
components:
- type: Sprite
sprite: _CP14/Structures/Furniture/Carpets/cyan_carpet.rsi
- type: Icon
sprite: _CP14/Structures/Furniture/Carpets/cyan_carpet.rsi
- type: entity
id: CP14CarpetGreen
parent: CP14CarpetBase
suffix: Green
components:
- type: Sprite
sprite: _CP14/Structures/Furniture/Carpets/green_carpet.rsi
- type: Icon
sprite: _CP14/Structures/Furniture/Carpets/green_carpet.rsi
- type: entity
id: CP14CarpetOrange
parent: CP14CarpetBase
suffix: Orange
components:
- type: Sprite
sprite: _CP14/Structures/Furniture/Carpets/orange_carpet.rsi
- type: Icon
sprite: _CP14/Structures/Furniture/Carpets/orange_carpet.rsi
- type: entity
id: CP14CarpetPink
parent: CP14CarpetBase
suffix: Pink
components:
- type: Sprite
sprite: _CP14/Structures/Furniture/Carpets/pink_carpet.rsi
- type: Icon
sprite: _CP14/Structures/Furniture/Carpets/pink_carpet.rsi

View File

@@ -23,7 +23,7 @@
- map: [ "outerClothing" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
- map: [ "belt1" ]
- map: [ "belt" ]
- map: [ "belt2" ]
- map: [ "neck" ]
- map: [ "mask" ]
@@ -90,7 +90,7 @@
showEnts: False
occludes: False
ent: null
belt1: !type:ContainerSlot
belt: !type:ContainerSlot
showEnts: False
occludes: False
ent: null

Some files were not shown because too many files have changed in this diff Show More