From 881574a829615b0040364853a7a09770696b05e6 Mon Sep 17 00:00:00 2001
From: Aviu00 <93730715+Aviu00@users.noreply.github.com>
Date: Mon, 17 Jun 2024 17:12:02 +0000
Subject: [PATCH 1/6] Nerfs (#361)
* - tweak: Nerfs mostly.
* - tweak: Less tc.
* - tweak: Ebow tweak.
* - tweak: More nerfs.
* - fix: firerate.
---
.../Rules/Components/NukeopsRuleComponent.cs | 2 +-
.../Knockdown/KnockdownOnCollideComponent.cs | 8 +++++
.../Knockdown/KnockdownOnCollideSystem.cs | 30 +++++++++++++++++++
.../Prototypes/Catalog/uplink_catalog.yml | 2 +-
.../Entities/Clothing/OuterClothing/armor.yml | 4 +--
.../Clothing/OuterClothing/hardsuits.yml | 6 ++--
.../Guns/Ammunition/Cartridges/shotgun.yml | 6 ++--
.../Guns/Ammunition/Projectiles/shotgun.yml | 4 +--
.../Weapons/Guns/Projectiles/bolts.yml | 11 +++----
.../Objects/Weapons/Guns/Snipers/snipers.yml | 2 ++
.../Objects/Weapons/Guns/mini_ebow.yml | 4 +--
11 files changed, 58 insertions(+), 21 deletions(-)
create mode 100644 Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs
create mode 100644 Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs
diff --git a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
index a02807293f..828ea95c7d 100644
--- a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
+++ b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
@@ -84,7 +84,7 @@ public sealed partial class NukeopsRuleComponent : Component
/// This amount of TC will be given to each nukie
///
[DataField]
- public int WarTCAmountPerNukie = 50;
+ public int WarTCAmountPerNukie = 40;
///
/// Delay between war declaration and nuke ops arrival on station map. Gives crew time to prepare
diff --git a/Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs b/Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs
new file mode 100644
index 0000000000..5e33cac2e4
--- /dev/null
+++ b/Content.Shared/_White/Knockdown/KnockdownOnCollideComponent.cs
@@ -0,0 +1,8 @@
+namespace Content.Shared._White.Knockdown;
+
+[RegisterComponent]
+public sealed partial class KnockdownOnCollideComponent : Component
+{
+ [DataField]
+ public float BlurTime = 20f;
+}
diff --git a/Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs b/Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs
new file mode 100644
index 0000000000..5806f41a36
--- /dev/null
+++ b/Content.Shared/_White/Knockdown/KnockdownOnCollideSystem.cs
@@ -0,0 +1,30 @@
+using Content.Shared.Eye.Blinding.Components;
+using Content.Shared.Projectiles;
+using Content.Shared.Standing.Systems;
+using Content.Shared.StatusEffect;
+
+namespace Content.Shared._White.Knockdown;
+
+public sealed class KnockdownOnCollideSystem : EntitySystem
+{
+ [Dependency] private readonly SharedStandingStateSystem _standing = default!;
+ [Dependency] private readonly StatusEffectsSystem _statusEffects = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnProjectileHit);
+ }
+
+ private void OnProjectileHit(Entity ent, ref ProjectileHitEvent args)
+ {
+ _standing.TryLieDown(args.Target, null, true);
+
+ if (ent.Comp.BlurTime <= 0f)
+ return;
+
+ _statusEffects.TryAddStatusEffect(args.Target, "BlurryVision",
+ TimeSpan.FromSeconds(ent.Comp.BlurTime), true);
+ }
+}
diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml
index 17b530d031..d7934b1d6b 100644
--- a/Resources/Prototypes/Catalog/uplink_catalog.yml
+++ b/Resources/Prototypes/Catalog/uplink_catalog.yml
@@ -17,7 +17,7 @@
description: uplink-revolver-python-desc
productEntity: WeaponRevolverPythonAP
cost:
- Telecrystal: 6 # Originally was 13 TC but was not used due to high cost
+ Telecrystal: 8 # Originally was 13 TC but was not used due to high cost
categories:
- UplinkWeaponry
saleLimit: 1
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml
index 6dc1eb2a83..2599f28127 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml
@@ -61,7 +61,7 @@
coefficients:
Blunt: 0.4
Slash: 0.4
- Piercing: 0.7
+ Piercing: 0.9
Heat: 0.9
Caustic: 0.9
- type: ExplosionResistance
@@ -106,7 +106,7 @@
Piercing: 0.9
Heat: 0.4 # this technically means it protects against fires pretty well? -heat is just for lasers and stuff, not atmos temperature
- type: Reflect
- reflectProb: 1
+ reflectProb: 0.5
reflects:
- Energy
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index 9c13d1fe69..a77bb76049 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
@@ -576,7 +576,7 @@
Blunt: 0.5
Slash: 0.5
Piercing: 0.5
- Heat: 0.2
+ Heat: 0.4
Radiation: 0.01
Caustic: 0.5
- type: Item
@@ -609,7 +609,7 @@
coefficients:
Blunt: 0.4
Slash: 0.4
- Piercing: 0.3
+ Piercing: 0.4
Heat: 0.5
Radiation: 0.25
Caustic: 0.4
@@ -642,7 +642,7 @@
Blunt: 0.2
Slash: 0.2
Piercing: 0.2
- Heat: 0.2
+ Heat: 0.4
Radiation: 0.2
Caustic: 0.2
- type: ClothingSpeedModifier
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml
index 1439f1eb32..fb7cb21ae3 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml
@@ -10,7 +10,7 @@
- ShellShotgun
- type: CartridgeAmmo
count: 6
- spread: 22
+ spread: 28
soundEject:
collection: ShellEject
- type: Sprite
@@ -130,7 +130,7 @@
maxTransferAmount: 7
- type: SpentAmmoVisuals
state: "practice"
-
+
- type: entity
id: ShellShotgunImprovised
name: improvised shotgun shell
@@ -146,7 +146,7 @@
node: shell
- type: CartridgeAmmo
count: 10
- spread: 45
+ spread: 45
proto: PelletShotgunImprovised
- type: SpentAmmoVisuals
state: "improvised"
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
index 698e6b7b19..8f07ec2a4a 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml
@@ -10,7 +10,7 @@
- type: Projectile
damage:
types:
- Piercing: 28
+ Piercing: 40
- type: entity
id: PelletShotgunBeanbag
@@ -87,7 +87,7 @@
damage:
types:
Piercing: 3
- Slash: 3
+ Slash: 3
- type: entity
id: PelletShotgunTranquilizer
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml
index 5e3cf9944a..ebd0a74a03 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/bolts.yml
@@ -26,10 +26,7 @@
hard: false
mask:
- Opaque
- - type: StunOnCollide
- stunAmount: 1
- knockdownAmount: 1
- slowdownAmount: 5
- walkSpeedModifier: 0.5
- runSpeedModifier: 0.3
-
+ - type: KnockdownOnCollide
+ - type: StaminaDamageOnCollide
+ ignoreResistances: false
+ damage: 60
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml
index 485c2a9f0c..6336098609 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml
@@ -65,6 +65,8 @@
- CartridgeAntiMateriel
capacity: 5
proto: CartridgeAntiMateriel
+ - type: Gun
+ fireRate: 0.6
- type: Wieldable
forceTwoHanded: True
- type: Telescope
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml
index aaadbb7aa5..9e058ee512 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/mini_ebow.yml
@@ -15,11 +15,11 @@
- Belt
- type: Gun
resetOnHandSelected: false
- fireRate: 0.3
+ fireRate: 0.5
soundGunshot:
path: /Audio/Weapons/click.ogg
- type: RechargeBasicEntityAmmo
- rechargeCooldown: 2.5
+ rechargeCooldown: 1.5
rechargeSound:
path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg
- type: BasicEntityAmmoProvider
From 80ad59d9240f05e3a993b9d8db1b3fd14dbe0115 Mon Sep 17 00:00:00 2001
From: RavmorganButOnCocaine
Date: Mon, 17 Jun 2024 17:13:05 +0000
Subject: [PATCH 2/6] Automatic changelog update
---
Resources/Changelog/ChangelogWhite.yml | 55 ++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml
index 7c9fb0322f..ffdfc3b435 100644
--- a/Resources/Changelog/ChangelogWhite.yml
+++ b/Resources/Changelog/ChangelogWhite.yml
@@ -4427,3 +4427,58 @@
id: 307
time: '2024-06-16T15:33:26.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/360
+- author: Aviu
+ changes:
+ - message: "\u041C\u0438\u043D\u0438 \u0430\u0440\u0431\u0430\u043B\u0435\u0442\
+ \ \u043F\u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D. \u0422\
+ \u0435\u043F\u0435\u0440\u044C \u043E\u043D \u043D\u0435 \u0441\u0442\u0430\u043D\
+ \u0438\u0442, \u0430 \u043A\u043B\u0430\u0434\u0435\u0442 \u043D\u0430 \u0437\
+ \u0435\u043C\u043B\u044E. \u041D\u0430\u043D\u043E\u0441\u0438\u0442 60 \u0443\
+ \u0440\u043E\u043D\u0430 \u043F\u043E \u0441\u0442\u0430\u043C\u0438\u043D\u0435\
+ \ (\u043D\u0435 \u0438\u0433\u043D\u043E\u0440\u0438\u0440\u0443\u0435\u0442\
+ \ \u0431\u0440\u043E\u043D\u044E), \u043F\u0435\u0440\u0435\u0437\u0430\u0440\
+ \u044F\u0436\u0430\u0435\u0442\u0441\u044F \u0431\u044B\u0441\u0442\u0440\u0435\
+ \u0435, \u0440\u0430\u0437\u043C\u044B\u0432\u0430\u0435\u0442 \u0437\u0440\u0435\
+ \u043D\u0438\u0435 \u043F\u0440\u0438 \u043F\u043E\u043F\u0430\u0434\u0430\u043D\
+ \u0438\u0438."
+ type: Add
+ - message: "\u041C\u0438\u043D\u0443\u0441 10 \u0442\u043A \u0437\u0430 \u0432\u043E\
+ \u0439\u043D\u0443."
+ type: Tweak
+ - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0440\u0435\u0437\u0438\
+ \u0441\u0442 \u043A \u0442\u0435\u043F\u043B\u043E\u0432\u043E\u043C\u0443 \u0443\
+ \ \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u044D\u043B\u0438\u0442\
+ \u044B \u0438 \u0434\u0436\u0430\u0433\u0433\u0435\u0440\u043D\u0430\u0443\u0442\
+ \u0430."
+ type: Tweak
+ - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D \u0440\u0435\u0437\u0438\
+ \u0441\u0442 \u043A \u043F\u0440\u043E\u043D\u0438\u043A\u0430\u044E\u0449\u0435\
+ \u043C\u0443 \u0443 \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043A\
+ \u043E\u043C\u0430\u043D\u0434\u0438\u0440\u0430 \u043E\u043F\u0435\u0440\u0430\
+ \u0442\u0438\u0432\u043D\u0438\u043A\u043E\u0432/\u043B\u0438\u0434\u0435\u0440\
+ \u0430 \u0415\u0420\u0422 \u0438 \u0443 \u043F\u0440\u043E\u0442\u0438\u0432\
+ \u043E\u0443\u0434\u0430\u0440\u043A\u0438."
+ type: Tweak
+ - message: "\u041E\u0442\u0440\u0430\u0436\u0430\u044E\u0449\u0438\u0439 \u0436\u0438\
+ \u043B\u0435\u0442 \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435 \u043E\u0442\
+ \u0440\u0430\u0436\u0430\u0435\u0442 100% \u0432\u044B\u0441\u0442\u0440\u0435\
+ \u043B\u043E\u0432."
+ type: Tweak
+ - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0430 \u0446\u0435\u043D\
+ \u0430 \u043F\u0438\u0442\u043E\u043D\u0430 \u043E\u0431\u0440\u0430\u0442\u043D\
+ \u043E \u0434\u043E 8."
+ type: Tweak
+ - message: "\u041D\u0435\u043C\u043D\u043E\u0433\u043E \u0443\u0432\u0435\u043B\u0438\
+ \u0447\u0435\u043D \u0440\u0430\u0437\u0431\u0440\u043E\u0441 \u0443 \u0434\u0440\
+ \u043E\u0431\u043E\u0432\u0438\u043A\u043E\u0432."
+ type: Tweak
+ - message: "\u0423\u043C\u0435\u043D\u044C\u0448\u0435\u043D\u0430 \u0441\u043A\u043E\
+ \u0440\u043E\u0441\u0442\u0440\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u044C\
+ \ \u0445\u0440\u0438\u0441\u0442\u043E\u0432\u0430."
+ type: Tweak
+ - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D \u0443\u0440\u043E\u043D\
+ \ \u0441\u043B\u0430\u0433\u043E\u0432 \u0434\u043E 40."
+ type: Tweak
+ id: 308
+ time: '2024-06-17T17:12:02.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/361
From aa2c8d7c982133c27984026533053e1b615558d0 Mon Sep 17 00:00:00 2001
From: Aviu00 <93730715+Aviu00@users.noreply.github.com>
Date: Tue, 18 Jun 2024 10:58:36 +0000
Subject: [PATCH 3/6] - tweak: Expedition tweak. (#362)
---
.../Clothing/OuterClothing/hardsuits.yml | 2 +-
.../Prototypes/Entities/Mobs/NPCs/carp.yml | 19 ++-
.../Prototypes/Entities/Mobs/NPCs/xeno.yml | 18 +--
.../Entities/Mobs/Player/dragon.yml | 20 ++-
.../Weapons/Guns/Projectiles/projectiles.yml | 2 +-
.../Procedural/salvage_difficulties.yml | 16 +--
.../Procedural/salvage_factions.yml | 32 +++--
.../Prototypes/Procedural/salvage_loot.yml | 114 +++++++++++-------
8 files changed, 144 insertions(+), 79 deletions(-)
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index a77bb76049..614ed6dc1c 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
@@ -179,7 +179,7 @@
Blunt: 0.6
Slash: 0.6
Piercing: 0.5
- Heat: 0.3
+ Heat: 0.5
Radiation: 0.1
Caustic: 0.5
- type: ExplosionResistance
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml
index 4550d029fd..ff0627f79c 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml
@@ -11,6 +11,10 @@
rootTask:
task: SimpleHostileCompound
blackboard:
+ NavInteract: !type:Bool
+ true
+ NavPry: !type:Bool
+ true
NavSmash: !type:Bool
true
- type: NpcFactionMember
@@ -82,6 +86,17 @@
- type: NightVision
toggleSound: null
color: "#404040"
+ - type: Tool
+ speed: 2
+ qualities:
+ - Prying
+ - type: Prying
+ pryPowered: !type:Bool
+ true
+ force: !type:Bool
+ true
+ useSound:
+ path: /Audio/Items/crowbar.ogg
- type: entity
parent: BaseMobCarp
@@ -100,8 +115,6 @@
alive: Rainbow
enum.DamageStateVisualLayers.BaseUnshaded:
mouth: ""
- - type: MovementSpeedModifier
- baseSprintSpeed: 6
- type: entity
name: magicarp
@@ -148,6 +161,8 @@
energy: 0.5
- type: RgbLightController
layers: [ 0 ]
+ - type: MovementSpeedModifier
+ baseSprintSpeed: 6
- type: entity
id: MobCarpSalvage
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
index 5973c2ed3b..d67c9220b8 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml
@@ -22,7 +22,7 @@
NavSmash: !type:Bool
true
- type: Tool
- speed: 1.5
+ speed: 2
qualities:
- Prying
- type: Prying
@@ -140,12 +140,12 @@
- type: MobThresholds
thresholds:
0: Alive
- 150: Dead
+ 200: Dead
- type: Stamina
critThreshold: 300
- type: SlowOnDamage
speedModifierThresholds:
- 130: 0.7
+ 180: 0.7
- type: Fixtures
fixtures:
fix1:
@@ -178,10 +178,10 @@
- type: MobThresholds
thresholds:
0: Alive
- 150: Dead
+ 200: Dead
- type: SlowOnDamage
speedModifierThresholds:
- 130: 0.7
+ 180: 0.7
- type: MeleeWeapon
damage:
groups:
@@ -256,7 +256,7 @@
- type: MobThresholds
thresholds:
0: Alive
- 100: Dead
+ 150: Dead
- type: MovementSpeedModifier
baseSprintSpeed: 4
- type: MeleeWeapon
@@ -265,7 +265,7 @@
Brute: 20
- type: SlowOnDamage
speedModifierThresholds:
- 80: 0.7
+ 130: 0.7
- type: Fixtures
fixtures:
fix1:
@@ -322,6 +322,10 @@
spawned:
- id: FoodMeatRouny
amount: 3
+ - type: MeleeWeapon
+ damage:
+ groups:
+ Brute: 15
- type: entity
name: Spitter
diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml
index c2534e6d0e..451fb132bb 100644
--- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml
+++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml
@@ -131,6 +131,17 @@
- type: NightVision
toggleSound: null
color: "#404040"
+ - type: Tool
+ speed: 3
+ qualities:
+ - Prying
+ - type: Prying
+ pryPowered: !type:Bool
+ true
+ force: !type:Bool
+ true
+ useSound:
+ path: /Audio/Items/crowbar.ogg
- type: entity
parent: BaseMobDragon
@@ -151,6 +162,13 @@
components:
- type: GhostRole
description: ghost-role-information-space-dragon-dungeon-description
+ - type: MobThresholds
+ thresholds:
+ 0: Alive
+ 200: Dead
+ - type: SlowOnDamage
+ speedModifierThresholds:
+ 180: 0.7
# less meat spawned since it's a lot easier to kill
- type: Butcherable
spawned:
@@ -159,7 +177,7 @@
- type: MeleeWeapon
damage:
groups:
- Brute: 20
+ Brute: 25
- type: ExpeditionGhostRole
- type: entity
diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
index 71ba30fb3e..7c3df718df 100644
--- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
+++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml
@@ -1106,7 +1106,7 @@
- type: Projectile
damage:
types:
- Heat: 9
+ Heat: 10
- type: Trail
scale: 0.03, 0.0
diff --git a/Resources/Prototypes/Procedural/salvage_difficulties.yml b/Resources/Prototypes/Procedural/salvage_difficulties.yml
index a87cd15548..067ba42552 100644
--- a/Resources/Prototypes/Procedural/salvage_difficulties.yml
+++ b/Resources/Prototypes/Procedural/salvage_difficulties.yml
@@ -1,6 +1,6 @@
- type: salvageDifficulty
id: Minimal
- lootBudget: 10
+ lootBudget: 5
mobBudget: 10
modifierBudget: 1
color: "#9FED5896"
@@ -8,7 +8,7 @@
- type: salvageDifficulty
id: Minor
- lootBudget: 30
+ lootBudget: 15
mobBudget: 30
modifierBudget: 1
color: "#EFB34196"
@@ -16,24 +16,24 @@
- type: salvageDifficulty
id: Moderate
- lootBudget: 50
- mobBudget: 50
+ lootBudget: 30
+ mobBudget: 60
modifierBudget: 2
color: "#52B4E996"
recommendedPlayers: 2
- type: salvageDifficulty
id: Hazardous
- lootBudget: 70
- mobBudget: 70
+ lootBudget: 50
+ mobBudget: 100
modifierBudget: 2
color: "#DE3A3A96"
recommendedPlayers: 3
- type: salvageDifficulty
id: Extreme
- lootBudget: 100
- mobBudget: 100
+ lootBudget: 75
+ mobBudget: 150
modifierBudget: 3
color: "#D381C996"
recommendedPlayers: 4
diff --git a/Resources/Prototypes/Procedural/salvage_factions.yml b/Resources/Prototypes/Procedural/salvage_factions.yml
index cbd1dd4aa1..9187ff1ce0 100644
--- a/Resources/Prototypes/Procedural/salvage_factions.yml
+++ b/Resources/Prototypes/Procedural/salvage_factions.yml
@@ -6,21 +6,24 @@
cost: 2
- proto: MobXenoPraetorian
cost: 5
- prob: 0.1
+ prob: 0.5
- proto: MobXenoQueen
cost: 10
- prob: 0.02
+ prob: 0.1
- proto: MobXenoRavager
- cost: 5
+ cost: 4
- proto: MobXenoRunner
cost: 2
- proto: MobXenoRouny
- cost: 3
- prob: 0.02
+ cost: 2
+ prob: 0.5
- proto: MobXenoSpitter
cost: 3
- proto: WeaponTurretXeno
prob: 0.1
+ - proto: MobLaserRaptor
+ cost: 5
+ prob: 0.5
configs:
DefenseStructure: XenoWardingTower
Megafauna: MobXenoQueen
@@ -31,20 +34,23 @@
- proto: MobCarpDungeon
# These do too much damage for salvage, need nerfs
- proto: MobCarpHolo
- cost: 5
- prob: 0.05
+ cost: 8
+ prob: 0.25
- proto: MobCarpMagic
- cost: 4
- prob: 0.1
+ cost: 2
+ prob: 0.5
- proto: MobCarpRainbow # carp version of rouny...
- cost: 6
- prob: 0.05
+ cost: 4
+ prob: 0.5
- proto: MobShark
cost: 8
- prob: 0.035
+ prob: 0.25
- proto: MobDragonDungeon
cost: 12
- prob: 0.02
+ prob: 0.1
+ - proto: MobLaserRaptor
+ cost: 5
+ prob: 0.5
configs:
DefenseStructure: CarpStatue
Megafauna: MobDragonDungeon
diff --git a/Resources/Prototypes/Procedural/salvage_loot.yml b/Resources/Prototypes/Procedural/salvage_loot.yml
index 7c4bf2a8f0..17bfe7ad02 100644
--- a/Resources/Prototypes/Procedural/salvage_loot.yml
+++ b/Resources/Prototypes/Procedural/salvage_loot.yml
@@ -107,97 +107,119 @@
cost: 2
- proto: EnergyBattleAxe
prob: 0.1
- cost: 8
+ cost: 20
- proto: WeaponRifleAk
- cost: 5
+ cost: 16
- proto: TimeBeacon
cost: 2
prob: 0.5
- proto: ClothingBackpackDuffelSyndicateFilledSMG
- cost: 6
- prob: 0.5
+ cost: 15
+ prob: 0.2
- proto: ClothingBackpackDuffelSyndicateFilledShotgun
- cost: 8
- prob: 0.5
+ cost: 17
+ prob: 0.2
- proto: BriefcaseSyndieSniperBundleFilled
- cost: 10
- prob: 0.5
+ cost: 20
+ prob: 0.2
- proto: ClothingBackpackDuffelSyndicateFilledLMG
- cost: 12
- prob: 0.5
+ cost: 25
+ prob: 0.2
- proto: WeaponRevolverMateba
- cost: 5
+ cost: 10
+ prob: 0.1
- proto: WeaponRevolverDeckard
- cost: 4
+ cost: 10
- proto: ExGrenade
- cost: 3
+ cost: 8
- proto: SupermatterGrenade
- cost: 5
+ cost: 12
- proto: WhiteholeGrenade
- cost: 3
- - proto: ClothingOuterHardsuitMaxim
cost: 5
+ - proto: ClothingOuterHardsuitMaxim
+ cost: 12
- proto: GrenadeIncendiary
- cost: 4
+ cost: 8
- proto: ExperimentalSyndicateTeleporter
cost: 8
- prob: 0.5
+ prob: 0.2
- proto: ClothingHeadHelmetSwat
cost: 4
+ prob: 0.5
- proto: ClothingBeltMilitaryWebbing
cost: 2
- proto: ClothingOuterVestWeb
cost: 5
+ prob: 0.5
- proto: ClothingEyesNightVisionGoggles
- cost: 5
+ cost: 8
- proto: ClothingHandsGlovesCombat
cost: 3
- proto: Katana
- cost: 3
+ cost: 5
- proto: WeaponMakeshiftLaser
- cost: 4
- - proto: WeaponLaserGun
- cost: 5
- - proto: WeaponEgun
- cost: 5
- - proto: WeaponXrayCannon
- cost: 6
- - proto: WeaponLaserCannon
- cost: 6
- - proto: WeaponTempGun
- cost: 4
- - proto: WeaponAdvancedLaser
cost: 10
prob: 0.5
+ - proto: WeaponLaserGun
+ cost: 12
+ prob: 0.1
+ - proto: WeaponEgun
+ cost: 16
+ prob: 0.1
+ - proto: WeaponXrayCannon
+ cost: 18
+ prob: 0.1
+ - proto: WeaponLaserCannon
+ cost: 20
+ prob: 0.1
- proto: Stimpack
- cost: 6
- - proto: StimkitFilled
cost: 8
prob: 0.5
+ - proto: StimkitFilled
+ cost: 12
+ prob: 0.5
- proto: CrateSecurityRiot
- cost: 5
+ cost: 12
prob: 0.5
- proto: CrateSecurityNonlethal
- cost: 4
+ cost: 10
prob: 0.5
- proto: ClothingShoesBootsMagSyndie
- cost: 5
+ cost: 4
+ prob: 0.2
- proto: JetpackBlackFilled
cost: 3
+ prob: 0.5
- proto: WeaponLauncherRocket
- cost: 8
+ cost: 20
- proto: WeaponLauncherPirateCannon
- cost: 5
+ cost: 15
- proto: LightModule
- cost: 2
- - proto: LaserModule
- cost: 4
- - proto: FlameHiderModule
- cost: 2
- - proto: SilencerModule
cost: 3
- - proto: AcceleratorModule
+ - proto: LaserModule
+ cost: 8
+ - proto: FlameHiderModule
+ cost: 3
+ - proto: SilencerModule
cost: 5
+ - proto: AcceleratorModule
+ cost: 12
+ - proto: MedkitFilled
+ cost: 3
+ - proto: MedkitRadiationFilled
+ cost: 5
+ - proto: MedkitOxygenFilled
+ cost: 3
+ - proto: MedkitBruteFilled
+ cost: 5
+ - proto: MedkitCombatFilled
+ cost: 10
+ - proto: MedkitToxinFilled
+ cost: 5
+ - proto: MedkitBurnFilled
+ cost: 5
+ - proto: MedkitAdvancedFilled
+ cost: 8
# Mob loot table
From 99629a2ba32481fd610fb25af744a72638963b8f Mon Sep 17 00:00:00 2001
From: RavmorganButOnCocaine
Date: Tue, 18 Jun 2024 10:59:40 +0000
Subject: [PATCH 4/6] Automatic changelog update
---
Resources/Changelog/ChangelogWhite.yml | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml
index ffdfc3b435..63d6c7b64d 100644
--- a/Resources/Changelog/ChangelogWhite.yml
+++ b/Resources/Changelog/ChangelogWhite.yml
@@ -4482,3 +4482,19 @@
id: 308
time: '2024-06-17T17:12:02.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/361
+- author: Aviu
+ changes:
+ - message: "\u0422\u0432\u0438\u043A\u0438 \u044D\u043A\u0441\u043F\u0435\u0434\u0438\
+ \u0446\u0438\u0439."
+ type: Tweak
+ - message: "\u0424\u0438\u043A\u0441 \u0431\u043E\u043B\u044C\u0448\u043E\u0439\
+ \ \u0441\u043A\u043E\u0440\u043E\u0441\u0442\u0438 \u043A\u0430\u0440\u043F\u043E\
+ \u0432."
+ type: Fix
+ - message: "\u041A\u0430\u0440\u043F\u044B \u0438 \u0434\u0440\u0430\u043A\u043E\
+ \u043D \u043D\u0430\u0443\u0447\u0438\u043B\u0438\u0441\u044C \u043E\u0442\u043A\
+ \u0440\u044B\u0432\u0430\u0442\u044C \u0434\u0432\u0435\u0440\u0438."
+ type: Add
+ id: 309
+ time: '2024-06-18T10:58:36.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/362
From f25ad286b977993ea62b2eb52947d1e498e5d9d0 Mon Sep 17 00:00:00 2001
From: Aviu00 <93730715+Aviu00@users.noreply.github.com>
Date: Tue, 18 Jun 2024 14:55:21 +0000
Subject: [PATCH 5/6] Magic and gamerule tweaks (#363)
* - tweak: Wiz hardsuit tweaks.
* - tweak: Gamemode tweaks.
* - add: Mindswap spell.
* - add: Transfer wizard component on mindswap.
* - add: Wizard is blight immune.
---
Content.Server/EnergyDome/EnergyDomeSystem.cs | 12 ++
.../Rules/Components/NukeopsRuleComponent.cs | 2 +-
.../Rules/Components/ZombieRuleComponent.cs | 4 +-
.../GameTicking/Rules/NukeopsRuleSystem.cs | 12 +-
.../Rules/RevolutionaryRuleSystem.cs | 8 +-
.../EntitySystems/RevenantSystem.Abilities.cs | 5 +-
Content.Server/RoundEnd/RoundEndSystem.cs | 2 +-
.../_White/Cult/GameRule/CultRuleSystem.cs | 2 +-
.../_White/Wizard/Magic/WizardSpellsSystem.cs | 124 ++++++++++++++++--
.../_White/Wizard/WizardRuleComponent.cs | 2 +-
.../_White/Wizard/WizardRuleSystem.cs | 11 +-
.../Weapons/Ranged/Systems/SharedGunSystem.cs | 2 +
Content.Shared/_White/Wizard/WizardEvents.cs | 6 +
.../Locale/ru-RU/_white/wizard/scrolls.ftl | 3 +
.../Locale/ru-RU/_white/wizard/spellbook.ftl | 3 +
.../Locale/ru-RU/_white/wizard/spells.ftl | 3 +
.../Clothing/OuterClothing/hardsuits.yml | 4 +-
Resources/Prototypes/Magic/knock_spell.yml | 2 +
Resources/Prototypes/Magic/white.yml | 38 ++++++
.../_White/Objects/Scrolls/scrolls.yml | 9 ++
.../_White/Wizard/spellbook_catalog.yml | 18 ++-
.../Objects/Magic/magicactions.rsi/meta.json | 3 +
.../Magic/magicactions.rsi/mindswap.png | Bin 0 -> 600 bytes
23 files changed, 238 insertions(+), 37 deletions(-)
create mode 100644 Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png
diff --git a/Content.Server/EnergyDome/EnergyDomeSystem.cs b/Content.Server/EnergyDome/EnergyDomeSystem.cs
index d04935304e..d39aa401ce 100644
--- a/Content.Server/EnergyDome/EnergyDomeSystem.cs
+++ b/Content.Server/EnergyDome/EnergyDomeSystem.cs
@@ -1,3 +1,4 @@
+using Content.Server.Damage.Components;
using Content.Server.DeviceLinking.Events;
using Content.Server.DeviceLinking.Systems;
using Content.Server.Power.Components;
@@ -12,6 +13,7 @@ using Content.Shared.Inventory;
using Content.Shared.Popups;
using Content.Shared.PowerCell;
using Content.Shared.PowerCell.Components;
+using Content.Shared.Throwing;
using Content.Shared.Timing;
using Content.Shared.Toggleable;
using Content.Shared.Verbs;
@@ -35,6 +37,8 @@ public sealed partial class EnergyDomeSystem : EntitySystem
{
base.Initialize();
+ SubscribeLocalEvent(OnThrow);
+
//Generator events
SubscribeLocalEvent(OnInit);
@@ -62,6 +66,14 @@ public sealed partial class EnergyDomeSystem : EntitySystem
SubscribeLocalEvent(OnDomeDamaged);
}
+ private void OnThrow(Entity ent, ref ThrownEvent args)
+ {
+ if (args.User == null)
+ return;
+
+ RaiseLocalEvent(args.User.Value, new EnergyDomeClothesTurnOffEvent());
+ }
+
private void OnClothesTurnOff(Entity ent,
ref InventoryRelayedEvent args)
{
diff --git a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
index 828ea95c7d..38da1506a6 100644
--- a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
+++ b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs
@@ -30,7 +30,7 @@ public sealed partial class NukeopsRuleComponent : Component
/// What will happen if all of the nuclear operatives will die. Used by LoneOpsSpawn event.
///
[DataField]
- public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall;
+ public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.InstantEnd;
///
/// Text for shuttle call if RoundEndBehavior is ShuttleCall.
diff --git a/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs
index 4fe91e3a5f..7e66ac98c0 100644
--- a/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs
+++ b/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs
@@ -36,13 +36,13 @@ public sealed partial class ZombieRuleComponent : Component
/// The minimum amount of time after the round starts that the initial infected will be chosen.
///
[DataField]
- public TimeSpan MinStartDelay = TimeSpan.FromMinutes(10);
+ public TimeSpan MinStartDelay = TimeSpan.FromMinutes(3);
///
/// The maximum amount of time after the round starts that the initial infected will be chosen.
///
[DataField]
- public TimeSpan MaxStartDelay = TimeSpan.FromMinutes(15);
+ public TimeSpan MaxStartDelay = TimeSpan.FromMinutes(6);
///
/// The sound that plays when someone becomes an initial infected.
diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
index ebdbdd480f..620864bfb3 100644
--- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
@@ -45,6 +45,7 @@ using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
using System.Linq;
+using Content.Server.StationEvents.Components;
using Content.Shared.FixedPoint;
using Content.Shared.Mind;
@@ -683,9 +684,14 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
: WinCondition.AllNukiesDead);
SetWinType(uid, WinType.CrewMajor, nukeops, false);
- _roundEndSystem.DoRoundEndBehavior(
- nukeops.RoundEndBehavior, nukeops.EvacShuttleTime, nukeops.RoundEndTextSender,
- nukeops.RoundEndTextShuttleCall, nukeops.RoundEndTextAnnouncement);
+
+ // WD EDIT, check for all at once gamemode
+ if (!GameTicker.GetActiveGameRules().Where(HasComp).Any())
+ {
+ _roundEndSystem.DoRoundEndBehavior(
+ nukeops.RoundEndBehavior, nukeops.EvacShuttleTime, nukeops.RoundEndTextSender,
+ nukeops.RoundEndTextShuttleCall, nukeops.RoundEndTextAnnouncement);
+ }
// prevent it called multiple times
nukeops.RoundEndBehavior = RoundEndBehavior.Nothing;
diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs
index 69d0396e3a..0c389c5029 100644
--- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs
@@ -107,10 +107,8 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem).Any())
- _roundEnd.DoRoundEndBehavior(RoundEndBehavior.ShuttleCall, component.ShuttleCallTime);
- else
+ // Check for all at once gamemode
+ if (!_gameTicker.GetActiveGameRules().Where(HasComp).Any())
_roundEnd.EndRound();
// WD EDIT END
@@ -429,4 +427,4 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem(transferTo);
RemComp(transferFrom);
}
-}
\ No newline at end of file
+}
diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs
index f7c204899e..513571c970 100644
--- a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs
+++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs
@@ -14,6 +14,7 @@ using Content.Shared.Item;
using Content.Shared.Bed.Sleep;
using System.Linq;
using System.Numerics;
+using Content.Server._White.Wizard;
using Content.Server.Bible.Components;
using Content.Server.Maps;
using Content.Server.Revenant.Components;
@@ -335,10 +336,12 @@ public sealed partial class RevenantSystem
// WD START
var cultistQuery = GetEntityQuery();
+ var wizardQuery = GetEntityQuery();
var humanoidQuery = GetEntityQuery();
foreach (var e in _lookup.GetEntitiesInRange(uid, component.BlightRadius))
{
- if (!humanoidQuery.HasComponent(e) || !_mobState.IsAlive(e) || cultistQuery.HasComponent(e))
+ if (!humanoidQuery.HasComponent(e) || !_mobState.IsAlive(e) || cultistQuery.HasComponent(e) ||
+ wizardQuery.HasComponent(e))
continue;
var blight = EnsureComp(e);
diff --git a/Content.Server/RoundEnd/RoundEndSystem.cs b/Content.Server/RoundEnd/RoundEndSystem.cs
index 07ebffa3c4..cf90f9b84f 100644
--- a/Content.Server/RoundEnd/RoundEndSystem.cs
+++ b/Content.Server/RoundEnd/RoundEndSystem.cs
@@ -53,7 +53,7 @@ namespace Content.Server.RoundEnd
///
/// Countdown to use where there is no station alert countdown to be found.
///
- public TimeSpan DefaultCountdownDuration { get; set; } = TimeSpan.FromMinutes(10);
+ public TimeSpan DefaultCountdownDuration { get; set; } = TimeSpan.FromMinutes(5);
private CancellationTokenSource? _countdownTokenSource;
private CancellationTokenSource? _cooldownTokenSource;
diff --git a/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs b/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs
index 5ef0ce6407..f419ad95af 100644
--- a/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs
+++ b/Content.Server/_White/Cult/GameRule/CultRuleSystem.cs
@@ -311,7 +311,7 @@ public sealed class CultRuleSystem : GameRuleSystem
cult.WinCondition = CultWinCondition.Failure;
- // Check for all in once gamemode
+ // Check for all at once gamemode
if (!GameTicker.GetActiveGameRules().Where(HasComp).Any())
_roundEndSystem.EndRound();
}
diff --git a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs
index 3e0ac10fa8..a3382739fb 100644
--- a/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs
+++ b/Content.Server/_White/Wizard/Magic/WizardSpellsSystem.cs
@@ -13,14 +13,18 @@ using Content.Server.Emp;
using Content.Server.EUI;
using Content.Server.Lightning;
using Content.Server.Magic;
+using Content.Server.Mind;
using Content.Server.Singularity.EntitySystems;
using Content.Server.Standing;
using Content.Server.Weapons.Ranged.Systems;
using Content.Shared._White.BetrayalDagger;
+using Content.Shared._White.Cult.Components;
using Content.Shared._White.Events;
using Content.Shared._White.Wizard;
using Content.Shared._White.Wizard.Magic;
using Content.Shared.Actions;
+using Content.Shared.Borer;
+using Content.Shared.Changeling;
using Content.Shared.Cluwne;
using Content.Shared.Coordinates.Helpers;
using Content.Shared.Hands.Components;
@@ -35,6 +39,7 @@ using Content.Shared.Maps;
using Content.Shared.Mobs.Components;
using Content.Shared.Physics;
using Content.Shared.Popups;
+using Content.Shared.Revolutionary.Components;
using Content.Shared.StatusEffect;
using Content.Shared.Throwing;
using Robust.Shared.Audio.Systems;
@@ -71,6 +76,8 @@ public sealed class WizardSpellsSystem : EntitySystem
[Dependency] private readonly StandingStateSystem _standing = default!;
[Dependency] private readonly TelefragSystem _telefrag = default!;
[Dependency] private readonly EuiManager _euiManager = default!;
+ [Dependency] private readonly MindSystem _mindSystem = default!;
+ [Dependency] private readonly ActionContainerSystem _actionContainer = default!;
#endregion
@@ -78,6 +85,7 @@ public sealed class WizardSpellsSystem : EntitySystem
{
base.Initialize();
+ SubscribeLocalEvent(OnMindswapSpell);
SubscribeLocalEvent(OnTeleportSpell);
SubscribeLocalEvent(OnInstantRecallSpell);
SubscribeLocalEvent(OnMimeTouchSpell);
@@ -95,6 +103,73 @@ public sealed class WizardSpellsSystem : EntitySystem
SubscribeLocalEvent(OnBeforeCastSpell);
}
+ #region Mindswap
+
+ private void OnMindswapSpell(MindswapSpellEvent msg)
+ {
+ if (!CanCast(msg))
+ return;
+
+ var target = msg.Target;
+ var uid = msg.Performer;
+
+ if (HasComp(target) || HasComp(target) ||
+ HasComp(target))
+ {
+ _popupSystem.PopupEntity("Не работает на культистов, генокрадов и революционеров.", uid, uid,
+ PopupType.MediumCaution);
+ return;
+ }
+
+ if (TryComp(target, out InfestedBorerComponent? borer) && borer.ControllingBrain)
+ {
+ _popupSystem.PopupEntity("Им уже кто-то управляет.", uid, uid, PopupType.MediumCaution);
+ return;
+ }
+
+ var userHasMind = _mindSystem.TryGetMind(uid, out var mindId, out var mind);
+ var targetHasMind = _mindSystem.TryGetMind(target, out var targetMindId, out var targetMind);
+
+ if (!userHasMind)
+ return;
+
+ _mindSystem.TransferTo(mindId, target, mind: mind);
+
+ if (targetHasMind)
+ {
+ _mindSystem.TransferTo(targetMindId, uid, mind: targetMind);
+ _popupSystem.PopupEntity(Loc.GetString("Ваш разум подменили!"), uid, uid, PopupType.LargeCaution);
+ }
+
+ TransferAllMagicActions(uid, target);
+
+ _standing.TryLieDown(uid);
+ _standing.TryLieDown(target);
+
+ msg.Handled = true;
+ Speak(msg);
+
+ var hasWiz = HasComp(uid);
+ var targetHasWiz = HasComp(target);
+
+ if (hasWiz == targetHasWiz)
+ return;
+
+ if (hasWiz)
+ {
+ RemComp(uid);
+ EnsureComp(target);
+ }
+
+ if (targetHasWiz)
+ {
+ RemComp(target);
+ EnsureComp(uid);
+ }
+ }
+
+ #endregion
+
#region Teleport
private void OnTeleportSpell(TeleportSpellEvent msg)
@@ -797,27 +872,48 @@ public sealed class WizardSpellsSystem : EntitySystem
private void OnBeforeCastSpell(Entity ent, ref BeforeCastSpellEvent args)
{
var comp = ent.Comp;
+
+ if (!comp.RequiresClothes)
+ return;
+
var hasReqs = false;
- if (comp.RequiresClothes)
+ var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD);
+ while (enumerator.MoveNext(out var containerSlot))
{
- var enumerator = _inventory.GetSlotEnumerator(args.Performer, SlotFlags.OUTERCLOTHING | SlotFlags.HEAD);
- while (enumerator.MoveNext(out var containerSlot))
- {
- if (containerSlot.ContainedEntity is { } item)
- hasReqs = HasComp(item);
- else
- hasReqs = false;
+ if (containerSlot.ContainedEntity is { } item)
+ hasReqs = HasComp(item);
+ else
+ hasReqs = false;
- if (!hasReqs)
- break;
- }
+ if (!hasReqs)
+ break;
}
- if (!hasReqs)
+ if (hasReqs)
+ return;
+
+ args.Cancelled = true;
+ _popupSystem.PopupEntity(Loc.GetString("magic-component-missing-req"), args.Performer, args.Performer);
+ }
+
+ private void TransferAllMagicActions(EntityUid uid1, EntityUid uid2)
+ {
+ if (!TryComp(uid1, out ActionsContainerComponent? container1) ||
+ !TryComp(uid2, out ActionsContainerComponent? container2))
+ return;
+
+ var actions1 = container1.Container.ContainedEntities.Where(HasComp).ToList();
+ var actions2 = container2.Container.ContainedEntities.Where(HasComp).ToList();
+
+ foreach (var act in actions1)
{
- args.Cancelled = true;
- _popupSystem.PopupEntity(Loc.GetString("magic-component-missing-req"), args.Performer, args.Performer);
+ _actionContainer.TransferActionWithNewAttached(act, uid2, uid2, container: container2);
+ }
+
+ foreach (var act in actions2)
+ {
+ _actionContainer.TransferActionWithNewAttached(act, uid1, uid1, container: container1);
}
}
diff --git a/Content.Server/_White/Wizard/WizardRuleComponent.cs b/Content.Server/_White/Wizard/WizardRuleComponent.cs
index 3bdda39bbd..9495e2b208 100644
--- a/Content.Server/_White/Wizard/WizardRuleComponent.cs
+++ b/Content.Server/_White/Wizard/WizardRuleComponent.cs
@@ -50,7 +50,7 @@ public sealed partial class WizardRuleComponent : Component
[DataField]
public ProtoId Faction = "Wizard";
- public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.ShuttleCall;
+ public RoundEndBehavior RoundEndBehavior = RoundEndBehavior.InstantEnd;
[DataField]
public string RoundEndTextSender = "comms-console-announcement-title-centcom";
diff --git a/Content.Server/_White/Wizard/WizardRuleSystem.cs b/Content.Server/_White/Wizard/WizardRuleSystem.cs
index c5b45ef761..b98f86c63e 100644
--- a/Content.Server/_White/Wizard/WizardRuleSystem.cs
+++ b/Content.Server/_White/Wizard/WizardRuleSystem.cs
@@ -23,6 +23,7 @@ using Robust.Shared.Prototypes;
using System.Linq;
using Content.Server.Objectives;
using Content.Server.Station.Components;
+using Content.Server.StationEvents.Components;
using Content.Shared.Mind;
using Content.Shared.NPC.Components;
using Content.Shared.Objectives.Components;
@@ -62,7 +63,6 @@ public sealed class WizardRuleSystem : GameRuleSystem
SubscribeLocalEvent(OnStartAttempt);
SubscribeLocalEvent(OnPlayersSpawning);
SubscribeLocalEvent(OnRunLevelChanged);
- SubscribeLocalEvent(OnComponentRemove);
SubscribeLocalEvent(OnMobStateChanged);
SubscribeLocalEvent(OnPlayersGhostSpawning);
SubscribeLocalEvent(OnMindAdded);
@@ -123,11 +123,6 @@ public sealed class WizardRuleSystem : GameRuleSystem
SpawnWizardGhostRole(uid, component);
}
- private void OnComponentRemove(EntityUid uid, WizardComponent component, ComponentRemove args)
- {
- CheckAnnouncement();
- }
-
private void OnMobStateChanged(EntityUid uid, WizardComponent component, MobStateChangedEvent ev)
{
if (ev.NewMobState == MobState.Dead)
@@ -249,6 +244,10 @@ public sealed class WizardRuleSystem : GameRuleSystem
private void CheckAnnouncement()
{
+ // Check for all at once gamemode
+ if (GameTicker.GetActiveGameRules().Where(HasComp).Any())
+ return;
+
var query = QueryActiveRules();
while (query.MoveNext(out _, out _, out var wizard, out _))
{
diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs
index 873e3eeaa6..c77817d2d3 100644
--- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs
+++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs
@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Numerics;
+using Content.Shared._White.Events;
using Content.Shared._White.WeaponModules;
using Content.Shared.ActionBlocker;
using Content.Shared.Actions;
@@ -353,6 +354,7 @@ public abstract partial class SharedGunSystem : EntitySystem
return;
}
+ RaiseLocalEvent(user, new EnergyDomeClothesTurnOffEvent()); // WD
// Shoot confirmed - sounds also played here in case it's invalid (e.g. cartridge already spent).
Shoot(gunUid, gun, ev.Ammo, fromCoordinates, toCoordinates.Value, out var userImpulse, user, throwItems: attemptEv.ThrowItems);
var shotEv = new GunShotEvent(user, ev.Ammo);
diff --git a/Content.Shared/_White/Wizard/WizardEvents.cs b/Content.Shared/_White/Wizard/WizardEvents.cs
index 944ee69c91..e55ff3b241 100644
--- a/Content.Shared/_White/Wizard/WizardEvents.cs
+++ b/Content.Shared/_White/Wizard/WizardEvents.cs
@@ -178,4 +178,10 @@ public sealed partial class TeleportSpellEvent : InstantActionEvent, ISpeakSpell
public string? Speech { get; private set; }
}
+public sealed partial class MindswapSpellEvent : EntityTargetActionEvent, ISpeakSpell
+{
+ [DataField("speech")]
+ public string? Speech { get; private set; }
+}
+
#endregion
diff --git a/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl b/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl
index 40c0ac5cb9..ccbdefb1e4 100644
--- a/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl
+++ b/Resources/Locale/ru-RU/_white/wizard/scrolls.ftl
@@ -16,6 +16,7 @@ scroll-component-silence = тишину
scroll-component-recall = призыв
scroll-component-teleport = телепортацию
scroll-component-smite = кару
+scroll-component-mindswap = подмену сознания
ent-BaseScroll = магический свиток
.desc = Этот древний пергамент, ставший реликвией в арканных преданиях, хранит в себе бесчисленные мистические заклятия и забытые заклинания.
@@ -49,3 +50,5 @@ ent-ScrollTeleport = свиток телепортации
.desc = { ent-BaseScroll.desc }
ent-ScrollSmite = свиток кары
.desc = { ent-BaseScroll.desc }
+ent-ScrollMindswap = свиток подмены сознания
+ .desc = { ent-BaseScroll.desc }
diff --git a/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl b/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl
index 1d3f6e353e..2cf05319f0 100644
--- a/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl
+++ b/Resources/Locale/ru-RU/_white/wizard/spellbook.ftl
@@ -40,6 +40,9 @@ spellbook-recall-desc = { ent-ActionInstantRecallSpell.desc }
spellbook-smite-name = { ent-ActionSmite }
spellbook-smite-desc = { ent-ActionSmite.desc }
+spellbook-mindswap-name = { ent-ActionMindswapSpell }
+spellbook-mindswap-desc = { ent-ActionMindswapSpell.desc }
+
spellbook-hardsuit-name = Скафандр волшебника
spellbook-hardsuit-desc = Украшенный магическими драгоценными камнями скафандр, функционирующий так же, как и обычная мантия волшебника, но в то же время является пригодным для использования в космосе и бронированным. Небольшое замедление. Теперь вы можете произносить заклинания в космосе и местах с низкой температурой! Имеет функцию энергетического щита,который защищает от всех снарядов. Щит разряжается при получении урона и автоматически заряжается.
diff --git a/Resources/Locale/ru-RU/_white/wizard/spells.ftl b/Resources/Locale/ru-RU/_white/wizard/spells.ftl
index 075acfc6c4..c54b13bb07 100644
--- a/Resources/Locale/ru-RU/_white/wizard/spells.ftl
+++ b/Resources/Locale/ru-RU/_white/wizard/spells.ftl
@@ -42,3 +42,6 @@ ent-ActionKnock = Стук
ent-ActionSmite = Кара
.desc = Заряжает вашу руку мерзкой энергией, которую можно использовать для взрыва жертв. Заклинание требует, чтобы вы коснулись своей цели, поэтому вы не сможете использовать его в наручниках или будучи оглушённым. Не работает без волшебной мантии и шляпы.
+
+ent-ActionMindswapSpell = Подмена сознания
+ .desc = Позволяет заклинателю переключаться между телами с целью. Вы должны быть рядом с целью, в которую хотите перейти, после чего вы оба будете нокаутированы. Не работает на культистов, генокрадов и революционеров.
diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
index 614ed6dc1c..1238cd3785 100644
--- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
+++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml
@@ -685,17 +685,19 @@
toggleable-clothing: !type:ContainerSlot
- type: PowerCellSlot
cellSlotId: cell_slot
+ fitsInCharger: false
- type: ItemSlots
slots:
cell_slot:
name: power-cell-slot-component-slot-name-default
startingItem: PowerCellMicroreactor
+ disableEject: true
whitelist:
tags:
- PowerCell
- PowerCellSmall
- type: EnergyDomeGenerator
- damageEnergyDraw: 5
+ damageEnergyDraw: 20
domePrototype: EnergyDomeSmallPink
- type: ClothingSpeedModifier
walkModifier: 0.9
diff --git a/Resources/Prototypes/Magic/knock_spell.yml b/Resources/Prototypes/Magic/knock_spell.yml
index dc7b38117d..d2a280ae5a 100644
--- a/Resources/Prototypes/Magic/knock_spell.yml
+++ b/Resources/Prototypes/Magic/knock_spell.yml
@@ -4,6 +4,8 @@
description: This spell opens nearby doors.
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: InstantAction
useDelay: 8
itemIconStyle: BigAction
diff --git a/Resources/Prototypes/Magic/white.yml b/Resources/Prototypes/Magic/white.yml
index 92be6e994f..a7111a8b68 100644
--- a/Resources/Prototypes/Magic/white.yml
+++ b/Resources/Prototypes/Magic/white.yml
@@ -38,6 +38,8 @@
name: Force
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: WorldTargetAction
itemIconStyle: BigAction
useDelay: 60
@@ -100,6 +102,8 @@
name: Cards
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: WorldTargetAction
itemIconStyle: BigAction
useDelay: 60
@@ -167,6 +171,8 @@
name: Blink
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: InstantAction
useDelay: 6
itemIconStyle: BigAction
@@ -216,6 +222,8 @@
name: Cluwne Curse
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: EntityTargetAction
whitelist:
components:
@@ -235,6 +243,8 @@
name: Banana Touch
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: EntityTargetAction
whitelist:
components:
@@ -254,6 +264,8 @@
name: Mime Touch
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: EntityTargetAction
whitelist:
components:
@@ -273,6 +285,8 @@
name: Instant Recall
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: InstantRecall
- type: InstantAction
useDelay: 10
@@ -288,6 +302,8 @@
name: Teleport
noSpawn: true
components:
+ - type: Magic
+ requiresClothes: false
- type: InstantAction
checkCanInteract: false
useDelay: 60
@@ -297,3 +313,25 @@
state: teleport
event: !type:TeleportSpellEvent
speech: "SCYAR FIDE!"
+
+- type: entity
+ id: ActionMindswapSpell
+ name: Mindswap
+ noSpawn: true
+ components:
+ - type: Magic
+ requiresClothes: false
+ - type: EntityTargetAction
+ whitelist:
+ components:
+ - MindContainer
+ - ActionContainer
+ canTargetSelf: false
+ checkCanInteract: false
+ useDelay: 60
+ itemIconStyle: BigAction
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: mindswap
+ event: !type:MindswapSpellEvent
+ speech: "GIN'YU CAPAN!"
diff --git a/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml b/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml
index ab691c602a..1af1de715e 100644
--- a/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml
+++ b/Resources/Prototypes/_White/Objects/Scrolls/scrolls.yml
@@ -151,3 +151,12 @@
- type: Scroll
actionId: ActionSmite
learnPopup: scroll-component-smite
+
+- type: entity
+ id: ScrollMindswap
+ parent: BaseScroll
+ name: "Mindswap scroll"
+ components:
+ - type: Scroll
+ actionId: ActionMindswapSpell
+ learnPopup: scroll-component-mindswap
diff --git a/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml b/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml
index a9cd7016b0..97fdecd3ea 100644
--- a/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml
+++ b/Resources/Prototypes/_White/Wizard/spellbook_catalog.yml
@@ -222,13 +222,29 @@
- !type:ListingLimitedStockCondition
stock: 1
+- type: listing
+ id: SpellBookMindswap
+ name: spellbook-mindswap-name
+ description: spellbook-mindswap-desc
+ productEntity: ScrollMindswap
+ icon:
+ sprite: Objects/Magic/magicactions.rsi
+ state: mindswap
+ cost:
+ SpellPoint: 2
+ categories:
+ - UtilitySpells
+ conditions:
+ - !type:ListingLimitedStockCondition
+ stock: 1
+
- type: listing
id: SpellBookHardsuit
name: spellbook-hardsuit-name
description: spellbook-hardsuit-desc
productEntity: ClothingOuterHardsuitWizard
cost:
- SpellPoint: 4
+ SpellPoint: 5
categories:
- MagicItems
conditions:
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json
index b84afefb47..248ab268d2 100644
--- a/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json
+++ b/Resources/Textures/Objects/Magic/magicactions.rsi/meta.json
@@ -57,6 +57,9 @@
},
{
"name": "icebeam_active"
+ },
+ {
+ "name": "mindswap"
}
]
}
diff --git a/Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png b/Resources/Textures/Objects/Magic/magicactions.rsi/mindswap.png
new file mode 100644
index 0000000000000000000000000000000000000000..53b8b47a4903e5ede6c85a5fbd16a64cc6f818c5
GIT binary patch
literal 600
zcmV-e0;m0nP)GVvejZ1u+bIFok4X`mjLCVWgpZ4arwuO=dY)*|5I?jysV((DIK(`Zur4l3>q1&XGFe-qxptHB|bmAd%=zu6!gC2n!
zNCglHzrcIuMf&Xx^$m@<6@3W3giu{stw6})?qfIZ1Bnk&8A2X8KvV$BM_yrBy4zGL
z4bO>3dT|7?SPbE47_E+G1pIgG+}(3Poh=(e2FU}V`35M&iXbS7h?J+%Wr0^bMm%Xn
zMY$hNyOUKx6G9f}fXLYgmfW6CA1x+bq^+e!nq|brD-q&F9IGcj?c`spVHDsiITc!j
zi#Qz>ia2-ZR6)NL=YYsw>weEsh5TNi0RbbC2jXX&k&)0fu0s9-Rb$DK#H?|dsz5P}
zOCNya6`M6K{t9SZL&3&n2tem86l`3E0CXTs8J8gd8A2mW85fGw2h12(Njjks<0@Gz
m<~6R8dI67d{T(y
Date: Tue, 18 Jun 2024 14:56:25 +0000
Subject: [PATCH 6/6] Automatic changelog update
---
Resources/Changelog/ChangelogWhite.yml | 42 ++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml
index 63d6c7b64d..15afb03c99 100644
--- a/Resources/Changelog/ChangelogWhite.yml
+++ b/Resources/Changelog/ChangelogWhite.yml
@@ -4498,3 +4498,45 @@
id: 309
time: '2024-06-18T10:58:36.0000000+00:00'
url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/362
+- author: Aviu
+ changes:
+ - message: "\u0417\u0430\u043A\u043B\u0438\u043D\u0430\u043D\u0438\u0435 \u043F\u043E\
+ \u0434\u043C\u0435\u043D\u044B \u0441\u043E\u0437\u043D\u0430\u043D\u0438\u044F\
+ ."
+ type: Add
+ - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0440\u0430\u0443\u043D\u0434\
+ \ \u0437\u0430\u043A\u0430\u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F\
+ \ \u043F\u0440\u0438 \u0441\u043C\u0435\u0440\u0442\u0438 \u043C\u0430\u0433\
+ \u0430 \u0438\u043B\u0438 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\
+ \u0438\u043A\u043E\u0432."
+ type: Add
+ - message: "\u041C\u0430\u0433 \u043D\u0435\u0432\u043E\u0441\u043F\u0440\u0438\u0438\
+ \u043C\u0447\u0438\u0432 \u043A \u0431\u043E\u043B\u0435\u0437\u043D\u0438 \u0440\
+ \u0435\u0432\u0435\u043D\u0430\u043D\u0442\u0430."
+ type: Add
+ - message: "\u0422\u0435\u043F\u0435\u0440\u044C \u0449\u0438\u0442 \u0441\u043A\
+ \u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043C\u0430\u0433\u0430 \u0430\u0432\
+ \u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u043E\u0442\
+ \u043A\u043B\u044E\u0447\u0430\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u043F\
+ \u043E\u043F\u044B\u0442\u043A\u0435 \u0432\u044B\u0441\u0442\u0440\u0435\u043B\
+ \u0438\u0442\u044C \u0438\u043B\u0438 \u0431\u0440\u043E\u0441\u0438\u0442\u044C\
+ \ \u043D\u0430\u043D\u043E\u0441\u044F\u0449\u0438\u0439 \u0443\u0440\u043E\u043D\
+ \ \u043F\u0440\u0435\u0434\u043C\u0435\u0442."
+ type: Add
+ - message: "\u0423\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0430 \u0446\u0435\u043D\
+ \u0430 \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043C\u0430\u0433\
+ \u0430 \u0434\u043E 5."
+ type: Tweak
+ - message: "\u041E\u0441\u043B\u0430\u0431\u043B\u0435\u043D \u0449\u0438\u0442\
+ \ \u0441\u043A\u0430\u0444\u0430\u043D\u0434\u0440\u0430 \u043C\u0430\u0433\u0430\
+ ."
+ type: Tweak
+ - message: "\u041D\u0443\u043B\u0435\u0432\u044B\u0435 \u0437\u0430\u0440\u0430\u0436\
+ \u0435\u043D\u043D\u044B\u0435 \u0442\u0435\u043F\u0435\u0440\u044C \u0432\u044B\
+ \u0431\u0438\u0440\u0430\u044E\u0442\u0441\u044F \u0447\u0435\u0440\u0435\u0437\
+ \ 3-6 \u043C\u0438\u043D\u0443\u0442 \u043F\u043E\u0441\u043B\u0435 \u043D\u0430\
+ \u0447\u0430\u043B\u0430 \u0440\u0430\u0443\u043D\u0434\u0430."
+ type: Tweak
+ id: 310
+ time: '2024-06-18T14:55:21.0000000+00:00'
+ url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/363