Trade reputation rework + Merchants back + Mining contract (#1347)

* refactor unlocking

* fix contract debug crashing

* Update dev_map.yml

* bugfixes and content rebalance

* ore buy contract
This commit is contained in:
Red
2025-06-01 15:10:36 +03:00
committed by GitHub
parent a99f2fcd50
commit a3ae67a762
28 changed files with 426 additions and 299 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,3 +1,4 @@
cp14-trade-faction-contracts = Zellasian Trade Guild
cp14-trade-faction-victoria-gardens = Victoria Gardens
cp14-trade-faction-brad-potions = Brad's marvelous potions
cp14-trade-faction-brad-potions = Brad's marvelous potions
cp14-trade-faction-dwarf-mining = 'Dwarf Steel' mining branch

View File

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

View File

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

View File

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

View File

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

View File

@@ -39,3 +39,14 @@
- type: CP14TradingContract
faction: BradPotions
- type: entity
parent: CP14TradeContractBase
id: CP14TradeContractDwarfMining
description: Trading contract with the "Dwarf Steel" mining branch. Allows you to purchase various ore and mining tools.
suffix: Dwarf Miners
components:
- type: Sprite
state: dwarf_mining
- type: CP14TradingContract
faction: DwarfMining

View File

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

View File

@@ -1,77 +1,21 @@
# Rep 0
- type: cp14TradingPosition
id: CP14VialSmallHealingBrute
faction: BradPotions
uiPosition: 0, 0
uiPosition: 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingBrute
- type: cp14TradingPosition
id: CP14VialSmallHealingPoison
faction: BradPotions
uiPosition: 0, 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingPoison
- type: cp14TradingPosition
id: CP14VialSmallHealingAirloss
faction: BradPotions
uiPosition: 0, 2
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingAirloss
- type: cp14TradingPosition
id: CP14VialSmallHealingBlood
faction: BradPotions
uiPosition: 0, 3
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingBlood
- type: cp14TradingPosition
id: CP14VialSmallSpeedUp
faction: BradPotions
uiPosition: 1, 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallSpeedUp
- type: cp14TradingPosition
id: CP14VialSmallRainbow
faction: BradPotions
uiPosition: 1, 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallRainbow
- type: cp14TradingPosition
id: CP14VialSmallHealingManaDepletion
faction: BradPotions
uiPosition: 1, 2
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingManaDepletion
- type: cp14TradingPosition
id: CP14VialSmallHealingMana
faction: BradPotions
uiPosition: 1, 3
reputationLevel: 0
uiPosition: 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
@@ -79,12 +23,10 @@
product: CP14VialSmallHealingMana
- type: cp14TradingPosition
id: CP14VialTiny
faction: BradPotions
uiPosition: 3, 0
uiPosition: 3
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_tiny.rsi
state: vial
@@ -93,83 +35,21 @@
- type: cp14TradingPosition
id: CP14VialTinyReinforced
prerequisite: CP14VialTiny
priceMarkup: 1
faction: BradPotions
uiPosition: 3, 1
uiPosition: 4
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_tiny.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialTinyReinforced
- type: cp14TradingPosition
id: CP14VialSmall
prerequisite: CP14VialTiny
priceMarkup: 1
faction: BradPotions
uiPosition: 4, 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmall
- type: cp14TradingPosition
id: CP14VialSmallReinforced
prerequisite: CP14VialSmall
priceMarkup: 2
faction: BradPotions
uiPosition: 4, 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallReinforced
- type: cp14TradingPosition
id: CP14VialMedium
prerequisite: CP14VialSmall
priceMarkup: 2
faction: BradPotions
uiPosition: 5, 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_medium.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialMedium
- type: cp14TradingPosition
id: CP14VialMediumReinforced
prerequisite: CP14VialMedium
priceMarkup: 3
faction: BradPotions
uiPosition: 5, 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_medium.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialMediumReinforced
- type: cp14TradingPosition
id: CP14Cauldron
priceMarkup: 5
faction: BradPotions
uiPosition: 7, 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/cauldron.rsi
state: icon
service: !type:CP14BuyItemsService
product: CP14Cauldron
- type: cp14TradingPosition
id: CP14Pestle
priceMarkup: 2
faction: BradPotions
uiPosition: 8, 0
uiPosition: 6
icon:
sprite: _CP14/Objects/Specific/Alchemy/mortar_pestle.rsi
state: pestle
@@ -180,18 +60,67 @@
id: CP14Mortar
priceMarkup: 2
faction: BradPotions
uiPosition: 9, 0
uiPosition: 7
icon:
sprite: _CP14/Objects/Specific/Alchemy/mortar_pestle.rsi
state: mortar_base
service: !type:CP14BuyItemsService
product: CP14Mortar
# Rep 1
- type: cp14TradingPosition
id: CP14VialSmallHealingBlood
faction: BradPotions
reputationLevel: 1
uiPosition: 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingBlood
- type: cp14TradingPosition
id: CP14VialSmallHealingManaDepletion
faction: BradPotions
reputationLevel: 1
uiPosition: 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingManaDepletion
- type: cp14TradingPosition
id: CP14VialSmall
reputationLevel: 1
priceMarkup: 1
faction: BradPotions
uiPosition: 3
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmall
- type: cp14TradingPosition
id: CP14VialSmallReinforced
reputationLevel: 1
priceMarkup: 2
faction: BradPotions
uiPosition: 4
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallReinforced
- type: cp14TradingPosition
id: CP14Dropper
priceMarkup: 1
reputationLevel: 1
faction: BradPotions
uiPosition: 7, 1
uiPosition: 6
icon:
sprite: _CP14/Objects/Specific/Alchemy/dropper.rsi
state: dropper
@@ -201,12 +130,96 @@
- type: cp14TradingPosition
id: CP14Syringe
priceMarkup: 2
reputationLevel: 1
faction: BradPotions
uiPosition: 8, 1
uiPosition: 7
icon:
sprite: _CP14/Objects/Specific/Alchemy/syringe.rsi
state: base
service: !type:CP14BuyItemsService
product: CP14Syringe
# Rep 2
- type: cp14TradingPosition
id: CP14VialSmallHealingPoison
faction: BradPotions
reputationLevel: 2
uiPosition: 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingPoison
- type: cp14TradingPosition
id: CP14VialSmallHealingAirloss
faction: BradPotions
reputationLevel: 2
uiPosition: 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallHealingAirloss
- type: cp14TradingPosition
id: CP14VialMedium
reputationLevel: 2
priceMarkup: 2
faction: BradPotions
uiPosition: 3
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_medium.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialMedium
- type: cp14TradingPosition
id: CP14VialMediumReinforced
reputationLevel: 2
priceMarkup: 3
faction: BradPotions
uiPosition: 4
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_medium.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialMediumReinforced
- type: cp14TradingPosition
id: CP14Cauldron
priceMarkup: 5
faction: BradPotions
reputationLevel: 2
uiPosition: 6
icon:
sprite: _CP14/Objects/Specific/Alchemy/cauldron.rsi
state: icon
service: !type:CP14BuyItemsService
product: CP14Cauldron
# Rep 3
- type: cp14TradingPosition
id: CP14VialSmallSpeedUp
faction: BradPotions
reputationLevel: 3
uiPosition: 0
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallSpeedUp
- type: cp14TradingPosition
id: CP14VialSmallRainbow
faction: BradPotions
reputationLevel: 3
uiPosition: 1
icon:
sprite: _CP14/Objects/Specific/Alchemy/vial_small.rsi
state: vial
service: !type:CP14BuyItemsService
product: CP14VialSmallRainbow

View File

@@ -1,8 +1,7 @@
- type: cp14TradingPosition
id: CP14TradeContractVictoriaGardens
faction: ContractGuild
uiPosition: 0, 0
unlockReputationCost: 1
uiPosition: 0
icon:
sprite: _CP14/Objects/Specific/Economy/trade_contracts.rsi
state: victoria_garden
@@ -13,8 +12,7 @@
- type: cp14TradingPosition
id: CP14TradeContractBradPotions
faction: ContractGuild
uiPosition: 0, 1
unlockReputationCost: 1
uiPosition: 1
icon:
sprite: _CP14/Objects/Specific/Economy/trade_contracts.rsi
state: brad_potions
@@ -22,3 +20,14 @@
product: CP14TradeContractBradPotions
count: 1
- type: cp14TradingPosition
id: CP14TradeContractDwarfMining
faction: ContractGuild
uiPosition: 2
icon:
sprite: _CP14/Objects/Specific/Economy/trade_contracts.rsi
state: dwarf_mining
service: !type:CP14BuyItemsService
product: CP14TradeContractDwarfMining
count: 1

View File

@@ -0,0 +1,138 @@
# Rep 0
- type: cp14TradingPosition
id: CP14OreCopper5
faction: DwarfMining
uiPosition: 0
icon:
sprite: _CP14/Objects/Materials/copper_ore.rsi
state: ore2
service: !type:CP14BuyItemsService
product: CP14OreCopper5
- type: cp14TradingPosition
id: CP14CopperBar5
faction: DwarfMining
priceMarkup: 5
uiPosition: 4
icon:
sprite: _CP14/Objects/Materials/copper_bar.rsi
state: bar_2
service: !type:CP14BuyItemsService
product: CP14CopperBar5
- type: cp14TradingPosition
id: CP14GlassSheet5
faction: DwarfMining
uiPosition: 5
icon:
sprite: _CP14/Objects/Materials/glass.rsi
state: glass_2
service: !type:CP14BuyItemsService
product: CP14GlassSheet5
- type: cp14TradingPosition
id: CP14Torch
faction: DwarfMining
uiPosition: 7
icon:
sprite: _CP14/Objects/Tools/torch.rsi
state: torch-unlit
service: !type:CP14BuyItemsService
product: CP14Torch
- type: cp14TradingPosition
id: CP14ModularIronPickaxe
faction: DwarfMining
priceMarkup: 15
uiPosition: 8
icon:
sprite: _CP14/Objects/ModularTools/Blade/Pickaxe/metall_pickaxe.rsi
state: tool
service: !type:CP14BuyItemsService
product: CP14ModularIronPickaxe
- type: cp14TradingPosition
id: CP14ModularIronShovel
faction: DwarfMining
priceMarkup: 10
uiPosition: 9
icon:
sprite: _CP14/Objects/ModularTools/Blade/Shovel/metall_shovel.rsi
state: tool
service: !type:CP14BuyItemsService
product: CP14ModularIronShovel
# Rep 1
- type: cp14TradingPosition
id: CP14OreIron5
faction: DwarfMining
reputationLevel: 1
uiPosition: 0
icon:
sprite: _CP14/Objects/Materials/iron_ore.rsi
state: ore2
service: !type:CP14BuyItemsService
product: CP14OreIron5
- type: cp14TradingPosition
id: CP14IronBar5
faction: DwarfMining
reputationLevel: 1
priceMarkup: 5
uiPosition: 4
icon:
sprite: _CP14/Objects/Materials/iron_bar.rsi
state: bar_2
service: !type:CP14BuyItemsService
product: CP14IronBar5
# Rep 2
- type: cp14TradingPosition
id: CP14OreGold5
faction: DwarfMining
reputationLevel: 2
uiPosition: 0
icon:
sprite: _CP14/Objects/Materials/gold_ore.rsi
state: ore2
service: !type:CP14BuyItemsService
product: CP14OreGold5
- type: cp14TradingPosition
id: CP14OreMithril5
faction: DwarfMining
reputationLevel: 2
uiPosition: 1
icon:
sprite: _CP14/Objects/Materials/mithril_ore.rsi
state: ore2
service: !type:CP14BuyItemsService
product: CP14OreMithril5
- type: cp14TradingPosition
id: CP14GoldBar5
faction: DwarfMining
reputationLevel: 2
priceMarkup: 5
uiPosition: 4
icon:
sprite: _CP14/Objects/Materials/gold_bar.rsi
state: bar_2
service: !type:CP14BuyItemsService
product: CP14GoldBar5
- type: cp14TradingPosition
id: CP14MithrilBar5
faction: DwarfMining
reputationLevel: 2
priceMarkup: 5
uiPosition: 5
icon:
sprite: _CP14/Objects/Materials/mithril_bar.rsi
state: bar_2
service: !type:CP14BuyItemsService
product: CP14MithrilBar5

View File

@@ -5,9 +5,16 @@
- type: cp14TradingFaction
id: VictoriaGardens
color: "#67db67"
name: cp14-trade-faction-victoria-gardens
- type: cp14TradingFaction
id: BradPotions
color: "#ad67db"
name: cp14-trade-faction-brad-potions
- type: cp14TradingFaction
id: DwarfMining
color: "#b05a3e"
name: cp14-trade-faction-dwarf-mining

View File

@@ -1,7 +1,9 @@
# Rep 0
- type: cp14TradingPosition
id: CP14FoodCabbage
faction: VictoriaGardens
uiPosition: 0, 0
uiPosition: 0
icon:
sprite: _CP14/Objects/Flora/Farm/cabbage.rsi
state: base1
@@ -9,21 +11,10 @@
product: CP14FoodCabbage
count: 3
- type: cp14TradingPosition
id: CP14FoodPumpkin
faction: VictoriaGardens
uiPosition: 0, 1
icon:
sprite: _CP14/Objects/Flora/Farm/pumpkin.rsi
state: base1
service: !type:CP14BuyItemsService
product: CP14FoodPumpkin
count: 3
- type: cp14TradingPosition
id: CP14FoodPotato
faction: VictoriaGardens
uiPosition: 0, 2
uiPosition: 1
icon:
sprite: _CP14/Objects/Flora/Farm/potato.rsi
state: base1
@@ -34,7 +25,7 @@
- type: cp14TradingPosition
id: CP14FoodCucumber
faction: VictoriaGardens
uiPosition: 0, 3
uiPosition: 2
icon:
sprite: _CP14/Objects/Flora/Farm/cucumber.rsi
state: base1
@@ -45,7 +36,7 @@
- type: cp14TradingPosition
id: CP14FoodTomatoes
faction: VictoriaGardens
uiPosition: 1, 0
uiPosition: 3
icon:
sprite: _CP14/Objects/Flora/Farm/tomatoes.rsi
state: base1
@@ -53,21 +44,10 @@
product: CP14FoodTomatoes
count: 3
- type: cp14TradingPosition
id: CP14FoodApple
faction: VictoriaGardens
uiPosition: 1, 1
icon:
sprite: _CP14/Objects/Flora/Farm/apple.rsi
state: base1
service: !type:CP14BuyItemsService
product: CP14FoodApple
count: 3
- type: cp14TradingPosition
id: CP14FoodPepper
faction: VictoriaGardens
uiPosition: 1, 2
uiPosition: 4
icon:
sprite: _CP14/Objects/Flora/Farm/pepper.rsi
state: base1
@@ -78,7 +58,7 @@
- type: cp14TradingPosition
id: CP14FoodOnion
faction: VictoriaGardens
uiPosition: 1, 3
uiPosition: 5
icon:
sprite: _CP14/Objects/Flora/Farm/onion.rsi
state: base1
@@ -86,3 +66,28 @@
product: CP14FoodOnion
count: 3
# Rep 1
- type: cp14TradingPosition
id: CP14FoodApple
faction: VictoriaGardens
reputationLevel: 1
uiPosition: 0
icon:
sprite: _CP14/Objects/Flora/Farm/apple.rsi
state: base1
service: !type:CP14BuyItemsService
product: CP14FoodApple
count: 3
- type: cp14TradingPosition
id: CP14FoodPumpkin
faction: VictoriaGardens
reputationLevel: 1
uiPosition: 1
icon:
sprite: _CP14/Objects/Flora/Farm/pumpkin.rsi
state: base1
service: !type:CP14BuyItemsService
product: CP14FoodPumpkin
count: 3

View File

@@ -22,6 +22,9 @@
{
"name": "icon"
},
{
"name": "tool"
},
{
"name": "inhand-left",
"directions": 4

Binary file not shown.

After

Width:  |  Height:  |  Size: 463 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 613 B

View File

@@ -15,6 +15,9 @@
},
{
"name": "brad_potions"
},
{
"name": "dwarf_mining"
}
]
}