diff --git a/code/__DEFINES/do_afters.dm b/code/__DEFINES/do_afters.dm index f46710643d0..f7f0c98c502 100644 --- a/code/__DEFINES/do_afters.dm +++ b/code/__DEFINES/do_afters.dm @@ -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" diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 4ee93801cfe..e0c5555135c 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -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, diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm index 6b6acb54412..26569e22788 100644 --- a/code/datums/components/crafting/ranged_weapon.dm +++ b/code/datums/components/crafting/ranged_weapon.dm @@ -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 diff --git a/code/datums/ert.dm b/code/datums/ert.dm index 6299e7de727..6cec6bb0bf2 100644 --- a/code/datums/ert.dm +++ b/code/datums/ert.dm @@ -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 diff --git a/code/datums/id_trim/centcom.dm b/code/datums/id_trim/centcom.dm index 22dba3a0760..c501722d6a9 100644 --- a/code/datums/id_trim/centcom.dm +++ b/code/datums/id_trim/centcom.dm @@ -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" diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index f585a2ae5b7..df74dc54f21 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -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." diff --git a/code/game/objects/items/granters/crafting/pipegun.dm b/code/game/objects/items/granters/crafting/pipegun.dm index 73e17184621..8b70b8a71e2 100644 --- a/code/game/objects/items/granters/crafting/pipegun.dm +++ b/code/game/objects/items/granters/crafting/pipegun.dm @@ -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) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index de4a9a20a82..aa30c3da589 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -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" diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 9c72525fda0..ecdb3169d3a 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -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 diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index ae3cba92eb3..dd2a77b33f7 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -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 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 35d660e3b64..7dcab5b3e36 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -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 diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index 188412a40bb..a698612dc9e 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -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" diff --git a/code/modules/projectiles/guns/energy/laser_musket.dm b/code/modules/projectiles/guns/energy/laser_musket.dm new file mode 100644 index 00000000000..bc15e417e67 --- /dev/null +++ b/code/modules/projectiles/guns/energy/laser_musket.dm @@ -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) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 3adfb0b525b..6fa6222cfb6 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -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 diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi index f5fc1ff67d5..ec1fb3e381e 100644 Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ diff --git a/icons/mob/clothing/belt_mirror.dmi b/icons/mob/clothing/belt_mirror.dmi index 3ecbdf6518b..1fc748b7b36 100644 Binary files a/icons/mob/clothing/belt_mirror.dmi and b/icons/mob/clothing/belt_mirror.dmi differ diff --git a/icons/mob/clothing/suits/armor.dmi b/icons/mob/clothing/suits/armor.dmi index 4d16599cd31..d10ca4add99 100644 Binary files a/icons/mob/clothing/suits/armor.dmi and b/icons/mob/clothing/suits/armor.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 8aeba8acd7b..987986859f5 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index a5770109909..7f84805577c 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/obj/clothing/suits/armor.dmi b/icons/obj/clothing/suits/armor.dmi index 8e50c4f7d3e..48fe5c92c33 100644 Binary files a/icons/obj/clothing/suits/armor.dmi and b/icons/obj/clothing/suits/armor.dmi differ diff --git a/icons/obj/weapons/guns/energy.dmi b/icons/obj/weapons/guns/energy.dmi index 3ec60e3f5e1..e15399547f2 100644 Binary files a/icons/obj/weapons/guns/energy.dmi and b/icons/obj/weapons/guns/energy.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index 4ffb43a3e79..e1c70c4f5ad 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/modular_skyrat/modules/aesthetics/guns/code/guns.dm b/modular_skyrat/modules/aesthetics/guns/code/guns.dm index f093c385287..76856aec040 100644 --- a/modular_skyrat/modules/aesthetics/guns/code/guns.dm +++ b/modular_skyrat/modules/aesthetics/guns/code/guns.dm @@ -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' diff --git a/modular_skyrat/modules/teshari/code/teshari_clothes.dm b/modular_skyrat/modules/teshari/code/teshari_clothes.dm index e2d7f3e7306..f834f8fee6c 100644 --- a/modular_skyrat/modules/teshari/code/teshari_clothes.dm +++ b/modular_skyrat/modules/teshari/code/teshari_clothes.dm @@ -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 diff --git a/modular_skyrat/modules/vox_sprites/code/head.dm b/modular_skyrat/modules/vox_sprites/code/head.dm index 8421af43fba..67b9ee7b904 100644 --- a/modular_skyrat/modules/vox_sprites/code/head.dm +++ b/modular_skyrat/modules/vox_sprites/code/head.dm @@ -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 diff --git a/sound/weapons/laser_crank.ogg b/sound/weapons/laser_crank.ogg new file mode 100644 index 00000000000..5dc71f27c75 Binary files /dev/null and b/sound/weapons/laser_crank.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 02242cda20f..38ec360e955 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -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"