From 349a3325ec48b97a21edbb00fc943e054f6498f1 Mon Sep 17 00:00:00 2001 From: Zonespace <41448081+Zonespace27@users.noreply.github.com> Date: Sat, 23 Apr 2022 09:34:08 -0700 Subject: [PATCH] Adds Gun Cargo (#12632) * mega-commit * js fix 1 * js fix 2 * documentation1 * balance? * balance pass * 2 -> 20 mins * m90 increase * thanks prophet (balance and stuff) * more touchups * mini correction * cmg update * tgui fix * this took me too long * permit pin removal (testing) * price bump * accidental commit * ammo cheapening * weh * this is incredibly embarassing * woo * woo * pepperballs * permit-pins are lame anyway * dep guards get permits * CI fix * model75 increase * fix lint * model75 removal * Update cargo_stuff.dm * ZONESPACE REEEEE * not the bluie's anymore * interdyne company fixes and stuff * fix * fix2 * nagant revolver removal * threshold changes * undo * techshell to dynamics * mag cost 3.5 -> 3 * dynamics 10mm auto * ammo gens manifest * ladon/osprey price changes * if ixed it for you sir * assault rifle rebalancing * review * Update modular_skyrat/modules/gun_cargo/code/datums/cargo_pack.dm Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Dragonfruits <51841793+Spc-Dragonfruits@users.noreply.github.com> * Update modular_skyrat/modules/sec_haul/code/guns/guns.dm Co-authored-by: Dragonfruits <51841793+Spc-Dragonfruits@users.noreply.github.com> * weh * add disabler crates back Co-authored-by: Gandalf <9026500+Gandalf2k15@users.noreply.github.com> Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com> Co-authored-by: Dragonfruits <51841793+Spc-Dragonfruits@users.noreply.github.com> --- code/__DEFINES/atom_hud.dm | 8 +- code/__DEFINES/~skyrat_defines/armaments.dm | 33 ++ code/__DEFINES/~skyrat_defines/gun.dm | 20 + code/__DEFINES/~skyrat_defines/projectiles.dm | 6 + code/__DEFINES/~skyrat_defines/span.dm | 4 + code/controllers/subsystem/shuttle.dm | 4 + code/datums/hud.dm | 1 + code/game/data_huds.dm | 10 +- .../crates_lockers/closets/secure/cargo.dm | 1 + .../crates_lockers/closets/secure/security.dm | 5 + code/modules/cargo/goodies.dm | 8 +- code/modules/cargo/orderconsole.dm | 11 + code/modules/cargo/packs.dm | 23 +- .../mob/living/carbon/human/human_defines.dm | 2 +- .../file_system/programs/budgetordering.dm | 10 + .../projectiles/guns/ballistic/pistol.dm | 2 +- .../security_levels/keycard_authentication.dm | 12 + code/modules/shuttle/supply.dm | 1 + code/modules/uplink/uplink_items/nukeops.dm | 6 +- interface/stylesheet.dm | 4 + .../projectiles/guns/ballistic/automatic.dm | 21 +- .../code/modules/projectiles/guns/gun.dm | 43 ++ .../master_files/icons/mob/huds/hud.dmi | Bin 12691 -> 12766 bytes .../modules/ERT_Factions/FTU/code/items.dm | 4 +- .../modules/aesthetics/guns/code/guns.dm | 15 +- .../armaments/code/armament_component.dm | 3 - .../code/armaments/_armament_primary.dm | 6 - .../code/armaments/_armaments_secondary.dm | 5 - .../code/armaments/armament_headgear.dm | 4 - .../code/armaments/armament_medical.dm | 5 - .../code/armaments/armament_melee.dm | 4 - .../code/armaments/_armament_primary.dm | 2 - .../modules/blueshield/code/blueshield.dm | 4 +- modular_skyrat/modules/cargo/code/goodies.dm | 120 ---- modular_skyrat/modules/cargo/code/packs.dm | 125 ----- .../modules/goofsec/code/department_guards.dm | 20 +- .../modules/goofsec/code/projectiles.dm | 6 + .../gun_cargo/code/armament_component.dm | 516 ++++++++++++++++++ .../gun_cargo/code/armament_datums/allstar.dm | 62 +++ .../code/armament_datums/armadyne.dm | 69 +++ .../code/armament_datums/armadyne_oldarms.dm | 58 ++ .../gun_cargo/code/armament_datums/bolt.dm | 60 ++ .../code/armament_datums/cantalan.dm | 81 +++ .../code/armament_datums/dynamics.dm | 119 ++++ .../code/armament_datums/interdyne.dm | 64 +++ .../gun_cargo/code/armament_datums/izhevsk.dm | 50 ++ .../gun_cargo/code/armament_datums/micron.dm | 142 +++++ .../code/armament_datums/nanotrasen.dm | 55 ++ .../code/armament_datums/parent_armament.dm | 20 + .../code/armament_datums/scarborough.dm | 64 +++ .../modules/gun_cargo/code/company_datums.dm | 113 ++++ .../gun_cargo/code/datums/cargo_order.dm | 29 + .../gun_cargo/code/datums/cargo_pack.dm | 13 + .../modules/gun_cargo/code/datums/hud.dm | 2 + .../modules/gun_cargo/code/gun_companies.dm | 39 ++ .../modules/gun_cargo/code/gun_subsystem.dm | 150 +++++ .../modules/gun_cargo/code/objects/access.dm | 8 + .../gun_cargo/code/objects/ammo_boxes.dm | 130 +++++ .../modules/gun_cargo/code/objects/box.dm | 15 + .../gun_cargo/code/objects/cargo_console.dm | 3 + .../gun_cargo/code/objects/firing_pin.dm | 34 ++ .../gun_cargo/code/objects/guns/interdyne.dm | 28 + .../gun_cargo/code/objects/hud_glasses.dm | 7 + .../gun_cargo/code/objects/keycard_auth.dm | 4 + .../modules/gun_cargo/icons/ammo.dmi | Bin 0 -> 541 bytes .../modules/gun_cargo/icons/honeybee.dmi | Bin 0 -> 595 bytes .../modules/gun_cargo/icons/hud_goggles.dmi | Bin 0 -> 302 bytes .../gun_cargo/icons/hud_goggles_worn.dmi | Bin 0 -> 288 bytes .../modules/gunsgalore/code/guns/akm.dm | 3 +- .../modules/gunsgalore/code/guns/luger.dm | 1 + .../modules/gunsgalore/code/guns/mp40.dm | 1 + .../modules/gunsgalore/code/guns/ppsh.dm | 1 + .../modules/gunsgalore/code/guns/stg.dm | 1 + .../modules/mapping/code/shuttles.dm | 4 +- .../modules/microfusion/code/cargo_stuff.dm | 7 +- .../modules/microfusion/code/gun_types.dm | 10 +- .../modular_weapons/code/autolathe_designs.dm | 42 +- .../modules/modular_weapons/code/automatic.dm | 38 +- .../modules/modular_weapons/code/energy.dm | 11 +- .../code/modular_projectiles.dm | 193 ++++++- .../modules/modular_weapons/code/pistol.dm | 38 +- .../modules/modular_weapons/code/revolver.dm | 3 + .../modules/modular_weapons/code/rifle.dm | 20 +- .../modular_weapons/icons/obj/ammo.dmi | Bin 4637 -> 2182 bytes .../sec_haul/code/guns/armory_spawns.dm | 9 + .../modules/sec_haul/code/guns/guns.dm | 59 +- .../sec_haul/code/guns/pepperball_gun.dm | 6 +- .../code/guns/token_system/gunsets.dm | 7 +- .../modules/sec_haul/code/misc/packs.dm | 17 - tgstation.dme | 26 + .../tgui-panel/styles/goon/chat-dark.scss | 20 + .../tgui-panel/styles/goon/chat-light.scss | 20 + tgui/packages/tgui/interfaces/Cargo.js | 9 + .../tgui/interfaces/CargoGunConsole.js | 201 +++++++ tgui/packages/tgui/interfaces/KeycardAuth.js | 8 +- 95 files changed, 2778 insertions(+), 470 deletions(-) create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_component.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/allstar.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/armadyne.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/armadyne_oldarms.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/bolt.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/cantalan.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/dynamics.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/interdyne.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/izhevsk.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/micron.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/nanotrasen.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/parent_armament.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/armament_datums/scarborough.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/company_datums.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/datums/cargo_order.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/datums/cargo_pack.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/datums/hud.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/gun_companies.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/gun_subsystem.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/access.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/ammo_boxes.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/box.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/cargo_console.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/firing_pin.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/guns/interdyne.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/hud_glasses.dm create mode 100644 modular_skyrat/modules/gun_cargo/code/objects/keycard_auth.dm create mode 100644 modular_skyrat/modules/gun_cargo/icons/ammo.dmi create mode 100644 modular_skyrat/modules/gun_cargo/icons/honeybee.dmi create mode 100644 modular_skyrat/modules/gun_cargo/icons/hud_goggles.dmi create mode 100644 modular_skyrat/modules/gun_cargo/icons/hud_goggles_worn.dmi create mode 100644 tgui/packages/tgui/interfaces/CargoGunConsole.js diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 26e7b4ec2f7..f95d8029c08 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -44,9 +44,12 @@ #define ANTAG_HUD "23" // for fans to identify pins #define FAN_HUD "24" -//SKYRAT EDIT ADDITION - GUNHUD -// ammo of guns +//SKYRAT EDIT START +/// ammo of guns #define AMMO_HUD "25" +/// if they have a gun permit +#define PERMIT_HUD "26" +//SKYRAT EDIT END //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior @@ -64,6 +67,7 @@ #define DATA_HUD_SENTIENT_DISEASE 8 #define DATA_HUD_AI_DETECT 9 #define DATA_HUD_FAN 10 +#define DATA_HUD_PERMIT 11 //SKYRAT EDIT // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/~skyrat_defines/armaments.dm b/code/__DEFINES/~skyrat_defines/armaments.dm index 198e7931446..e73bc8664a7 100644 --- a/code/__DEFINES/~skyrat_defines/armaments.dm +++ b/code/__DEFINES/~skyrat_defines/armaments.dm @@ -8,3 +8,36 @@ /// To identify the limit of the category type in the associative list. Techical stuff. #define CATEGORY_LIMIT "Category Limit" #define CATEGORY_ENTRY "Category Entry" + +// All the categories +#define ARMAMENT_CATEGORY_MELEE "Melee Weapons" +#define ARMAMENT_CATEGORY_MELEE_LIMIT 1 +#define ARMAMENT_CATEGORY_PRIMARY "Primary Weapons" +#define ARMAMENT_CATEGORY_PRIMARY_LIMIT 1 +#define ARMAMENT_CATEGORY_SECONDARY "Secondary Weapons" +#define ARMAMENT_CATEGORY_SECONDARY_LIMIT 1 +#define ARMAMENT_CATEGORY_ARMOR_HEAD "Headgear" +#define ARMAMENT_CATEGORY_ARMOR_HEAD_LIMIT 1 +#define ARMAMENT_CATEGORY_MEDICAL "Medical Supplies" +#define ARMAMENT_CATEGORY_MEDICAL_LIMIT 5 + + +// All the subcategories +#define ARMAMENT_SUBCATEGORY_AMMO "Ammunition" +#define ARMAMENT_SUBCATEGORY_MELEE_LETHAL "Lethal Weaponry" +#define ARMAMENT_SUBCATEGORY_MELEE_NONLETHAL "Non-Lethal Weaponry" +#define ARMAMENT_SUBCATEGORY_SUBMACHINEGUN "Submachine Guns" +#define ARMAMENT_SUBCATEGORY_ASSAULTRIFLE "Assault Rifles" +#define ARMAMENT_SUBCATEGORY_SPECIAL "Special Weapons" +#define ARMAMENT_SUBCATEGORY_PISTOL "Pistols" +#define ARMAMENT_SUBCATEGORY_HELMET "Helmets" +#define ARMAMENT_SUBCATEGORY_BERETS "Berets" +#define ARMAMENT_SUBCATEGORY_MEDKIT "Medkits" +#define ARMAMENT_SUBCATEGORY_INJECTOR "Injectors" +#define ARMAMENT_SUBCATEGORY_SHOTGUN "Shotguns" +#define ARMAMENT_SUBCATEGORY_LASER "Laser Weaponry" +#define ARMAMENT_SUBCATEGORY_ARMOR "Armor" +#define ARMAMENT_SUBCATEGORY_GUNPART "Gun Parts" +#define ARMAMENT_SUBCATEGORY_EMITTER "Phase Emitter" +#define ARMAMENT_SUBCATEGORY_CELL_UPGRADE "Cell Upgrade" +#define ARMAMENT_SUBCATEGORY_CHEMICAL "Chemicals" diff --git a/code/__DEFINES/~skyrat_defines/gun.dm b/code/__DEFINES/~skyrat_defines/gun.dm index 05ce5118a30..da453fe6525 100644 --- a/code/__DEFINES/~skyrat_defines/gun.dm +++ b/code/__DEFINES/~skyrat_defines/gun.dm @@ -1,3 +1,23 @@ #define SELECT_SEMI_AUTOMATIC 1 #define SELECT_BURST_SHOT 2 #define SELECT_FULLY_AUTOMATIC 3 + +// Bitflags for what company produces the gun +#define COMPANY_CANTALAN (1<<0) +#define COMPANY_ARMADYNE (1<<1) +#define COMPANY_SCARBOROUGH (1<<2) +#define COMPANY_DONK (1<<3) +#define COMPANY_BOLT (1<<4) +#define COMPANY_OLDARMS (1<<5) +#define COMPANY_IZHEVSK (1<<6) +#define COMPANY_NANOTRASEN (1<<7) +#define COMPANY_ALLSTAR (1<<8) +#define COMPANY_MICRON (1<<9) +#define COMPANY_DYNAMICS (1<<10) +#define COMPANY_INTERDYNE (1<<12) + +#define COMPANY_INTEREST_GUN 10 +#define COMPANY_INTEREST_CHEMICAL 5 +#define COMPANY_INTEREST_ATTACHMENT 4 +#define COMPANY_INTEREST_AMMO_BULK 3 +#define COMPANY_INTEREST_AMMO 1 diff --git a/code/__DEFINES/~skyrat_defines/projectiles.dm b/code/__DEFINES/~skyrat_defines/projectiles.dm index a15127a4872..96e0e61a103 100644 --- a/code/__DEFINES/~skyrat_defines/projectiles.dm +++ b/code/__DEFINES/~skyrat_defines/projectiles.dm @@ -15,3 +15,9 @@ #define CALIBER_14GAUGE "14 Gauge" #define CALIBER_50BMG ".50 BMG" + +/// The caliber used by the CFA Lynx. +#define CALIBER_42X30MM "4.2x30mm" + +/// The caliber used by the Catanheim. +#define CALIBER_A68 "a68" diff --git a/code/__DEFINES/~skyrat_defines/span.dm b/code/__DEFINES/~skyrat_defines/span.dm index 50ba89e5094..df1212e462a 100644 --- a/code/__DEFINES/~skyrat_defines/span.dm +++ b/code/__DEFINES/~skyrat_defines/span.dm @@ -13,3 +13,7 @@ #define span_crossooc(str) ("" + str + "") #define span_crossasay(str) ("" + str + "") #define span_doyourjobidiot(str) ("" + str + "") +#define span_brown(str) ("" + str + "") +#define span_cyan(str) ("" + str + "") +#define span_orange(str) ("" + str + "") +#define span_yellow(str) ("" + str + "") diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 6d67cee0f61..8651146f8cc 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -140,6 +140,10 @@ SUBSYSTEM_DEF(shuttle) while(length(pack_processing)) var/datum/supply_pack/pack = pack_processing[length(pack_processing)] pack_processing.len-- + //SKYRAT EDIT START + if(pack == /datum/supply_pack/armament) + continue + //SKYRAT EDIT END if(ispath(pack, /datum/supply_pack)) pack = new pack diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 003ca63c5bc..fb5ef579490 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_INIT(huds, list( DATA_HUD_SENTIENT_DISEASE = new/datum/atom_hud/sentient_disease(), DATA_HUD_AI_DETECT = new/datum/atom_hud/ai_detector(), DATA_HUD_FAN = new/datum/atom_hud/data/human/fan_hud(), + DATA_HUD_PERMIT = new/datum/atom_hud/data/human/permit(), // SKYRAT EDIT )) /datum/atom_hud diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index ec771a9096c..ca1b6e5e129 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -47,7 +47,7 @@ hud_icons = list(ID_HUD) /datum/atom_hud/data/human/security/advanced - hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD) + hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD, PERMIT_HUD) //SKYRAT EDIT: ADD PERMIT_HUD /datum/atom_hud/data/human/fan_hud hud_icons = list(FAN_HUD) @@ -252,6 +252,14 @@ Security HUDs! Basic mode shows only the job. sechud_icon_state = "hudno_id" holder.icon_state = sechud_icon_state sec_hud_set_security_status() + //SKYRAT EDIT START + var/image/permit_holder = hud_list[PERMIT_HUD] + permit_holder.pixel_y = I.Height() - world.icon_size + var/permit_icon_state = wear_id?.get_gun_permit_iconstate() + if(!permit_icon_state) + permit_icon_state = "hudfan_no" + permit_holder.icon_state = permit_icon_state + //SKYRAT EDIT END /mob/living/proc/sec_hud_set_implants() var/image/holder diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm index 6bd7094b146..dd0c3c3d100 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm @@ -30,3 +30,4 @@ new /obj/item/clothing/suit/hooded/wintercoat/qm(src) new /obj/item/gun/ballistic/rifle/boltaction/brand_new/quartermaster(src) // SKYRAT EDIT - The QM's 'special' head item. It spawns loaded, but you have to find more ammo if you run out and get ready to manually load rounds in! new /obj/item/cargo_teleporter(src) // SKYRAT EDIT - Adds a cargo teleporter to QM locker, so they can intice others to research it + new /obj/item/clothing/glasses/hud/gun_permit(src) //SKYRAT EDIT - GUN CARGO diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 596e56c69c9..86727f3a8ac 100755 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -133,6 +133,8 @@ new /obj/item/assembly/flash/handheld(src) new /obj/item/melee/baton/security/loaded/departmental/cargo(src) new /obj/item/clothing/glasses/hud/security(src) + new /obj/item/clothing/glasses/hud/gun_permit(src) + new /obj/item/storage/box/gunset/pepperball(src) /obj/structure/closet/secure_closet/security/engine name = "\proper engineering guard's locker" @@ -150,6 +152,7 @@ new /obj/item/assembly/flash/handheld(src) new /obj/item/melee/baton/security/loaded/departmental/engineering(src) new /obj/item/clothing/glasses/hud/security(src) + new /obj/item/storage/box/gunset/pepperball(src) /obj/structure/closet/secure_closet/security/science name = "\proper science guard's locker" @@ -167,6 +170,7 @@ new /obj/item/assembly/flash/handheld(src) new /obj/item/melee/baton/security/loaded/departmental/science(src) new /obj/item/clothing/glasses/hud/security(src) + new /obj/item/storage/box/gunset/pepperball(src) /obj/structure/closet/secure_closet/security/med name = "\proper orderly's locker" @@ -184,6 +188,7 @@ new /obj/item/assembly/flash/handheld(src) new /obj/item/melee/baton/security/loaded/departmental/medical(src) new /obj/item/clothing/glasses/hud/security(src) + new /obj/item/storage/box/gunset/pepperball(src) // SKYRAT EDIT CHANGE END -- GOOFSEC DEP GUARDS /obj/structure/closet/secure_closet/detective diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index a9619f07f38..646ec634a9b 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -3,7 +3,7 @@ access = NONE group = "Goodies" goody = TRUE - +/* // SKYRAT EDIT START - CARGO GUN /datum/supply_pack/goody/dumdum38 name = ".38 DumDum Speedloader" desc = "Contains one speedloader of .38 DumDum ammunition, good for embedding in soft targets." @@ -31,7 +31,7 @@ cost = PAYCHECK_HARD * 40 //they really mean a premium here access_view = ACCESS_FORENSICS contains = list(/obj/item/gun/ballistic/revolver/detective) - +*/ //SKYRAT EDIT END /datum/supply_pack/goody/stingbang name = "Stingbang Single-Pack" desc = "Contains one \"stingbang\" grenade, perfect for playing meanhearted pranks." @@ -44,7 +44,7 @@ desc = "Contains one sharpened survival knive. Guaranteed to fit snugly inside any Nanotrasen-standard boot. Weapons permit not included." //SKYRAT EDIT - CONTRABAND CLARIFICATION cost = PAYCHECK_HARD * 1.75 contains = list(/obj/item/knife/combat/survival) - +/* //SKYRAT EDIT START - GUN CARGO /datum/supply_pack/goody/ballistic_single name = "Combat Shotgun Single-Pack" desc = "For when the enemy absolutely needs to be replaced with lead. Contains one Aussec-designed Combat Shotgun, and one Shotgun Bandolier." @@ -72,7 +72,7 @@ cost = PAYCHECK_HARD * 15 access_view = ACCESS_ARMORY contains = list(/obj/item/storage/belt/holster/thermal) - +*/ //SKYRAT EDIT END /datum/supply_pack/goody/sologamermitts name = "Insulated Gloves Single-Pack" diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index 31a4550dfdf..223e58aa555 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -282,6 +282,11 @@ if(SO.applied_coupon) say("Coupon refunded.") SO.applied_coupon.forceMove(get_turf(src)) + //SKYRAT EDIT START + if(istype(SO, /datum/supply_order/armament)) + var/datum/supply_order/armament/the_order = SO + the_order.reimburse_armament() + //SKYRAT EDIT END SSshuttle.shopping_list -= SO . = TRUE break @@ -312,6 +317,12 @@ if("toggleprivate") self_paid = !self_paid . = TRUE + //SKYRAT EDIT START + if("gun_window") + var/datum/component/armament/cargo_gun/gun_comp = GetComponent(/datum/component/armament/cargo_gun) + gun_comp.ui_interact(usr) + . = TRUE + //SKYRAT EDIT END if(.) post_signal(cargo_shuttle) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index dab679eef00..dd3a904e422 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -279,7 +279,7 @@ group = "Security" access = ACCESS_SECURITY crate_type = /obj/structure/closet/crate/secure/gear - +/* //SKYRAT EDIT START - CARGO ARMAMENTS /datum/supply_pack/security/ammo name = "Ammo Crate" desc = "Contains three boxes of beanbag shotgun shells, three boxes of rubbershot shotgun shells and one of each special .38 speedloarders. Requires Security access to open." @@ -295,7 +295,7 @@ /obj/item/ammo_box/c38/hotshot, /obj/item/ammo_box/c38/iceblox) crate_name = "ammo crate" - +*/ //SKYRAT EDIT END /* SKYRAT EDIT: Moved to Bloat.dm name = "Armor Crate" /datum/supply_pack/security/armor name = "Armor Crate" @@ -305,20 +305,19 @@ contains = list(/obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/armor/vest, /obj/item/clothing/suit/armor/vest) - crate_name = "armor crate" */ - + crate_name = "armor crate" +*/ //SKYRAT EDIT END /datum/supply_pack/security/disabler name = "Disabler Crate" desc = "Three stamina-draining disabler weapons. Requires Security access to open." - cost = CARGO_CRATE_VALUE * 3 + cost = CARGO_CRATE_VALUE * 5 //SKYRAT EDIT 3 -> 5 access_view = ACCESS_SECURITY contains = list(/obj/item/gun/energy/disabler, /obj/item/gun/energy/disabler, /obj/item/gun/energy/disabler) crate_name = "disabler crate" - /datum/supply_pack/security/forensics name = "Forensics Crate" desc = "Stay hot on the criminal's heels with Nanotrasen's Detective Essentials(tm). Contains a forensics scanner, six evidence bags, camera, tape recorder, white crayon, and of course, a fedora. Requires Security access to open." @@ -341,7 +340,7 @@ /obj/item/clothing/head/helmet/sec) crate_name = "helmet crate" - +/* //SKYRAT EDIT START - CARGO ARMAMENTS /datum/supply_pack/security/laser name = "Lasers Crate" desc = "Contains three lethal, high-energy laser guns. Requires Security access to open." @@ -351,7 +350,7 @@ /obj/item/gun/energy/laser, /obj/item/gun/energy/laser) crate_name = "laser crate" - +*/ //SKYRAT EDIT END /datum/supply_pack/security/securitybarriers name = "Security Barrier Grenades" @@ -496,7 +495,7 @@ cost = CARGO_CRATE_VALUE * 3.5 contains = list(/obj/item/storage/box/chemimp) crate_name = "chemical implant crate" - +/* //SKYRAT EDIT START - CARGO ARMAMENTS /datum/supply_pack/security/armory/ballistic name = "Combat Shotguns Crate" desc = "For when the enemy absolutely needs to be replaced with lead. Contains three Aussec-designed Combat Shotguns, and three Shotgun Bandoliers. Requires Armory access to open." @@ -527,7 +526,7 @@ /obj/item/gun/energy/e_gun) crate_name = "energy gun crate" crate_type = /obj/structure/closet/crate/secure/plasma - +*/ //SKYRAT EDIT END /datum/supply_pack/security/armory/exileimp name = "Exile Implants Crate" @@ -651,7 +650,7 @@ /obj/item/clothing/gloves/tackler/combat, /obj/item/clothing/gloves/tackler/combat) crate_name = "swat crate" - +/* //SKYRAT EDIT START - CARGO ARMAMENTS /datum/supply_pack/security/armory/thermal name = "Thermal Pistol Crate" desc = "Contains a pair of holsters each with two experimental thermal pistols, using nanites as the basis for their ammo. Requires Armory access to open." @@ -659,7 +658,7 @@ contains = list(/obj/item/storage/belt/holster/thermal, /obj/item/storage/belt/holster/thermal) crate_name = "thermal pistol crate" - +*/ //SKYRAT EDIT END ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Engineering ///////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 0ecd0665627..a4e6e5e828e 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -5,7 +5,7 @@ icon = 'icons/mob/human.dmi' icon_state = "human_basic" appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE|LONG_GLIDE - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD,FAN_HUD,PERMIT_HUD) //SKYRAT EDIT: ADD PERMIT_HUD hud_type = /datum/hud/human pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index d128399804b..b7fad7e93b7 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -278,6 +278,16 @@ if("toggleprivate") self_paid = !self_paid . = TRUE + //SKYRAT EDIT START + if("gun_window") + var/datum/component/armament/cargo_gun/gun_comp = holder.holder.GetComponent(/datum/component/armament/cargo_gun) + if(!gun_comp) + holder.holder.AddComponent(/datum/component/armament/cargo_gun, subtypesof(/datum/armament_entry/cargo_gun), 0) + gun_comp = holder.holder.GetComponent(/datum/component/armament/cargo_gun) + gun_comp.parent_prog ||= src + gun_comp.ui_interact(usr) + . = TRUE + //SKYRAT EDIT END if(.) post_signal(cargo_shuttle) diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm index 411bd7f89bd..a72248ccae8 100644 --- a/code/modules/projectiles/guns/ballistic/pistol.dm +++ b/code/modules/projectiles/guns/ballistic/pistol.dm @@ -76,7 +76,7 @@ /obj/item/gun/ballistic/automatic/pistol/aps name = "stechkin APS machine pistol" - desc = "An old Soviet machine pistol. It fires quickly, but kicks like a mule. Uses 9mm ammo. Has a threaded barrel for suppressors." + desc = "A modernized reproduction of an old Soviet machine pistol. It fires quickly, but kicks like a mule. Uses 9mm ammo. Has a threaded barrel for suppressors." //SKYRAT EDIT icon_state = "aps" w_class = WEIGHT_CLASS_NORMAL mag_type = /obj/item/ammo_box/magazine/m9mm_aps diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 5be9ab1a82a..7c6dd6bfbf0 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -3,6 +3,7 @@ GLOBAL_DATUM_INIT(keycard_events, /datum/events, new) #define KEYCARD_RED_ALERT "Red Alert" #define KEYCARD_EMERGENCY_MAINTENANCE_ACCESS "Emergency Maintenance Access" #define KEYCARD_BSA_UNLOCK "Bluespace Artillery Unlock" +#define KEYCARD_PIN_UNRESTRICT "Unrestrict Permit Firing Pins" //SKYRAT EDIT /obj/machinery/keycard_auth name = "Keycard Authentication Device" @@ -83,6 +84,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) if(!event_source) sendEvent(KEYCARD_BSA_UNLOCK) . = TRUE + //SKYRAT EDIT START + if("pin_unrestrict") + if(!event_source) + sendEvent(KEYCARD_PIN_UNRESTRICT) + . = TRUE + //SKYRAT EDIT END /obj/machinery/keycard_auth/update_appearance(updates) . = ..() @@ -136,6 +143,10 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/keycard_auth, 26) make_maint_all_access() if(KEYCARD_BSA_UNLOCK) toggle_bluespace_artillery() + //SKYRAT EDIT START + if(KEYCARD_PIN_UNRESTRICT) + toggle_permit_pins() + //SKYRAT EDIT END GLOBAL_VAR_INIT(emergency_access, FALSE) /proc/make_maint_all_access() @@ -164,3 +175,4 @@ GLOBAL_VAR_INIT(emergency_access, FALSE) #undef KEYCARD_RED_ALERT #undef KEYCARD_EMERGENCY_MAINTENANCE_ACCESS #undef KEYCARD_BSA_UNLOCK +#undef KEYCARD_PIN_UNRESTRICT //SKYRAT EDIT diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 79555339b99..9633fe49465 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -162,6 +162,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( SSshuttle.order_history += spawning_order QDEL_NULL(spawning_order.applied_coupon) + spawning_order.on_spawn() //SKYRAT EDIT if(!spawning_order.pack.goody) //we handle goody crates below spawning_order.generate(pick_n_take(empty_turfs)) diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm index 7ec57b8baad..51245ebeb3d 100644 --- a/code/modules/uplink/uplink_items/nukeops.dm +++ b/code/modules/uplink/uplink_items/nukeops.dm @@ -154,9 +154,9 @@ illegal_tech = FALSE /datum/uplink_item/dangerous/machinegun - name = "L6 Squad Automatic Weapon" - desc = "A fully-loaded Aussec Armoury belt-fed machine gun. \ - This deadly weapon has a massive 50-round magazine of devastating 7.12x82mm ammunition." + name = "L6 Machine Gun" + desc = "A fully-loaded Scarborough Arms belt-fed machine gun. \ + This deadly weapon has a 50-round box chambered for 7.12x82mm ammunition." //SKYRAT EDIT - AUSSEC TO SCARBOROUGH item = /obj/item/gun/ballistic/automatic/l6_saw cost = 18 surplus = 0 diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index c70adf01228..0a22f426ab1 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -216,4 +216,8 @@ h1.alert, h2.alert {color: #000000;} .monkeyhive {color: #774704;} .monkeylead {color: #774704; font-size: 2;} +.brown {color: #3d2009;} +.orange {color: #b8761a;} +.yellow {color: #c7b72c;} +.cyan {color: #0ea1e6;} "} diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm b/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm index d2ea4fc2be1..57c296f9cc3 100644 --- a/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/modular_skyrat/master_files/code/modules/projectiles/guns/ballistic/automatic.dm @@ -22,13 +22,14 @@ pin = null bolt_type = BOLT_TYPE_LOCKING show_bolt_icon = FALSE + company_flag = COMPANY_NANOTRASEN /obj/item/gun/ballistic/automatic/proto/unrestricted pin = /obj/item/firing_pin /obj/item/gun/ballistic/automatic/c20r name = "\improper C-20r SMG" - desc = "A bullpup three-round burst .45 SMG, designated 'C-20r'. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." + desc = "A bullpup three-round burst .45 SMG, designated 'C-20r'." icon_state = "c20r" inhand_icon_state = "c20r" selector_switch_icon = TRUE @@ -42,6 +43,7 @@ mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE + company_flag = COMPANY_SCARBOROUGH /obj/item/gun/ballistic/automatic/c20r/update_overlays() . = ..() @@ -72,6 +74,7 @@ mag_display = TRUE mag_display_ammo = TRUE empty_indicator = TRUE + company_flag = COMPANY_NANOTRASEN /obj/item/gun/ballistic/automatic/plastikov name = "\improper PP-95 SMG" @@ -86,6 +89,8 @@ mag_display = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' + company_flag = COMPANY_IZHEVSK + dirt_modifier = 0.75 /obj/item/gun/ballistic/automatic/mini_uzi name = "\improper type U3 uzi" @@ -97,6 +102,7 @@ show_bolt_icon = FALSE mag_display = TRUE rack_sound = 'sound/weapons/gun/pistol/slide_lock.ogg' + company_flag = COMPANY_OLDARMS /obj/item/gun/ballistic/automatic/m90 name = "\improper M-90gl carbine" @@ -115,6 +121,7 @@ mag_display = TRUE empty_indicator = TRUE fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' + company_flag = COMPANY_SCARBOROUGH /obj/item/gun/ballistic/automatic/m90/Initialize() . = ..() @@ -157,9 +164,12 @@ bolt_type = BOLT_TYPE_OPEN empty_indicator = TRUE show_bolt_icon = FALSE + company_flag = COMPANY_OLDARMS /obj/item/gun/ballistic/automatic/tommygun/therealtommy name = "Tommy gun" + desc = "The classic 'Chicago Typewriter'." + company_flag = null //This is the real deal, you hear? /obj/item/gun/ballistic/automatic/ar name = "\improper NT-ARG 'Boarder'" @@ -171,13 +181,14 @@ can_suppress = FALSE burst_size = 3 fire_delay = 1 + company_flag = COMPANY_NANOTRASEN // L6 SAW // /obj/item/gun/ballistic/automatic/l6_saw name = "\improper L6 SAW" - desc = "A heavily modified 7.12x82mm light machine gun, designated 'L6 SAW'. Has 'Aussec Armoury - 2531' engraved on the receiver below the designation." + desc = "A large light machine gun chambered for the 7.12x82mm cartridge." icon_state = "l6" inhand_icon_state = "l6" base_icon_state = "l6" @@ -199,6 +210,7 @@ rack_sound = 'sound/weapons/gun/l6/l6_rack.ogg' suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/cover_open = FALSE + company_flag = COMPANY_SCARBOROUGH /obj/item/gun/ballistic/automatic/l6_saw/unrestricted pin = /obj/item/firing_pin @@ -291,6 +303,7 @@ can_suppress = TRUE can_unsuppress = TRUE pin = /obj/item/firing_pin/implant/pindicate + company_flag = COMPANY_SCARBOROUGH // Old Semi-Auto Rifle // @@ -308,9 +321,10 @@ can_suppress = TRUE w_class = WEIGHT_CLASS_HUGE slot_flags = ITEM_SLOT_BACK - //actions_types = list() SKYRAT EDIT REMOVAL fire_select_modes = list(SELECT_SEMI_AUTOMATIC) mag_display = TRUE + company_flag = COMPANY_IZHEVSK + dirt_modifier = 0.75 // Laser rifle (rechargeable magazine) // @@ -329,3 +343,4 @@ fire_select_modes = list(SELECT_SEMI_AUTOMATIC) fire_sound = 'sound/weapons/laser.ogg' casing_ejector = FALSE + company_flag = COMPANY_NANOTRASEN diff --git a/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm b/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm index b33416952ce..69da7a6c0de 100644 --- a/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm +++ b/modular_skyrat/master_files/code/modules/projectiles/guns/gun.dm @@ -95,6 +95,8 @@ var/list/fire_select_modes = list(SELECT_SEMI_AUTOMATIC) ///if i`1t has an icon for a selector switch indicating current firemode. var/selector_switch_icon = FALSE + /// Bitflags for the company that produces the gun, do not give more than one company. + var/company_flag /datum/action/item_action/toggle_safety name = "Toggle Safety" @@ -587,6 +589,9 @@ return remove_gun_attachment(user, tool, bayonet, "unfix") else if(pin && user.is_holding(src)) + if(!pin.can_remove) + to_chat(user, span_warning("You can't remove this firing pin!")) + return user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [tool]."), span_notice("You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)"), null, 3) if(tool.use_tool(src, user, FIRING_PIN_REMOVAL_DELAY, volume = 50)) @@ -601,6 +606,9 @@ . = ..() if(.) return + if(!pin.can_remove) + to_chat(user, span_warning("You can't remove this firing pin!")) + return if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return if(pin && user.is_holding(src)) @@ -620,6 +628,9 @@ return if(!user.canUseTopic(src, BE_CLOSE, FALSE, NO_TK)) return + if(!pin.can_remove) + to_chat(user, span_warning("You can't remove this firing pin!")) + return if(pin && user.is_holding(src)) user.visible_message(span_warning("[user] attempts to remove [pin] from [src] with [tool]."), span_notice("You attempt to remove [pin] from [src]. (It will take [DisplayTimeText(FIRING_PIN_REMOVAL_DELAY)].)"), null, 3) @@ -799,6 +810,30 @@ /obj/item/gun/proc/before_firing(atom/target, mob/user) return +/obj/item/gun/examine_more(mob/user) + . = ..() + switch(company_flag) + if(COMPANY_CANTALAN) + . += "
It has [span_purple("Cantalan Federal Arms")] etched into the grip." + if(COMPANY_ARMADYNE) + . += "
It has [span_red("Armadyne Corporation")] etched into the barrel." + if(COMPANY_SCARBOROUGH) + . += "
It has [span_orange("Scarborough Arms")] stamped onto the grip." + if(COMPANY_BOLT) + . += "
It has [span_yellow("Bolt Fabrications")] stamped onto the reciever." + if(COMPANY_OLDARMS) + . += "
It has [span_red("Armadyne Oldarms")] etched into the barrel." + if(COMPANY_IZHEVSK) + . += "
It has [span_brown("Izhevsk Coalition")] cut in above the magwell." + if(COMPANY_NANOTRASEN) + . += "
It has [span_blue("Nanotrasen Armories")] etched into the reciever." + if(COMPANY_ALLSTAR) + . += "
It has [span_red("Allstar Lasers Inc.")] stamped on the front grip." + if(COMPANY_MICRON) + . += "
It has [span_cyan("Micron Control Sys.")] cut in above the cell slot." + if(COMPANY_INTERDYNE) + . += "
It has [span_cyan("Interdyne Pharmaceuticals")] stamped onto the barrel." + ///////////// // ZOOMING // ///////////// @@ -860,5 +895,13 @@ azoom = new() azoom.gun = src +/obj/item/gun/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + if(!pin.can_remove) + to_chat(user, span_notice("You short out the gun's firing pin, allowing it to be removed!")) + pin.can_remove = TRUE + if(!(pin.obj_flags & EMAGGED)) + pin.obj_flags |= EMAGGED + #undef FIRING_PIN_REMOVAL_DELAY #undef DUALWIELD_PENALTY_EXTRA_MULTIPLIER diff --git a/modular_skyrat/master_files/icons/mob/huds/hud.dmi b/modular_skyrat/master_files/icons/mob/huds/hud.dmi index f9a94a51ae6d893173efae7ceaed3a6fbf1c983c..0056f8d115092a13f3d2c8f979dc77a18e16d401 100644 GIT binary patch literal 12766 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 B!(IRY literal 12691 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 INTEREST_CAP) + calc_threshold = INTEREST_CAP + if(company_datum.interest < calc_threshold) + passed_interest_tier[company_datum] = PASSED_INTEREST + + else + passed_interest_tier[company_datum] = HIGH_INTEREST + + + var/list/products = subtypesof(/datum/armament_entry/cargo_gun) + // Setting cost and stock of armament entries + for(var/armament_category as anything in GLOB.armament_entries) + for(var/subcategory as anything in GLOB.armament_entries[armament_category][CATEGORY_ENTRY]) + for(var/datum/armament_entry/armament_entry as anything in GLOB.armament_entries[armament_category][CATEGORY_ENTRY][subcategory]) + if(products && !(armament_entry.type in products)) + continue + + var/datum/armament_entry/cargo_gun/entry_typecast = armament_entry + + for(var/company_gun in companies) + var/datum/gun_company/the_datum = companies[company_gun] + + if(the_datum.company_flag != entry_typecast.company_bitflag) + continue + + switch(passed_interest_tier[the_datum]) + + if(FAILED_INTEREST) + var/stock_failed = rand(0, 2) + entry_typecast.stock = max((round(stock_failed * entry_typecast.stock_mult)), 0) + var/gun_cost_failed = rand(entry_typecast.lower_cost, entry_typecast.upper_cost) + var/compound_cost = round(entry_typecast.cost * 0.1) + entry_typecast.cost = max((round((gun_cost_failed + (compound_cost + CARGO_CRATE_VALUE)) - (0.25 * entry_typecast.lower_cost)) ), 0) + entry_typecast.magazine_cost = round((entry_typecast.cost * INTEREST_LOW_MAG_COST) * the_datum.magazine_cost_mult) + + if(PASSED_INTEREST) + var/stock_passed = rand(0, 4) + entry_typecast.stock = max((round(stock_passed * entry_typecast.stock_mult) + 1), 0) + var/gun_cost_passed = rand(entry_typecast.lower_cost, entry_typecast.upper_cost) + var/compound_cost = round(entry_typecast.cost * 0.1) + entry_typecast.cost = max((round(gun_cost_passed + compound_cost) + CARGO_CRATE_VALUE), 0) + entry_typecast.magazine_cost = round((entry_typecast.cost * INTEREST_MED_MAG_COST) * the_datum.magazine_cost_mult) + + if(HIGH_INTEREST) + var/stock_interested = rand(0, 6) + entry_typecast.stock = max((round(stock_interested * entry_typecast.stock_mult) + 2), 0) + var/gun_cost_high = rand(entry_typecast.lower_cost, entry_typecast.upper_cost) + var/compound_cost = round(entry_typecast.cost * 0.1) + entry_typecast.cost = max(round(gun_cost_high + (compound_cost + CARGO_CRATE_VALUE)) , 0) + entry_typecast.magazine_cost = round((entry_typecast.cost * INTEREST_HIGH_MAG_COST) * the_datum.magazine_cost_mult) + +#undef MAX_HANDOUT_CHOICES +#undef INTEREST_HIGH_MULT +#undef INTEREST_CAP +#undef INTEREST_LOWER_RAND +#undef INTEREST_HIGHER_RAND +#undef BASE_COST_MINIMUM +#undef BASE_COST_MAXIMUM +#undef INTEREST_LOW_MAG_COST +#undef INTEREST_MED_MAG_COST +#undef INTEREST_HIGH_MAG_COST diff --git a/modular_skyrat/modules/gun_cargo/code/objects/access.dm b/modular_skyrat/modules/gun_cargo/code/objects/access.dm new file mode 100644 index 00000000000..e7e33cbafd1 --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/access.dm @@ -0,0 +1,8 @@ +/obj/item/proc/get_gun_permit_iconstate() + var/obj/item/card/id/id_card = GetID() + + if(!id_card) + return "hudfan_no" + if(ACCESS_WEAPONS in id_card.GetAccess()) + return "hud_permit" + return "hudfan_no" diff --git a/modular_skyrat/modules/gun_cargo/code/objects/ammo_boxes.dm b/modular_skyrat/modules/gun_cargo/code/objects/ammo_boxes.dm new file mode 100644 index 00000000000..78de9353ebd --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/ammo_boxes.dm @@ -0,0 +1,130 @@ +/obj/item/ammo_box/c9mm/ap + name = "ammo box (9mm AP)" + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/ammo_box/c9mm/hp + name = "ammo box (9mm HP)" + ammo_type = /obj/item/ammo_casing/c9mm/hp + +/obj/item/ammo_box/c9mm/fire + name = "ammo box (9mm Incen)" + ammo_type = /obj/item/ammo_casing/c9mm/fire + +/obj/item/ammo_box/c10mm/ap + name = "ammo box (10mm AP)" + ammo_type = /obj/item/ammo_casing/c10mm/ap + max_ammo = 20 + +/obj/item/ammo_box/c10mm/hp + name = "ammo box (10mm HP)" + ammo_type = /obj/item/ammo_casing/c10mm/hp + max_ammo = 20 + +/obj/item/ammo_box/c10mm/fire + name = "ammo box (10mm Incen)" + ammo_type = /obj/item/ammo_casing/c10mm/fire + max_ammo = 20 + +/obj/item/ammo_box/c46x30mm + name = "ammo box (4.6x30mm)" + icon = 'modular_skyrat/modules/gun_cargo/icons/ammo.dmi' + icon_state = "ammo_46" + ammo_type = /obj/item/ammo_casing/c46x30mm + max_ammo = 20 + +/obj/item/ammo_box/c46x30mm/ap + name = "ammo box (4.6x30mm AP)" + ammo_type = /obj/item/ammo_casing/c46x30mm/ap + +/obj/item/ammo_box/c46x30mm/rubber + name = "ammo box (4.6x30mm Rubber)" + ammo_type = /obj/item/ammo_casing/c46x30mm/rubber + +/obj/item/ammo_box/c32 + name = "ammo box (.32)" + icon = 'modular_skyrat/modules/gun_cargo/icons/ammo.dmi' + icon_state = "ammo_32" + ammo_type = /obj/item/ammo_casing/c32 + max_ammo = 20 + +/obj/item/ammo_box/c32/ap + name = "ammo box (.32 AP)" + ammo_type = /obj/item/ammo_casing/c32/ap + +/obj/item/ammo_box/c32/rubber + name = "ammo box (.32 Rubber)" + ammo_type = /obj/item/ammo_casing/c32/rubber + +/obj/item/ammo_box/c32/fire + name = "ammo box (.32 Incen)" + ammo_type = /obj/item/ammo_casing/c32_incendiary + +/obj/item/ammo_box/c34 + name = "ammo box (.34)" + icon = 'modular_skyrat/modules/gun_cargo/icons/ammo.dmi' + icon_state = "ammo_34" + ammo_type = /obj/item/ammo_casing/c34 + max_ammo = 20 + +/obj/item/ammo_box/c34/ap + name = "ammo box (.34 AP)" + ammo_type = /obj/item/ammo_casing/c34/ap + +/obj/item/ammo_box/c34/rubber + name = "ammo box (.34 Rubber)" + ammo_type = /obj/item/ammo_casing/c34/rubber + +/obj/item/ammo_box/c34/fire + name = "ammo box (.34 Incen)" + ammo_type = /obj/item/ammo_casing/c34_incendiary + +/obj/item/ammo_box/c12mm + name = "ammo box (12mm)" + icon = 'modular_skyrat/modules/gun_cargo/icons/ammo.dmi' + icon_state = "ammo_12mm" + ammo_type = /obj/item/ammo_casing/c12mm + max_ammo = 20 + +/obj/item/ammo_box/c12mm/ap + name = "ammo box (12mm AP)" + ammo_type = /obj/item/ammo_casing/c12mm/ap + +/obj/item/ammo_box/c12mm/hp + name = "ammo box (12mm HP)" + ammo_type = /obj/item/ammo_casing/c12mm/hp + +/obj/item/ammo_box/c12mm/fire + name = "ammo box (12mm Incen)" + ammo_type = /obj/item/ammo_casing/c12mm/fire + +/obj/item/storage/box/ammo_box/microfusion/bluespace + name = "bluespace microfusion cell container" + desc = "A box filled with microfusion cells." + +/obj/item/storage/box/ammo_box/microfusion/bluespace/PopulateContents() + new /obj/item/storage/bag/ammo(src) + new /obj/item/stock_parts/cell/microfusion/bluespace(src) + new /obj/item/stock_parts/cell/microfusion/bluespace(src) + new /obj/item/stock_parts/cell/microfusion/bluespace(src) + +/obj/item/storage/box/ammo_box/microfusion/bluespace/bagless + +/obj/item/storage/box/ammo_box/microfusion/bluespace/bagless/PopulateContents() + new /obj/item/stock_parts/cell/microfusion/bluespace(src) + new /obj/item/stock_parts/cell/microfusion/bluespace(src) + new /obj/item/stock_parts/cell/microfusion/bluespace(src) + +/obj/item/ammo_box/b10mm + name = "ammo box (10mm Auto)" + ammo_type = /obj/item/ammo_casing/b10mm + max_ammo = 20 + +/obj/item/ammo_box/b10mm/hp + name = "ammo box (10mm Auto HP)" + ammo_type = /obj/item/ammo_casing/b10mm/hp + max_ammo = 20 + +/obj/item/ammo_box/b10mm/rubber + name = "ammo box (10mm Auto Rubber)" + ammo_type = /obj/item/ammo_casing/b10mm/rubber + max_ammo = 20 diff --git a/modular_skyrat/modules/gun_cargo/code/objects/box.dm b/modular_skyrat/modules/gun_cargo/code/objects/box.dm new file mode 100644 index 00000000000..3295b47feb6 --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/box.dm @@ -0,0 +1,15 @@ +/obj/item/storage/box/syringes/piercing + name = "piercing syringe box" + desc = "A five-pack of piercing syringes." + +/obj/item/storage/box/syringes/piercing/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/syringe/piercing(src) + +/obj/item/storage/box/syringes/bluespace + name = "bluespace syringe box" + desc = "A three-pack of piercing syringes." + +/obj/item/storage/box/syringes/piercing/PopulateContents() + for(var/i in 1 to 3) + new /obj/item/reagent_containers/syringe/bluespace(src) diff --git a/modular_skyrat/modules/gun_cargo/code/objects/cargo_console.dm b/modular_skyrat/modules/gun_cargo/code/objects/cargo_console.dm new file mode 100644 index 00000000000..b9f1e33e340 --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/cargo_console.dm @@ -0,0 +1,3 @@ +/obj/machinery/computer/cargo/ComponentInitialize() + . = ..() + AddComponent(/datum/component/armament/cargo_gun, subtypesof(/datum/armament_entry/cargo_gun), 0) diff --git a/modular_skyrat/modules/gun_cargo/code/objects/firing_pin.dm b/modular_skyrat/modules/gun_cargo/code/objects/firing_pin.dm new file mode 100644 index 00000000000..3c15a754296 --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/firing_pin.dm @@ -0,0 +1,34 @@ +GLOBAL_VAR_INIT(permit_pin_unrestricted, FALSE) +// Firing pin that can be used off station freely, and requires a permit to use on-station +/obj/item/firing_pin/permit_pin + name = "permit-locked firing pin" + desc = "A firing pin for a station who can't trust their crew. Only allows you to fire the weapon off-station or with a firearms permit.." + icon_state = "firing_pin_explorer" + fail_message = "You must have a permit or be off-station to fire this!" + can_remove = TRUE + +// This checks that the user isn't on the station Z-level. +/obj/item/firing_pin/permit_pin/pin_auth(mob/living/user) + var/turf/station_check = get_turf(user) + + if(obj_flags & EMAGGED) + return TRUE + + if(GLOB.permit_pin_unrestricted) + return TRUE + + var/obj/item/card/id/the_id = user.get_idcard() + + if(!the_id && is_station_level(station_check.z)) + return FALSE + + if(!is_station_level(station_check.z) || (ACCESS_WEAPONS in the_id.GetAccess())) + return TRUE + + +/obj/item/firing_pin + var/can_remove = TRUE + +/obj/item/firing_pin/emag_act(mob/user) + . = ..() + can_remove = TRUE diff --git a/modular_skyrat/modules/gun_cargo/code/objects/guns/interdyne.dm b/modular_skyrat/modules/gun_cargo/code/objects/guns/interdyne.dm new file mode 100644 index 00000000000..963132e0a1d --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/guns/interdyne.dm @@ -0,0 +1,28 @@ +/obj/item/gun/ballistic/automatic/pistol/firefly/smartdart + name = "\improper I-94 'Honeybee'" + desc = "A 9mm sidearm made by Armadyne and modified by Interdyne, it features a slightly modified paint job and sports a SmartDart underbarrel attachment which can be fired with right click." + company_flag = COMPANY_INTERDYNE + icon = 'modular_skyrat/modules/gun_cargo/icons/honeybee.dmi' + icon_state = "honeybee" + company_flag = COMPANY_INTERDYNE + var/obj/item/gun/syringe/smartdart/underbarrel/underbarrel + +/obj/item/gun/ballistic/automatic/pistol/firefly/smartdart/Initialize() + . = ..() + underbarrel = new(src) + update_appearance() + +/obj/item/gun/ballistic/automatic/pistol/firefly/smartdart/afterattack_secondary(atom/target, mob/living/user, flag, params) + underbarrel.afterattack(target, user, flag, params) + return SECONDARY_ATTACK_CONTINUE_CHAIN + +/obj/item/gun/ballistic/automatic/pistol/firefly/smartdart/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/reagent_containers/syringe/smartdart)) + underbarrel.attackby(attacking_item, user, params) + else + ..() + +/obj/item/gun/syringe/smartdart/underbarrel + name = "SmartDart underbarrel device" + desc = "An underbarrel attachment for a pistol that fits a SmartDart." + has_gun_safety = FALSE diff --git a/modular_skyrat/modules/gun_cargo/code/objects/hud_glasses.dm b/modular_skyrat/modules/gun_cargo/code/objects/hud_glasses.dm new file mode 100644 index 00000000000..7c9ffdaf066 --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/hud_glasses.dm @@ -0,0 +1,7 @@ +/obj/item/clothing/glasses/hud/gun_permit + name = "permit HUD" + desc = "A heads-up display that scans humanoids in view, and displays if their current ID possesses a firearms permit or not." + icon = 'modular_skyrat/modules/gun_cargo/icons/hud_goggles.dmi' + worn_icon = 'modular_skyrat/modules/gun_cargo/icons/hud_goggles_worn.dmi' + icon_state = "permithud" + hud_type = DATA_HUD_PERMIT diff --git a/modular_skyrat/modules/gun_cargo/code/objects/keycard_auth.dm b/modular_skyrat/modules/gun_cargo/code/objects/keycard_auth.dm new file mode 100644 index 00000000000..364d367830e --- /dev/null +++ b/modular_skyrat/modules/gun_cargo/code/objects/keycard_auth.dm @@ -0,0 +1,4 @@ +/proc/toggle_permit_pins() + GLOB.permit_pin_unrestricted = !GLOB.permit_pin_unrestricted + minor_announce("Permit-locked firing pins have now had their locks [GLOB.permit_pin_unrestricted ? "removed" : "reinstated"].", "Weapons Systems Update:") + SSblackbox.record_feedback("nested tally", "keycard_auths", 1, list("permit-locked pins", GLOB.permit_pin_unrestricted ? "unlocked" : "locked")) diff --git a/modular_skyrat/modules/gun_cargo/icons/ammo.dmi b/modular_skyrat/modules/gun_cargo/icons/ammo.dmi new file mode 100644 index 0000000000000000000000000000000000000000..77460d0fcac59e079c2cefefb0bdcbf8bfda1657 GIT binary patch literal 541 zcmV+&0^R9JLGWpiV4 zX>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33t zGfE(w;*!LYR3K9+F*i3q-o#9ai!&v&s2C_>$i4;332KSjdF8w zsZ>^Q^>YDx2>`KMJbYm^+oS*h0QN~lK~z|U?bShU!yo`e(WGEQ0}EwMQQ@P0hNgk|{|{!cIfSlKND>$=9~2*A4ld_}nd z?F<R0kCU_1BwPf)d0BnYW7Dj07{|X zb}0bVN_(vcZ1VnZ0PM2w4Didt0Pn{GlDz*3fGm4vfZu-xco%@LC^w*;fkYolA|TVA f33&EXe($~k?RZsr2=T!|00000NkvXXu0mjfWTe*3 literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/gun_cargo/icons/honeybee.dmi b/modular_skyrat/modules/gun_cargo/icons/honeybee.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e59ef5c0461c740ce27bd74fe024dfd023fa53c6 GIT binary patch literal 595 zcmV-Z0<8UsP)Jx)Bk(#m68pFCZ{5XagcpWMPS) zpE@)&-{0Sqz})X)YO1QLR8&+#LPBO_WXZ|NV`F1nSy_L7e^6CqFf~TI$H&**-Y`Z* za}3tY00001bW%=J06^y0W&i*HgnCq1bVOxyV{&P5bZKvH004NLQ&wDl08A-I zrtPcm>Hq)%1xZ9fR9J=WmeFp*APhx`-IC2MWZBYgZ8loi|NrA`+P6mCfR|PBu@WVM zd$}T!j4_Jxuj#saE#PX6w!=y}BJ@wseUE*m0TIwA*P7rB=haPASt zD>(s`=y~5>v+^23HW7y+191S>^RjP~_q+Y@{&6Ud0N!|Gj?+Bv_VfJtRjMCHFHaDr zY!J!=fZoe002ovPDHLkV1oB=1yBG0 literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/gun_cargo/icons/hud_goggles.dmi b/modular_skyrat/modules/gun_cargo/icons/hud_goggles.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c4121b3b3b7d76c8b6be2afb2509cbb0e1beb3f1 GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*8>L*2nh+L85_?`Gd`1M z{6Edu-rincUtdK<#lyqnQhmP?P$gqYkY6x^!?PP{Ku&H|NJNQCYH@N=WKhlO#F@nvH#g*lHV z9hnrO5WG@htA_bzmBl8mo!!Q&n^#C^q@6fAGi=I?*<6X*+B<&jZ0KcUI1nLyS7brr zS)j$Po-U3d8WWQfBnlk@CNv6mJZuQO8R~FC#fL#LK}b*I%`7#J@FOqc^b~^P6b%{~ vmw7Cj(718&#Ky^ug3DMmlsgQPZZI$yFJ$++IVX54&_D)HS3j3^P6i literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/gun_cargo/icons/hud_goggles_worn.dmi b/modular_skyrat/modules/gun_cargo/icons/hud_goggles_worn.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8ec8b7fe6024034e0ef4a3d6aa79634777cf6bc4 GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJqNiMQ4l4+-9++i&RQR3p|EO6UrxzKNZ#Z%+=i!m2-r~O^CC0MzPD?5M5qt40=;`OS z!+&0!{G*cDcGzUnNgelV(^l;^l6iCVsmR&;DJNAlMfsR#hTrthd$+-be?RLl<^vJZ zcXQ@UnhUf&)6>NTa+CU1*HwOY zscgBnWz)8$w;35GY^j#cTDyHo(Xu70zo(x`E30_kI@A1&<$goAnUNBkt1sw0I3HEV d3^X1NelVQqm1YpX68sq?{yMbrApn literal 0 HcmV?d00001 diff --git a/modular_skyrat/modules/gunsgalore/code/guns/akm.dm b/modular_skyrat/modules/gunsgalore/code/guns/akm.dm index 0beba814134..34e05065b25 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/akm.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/akm.dm @@ -21,7 +21,8 @@ load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magout.ogg' alt_icons = TRUE - realistic = TRUE + dirt_modifier = 0.75 + company_flag = COMPANY_IZHEVSK /obj/item/ammo_box/magazine/akm name = "\improper AKM magazine" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/luger.dm b/modular_skyrat/modules/gunsgalore/code/guns/luger.dm index 385b6863e77..c3be38587c7 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/luger.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/luger.dm @@ -14,3 +14,4 @@ rack_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/fire/luger_rack.ogg' fire_sound_volume = 100 suppressor_x_offset = 14 + company_flag = COMPANY_OLDARMS diff --git a/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm b/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm index bfb53248894..bfd9f1a9232 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/mp40.dm @@ -21,6 +21,7 @@ eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magout.ogg' alt_icons = TRUE realistic = TRUE + company_flag = COMPANY_OLDARMS /obj/item/ammo_box/magazine/mp40 name = "mp40 magazine (9mmx19)" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm b/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm index e3115d87d5c..322514db307 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/ppsh.dm @@ -24,6 +24,7 @@ load_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/smg_magout.ogg' + company_flag = COMPANY_OLDARMS /obj/item/ammo_box/magazine/ppsh name = "Asha 76 magazine (7.62x25mm)" diff --git a/modular_skyrat/modules/gunsgalore/code/guns/stg.dm b/modular_skyrat/modules/gunsgalore/code/guns/stg.dm index 192f89efbc1..c96d426e172 100644 --- a/modular_skyrat/modules/gunsgalore/code/guns/stg.dm +++ b/modular_skyrat/modules/gunsgalore/code/guns/stg.dm @@ -24,6 +24,7 @@ load_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' load_empty_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magin.ogg' eject_sound = 'modular_skyrat/modules/gunsgalore/sound/guns/interact/ltrifle_magout.ogg' + company_flag = COMPANY_OLDARMS /obj/item/ammo_box/magazine/stg name = "stg magazine (7.92x33mm)" diff --git a/modular_skyrat/modules/mapping/code/shuttles.dm b/modular_skyrat/modules/mapping/code/shuttles.dm index ee947eb7963..f0f589b9053 100644 --- a/modular_skyrat/modules/mapping/code/shuttles.dm +++ b/modular_skyrat/modules/mapping/code/shuttles.dm @@ -118,7 +118,7 @@ implants = list(/obj/item/implant/weapons_auth) belt = /obj/item/storage/belt/military r_pocket = /obj/item/storage/bag/ammo - l_pocket = /obj/item/gun/energy/disabler/cfa_disabler + l_pocket = /obj/item/gun/energy/disabler/bolt_disabler id = /obj/item/card/id/advanced/chameleon id_trim = /datum/id_trim/chameleon/operative skillchips = list(/obj/item/skillchip/job/engineer) @@ -148,7 +148,7 @@ implants = list(/obj/item/implant/weapons_auth) belt = /obj/item/storage/belt/military r_pocket = /obj/item/storage/bag/ammo - l_pocket = /obj/item/gun/energy/disabler/cfa_disabler + l_pocket = /obj/item/gun/energy/disabler/bolt_disabler id = /obj/item/card/id/advanced/chameleon id_trim = /datum/id_trim/chameleon/operative skillchips = list(/obj/item/skillchip/job/engineer) diff --git a/modular_skyrat/modules/microfusion/code/cargo_stuff.dm b/modular_skyrat/modules/microfusion/code/cargo_stuff.dm index f4d49054a98..85fc96a0895 100644 --- a/modular_skyrat/modules/microfusion/code/cargo_stuff.dm +++ b/modular_skyrat/modules/microfusion/code/cargo_stuff.dm @@ -34,7 +34,7 @@ ) crate_name = "Microfusion Cell Crate" -/datum/supply_pack/security/mcr01_attachments_A +/datum/supply_pack/security/mcr01_attachments_a name = "MCR-01 Military Attachments Crate Type A" desc = "Micron Control Systems Incorporated supplied MCR-01 Military spec attachments! This crate comes with two utilitarian repeater loadout." cost = CARGO_CRATE_VALUE * 14 @@ -52,7 +52,7 @@ ) crate_name = "MCR-01 Military Attachments Crate Type A" -/datum/supply_pack/security/mcr01_attachments_type_B +/datum/supply_pack/security/mcr01_attachments_type_b name = "MCR-01 Military Attachments Crate Type B" desc = "Micron Control Systems Incorporated supplied MCR-01 Military spec attachments! This crate comes in a mixed specialist loadout." cost = CARGO_CRATE_VALUE * 16 @@ -69,7 +69,7 @@ crate_name = "MCR-01 Military Attachments Crate Type B" -/datum/supply_pack/security/mcr01_attachments_H +/datum/supply_pack/security/mcr01_attachments_h name = "HCR-01 Military Attachments Crate Type H" desc = "Honkicron Clownery Systems Inhonkorated supplied HCR-01 Clownery spec attachments! This crate oddly smells of bananas." cost = CARGO_CRATE_VALUE * 20 @@ -86,4 +86,3 @@ /obj/item/food/pie/cream, ) crate_name = "MCR-01 Military Attachments Crate Type H" - diff --git a/modular_skyrat/modules/microfusion/code/gun_types.dm b/modular_skyrat/modules/microfusion/code/gun_types.dm index bc59c449176..b65a84bf461 100644 --- a/modular_skyrat/modules/microfusion/code/gun_types.dm +++ b/modular_skyrat/modules/microfusion/code/gun_types.dm @@ -1,9 +1,10 @@ /obj/item/gun/microfusion/mcr01 name = "MCR-01" - desc = "An advanced, modular energy weapon produced by Allstar Lasers Incorporated. These cutting edge weapons differ from traditional beam weaponry in producing individual bolts, as well as utilizing hotswapped cells rather than being tied to immobile power sources." + desc = "An advanced, modular energy weapon produced by Micron Control Systems. These cutting edge weapons differ from traditional beam weaponry in producing individual bolts, as well as utilizing hotswapped cells rather than being tied to immobile power sources." icon_state = "mcr01" inhand_icon_state = "mcr01" shaded_charge = TRUE + company_flag = COMPANY_MICRON /// Gun for cargo crates. /obj/item/gun/microfusion/mcr01/advanced @@ -49,6 +50,13 @@ new /obj/item/stock_parts/cell/microfusion/advanced(src) new /obj/item/stock_parts/cell/microfusion/advanced(src) +/obj/item/storage/box/ammo_box/microfusion/advanced/bagless + +/obj/item/storage/box/ammo_box/microfusion/advanced/bagless/PopulateContents() + new /obj/item/stock_parts/cell/microfusion/advanced(src) + new /obj/item/stock_parts/cell/microfusion/advanced(src) + new /obj/item/stock_parts/cell/microfusion/advanced(src) + //////////////MICROFUSION SPAWNERS /obj/effect/spawner/armory_spawn/microfusion icon_state = "random_rifle" diff --git a/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm b/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm index 657ca37590d..23d59345159 100644 --- a/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm +++ b/modular_skyrat/modules/modular_weapons/code/autolathe_designs.dm @@ -9,7 +9,7 @@ // .32 - 15 damage pistol round. /datum/design/c32 - name = "4.6x30mm Bullet" + name = ".32 Bullet" id = "c32" build_type = AUTOLATHE materials = list(/datum/material/iron = 1000) @@ -24,30 +24,6 @@ build_path = /obj/item/ammo_casing/c32/rubber category = list("initial", "Security") -/datum/design/c32/ap - name = ".32 Armor-Piercing Bullet" - id = "c32/ap" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/ammo_casing/c32/ap - category = list("hacked", "Security") - -/datum/design/c32_incendiary - name = ".32 Incendiary Bullet" - id = "c32_incendiary" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 2000) - build_path = /obj/item/ammo_casing/c32_incendiary - category = list("hacked", "Security") - -/datum/design/smg32acp - name = "Empty .32 SMG Magazine" - id = "smg32acp" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 3000) - build_path = /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/empty - category = list("hacked", "Security") - /datum/design/a762 name = "7.62 Bullet" id = "a762" @@ -82,22 +58,6 @@ build_path = /obj/item/ammo_casing/c46x30mm/rubber category = list("initial", "Security") -/datum/design/c46x30mm_ap - name = "4.6x30mm Armor-Piercing Bullet" - id = "c46x30mm_ap" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 1000) - build_path = /obj/item/ammo_casing/c46x30mm/ap - category = list("hacked", "Security") - -/datum/design/c46x30mm_incendiary - name = "4.6x30mm Incendiary Bullet" - id = "c46x30mm_incendiary" - build_type = AUTOLATHE - materials = list(/datum/material/iron = 1000) - build_path = /obj/item/ammo_casing/c46x30mm/inc - category = list("hacked", "Security") - // .45 /datum/design/c45_lethal diff --git a/modular_skyrat/modules/modular_weapons/code/automatic.dm b/modular_skyrat/modules/modular_weapons/code/automatic.dm index 0757dd5b60f..5599ee8ca09 100644 --- a/modular_skyrat/modules/modular_weapons/code/automatic.dm +++ b/modular_skyrat/modules/modular_weapons/code/automatic.dm @@ -5,26 +5,26 @@ // Magazines /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat - name = "CFA Wildcat magazine (.32)" - desc = "Magazines taking .32 ammunition; it fits in the CFA Wildcat. Alt+click to reskin it." + name = "CFA Wildcat magazine (.34)" + desc = "Magazines taking .34 ammunition; it fits in the CFA Wildcat. Alt+click to reskin it." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi' - icon_state = "smg32" + icon_state = "smg34" possible_types = list(AMMO_TYPE_LETHAL, AMMO_TYPE_AP, AMMO_TYPE_RUBBER, AMMO_TYPE_INCENDIARY) - ammo_type = /obj/item/ammo_casing/c32 - caliber = "c32acp" + ammo_type = /obj/item/ammo_casing/c34 + caliber = "c34acp" max_ammo = 30 multiple_sprites = AMMO_BOX_FULL_EMPTY_BASIC /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/ap - ammo_type = /obj/item/ammo_casing/c32/ap + ammo_type = /obj/item/ammo_casing/c34/ap round_type = AMMO_TYPE_AP /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/rubber - ammo_type = /obj/item/ammo_casing/c32/rubber + ammo_type = /obj/item/ammo_casing/c34/rubber round_type = AMMO_TYPE_RUBBER /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/incendiary - ammo_type = /obj/item/ammo_casing/c32_incendiary + ammo_type = /obj/item/ammo_casing/c34_incendiary round_type = AMMO_TYPE_INCENDIARY /obj/item/ammo_box/magazine/multi_sprite/cfa_wildcat/empty @@ -37,7 +37,7 @@ // Fills the role of a low damage, high magazine capacity magdump gun. /obj/item/gun/ballistic/automatic/cfa_wildcat name = "\improper CFA Wildcat" - desc = "An old SMG, this one is chambered in .32, a very common and dirt-cheap cartridge. It has Cantalan Federal Arms etched above the magazine well." + desc = "A robust roller-delayed SMG chambered for .34 ammunition." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile40x32.dmi' icon_state = "mp5" inhand_icon_state = "arg" @@ -52,6 +52,8 @@ fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY + company_flag = COMPANY_CANTALAN + dirt_modifier = 0.2 /obj/item/gun/ballistic/automatic/cfa_wildcat/no_mag spawnwithmagazine = FALSE @@ -62,7 +64,7 @@ /obj/item/gun/ballistic/automatic/cfa_lynx name = "\improper CFA Lynx" - desc = "A carbine with a high magazine capacity. Chambered in 4.6x30mm. It has Cantalan Federal Arms etched above the magazine well." + desc = "A carbine with a high magazine capacity. Chambered in 4.2x30mm." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile.dmi' icon_state = "cfa-lynx" inhand_icon_state = "arg" @@ -77,31 +79,33 @@ fire_sound = 'sound/weapons/gun/smg/shot_alt.ogg' weapon_weight = WEAPON_MEDIUM w_class = WEIGHT_CLASS_BULKY + company_flag = COMPANY_CANTALAN + dirt_modifier = 0.2 /obj/item/gun/ballistic/automatic/cfa_lynx/no_mag spawnwithmagazine = FALSE /obj/item/ammo_box/magazine/multi_sprite/cfa_lynx - name = "CFA Lynx Magazine (4.6x30mm)" - desc = "A magazine for the CFA Lynx. It has a small inscription on the base, '4.6x30mm'. Alt+click to reskin it." + name = "CFA Lynx Magazine (4.2x30mm)" + desc = "A magazine for the CFA Lynx. It has a small inscription on the base, '4.2x30mm'. Alt+click to reskin it." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi' icon_state = "lynx" possible_types = list(AMMO_TYPE_LETHAL, AMMO_TYPE_AP, AMMO_TYPE_RUBBER, AMMO_TYPE_INCENDIARY) - ammo_type = /obj/item/ammo_casing/c46x30mm - caliber = CALIBER_46X30MM + ammo_type = /obj/item/ammo_casing/c42x30mm + caliber = CALIBER_42X30MM max_ammo = 40 multiple_sprites = AMMO_BOX_FULL_EMPTY_BASIC /obj/item/ammo_box/magazine/multi_sprite/cfa_lynx/ap - ammo_type = /obj/item/ammo_casing/c46x30mm/ap + ammo_type = /obj/item/ammo_casing/c42x30mm/ap round_type = AMMO_TYPE_AP /obj/item/ammo_box/magazine/multi_sprite/cfa_lynx/rubber - ammo_type = /obj/item/ammo_casing/c46x30mm/rubber + ammo_type = /obj/item/ammo_casing/c42x30mm/rubber round_type = AMMO_TYPE_RUBBER /obj/item/ammo_box/magazine/multi_sprite/cfa_lynx/incendiary - ammo_type = /obj/item/ammo_casing/c46x30mm/inc + ammo_type = /obj/item/ammo_casing/c42x30mm/inc round_type = AMMO_TYPE_INCENDIARY /obj/item/ammo_box/magazine/multi_sprite/cfa_lynx/empty diff --git a/modular_skyrat/modules/modular_weapons/code/energy.dm b/modular_skyrat/modules/modular_weapons/code/energy.dm index a1a7a88baaf..96ec60e501a 100644 --- a/modular_skyrat/modules/modular_weapons/code/energy.dm +++ b/modular_skyrat/modules/modular_weapons/code/energy.dm @@ -1,11 +1,11 @@ ////////////////////// -// CFA Defender // +// Bolt Responder // ////////////////////// // A mini disabler with 12 shot capacity in comparison to the normal disabler's 20. -/obj/item/gun/energy/disabler/cfa_disabler - name = "CFA Responder" - desc = "A pocket-sized self-defense weapon popular with law enforcement due to its safe non-lethal payload that physically exhausts organic targets and cheap pricetag. The size makes it popular with smaller species, however, gives the obvious drawback of a smaller battery. It has Cantalan Federal Arms eteched into the grip." +/obj/item/gun/energy/disabler/bolt_disabler + name = "Bolt Responder" + desc = "A pocket-sized non-lethal energy gun with low ammo capacity." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile.dmi' icon_state = "cfa-disabler" inhand_icon_state = null @@ -18,8 +18,9 @@ can_flashlight = FALSE // Can't attach or detach the flashlight, and override it's icon update gunlight_state = "cfa-disabler-light" has_gun_safety = FALSE + company_flag = COMPANY_BOLT -/obj/item/gun/energy/disabler/cfa_disabler/Initialize() +/obj/item/gun/energy/disabler/bolt_disabler/Initialize() set_gun_light(new /obj/item/flashlight/seclite(src)) return ..() diff --git a/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm b/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm index 6cd84dbf866..0cbb9a9eca3 100644 --- a/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm +++ b/modular_skyrat/modules/modular_weapons/code/modular_projectiles.dm @@ -207,4 +207,195 @@ ///// 5.56x45mm ///// //////////////////////// -////// 7.62 ////// +////// .34 ACP ////// +// Why? Blame CFA, they want their bullets to be *proprietary* +/obj/item/ammo_casing/c34 + name = ".34 bullet casing" + desc = "A .34 bullet casing." + caliber = "c32acp" + projectile_type = /obj/projectile/bullet/c34 + +/obj/projectile/bullet/c34 + name = ".34 bullet" + damage = 15 + wound_bonus = 0 + +/obj/item/ammo_casing/c34/rubber + name = ".34 rubber bullet casing" + desc = "A .34 rubber bullet casing." + caliber = "c34acp" + projectile_type = /obj/projectile/bullet/c34/rubber + harmful = FALSE + +/obj/projectile/bullet/c34/rubber + name = ".34 rubber bullet" + damage = 5 + stamina = 20 + wound_bonus = -75 + shrapnel_type = null + sharpness = NONE + embedding = null + +/obj/item/ammo_casing/c34/ap + name = ".34 armor-piercing bullet" + desc = "A .34 armor-piercing bullet casing." + caliber = "c34acp" + projectile_type = /obj/projectile/bullet/c34/ap + +/obj/projectile/bullet/c34/ap + name = ".34 armor-piercing bullet" + damage = 15 + armour_penetration = 40 + wound_bonus = -75 + +/obj/item/ammo_casing/c34_incendiary + name = ".34 incendiary bullet" + desc = "A .34 incendiary bullet casing." + caliber = "c34acp" + projectile_type = /obj/projectile/bullet/incendiary/c34_incendiary + +/obj/projectile/bullet/incendiary/c34_incendiary + name = ".34 incendiary bullet" + damage = 8 + fire_stacks = 1 + wound_bonus = -90 + +////// .34 ACP ////// +//////////////////////// +////// 4.2x30mm ////// + +/obj/item/ammo_casing/c42x30mm + name = "4.2x30mm bullet casing" + desc = "A 4.2x30mm bullet casing." + caliber = CALIBER_42X30MM + projectile_type = /obj/projectile/bullet/c42x30mm + +/obj/item/ammo_casing/c42x30mm/ap + name = "4.2x30mm armor-piercing bullet casing" + desc = "A 4.2x30mm armor-piercing bullet casing." + projectile_type = /obj/projectile/bullet/c42x30mm/ap + +/obj/item/ammo_casing/c42x30mm/inc + name = "4.2x30mm incendiary bullet casing" + desc = "A 4.2x30mm incendiary bullet casing." + projectile_type = /obj/projectile/bullet/incendiary/c42x30mm + +/obj/projectile/bullet/c42x30mm + name = "4.2x30mm bullet" + damage = 20 + wound_bonus = -5 + bare_wound_bonus = 5 + embed_falloff_tile = -4 + +/obj/projectile/bullet/c42x30mm/ap + name = "4.2x30mm armor-piercing bullet" + damage = 15 + armour_penetration = 40 + embedding = null + +/obj/projectile/bullet/incendiary/c42x30mm + name = "4.2x30mm incendiary bullet" + damage = 10 + fire_stacks = 1 + +/obj/projectile/bullet/c42x30mm_rubber + name = "4.2x30mm rubber bullet" + damage = 3 + stamina = 17 + ricochets_max = 6 + ricochet_incidence_leeway = 0 + ricochet_chance = 130 + ricochet_decay_damage = 0.7 + shrapnel_type = null + sharpness = NONE + embedding = null + wound_bonus = -50 + +/obj/item/ammo_casing/c42x30mm/rubber + name = "4.2x30mm rubber bullet casing" + desc = "A 4.2x30mm rubber bullet casing." + projectile_type = /obj/projectile/bullet/c42x30mm_rubber + harmful = FALSE + +////// 4.2x30mm ////// +//////////////////////// +////// 12mm ////// + +/obj/item/ammo_casing/c12mm + name = "12mm Magnum bullet casing" + desc = "A 12mm Magnum bullet casing." + caliber = CALIBER_12MM + projectile_type = /obj/projectile/bullet/c12mm + +/obj/item/ammo_casing/c12mm/ap + name = "12mm Magnum armor-piercing bullet casing" + desc = "A 12mm Magnum bullet casing with a tungsten core tip." + projectile_type = /obj/projectile/bullet/c12mm/ap + +/obj/item/ammo_casing/c12mm/hp + name = "12mm Magnum hollow-point bullet casing" + desc = "A 12mm Magnum bullet casing with a hollow tip that fragments on contact." + projectile_type = /obj/projectile/bullet/c12mm/hp + +/obj/item/ammo_casing/c12mm/fire + name = "12mm Magnum incendiary bullet casing" + desc = "A 12mm Magnum bullet casing with a magnesium coated tip meant for setting things on fire." + projectile_type = /obj/projectile/bullet/incendiary/c12mm + +/obj/item/ammo_casing/c12mm/rubber + name = "12mm Magnum rubber bullet casing" + desc = "A low powder load 12mm Magnum bullet casing with a flat rubber tip. Headshots heavily discouraged." + projectile_type = /obj/projectile/bullet/c12mm/rubber + harmful = FALSE + +/obj/projectile/bullet/c12mm + name = "12mm bullet" + damage = 40 + +/obj/projectile/bullet/c12mm/ap + name = "12mm armor-piercing bullet" + damage = 37 + armour_penetration = 40 + +/obj/projectile/bullet/c12mm/hp + name = "12mm hollow-point bullet" + damage = 60 + weak_against_armour = TRUE + +/obj/projectile/bullet/incendiary/c12mm + name = "12mm incendiary bullet" + damage = 20 + fire_stacks = 2 + +/obj/projectile/bullet/c12mm/rubber + name = "12mm Magnum rubber ball" + damage = 10 + stamina = 40 + ricochets_max = 6 + ricochet_incidence_leeway = 0 + ricochet_chance = 130 + ricochet_decay_damage = 0.7 + shrapnel_type = null + sharpness = NONE + embedding = null + +////// 12mm ////// +//////////////////////// +////// 6.8x43mm ////// + + +/obj/item/ammo_casing/a68 + name = "6.8mm bullet casing" + desc = "A 6.8mm bullet casing." + icon_state = "762-casing" + caliber = CALIBER_A68 + projectile_type = /obj/projectile/bullet/a68 + +/obj/projectile/bullet/a68 + name = "6.8 bullet" + damage = 55 + armour_penetration = 10 + wound_bonus = -45 + wound_falloff_tile = 0 + +////// 6.8x43mm ////// diff --git a/modular_skyrat/modules/modular_weapons/code/pistol.dm b/modular_skyrat/modules/modular_weapons/code/pistol.dm index dd077e39d31..61f64db38ff 100644 --- a/modular_skyrat/modules/modular_weapons/code/pistol.dm +++ b/modular_skyrat/modules/modular_weapons/code/pistol.dm @@ -8,7 +8,7 @@ /obj/item/gun/ballistic/automatic/pistol/cfa_snub name = "CFA Snub" - desc = "A small easily-concealable modern pistol chambered in the more widely-used 4.6x30mm. It's specifically designed to be compact. It has Cantalan Federal Arms etched into the slide. " + desc = "An easily-concealable pistol chambered for 4.2x30mm." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile.dmi' icon_state = "cfa-snub" mag_type = /obj/item/ammo_box/magazine/multi_sprite/cfa_snub @@ -16,13 +16,15 @@ fire_sound_volume = 30 w_class = WEIGHT_CLASS_SMALL has_gun_safety = FALSE + company_flag = COMPANY_CANTALAN + dirt_modifier = 0.2 /obj/item/gun/ballistic/automatic/pistol/cfa_snub/empty spawnwithmagazine = FALSE /obj/item/gun/ballistic/automatic/pistol/cfa_ruby name = "CFA Ruby" - desc = "A large and loud modern handgun made to fit more universally used cartridges. It's chambered in .45, or 11.43x23mm. It has Cantalan Federal Arms etched into the slide." + desc = "A heavy-duty sidearm chambered in 12x27mm." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile.dmi' icon_state = "cfa_ruby" mag_type = /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby @@ -30,6 +32,8 @@ fire_sound_volume = 120 w_class = WEIGHT_CLASS_NORMAL has_gun_safety = FALSE + company_flag = COMPANY_CANTALAN + dirt_modifier = 0.2 /obj/item/gun/ballistic/automatic/pistol/cfa_ruby/empty spawnwithmagazine = FALSE @@ -38,39 +42,39 @@ // AMMO // //////////////////////// /obj/item/ammo_box/magazine/multi_sprite/cfa_snub - name = "CFA Snub magazine (4.6x30mm)" + name = "CFA Snub magazine (4.2x30mm)" desc = "An advanced magazine with smart type displays. Alt+click to reskin it." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi' - icon_state = "m46x30" + icon_state = "m42x30" possible_types = list(AMMO_TYPE_LETHAL, AMMO_TYPE_AP, AMMO_TYPE_RUBBER, AMMO_TYPE_INCENDIARY) - ammo_type = /obj/item/ammo_casing/c46x30mm - caliber = CALIBER_46X30MM + ammo_type = /obj/item/ammo_casing/c42x30mm + caliber = CALIBER_42X30MM max_ammo = 16 multiple_sprites = AMMO_BOX_FULL_EMPTY_BASIC /obj/item/ammo_box/magazine/multi_sprite/cfa_snub/ap - ammo_type = /obj/item/ammo_casing/c46x30mm/ap + ammo_type = /obj/item/ammo_casing/c42x30mm/ap round_type = AMMO_TYPE_AP /obj/item/ammo_box/magazine/multi_sprite/cfa_snub/rubber - ammo_type = /obj/item/ammo_casing/c46x30mm/rubber + ammo_type = /obj/item/ammo_casing/c42x30mm/rubber round_type = AMMO_TYPE_RUBBER /obj/item/ammo_box/magazine/multi_sprite/cfa_snub/incendiary - ammo_type = /obj/item/ammo_casing/c46x30mm/inc + ammo_type = /obj/item/ammo_casing/c42x30mm/inc round_type = AMMO_TYPE_INCENDIARY /obj/item/ammo_box/magazine/multi_sprite/cfa_snub/empty start_empty = TRUE /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby - name = "CFA Ruby magazine (10mm Magnum)" + name = "CFA Ruby magazine (12mm Magnum)" desc = "An advanced magazine with smart type displays. Alt+click to reskin it." icon = 'modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi' - icon_state = "m10mm" + icon_state = "m12mm" possible_types = list(AMMO_TYPE_LETHAL, AMMO_TYPE_AP, AMMO_TYPE_RUBBER, AMMO_TYPE_HOLLOWPOINT, AMMO_TYPE_INCENDIARY) - ammo_type = /obj/item/ammo_casing/c10mm - caliber = CALIBER_10MM + ammo_type = /obj/item/ammo_casing/c12mm + caliber = CALIBER_12MM max_ammo = 8 multiple_sprites = AMMO_BOX_FULL_EMPTY_BASIC @@ -78,17 +82,17 @@ start_empty = TRUE /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby/ap - ammo_type = /obj/item/ammo_casing/c10mm/ap + ammo_type = /obj/item/ammo_casing/c12mm/ap round_type = AMMO_TYPE_AP /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby/rubber - ammo_type = /obj/item/ammo_casing/c10mm/rubber + ammo_type = /obj/item/ammo_casing/c12mm/rubber round_type = AMMO_TYPE_RUBBER /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby/hp - ammo_type = /obj/item/ammo_casing/c10mm/hp + ammo_type = /obj/item/ammo_casing/c12mm/hp round_type = AMMO_TYPE_HOLLOWPOINT /obj/item/ammo_box/magazine/multi_sprite/cfa_ruby/incendiary - ammo_type = /obj/item/ammo_casing/c10mm/fire + ammo_type = /obj/item/ammo_casing/c12mm/fire round_type = AMMO_TYPE_INCENDIARY diff --git a/modular_skyrat/modules/modular_weapons/code/revolver.dm b/modular_skyrat/modules/modular_weapons/code/revolver.dm index 79c9fb32c05..21515953d9b 100644 --- a/modular_skyrat/modules/modular_weapons/code/revolver.dm +++ b/modular_skyrat/modules/modular_weapons/code/revolver.dm @@ -25,6 +25,8 @@ righthand_file = 'modular_skyrat/modules/modular_weapons/icons/mob/inhands/weapons/64x_guns_right.dmi' pixel_x = -8 inhand_icon_state = "revolving" + company_flag = COMPANY_IZHEVSK + dirt_modifier = 0.75 /obj/item/gun/ballistic/revolver/rifle/improvised name = "\improper Improvised .38 Revolving Rifle" @@ -33,6 +35,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 //TAs far as improvised weapons go, this is fairly decent, this isn't half bad. fire_delay = 15 recoil = 1 + company_flag = null /obj/item/gun/ballistic/revolver/rifle/gold name = "\improper .45 Revolving Rifle" diff --git a/modular_skyrat/modules/modular_weapons/code/rifle.dm b/modular_skyrat/modules/modular_weapons/code/rifle.dm index fd160221b5e..31713b3bba3 100644 --- a/modular_skyrat/modules/modular_weapons/code/rifle.dm +++ b/modular_skyrat/modules/modular_weapons/code/rifle.dm @@ -118,8 +118,8 @@ //////////////////////// /obj/item/gun/ballistic/automatic/cfa_rifle - name = "Cantanheim 7.62 rifle" - desc = "An old semi-automatic rifle used in a war long ago. Uses 7.62 bullets in a ten round magazine." + name = "Cantanheim 6.8mm rifle" + desc = "A simple semi-automatic rifle chambered in 6.8mm. The letters 'XJP' are crossed out in the receiver." //Different 6.8mm than the FTU's propietary pulse ballistics icon = 'modular_skyrat/modules/modular_weapons/icons/obj/guns/projectile40x32.dmi' icon_state = "cfa_rifle" inhand_icon_state = "irifle" @@ -128,11 +128,11 @@ lefthand_file = 'modular_skyrat/modules/modular_weapons/icons/mob/inhands/weapons/64x_guns_left.dmi' righthand_file = 'modular_skyrat/modules/modular_weapons/icons/mob/inhands/weapons/64x_guns_right.dmi' worn_icon_state = null - mag_type = /obj/item/ammo_box/magazine/cm762 + mag_type = /obj/item/ammo_box/magazine/cm68 fire_delay = 5 can_suppress = FALSE burst_size = 0 - fire_select_modes = list(SELECT_SEMI_AUTOMATIC) //SKYRAT EDIT CHANGE + fire_select_modes = list(SELECT_SEMI_AUTOMATIC) mag_display = FALSE mag_display_ammo = FALSE empty_indicator = FALSE @@ -144,16 +144,18 @@ zoom_out_amt = 2 has_gun_safety = FALSE w_class = WEIGHT_CLASS_BULKY + company_flag = COMPANY_CANTALAN + dirt_modifier = 0.25 /obj/item/gun/ballistic/automatic/cfa_rifle/empty spawnwithmagazine = FALSE -/obj/item/ammo_box/magazine/cm762 - name = "rifle magazine (7.62mm)" +/obj/item/ammo_box/magazine/cm68 + name = "rifle magazine (6.8mm)" icon = 'modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi' - icon_state = "7.62" - ammo_type = /obj/item/ammo_casing/a762 - caliber = CALIBER_A762 + icon_state = "6.8" + ammo_type = /obj/item/ammo_casing/a68 + caliber = CALIBER_A68 max_ammo = 10 multiple_sprites = 2 diff --git a/modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi b/modular_skyrat/modules/modular_weapons/icons/obj/ammo.dmi index 49bac414e39b5635f58ba4f59a903f13048a40df..9531519b341b49c5b819f6bcf552c2c160976b66 100644 GIT binary patch delta 2166 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 { onClick={() => setTab('requests')}> Requests ({requests.length}) + act('gun_window')}> + Gun Requisitions + {!requestonly && ( <> { {tab === 'help' && ( )} + {tab === 'gun_window' && ( + tab === 'catalog' + )} ); }; diff --git a/tgui/packages/tgui/interfaces/CargoGunConsole.js b/tgui/packages/tgui/interfaces/CargoGunConsole.js new file mode 100644 index 00000000000..19727bf9c80 --- /dev/null +++ b/tgui/packages/tgui/interfaces/CargoGunConsole.js @@ -0,0 +1,201 @@ +import { useBackend, useLocalState } from '../backend'; +import { Section, Stack, Box, Divider, Button, NumberInput } from '../components'; +import { Window } from '../layouts'; + +export const CargoGunConsole = (props, context) => { + const [category, setCategory] = useLocalState(context, 'category', ''); + const [weapon, setArmament] = useLocalState(context, 'weapon'); + const { act, data } = useBackend(context); + const { + armaments_list = [], + budget_points, + budget_name, + ammo_amount, + self_paid, + } = data; + return ( + + +
+ + + act('toggleprivate')} /> + + Current Budget: {budget_name} + + + Budget Remaining: {budget_points} + + + + + + +
+ + {armaments_list.map(armament_category => ( + + {armament_category.category_purchased ? ( +
+
+ + +
+ {armaments_list.map(armament_category => ( + armament_category.category === category && ( + armament_category.subcategories.map(subcat => ( +
+ + {subcat.items.map(item => ( + + + + ))} + +
+ )) + ) + ))} +
+
+ + +
+ {armaments_list.map(armament_category => ( + armament_category.subcategories.map(subcat => ( + subcat.items.map(item => ( + item.ref === weapon && ( + + + + + + + + {item.description} + + {!!item.cant_purchase && ( + + {'Company interest needs to be higher to buy this item!'} + + )} + + {'Quantity Remaining: ' + (item.quantity)} + + budget_points) ? "red" : "green"}> + {'Cost: ' + item.cost} + + {!!item.buyable_ammo && ( + budget_points) ? "red" : "green"}> + {'Ammo Cost: ' + item.magazine_cost} + + )} + +
+
+
+
+
+
+ ); +}; diff --git a/tgui/packages/tgui/interfaces/KeycardAuth.js b/tgui/packages/tgui/interfaces/KeycardAuth.js index 3229bf2d077..0c4ccca0f79 100644 --- a/tgui/packages/tgui/interfaces/KeycardAuth.js +++ b/tgui/packages/tgui/interfaces/KeycardAuth.js @@ -5,9 +5,10 @@ import { Window } from '../layouts'; export const KeycardAuth = (props, context) => { const { act, data } = useBackend(context); return ( + // SKYRAT EDIT: height 125 -> 150, addition of permit-locked firing pin + height={150}>
@@ -47,6 +48,11 @@ export const KeycardAuth = (props, context) => { fluid onClick={() => act('bsa_unlock')} content="Bluespace Artillery Unlock" /> +