C.H.I.M.P handcannon redesign (#19004)

* Added basic alternative fire mode system for the CHIMP

* Redesign of the CHIMP handcannon
- the CHIMP now has an internal rechargable battery (10 shots at 100% charge)
- it has three alternative fire modes, one for each particle type, that its user can easily switch between
- syndicate scientists have access to an experimental version which can also fire omega particles (4 TC)
- each particle type now has a distinct color and damage type: delta (red): heat, epsilon (green): radiation, zeta (yellow): shock, omega (purple): heat + radiation. This affects A.P.E.s as well
- CHIMP particles now do 10 damage (up from 5)
- all CHIMP particle cartridges have been removed from the game (including the syndicate omega particle ammo pack)

* Code revisions

* Code revisions
- Removed changes to particle damage and damage types
- The experimental CHIMP was removed from the syndicate uplink and replaced with an upgrade kit, which when used on a standard CHIMP will convert it to an experimental one

* Code revisions
- Added a 2 second DoAfter for applying the upgrade kit

* Fixed spelling mistake

* Update projectiles.yml

Removed commented code

* Update Content.Server/Weapons/Ranged/Systems/AlternativeFireModesSystem.cs

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>

* Code revisions
- Implemented changes requested by EmoGarbage
- Removed UpgradeKitComponent in favor of using a construction graph
- Renamed AlternativeFireModesComponent.cs to BatteryWeaponFireModesComponent.cs

Textures
- Reverted omega particle to being a green color
- Epsilon particles are now a cyan color

* Added comments

* Revisions
- Moved BatteryWeaponFireModesComponent from Shared to Server
- Restricted access to this component to BatteryWeaponFireModesSystem
- Changed the CHIMP upgrade kit to a chip
- Updated the localization files to reflect this change

* Delete interaction-upgrade-kit-component.ftl

This file is no longer needed

* Update battery_guns.yml

Added new description for the experimental CHIMP

* Update battery_guns.yml

Updated experimental CHIMP description again...

* Fixed issue with ItemComponent

---------

Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com>
This commit is contained in:
chromiumboy 2023-08-19 17:54:52 -05:00 committed by GitHub
parent a950b327be
commit 26eb71f1eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 316 additions and 165 deletions

View File

@ -1,4 +1,4 @@
using Content.Server.Anomaly.Components;
using Content.Server.Anomaly.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Server.Audio;
using Content.Server.Explosion.EntitySystems;

View File

@ -0,0 +1,44 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Content.Server.Weapons.Ranged.Systems;
namespace Content.Server.Weapons.Ranged.Components;
/// <summary>
/// Allows battery weapons to fire different types of projectiles
/// </summary>
[RegisterComponent]
[Access(typeof(BatteryWeaponFireModesSystem))]
[AutoGenerateComponentState]
public sealed partial class BatteryWeaponFireModesComponent : Component
{
/// <summary>
/// A list of the different firing modes the weapon can switch between
/// </summary>
[DataField("fireModes", required: true)]
[AutoNetworkedField]
public List<BatteryWeaponFireMode> FireModes = new();
/// <summary>
/// The currently selected firing mode
/// </summary>
[DataField("currentFireMode")]
[AutoNetworkedField]
public BatteryWeaponFireMode? CurrentFireMode = default!;
}
[DataDefinition]
public sealed class BatteryWeaponFireMode
{
/// <summary>
/// The projectile prototype associated with this firing mode
/// </summary>
[DataField("proto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string Prototype = default!;
/// <summary>
/// The battery cost to fire the projectile associated with this firing mode
/// </summary>
[DataField("fireCost")]
public float FireCost = 100;
}

View File

@ -0,0 +1,130 @@
using Content.Server.Popups;
using Content.Server.Weapons.Ranged.Components;
using Content.Shared.Database;
using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Verbs;
using Content.Shared.Weapons.Ranged.Components;
using Robust.Shared.Prototypes;
using System.Linq;
namespace Content.Server.Weapons.Ranged.Systems;
public sealed class BatteryWeaponFireModesSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BatteryWeaponFireModesComponent, ActivateInWorldEvent>(OnInteractHandEvent);
SubscribeLocalEvent<BatteryWeaponFireModesComponent, GetVerbsEvent<Verb>>(OnGetVerb);
SubscribeLocalEvent<BatteryWeaponFireModesComponent, ExaminedEvent>(OnExamined);
}
private void OnExamined(EntityUid uid, BatteryWeaponFireModesComponent component, ExaminedEvent args)
{
if (component.FireModes == null || component.FireModes.Count < 2)
return;
if (component.CurrentFireMode == null)
{
SetFireMode(uid, component, component.FireModes.First());
}
if (component.CurrentFireMode?.Prototype == null)
return;
if (!_prototypeManager.TryIndex<EntityPrototype>(component.CurrentFireMode.Prototype, out var proto))
return;
args.PushMarkup(Loc.GetString("gun-set-fire-mode", ("mode", proto.Name)));
}
private void OnGetVerb(EntityUid uid, BatteryWeaponFireModesComponent component, GetVerbsEvent<Verb> args)
{
if (!args.CanAccess || !args.CanInteract || args.Hands == null)
return;
if (component.FireModes == null || component.FireModes.Count < 2)
return;
if (component.CurrentFireMode == null)
{
SetFireMode(uid, component, component.FireModes.First());
}
foreach (var fireMode in component.FireModes)
{
var entProto = _prototypeManager.Index<EntityPrototype>(fireMode.Prototype);
var v = new Verb
{
Priority = 1,
Category = VerbCategory.SelectType,
Text = entProto.Name,
Disabled = fireMode == component.CurrentFireMode,
Impact = LogImpact.Low,
DoContactInteraction = true,
Act = () =>
{
SetFireMode(uid, component, fireMode, args.User);
}
};
args.Verbs.Add(v);
}
}
private void OnInteractHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, ActivateInWorldEvent args)
{
if (component.FireModes == null || component.FireModes.Count < 2)
return;
CycleFireMode(uid, component, args.User);
}
private void CycleFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, EntityUid user)
{
int index = (component.CurrentFireMode != null) ?
Math.Max(component.FireModes.IndexOf(component.CurrentFireMode), 0) + 1 : 1;
BatteryWeaponFireMode? fireMode;
if (index >= component.FireModes.Count)
{
fireMode = component.FireModes.FirstOrDefault();
}
else
{
fireMode = component.FireModes[index];
}
SetFireMode(uid, component, fireMode, user);
}
private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, BatteryWeaponFireMode? fireMode, EntityUid? user = null)
{
if (fireMode?.Prototype == null)
return;
component.CurrentFireMode = fireMode;
if (TryComp(uid, out ProjectileBatteryAmmoProviderComponent? projectileBatteryAmmoProvider))
{
if (!_prototypeManager.TryIndex<EntityPrototype>(fireMode.Prototype, out var prototype))
return;
projectileBatteryAmmoProvider.Prototype = fireMode.Prototype;
projectileBatteryAmmoProvider.FireCost = fireMode.FireCost;
if (user != null)
{
_popupSystem.PopupEntity(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value);
}
}
}
}

View File

@ -1,4 +1,4 @@
using Robust.Shared.Serialization;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
namespace Content.Shared.Anomaly;

View File

@ -8,6 +8,7 @@ anomaly-vessel-component-upgrade-output = point output
anomaly-particles-delta = Delta particles
anomaly-particles-epsilon = Epsilon particles
anomaly-particles-zeta = Zeta particles
anomaly-particles-omega = Omega particles
anomaly-scanner-component-scan-complete = Scan complete!

View File

@ -221,8 +221,8 @@ uplink-banana-peel-explosive-desc = They will burst into laughter when they slip
uplink-hot-potato-name = Hot Potato
uplink-hot-potato-desc = Once activated, this time bomb can't be dropped - only passed to someone else!
uplink-chimp-ammo-name = Box of 10 Omega Cartridges.
uplink-chimp-ammo-desc = A box of 10 omega particle cartridges for the CHIMP. Omega particles inflict severe burns and cause anomalies to go supercritical.
uplink-chimp-upgrade-kit-name = C.H.I.M.P. Handcannon Upgrade Chip
uplink-chimp-upgrade-kit-desc = Insert this chip into a standard C.H.I.M.P. handcannon to allow it to fire omega particles. Omega particles inflict severe burns and cause anomalies to go supercritical.
uplink-proximity-mine-name = Proximity Mine
uplink-proximity-mine-desc = A mine disguised as a wet floor sign.

View File

@ -5,6 +5,7 @@ gun-selector-verb = Change to {$mode}
gun-selected-mode = Selected {$mode}
gun-disabled = You can't use guns!
gun-clumsy = The gun blows up in your face!
gun-set-fire-mode = Set to {$mode}
# SelectiveFire
gun-SemiAuto = semi-auto

View File

@ -89,21 +89,6 @@
- id: MagazineMagnumSubMachineGun
amount: 3
- type: entity
name: box of omega particle cartridges
parent: BoxMagazine
id: BoxMagazineChimpOmega
description: A box full of omega particle cartridges for the CHIMP.
components:
- type: StorageFill
contents:
- id: CartridgeAnomalousParticleOmega
amount: 10
- type: Sprite
layers:
- state: box_science
- state: omegacart
- type: entity
name: box of Vector (practice) magazines
parent: BoxMagazine

View File

@ -955,10 +955,10 @@
- Mime
- type: listing
id: UplinkChimpAmmo
name: uplink-chimp-ammo-name
description: uplink-chimp-ammo-desc
productEntity: BoxMagazineChimpOmega
id: UplinkChimpUpgradeKit
name: uplink-chimp-upgrade-kit-name
description: uplink-chimp-upgrade-kit-desc
productEntity: WeaponPistolCHIMPUpgradeKit
cost:
Telecrystal: 4
categories:

View File

@ -0,0 +1,14 @@
- type: entity
name: C.H.I.M.P. handcannon upgrade chip
parent: BaseItem
id: WeaponPistolCHIMPUpgradeKit
description: An experimental upgrade kit for the C.H.I.M.P.
components:
- type: Sprite
sprite: Objects/Misc/module.rsi
state: abductor_mod
- type: Item
size: 10
- type: Tag
tags:
- WeaponPistolCHIMPUpgradeKit

View File

@ -59,76 +59,3 @@
components:
- type: CartridgeAmmo
proto: BulletMagnumAP
- type: entity
id: BaseAnomalousCartridge
parent: BaseCartridgeMagnum
description: Packs twice the punch of a standard A.P.E. particle.
abstract: true
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Ammunition/Casings/anomalous_casing.rsi
layers:
- state: base
map: ["enum.AmmoVisualLayers.Base"]
- type: Tag
tags:
- Cartridge
- CartridgeCHIMP
- type: entity
id: CartridgeAnomalousParticleDelta
parent: BaseAnomalousCartridge
name: cartridge (delta particle)
components:
- type: Sprite
layers:
- state: base
map: ["enum.AmmoVisualLayers.Base"]
- state: overlay
color: crimson
- type: CartridgeAmmo
proto: AnomalousParticleDeltaStrong
- type: entity
id: CartridgeAnomalousParticleEpsilon
parent: BaseAnomalousCartridge
name: cartridge (epsilon particle)
components:
- type: Sprite
layers:
- state: base
map: ["enum.AmmoVisualLayers.Base"]
- state: overlay
color: plum
- type: CartridgeAmmo
proto: AnomalousParticleEpsilonStrong
- type: entity
id: CartridgeAnomalousParticleZeta
parent: BaseAnomalousCartridge
name: cartridge (zeta particle)
components:
- type: Sprite
layers:
- state: base
map: ["enum.AmmoVisualLayers.Base"]
- state: overlay
color: goldenrod
- type: CartridgeAmmo
proto: AnomalousParticleZetaStrong
- type: entity
id: CartridgeAnomalousParticleOmega
parent: BaseAnomalousCartridge
name: cartridge (omega particle)
description: An experimental and often dangerous particle.
components:
- type: Sprite
layers:
- state: base
map: ["enum.AmmoVisualLayers.Base"]
- state: overlay
color: green
- type: CartridgeAmmo
proto: AnomalousParticleOmegaStrong

View File

@ -430,6 +430,63 @@
- type: StaticPrice
price: 63
- type: entity
name: C.H.I.M.P. handcannon
parent: BaseWeaponBatterySmall
id: WeaponPistolCHIMP
description: Just because it's a little C.H.I.M.P. doesn't mean it can't punch like an A.P.E.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Revolvers/chimp.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-unshaded-1
visible: false
map: ["enum.GunVisualLayers.MagUnshaded"]
shader: unshaded
- type: Appearance
- type: MagazineVisuals
magState: mag
steps: 3
zeroVisible: false
- type: Clothing
sprite: Objects/Weapons/Guns/Revolvers/chimp.rsi
- type: Gun
fireRate: 1.5
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/taser2.ogg
- type: ProjectileBatteryAmmoProvider
proto: AnomalousParticleDeltaStrong
fireCost: 100
- type: BatteryWeaponFireModes
fireModes:
- proto: AnomalousParticleDeltaStrong
fireCost: 100
- proto: AnomalousParticleEpsilonStrong
fireCost: 100
- proto: AnomalousParticleZetaStrong
fireCost: 100
- type: Construction
graph: UpgradeWeaponPistolCHIMP
node: start
- type: entity
name: experimental C.H.I.M.P. handcannon
parent: WeaponPistolCHIMP
id: WeaponPistolCHIMPUpgraded
description: This C.H.I.M.P. seems to have a greater punch than is usual...
components:
- type: BatteryWeaponFireModes
fireModes:
- proto: AnomalousParticleDeltaStrong
fireCost: 100
- proto: AnomalousParticleEpsilonStrong
fireCost: 100
- proto: AnomalousParticleOmegaStrong
fireCost: 100
- proto: AnomalousParticleZetaStrong
fireCost: 100
- type: entity
name: Eye of a behonker

View File

@ -378,7 +378,7 @@
- type: Sprite
sprite: Objects/Weapons/Guns/Projectiles/magic.rsi
layers:
- state: magicm
- state: magicm_red
shader: unshaded
- type: Ammo
muzzleFlash: null
@ -419,6 +419,10 @@
name: epsilon particles
noSpawn: true
components:
- type: Sprite
layers:
- state: magicm_cyan
shader: unshaded
- type: AnomalousParticle
particleType: Epsilon
@ -440,9 +444,13 @@
name: zeta particles
noSpawn: true
components:
- type: Sprite
layers:
- state: magicm_yellow
shader: unshaded
- type: AnomalousParticle
particleType: Zeta
- type: entity
parent: AnomalousParticleZeta
id: AnomalousParticleZetaStrong
@ -458,6 +466,7 @@
- type: entity
parent: AnomalousParticleDelta
id: AnomalousParticleOmegaStrong
name: omega particles
noSpawn: true
components:
- type: Sprite

View File

@ -152,43 +152,4 @@
- type: RevolverAmmoProvider
capacity: 5
chambers: [ True, True, True, True, True ]
ammoSlots: [ null, null, null, null, null ]
- type: entity
id: WeaponPistolCHIMP
parent: BaseWeaponRevolver
name: C.H.I.M.P. handcannon
description: Just because it's a little C.H.I.M.P. doesn't mean it can't punch like an A.P.E.
components:
- type: Sprite
sprite: Objects/Weapons/Guns/Revolvers/chimp.rsi
layers:
- state: base
map: ["enum.GunVisualLayers.Base"]
- state: mag-unshaded-1
visible: false
map: ["enum.GunVisualLayers.MagUnshaded"]
shader: unshaded
- type: Appearance
- type: MagazineVisuals
magState: mag
steps: 3
zeroVisible: false
- type: Clothing
sprite: Objects/Weapons/Guns/Revolvers/chimp.rsi
- type: RevolverAmmoProvider
whitelist:
tags:
- CartridgeCHIMP
proto: CartridgeAnomalousParticleDelta #when revolvers stop sucking cock, make this spawn empty
capacity: 10
chambers: [ True, True, True, True, True, True, True, True, True, True ]
ammoSlots: [ null, null, null, null, null, null, null, null, null, null ]
soundEject:
path: /Audio/Weapons/Guns/MagOut/revolver_magout.ogg
soundInsert:
path: /Audio/Weapons/Guns/MagIn/revolver_magin.ogg
- type: Gun
fireRate: 1.5
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/taser2.ogg
ammoSlots: [ null, null, null, null, null ]

View File

@ -239,9 +239,6 @@
- PowerCellMedium
- PowerCellHigh
- WeaponPistolCHIMP
- CartridgeAnomalousParticleDelta
- CartridgeAnomalousParticleEpsilon
- CartridgeAnomalousParticleZeta
- SynthesizerInstrument
- RPED
- ClothingShoesBootsMag

View File

@ -0,0 +1,13 @@
- type: constructionGraph
id: UpgradeWeaponPistolCHIMP
start: start
graph:
- node: start
edges:
- to: upgraded
steps:
- tag: WeaponPistolCHIMPUpgradeKit
doAfter: 2
- node: upgraded
entity: WeaponPistolCHIMPUpgraded

View File

@ -207,27 +207,6 @@
Steel: 10
Glass: 5
- type: latheRecipe
id: CartridgeAnomalousParticleDelta
result: CartridgeAnomalousParticleDelta
completetime: 2
materials:
Plastic: 25
- type: latheRecipe
id: CartridgeAnomalousParticleEpsilon
result: CartridgeAnomalousParticleEpsilon
completetime: 2
materials:
Plastic: 25
- type: latheRecipe
id: CartridgeAnomalousParticleZeta
result: CartridgeAnomalousParticleZeta
completetime: 2
materials:
Plastic: 25
- type: latheRecipe
id: TargetHuman
result: TargetHuman

View File

@ -108,9 +108,6 @@
cost: 10000
recipeUnlocks:
- WeaponPistolCHIMP
- CartridgeAnomalousParticleDelta
- CartridgeAnomalousParticleEpsilon
- CartridgeAnomalousParticleZeta
technologyPrerequisites:
- BasicAnomalousResearch

View File

@ -998,6 +998,9 @@
- type: Tag
id: WallmountSubstationElectronics
- type: Tag
id: WeaponPistolCHIMPUpgradeKit
- type: Tag
id: Window

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -28,6 +28,39 @@
0.1
]
]
},
{
"name": "magicm_yellow",
"delays": [
[
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "magicm_red",
"delays": [
[
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "magicm_cyan",
"delays": [
[
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "spell",