[MIRROR] The Laser Musket (2023) (Settlement Helper Edition) [MDB IGNORE] (#22156)

* The Laser Musket (2023) (Settlement Helper Edition) (#76231)

## About The Pull Request
This adds a craftable laser musket to the game. It's slow and unwieldy,
but consistent! I'd be happy to tweak the numbers if it's too good/bad.

This PR also adds an independent militia ERT, who travels the spinward
sector to help defend stations!

TO DO LIST:

- [x] Finish worn sprites
- [x] Add a crafting recipe on par with the pipegun
- [x] Add bayonets
- [x] Separate charging into two stages and REDO THE AUDIO AAAA
- [x] Clean up code (Needs review, totally)

Scrapped:

- Possibly add overcharge mechanic (This is just beyond my skill level
for now)
- Find a unique sound for the weapon firing (We have a unique
projectile, and I can't a sound that fits more than the laser gun one)

![image](https://github.com/tgstation/tgstation/assets/73589390/40ee8f1d-5c1f-4638-af70-ff1215b85c9e)

![1211
(1)](https://github.com/tgstation/tgstation/assets/73589390/1a4b9856-a878-4500-96ce-4fd83587fa81)

![musket (2) (2)
(2)](https://github.com/tgstation/tgstation/assets/73589390/2ebdc2ed-6f78-4761-9deb-a1b2d337a02d)

![aaaa1
(1)](https://github.com/tgstation/tgstation/assets/73589390/6076edd3-97c9-41ec-a67a-90717f97eab0)

![image](https://github.com/tgstation/tgstation/assets/73589390/c47e44bd-3f4b-44b3-aaa5-9b1c25a72cad)

Inhands by RedSentry27
Suit sprite by Kinnebian
Prime Laser Musket sprites by RedSentry27

Balance Considerations (ew):
25 damage (30 on prime)
Normal wound
40 Stamina damage (45 on prime)
Weak to armour (prime not weak to armor)
2 second charge time, needs to be charged twice
No overcharge
Requires two hands to hold (like a chainsaw)

Crafting Recipe:
One rifle stock
Fifteen Cable Coils
Four Iron Rods
One micro laser
One capacitor
One pair of prescription glasses
One drinking glass
Craft for 10 seconds with a wirecutter and screwdriver

Prime crafting recipe: (REQUIRES READING MAINTENANCE LOOT: "journal of a
space ranger")
One laser musket
Fifteen cable coils
Five silver
One water recycler
Fifteen units of nuka cola
Craft for 30 seconds with a screwdriver while wearing cowboy boots and a
cowboy hat
## Why It's Good For The Game
The idea of assistants and revs forming firing lines in the halls to
shoot eachother sounds hilarious. Besides, we need a parallel to the
pipegun, and this is the funniest way to do so.
## Changelog
🆑 Cheshify, Kinnebian, and RedSentry27
add: Maintenance engineers have sent out blueprints across the sector
for a new laser musket.
admin: A new energy-gun toting ERT is available to send to the crew.

---------

Co-authored-by: carlarctg <53100513+carlarctg@ users.noreply.github.com>

* The Laser Musket (2023) (Settlement Helper Edition)

* Update guns.dm

* Update guns.dm

* Fixes vox/teshari greyscale config paths

---------

Co-authored-by: Cheshify <73589390+Cheshify@users.noreply.github.com>
Co-authored-by: carlarctg <53100513+carlarctg@ users.noreply.github.com>
Co-authored-by: Pinta <68373373+softcerv@users.noreply.github.com>
Co-authored-by: Bloop <vinylspiders@gmail.com>
This commit is contained in:
SkyratBot
2023-07-14 21:21:42 +02:00
committed by GitHub
parent ac1054201b
commit e3cd27ab6d
27 changed files with 229 additions and 0 deletions
+1
View File
@@ -6,3 +6,4 @@
#define DOAFTER_SOURCE_SPIDER "doafter_spider"
#define DOAFTER_SOURCE_HEAL_TOUCH "doafter_heal_touch"
#define DOAFTER_SOURCE_PLANTING_DEVICE "doafter_planting_device"
#define DOAFTER_SOURCE_CHARGE_MUSKET "doafter_charge_musket"
@@ -344,6 +344,7 @@ GLOBAL_LIST_INIT(rarity_loot, list(//rare: really good items
list(//misc
/obj/item/book/granter/crafting_recipe/pipegun_prime = 1,
/obj/item/book/granter/crafting_recipe/trash_cannon = 1,
/obj/item/book/granter/crafting_recipe/laser_musket_prime = 1,
/obj/item/book/granter/sign_language = 1,
/obj/item/disk/nuclear/fake = 1,
/obj/item/skillchip/brainwashing = 1,
@@ -296,3 +296,35 @@
/obj/item/storage/toolbox = 1,
)
category = CAT_WEAPON_RANGED
/datum/crafting_recipe/laser_musket
name = "Laser Musket"
result = /obj/item/gun/energy/laser/musket
reqs = list(
/obj/item/weaponcrafting/stock = 1,
/obj/item/stack/cable_coil = 15,
/obj/item/stack/rods = 4,
/obj/item/stock_parts/micro_laser = 1,
/obj/item/stock_parts/capacitor = 1,
/obj/item/clothing/glasses/regular = 1,
/obj/item/reagent_containers/cup/glass/drinkingglass = 1,
)
tool_behaviors = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
time = 10 SECONDS
category = CAT_WEAPON_RANGED
/datum/crafting_recipe/laser_musket_prime
name = "Heroic Laser Musket"
always_available = FALSE
result = /obj/item/gun/energy/laser/musket/prime
reqs = list(
/obj/item/gun/energy/laser/musket = 1,
/obj/item/stack/cable_coil = 15,
/obj/item/stack/sheet/mineral/silver = 5,
/obj/item/stock_parts/water_recycler = 1,
/datum/reagent/consumable/nuka_cola = 15,
)
tool_behaviors = list(TOOL_SCREWDRIVER)
tool_paths = list(/obj/item/clothing/head/cowboy, /obj/item/clothing/shoes/cowboy)
time = 30 SECONDS //contemplate for a bit
category = CAT_WEAPON_RANGED
+10
View File
@@ -118,3 +118,13 @@
polldesc = "a Centcom-hired bounty hunting gang"
random_names = FALSE
ert_template = /datum/map_template/shuttle/ert/bounty
/datum/ert/militia
roles = list(/datum/antagonist/ert/militia, /datum/antagonist/ert/militia/general)
leader_role = /datum/antagonist/ert/militia/general
teamsize = 4
opendoors = FALSE
rename_team = "Frontier Militia"
mission = "Having heard the station's request for aid, assist the crew in defending themselves."
polldesc = "an independent station defense militia"
random_names = TRUE
+6
View File
@@ -193,3 +193,9 @@
. = ..()
access = list(ACCESS_CENT_GENERAL, ACCESS_CENT_LIVING) | (SSid_access.get_region_access_list(list(REGION_ALL_STATION)) - ACCESS_CHANGE_IDS)
/datum/id_trim/centcom/ert/militia
assignment = "Frontier Militia"
/datum/id_trim/centcom/ert/militia/general
assignment = "Frontier Militia General"
+8
View File
@@ -1124,6 +1124,14 @@
registered_name = JOB_ERT_CLOWN
trim = /datum/id_trim/centcom/ert/clown
/obj/item/card/id/advanced/centcom/ert/militia
registered_name = "Frontier Militia"
trim = /datum/id_trim/centcom/ert/militia
/obj/item/card/id/advanced/centcom/ert/militia/general
registered_name = "Frontier Militia General"
trim = /datum/id_trim/centcom/ert/militia/general
/obj/item/card/id/advanced/black
name = "black identification card"
desc = "This card is telling you one thing and one thing alone. The person holding this card is an utter badass."
@@ -17,3 +17,23 @@
/obj/item/book/granter/crafting_recipe/pipegun_prime/recoil(mob/living/user)
to_chat(user, span_warning("The book turns to dust in your hands."))
qdel(src)
/obj/item/book/granter/crafting_recipe/laser_musket_prime
name = "journal of a space ranger"
desc = "A singed and weathered book, how did this get onto the station?"
crafting_recipe_types = list(
/datum/crafting_recipe/laser_musket_prime
)
icon_state = "book1"
remarks = list(
"Man, these schematics look complicated.",
"What's with the soda, isn't that radioactive?",
"...but where does the cowboy hat come into play...",
"Oh, so that explains why I need the silver.",
"Yeah yeah, enough with the warnings, how does hard does it hit?",
"Going down in a blaze of glory? Who cares, time for a new gun.",
)
/obj/item/book/granter/crafting_recipe/laser_musket_prime/recoil(mob/living/user)
to_chat(user, span_warning("The book turns to dust in your hands."))
qdel(src)
+10
View File
@@ -276,3 +276,13 @@
name = "Marine Medic"
outfit = /datum/outfit/centcom/ert/marine/medic
role = "Medical Officer"
/datum/antagonist/ert/militia
name = "Frontier Militia"
outfit = /datum/outfit/centcom/militia
role = "Minuteman"
/datum/antagonist/ert/militia/general
name = "Frontier Militia General"
outfit = /datum/outfit/centcom/militia/general
role = "Minuteman Leader"
+10
View File
@@ -543,3 +543,13 @@
fire = 100
acid = 90
wound = 10
//Independant Militia
/obj/item/clothing/head/beret/militia
name = "\improper Militia General's Beret"
desc = "A rallying cry for the inhabitants of the Spinward Sector, the heroes that wear this keep the horrors of the galaxy at bay. Call them, and they'll be there in a minute!"
icon_state = "beret_badge"
greyscale_config = /datum/greyscale_config/beret_badge
greyscale_config_worn = /datum/greyscale_config/beret_badge/worn
greyscale_colors = "#43523d#a2abb0"
armor_type = /datum/armor/beret_sec
+29
View File
@@ -537,3 +537,32 @@
belt = /obj/item/storage/belt/utility/full/powertools/rcd
glasses = /obj/item/clothing/glasses/hud/diagnostic/sunglasses
additional_radio = /obj/item/encryptionkey/heads/ce
/datum/outfit/centcom/militia
name = "Militia Man"
id = /obj/item/card/id/advanced/centcom/ert/militia
suit = /obj/item/clothing/suit/armor/militia
suit_store = /obj/item/gun/energy/laser/musket
head = /obj/item/clothing/head/cowboy/black
uniform = /obj/item/clothing/under/rank/centcom/military
shoes = /obj/item/clothing/shoes/cowboy
gloves = /obj/item/clothing/gloves/combat
back = /obj/item/storage/backpack/satchel/leather
l_pocket = /obj/item/switchblade
r_pocket = /obj/item/reagent_containers/hypospray/medipen/salacid
belt = /obj/item/storage/belt/holster/energy/thermal
backpack_contents = list(
/obj/item/storage/box/survival = 1,
/obj/item/storage/medkit/emergency = 1,
/obj/item/crowbar = 1,
/obj/item/restraints/handcuffs = 1,
)
/datum/outfit/centcom/militia/general
name = "Militia General"
id = /obj/item/card/id/advanced/centcom/ert/militia/general
head = /obj/item/clothing/head/beret/militia
l_hand = /obj/item/megaphone
suit_store = /obj/item/gun/energy/laser/musket/prime
+20
View File
@@ -586,3 +586,23 @@
inhand_icon_state = "b_suit"
body_parts_covered = CHEST|GROIN|ARMS
dog_fashion = null
/obj/item/clothing/suit/armor/militia
name = "station defender's coat"
desc = "A well worn uniform used by militia across the frontier, it's thick padding useful for cushioning blows."
icon_state = "militia"
inhand_icon_state = "b_suit"
body_parts_covered = CHEST|GROIN|ARMS
cold_protection = CHEST|GROIN|ARMS
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
armor_type = /datum/armor/coat_militia
/datum/armor/coat_militia
melee = 40
bullet = 40
laser = 30
energy = 25
bomb = 50
fire = 40
acid = 50
wound = 30
@@ -24,6 +24,13 @@
/obj/item/ammo_casing/energy/laser/hos
e_cost = 120
/obj/item/ammo_casing/energy/laser/musket
projectile_type = /obj/projectile/beam/laser/musket
e_cost = 1000
/obj/item/ammo_casing/energy/laser/musket/prime
projectile_type = /obj/projectile/beam/laser/musket/prime
/obj/item/ammo_casing/energy/laser/practice
projectile_type = /obj/projectile/beam/practice
select_name = "practice"
@@ -0,0 +1,48 @@
/obj/item/gun/energy/laser/musket
name = "laser musket"
desc = "A hand-crafted laser weapon, it has a hand crank on the side to charge it up."
icon_state = "musket"
inhand_icon_state = "musket"
worn_icon_state = "las_musket"
ammo_type = list(/obj/item/ammo_casing/energy/laser/musket)
slot_flags = ITEM_SLOT_BACK
obj_flags = UNIQUE_RENAME
can_bayonet = TRUE
knife_x_offset = 22
knife_y_offset = 11
/// Indicates if the weapon has been fully charged or not
var/is_charging = FALSE
/// Prevents the weapon's charge sound from being spammed
COOLDOWN_DECLARE(charge_sound_cooldown)
/obj/item/gun/energy/laser/musket/attack_self(mob/living/user as mob)
var/obj/item/stock_parts/cell/charging_cell = get_cell()
if(charging_cell.charge >= charging_cell.maxcharge)
balloon_alert(user, "already charged!")
return
if(is_charging)
return
is_charging = TRUE
if(COOLDOWN_FINISHED(src, charge_sound_cooldown))
COOLDOWN_START(src, charge_sound_cooldown, 1.8 SECONDS)
playsound(src, 'sound/weapons/laser_crank.ogg', 40)
balloon_alert(user, "charging...")
if (!do_after(user, 2 SECONDS, src, interaction_key = DOAFTER_SOURCE_CHARGE_MUSKET))
is_charging = FALSE
return
charging_cell.give(500)
update_appearance()
is_charging = FALSE
balloon_alert(user, "charged")
/obj/item/gun/energy/laser/musket/Initialize(mapload)
. = ..()
AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_wielded = 10)
/obj/item/gun/energy/laser/musket/prime
name = "heroic laser musket"
desc = "A well-engineered, hand-charged laser weapon. Its capacitors hum with potential."
icon_state = "musket_prime"
inhand_icon_state = "musket_prime"
worn_icon_state = "las_musket_prime"
ammo_type = list(/obj/item/ammo_casing/energy/laser/musket/prime)
@@ -55,6 +55,21 @@
else if(isturf(target))
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser/wall
/obj/projectile/beam/laser/musket
name = "low-power laser"
icon_state = "laser_musket"
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
damage = 25
stamina = 40
light_color = COLOR_STRONG_VIOLET
weak_against_armour = TRUE
/obj/projectile/beam/laser/musket/prime
name = "mid-power laser"
damage = 30
stamina = 45
weak_against_armour = FALSE
/obj/projectile/beam/weak
damage = 15
Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 134 KiB

@@ -44,6 +44,11 @@
worn_icon = null
worn_icon_state = "gun"
/obj/item/gun/energy/laser/musket //We need to have this because we overwrote the icon file for laser guns.
icon = 'icons/obj/weapons/guns/energy.dmi'
lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
/obj/item/gun/energy/ionrifle
icon = 'modular_skyrat/modules/aesthetics/guns/icons/energy.dmi'
lefthand_file = 'modular_skyrat/modules/aesthetics/guns/icons/guns_lefthand.dmi'
@@ -104,6 +104,9 @@
/obj/item/clothing/head/beret/centcom_formal
greyscale_config_worn_teshari = /datum/greyscale_config/beret_badge/worn/teshari
/obj/item/clothing/head/beret/militia
greyscale_config_worn_teshari = /datum/greyscale_config/beret_badge/worn/teshari
/obj/item/clothing/head/beret/sec/navywarden
greyscale_config_worn_teshari = /datum/greyscale_config/beret_badge_fancy/worn/teshari
@@ -37,6 +37,9 @@
/obj/item/clothing/head/beret/centcom_formal
greyscale_config_worn_vox = /datum/greyscale_config/beret_badge/worn/vox
/obj/item/clothing/head/beret/militia
greyscale_config_worn_vox = /datum/greyscale_config/beret_badge/worn/vox
/obj/item/clothing/head/beret/sec/navywarden
greyscale_config_worn_vox = /datum/greyscale_config/beret_badge_fancy/worn/vox
Binary file not shown.
+1
View File
@@ -4743,6 +4743,7 @@
#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm"
#include "code\modules\projectiles\guns\energy\laser.dm"
#include "code\modules\projectiles\guns\energy\laser_gatling.dm"
#include "code\modules\projectiles\guns\energy\laser_musket.dm"
#include "code\modules\projectiles\guns\energy\mounted.dm"
#include "code\modules\projectiles\guns\energy\pulse.dm"
#include "code\modules\projectiles\guns\energy\recharge.dm"