Compare commits

..

17 Commits

Author SHA1 Message Date
Nim
ca23fddd8a Lyre and flute (#759)
* music

* fix desc

* Update T1_fire_rune.yml

---------

Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com>
Co-authored-by: Ed <edwardxperia2000@gmail.com>
2025-01-17 01:26:39 +03:00
Ed
50c502f598 AOE Spells (#758)
* AoE gameplay

* Update T1_fire_rune.yml

* test

* add cool AoE visual
2025-01-17 01:01:44 +03:00
Ed
0783eb1380 Knowledge system (#770)
* remove all requirements

* clean up and renaming to knowledge

* update code

* add admin knowledge verbs

* move shoes under pants

* knowledge based recipes

* clean up

* sewing knowledges

* knowledge dependencies

* knowledge learning objects

* more knowledge

* metallforging skill

* knowledge books

* start knowledges, T1 and T2 books in demiplanes

* remove coins from demiplanes

* roundstart knowledge
2025-01-17 00:08:13 +03:00
Nim
5af56d4655 fiiiiiix (#766) 2025-01-16 01:42:20 +03:00
MetalSage
6e77b82da7 fix (#763)
Co-authored-by: MetalSage <metalsage.official@gmail.com>
2025-01-15 20:14:50 +03:00
Nim
02cfcd620c Inter-Monster tolerance (#761)
* Insects ai

* monster
2025-01-15 17:34:38 +03:00
Ed
e6097da7cc Update CP14MagicEnergyPhotosynthesisComponent.cs 2025-01-15 01:05:28 +03:00
Ed
925738afc2 Workbench update (#760)
* fix workbench icons

* workbench search

* fix 1

* UI finalize

* fix material localization

* restore shard sprite

* Update sewing_table.yml
2025-01-15 00:34:08 +03:00
Ed
cf41cabcea Remove OP (#757)
* remove outdated content

* Update migration.yml

* Update twoHandedStaffs.yml
2025-01-14 14:36:10 +03:00
Ed
87d57df0e6 Omsoyk epic clothing pack (#756)
* new shirts

* pants and dresses

* blue cloak
2025-01-14 12:03:10 +03:00
Ed
51a47eaffc Bunch of gameplay issues (#754)
* fix demiplane contetn filtering

* fix day demiplanes

* remove filled crystals from demiplanes

* remove armored zombies

* added candles in town crates

* remove 20% unefficient of mana moving spells

* fix #622

* revert random Viator commit

* Update demiplane_rifts.yml
2025-01-14 01:41:11 +03:00
Nim
c7c5b4dc4c bench fix (#755) 2025-01-13 23:24:33 +03:00
Nim
2644fe26ea Ashes and Russian translation edits with a couple of minor fixes (#735)
* ash++++

* fix

* по запросу
2025-01-13 23:01:34 +03:00
Nim
732bc267f7 Bench (#751)
* bench

* anchored
2025-01-13 22:59:57 +03:00
Viator-MV
ddd61df7b8 изменение текстуры книги законов
текстура книги законов изменена на подходящую к новым книгам
2025-01-13 21:37:30 +03:00
Ed
025753e689 revert 2025-01-13 18:09:40 +03:00
Ed
368839dd68 Bugixes (#750)
* fix #746

* fix #745

* fix #747

* fix #744

* fix #743

* fix #741

* fix #722
2025-01-13 12:54:46 +03:00
258 changed files with 2817 additions and 1517 deletions

View File

@@ -0,0 +1,7 @@
using Content.Shared._CP14.Knowledge;
namespace Content.Client._CP14.Knowledge;
public sealed partial class ClientCP14KnowledgeSystem : SharedCP14KnowledgeSystem
{
}

View File

@@ -41,7 +41,7 @@ public sealed class CP14BasePostProcessOverlay : Overlay
if (args.Viewport.Eye != eyeComp.Eye)
return false;
if (!_lightManager.Enabled || !eyeComp.Eye.DrawLight)
if (!_lightManager.Enabled || !eyeComp.Eye.DrawLight || !eyeComp.Eye.DrawFov)
return false;
var playerEntity = _playerManager.LocalSession?.AttachedEntity;

View File

@@ -12,6 +12,9 @@ public sealed class CP14WorkbenchBoundUserInterface : BoundUserInterface
{
private CP14WorkbenchWindow? _window;
[ViewVariables]
private string _search = string.Empty;
public CP14WorkbenchBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{
}
@@ -23,6 +26,12 @@ public sealed class CP14WorkbenchBoundUserInterface : BoundUserInterface
_window = this.CreateWindow<CP14WorkbenchWindow>();
_window.OnCraft += entry => SendMessage(new CP14WorkbenchUiCraftMessage(entry.ProtoId));
_window.OnTextUpdated += search =>
{
_search = search.Trim().ToLowerInvariant();
_window.UpdateFilter(_search);
};
}
protected override void UpdateState(BoundUserInterfaceState state)
@@ -32,7 +41,7 @@ public sealed class CP14WorkbenchBoundUserInterface : BoundUserInterface
switch (state)
{
case CP14WorkbenchUiRecipesState recipesState:
_window?.UpdateRecipes(recipesState);
_window?.UpdateRecipes(recipesState, _search);
break;
}
}

View File

@@ -1,10 +1,20 @@
<Control xmlns="https://spacestation14.io">
<GridContainer Columns="2">
<TextureRect Name="View"
Margin="0,0,4,0"
MinSize="48 48"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered"/>
<Label Name="Name"/>
<EntityPrototypeView
Name="EntityView"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
Scale="2,2"
HorizontalAlignment="Left"
VerticalExpand="True" />
<TextureRect
Name="View"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered" />
<Label Name="Name" />
</GridContainer>
</Control>

View File

@@ -31,7 +31,9 @@ public sealed partial class CP14WorkbenchRecipeControl : Control
{
var entityName = prototype.Name;
Name.Text = count <= 1 ? entityName : $"{entityName} x{count}";
View.Texture = _sprite.GetPrototypeIcon(prototype).Default;
View.Visible = false;
EntityView.SetPrototype(prototype);
}
public CP14WorkbenchRecipeControl(StackPrototype prototype, int count) : this()
@@ -43,6 +45,7 @@ public sealed partial class CP14WorkbenchRecipeControl : Control
if (icon is null)
return;
EntityView.Visible = false;
View.Texture = _sprite.Frame0(icon);
}
}

View File

@@ -1,11 +1,13 @@
<Control xmlns="https://spacestation14.io">
<Button Name="Button">
<GridContainer Columns="2">
<TextureRect Name="View"
Margin="0,0,4,0"
MinSize="48 48"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered"/>
<EntityPrototypeView Name="View"
Margin="0,0,4,0"
MinSize="48 48"
MaxSize="48 48"
Scale="2,2"
HorizontalAlignment="Center"
VerticalExpand="True"/>
<Label Name="Name"/>
</GridContainer>
</Button>

View File

@@ -59,6 +59,6 @@ public sealed partial class CP14WorkbenchRequirementControl : Control
private void UpdateView()
{
View.Texture = _sprite.GetPrototypeIcon(_recipePrototype.Result).Default;
View.SetPrototype(_recipePrototype.Result);
}
}

View File

@@ -2,59 +2,68 @@
xmlns:graphics="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
Title="{Loc 'cp14-workbench-ui-title'}"
MinSize="700 600">
<BoxContainer Orientation="Vertical">
SetSize="700 500"
MinSize="700 300">
<BoxContainer Orientation="Horizontal">
<!-- Main -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Horizontal">
<GridContainer HorizontalExpand="True" VerticalExpand="True" Columns="2">
<!-- Product list (left side UI) -->
<BoxContainer SizeFlagsStretchRatio="0.5" HorizontalExpand="True" Orientation="Vertical" Margin="0 0 10 0">
<!-- Search Bar -->
<LineEdit Name="SearchBar" Margin="4" PlaceHolder="Search" HorizontalExpand="True" />
<!-- Crafts container -->
<ScrollContainer HorizontalExpand="True" VerticalExpand="True" MinSize="0 200">
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True"/>
<BoxContainer Name="CraftsContainer" Orientation="Vertical" HorizontalExpand="True" />
</ScrollContainer>
</BoxContainer>
<!-- Craft view -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f"/>
</PanelContainer.PanelOverride>
<!-- Craft view (right side UI) -->
<BoxContainer SizeFlagsStretchRatio="0.5" Orientation="Vertical" HorizontalExpand="True"
VerticalExpand="True">
<PanelContainer HorizontalExpand="True" VerticalExpand="True">
<!-- Background -->
<PanelContainer.PanelOverride>
<graphics:StyleBoxFlat BackgroundColor="#41332f" />
</PanelContainer.PanelOverride>
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<GridContainer HorizontalExpand="True" Columns="2">
<!-- Left panel - icon -->
<TextureRect Name="ItemView"
<!-- Content -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<!-- Item info -->
<!-- icon -->
<EntityPrototypeView Name="ItemView"
Scale="2,2"
Margin="0,0,4,0"
MinSize="64 64"
HorizontalAlignment="Left"
Stretch="KeepAspectCentered"/>
MaxSize="64 64"
HorizontalAlignment="Left" />
<!-- Right panel - name & description -->
<BoxContainer HorizontalExpand="True" VerticalExpand="True" Orientation="Vertical">
<Label Name="ItemName" Text="Name"/>
<Label Name="ItemDescription" Text="Description" ClipText="True"/>
</BoxContainer>
</GridContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5"/>
<!-- Required title -->
<Label Text="{Loc 'cp14-workbench-recipe-list'}"/>
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer Name="ItemRequirements" Orientation="Vertical" VerticalExpand="True" HorizontalExpand="True"/>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5"/>
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-workbench-craft'}"/>
<!-- name & description -->
<BoxContainer Margin="5 0 0 0" HorizontalExpand="True" VerticalExpand="True"
Orientation="Vertical">
<RichTextLabel Name="ItemName" Margin="5" />
<RichTextLabel Name="ItemDescription" Margin="5" />
</BoxContainer>
</PanelContainer>
</BoxContainer>
</GridContainer>
<controls:HLine Color="#404040" Thickness="2" Margin="0 5" />
<!-- Required title -->
<Label Margin="5 0 0 0" Text="{Loc 'cp14-workbench-recipe-list'}" />
<!-- Craft requirements content -->
<!-- Added by code -->
<BoxContainer
Margin="5 0 0 0"
Name="ItemRequirements"
Orientation="Vertical" VerticalExpand="True"
HorizontalExpand="True" />
<controls:HLine Color="#404040" Thickness="5" Margin="0 5" />
<!-- Craft button -->
<Button Name="CraftButton" Text="{Loc 'cp14-workbench-craft'}" />
</BoxContainer>
</PanelContainer>
</BoxContainer>
</BoxContainer>
</BoxContainer>
</DefaultWindow>

View File

@@ -19,19 +19,22 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
[Dependency] private readonly IEntityManager _entity = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
private CP14WorkbenchUiRecipesState? _cachedState;
public event Action<CP14WorkbenchUiRecipesEntry>? OnCraft;
public event Action<string>? OnTextUpdated;
private readonly SpriteSystem _sprite;
private CP14WorkbenchUiRecipesEntry? _selectedEntry ;
private CP14WorkbenchUiRecipesEntry? _selectedEntry;
public CP14WorkbenchWindow()
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
_sprite = _entity.System<SpriteSystem>();
SearchBar.OnTextChanged += _ =>
{
OnTextUpdated?.Invoke(SearchBar.Text);
};
CraftButton.OnPressed += _ =>
{
if (_selectedEntry is null)
@@ -41,13 +44,34 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
};
}
public void UpdateRecipes(CP14WorkbenchUiRecipesState recipesState)
public void UpdateFilter(string? search)
{
if (_cachedState is null)
return;
UpdateRecipes(_cachedState, search);
}
public void UpdateRecipes(CP14WorkbenchUiRecipesState recipesState, string? search = null)
{
_cachedState = recipesState;
CraftsContainer.RemoveAllChildren();
List<CP14WorkbenchUiRecipesEntry> uncraftableList = new();
foreach (var entry in recipesState.Recipes)
{
if (search is not null && search != "")
{
if (!_prototype.TryIndex(entry.ProtoId, out var indexedEntry))
continue;
if (!_prototype.TryIndex(indexedEntry.Result, out var indexedResult))
continue;
if (!indexedResult.Name.Contains(search))
continue;
}
if (entry.Craftable)
{
var control = new CP14WorkbenchRequirementControl(entry);
@@ -89,7 +113,7 @@ public sealed partial class CP14WorkbenchWindow : DefaultWindow
var result = _prototype.Index(recipe.Result);
ItemView.Texture = _sprite.GetPrototypeIcon(recipe.Result).Default;
ItemView.SetPrototype(recipe.Result);
ItemName.Text = result.Name;
ItemDescription.Text = result.Description;

View File

@@ -1,7 +1,7 @@
using Content.Server.Body.Components;
using Content.Server.Body.Systems;
using Content.Shared._CP14.Farming;
using Content.Shared._CP14.Skills;
using Content.Shared._CP14.Knowledge;
using Content.Shared.Chemistry;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.Components.SolutionManager;
@@ -35,8 +35,6 @@ public sealed class InjectorSystem : SharedInjectorSystem
private bool TryUseInjector(Entity<InjectorComponent> injector, EntityUid target, EntityUid user)
{
RaiseLocalEvent(injector, new CP14TrySkillIssueEvent(user)); //CP14 Skill issue event
var isOpenOrIgnored = injector.Comp.IgnoreClosed || !_openable.IsClosed(target);
// Handle injecting/drawing for solutions
if (injector.Comp.ToggleState == InjectorToggleMode.Inject)

View File

@@ -241,14 +241,20 @@ public sealed partial class CP14DemiplaneSystem
//Tier filter
if (passed)
{
var innerPassed = false;
foreach (var tier in modifier.Tiers)
{
if (!generator.Comp.TiersContent.ContainsKey(tier))
if (generator.Comp.TiersContent.ContainsKey(tier))
{
passed = false;
innerPassed = true;
break;
}
}
if (!innerPassed)
{
passed = false;
}
}
// Tier weight filter
@@ -257,7 +263,8 @@ public sealed partial class CP14DemiplaneSystem
var maxProb = 0f;
foreach (var tier in modifier.Tiers)
{
maxProb = Math.Max(maxProb, generator.Comp.TiersContent[tier]);
if (generator.Comp.TiersContent.ContainsKey(tier))
maxProb = Math.Max(maxProb, generator.Comp.TiersContent[tier]);
}
if (!_random.Prob(maxProb))

View File

@@ -0,0 +1,27 @@
using Content.Shared._CP14.Knowledge;
using Content.Shared._CP14.Knowledge.Prototypes;
using Content.Shared.Roles;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.Knowledge;
/// <summary>
/// a component that can be hung on an entity to immediately teach it some skills
/// </summary>
[UsedImplicitly]
public sealed partial class CP14AddKnowledgeSpecial : JobSpecial
{
[DataField(required: true), ViewVariables(VVAccess.ReadOnly)]
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = new();
public override void AfterEquip(EntityUid mob)
{
var entMan = IoCManager.Resolve<IEntityManager>();
var knowledgeSystem = entMan.System<CP14KnowledgeSystem>();
foreach (var knowledge in Knowledge)
{
knowledgeSystem.TryLearnKnowledge(mob, knowledge, true, true);
}
}
}

View File

@@ -0,0 +1,254 @@
using System.Text;
using Content.Server.Chat.Managers;
using Content.Server.Mind;
using Content.Server.Popups;
using Content.Shared._CP14.Knowledge;
using Content.Shared._CP14.Knowledge.Components;
using Content.Shared._CP14.Knowledge.Prototypes;
using Content.Shared.Administration;
using Content.Shared.Administration.Logs;
using Content.Shared.Administration.Managers;
using Content.Shared.Chat;
using Content.Shared.Damage;
using Content.Shared.Database;
using Content.Shared.DoAfter;
using Content.Shared.Verbs;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Knowledge;
public sealed partial class CP14KnowledgeSystem : SharedCP14KnowledgeSystem
{
[Dependency] private readonly ISharedAdminManager _admin = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly IChatManager _chat = default!;
[Dependency] private readonly MindSystem _mind = default!;
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14AutoAddKnowledgeComponent, MapInitEvent>(AutoAddSkill);
SubscribeLocalEvent<CP14KnowledgeStorageComponent, GetVerbsEvent<Verb>>(AddKnowledgeAdminVerb);
SubscribeLocalEvent<CP14KnowledgeLearningSourceComponent, GetVerbsEvent<Verb>>(AddKnowledgeLearningVerb);
SubscribeLocalEvent<CP14KnowledgeStorageComponent, CP14KnowledgeLearnDoAfterEvent>(KnowledgeLearnedEvent);
}
private void KnowledgeLearnedEvent(Entity<CP14KnowledgeStorageComponent> ent, ref CP14KnowledgeLearnDoAfterEvent args)
{
if (args.Cancelled || args.Handled)
return;
args.Handled = true;
TryLearnKnowledge(ent, args.Knowledge);
}
private void AddKnowledgeLearningVerb(Entity<CP14KnowledgeLearningSourceComponent> ent, ref GetVerbsEvent<Verb> args)
{
var user = args.User;
foreach (var knowledge in ent.Comp.Knowledges)
{
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
continue;
args.Verbs.Add(new Verb()
{
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
Message = Loc.GetString(indexedKnowledge.Desc),
Category = VerbCategory.CP14KnowledgeLearn,
Act = () =>
{
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager,
user,
ent.Comp.DoAfter,
new CP14KnowledgeLearnDoAfterEvent() {Knowledge = knowledge},
user,
ent,
ent)
{
BreakOnDamage = true,
BreakOnMove = true,
});
},
Disabled = HasKnowledge(user, knowledge),
Impact = LogImpact.Medium,
});
}
}
private void AddKnowledgeAdminVerb(Entity<CP14KnowledgeStorageComponent> ent, ref GetVerbsEvent<Verb> args)
{
if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
return;
//Remove knowledge
foreach (var knowledge in ent.Comp.Knowledges)
{
if (!_proto.TryIndex(knowledge, out var indexedKnowledge))
continue;
args.Verbs.Add(new Verb()
{
Text = $"{Loc.GetString(indexedKnowledge.Name)}",
Message = Loc.GetString(indexedKnowledge.Desc),
Category = VerbCategory.CP14KnowledgeRemove,
Act = () =>
{
TryForgotKnowledge(ent, knowledge);
},
Impact = LogImpact.High,
});
}
//Add knowledge
foreach (var knowledge in _proto.EnumeratePrototypes<CP14KnowledgePrototype>())
{
if (ent.Comp.Knowledges.Contains(knowledge))
continue;
args.Verbs.Add(new Verb()
{
Text = $"{Loc.GetString(knowledge.Name)}",
Message = Loc.GetString(knowledge.Desc),
Category = VerbCategory.CP14KnowledgeAdd,
Act = () =>
{
TryLearnKnowledge(ent, knowledge, false);
},
Impact = LogImpact.High,
});
}
}
private void AutoAddSkill(Entity<CP14AutoAddKnowledgeComponent> ent, ref MapInitEvent args)
{
foreach (var knowledge in ent.Comp.Knowledge)
{
TryLearnKnowledge(ent, knowledge);
}
RemComp(ent, ent.Comp);
}
public bool TryLearnKnowledge(EntityUid uid, ProtoId<CP14KnowledgePrototype> proto, bool force = false, bool silent = false)
{
if (!TryComp<CP14KnowledgeStorageComponent>(uid, out var knowledgeStorage))
return false;
if (!_proto.TryIndex(proto, out var indexedKnowledge))
return false;
if (knowledgeStorage.Knowledges.Contains(proto))
return false;
foreach (var dependency in indexedKnowledge.Dependencies)
{
if (!_proto.TryIndex(dependency, out var indexedDependency))
return false;
if (force)
{
//If we teach by force - we automatically teach all the basics that are necessary for that skill.
if (!TryLearnKnowledge(uid, dependency, true))
return false;
}
else
{
var passed = true;
var sb = new StringBuilder();
sb.Append(Loc.GetString("cp14-cant-learn-knowledge-dependencies",
("target", Loc.GetString(indexedKnowledge.Desc))));
//We cant learnt
if (!HasKnowledge(uid, dependency))
{
passed = false;
sb.Append("\n- " + Loc.GetString(indexedDependency.Desc));
}
if (!passed)
{
if (!silent && _mind.TryGetMind(uid, out var mind, out var mindComp) && mindComp.Session is not null)
{
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", sb.ToString()));
_chat.ChatMessageToOne(
ChatChannel.Server,
sb.ToString(),
wrappedMessage,
default,
false,
mindComp.Session.Channel);
}
return false;
}
}
}
//TODO: coding on a sleepy head is a bad idea. Remove duplicate variables. >:(
if (!silent && _mind.TryGetMind(uid, out var mind2, out var mindComp2) && mindComp2.Session is not null)
{
var message = Loc.GetString("cp14-learned-new-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
var wrappedMessage2 = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
_chat.ChatMessageToOne(
ChatChannel.Server,
message,
wrappedMessage2,
default,
false,
mindComp2.Session.Channel);
}
_adminLogger.Add(
LogType.Mind,
LogImpact.Medium,
$"{EntityManager.ToPrettyString(uid):player} learned new knowledge: {Loc.GetString(indexedKnowledge.Name)}");
return knowledgeStorage.Knowledges.Add(proto);
}
public bool TryForgotKnowledge(EntityUid uid, ProtoId<CP14KnowledgePrototype> proto, bool silent = false)
{
if (!TryComp<CP14KnowledgeStorageComponent>(uid, out var knowledgeStorage))
return false;
if (!knowledgeStorage.Knowledges.Contains(proto))
return false;
if (!_proto.TryIndex(proto, out var indexedKnowledge))
return false;
knowledgeStorage.Knowledges.Remove(proto);
if (_mind.TryGetMind(uid, out var mind, out var mindComp) && mindComp.Session is not null)
{
if (!silent)
{
var message = Loc.GetString("cp14-forgot-knowledge", ("name", Loc.GetString(indexedKnowledge.Name)));
var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message));
_chat.ChatMessageToOne(
ChatChannel.Server,
message,
wrappedMessage,
default,
false,
mindComp.Session.Channel);
}
}
_adminLogger.Add(
LogType.Mind,
LogImpact.Medium,
$"{EntityManager.ToPrettyString(uid):player} forgot knowledge: {Loc.GetString(indexedKnowledge.Name)}");
return true;
}
}

View File

@@ -0,0 +1,27 @@
using Content.Shared._CP14.MagicSpell.Spells;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
namespace Content.Server._CP14.MagicSpell;
/// <summary>
///
/// </summary>
[RegisterComponent]
public sealed partial class CP14AreaEntityEffectComponent : Component
{
[DataField(required: true)]
public float Range = 1f;
/// <summary>
/// How many entities can be subject to EntityEffect? Leave 0 to remove the restriction.
/// </summary>
[DataField]
public int MaxTargets = 0;
[DataField(required: true, serverOnly: true)]
public List<CP14SpellEffect> Effects = new();
[DataField]
public EntityWhitelist? Whitelist;
}

View File

@@ -4,6 +4,9 @@ using Content.Shared._CP14.MagicEnergy.Components;
using Content.Shared._CP14.MagicSpell;
using Content.Shared._CP14.MagicSpell.Components;
using Content.Shared._CP14.MagicSpell.Events;
using Content.Shared._CP14.MagicSpell.Spells;
using Content.Shared.EntityEffects;
using Content.Shared.Whitelist;
using Robust.Server.GameObjects;
namespace Content.Server._CP14.MagicSpell;
@@ -13,11 +16,14 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly CP14MagicEnergySystem _magicEnergy = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<CP14AreaEntityEffectComponent, MapInitEvent>(OnAoEMapInit);
SubscribeLocalEvent<CP14MagicEffectVerbalAspectComponent, CP14VerbalAspectSpeechEvent>(OnSpellSpoken);
SubscribeLocalEvent<CP14MagicEffectCastingVisualComponent, CP14StartCastMagicEffectEvent>(OnSpawnMagicVisualEffect);
@@ -26,6 +32,28 @@ public sealed partial class CP14MagicSystem : CP14SharedMagicSystem
SubscribeLocalEvent<CP14MagicEffectManaCostComponent, CP14MagicEffectConsumeResourceEvent>(OnManaConsume);
}
private void OnAoEMapInit(Entity<CP14AreaEntityEffectComponent> ent, ref MapInitEvent args)
{
var entitiesAround = _lookup.GetEntitiesInRange(ent, ent.Comp.Range, LookupFlags.Uncontained);
var count = 0;
foreach (var entity in entitiesAround)
{
if (ent.Comp.Whitelist is not null && !_whitelist.IsValid(ent.Comp.Whitelist, entity))
continue;
foreach (var effect in ent.Comp.Effects)
{
effect.Effect(EntityManager, new CP14SpellEffectBaseArgs(ent, null, entity, Transform(entity).Coordinates));
}
count++;
if (ent.Comp.MaxTargets > 0 && count >= ent.Comp.MaxTargets)
break;
}
}
private void OnSpellSpoken(Entity<CP14MagicEffectVerbalAspectComponent> ent, ref CP14VerbalAspectSpeechEvent args)
{
if (args.Performer is not null && args.Speech is not null)

View File

@@ -1,166 +0,0 @@
using Content.Server._CP14.Alchemy;
using Content.Server.Popups;
using Content.Shared._CP14.MeleeWeapon.EntitySystems;
using Content.Shared._CP14.Skills;
using Content.Shared._CP14.Skills.Components;
using Content.Shared.Damage;
using Content.Shared.Examine;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Popups;
using Content.Shared.Throwing;
using Content.Shared.Weapons.Melee;
using Content.Shared.Weapons.Melee.Events;
using Content.Shared.Weapons.Ranged.Systems;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Server._CP14.Skills;
public sealed partial class CP14SkillSystem : SharedCP14SkillSystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly PopupSystem _popup = default!;
[Dependency] private readonly DamageableSystem _damageable = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly ThrowingSystem _throwing = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
public override void Initialize()
{
SubscribeLocalEvent<CP14SkillRequirementComponent, ExaminedEvent>(OnExamined);
SubscribeLocalEvent<CP14SkillRequirementComponent, GunShotEvent>(OnGunShot);
SubscribeLocalEvent<CP14SkillRequirementComponent, MeleeHitEvent>(OnMeleeHit);
SubscribeLocalEvent<CP14SkillRequirementComponent, CP14TrySkillIssueEvent>(OnSimpleSkillIssue);
SubscribeLocalEvent<CP14SkillRequirementComponent, SharpingEvent>(OnSharpning);
SubscribeLocalEvent<CP14SkillRequirementComponent, PestleGrindingEvent>(OnPestleGrinding);
}
private void OnExamined(Entity<CP14SkillRequirementComponent> requirement, ref ExaminedEvent args)
{
var text = string.Empty;
text += "\n" + Loc.GetString("cp14-skill-label") + "\n";
var canUse = HasEnoughSkillToUse(args.Examiner, requirement, out var missingSkills);
text += Loc.GetString(requirement.Comp.NeedAll ? "cp14-skill-examined-need-all" : "cp14-skill-examined", ("item", MetaData(requirement).EntityName)) + "\n";
foreach (var skill in requirement.Comp.RequiredSkills)
{
var name = _proto.Index(skill).Name;
if (name == null)
continue;
var color = missingSkills.Contains(skill) ? "#c23030" : "#3fc488";
text += Loc.GetString("cp14-skill-examined-skill", ("color", color), ("skill", Loc.GetString(name))) + "\n";
}
args.PushMarkup(text);
}
private void OnPestleGrinding(Entity<CP14SkillRequirementComponent> requirement, ref PestleGrindingEvent args)
{
if (!_random.Prob(requirement.Comp.FuckupChance))
return;
if (HasEnoughSkillToUse(args.User, requirement, out _))
return;
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-push", ("item", MetaData(args.Target).EntityName)),
args.User,
args.User,
PopupType.Large);
_hands.TryDrop(args.User, args.Target);
_throwing.TryThrow(args.Target, _random.NextAngle().ToWorldVec(), 1, args.User);
}
private void OnSharpning(Entity<CP14SkillRequirementComponent> requirement, ref SharpingEvent args)
{
if (!_random.Prob(requirement.Comp.FuckupChance))
return;
if (HasEnoughSkillToUse(args.User, requirement, out _))
return;
switch (_random.Next(2))
{
case 0:
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-sharp-weapon-harm", ("item", MetaData(args.Target).EntityName)), args.User, args.User, PopupType.Large);
var weaponDamage = new DamageSpecifier();
weaponDamage.DamageDict.Add("Blunt", _random.NextFloat(5));
_damageable.TryChangeDamage(args.Target, weaponDamage);
break;
case 1:
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-sharp-self-harm"), args.User, args.User, PopupType.Large);
var damage = new DamageSpecifier();
if (TryComp<MeleeWeaponComponent>(requirement, out var melee))
damage = melee.Damage;
else
damage.DamageDict.Add("Slash", _random.NextFloat(10));
_damageable.TryChangeDamage(args.User, damage);
break;
}
}
private void OnSimpleSkillIssue(Entity<CP14SkillRequirementComponent> requirement, ref CP14TrySkillIssueEvent args)
{
if (!_random.Prob(requirement.Comp.FuckupChance))
return;
if (HasEnoughSkillToUse(args.User, requirement, out _))
return;
BasicSkillIssue(args.User, requirement);
}
private void OnMeleeHit(Entity<CP14SkillRequirementComponent> requirement, ref MeleeHitEvent args)
{
if (!_random.Prob(requirement.Comp.FuckupChance))
return;
if (HasEnoughSkillToUse(args.User, requirement, out _))
return;
switch (_random.Next(2))
{
case 0:
BasicSkillIssue(args.User, requirement);
break;
case 1:
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-self-harm"), args.User, args.User, PopupType.Large);
var damage = new DamageSpecifier();
if (TryComp<MeleeWeaponComponent>(requirement, out var melee))
damage = melee.Damage;
else
damage.DamageDict.Add("Blunt", _random.NextFloat(10));
_damageable.TryChangeDamage(args.User, damage);
break;
}
}
private void OnGunShot(Entity<CP14SkillRequirementComponent> requirement, ref GunShotEvent args)
{
if (!_random.Prob(requirement.Comp.FuckupChance))
return;
if (HasEnoughSkillToUse(args.User, requirement, out _))
return;
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-recoil"), args.User, args.User, PopupType.Large);
_hands.TryDrop(args.User, requirement);
_throwing.TryThrow(requirement, _random.NextAngle().ToWorldVec(), _random.NextFloat(5), args.User);
var damage = new DamageSpecifier();
damage.DamageDict.Add("Blunt", _random.NextFloat(10));
_damageable.TryChangeDamage(args.User, damage);
}
private void BasicSkillIssue(EntityUid user, EntityUid item, float throwPower = 1)
{
_popup.PopupEntity(Loc.GetString("cp14-skill-issue-drops", ("item", MetaData(item).EntityName)), user, user, PopupType.Large);
_hands.TryDrop(user, item);
_throwing.TryThrow(item, _random.NextAngle().ToWorldVec(), throwPower, user);
}
}

View File

@@ -20,15 +20,23 @@ public sealed partial class CP14WorkbenchSystem
StartCraft(entity, args.Actor, prototype);
}
private void UpdateUIRecipes(Entity<CP14WorkbenchComponent> entity)
private void UpdateUIRecipes(Entity<CP14WorkbenchComponent> entity, EntityUid user)
{
var placedEntities = _lookup.GetEntitiesInRange(Transform(entity).Coordinates, entity.Comp.WorkbenchRadius);
var recipes = new List<CP14WorkbenchUiRecipesEntry>();
foreach (var recipeId in entity.Comp.Recipes)
{
var recipe = _proto.Index(recipeId);
var entry = new CP14WorkbenchUiRecipesEntry(recipeId, CanCraftRecipe(recipe, placedEntities));
if (!_proto.TryIndex(recipeId, out var indexedRecipe))
continue;
if (indexedRecipe.KnowledgeRequired is not null)
{
if (!_knowledge.HasKnowledge(user, indexedRecipe.KnowledgeRequired.Value))
continue;
}
var entry = new CP14WorkbenchUiRecipesEntry(recipeId, CanCraftRecipe(indexedRecipe, placedEntities, user));
recipes.Add(entry);
}

View File

@@ -6,6 +6,7 @@
using Content.Server.DoAfter;
using Content.Server.Popups;
using Content.Server.Stack;
using Content.Shared._CP14.Knowledge;
using Content.Shared._CP14.Workbench;
using Content.Shared._CP14.Workbench.Prototypes;
using Content.Shared.Chemistry.EntitySystems;
@@ -29,6 +30,7 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
[Dependency] private readonly UserInterfaceSystem _userInterface = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedCP14KnowledgeSystem _knowledge = default!;
private EntityQuery<MetaDataComponent> _metaQuery;
private EntityQuery<StackComponent> _stackQuery;
@@ -64,10 +66,9 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
private void OnBeforeUIOpen(Entity<CP14WorkbenchComponent> ent, ref BeforeActivatableUIOpenEvent args)
{
UpdateUIRecipes(ent);
UpdateUIRecipes(ent, args.User);
}
// TODO: Replace Del to QueueDel when it's will be works with events
private void OnCraftFinished(Entity<CP14WorkbenchComponent> ent, ref CP14CraftDoAfterEvent args)
{
if (args.Cancelled || args.Handled)
@@ -78,20 +79,26 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
var placedEntities = _lookup.GetEntitiesInRange(Transform(ent).Coordinates, ent.Comp.WorkbenchRadius, LookupFlags.Uncontained);
if (!CanCraftRecipe(recipe, placedEntities))
if (!CanCraftRecipe(recipe, placedEntities, args.User))
{
_popup.PopupEntity(Loc.GetString("cp14-workbench-no-resource"), ent, args.User);
_popup.PopupEntity(Loc.GetString("cp14-workbench-cant-craft"), ent, args.User);
return;
}
var resultEntity = Spawn(_proto.Index(args.Recipe).Result);
if (!_proto.TryIndex(args.Recipe, out var indexedRecipe))
return;
if (recipe.KnowledgeRequired is not null)
_knowledge.UseKnowledge(args.User, recipe.KnowledgeRequired.Value);
var resultEntity = Spawn(indexedRecipe.Result);
_stack.TryMergeToContacts(resultEntity);
_solutionContainer.TryGetSolution(resultEntity, recipe.Solution, out var resultSoln, out var resultSolution);
if (recipe.TryMergeSolutions && resultSoln is not null)
_solutionContainer.TryGetSolution(resultEntity, recipe.Solution, out var resultSolution, out _);
if (recipe.TryMergeSolutions && resultSolution is not null)
{
resultSoln.Value.Comp.Solution.MaxVolume = 0;
_solutionContainer.RemoveAllSolution(resultSoln.Value); //If we combine ingredient solutions, we do not use the default solution prescribed in the entity.
resultSolution.Value.Comp.Solution.MaxVolume = 0;
_solutionContainer.RemoveAllSolution(resultSolution.Value); //If we combine ingredient solutions, we do not use the default solution prescribed in the entity.
}
foreach (var requiredIngredient in recipe.Entities)
@@ -99,7 +106,8 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
var requiredCount = requiredIngredient.Value;
foreach (var placedEntity in placedEntities)
{
if (!TryComp<MetaDataComponent>(placedEntity, out var metaData) || metaData.EntityPrototype is null)
var metaData = MetaData(placedEntity);
if (metaData.EntityPrototype is null)
continue;
var placedProto = metaData.EntityPrototype.ID;
@@ -107,11 +115,11 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
{
// Trying merge solutions
if (recipe.TryMergeSolutions
&& resultSoln is not null
&& resultSolution is not null
&& _solutionContainer.TryGetSolution(placedEntity, recipe.Solution, out var ingredientSoln, out var ingredientSolution))
{
resultSoln.Value.Comp.Solution.MaxVolume += ingredientSoln.Value.Comp.Solution.MaxVolume;
_solutionContainer.TryAddSolution(resultSoln.Value, ingredientSolution);
resultSolution.Value.Comp.Solution.MaxVolume += ingredientSoln.Value.Comp.Solution.MaxVolume;
_solutionContainer.TryAddSolution(resultSolution.Value, ingredientSolution);
}
requiredCount--;
@@ -142,7 +150,7 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
}
}
_transform.SetCoordinates(resultEntity, Transform(ent).Coordinates);
UpdateUIRecipes(ent);
UpdateUIRecipes(ent, args.User);
args.Handled = true;
}
@@ -169,8 +177,13 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
_audio.PlayPvs(recipe.OverrideCraftSound ?? workbench.Comp.CraftSound, workbench);
}
private bool CanCraftRecipe(CP14WorkbenchRecipePrototype recipe, HashSet<EntityUid> entities)
private bool CanCraftRecipe(CP14WorkbenchRecipePrototype recipe, HashSet<EntityUid> entities, EntityUid user)
{
//Knowledge check
if (recipe.KnowledgeRequired is not null && !_knowledge.HasKnowledge(user, recipe.KnowledgeRequired.Value))
return false;
//Ingredients check
var indexedIngredients = IndexIngredients(entities);
foreach (var requiredIngredient in recipe.Entities)
{
@@ -199,25 +212,6 @@ public sealed partial class CP14WorkbenchSystem : SharedCP14WorkbenchSystem
return true;
}
private string GetCraftRecipeMessage(string desc, CP14WorkbenchRecipePrototype recipe)
{
var result = desc + "\n \n" + Loc.GetString("cp14-workbench-recipe-list")+ "\n";
foreach (var pair in recipe.Entities)
{
var proto = _proto.Index(pair.Key);
result += $"{proto.Name} x{pair.Value}\n";
}
foreach (var pair in recipe.Stacks)
{
var proto = _proto.Index(pair.Key);
result += $"{proto.Name} x{pair.Value}\n";
}
return result;
}
private Dictionary<EntProtoId, int> IndexIngredients(HashSet<EntityUid> ingredients)
{
var indexedIngredients = new Dictionary<EntProtoId, int>();

View File

@@ -95,5 +95,11 @@ namespace Content.Shared.Verbs
public static readonly VerbCategory CP14RitualBook = new("cp14-verb-categories-ritual-book", null); //CP14
public static readonly VerbCategory CP14CurrencyConvert = new("cp14-verb-categories-currency-converter", null); //CP14
public static readonly VerbCategory CP14KnowledgeAdd = new("cp14-verb-categories-knowledge-add", null); //CP14
public static readonly VerbCategory CP14KnowledgeRemove = new("cp14-verb-categories-knowledge-remove", null); //CP14
public static readonly VerbCategory CP14KnowledgeLearn = new("cp14-verb-categories-knowledge-learn", null); //CP14
}
}

View File

@@ -0,0 +1,14 @@
using Content.Shared._CP14.Knowledge.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Knowledge.Components;
/// <summary>
/// The ability to add a skill to an entity and quickly teach it some skills
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
public sealed partial class CP14AutoAddKnowledgeComponent : Component
{
[DataField]
public List<ProtoId<CP14KnowledgePrototype>> Knowledge = new();
}

View File

@@ -0,0 +1,17 @@
using Content.Shared._CP14.Knowledge.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Knowledge.Components;
/// <summary>
/// Allows new knowledge to be learnt through interactions with an object.
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
public sealed partial class CP14KnowledgeLearningSourceComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadOnly)]
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledges { get; private set; } = new();
[DataField]
public TimeSpan DoAfter = TimeSpan.FromSeconds(5f);
}

View File

@@ -0,0 +1,10 @@
namespace Content.Shared._CP14.Knowledge.Components;
/// <summary>
/// automatically generates content for PaperComponent, based on the knowledge that can be learnt from this object
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
public sealed partial class CP14KnowledgePaperTextComponent : Component
{
}

View File

@@ -0,0 +1,14 @@
using Content.Shared._CP14.Knowledge.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Knowledge.Components;
/// <summary>
/// a list of skills learned by this entity
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14KnowledgeSystem))]
public sealed partial class CP14KnowledgeStorageComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadOnly)]
public HashSet<ProtoId<CP14KnowledgePrototype>> Knowledges { get; private set; } = new();
}

View File

@@ -0,0 +1,26 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Knowledge.Prototypes;
/// <summary>
/// Abstract knowledge that may be required to use items or crafts.
/// </summary>
[Prototype("CP14Knowledge")]
public sealed partial class CP14KnowledgePrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
[DataField(required: true)]
public LocId Name { get; private set; } = default!;
[DataField]
public LocId Desc{ get; private set; } = default!;
/// <summary>
/// to study this knowledge, other knowledge on which it is based may be necessary.
/// </summary>
[DataField]
public HashSet<ProtoId<CP14KnowledgePrototype>> Dependencies = new();
}

View File

@@ -0,0 +1,94 @@
using System.Text;
using Content.Shared._CP14.Knowledge.Components;
using Content.Shared._CP14.Knowledge.Prototypes;
using Content.Shared.DoAfter;
using Content.Shared.MagicMirror;
using Content.Shared.Paper;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared._CP14.Knowledge;
public abstract partial class SharedCP14KnowledgeSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly PaperSystem _paper = default!;
public override void Initialize()
{
SubscribeLocalEvent<CP14KnowledgePaperTextComponent, MapInitEvent>(OnPaperMapInit);
}
private void OnPaperMapInit(Entity<CP14KnowledgePaperTextComponent> ent, ref MapInitEvent args)
{
if (!TryComp<PaperComponent>(ent, out var paper))
return;
if (!TryComp<CP14KnowledgeLearningSourceComponent>(ent, out var knowledge))
return;
if (knowledge.Knowledges.Count <= 0)
return;
var sb = new StringBuilder();
sb.Append(Loc.GetString("cp14-knowledge-book-pre-text"));
foreach (var k in knowledge.Knowledges)
{
if (!_proto.TryIndex(k, out var indexedKnowledge))
continue;
sb.Append($"\n{Loc.GetString(indexedKnowledge.Desc)}");
}
sb.Append($"\n\n{Loc.GetString("cp14-knowledge-book-post-text")}");
_paper.SetContent((ent, paper), sb.ToString());
paper.EditingDisabled = true;
}
public bool UseKnowledge(EntityUid uid,
ProtoId<CP14KnowledgePrototype> knowledge,
float factor = 1f,
CP14KnowledgeStorageComponent? knowledgeStorage = null)
{
if (!Resolve(uid, ref knowledgeStorage, false))
return false;
if (!knowledgeStorage.Knowledges.Contains(knowledge))
return false;
var ev = new CP14KnowledgeUsedEvent(uid, knowledge, factor);
RaiseLocalEvent(uid, ev);
return true;
}
public bool HasKnowledge(EntityUid uid,
ProtoId<CP14KnowledgePrototype> knowledge,
CP14KnowledgeStorageComponent? knowledgeStorage = null)
{
if (!Resolve(uid, ref knowledgeStorage, false))
return false;
return knowledgeStorage.Knowledges.Contains(knowledge);
}
}
public sealed class CP14KnowledgeUsedEvent : EntityEventArgs
{
public readonly EntityUid User;
public readonly ProtoId<CP14KnowledgePrototype> Knowledge;
public readonly float Factor;
public CP14KnowledgeUsedEvent(EntityUid uid, ProtoId<CP14KnowledgePrototype> knowledge, float factor)
{
User = uid;
Knowledge = knowledge;
Factor = factor;
}
}
[Serializable, NetSerializable]
public sealed partial class CP14KnowledgeLearnDoAfterEvent : DoAfterEvent
{
public ProtoId<CP14KnowledgePrototype> Knowledge;
public override DoAfterEvent Clone() => this;
}

View File

@@ -15,7 +15,7 @@ public sealed partial class CP14MagicEnergyPhotosynthesisComponent : Component
[DataField]
[GuidebookData]
public FixedPoint2 DarknessEnergy = -0.25f;
public FixedPoint2 DarknessEnergy = 0f;
/// <summary>
/// how often objects will try to change magic energy. In Seconds

View File

@@ -26,7 +26,7 @@ public abstract partial class CP14SharedMagicSystem
var fromItem = action.Comp.SpellStorage is not null;
var doAfterEventArgs = new DoAfterArgs(EntityManager, performer, MathF.Max(delayedEffect.CastDelay, 1f), doAfter, action, used: action.Comp.SpellStorage, target: doAfter.Target)
var doAfterEventArgs = new DoAfterArgs(EntityManager, performer, MathF.Max(delayedEffect.CastDelay, 1f), doAfter, action, used: action.Comp.SpellStorage)
{
BreakOnMove = delayedEffect.BreakOnMove,
BreakOnDamage = delayedEffect.BreakOnDamage,
@@ -56,7 +56,7 @@ public abstract partial class CP14SharedMagicSystem
_action.CP14StartCustomDelay(action, TimeSpan.FromSeconds(cooldown.Value));
}
private void UseDelayedAction(ICP14DelayedMagicEffect delayedEffect, Entity<CP14MagicEffectComponent> action, DoAfterEvent doAfter, EntityUid performer)
private void UseDelayedAction(ICP14DelayedMagicEffect delayedEffect, Entity<CP14MagicEffectComponent> action, DoAfterEvent doAfter, EntityUid performer, EntityUid? target = null, EntityCoordinates? worldTarget = null)
{
if (!CanCastSpell(action, performer))
return;
@@ -71,7 +71,7 @@ public abstract partial class CP14SharedMagicSystem
RaiseLocalEvent(action, ref evStart);
var spellArgs =
new CP14SpellEffectBaseArgs(performer, action.Comp.SpellStorage, performer, Transform(performer).Coordinates);
new CP14SpellEffectBaseArgs(performer, action.Comp.SpellStorage, target, worldTarget);
CastTelegraphy(action, spellArgs);
}
@@ -93,7 +93,7 @@ public abstract partial class CP14SharedMagicSystem
return;
var doAfter = new CP14DelayedInstantActionDoAfterEvent(args.Cooldown);
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer);
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Performer);
args.Handled = true;
}
@@ -116,7 +116,7 @@ public abstract partial class CP14SharedMagicSystem
EntityManager.GetNetCoordinates(args.Coords),
EntityManager.GetNetEntity(args.Entity),
args.Cooldown);
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer);
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Entity, args.Coords);
args.Handled = true;
}
@@ -136,7 +136,7 @@ public abstract partial class CP14SharedMagicSystem
return;
var doAfter = new CP14DelayedEntityTargetActionDoAfterEvent(EntityManager.GetNetEntity(args.Target), args.Cooldown);
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer);
UseDelayedAction(delayedEffect, (args.Action, magicEffect), doAfter, args.Performer, args.Target);
args.Handled = true;
}

View File

@@ -72,7 +72,7 @@ public abstract partial class CP14SharedMagicSystem
var fromItem = action.Comp.SpellStorage is not null;
var doAfterEventArgs = new DoAfterArgs(EntityManager, performer, toggleable.CastTime, doAfter, action, used: action.Comp.SpellStorage, target: entityTarget)
var doAfterEventArgs = new DoAfterArgs(EntityManager, performer, toggleable.CastTime, doAfter, action, used: action.Comp.SpellStorage)
{
BreakOnMove = toggleable.BreakOnMove,
BreakOnDamage = toggleable.BreakOnDamage,

View File

@@ -13,7 +13,7 @@ public sealed partial class CP14SpellConsumeManaEffect : CP14SpellEffect
public bool Safe = false;
[DataField]
public float LossMultiplier = 0.8f;
public float LossMultiplier = 1.0f;
public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args)
{

View File

@@ -42,6 +42,9 @@ public sealed partial class CP14SpellStorageSystem
private void OnClothingAddedAttune(Entity<CP14SpellStorageAccessWearingComponent> ent, ref AddedAttuneToMindEvent args)
{
if (!ent.Comp.Wearing)
return;
if (!TryComp<CP14SpellStorageComponent>(ent, out var spellStorage))
return;
@@ -51,7 +54,7 @@ public sealed partial class CP14SpellStorageSystem
if (!TryComp<ClothingComponent>(ent, out var clothing))
return;
if (clothing.InSlot is null || Transform(ent).ParentUid != args.User)
if (Transform(ent).ParentUid != args.User)
return;
TryGrantAccess((ent, spellStorage), args.User.Value);
@@ -59,6 +62,8 @@ public sealed partial class CP14SpellStorageSystem
private void OnClothingEquipped(Entity<CP14SpellStorageAccessWearingComponent> ent, ref ClothingGotEquippedEvent args)
{
ent.Comp.Wearing = true;
if (!TryComp<CP14SpellStorageComponent>(ent, out var spellStorage))
return;
@@ -67,7 +72,8 @@ public sealed partial class CP14SpellStorageSystem
private void OnClothingUnequipped(Entity<CP14SpellStorageAccessWearingComponent> ent, ref ClothingGotUnequippedEvent args)
{
ent.Comp.Wearing = false;
_actions.RemoveProvidedActions(args.Wearer, ent);
}
}

View File

@@ -6,4 +6,6 @@ namespace Content.Shared._CP14.MagicSpellStorage.Components;
[RegisterComponent, Access(typeof(CP14SpellStorageSystem))]
public sealed partial class CP14SpellStorageAccessWearingComponent : Component
{
[DataField]
public bool Wearing;
}

View File

@@ -1,26 +0,0 @@
using Content.Shared._CP14.Skills.Prototypes;
using Content.Shared.Roles;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Skills.Components;
/// <summary>
/// a component that can be hung on an entity to immediately teach it some skills
/// </summary>
[UsedImplicitly]
public sealed partial class CP14AddSkillSpecial : JobSpecial
{
[DataField, ViewVariables(VVAccess.ReadOnly)]
public List<ProtoId<CP14SkillPrototype>> Skills = new();
public override void AfterEquip(EntityUid mob)
{
var entMan = IoCManager.Resolve<IEntityManager>();
var skillSystem = entMan.System<SharedCP14SkillSystem>();
foreach (var skill in Skills)
{
skillSystem.TryLearnSkill(mob, skill);
}
}
}

View File

@@ -1,14 +0,0 @@
using Content.Shared._CP14.Skills.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Skills.Components;
/// <summary>
/// The ability to add a skill to an entity and quickly teach it some skills
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14SkillSystem))]
public sealed partial class CP14AutoAddSkillComponent : Component
{
[DataField]
public List<ProtoId<CP14SkillPrototype>> Skills = new();
}

View File

@@ -1,27 +0,0 @@
using Content.Shared._CP14.Skills.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Skills.Components;
/// <summary>
/// Limits the use of this entity behind certain skills
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14SkillSystem))]
public sealed partial class CP14SkillRequirementComponent : Component
{
/// <summary>
/// Is it necessary to have ALL the skills on the list to be able to use this entity?
/// If not, one of any skill will suffice
/// </summary>
[DataField]
public bool NeedAll = false;
/// <summary>
/// the chances of something going wrong when using wihout skill
/// </summary>
[DataField]
public float FuckupChance = 0.5f;
[DataField(required: true)]
public List<ProtoId<CP14SkillPrototype>> RequiredSkills = new();
}

View File

@@ -1,14 +0,0 @@
using Content.Shared._CP14.Skills.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Skills.Components;
/// <summary>
/// a list of skills learned by this entity
/// </summary>
[RegisterComponent, Access(typeof(SharedCP14SkillSystem))]
public sealed partial class CP14SkillsStorageComponent : Component
{
[DataField, ViewVariables(VVAccess.ReadOnly)]
public List<ProtoId<CP14SkillPrototype>> Skills { get; private set; }= new();
}

View File

@@ -1,23 +0,0 @@
using Robust.Shared.Prototypes;
namespace Content.Shared._CP14.Skills.Prototypes;
/// <summary>
///
/// </summary>
[Prototype("CP14Skill")]
public sealed partial class CP14SkillPrototype : IPrototype
{
[ViewVariables]
[IdDataField]
public string ID { get; private set; } = default!;
[DataField(required: true)]
public LocId? Name{ get; private set; }
[DataField]
public LocId? Desc{ get; private set; }
[DataField]
public ComponentRegistry Components = new();
}

View File

@@ -1,114 +0,0 @@
using Content.Shared._CP14.Skills.Components;
using Content.Shared._CP14.Skills.Prototypes;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
namespace Content.Shared._CP14.Skills;
public partial class SharedCP14SkillSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
public override void Initialize()
{
SubscribeLocalEvent<CP14SkillsStorageComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<CP14AutoAddSkillComponent, MapInitEvent>(AutoAddSkill);
}
private void AutoAddSkill(Entity<CP14AutoAddSkillComponent> ent, ref MapInitEvent args)
{
foreach (var skill in ent.Comp.Skills)
{
TryLearnSkill(ent, skill);
}
RemComp(ent, ent.Comp);
}
private void OnMapInit(Entity<CP14SkillsStorageComponent> ent, ref MapInitEvent args)
{
foreach (var skill in ent.Comp.Skills)
{
TryLearnSkill(ent, skill, force: true);
}
}
public bool HasEnoughSkillToUse(EntityUid user, EntityUid target, out List<ProtoId<CP14SkillPrototype>> missingSkills)
{
missingSkills = new();
if (!TryComp<CP14SkillRequirementComponent>(target, out var requirement) || requirement.RequiredSkills.Count == 0)
return true;
if (!TryComp<CP14SkillsStorageComponent>(user, out var skillStorage))
{
missingSkills = requirement.RequiredSkills;
return false;
}
var success = requirement.NeedAll;
foreach (var skill in requirement.RequiredSkills)
{
var hasSkill = skillStorage.Skills.Contains(skill);
if (requirement.NeedAll && !hasSkill)
{
missingSkills.Add(skill);
success = false;
}
else if (!requirement.NeedAll && hasSkill)
{
success = true;
}
else if (!requirement.NeedAll && !hasSkill)
{
missingSkills.Add(skill);
}
}
return success;
}
public bool TryLearnSkill(EntityUid uid, ProtoId<CP14SkillPrototype> skill, bool force = false)
{
if (!TryComp<CP14SkillsStorageComponent>(uid, out var skillStorage))
return false;
if (!skillStorage.Skills.Contains(skill))
{
skillStorage.Skills.Add(skill);
if (!force)
return false;
}
var proto = _proto.Index(skill);
EntityManager.AddComponents(uid, proto.Components);
return true;
}
public bool TryForgotSkill(EntityUid uid, ProtoId<CP14SkillPrototype> skill)
{
if (!TryComp<CP14SkillsStorageComponent>(uid, out var skillStorage))
return false;
if (!skillStorage.Skills.Contains(skill))
return false;
skillStorage.Skills.Remove(skill);
var proto = _proto.Index(skill);
EntityManager.RemoveComponents(uid, proto.Components);
return true;
}
}
public sealed partial class CP14TrySkillIssueEvent : EntityEventArgs
{
public readonly EntityUid User;
public CP14TrySkillIssueEvent(EntityUid uid)
{
User = uid;
}
}

View File

@@ -30,7 +30,6 @@ public sealed class CP14WorkbenchUiCraftMessage : BoundUserInterfaceMessage
[Serializable, NetSerializable]
public sealed class CP14WorkbenchUiRecipesState : BoundUserInterfaceState
{
// It's list (not hashset) BECAUSE CP14WorkbenchComponent contains list of recipes (WHY???)
public readonly List<CP14WorkbenchUiRecipesEntry> Recipes;
public CP14WorkbenchUiRecipesState(List<CP14WorkbenchUiRecipesEntry> recipes)

View File

@@ -3,6 +3,7 @@
* https://github.com/space-wizards/space-station-14/blob/master/LICENSE.TXT
*/
using Content.Shared._CP14.Knowledge.Prototypes;
using Content.Shared.Stacks;
using Content.Shared.Tag;
using Robust.Shared.Audio;
@@ -39,4 +40,10 @@ public sealed class CP14WorkbenchRecipePrototype : IPrototype
[DataField]
public string Solution = "food";
/// <summary>
/// If the player does not have this knowledge, the recipe will not be displayed in the workbench.
/// </summary>
[DataField]
public ProtoId<CP14KnowledgePrototype>? KnowledgeRequired;
}

View File

@@ -10,7 +10,7 @@ using Robust.Shared.Serialization;
namespace Content.Shared._CP14.Workbench;
public class SharedCP14WorkbenchSystem : EntitySystem
public abstract class SharedCP14WorkbenchSystem : EntitySystem
{
}

View File

@@ -0,0 +1,18 @@
cp14-skill-label = [bold]Skill requirements[/bold]
cp14-skill-examined = You need to have one of the following skills to use {$item}:
cp14-skill-examined-need-all = You need to have all of the following skills in order to use {$item}:
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]
cp14-verb-categories-knowledge-add = Add knowledge:
cp14-verb-categories-knowledge-remove = Delete knowledge:
cp14-verb-categories-knowledge-learn = Learn knowledge:
cp14-learned-new-knowledge = You have learned the knowledge of [bold]"{$name}[/bold]"!
cp14-forgot-knowledge = You've lost your knowledge of [bold]"{$name}[/bold]"!
cp14-cant-learn-knowledge-dependencies =
You were unable to understand {$target}...
You lack the following knowledge:
cp14-knowledge-book-pre-text = Here you will find detailed instructions that explain
cp14-knowledge-book-post-text = (To explore this knowledge, right-click on the book, and select Learn Knowledge)

View File

@@ -0,0 +1,24 @@
# T1
cp14-knowledge-sewing-name = Clothing sewing
cp14-knowledge-sewing-desc = how to make simple clothes on sewing table
cp14-knowledge-wallpaper-name = Wallpaper production
cp14-knowledge-wallpaper-desc = how to create wallpaper on sewing table
cp14-knowledge-woodwork-name = Woodwork
cp14-knowledge-woodwork-desc = how to make simple objects out of wood
cp14-knowledge-metall-melting-name = Metall melting
cp14-knowledge-metall-melting-desc = how to smelt ore into valuable metals
cp14-knowledge-metall-forging-name = Metall forging
cp14-knowledge-metall-forging-desc = how to forge metal into different shapes
cp14-knowledge-metall-glasswork-name = Glasswork
cp14-knowledge-metall-glasswork-desc = how to work with glass.
# T2
cp14-knowledge-sewing2-name = Advanced clothing sewing
cp14-knowledge-sewing2-desc = how to create quality clothes on sewing table

View File

@@ -1,7 +1,12 @@
cp14-material-wooden-planks = wooden planks
cp14-material-dirt-block = dirt
cp14-material-stone-block = stone
cp14-material-nail = nails
cp14-material-cloth = cloth
cp14-material-copper = copper
cp14-material-iron = iron
cp14-material-gold = gold
cp14-material-mithril = mithril
cp14-material-lucens-planks = lucens planks
cp14-material-cloth = cloth
cp14-material-flora = flora material
cp14-material-ash = ash

View File

@@ -0,0 +1,2 @@
# powder pile
cp14-materials-unit-pile = pile

View File

@@ -1,5 +0,0 @@
cp14-skill-label = [bold]Skill requirements[/bold]
cp14-skill-examined = You need to have one of the following skills to use {$item}:
cp14-skill-examined-need-all = You need to have all of the following skills in order to use {$item}:
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]

View File

@@ -1,11 +0,0 @@
cp14-skill-name-alchemy = Alchemy
cp14-skill-desc-alchemy = You are experienced enough to use complex alchemical equipment with confidence.
cp14-skill-name-blacksmith = Blacksmithing
cp14-skill-desc-blacksmith = You know the intricacies of working with metal
cp14-skill-name-warcraft = Mastery of martial weapons
cp14-skill-desc-warcraft = You're good with a serious, martial weapon.
cp14-skill-name-firearms = Firearms shooting
cp14-skill-desc-firearms = You are experienced enough to use firearms.

View File

@@ -13,3 +13,5 @@ cp14-stack-mithril-bars = mithril bars
cp14-stack-wallpaper = rolls of wallpaper
cp14-stack-glass-sheet = glass
cp14-stack-ash-pile = pile of ashes

View File

@@ -21,12 +21,4 @@ cp14-trait-snoring-name = Loud snoring
cp14-trait-snoring-desc = It is simply impossible to sleep next to you because you snore terribly loudly at everything.
cp14-trait-mana-wasting-name = Magical mediocrity.
cp14-trait-mana-wasting-desc = Fate has decreed that magic is just an empty sound for you. You are unable to store or use magical energy.
# Backgrounds
cp14-trait-bg-entertainer-name = Entertainer
cp14-trait-bg-entertainer-desc = You have to thrive in front of an audience. You know the way how to entertain them, entrance them and also even how to inspire them. Your poetics able to stir the hearts like those who awakening grief or joy, anger or laughter. Their spirits can be raised by your music and also it captures their sorrow. Actually, your dance steps are captivate and also your humor will cuts to the quick. Finally, your art is your life whatever the techniques you use.
cp14-trait-bg-soldier-name = Soldier
cp14-trait-bg-soldier-desc = War has been your life for as long as you care to remember. You trained as a youth, studied the use of weapons and armor, learned basic survival techniques, including how to stay alive on the battlefield. You might have been part of a standing national army or a mercenary company, or perhaps a member of a local militia who rose to prominence during a recent war.
cp14-trait-mana-wasting-desc = Fate has decreed that magic is just an empty sound for you. You are unable to store or use magical energy.

View File

@@ -3,4 +3,4 @@ cp14-workbench-ui-title = Item creation
cp14-workbench-craft = Craft
cp14-workbench-recipe-list = Recipe:
cp14-workbench-no-resource = There aren't enough ingredients!
cp14-workbench-cant-craft = Craft failed!

View File

@@ -181,7 +181,7 @@ ent-CP14RuneFireball = { ent-CP14BaseMagicRune }
ent-CP14ImpactEffectFireball = { ent-CP14BaseMagicImpact }
.desc = { ent-CP14BaseMagicImpact.desc }
ent-CP14Fireball = исскуственное пламя
ent-CP14Fireball = искусственное пламя
ent-CP14SpellScrollFireball = свиток заклинания огненного шара
.desc = { ent-CP14BaseSpellScrollFire.desc }
@@ -276,7 +276,7 @@ ent-CP14SpellScrollFlashLight = свиток заклинания ослепля
ent-CP14ActionSpellManaConsume = Поглощение маны
.desc = Вы поглощаете небольшое количество маны у цели.
ent-CP14ActionSpellManaConsumeElf = Аккуратное поглощние маны
ent-CP14ActionSpellManaConsumeElf = Аккуратное поглощение маны
.desc = Вы поглощаете небольшое количество маны у цели аккуратно и без потерь.
ent-CP14RuneManaConsume = { ent-CP14BaseMagicRune }
@@ -358,7 +358,7 @@ ent-CP14ActionSpellIceShards = Ледяные осколки
ent-CP14RuneIceShards = { ent-CP14BaseMagicRune }
.desc = { ent-CP14BaseMagicRune.desc }
ent-CP14IceShard = ice shard
ent-CP14IceShard = ледяной осколок
ent-CP14SpellScrollIceShards = свиток заклинания ледяных осколков
.desc = { ent-CP14BaseSpellScrollWater.desc }
@@ -469,7 +469,7 @@ ent-CP14ClothingHeadBeretBlack = черный берет
.desc = { ent-CP14ClothingHeadBeretBase.desc }
ent-CP14ClothingHeadBandanaBase = { ent-CP14ClothingHeadBase }
.desc = Favorite mage headdress
.desc = Любимый головной убор магов
ent-CP14ClothingHeadBandanaWhite = белая бандана
.desc = { ent-CP14ClothingHeadBandanaBase.desc }
@@ -513,10 +513,10 @@ ent-CP14ClothingPantsTrouserDarkBlue = темные штаны
.desc = Широкие, свободные штаны из простой холщовой ткани.
ent-CP14ClothingPantsLoincloth = набедренная повязка
.desc = Свободные, ничего не мешает, да еще и выглядят экстремально брутально
.desc = Свободные, ничего не мешает, да еще и выглядят экстремально брутально.
ent-CP14ClothingDressBlack = черное платье
.desc = Просторная женское платье
.desc = Просторная женское платье.
ent-CP14ClothingPantsMercenaryTrousers = брюки наемника
.desc = Разноцветные брюки наемника. Не порвите их.
@@ -536,7 +536,7 @@ ent-CP14ClothingRingFlashLight = проводящее кольцо вспышк
.desc = Стандартное манапроводящее кольцо, позволяющее вызвать яркую ослепляющую вспышку света.
.suffix = Вспышка света
ent-CP14ClothingShirtBase = None
ent-CP14ClothingShirtBase = рубашка
.desc = Приятный на ощупь материал, удобная свободная форма рубашки.
ent-CP14ClothingShirtBanker = рубашка банкира
@@ -708,23 +708,23 @@ ent-CP14MobUndeadZombie = ходячий труп
ent-CP14MobUndeadZombieGearEasy1 = { ent-CP14MobUndeadZombie }
.desc = { ent-CP14MobUndeadZombie.desc }
.suffix = Zombie. Easy
.suffix = Зомби. Легкий
ent-CP14MobUndeadZombieGearEasy2 = { ent-CP14MobUndeadZombie }
.desc = { ent-CP14MobUndeadZombie.desc }
.suffix = Zombie. Easy
.suffix = Зомби. Легкий
ent-CP14MobUndeadZombieGearEasy3 = { ent-CP14MobUndeadZombie }
.desc = { ent-CP14MobUndeadZombie.desc }
.suffix = Zombie. Easy
.suffix = Зомби. Легкий
ent-CP14MobUndeadZombieGearMedium1 = { ent-CP14MobUndeadZombie }
.desc = { ent-CP14MobUndeadZombie.desc }
.suffix = Zombie. Medium
.suffix = Зомби. Средний
ent-CP14MobUndeadZombieGearMedium2 = { ent-CP14MobUndeadZombie }
.desc = { ent-CP14MobUndeadZombie.desc }
.suffix = Zombie. Medium
.suffix = Зомби. Средний
ent-CP14MobDwarf = мистер Дварф
@@ -869,7 +869,7 @@ ent-CP14FoodCheesePart = сыр
.desc = Треугольник мягкого, ароматного сыра.
ent-CP14FoodCheeseSlice = долька сыра
.desc = A thin slice of delicious smelling cheese.
.desc = Тонкий ломтик вкусно пахнущего сыра.
ent-CP14FoodDoughLarge = большой кусок теста
.desc = Идеальный ингредиент для любого мучного изделия. Остается только придать ему форму.
@@ -1140,43 +1140,43 @@ ent-CP14KeyPersonalHouseAbstractLoadoutDummy = Ключ к случайному
ent-CP14KeyPersonalHouse1 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse1
.suffix = Личный дом 1
ent-CP14KeyPersonalHouse2 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse2
.suffix = Личный дом 2
ent-CP14KeyPersonalHouse3 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse3
.suffix = Личный дом 3
ent-CP14KeyPersonalHouse4 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse4
.suffix = Личный дом 4
ent-CP14KeyPersonalHouse5 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse5
.suffix = Личный дом 5
ent-CP14KeyPersonalHouse6 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse6
.suffix = Личный дом 6
ent-CP14KeyPersonalHouse7 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse7
.suffix = Личный дом 7
ent-CP14KeyPersonalHouse8 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse8
.suffix = Личный дом 8
ent-CP14KeyPersonalHouse9 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse9
.suffix = Личный дом 9
ent-CP14KeyPersonalHouse10 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = PersonalHouse10
.suffix = Личный дом 10
ent-CP14KeyTavernHall = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
@@ -1192,23 +1192,23 @@ ent-CP14KeyTavernDormsAbstract = { ent-CP14BaseKey }
ent-CP14KeyTavernDorms1 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = Tavern Dorms 1
.suffix = Общежития таверны 1
ent-CP14KeyTavernDorms2 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = Tavern Dorms 2
.suffix = Общежития таверны 2
ent-CP14KeyTavernDorms3 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = Tavern Dorms 3
.suffix = Общежития таверны 3
ent-CP14KeyTavernDorms4 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = Tavern Dorms 4
.suffix = Общежития таверны 4
ent-CP14KeyTavernDorms5 = { ent-CP14BaseKey }
.desc = { ent-CP14BaseKey.desc }
.suffix = Tavern Dorms 5
.suffix = Общежития таверны 5
ent-CP14CopperBar1 = медный слиток
.desc = Тяжелый, слегка зеленый кусок обработанной меди.
@@ -1352,7 +1352,7 @@ ent-CP14Cloth10 = { ent-CP14Cloth1 }
.suffix = 10
ent-CP14ModularGripShort = None
.desc = Короткая рукоять для оружия или инстумента.
.desc = Короткая рукоять для оружия или инструмента.
ent-CP14ModularGripLong = None
.desc = Длинная, двуручная рукоять для тяжелого оружия или больших инструментов.
@@ -1790,102 +1790,102 @@ ent-CP14Chasm = бездна
ent-CP14WallmountCrystalRubies = { ent-CP14WallmountCrystalBase }
.desc = { ent-CP14WallmountCrystalBase.desc }
.suffix = Red
.suffix = Красный
ent-CP14WallmountCrystalTopazes = { ent-CP14WallmountCrystalBase }
.desc = { ent-CP14WallmountCrystalBase.desc }
.suffix = Yellow
.suffix = Жёлтый
ent-CP14WallmountCrystalEmeralds = { ent-CP14WallmountCrystalBase }
.desc = { ent-CP14WallmountCrystalBase.desc }
.suffix = Green
.suffix = Зеленый
ent-CP14WallmountCrystalSapphires = { ent-CP14WallmountCrystalBase }
.desc = { ent-CP14WallmountCrystalBase.desc }
.suffix = Cyan
.suffix = Голубой
ent-CP14WallmountCrystalAmethysts = { ent-CP14WallmountCrystalBase }
.desc = { ent-CP14WallmountCrystalBase.desc }
.suffix = Purple
.suffix = Фиолетовый
ent-CP14WallmountCrystalDiamonds = { ent-CP14WallmountCrystalBase }
.desc = { ent-CP14WallmountCrystalBase.desc }
.suffix = White
.suffix = Белый
ent-CP14CrystalBase = сверкающий кварц
.desc = Биолюминесцентные кристаллы кварца, которые могут принимать любой цвет, - очень удобный источник света в глубоких пещерах. К сожалению, светящиеся свойства очень трудно сохранить.
ent-CP14CrystalRubiesSmall = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Red, Small
.suffix = Красный, Малый
ent-CP14CrystalRubiesMedium = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Red, Medium
.suffix = Красный, Средний
ent-CP14CrystalRubiesBig = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Red, Big
.suffix = Красный, Большой
ent-CP14CrystalTopazesSmall = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Yellow, Small
.suffix = Жёлтый, Малый
ent-CP14CrystalTopazesMedium = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Yellow, Medium
.suffix = Жёлтый, Средний
ent-CP14CrystalTopazesBig = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Yellow, Big
.suffix = Жёлтый, Большой
ent-CP14CrystalEmeraldsSmall = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Green, Small
.suffix = Зеленый, Малый
ent-CP14CrystalEmeraldsMedium = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Green, Medium
.suffix = Зеленый, Средний
ent-CP14CrystalEmeraldsBig = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Green, Big
.suffix = Зеленый, Большой
ent-CP14CrystalSapphiresSmall = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Cyan, Small
.suffix = Голубой, Малый
ent-CP14CrystalSapphiresMedium = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Cyan, Medium
.suffix = Голубой, Средний
ent-CP14CrystalSapphiresBig = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Cyan, Big
.suffix = Голубой, Большой
ent-CP14CrystalAmethystsSmall = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Purple, Small
.suffix = Фиолетовый, Малый
ent-CP14CrystalAmethystsMedium = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Purple, Medium
.suffix = Фиолетовый, Средний
ent-CP14CrystalAmethystsBig = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = Purple, Big
.suffix = Фиолетовый, Большой
ent-CP14CrystalDiamondsSmall = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = White, Small
.suffix = Белый, Малый
ent-CP14CrystalDiamondsMedium = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = White, Medium
.suffix = Белый, Средний
ent-CP14CrystalDiamondsBig = { ent-CP14CrystalBase }
.desc = { ent-CP14CrystalBase.desc }
.suffix = White, Big
.suffix = Белый, Большой
ent-CP14LaddersDownBase = лестница вниз
.desc = Темные глубины подземного мира зовут вас.
@@ -1901,11 +1901,11 @@ ent-CP14LaddersUpStone = { ent-CP14LaddersUpBase }
ent-CP14LaddersDownStoneAutoLink = { ent-CP14LaddersDownStone }
.desc = { ent-CP14LaddersDownStone.desc }
.suffix = Stone
.suffix = Камень
ent-CP14LaddersUpStoneAutoLink = { ent-CP14LaddersUpStone }
.desc = { ent-CP14LaddersUpStone.desc }
.suffix = Stone
.suffix = Камень
ent-CP14LaddersDownWood = { ent-CP14LaddersDownBase }
.desc = { ent-CP14LaddersDownBase.desc }
@@ -1915,11 +1915,11 @@ ent-CP14LaddersUpWood = { ent-CP14LaddersUpBase }
ent-CP14LaddersDownWoodAutoLink = { ent-CP14LaddersDownWood }
.desc = { ent-CP14LaddersDownWood.desc }
.suffix = Wood
.suffix = Дерево
ent-CP14LaddersUpWoodAutoLink = { ent-CP14LaddersUpWood }
.desc = { ent-CP14LaddersUpWood.desc }
.suffix = Wood
.suffix = Дерево
ent-CP14LaddersDownMarble = { ent-CP14LaddersDownBase }
.desc = { ent-CP14LaddersDownBase.desc }
@@ -1929,11 +1929,11 @@ ent-CP14LaddersUpMarble = { ent-CP14LaddersUpBase }
ent-CP14LaddersDownMarbleAutoLink = { ent-CP14LaddersDownMarble }
.desc = { ent-CP14LaddersDownMarble.desc }
.suffix = Marble
.suffix = Мрамор
ent-CP14LaddersUpMarbleAutoLink = { ent-CP14LaddersUpWood }
.desc = { ent-CP14LaddersUpWood.desc }
.suffix = Marble
.suffix = Мрамор
ent-CP14Lighthouse = маяк
.desc = Свет во тьме.
@@ -1989,23 +1989,23 @@ ent-CP14WallmountFlagGuardCommander = гобелен командира стра
ent-CP14WallmountGarlandRed = { ent-CP14WallmauntGarlandBase }
.desc = { ent-CP14WallmauntGarlandBase.desc }
.suffix = Red
.suffix = Красный
ent-CP14WallmountGarlandYellow = { ent-CP14WallmauntGarlandBase }
.desc = { ent-CP14WallmauntGarlandBase.desc }
.suffix = Yellow
.suffix = Жёлтый
ent-CP14WallmountGarlandGreen = { ent-CP14WallmauntGarlandBase }
.desc = { ent-CP14WallmauntGarlandBase.desc }
.suffix = Green
.suffix = Зеленый
ent-CP14WallmountGarlandPurple = { ent-CP14WallmauntGarlandBase }
.desc = { ent-CP14WallmauntGarlandBase.desc }
.suffix = Purple
.suffix = Фиолетовый
ent-CP14WallmountGarlandBlue = { ent-CP14WallmauntGarlandBase }
.desc = { ent-CP14WallmauntGarlandBase.desc }
.suffix = Blue
.suffix = Голубой
ent-CP14WallmountPaintingSkull = картина черепа
.desc = Причудливая картина с черепом. Угнетает.
@@ -2037,15 +2037,15 @@ ent-CP14StatueGobRuinedVines = разрушенная статуя Гоба
ent-CP14StatueAngel = статуя ангела
.desc = Священная статуя молящегося ангела
.suffix = Stone
.suffix = Камень
ent-CP14StatueAngelMarble = { ent-CP14StatueAngel }
.desc = { ent-CP14StatueAngel.desc }
.suffix = Marble
.suffix = Мрамор
ent-CP14StatueAngelLimestone = { ent-CP14StatueAngel }
.desc = { ent-CP14StatueAngel.desc }
.suffix = Limestone
.suffix = Известняк
ent-CP14BaseTombstone = надгробие
.desc = Кусок камня, установленный в память о павших.
@@ -2058,163 +2058,163 @@ ent-CP14WoodenDoorFrameMirrored = { ent-CP14WoodenDoorFrame }
ent-CP14IronDoorMirrored = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Opened, Mirrored
.suffix = Открыто, Зеркальная
ent-CP14IronDoorWindowedMirrored = { ent-CP14IronDoorWindowed }
.desc = { ent-CP14IronDoorWindowed.desc }
.suffix = Opened, Mirrored
.suffix = Открыто, Зеркальная
ent-CP14WoodenDoorMirrored = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Opened, Mirrored
.suffix = Открыто, Зеркальная
ent-CP14WoodenDoorWindowedMirrored = { ent-CP14WoodenDoorWindowed }
.desc = { ent-CP14WoodenDoorWindowed.desc }
.suffix = Opened, Mirrored
.suffix = Открыто, Зеркальная
ent-CP14WoodenDoorTavernAlchemy1 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Alchemy 1
.suffix = Алхимия 1
ent-CP14WoodenDoorTavernAlchemy2 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Alchemy 2
.suffix = Алхимия 2
ent-CP14IronDoorBankStaff = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Bank Staff
.suffix = Сотрудники банка
ent-CP14IronDoorBankVault = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Bank Vault
.suffix = Банковское хранилище
ent-CP14IronDoorBankSafe = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Bank Safe
.suffix = Банковский сейф
ent-CP14IronDoorBankCommandantRoom = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Bank Commandant room
.suffix = Комната коменданта банка
ent-CP14IronDoorWindowedBankEntrance = { ent-CP14IronDoorWindowed }
.desc = { ent-CP14IronDoorWindowed.desc }
.suffix = Bank Entrance
.suffix = Вход в банк
ent-CP14IronDoorBlacksmith1 = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Blacksmith 1
.suffix = Кузница 1
ent-CP14IronDoorBlacksmith2 = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Blacksmith 2
.suffix = Кузница 2
ent-CP14IronDoorGuard = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Guard
.suffix = Стража
ent-CP14IronDoorGuardCommandantRoom = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Guard Commander
.suffix = Командир стражи
ent-CP14IronDoorGuardWeaponStorage = { ent-CP14IronDoor }
.desc = { ent-CP14IronDoor.desc }
.suffix = Guard, Weapon Storage
.suffix = Стража, Хранилище оружия
ent-CP14IronDoorWindowedGuardEntrance = { ent-CP14IronDoorWindowed }
.desc = { ent-CP14IronDoorWindowed.desc }
.suffix = Guard, Entrance
.suffix = Стража, Вход
ent-CP14FenceIronGrilleGateGuard = { ent-CP14FenceIronGrilleGate }
.desc = { ent-CP14FenceIronGrilleGate.desc }
.suffix = Guard
.suffix = Стража
ent-CP14WoodenDoorPersonalHouse1 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse1
.suffix = Личный дом 1
ent-CP14WoodenDoorPersonalHouse2 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse2
.suffix = Личный дом 2
ent-CP14WoodenDoorPersonalHouse3 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse3
.suffix = Личный дом 3
ent-CP14WoodenDoorPersonalHouse4 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse4
.suffix = Личный дом 4
ent-CP14WoodenDoorPersonalHouse5 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse5
.suffix = Личный дом 5
ent-CP14WoodenDoorPersonalHouse6 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse6
.suffix = Личный дом 6
ent-CP14WoodenDoorPersonalHouse7 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse7
.suffix = Личный дом 7
ent-CP14WoodenDoorPersonalHouse8 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse8
.suffix = Личный дом 8
ent-CP14WoodenDoorPersonalHouse9 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse9
.suffix = Личный дом 9
ent-CP14WoodenDoorPersonalHouse10 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse10
.suffix = Личный дом 10
ent-CP14WoodenDoorPersonalHouse11 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse11
.suffix = Личный дом 11
ent-CP14WoodenDoorPersonalHouse12 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse12
.suffix = Личный дом 12
ent-CP14WoodenDoorPersonalHouse13 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse13
.suffix = Личный дом 13
ent-CP14WoodenDoorPersonalHouse14 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse14
.suffix = Личный дом 14
ent-CP14WoodenDoorPersonalHouse15 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = PersonalHouse15
.suffix = Личный дом 15
ent-CP14WoodenDoorTavernStaff = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Tavern Staff
.suffix = Персонал таверны
ent-CP14WoodenDoorTavernDorms1 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Tavern Dorms 1
.suffix = Общежития таверны 1
ent-CP14WoodenDoorTavernDorms2 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Tavern Dorms 2
.suffix = Общежития таверны 2
ent-CP14WoodenDoorTavernDorms3 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Tavern Dorms 3
.suffix = Общежития таверны 3
ent-CP14WoodenDoorTavernDorms4 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Tavern Dorms 4
.suffix = Общежития таверны 4
ent-CP14WoodenDoorTavernDorms5 = { ent-CP14WoodenDoor }
.desc = { ent-CP14WoodenDoor.desc }
.suffix = Tavern Dorms 5
.suffix = Общежития таверны 5
ent-CP14WoodenDoorWindowedTavernHall = { ent-CP14WoodenDoorWindowed }
.desc = { ent-CP14WoodenDoorWindowed.desc }
.suffix = Tavern Hall
.suffix = Зал таверны
ent-CP14BaseFenceStraight = { ent-CP14BaseFence }
.desc = { ent-CP14BaseFence.desc }
@@ -2299,34 +2299,34 @@ ent-CP14GatherablePlantBase = { ent-CP14GatherableBase }
ent-CP14GatherableDayflin = желтый днецвет
.desc = Желтый солнечный цветок, пахнущий топленым молоком. Может быть переработан в желтый краситель.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14GatherableBloodFlower = кровавая роза
.desc = Алые цветы растут там, где пролилась кровь.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14GatherableFlyAgaric = мухоморы
.desc = Этот ядовитый гриб часто можно встретить вблизи водоемов или других влажных мест. Он не рекомендуется для употребления в пищу.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14GatherableChromiumSlime = хромиевая слизь
.desc = Это редкое густое вещество можно обнаружить в потоке воды, как будто оно обладает собственным разумом. При попытке изменить саму слизь - она меняет реагент, с которым взаимодействует.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14GatherableWildSage = дикий шалфей
.desc = Корень этого повсеместно распространенного лекарственного растения неплохо заживляет физические повреждения и вызывает кашель.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14GatherableLumiMushroom = люмигрибы
.desc = Слабо светящийся гриб. Часто используется алхимиками как средство для концентрации растворов.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14QuartzCrystal = кварц
.desc = Кварц - важнейший минерал, способный взаимодействовать с магической энергией. Он очень востребован алхимиками для извлечения полезных свойств из жидкостей
ent-CP14GatherableBlueAmanita = лазурная аманита
.desc = Небесно-голубой цветок, известный своими лечебными и магическими свойствами.
.suffix = Gatherable
.suffix = Собираемый
ent-CP14PlantWheat = пшеница
.desc = Наиболее популярная культура. Непритязательна, и открывает дорогу к разнообразию мучных изделий.
@@ -2384,63 +2384,63 @@ ent-CP14BarrelDayflin = { ent-CP14BaseBarrel }
ent-CP14CraneBarrelDwarfBeer = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Beer. Dwarf
.suffix = Пиво. Дварфийское
ent-CP14CraneBarrelBeerGerbil = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Beer. Gerbil
.suffix = Пиво. Gerbil
ent-CP14CraneBarrelBeerBreeze = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Beer. Breeze
.suffix = Пиво. Breeze
ent-CP14CraneBarrelBeerBlowLaw = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Beer. BlowLaw
.suffix = Пиво. BlowLaw
ent-CP14CraneBarrelAleBloodyTear = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Ale. BloodyTear
.suffix = Эль. BloodyTear
ent-CP14CraneBarrelAleBottomless = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Ale. Bottomless
.suffix = Эль. Bottomless
ent-CP14CraneBarrelWineZellasianPleasure = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Wine. ZellasianPleasure
.suffix = Вино. ZellasianPleasure
ent-CP14CraneBarrelWineLeeks = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Wine. Leeks
.suffix = Вино. Leeks
ent-CP14CraneBarrelWineDurandate = { ent-CP14CraneBarrel }
.desc = { ent-CP14CraneBarrel.desc }
.suffix = Wine. Durandate
.suffix = Вино. Durandate
ent-CP14CraneBarrelSmallDwarfBeer = { ent-CP14CraneBarrelSmall }
.desc = { ent-CP14CraneBarrelSmall.desc }
.suffix = Beer. Dwarf
.suffix = Пиво. Дварфийское
ent-CP14CraneBarrelSmallBeerGerbil = { ent-CP14CraneBarrelSmall }
.desc = { ent-CP14CraneBarrelSmall.desc }
.suffix = Beer. Gerbil
.suffix = Пиво. Gerbil
ent-CP14CraneBarrelSmallBeerBreeze = { ent-CP14CraneBarrelSmall }
.desc = { ent-CP14CraneBarrelSmall.desc }
.suffix = Beer. Breeze
.suffix = Пиво. Breeze
ent-CP14CraneBarrelSmallBeerBlowLaw = { ent-CP14CraneBarrelSmall }
.desc = { ent-CP14CraneBarrelSmall.desc }
.suffix = Beer. BlowLaw
.suffix = Пиво. BlowLaw
ent-CP14CraneBarrelSmallAleBloodyTear = { ent-CP14CraneBarrelSmall }
.desc = { ent-CP14CraneBarrelSmall.desc }
.suffix = Ale. BloodyTear
.suffix = Эль. BloodyTear
ent-CP14CraneBarrelSmallAleBottomless = { ent-CP14CraneBarrelSmall }
.desc = { ent-CP14CraneBarrelSmall.desc }
.suffix = Ale. Bottomless
.suffix = Эль. Bottomless
ent-CP14Bonfire = костёр
.desc = Груда бревен, сложенных вместе, и готовых вспыхнуть от малейшей искры.
@@ -2522,7 +2522,7 @@ ent-CP14WallmountBarShelfB = { ent-CP14WallmountBarShelfA }
ent-CP14WallmountLamp = { ent-CP14WallmountLampEmpty }
.desc = { ent-CP14WallmountLampEmpty.desc }
.suffix = Small crystal
.suffix = Маленький кристалл
ent-CP14BaseRoof = крыша
.desc = Крыша над головой, защищающая от солнечного зноя или непогоды.
@@ -2559,17 +2559,17 @@ ent-CP14SeedbedWooden = грядка
.desc = Деревянная кадка с кучей земли, приспособленная для выращивания растений.
ent-CP14ChestGeneric = сундук
.desc = Chest.
.desc = Сундук.
ent-CP14BaseSmallCrate = { ent-CP14BaseCrate }
.desc = { ent-CP14BaseCrate.desc }
ent-CP14CrateDirtPitGrave = dirt pit
.desc = There's something buried here... or someone...
ent-CP14CrateDirtPitGrave = грунтовая яма
.desc = Здесь что-то зарыто... или кто-то...
ent-CP14CrateDirtPitGraveFilled = { ent-CP14CrateDirtPitGrave }
.desc = { ent-CP14CrateDirtPitGrave.desc }
.suffix = Random filled
.suffix = Случайное заполнение
ent-CP14WallStone = камень
.desc = Природная стена из цельного камня. В ней ощущается холод пещеры.
@@ -2627,7 +2627,7 @@ ent-CP14WindowStoneBrick = окно в стене из каменного кир
ent-CP14WindowMarbleBrick = окно в стене из мраморного кирпича
.desc = Мраморная кирпичная стена со стеклянным окном в ней.
ent-CP14FlameCreationArtificialFlame = искуственное пламя
ent-CP14FlameCreationArtificialFlame = искусственное пламя
.desc = Магически созданное искусственное пламя, горящее прямо в воздухе. Неплохой источник света или оружие, если бросить его кому-нибудь в лицо.
ent-CP14LiquidDropWater = парящая капля жидкости
@@ -2656,10 +2656,10 @@ ent-CP14BaseMobZombie = Мистер Зомби
ent-CP14FoodTomatoes = помидор
.desc = Красный, сочный помидор. Так и хочется бросить его кому-нибудь в лицо!
ent-CP14Snowball = snowball
.desc = A small handful of snow, handy for throwing.
ent-CP14Snowball = снежок
.desc = Небольшая горсть снега, удобная для метания.
ent-CP14ManaOperationGlove = mana glove
ent-CP14ManaOperationGlove = мана-перчатка
.desc = Несложная, но эстетически приятная смесь технологии и магических кристаллов, позволяющая оперировать сырой маной: высасывать ее из одних предметов и вливать в другие.
ent-CP14CrystalLamp = кристалльная лампа
@@ -2710,7 +2710,7 @@ ent-CP14IronDoor = железная дверь
ent-CP14IronDoorWindowed = железная дверь с окном
.desc = массивная железная дверь с маленьким окошком. В него, конечно, можно заглянуть, но руку просунуть трудно.
.suffix = Opened
.suffix = Открыто
ent-CP14WoodenDoor = деревянная дверь
.desc = Не самая прочная конструкция, но это лучше, чем ничего.
@@ -2718,14 +2718,14 @@ ent-CP14WoodenDoor = деревянная дверь
ent-CP14WoodenDoorWindowed = деревянная дверь с окном
.desc = Не самая прочная конструкция, но это лучше, чем ничего.
.suffix = Opened
.suffix = Открыто
ent-CP14FenceIronGrilleBase = железная решётка
.desc = Прочный барьер из сваренных вместе железных прутьев.
ent-CP14FenceIronGrilleStraight = { ent-CP14FenceIronGrilleBase }
.desc = { ent-CP14FenceIronGrilleBase.desc }
.suffix = Straight
.suffix = Прямой
ent-CP14FenceIronGrilleGate = железные решетчатые ворота
.desc = Тяжелые железные ворота в решетках. Выглядит серьезно.
@@ -2738,11 +2738,11 @@ ent-CP14BaseFenceWood = деревянный забор
ent-CP14FenceWoodStraight = { ent-CP14BaseFenceWood }
.desc = { ent-CP14BaseFenceWood.desc }
.suffix = Straight
.suffix = Прямой
ent-CP14FenceWoodCorner = { ent-CP14BaseFenceWood }
.desc = { ent-CP14BaseFenceWood.desc }
.suffix = Corner
.suffix = Угол
ent-CP14FenceWoodGate = деревянные ворота для забора
.desc = Большая дверь в большом заборе. Для больших людей.
@@ -2763,15 +2763,15 @@ ent-CP14FenceWoodSmallGate = маленькие деревянные ворот
ent-CP14BaseBarrel = деревянная бочка
.desc = Самая простая конструкция для хранения жидкостей.
.suffix = Empty
.suffix = Пустая
ent-CP14CraneBarrel = деревянная бочка с краном
.desc = Большой лежачий бочонок с краном, для хранения ценных жидкостей.
.suffix = Empty
.suffix = Пустая
ent-CP14CraneBarrelSmall = малая деревянная бочка с краном
.desc = Небольшой лежащий бочонок с краном для быстрого наливания жидкости в кружки.
.suffix = Empty
.suffix = Пустая
ent-CP14WoodenBed = деревянная кровать
.desc = Деревянная кровать. Лучше, чем ничего.
@@ -2799,7 +2799,7 @@ ent-CP14WoodenPallet = деревянный поддон
ent-CP14WallmountLampEmpty = хрустальный настенный светильник
.desc = Простой настенный магический прибор, преобразующий энергию кристаллов в яркий свет.
.suffix = Empty
.suffix = Пустой
ent-CP14WallmountOrdersBorder = доска заказов
.desc = Есть ли работа для ведьмака?
@@ -2816,10 +2816,10 @@ ent-CP14WorkbenchSewing = швейный стол
ent-CP14FrameWooden = деревянная настенная рама
.desc = Деревянная рама для любой деревянной стены.
ent-CP14RoofWooden = wooden roof
ent-CP14RoofWooden = деревянная крыша
.desc = { ent-CP14BaseRoof.desc }
ent-CP14RoofStone = stone roof
ent-CP14RoofStone = каменная крыша
.desc = { ent-CP14BaseRoof.desc }
ent-CP14AlchemyNormalizer = нормализатор растворов
@@ -2834,23 +2834,23 @@ ent-CP14WorkbenchAnvil = наковальня
ent-CP14WorkbenchFurnace = плавильная печь
.desc = Раскаленный камень, позволяющий переплавлять руды в чистый металл.
ent-CP14WoodenChestFrame = Рама для деревянного сундука
.desc = Основание для любого деревянного сундука
ent-CP14WoodenChestFrame = рама для деревянного сундука
.desc = Основание для любого деревянного сундука.
ent-CP14WoodenChest = деревянный сундук
.desc = Простой деревянный сундук для удобного хранения хлама.
ent-CP14BrassChest = Латунный сундук
ent-CP14BrassChest = латунный сундук
.desc = Простой латунный сундук для удобного хранения хлама.
ent-CP14CrateCoffin = Гроб
ent-CP14CrateCoffin = гроб
.desc = Удобный и красивый гроб для комфортного ожидания воскрешения.
ent-CP14LargeWoodenCrate = большой деревянный ящик
.desc = прочный деревянный ящик
.desc = Прочный деревянный ящик.
ent-CP14SmallWoodenCrate = маленький деревянный ящик
.desc = массивный деревянный ящик
.desc = Массивный деревянный ящик.
ent-CP14WallWooden = деревянная стена
@@ -2863,3 +2863,5 @@ ent-CP14WallCardboard = картонная стена
ent-CP14WindowWooden = деревянное окно
.desc = Деревянная стена со стеклянным окном в ней.
ent-CP14Ash1 = пепел
.desc = Раньше это могло быть чем-то интересным и полезным, теперь нет.

View File

@@ -0,0 +1,18 @@
cp14-skill-label = [bold]Требования к навыкам[/bold]
cp14-skill-examined = Вам нужно владеть одним из следующих навыков, чтобы использовать {$item}:
cp14-skill-examined-need-all = Вам нужно владеть всеми следующими навыками, чтобы использовать {$item}:
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]
cp14-verb-categories-knowledge-add = Научить знаниям:
cp14-verb-categories-knowledge-remove = Удалить знания:
cp14-verb-categories-knowledge-learn = Изучить знания:
cp14-learned-new-knowledge = Вы изучили знания о [bold]"{$name}[/bold]"!
cp14-forgot-knowledge = Вы потеряли свои знания о [bold]"{$name}[/bold]"!
cp14-cant-learn-knowledge-dependencies =
Вы не смогли понять {$target}...
Вам не хватает понимания:
cp14-knowledge-book-pre-text = Здесь подробно описаны инструкции, объясняющие
cp14-knowledge-book-post-text = (Чтобы изучить эти знания, нажмите ПКМ по книге, и выберите "Изучить знания")

View File

@@ -0,0 +1,24 @@
# T1
cp14-knowledge-sewing-name = Шитье одежды
cp14-knowledge-sewing-desc = как создавать простую одежду на ткацком станке
cp14-knowledge-wallpaper-name = Изготовление обоев
cp14-knowledge-wallpaper-desc = как создавать обои на ткацком станке
cp14-knowledge-woodwork-name = Работа по дереву
cp14-knowledge-woodwork-desc = как создавать простые предметы из дерева
cp14-knowledge-metall-melting-name = Переплавка металлов
cp14-knowledge-metall-melting-desc = как переплавлять руду в ценные металлы
cp14-knowledge-metall-forging-name = Ковка металлов
cp14-knowledge-metall-forging-desc = как перековывать металл в различные формы
cp14-knowledge-glasswork-name = Работа с стеклом
cp14-knowledge-glasswork-desc = как работать со стеклом
# T2
cp14-knowledge-sewing2-name = Продвинутое шитье одежды
cp14-knowledge-sewing2-desc = как создавать качественную одежду на ткацком станке

View File

@@ -1,7 +1,12 @@
cp14-material-wooden-planks = деревянные доски
cp14-material-dirt-block = земля
cp14-material-stone-block = камень
cp14-material-nail = гвозди
cp14-material-cloth = ткань
cp14-material-copper = медь
cp14-material-iron = железо
cp14-material-gold = золото
cp14-material-mithril = мифрил
cp14-material-lucens-planks = люценсовые доски
cp14-material-cloth = ткань
cp14-material-flora = растительный материал
cp14-material-ash = пепел

View File

@@ -0,0 +1,2 @@
# кучка порошка
cp14-materials-unit-pile = кучка

View File

@@ -1,5 +0,0 @@
cp14-skill-label = [bold]Требования к навыкам[/bold]
cp14-skill-examined = Вам нужно владеть одним из следующих навыков, чтобы использовать {$item}:
cp14-skill-examined-need-all = Вам нужно владеть всеми следующими навыками, чтобы использовать {$item}:
cp14-skill-examined-skill = [color={$color}] - {$skill} [/color]

View File

@@ -1,11 +0,0 @@
cp14-skill-name-alchemy = Алхимия
cp14-skill-desc-alchemy = Вы достаточно опытны, чтобы уверенно пользоваться сложным алхимическим оборудованием.
cp14-skill-name-blacksmith = Кузнечное дело
cp14-skill-desc-blacksmith = Вы знаете все тонкости работы с металлом.
cp14-skill-name-warcraft = Владение воинским оружием
cp14-skill-desc-warcraft = Вы хорошо управляетесь с серьезным, воинским оружием.
cp14-skill-name-firearms = Стрельба из огнестрела
cp14-skill-desc-firearms = Вы достаточно опытны, чтобы пользоваться огнестрельным оружием.

View File

@@ -13,3 +13,5 @@ cp14-stack-mithril-bars = мифриловые слитки
cp14-stack-wallpaper = рулон обоев
cp14-stack-glass-sheet = стекло
cp14-stack-ash-pile = кучка пепла

View File

@@ -21,12 +21,4 @@ cp14-trait-snoring-name = Громкий храп
cp14-trait-snoring-desc = Спать рядом с вами просто невозможно, потому что во все вы жутко громко храпите.
cp14-trait-mana-wasting-name = Магическая бездарность
cp14-trait-mana-wasting-desc = Судьба распорядилась так, что магия для вас - лишь пустой звук. Вы не способны ни накапливать, ни использовать магическую энергию.
# Backgrounds
cp14-trait-bg-entertainer-name = Артист
cp14-trait-bg-entertainer-desc = Вам нравится выступать на публике. Вы знаете, как их развлечь, очаровать и даже воодушевить. Ваша поэзия может трогать сердца слушателей, пробуждать в них горе или радость, смех или гнев. Ваша музыка ободряет их или заставляет скорбеть. Ваши танцы захватывают, а шутки всегда смешны. Чем бы вы ни занимались, ваша жизнь тесно связана с искусством.
cp14-trait-bg-soldier-name = Солдат
cp14-trait-bg-soldier-desc = Сколько вы помните, в вашей жизни всегда была война. С молодости вы проходили тренировки, учились использовать оружие и доспехи, изучали технику выживания, включая то, как оставаться живым на поле боя. Вы могли быть частью армии страны или отряда наёмников, а может, были местным ополченцем во время войны.
cp14-trait-mana-wasting-desc = Судьба распорядилась так, что магия для вас - лишь пустой звук. Вы не способны ни накапливать, ни использовать магическую энергию.

View File

@@ -3,4 +3,4 @@ cp14-workbench-ui-title = Создание предметов
cp14-workbench-craft = Создать
cp14-workbench-recipe-list = Рецепт:
cp14-workbench-no-resource = Не хватает ингредиентов!
cp14-workbench-cant-craft = Крафт не удался!

View File

@@ -56,6 +56,20 @@
- id: CP14BaseMop
- id: CP14ModularIronPickaxe
- id: CP14ModularIronSickle
- !type:GroupSelector
children:
- id: CP14Candle
- id: CP14CandleRed
- id: CP14CandleBlue
- id: CP14CandleBlack
- id: CP14CandleGreen
- id: CP14CandlePurple
- id: CP14CandleSmall
- id: CP14CandleRedSmall
- id: CP14CandleBlueSmall
- id: CP14CandleBlackSmall
- id: CP14CandleGreenSmall
- id: CP14CandlePurpleSmall
- !type:GroupSelector
children:
- id: CP14CrystalLampBlueEmpty

View File

@@ -0,0 +1,33 @@
- type: CP14DayCycle #
id: Default
timeEntries:
- color: '#754A4A' #Dawn
duration: 145
- color: '#E0BA87' #
duration: 145
- color: '#BFEEFF' #Day
duration: 145
- color: '#385163' #Evening
duration: 145
period: Night
- color: '#060D12' #Night
duration: 80
period: Night
- color: '#000000' #BLACK NIGHT
duration: 160
period: Night
- color: '#120906' #Night
duration: 80
period: Night
- type: CP14DayCycle
id: CP14DemiplaneEternalDay
timeEntries:
- color: '#754A4A' #Dawn
duration: 145
- color: '#E0BA87' #
duration: 145
- color: '#BFEEFF' #Day
duration: 145
- color: '#385163' #Evening
duration: 145

View File

@@ -12,25 +12,4 @@
- type: CP14DayCyclePeriod
id: Evening
name: cp14-daycycle-evening
- type: CP14DayCycle #
id: Default
timeEntries:
- duration: 145
color: '#754A4A' #Dawn
- duration: 145
color: '#E0BA87' #
- duration: 145
color: '#BFEEFF' #Day
- period: Night
duration: 145
color: '#385163' #Evening
- period: Night
duration: 80
color: '#060D12' #Night
- period: Night
duration: 160
color: '#000000' #BLACK NIGHT
- duration: 80
color: '#120906' #Night
name: cp14-daycycle-evening

View File

@@ -0,0 +1,96 @@
- type: entity
id: CP14ActionSpellFireRune
name: Fire rune
description: You create an area where a scalding stream of fire occurs with little delay.
components:
- type: Sprite
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: earth_wall
- type: CP14MagicEffectCastSlowdown
speedMultiplier: 0.5
- type: CP14MagicEffectManaCost
manaCost: 15
- type: CP14MagicEffect
magicType: Fire
telegraphyEffects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14TelegraphyFireRune
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14AreaEntityEffectFireRune
- type: CP14MagicEffectCastingVisual
proto: CP14RuneEarthWall
- type: EntityWorldTargetAction
range: 10
itemIconStyle: BigAction
sound: !type:SoundPathSpecifier
path: /Audio/Magic/rumble.ogg
icon:
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: earth_wall
event: !type:CP14DelayedEntityWorldTargetActionEvent
cooldown: 10
- type: entity
id: CP14TelegraphyFireRune
parent: CP14BaseMagicImpact
categories: [ HideSpawnMenu ]
components:
- type: PointLight
color: "#eea911"
- type: TimedDespawn
lifetime: 0.8
- type: Sprite
noRot: true
drawdepth: BelowFloor
sprite: _CP14/Effects/Magic/area_impact.rsi
layers:
- state: area_impact_in
color: "#eea911"
scale: 2, 2
shader: unshaded
- type: entity
id: CP14AreaEntityEffectFireRune
parent: CP14BaseMagicImpact
categories: [ HideSpawnMenu ]
components:
- type: PointLight
color: "#eea911"
- type: Sprite
noRot: true
drawdepth: BelowFloor
sprite: _CP14/Effects/Magic/area_impact.rsi
layers:
- state: area_impact_out
color: "#eea911"
scale: 2, 2
shader: unshaded
- type: TimedDespawn
lifetime: 0.8
- type: CP14AreaEntityEffect
range: 1
whitelist:
components:
- Damageable
effects:
- !type:CP14SpellSpawnEntityOnTarget
spawns:
- CP14ImpactEffectTieflingRevenge
- !type:CP14SpellApplyEntityEffect
effects:
- !type:HealthChange
damage:
types:
Heat: 10
- type: entity
parent: CP14BaseSpellScrollFire
id: CP14SpellScrollFireRune
name: fire rune spell scroll
components:
- type: CP14SpellStorage
spells:
- CP14ActionSpellFireRune

View File

@@ -7,7 +7,7 @@
sprite: _CP14/Effects/Magic/spells_icons.rsi
state: mana_gift
- type: CP14MagicEffectManaCost
manaCost: 12
manaCost: 10
canModifyManacost: false
- type: CP14MagicEffect
magicType: Meta

View File

@@ -66,7 +66,7 @@
Cold: 4
Piercing: 4
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/Dagger/ice_dagger.rsi
sprite: _CP14/Effects/Magic/ice_shard.rsi
layers:
- state: shard
shader: unshaded

View File

@@ -28,7 +28,7 @@
behaviors:
- !type:SpawnEntitiesBehavior
spawn:
Ash:
CP14Ash1:
min: 1
max: 1
- !type:DoActsBehavior

View File

@@ -51,4 +51,15 @@
- type: Sprite
sprite: _CP14/Clothing/Cloak/Roles/General/green.rsi
- type: Clothing
sprite: _CP14/Clothing/Cloak/Roles/General/green.rsi
sprite: _CP14/Clothing/Cloak/Roles/General/green.rsi
- type: entity
parent: CP14ClothingCloakBase
id: CP14ClothingCloakBlue
name: blue cloak
description: Blue cape covering her entire body.
components:
- type: Sprite
sprite: _CP14/Clothing/Cloak/Roles/General/blue.rsi
- type: Clothing
sprite: _CP14/Clothing/Cloak/Roles/General/blue.rsi

View File

@@ -2,7 +2,6 @@
parent: CP14ClothingPantsBase
id: CP14ClothingPantsTrouserWhite
name: white trouser
description: Wide, loose pants made of plain canvas cloth.
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Trousers/white.rsi
@@ -13,7 +12,6 @@
parent: CP14ClothingPantsBase
id: CP14ClothingPantsTrouserDarkBlue
name: dark trouser
description: Wide, loose pants made of plain canvas cloth.
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Trousers/dark_blue.rsi
@@ -24,29 +22,16 @@
parent: CP14ClothingPantsBase
id: CP14ClothingPantsLoincloth
name: loincloth
description: Free, spacious, nothing gets in the way, and it also looks extremely rugged
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/loincloth.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/loincloth.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingDressBlack #TODO rename to CP14ClothingPantsDressBlack
name: black dress
description: A roomy, feminine skirt
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/black.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/black.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsMercenaryTrousers
name: mercenary trousers
description: Colourful mercenary trousers. Don't tear them.
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Trousers/trousers_mercenary.rsi
@@ -55,11 +40,20 @@
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsSouthernMagician
name: southern magician's dress
description: A traditional southern mage skirt, rather loose.
id: CP14ClothingPantsGreen
name: green pants
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/yellow_magician_dress.rsi
sprite: _CP14/Clothing/Pants/green.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/yellow_magician_dress.rsi
sprite: _CP14/Clothing/Pants/green.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsBrown
name: brown pants
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/brown.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/brown.rsi

View File

@@ -0,0 +1,89 @@
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressBlack
name: black dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/black.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/black.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressBlue
name: blue dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/blue.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/blue.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressBrown
name: brown dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/brown.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/brown.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressGreen
name: green dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/green.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/green.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressGreenBelt
name: green belt dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/green_belt.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/green_belt.rsi
- type: entity
parent: CP14ClothingPantsDressGreenBelt
id: CP14ClothingPantsDressGreenBelt2
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/green_belt2.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/green_belt2.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressRed
name: red dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/red.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/red.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDressYellow
name: yellow dress
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/yellow.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/yellow.rsi
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsSouthernMagician
name: southern magician's dress
description: A traditional southern mage skirt, rather loose.
components:
- type: Sprite
sprite: _CP14/Clothing/Pants/Dress/yellow_magician_dress.rsi
- type: Clothing
sprite: _CP14/Clothing/Pants/Dress/yellow_magician_dress.rsi

View File

@@ -3,6 +3,7 @@
parent: Clothing
id: CP14ClothingPantsBase
categories: [ ForkFiltered ]
description: Pants to cover my thighs from the cold.
components:
- type: Clothing
equipDelay: 1
@@ -10,4 +11,16 @@
slots:
- pants
- type: Sprite
state: icon
state: icon
- type: entity
parent: CP14ClothingPantsBase
id: CP14ClothingPantsDress
abstract: true
description: A roomy, feminine skirt
components:
- type: Clothing
equipDelay: 1.5
unequipDelay: 1
slots:
- pants

View File

@@ -0,0 +1,198 @@
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonBlack
name: cotton black shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/black.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/black.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonBlue
name: cotton blue shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/blue.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/blue.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonBlueCollar
name: cotton blue collar shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/blue_collar.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/blue_collar.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtMercenary
name: mercenary shirt
description: A mercenary's colourful shirt.
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/mercenary.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/mercenary.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtBlueOpen
name: cotton blue open shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/open_blue.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/open_blue.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtRedOpen
name: cotton red open shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/open_red.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/open_red.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtYellowOpen
name: cotton yellow open shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/open_yellow.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/open_yellow.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonPurple
name: cotton purple shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/purple.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/purple.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonRed
name: cotton red shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/red.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/red.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonWhite
name: cotton white shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonWhiteBelt
name: cotton white belt shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_belt.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_belt.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonWhiteBrownVest
name: cotton white brown vest shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_brown_vest.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_brown_vest.rsi
- type: entity
parent: CP14ClothingShirtCottonWhiteBrownVest
id: CP14ClothingShirtCottonWhiteBrownVest2
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_brown_vest2.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_brown_vest2.rsi
- type: entity
parent: CP14ClothingShirtCottonWhiteBrownVest
id: CP14ClothingShirtCottonWhiteBrownVest3
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_brown_vest3.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_brown_vest3.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonWhiteCollar
name: cotton white collar shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_collar.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_collar.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonWhiteGreenVest
name: cotton white green vest shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_green_vest.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_green_vest.rsi
- type: entity
parent: CP14ClothingShirtCottonWhiteGreenVest
id: CP14ClothingShirtCottonWhiteGreenVest2
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white_green_vest2.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white_green_vest2.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonYellow
name: cotton yellow shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/yellow.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/yellow.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonYellowCollar
name: cotton yellow collar shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/yellow_collar.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/yellow_collar.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtYellowWizard
name: yellow wizard shirt
description: A loose magician's shirt, comfortable and nice looking.
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/yellow_wizard.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/yellow_wizard.rsi

View File

@@ -1,81 +0,0 @@
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonBlue
name: cotton blue shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/blue.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/blue.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonBlack
name: cotton black shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/black.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/black.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonPurple
name: cotton purple shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/purple.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/purple.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonRed
name: cotton red shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/red.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/red.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonWhite
name: cotton white shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/white.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/white.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtCottonYellow
name: cotton yellow shirt
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/yellow.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/yellow.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtMercenary
name: mercenary shirt
description: A mercenary's colourful shirt.
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/mercenary.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/mercenary.rsi
- type: entity
parent: CP14ClothingShirtBase
id: CP14ClothingShirtYellowWizard
name: yellow wizard shirt
description: A loose magician's shirt, comfortable and nice looking.
components:
- type: Sprite
sprite: _CP14/Clothing/Shirt/Roles/General/yellow_wizard.rsi
- type: Clothing
sprite: _CP14/Clothing/Shirt/Roles/General/yellow_wizard.rsi

View File

@@ -13,7 +13,8 @@
state: icon
- type: Item
size: Normal
- type: ProtectedFromStepTriggers
- type: entity
parent: CP14ClothingShoesBase
id: CP14ClothingShoesBlack

View File

@@ -24,16 +24,6 @@
- !type:GroupSelector
weight: 75
children:
- !type:GroupSelector
children:
- id: CP14SilverCoin1
weight: 0.1
- id: CP14CopperCoin
weight: 0.1
- id: CP14CopperCoin5
weight: 0.5
- id: CP14CopperCoin1
weight: 1
- !type:GroupSelector
children:
- id: CP14SpellScrollIceShards
@@ -47,7 +37,7 @@
- id: CP14SpellScrollFlashLight
- id: CP14SpellScrollWaterCreation
- id: CP14SpellScrollPlantGrowth
- id: CP14EnergyCrystalSmall
- id: CP14EnergyCrystalSmallEmpty
- id: CP14BaseSharpeningStone
- id: CP14GlassShard
- id: CP14Paper
@@ -69,9 +59,13 @@
- id: CP14VialSmallBlueAmanita
- id: CP14VialTinyChromiumSlime
- id: CP14VialTinyLumiMushroom
- !type:GroupSelector
children:
- id: CP14BookKnowledgeClothingSewing
- id: CP14BookKnowledgeWallpaperCraft
- id: CP14SilverCoin5
- id: CP14BaseLockpick
- id: CP14EnergyCrystalMedium
- id: CP14EnergyCrystalMediumEmpty
- id: CP14DemiplaneKeyT1
weight: 2
- id: CP14DemiplaneKeyT2
@@ -109,22 +103,16 @@
- !type:NestedSelector
tableId: CP14TableDemiplaneLootT1
weight: 0.25
# Coins
- !type:GroupSelector
children:
- id: CP14SilverCoin5
weight: 0.1
- id: CP14SilverCoin1
weight: 0.3
- id: CP14CopperCoin5
weight: 0.5
- !type:GroupSelector
children:
- id: CP14SpellScrollShadowStep
- id: CP14SpellScrollFireball
- id: CP14SpellScrollBeerCreation
weight: 0.2
- id: CP14EnergyCrystalMedium
- !type:GroupSelector
children:
- id: CP14BookKnowledgeAdvancedClothingSewing
- id: CP14EnergyCrystalMediumEmpty
# Rare
- !type:GroupSelector
weight: 25

View File

@@ -70,8 +70,6 @@
- id: CP14MobUndeadZombieGearEasy1
- id: CP14MobUndeadZombieGearEasy2
- id: CP14MobUndeadZombieGearEasy3
- id: CP14MobUndeadZombieGearMedium1
- id: CP14MobUndeadZombieGearMedium2
- type: entity
parent: CP14BaseMobGroupSpawner

View File

@@ -22,11 +22,6 @@
- id: CP14MobUndeadZombieGearEasy1
- id: CP14MobUndeadZombieGearEasy2
- id: CP14MobUndeadZombieGearEasy3
- !type:GroupSelector
weight: 30
children:
- id: CP14MobUndeadZombieGearMedium1
- id: CP14MobUndeadZombieGearMedium2
# Animal

View File

@@ -6,7 +6,7 @@
components:
- type: NpcFactionMember
factions:
- CP14AggressiveAnimals
- CP14Monster
- type: Sprite
drawdepth: Mobs
- type: ReplacementAccent

View File

@@ -7,14 +7,10 @@
components:
- type: NpcFactionMember
factions:
- CP14Undead
- CP14Monster
- type: Loadout
prototypes:
- CP14MobSkeleton
- type: CP14SkillsStorage
- type: CP14AutoAddSkill
skills:
- Warcraft
- type: entity
id: CP14MobUndeadSkeletonCloset

View File

@@ -5,7 +5,7 @@
components:
- type: NpcFactionMember
factions:
- CP14HostileEveryone
- CP14Monster
- type: entity
id: CP14MobXenoDrone
@@ -14,7 +14,7 @@
components:
- type: NpcFactionMember
factions:
- CP14HostileEveryone
- CP14Monster
- type: entity
id: CP14MobSpaceCobra
@@ -24,7 +24,7 @@
components:
- type: NpcFactionMember
factions:
- CP14HostileEveryone
- CP14Monster
- type: MeleeChemicalInjector
transferAmount: 2
- type: MeleeWeapon
@@ -45,7 +45,7 @@
components:
- type: NpcFactionMember
factions:
- CP14HostileEveryone
- CP14Monster
- type: MeleeWeapon
angle: 0
animation: WeaponArcBite
@@ -62,7 +62,7 @@
components:
- type: NpcFactionMember
factions:
- CP14HostileEveryone
- CP14Monster
- type: SolutionTransfer
maxTransferAmount: 0.2
- type: MeleeWeapon
@@ -81,4 +81,4 @@
components:
- type: NpcFactionMember
factions:
- CP14HostileEveryone
- CP14Monster

View File

@@ -15,7 +15,7 @@
true
- type: NpcFactionMember
factions:
- CP14Undead
- CP14Monster
- type: entity
id: CP14MobUndeadZombieGearEasy1
@@ -42,22 +42,4 @@
categories: [ HideSpawnMenu ]
components:
- type: Loadout
prototypes: [ CP14MobUndeadEasy3 ]
- type: entity
id: CP14MobUndeadZombieGearMedium1
parent: CP14MobUndeadZombie
suffix: Zombie. Medium
categories: [ HideSpawnMenu ]
components:
- type: Loadout
prototypes: [ CP14MobUndeadMedium1 ]
- type: entity
id: CP14MobUndeadZombieGearMedium2
parent: CP14MobUndeadZombie
suffix: Zombie. Medium
categories: [ HideSpawnMenu ]
components:
- type: Loadout
prototypes: [ CP14MobUndeadMedium2 ]
prototypes: [ CP14MobUndeadEasy3 ]

View File

@@ -2,7 +2,7 @@
save: false
parent:
- BaseMob
- MobDamageable
- CP14MobDamageable
- MobCombat
id: CP14BaseMobSpecies
categories: [ ForkFiltered ]
@@ -26,6 +26,7 @@
sprite: Mobs/Customization/masking_helpers.rsi
state: unisex_full
visible: false
- map: [ "shoes" ]
- map: [ "shirt" ]
- map: [ "pants" ]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
@@ -33,7 +34,6 @@
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "gloves" ]
- map: [ "shoes" ]
- map: [ "ears" ]
- map: [ "cloak" ]
- map: [ "eyes" ]
@@ -311,7 +311,7 @@
Asphyxiation: -1.0
- type: FireVisuals
alternateState: Standing #TODO - custom visuals
- type: CP14SkillsStorage
- type: CP14KnowledgeStorage
- type: entity
save: false

View File

@@ -24,6 +24,7 @@
sprite: Mobs/Customization/masking_helpers.rsi
state: unisex_full
visible: false
- map: [ "shoes" ]
- map: [ "shirt" ]
- map: [ "pants" ]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
@@ -33,7 +34,6 @@
- map: [ "enum.HumanoidVisualLayers.HeadSide" ] # Bark Before clothing
- map: [ "enum.HumanoidVisualLayers.HeadTop" ] # Bark Before clothing
- map: [ "gloves" ]
- map: [ "shoes" ]
- map: [ "ears" ]
- map: [ "cloak" ]
- map: [ "eyes" ]

View File

@@ -18,6 +18,7 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
- map: [ "shoes" ]
- map: [ "shirt" ]
- map: [ "pants" ]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
@@ -25,7 +26,6 @@
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "gloves" ]
- map: [ "shoes" ]
- map: [ "ears" ]
- map: [ "cloak" ]
- map: [ "eyes" ]

View File

@@ -19,6 +19,7 @@
- map: [ "enum.HumanoidVisualLayers.LArm" ]
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
- map: [ "shoes" ]
- map: [ "shirt" ]
- map: [ "pants" ]
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
@@ -26,7 +27,6 @@
- map: [ "enum.HumanoidVisualLayers.LHand" ]
- map: [ "enum.HumanoidVisualLayers.RHand" ]
- map: [ "gloves" ]
- map: [ "shoes" ]
- map: [ "ears" ]
- map: [ "cloak" ]
- map: [ "eyes" ]

View File

@@ -0,0 +1,30 @@
- type: entity
save: false
parent: MobDamageable
id: CP14MobDamageable
categories: [ ForkFiltered ]
abstract: true
components:
- type: Destructible
thresholds:
- trigger:
!type:DamageTypeTrigger
damageType: Blunt
damage: 400
behaviors:
- !type:GibBehavior { }
- trigger:
!type:DamageTypeTrigger
damageType: Heat
damage: 1500
behaviors:
- !type:SpawnEntitiesBehavior
spawnInContainer: true
spawn:
CP14Ash1:
min: 2
max: 3
- !type:BurnBodyBehavior { }
- !type:PlaySoundBehavior
sound:
collection: MeatLaserImpact

View File

@@ -0,0 +1,81 @@
- type: entity
parent: BookRandom
id: CP14BookKnowledgeBase
abstract: true
categories: [ ForkFiltered ]
name: knowledge book
description: This book holds valuable knowledge that you can learn... if you're ready for it.
components:
- type: CP14KnowledgePaperText
#TODO: Уникальный визуал каждой книжке
# T0
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeWoodWork
suffix: Wood Work
components:
- type: CP14KnowledgeLearningSource
knowledges:
- WoodWork
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeMetallMelting
suffix: Metall Melting
components:
- type: CP14KnowledgeLearningSource
knowledges:
- MetallMelting
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeMetallForging
suffix: Metall Forging
components:
- type: CP14KnowledgeLearningSource
knowledges:
- MetallForging
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeGlasswork
suffix: Glasswork
components:
- type: CP14KnowledgeLearningSource
knowledges:
- Glasswork
# T1
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeClothingSewing
suffix: Clothing Sewing
components:
- type: CP14KnowledgeLearningSource
knowledges:
- ClothingSewing
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeWallpaperCraft
suffix: Wallpaper Craft
components:
- type: CP14KnowledgeLearningSource
knowledges:
- WallpaperCraft
# T2
- type: entity
parent: CP14BookKnowledgeBase
id: CP14BookKnowledgeAdvancedClothingSewing
suffix: Advanced Clothing Sewing
components:
- type: CP14KnowledgeLearningSource
knowledges:
- AdvancedClothingSewing

View File

@@ -36,7 +36,7 @@
behaviors:
- !type:SpawnEntitiesBehavior
spawn:
Ash:
CP14Ash1:
min: 1
max: 1
- !type:DoActsBehavior

View File

@@ -0,0 +1,45 @@
- type: entity
parent: BaseHandheldInstrument
id: CP14FluteInstrument
name: flute
description: A compact musical wind instrument, popular in villages as well as with large musical troupes.
categories: [ ForkFiltered ]
components:
- type: Instrument
program: 75
- type: Sprite
sprite: _CP14/Objects/Fun/Instruments/flute.rsi
state: icon
- type: Item
size: Small
sprite: _CP14/Objects/Fun/Instruments/flute.rsi
- type: Tag
tags:
- WoodwindInstrument
- type: entity
parent: BaseHandheldInstrument
id: CP14LyraInstrument
name: lyra
description: A common stringed instrument throughout Sylate, popular with various bards and musical troupes.
categories: [ ForkFiltered ]
components:
- type: Instrument
program: 46
- type: Sprite
sprite: _CP14/Objects/Fun/Instruments/lira.rsi
state: icon
- type: Item
size: Normal
sprite: _CP14/Objects/Fun/Instruments/lira.rsi
- type: Clothing
equipDelay: 0.25
unequipDelay: 0.25
sprite: _CP14/Objects/Fun/Instruments/lira.rsi
quickEquip: false
breakOnMove: false
slots:
- belt
- type: Tag
tags:
- StringInstrument

View File

@@ -0,0 +1,50 @@
- type: entity
parent: BaseItem
id: CP14Ash1
name: ash #Возможный реагент в будущем
description: It used to be something that could be interesting and useful, now it's not.
suffix: 1
categories: [ ForkFiltered ]
components:
- type: Item
size: Tiny
- type: Sprite
sprite: _CP14/Objects/Materials/ash.rsi
layers:
- state: ash_1
map: ["base"]
- type: SolutionContainerManager
solutions:
food:
maxVol: 50
reagents:
- ReagentId: Ash
Quantity: 10
- type: SolutionSpiker
sourceSolution: food
ignoreEmpty: true
- type: ScoopableSolution
solution: food
- type: Extractable
grindableSolutionName: food
- type: Appearance
- type: Stack
stackType: CP14Ash
count: 1
baseLayer: base
layerStates:
- ash_1
- ash_2
- ash_3
- type: Material
- type: PhysicalComposition # точно ли это нужно?
materialComposition:
CP14Ash: 100
- type: entity
id: CP14Ash3
parent: CP14Ash1
suffix: 3
components:
- type: Stack
count: 3

View File

@@ -87,10 +87,6 @@
sprite: _CP14/Objects/Specific/Alchemy/mortar_pestle.rsi
state: pestle
- type: CP14Pestle
- type: CP14SkillRequirement
fuckupChance: 0.05
requiredSkills:
- Alchemy
- type: GuideHelp
guides:
- CP14_RU_Alchemy

View File

@@ -25,9 +25,4 @@
- !type:DoActsBehavior
acts: ["Destruction"]
- type: CP14SharpeningStone
sharpnessHeal: 0.1
- type: CP14SkillRequirement
fuckupChance: 0.6
requiredSkills:
- Warcraft
- Blacksmith
sharpnessHeal: 0.1

View File

@@ -25,6 +25,23 @@
damage:
types:
Blunt: 3
- type: Damageable
damageContainer: Inorganic
- type: CP14MeleeSelfDamage
damageToSelf:
types:
Blunt: 1 # 50 hits
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 50
behaviors:
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:DoActsBehavior
acts: ["Destruction"]
- type: MeleeWeapon
angle: 100
attackRate: 1.3

View File

@@ -49,10 +49,6 @@
- type: MeleeThrowOnHit
lifetime: 0.05
speed: 5
- type: CP14SkillRequirement
fuckupChance: 0.5
requiredSkills:
- Warcraft
- type: Tool
qualities:
- CP14Hammering

View File

@@ -1,40 +0,0 @@
- type: entity
id: CP14BaseBattleStaff
parent:
- BaseItem
- CP14BaseWeaponDestructible
name: battle staff
description: an extremely simple and effective weapon - a long straight and heavy stick.
components:
- type: Item
size: Ginormous
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/BattleStaff/battleStaff.rsi
layers:
- state: icon
- type: Clothing
equipDelay: 1
unequipDelay: 1
sprite: _CP14/Objects/Weapons/Melee/BattleStaff/battleStaff.rsi
quickEquip: false
breakOnMove: false
slots:
- neck
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Blunt: 4
- type: MeleeWeapon
angle: 100
attackRate: 1.3
range: 1.3
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
damage:
types:
Blunt: 6
soundHit:
collection: MetalThud
cPAnimationLength: 0.3
cPAnimationOffset: -1.3

View File

@@ -1,86 +0,0 @@
- type: entity
id: CP14BaseTwoHandedSword
parent:
- BaseItem
- CP14BaseWeaponDestructible
- CP14BaseWeaponSharp
- CP14BaseWeaponChemical
name: two-handed sword
description: A powerful weapon that requires tremendous strength and skill to use effectively.
components:
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/TwoHandedSword/twoHandedSword.rsi
state: icon
- type: Clothing
equipDelay: 1
unequipDelay: 1
sprite: _CP14/Objects/Weapons/Melee/TwoHandedSword/twoHandedSword.rsi
quickEquip: false
breakOnMove: false
slots:
- neck
- type: MeleeWeapon
angle: 120
attackRate: 0.7
range: 1.8
wideAnimationRotation: 135
wideAnimation: CP14WeaponArcSlash
damage:
types:
Slash: 5
Blunt: 4
Structural: 1
soundHit:
collection: MetalThud
cPAnimationLength: 0.6
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Slash: 12
Blunt: 4
Structural: 3
- type: Item
size: Ginormous
- type: ClothingSpeedModifier
walkModifier: 0.9
sprintModifier: 0.8
- type: HeldSpeedModifier
- type: CP14SkillRequirement
fuckupChance: 0.5
requiredSkills:
- Warcraft
- type: CP14Currency
currency: 5000
- type: entity
id: CP14TwoHandedSwordScythe
parent: CP14BaseTwoHandedSword
name: scythe
description: A large, two-handed scythe. What will you mow with it? Millet or heads?
components:
- type: Sprite
sprite: _CP14/Objects/Weapons/Melee/TwoHandedSword/scythe.rsi
state: icon
- type: Clothing
sprite: _CP14/Objects/Weapons/Melee/TwoHandedSword/scythe.rsi
- type: Tag
tags:
- CP14HerbalGathering
- type: MeleeWeapon
angle: 110
attackRate: 0.6
range: 1.4
wideAnimation: CP14WeaponArcSlash
damage:
types:
Slash: 4
Blunt: 3
soundHit:
collection: MetalThud
cPAnimationLength: 0.6
- type: Wieldable
- type: IncreaseDamageOnWield
damage:
types:
Slash: 6

View File

@@ -1,19 +1,19 @@
- type: entity
id: CP14BookImperialLawsHandBook
parent: BaseGuidebook
name: imperial laws
description: A book about Imperial Laws.
categories: [ ForkFiltered ]
components:
- type: Sprite
layers:
- state: paper
- state: cover_base
color: "#871619"
- state: decor_wingette
color: "#a3181d"
- state: icon_law
- type: GuideHelp
guides:
- CP14_RU_Imperial_Laws
- CP14_EN_Imperial_Laws
- type: entity
id: CP14BookImperialLawsHandBook
parent: BaseGuidebook
name: imperial laws
description: A book about Imperial Laws.
categories: [ ForkFiltered ]
components:
- type: Sprite
layers:
- state: paper
- state: cover_base
color: "#871619"
- state: decor_wingette
color: "#a3181d"
- state: icon_law
- type: GuideHelp
guides:
- CP14_RU_Imperial_Laws
- CP14_EN_Imperial_Laws

View File

@@ -0,0 +1,18 @@
- type: entity
name: wood bench
id: CP14BenchWood
parent:
- SeatBase
- CP14BaseFlammable
description: A bench carved from wood, a comfortable part of the interior designed for sitting and relaxing.
categories: [ ForkFiltered ]
components:
- type: Transform
anchored: true
- type: Rotatable
- type: Sprite
sprite: _CP14/Structures/Furniture/bench.rsi
layers:
- state: wooden
- type: Physics
bodyType: Static

View File

@@ -43,9 +43,4 @@
sharpnessHeal: 0.1
targetDamage:
types:
blunt: 0.5
- type: CP14SkillRequirement
fuckupChance: 0.5
requiredSkills:
- Warcraft
- Blacksmith
blunt: 0.5

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