diff --git a/aurorastation.dme b/aurorastation.dme
index 4b6ad85ff87..0f732889bb8 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -19,6 +19,7 @@
#include "code\__defines\_compile_options.dm"
#include "code\__defines\_layers.dm"
#include "code\__defines\_macros.dm"
+#include "code\__defines\accessories.dm"
#include "code\__defines\admin.dm"
#include "code\__defines\antagonist.dm"
#include "code\__defines\armor.dm"
@@ -1394,7 +1395,6 @@
#include "code\modules\clothing\factions\vysoka.dm"
#include "code\modules\clothing\glasses\glasses.dm"
#include "code\modules\clothing\glasses\hud.dm"
-#include "code\modules\clothing\gloves\arm_guard.dm"
#include "code\modules\clothing\gloves\boxing.dm"
#include "code\modules\clothing\gloves\color.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
@@ -1423,7 +1423,6 @@
#include "code\modules\clothing\sets\captain.dm"
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\jobs.dm"
-#include "code\modules\clothing\shoes\leg_guard.dm"
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
#include "code\modules\clothing\shoes\vaurca.dm"
@@ -1465,6 +1464,7 @@
#include "code\modules\clothing\suits\jobs.dm"
#include "code\modules\clothing\suits\labcoat.dm"
#include "code\modules\clothing\suits\miscellaneous.dm"
+#include "code\modules\clothing\suits\modular_armor.dm"
#include "code\modules\clothing\suits\overlay.dm"
#include "code\modules\clothing\suits\storage.dm"
#include "code\modules\clothing\suits\utility.dm"
@@ -1477,6 +1477,7 @@
#include "code\modules\clothing\under\syndicate.dm"
#include "code\modules\clothing\under\accessories\accessory.dm"
#include "code\modules\clothing\under\accessories\armband.dm"
+#include "code\modules\clothing\under\accessories\armor.dm"
#include "code\modules\clothing\under\accessories\badges.dm"
#include "code\modules\clothing\under\accessories\holster.dm"
#include "code\modules\clothing\under\accessories\lockets.dm"
diff --git a/code/__defines/accessories.dm b/code/__defines/accessories.dm
new file mode 100644
index 00000000000..90de1a5df9b
--- /dev/null
+++ b/code/__defines/accessories.dm
@@ -0,0 +1,9 @@
+#define ACCESSORY_SLOT_GENERIC "decor"
+#define ACCESSORY_SLOT_UTILITY "utility"
+#define ACCESSORY_SLOT_CAPE "cape"
+#define ACCESSORY_SLOT_ARMBAND "armband"
+#define ACCESSORY_SLOT_ARMOR_PLATE "armor plate"
+#define ACCESSORY_SLOT_LEG_GUARDS "leg guards"
+#define ACCESSORY_SLOT_ARM_GUARDS "arm guards"
+#define ACCESSORY_SLOT_ARMOR_PIN "armor pin"
+#define ACCESSORY_SLOT_ARMOR_POCKETS "armor pockets"
\ No newline at end of file
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index 37ea129680e..be78ab8d8c6 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -55,6 +55,8 @@
#define ui_morph_resist "EAST-2:26,SOUTH:5"
#define ui_acti "EAST-2:26,SOUTH:5"
#define ui_movi "EAST-3:24,SOUTH:5"
+#define ui_burstfire "EAST-4:20,SOUTH:14"
+#define ui_uniqueaction "EAST-4:20,SOUTH:5"
#define ui_zonesel "EAST-1:28,SOUTH:5"
#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12)
diff --git a/code/_onclick/hud/gun_mode.dm b/code/_onclick/hud/gun_mode.dm
index 676788ee1d7..e3cb6c6d383 100644
--- a/code/_onclick/hud/gun_mode.dm
+++ b/code/_onclick/hud/gun_mode.dm
@@ -64,3 +64,45 @@
user.aiming.toggle_permission(TARGET_CAN_RADIO)
return 1
return 0
+
+/obj/screen/gun/burstfire
+ name = "Toggle Firing Mode"
+ desc = "This can be used in a macro as toggle-firing-mode."
+ icon_state = "toggle_burst_fire"
+ screen_loc = ui_burstfire
+
+/obj/screen/gun/burstfire/Click(location, control, params)
+ if(..())
+ var/mob/living/user = usr
+ if(istype(user))
+ var/obj/item/gun/dakka = user.get_active_hand()
+ if(istype(dakka))
+ dakka.toggle_firing_mode(user)
+ else
+ if(istype(user.loc, /mob/living/heavy_vehicle)) //may God forgive me for this
+ var/mob/living/heavy_vehicle/snowflake = user.loc
+ var/obj/item/mecha_equipment/mounted_system/MS = snowflake.selected_system
+ dakka = MS.holding
+ if(istype(dakka))
+ dakka.toggle_firing_mode(user)
+
+/obj/screen/gun/uniqueaction
+ name = "Unique Action"
+ desc = "This can be used in a macro as unique-action."
+ icon_state = "unique_action"
+ screen_loc = ui_uniqueaction
+
+/obj/screen/gun/uniqueaction/Click(location, control, params)
+ if(..())
+ var/mob/living/user = usr
+ if(istype(user))
+ var/obj/item/gun/dakka = user.get_active_hand()
+ if(istype(dakka))
+ dakka.unique_action(user)
+ else
+ if(istype(user.loc, /mob/living/heavy_vehicle)) //may God forgive me for this
+ var/mob/living/heavy_vehicle/snowflake = user.loc
+ var/obj/item/mecha_equipment/mounted_system/MS = snowflake.selected_system
+ dakka = MS.holding
+ if(istype(dakka))
+ dakka.unique_action(user)
\ No newline at end of file
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 4572fbe19cc..68f2a4c6ba3 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -369,6 +369,18 @@
mymob.radio_use_icon.color = ui_color
mymob.radio_use_icon.alpha = ui_alpha
+ mymob.toggle_firing_mode = new /obj/screen/gun/burstfire(null)
+ mymob.toggle_firing_mode.icon = ui_style
+ mymob.toggle_firing_mode.color = ui_color
+ mymob.toggle_firing_mode.alpha = ui_alpha
+ hud_elements |= mymob.toggle_firing_mode
+
+ mymob.unique_action_icon = new /obj/screen/gun/uniqueaction(null)
+ mymob.unique_action_icon.icon = ui_style
+ mymob.unique_action_icon.color = ui_color
+ mymob.unique_action_icon.alpha = ui_alpha
+ hud_elements |= mymob.unique_action_icon
+
mymob.client.screen = null
mymob.client.screen += hud_elements
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index c77c5ea1417..9181b1b8dc1 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -130,6 +130,8 @@ var/obj/screen/robot_inventory
mymob.item_use_icon = new /obj/screen/gun/item(null)
mymob.gun_move_icon = new /obj/screen/gun/move(null)
mymob.radio_use_icon = new /obj/screen/gun/radio(null)
+ mymob.toggle_firing_mode = new /obj/screen/gun/burstfire(null)
+ mymob.unique_action_icon = new /obj/screen/gun/uniqueaction(null)
mymob.client.screen = null
@@ -143,7 +145,10 @@ var/obj/screen/robot_inventory
mymob.pullin,
robot_inventory,
mymob.gun_setting_icon,
- r.computer)
+ mymob.toggle_firing_mode,
+ mymob.unique_action_icon,
+ r.computer
+ )
mymob.client.screen += src.adding + src.other
return
diff --git a/code/controllers/subsystems/economy.dm b/code/controllers/subsystems/economy.dm
index d4b4df5027e..8ab96ca86e9 100644
--- a/code/controllers/subsystems/economy.dm
+++ b/code/controllers/subsystems/economy.dm
@@ -95,13 +95,14 @@ var/datum/controller/subsystem/economy/SSeconomy
return TRUE
//Create a "normal" player account
-/datum/controller/subsystem/economy/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/datum/computer_file/program/account_db/source_db)
+/datum/controller/subsystem/economy/proc/create_account(var/new_owner_name = "Default user", var/starting_funds = 0, var/datum/computer_file/program/account_db/source_db, var/account_public = TRUE)
//create a new account
var/datum/money_account/M = new()
M.owner_name = new_owner_name
M.remote_access_pin = rand(1111, 111111)
M.money = starting_funds
M.account_number = next_account_number
+ M.public_account = account_public
next_account_number += rand(1,25)
//create an entry in the account transaction log for when it was created
@@ -149,6 +150,13 @@ var/datum/controller/subsystem/economy/SSeconomy
return M
+/datum/controller/subsystem/economy/proc/get_public_accounts()
+ var/list/public_accounts = list()
+ for(var/account in all_money_accounts)
+ var/datum/money_account/M = all_money_accounts[account]
+ if(M.public_account)
+ public_accounts += account // yes, we're passing the number
+ return public_accounts
//Charge a account
/datum/controller/subsystem/economy/proc/charge_to_account(var/attempt_account_number, var/source_name, var/purpose, var/terminal_id, var/amount)
@@ -278,6 +286,7 @@ var/datum/controller/subsystem/economy/SSeconomy
/datum/money_account
var/owner_name = ""
var/account_number = 0
+ var/public_account = TRUE
var/remote_access_pin = 0
var/money = 0
var/list/transactions = list()
diff --git a/code/datums/outfits/outfit_antag.dm b/code/datums/outfits/outfit_antag.dm
index 2035fbe8476..898f925d594 100644
--- a/code/datums/outfits/outfit_antag.dm
+++ b/code/datums/outfits/outfit_antag.dm
@@ -389,7 +389,7 @@
)
belt = null
- suit = /obj/item/clothing/suit/armor/bulletproof
+ suit = /obj/item/clothing/suit/armor/carrier/ballistic
shoes = list(
/obj/item/clothing/shoes/laceup/all_species,
diff --git a/code/datums/trading/weaponry.dm b/code/datums/trading/weaponry.dm
index 78be7cbade3..092c80d773e 100644
--- a/code/datums/trading/weaponry.dm
+++ b/code/datums/trading/weaponry.dm
@@ -144,9 +144,9 @@
)
possible_trading_items = list(
- /obj/item/clothing/suit/armor/riot = TRADER_THIS_TYPE,
- /obj/item/clothing/suit/armor/bulletproof = TRADER_THIS_TYPE,
- /obj/item/clothing/suit/armor/laserproof = TRADER_THIS_TYPE,
+ /obj/item/clothing/suit/armor/carrier/riot = TRADER_THIS_TYPE,
+ /obj/item/clothing/suit/armor/carrier/ballistic = TRADER_THIS_TYPE,
+ /obj/item/clothing/suit/armor/carrier/ablative = TRADER_THIS_TYPE,
/obj/item/clothing/suit/armor/tactical = TRADER_THIS_TYPE,
/obj/item/clothing/suit/storage/vest = TRADER_THIS_TYPE,
/obj/item/clothing/head/helmet = TRADER_THIS_TYPE,
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 8571cc3b32a..f4d978caaa6 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -435,7 +435,7 @@ datum/objective/steal
"a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel,
"the hypospray" = /obj/item/reagent_containers/hypospray,
"the captain's pinpointer" = /obj/item/pinpointer,
- "an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof
+ "an ablative armor vest" = /obj/item/clothing/suit/armor/carrier/ablative
)
var/global/possible_items_special[] = list(
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index 26b8383a1ec..70aac935904 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -26,6 +26,8 @@
var/latejoin_at_spawnpoints = FALSE //If this job should use roundstart spawnpoints for latejoin (offstation jobs etc)
var/account_allowed = TRUE // Does this job type come with a station account?
+ var/public_account = TRUE // does this account appear on account terminals?
+ var/initial_funds_override = 0 // if set to anything else, the initial account balance will be set to this instead
var/economic_modifier = 2 // With how much does this job modify the initial account amount?
var/create_record = TRUE // Do we announce/make records for people who spawn on this job?
@@ -92,8 +94,8 @@
var/datum/species/human_species = global.all_species[SPECIES_HUMAN]
species_modifier = human_species.economic_modifier
- var/money_amount = (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier
- var/datum/money_account/M = SSeconomy.create_account(H.real_name, money_amount, null)
+ var/money_amount = initial_funds_override ? initial_funds_override : (rand(5,50) + rand(5, 50)) * loyalty * economic_modifier * species_modifier
+ var/datum/money_account/M = SSeconomy.create_account(H.real_name, money_amount, null, public_account)
if(H.mind)
var/remembered_info = ""
remembered_info += "Your account number is: #[M.account_number]
"
diff --git a/code/game/jobs/job/outsider/merchant.dm b/code/game/jobs/job/outsider/merchant.dm
index 3b2de4ddea7..296b4949b5a 100644
--- a/code/game/jobs/job/outsider/merchant.dm
+++ b/code/game/jobs/job/outsider/merchant.dm
@@ -9,8 +9,11 @@
minimal_player_age = 10
economic_modifier = 5
ideal_character_age = 30
- create_record = 0
- account_allowed = 0
+
+ create_record = FALSE
+ account_allowed = TRUE
+ public_account = FALSE
+ initial_funds_override = 2500
access = list(access_merchant)
minimal_access = list(access_merchant)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 2e628452aa1..966c5c96bf6 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -301,7 +301,9 @@ update_flag
valve_open = !valve_open
/obj/machinery/portable_atmospherics/canister/attackby(var/obj/item/W as obj, var/mob/user as mob)
- if(!W.iswrench() && !istype(W, /obj/item/tank) && !istype(W, /obj/item/device/analyzer) && !istype(W, /obj/item/modular_computer) && !issignaler(W) && !(W.iswirecutter() && signaler))
+ if(istype(W, /obj/item/mecha_equipment/clamp))
+ return
+ if(!W.iswrench() && !is_type_in_list(W, list(/obj/item/tank, /obj/item/device/analyzer, /obj/item/modular_computer)) && !issignaler(W) && !(W.iswirecutter() && signaler))
if(W.flags & NOBLUDGEON)
return
visible_message(SPAN_WARNING("\The [user] hits \the [src] with \the [W]!"), SPAN_NOTICE("You hit \the [src] with \the [W]."))
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 8ea748f052f..1e22261e75a 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -39,6 +39,7 @@
var/permeability_coefficient = 1 // for chemicals/diseases
var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit)
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
+ var/slowdown_accessory = 0 // Updated on accessory add/remove. This is how much the current accessories slow you down.
var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N
var/can_embed = 1//If zero, this item/weapon cannot become embedded in people when you hit them with it
var/list/allowed = null //suit storage stuff.
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index e68fd6e5f83..ba60b2f0b66 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -71,7 +71,14 @@
src.name = "body bag - "
src.name += t
playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20)
- add_overlay("bodybag_label")
+ if(istype(buckled_to, /obj/structure/bed/roller))
+ var/obj/structure/bed/roller/R = buckled_to
+ if(R.bag_strap)
+ LAZYREMOVE(overlays, image(R.icon, R.bag_strap))
+ LAZYADD(overlays, image(icon, "bodybag_label"))
+ LAZYADD(overlays, image(R.icon, R.bag_strap))
+ else
+ LAZYADD(overlays, image(icon, "bodybag_label"))
else
src.name = "body bag"
return
@@ -79,7 +86,7 @@
to_chat(user, "You cut the tag off the bodybag.")
playsound(src.loc, 'sound/items/wirecutter.ogg', 50, 1)
src.name = "body bag"
- cut_overlays()
+ LAZYREMOVE(overlays, image(icon, "bodybag_label"))
/obj/structure/closet/body_bag/store_mobs(var/stored_units)
contains_body = ..()
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index e7e2e4d0d51..006a57651a1 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -193,13 +193,13 @@
/obj/item/stack/tile/floor
name = "floor tile"
singular_name = "floor tile"
- desc = "Those could work as a pretty decent throwing weapon" //why?
+ desc = "Used to cover up your horrible art."
icon_state = "tile"
- force = 6.0
+ force = 6
matter = list(DEFAULT_WALL_MATERIAL = TILE_MATERIAL_AMOUNT)
- throwforce = 15.0
+ throwforce = 6
throw_speed = 5
- throw_range = 20
+ throw_range = 10
flags = CONDUCT
/obj/item/stack/tile/floor_red
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index c80c7672bf0..d630e4e3570 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -220,8 +220,8 @@
starts_with = list(/obj/item/rig_module/electrowarfare_suite = 1, /obj/item/rig_module/voice = 1)
/obj/item/storage/box/syndie_kit/armor
- name = "boxed armor kit"
- starts_with = list(/obj/item/clothing/suit/storage/vest/merc = 1, /obj/item/clothing/head/helmet/merc = 1, /obj/item/clothing/gloves/arm_guard/mercs = 1, /obj/item/clothing/shoes/leg_guard/merc = 1)
+ name = "boxed heavy armor kit"
+ starts_with = list(/obj/item/clothing/suit/armor/carrier/heavy = 1, /obj/item/clothing/head/helmet/merc = 1)
/obj/item/storage/secure/briefcase/money
starts_with = list(/obj/item/spacecash/c1000 = 10)
diff --git a/code/game/objects/items/weapons/vaurca_items.dm b/code/game/objects/items/weapons/vaurca_items.dm
index d9c351b5028..0515fa3bd8a 100644
--- a/code/game/objects/items/weapons/vaurca_items.dm
+++ b/code/game/objects/items/weapons/vaurca_items.dm
@@ -428,7 +428,7 @@
tension = 1
..()
-/obj/item/gun/launcher/crossbow/vaurca/attack_self(mob/living/user as mob)
+/obj/item/gun/launcher/crossbow/vaurca/unique_action(mob/living/user)
pump(user)
/obj/item/gun/launcher/crossbow/vaurca/proc/pump(mob/M as mob)
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 49aa536c50f..3d9e871bf11 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -16,7 +16,7 @@
new /obj/item/storage/backpack/satchel_cap(src)
// Armor
new /obj/item/clothing/head/helmet(src)
- new /obj/item/clothing/suit/storage/vest(src)
+ new /obj/item/clothing/suit/armor/carrier/generic(src)
//Tools
new /obj/item/device/radio/headset/heads/captain(src)
new /obj/item/device/radio/headset/heads/captain/alt(src)
@@ -72,7 +72,7 @@
new /obj/item/storage/box/ids( src )
//Appearance
new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/suit/storage/vest(src)
+ new /obj/item/clothing/suit/armor/carrier/generic(src)
new /obj/item/clothing/head/helmet(src)
//Tools
new /obj/item/device/radio/headset/heads/hop(src)
@@ -124,7 +124,9 @@
new /obj/item/storage/backpack/security(src)
else
new /obj/item/storage/backpack/satchel_sec(src)
- new /obj/item/clothing/suit/storage/vest/hos(src)
+ new /obj/item/clothing/suit/armor/carrier/hos(src)
+ new /obj/item/clothing/accessory/leg_guard(src)
+ new /obj/item/clothing/accessory/arm_guard(src)
if(prob(50))
new /obj/item/clothing/under/rank/head_of_security(src)
new /obj/item/clothing/head/beret/security/hos(src)
@@ -176,7 +178,9 @@
new /obj/item/storage/backpack/security(src)
else
new /obj/item/storage/backpack/satchel_sec(src)
- new /obj/item/clothing/suit/storage/vest/hos(src)
+ new /obj/item/clothing/suit/armor/carrier/hos(src)
+ new /obj/item/clothing/accessory/leg_guard(src)
+ new /obj/item/clothing/accessory/arm_guard(src)
if(prob(50)) // chance to spawn either corporate or regular outfit. to prevent locker bloat which makes it lag when right clicked
new /obj/item/clothing/under/rank/head_of_security(src)
new /obj/item/clothing/head/beret/security/hos(src)
@@ -217,7 +221,9 @@
new /obj/item/storage/backpack/security(src)
else
new /obj/item/storage/backpack/satchel_sec(src)
- new /obj/item/clothing/suit/storage/vest/warden(src)
+ new /obj/item/clothing/suit/armor/carrier/officer(src)
+ new /obj/item/clothing/accessory/arm_guard(src)
+ new /obj/item/clothing/accessory/leg_guard(src)
if(prob(50))
if(prob(50))
new /obj/item/clothing/under/rank/warden(src)
@@ -229,7 +235,7 @@
new /obj/item/clothing/under/rank/warden/corp(src)
new /obj/item/clothing/head/beret/security/corp(src)
new /obj/item/clothing/head/warden/corp(src)
- new /obj/item/clothing/head/helmet(src)
+ new /obj/item/clothing/head/helmet/security(src)
new /obj/item/clothing/suit/security/warden(src)
new /obj/item/clothing/accessory/badge/warden(src)
new /obj/item/clothing/gloves/black_leather(src)
@@ -302,7 +308,9 @@
new /obj/item/storage/backpack/security(src)
else
new /obj/item/storage/backpack/satchel_sec(src)
- new /obj/item/clothing/suit/storage/vest/officer(src)
+ new /obj/item/clothing/suit/armor/carrier/officer(src)
+ new /obj/item/clothing/accessory/arm_guard(src)
+ new /obj/item/clothing/accessory/leg_guard(src)
if(prob(50))
if(prob(50))
new /obj/item/clothing/under/rank/security(src)
@@ -314,7 +322,7 @@
new /obj/item/clothing/under/rank/security/corp(src)
new /obj/item/clothing/head/beret/security/corp(src)
new /obj/item/clothing/head/softcap/security/corp(src)
- new /obj/item/clothing/head/helmet(src)
+ new /obj/item/clothing/head/helmet/security(src)
new /obj/item/clothing/suit/security/officer(src)
new /obj/item/clothing/accessory/badge/officer(src)
new /obj/item/clothing/mask/gas/alt(src)
@@ -383,7 +391,7 @@
//Tools
new /obj/item/device/radio/headset/headset_sec(src)
new /obj/item/device/radio/headset/headset_sec/alt(src)
- new /obj/item/clothing/suit/storage/vest/detective(src)
+ new /obj/item/clothing/suit/armor/carrier/generic(src)
new /obj/item/gun/energy/disruptorpistol/miniature/security(src)
new /obj/item/taperoll/police(src)
//Belts
@@ -403,7 +411,7 @@
//Appearance
new /obj/item/clothing/gloves/black(src)
new /obj/item/clothing/suit/storage/toggle/forensics(src)
- new /obj/item/clothing/suit/storage/vest/ft(src)
+ new /obj/item/clothing/suit/armor/carrier/generic(src)
new /obj/item/clothing/under/det/forensics(src)
new /obj/item/clothing/under/det/black(src)
new /obj/item/clothing/under/det/classic(src)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 092aeb85fd5..ee9e1c63cd4 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -256,7 +256,7 @@
iv.pixel_y = 6
overlays += iv
if(bag_strap && istype(buckled, /obj/structure/closet/body_bag))
- buckled.overlays += image(icon, bag_strap)
+ LAZYADD(buckled.overlays, image(icon, bag_strap))
/obj/structure/bed/roller/attackby(obj/item/I, mob/user)
if(iswrench(I) || istype(I, /obj/item/stack) || iswirecutter(I))
@@ -364,8 +364,7 @@
if(iv_attached)
detach_iv(M, usr)
else
- MA.overlays.Cut() //Remove straps
- MA.update_icon() //Add label back (if it had one)
+ LAZYREMOVE(MA.overlays, image(icon, bag_strap)) //Remove straps
density = FALSE
MA.pixel_y = 0
update_icon()
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 8ffbaf59b95..54e671e11d5 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -217,7 +217,7 @@
name = "Bridge Officer"
corpseradio = /obj/item/device/radio/headset/heads/hop
corpseuniform = /obj/item/clothing/under/rank/centcom_officer
- corpsesuit = /obj/item/clothing/suit/armor/bulletproof
+ corpsesuit = /obj/item/clothing/suit/armor/carrier/ballistic
corpseshoes = /obj/item/clothing/shoes/black
corpseglasses = /obj/item/clothing/glasses/sunglasses
corpseid = 1
@@ -227,7 +227,7 @@
/obj/effect/landmark/corpse/commander
name = "Commander"
corpseuniform = /obj/item/clothing/under/rank/centcom_captain
- corpsesuit = /obj/item/clothing/suit/armor/bulletproof
+ corpsesuit = /obj/item/clothing/suit/armor/carrier/ballistic
corpseradio = /obj/item/device/radio/headset/heads/captain
corpseglasses = /obj/item/clothing/glasses/eyepatch
corpsemask = /obj/item/clothing/mask/smokable/cigarette/cigar/cohiba
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 14425365548..a6ba99a0fb5 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -791,7 +791,7 @@
w_class = ITEMSIZE_NORMAL
species_restricted = list("exclude",BODYTYPE_VAURCA_BREEDER,BODYTYPE_VAURCA_WARFORM)
- valid_accessory_slots = list("armband","decor", "over")
+ valid_accessory_slots = list(ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_GENERIC, ACCESSORY_SLOT_CAPE)
/obj/item/clothing/suit/return_own_image()
var/image/our_image
@@ -843,8 +843,8 @@
//convenience var for defining the icon state for the overlay used when the clothing is worn.
//Also used by rolling/unrolling.
var/worn_state = null
- valid_accessory_slots = list("utility","armband","decor", "over")
- restricted_accessory_slots = list("utility")
+ valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_GENERIC, ACCESSORY_SLOT_CAPE)
+ restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY)
/obj/item/clothing/under/attack_hand(var/mob/user)
diff --git a/code/modules/clothing/clothing_accessories.dm b/code/modules/clothing/clothing_accessories.dm
index 5ec7264c512..c9f7725f657 100644
--- a/code/modules/clothing/clothing_accessories.dm
+++ b/code/modules/clothing/clothing_accessories.dm
@@ -97,11 +97,17 @@
for(var/obj/item/clothing/accessory/A in accessories)
to_chat(user, "\A [A] is attached to it.")
+/obj/item/clothing/proc/update_accessory_slowdown()
+ slowdown_accessory = 0
+ for(var/obj/item/clothing/accessory/bling in accessories)
+ slowdown_accessory += bling.slowdown
+
/obj/item/clothing/proc/attach_accessory(mob/user, obj/item/clothing/accessory/A)
LAZYADD(accessories, A)
A.on_attached(src, user)
src.verbs |= /obj/item/clothing/proc/removetie_verb
update_clothing_icon()
+ update_accessory_slowdown()
/obj/item/clothing/proc/remove_accessory(mob/user, obj/item/clothing/accessory/A)
if(!(A in accessories))
@@ -110,22 +116,32 @@
A.on_removed(user)
LAZYREMOVE(accessories, A)
update_clothing_icon()
+ update_accessory_slowdown()
/obj/item/clothing/proc/removetie_verb()
set name = "Remove Accessory"
set category = "Object"
set src in usr
- if(!istype(usr, /mob/living)) return
- if(usr.stat) return
- if(!LAZYLEN(accessories)) return
+
+ if(!isliving(usr))
+ return
+
+ var/mob/living/M = usr
+
+ if(use_check_and_message(M))
+ return
+
+ if(!LAZYLEN(accessories))
+ return
+
var/obj/item/clothing/accessory/A
if(LAZYLEN(accessories) > 1)
- A = input("Select an accessory to remove from [src]") as null|anything in accessories
+ A = input("Select an accessory to remove.") as null|anything in accessories
else
A = accessories[1]
- src.remove_accessory(usr,A)
+ remove_accessory(usr,A)
if(!LAZYLEN(accessories))
- src.verbs -= /obj/item/clothing/proc/removetie_verb
+ verbs -= /obj/item/clothing/proc/removetie_verb
/obj/item/clothing/emp_act(severity)
if(LAZYLEN(accessories))
diff --git a/code/modules/clothing/gloves/arm_guard.dm b/code/modules/clothing/gloves/arm_guard.dm
deleted file mode 100644
index 80e4c0f9721..00000000000
--- a/code/modules/clothing/gloves/arm_guard.dm
+++ /dev/null
@@ -1,74 +0,0 @@
-/obj/item/clothing/gloves/arm_guard
- name = "arm guards"
- desc = "These arm guards will protect your hands and arms."
- icon_state = "arm_guards_riot"
- body_parts_covered = HANDS|ARMS
- armor = list(
- melee = ARMOR_MELEE_MAJOR,
- bullet = ARMOR_BALLISTIC_MINOR,
- laser = ARMOR_LASER_MAJOR,
- energy = ARMOR_ENERGY_MINOR,
- bomb = ARMOR_BOMB_MINOR
- )
- punch_force = 3
- w_class = ITEMSIZE_NORMAL
- siemens_coefficient = 0.35
- drop_sound = 'sound/items/drop/axe.ogg'
- pickup_sound = 'sound/items/pickup/axe.ogg'
-
-/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
- if(..()) //This will only run if no other problems occured when equiping.
- if(H.wear_suit)
- if(H.wear_suit.body_parts_covered & ARMS)
- to_chat(H, "You can't wear \the [src] with \the [H.wear_suit], it's in the way.")
- return 0
- return 1
-
-/obj/item/clothing/gloves/arm_guard/laserproof
- name = "ablative arm guards"
- desc = "These arm guards will protect your hands and arms from energy weapons."
- icon_state = "arm_guards_laser"
- siemens_coefficient = 0
- armor = list(
- melee = ARMOR_MELEE_KNIVES,
- bullet = ARMOR_BALLISTIC_SMALL,
- laser = ARMOR_LASER_RIFLES,
- energy = ARMOR_ENERGY_RESISTANT
- )
-
-/obj/item/clothing/gloves/arm_guard/bulletproof
- name = "ballistic arm guards"
- desc = "These arm guards will protect your hands and arms from ballistic weapons."
- icon_state = "arm_guards_bullet"
- armor = list(
- melee = ARMOR_MELEE_KNIVES,
- bullet = ARMOR_BALLISTIC_RIFLE,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_MINOR
- )
-
-/obj/item/clothing/gloves/arm_guard/riot
- name = "riot arm guards"
- desc = "These arm guards will protect your hands and arms from close combat weapons."
- armor = list(
- melee = ARMOR_MELEE_VERY_HIGH,
- bullet = ARMOR_BALLISTIC_SMALL,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_MINOR
- )
-
-/obj/item/clothing/gloves/arm_guard/mercs
- name = "heavy arm guards"
- desc = "These arm guards will protect your hands and arms from harm."
- icon = 'icons/clothing/kit/heavy_armor.dmi'
- item_state = "armguards"
- icon_state = "armguards"
- contained_sprite = TRUE
- armor = list(
- melee = ARMOR_MELEE_RESISTANT,
- bullet = ARMOR_BALLISTIC_PISTOL,
- laser = ARMOR_LASER_HANDGUNS,
- energy = ARMOR_ENERGY_RESISTANT,
- bomb = ARMOR_BOMB_PADDED
- )
- species_restricted = null
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 7d496d433e2..2612fe5fa31 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -65,8 +65,10 @@
name = "head of security helmet"
desc = "A special Internal Security Division helmet designed to protect the precious craniums of important installation security officers."
desc_fluff = "What the heck did you just hecking say about me, you little honker? I'll have you know I graduated top of my class in the Sol Army, and I've been involved in numerous secret raids on the Jargon Federation, and I have over 300 confirmed kills. I am trained in gorilla warfare and I'm the top sniper in the entire Sol armed forces. You are nothing to me but just another target. I will wipe you the heck out with precision the likes of which has never been seen before on Biesel, mark my hecking words."
- icon_state = "hoshelmet"
- item_state = "hoshelmet"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_sec_commander"
+ item_state = "helm_sec_commander"
/obj/item/clothing/head/helmet/hos/dermal
name = "dermal armor patch"
@@ -89,7 +91,10 @@
/obj/item/clothing/head/helmet/riot
name = "riot helmet"
desc = "It's a helmet specifically designed to protect against close range attacks."
- icon_state = "riot"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_riot_up"
+ item_state = "helm_riot_up"
body_parts_covered = HEAD|FACE|EYES //face shield
armor = list(
melee = ARMOR_MELEE_VERY_HIGH,
@@ -103,20 +108,26 @@
if (use_check_and_message(user))
return
- if(src.icon_state == initial(icon_state))
- src.icon_state = "[icon_state]-up"
- to_chat(user, "You raise the visor on \the [src].")
- body_parts_covered = HEAD
- else
- src.icon_state = initial(icon_state)
- to_chat(user, "You lower the visor on \the [src].")
+ if(icon_state == initial(icon_state))
+ icon_state = "helm_riot_down"
+ item_state = "helm_riot_down"
+ to_chat(user, SPAN_NOTICE("You lower the visor on \the [src]."))
body_parts_covered = HEAD|FACE|EYES
+ else
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+ to_chat(user, SPAN_NOTICE("You raise the visor on \the [src]."))
+ body_parts_covered = HEAD
update_clothing_icon()
+
/obj/item/clothing/head/helmet/ablative
name = "ablative helmet"
desc = "A helmet made from advanced materials which protects against concentrated energy weapons."
- icon_state = "helmet_reflect"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_ablative"
+ item_state = "helm_ablative"
armor = list(
melee = ARMOR_MELEE_SMALL,
bullet = ARMOR_BALLISTIC_MINOR,
@@ -128,7 +139,10 @@
/obj/item/clothing/head/helmet/ballistic
name = "ballistic helmet"
desc = "A helmet with reinforced plating to protect against ballistic projectiles."
- icon_state = "helmet_bulletproof"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_ballistic"
+ item_state = "helm_ballistic"
armor = list(
melee = ARMOR_MELEE_MINOR,
bullet = ARMOR_BALLISTIC_AP,
@@ -140,9 +154,10 @@
/obj/item/clothing/head/helmet/merc
name = "combat helmet"
desc = "A tan helmet made from advanced ceramic."
- icon = 'icons/clothing/kit/heavy_armor.dmi'
- item_state = "helmet"
- icon_state = "helmet"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_heavy"
+ item_state = "helm_heavy"
contained_sprite = TRUE
armor = list(
melee = ARMOR_MELEE_VERY_HIGH,
diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm
index 109534e2c8d..5618fa581e3 100644
--- a/code/modules/clothing/shoes/jobs.dm
+++ b/code/modules/clothing/shoes/jobs.dm
@@ -42,6 +42,8 @@
desc = "Modified pair of boots, particularly friendly to those species whose toes hold claws."
icon_state = "jackboots_toeless"
species_restricted = null
+ sprite_sheets = list(
+ BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi')
/obj/item/clothing/shoes/jackboots/toeless/knee
name = "knee-high toeless black boots"
@@ -78,6 +80,8 @@
desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws."
icon_state = "workboots_toeless"
species_restricted = null
+ sprite_sheets = list(
+ BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi')
/obj/item/clothing/shoes/workboots/grey
name = "grey workboots"
diff --git a/code/modules/clothing/shoes/leg_guard.dm b/code/modules/clothing/shoes/leg_guard.dm
deleted file mode 100644
index bb8fc28515f..00000000000
--- a/code/modules/clothing/shoes/leg_guard.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-/obj/item/clothing/shoes/leg_guard
- name = "leg guards"
- desc = "These will protect your legs and feet."
- icon_state = "leg_guards_riot"
- item_state = "jackboots"
- body_parts_covered = LEGS|FEET
- w_class = ITEMSIZE_NORMAL
- armor = list(
- melee = ARMOR_MELEE_KNIVES,
- bullet = ARMOR_BALLISTIC_PISTOL,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_SMALL,
- bomb = ARMOR_BOMB_PADDED
- )
- siemens_coefficient = 0.35
- force = 3
- drop_sound = 'sound/items/drop/boots.ogg'
- pickup_sound = 'sound/items/pickup/boots.ogg'
-
-/obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0)
- if(..()) //This will only run if no other problems occured when equiping.
- if(H.wear_suit)
- if(H.wear_suit.body_parts_covered & LEGS)
- to_chat(H, "You can't wear \the [src] with \the [H.wear_suit], it's in the way.")
- return 0
- return 1
-
-/obj/item/clothing/shoes/leg_guard/laserproof
- name = "ablative leg guards"
- desc = "These will protect your legs and feet from energy weapons."
- icon_state = "leg_guards_laser"
- siemens_coefficient = 0
- armor = list(
- melee = ARMOR_MELEE_KNIVES,
- bullet = ARMOR_BALLISTIC_SMALL,
- laser = ARMOR_LASER_RIFLES,
- energy = ARMOR_ENERGY_RESISTANT,
- bomb = ARMOR_BOMB_PADDED
- )
-
-/obj/item/clothing/shoes/leg_guard/bulletproof
- name = "ballistic leg guards"
- desc = "These will protect your legs and feet from ballistic weapons."
- icon_state = "leg_guards_bullet"
- armor = list(
- melee = ARMOR_MELEE_KNIVES,
- bullet = ARMOR_BALLISTIC_RIFLE,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_MINOR,
- bomb = ARMOR_BOMB_PADDED
- )
-
-/obj/item/clothing/shoes/leg_guard/riot
- name = "riot leg guards"
- desc = "These will protect your legs and feet from close combat weapons."
- armor = list(
- melee = ARMOR_MELEE_VERY_HIGH,
- bullet = ARMOR_BALLISTIC_SMALL,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_MINOR,
- bomb = ARMOR_BOMB_PADDED
- )
-
-/obj/item/clothing/shoes/leg_guard/merc
- name = "heavy leg guards"
- desc = "These leg guards will protect your legs and feet from harm."
- icon = 'icons/clothing/kit/heavy_armor.dmi'
- item_state = "legguards"
- icon_state = "legguards"
- contained_sprite = TRUE
- armor = list(
- melee = ARMOR_MELEE_RESISTANT,
- bullet = ARMOR_BALLISTIC_PISTOL,
- laser = ARMOR_LASER_HANDGUNS,
- energy = ARMOR_ENERGY_RESISTANT,
- bomb = ARMOR_BOMB_PADDED
- )
- species_restricted = null
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 9c9d287242f..8015178fc83 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -236,6 +236,8 @@ obj/item/clothing/shoes/sandal/clogs
icon_state = "winterboots_toeless"
item_state = "winterboots_toeless"
species_restricted = null
+ sprite_sheets = list(
+ BODYTYPE_TAJARA = 'icons/mob/species/tajaran/shoes.dmi')
/obj/item/clothing/shoes/caligae
name = "caligae"
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index d409939f0d9..42734e5bee2 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -144,7 +144,7 @@
if("cell")
if(cell)
- to_chat(user, "You detatch \the [cell] from \the [src]'s battery mount.")
+ to_chat(user, "You detach \the [cell] from \the [src]'s battery mount.")
for(var/obj/item/rig_module/module in installed_modules)
module.deactivate()
if(user.r_hand && user.l_hand)
@@ -172,7 +172,7 @@
return
var/obj/item/rig_module/removed = possible_removals[removal_choice]
- to_chat(user, "You detatch \the [removed] from \the [src].")
+ to_chat(user, "You detach \the [removed] from \the [src].")
removed.forceMove(get_turf(src))
removed.removed()
installed_modules -= removed
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 2e4e89e6153..de02afc1f23 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -99,73 +99,6 @@
pockets.max_w_class = ITEMSIZE_SMALL
pockets.max_storage_space = 8
-/obj/item/clothing/suit/armor/riot
- name = "riot vest"
- desc = "A vest of armor with heavy padding to protect against melee attacks. Looks like it might impair movement."
- icon_state = "riot_vest"
- item_state = "riot_vest"
- slowdown = 1
- armor = list(
- melee = ARMOR_MELEE_VERY_HIGH,
- bullet = ARMOR_BALLISTIC_SMALL,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_MINOR,
- bomb = ARMOR_BOMB_PADDED
- )
- siemens_coefficient = 0.35
- pocket_slots = 4
-
-/obj/item/clothing/suit/armor/bulletproof
- name = "ballistic vest"
- desc = "A vest that excels in protecting the wearer against high-velocity solid projectiles."
- icon_state = "bulletproof_armor"
- item_state = "bulletproof_armor"
- blood_overlay_type = "armor"
- armor = list(
- melee = ARMOR_MELEE_RESISTANT,
- bullet = ARMOR_BALLISTIC_AP,
- laser = ARMOR_LASER_SMALL,
- energy = ARMOR_ENERGY_MINOR,
- bomb = ARMOR_BOMB_PADDED
- )
- siemens_coefficient = 0.35
- pocket_slots = 4
-
-/obj/item/clothing/suit/armor/laserproof
- name = "ablative armor vest"
- desc = "A vest that excels in protecting the wearer against energy projectiles."
- icon_state = "armor_reflec"
- item_state = "armor_reflec"
- blood_overlay_type = "armor"
- armor = list(
- melee = ARMOR_MELEE_KNIVES,
- bullet = ARMOR_BALLISTIC_PISTOL,
- laser = ARMOR_LASER_RIFLES,
- energy = ARMOR_ENERGY_RESISTANT
- )
- siemens_coefficient = 0
- pocket_slots = 4
-
-/obj/item/clothing/suit/armor/laserproof/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
- if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam))
- var/obj/item/projectile/P = damage_source
-
- var/reflectchance = 40 - round(damage/3)
- if(!(def_zone in list(BP_CHEST, BP_GROIN)))
- reflectchance /= 2
- if(P.starting && prob(reflectchance))
- visible_message("\The [user]'s [src.name] reflects [attack_text]!")
-
- // Find a turf near or on the original location to bounce to
- var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
-
- // redirect the projectile
- P.firer = user
- P.old_style_target(locate(new_x, new_y, P.z))
-
- return PROJECTILE_CONTINUE // complete projectile permutation
-
/obj/item/clothing/suit/armor/swat
name = "swat suit"
desc = "A heavily armored suit that protects against moderate damage. Used in special operations."
@@ -353,7 +286,6 @@
desc = "A set of armor worn by medical members of the Emergency Response Team. Has red and white highlights."
icon_state = "ertarmor_med"
-//New Vests
/obj/item/clothing/suit/storage/vest
name = "armor vest"
desc = "A simple kevlar plate carrier."
@@ -396,6 +328,7 @@
item_state = "hosvest_nobadge"
icon_badge = "hosvest_badge"
icon_nobadge = "hosvest_nobadge"
+
/obj/item/clothing/suit/storage/vest/pcrc
name = "PCRC armor vest"
desc = "A simple kevlar plate carrier belonging to Proxima Centauri Risk Control. This one has a PCRC crest clipped to the chest."
@@ -433,21 +366,6 @@
bomb = ARMOR_BOMB_MINOR
)
-/obj/item/clothing/suit/storage/vest/heavy
- name = "heavy armor vest"
- desc = "A heavy kevlar plate carrier with webbing attached."
- icon_state = "webvest"
- item_state = "webvest"
- armor = list(
- melee = ARMOR_MELEE_MAJOR,
- bullet = ARMOR_BALLISTIC_RESISTANT,
- laser = ARMOR_LASER_MAJOR,
- energy = ARMOR_ENERGY_SMALL,
- bomb = ARMOR_BOMB_PADDED,
- )
- slowdown = 1
- siemens_coefficient = 0.35
-
/obj/item/clothing/suit/storage/vest/heavy/officer
name = "officer heavy armor vest"
desc = "A heavy kevlar plate carrier belonging to Nanotrasen with webbing attached. This one has a security holobadge clipped to the chest."
@@ -487,23 +405,6 @@
icon_badge = "pcrcwebvest_badge"
icon_nobadge = "pcrcwebvest_nobadge"
-//Provides the protection of a merc voidsuit, but only covers the chest/groin, and also takes up a suit slot. In exchange it has no slowdown and provides storage.
-/obj/item/clothing/suit/storage/vest/merc
- name = "heavy armor vest"
- desc = "A high-quality armor vest in a fetching tan. It is surprisingly flexible and light, even with the added webbing and armor plating."
- icon = 'icons/clothing/kit/heavy_armor.dmi'
- item_state = "vest"
- icon_state = "vest"
- contained_sprite = TRUE
- armor = list(
- melee = ARMOR_MELEE_RESISTANT,
- bullet = ARMOR_BALLISTIC_RIFLE,
- laser = ARMOR_LASER_MAJOR,
- energy = ARMOR_ENERGY_RESISTANT,
- bomb = ARMOR_BOMB_PADDED
- )
- body_parts_covered = UPPER_TORSO|LOWER_TORSO
-
//ert related armor
/obj/item/clothing/suit/storage/vest/heavy/ert
diff --git a/code/modules/clothing/suits/modular_armor.dm b/code/modules/clothing/suits/modular_armor.dm
new file mode 100644
index 00000000000..246cd9470d5
--- /dev/null
+++ b/code/modules/clothing/suits/modular_armor.dm
@@ -0,0 +1,218 @@
+/obj/item/clothing/suit/armor/carrier
+ name = "plate carrier"
+ desc = "A plate carrier that can be decked out with various armor plates and accessories."
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "plate_carrier"
+ item_state = "plate_carrier"
+ blood_overlay_type = "armor"
+ w_class = ITEMSIZE_NORMAL
+ restricted_accessory_slots = list(ACCESSORY_SLOT_ARMOR_PLATE, ACCESSORY_SLOT_ARM_GUARDS, ACCESSORY_SLOT_LEG_GUARDS, ACCESSORY_SLOT_ARMOR_POCKETS, ACCESSORY_SLOT_ARMOR_PIN, ACCESSORY_SLOT_CAPE)
+ valid_accessory_slots = list(ACCESSORY_SLOT_ARMOR_PLATE, ACCESSORY_SLOT_ARM_GUARDS, ACCESSORY_SLOT_LEG_GUARDS, ACCESSORY_SLOT_ARMOR_POCKETS, ACCESSORY_SLOT_ARMOR_PIN, ACCESSORY_SLOT_CAPE)
+
+/obj/item/clothing/suit/armor/carrier/officer
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate
+ )
+
+/obj/item/clothing/suit/armor/carrier/hos
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/hos
+ )
+
+/obj/item/clothing/suit/armor/carrier/generic
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/generic
+ )
+
+/obj/item/clothing/suit/armor/carrier/riot
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/riot,
+ /obj/item/clothing/accessory/leg_guard/riot,
+ /obj/item/clothing/accessory/arm_guard/riot
+ )
+
+/obj/item/clothing/suit/armor/carrier/ballistic
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/ballistic,
+ /obj/item/clothing/accessory/leg_guard/ballistic,
+ /obj/item/clothing/accessory/arm_guard/ballistic
+ )
+
+/obj/item/clothing/suit/armor/carrier/ablative
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/ablative,
+ /obj/item/clothing/accessory/leg_guard/ablative,
+ /obj/item/clothing/accessory/arm_guard/ablative
+ )
+
+/obj/item/clothing/suit/armor/carrier/military
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/military,
+ /obj/item/clothing/accessory/leg_guard/military,
+ /obj/item/clothing/accessory/arm_guard/military
+ )
+
+/obj/item/clothing/suit/armor/carrier/heavy
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/heavy,
+ /obj/item/clothing/accessory/leg_guard/heavy,
+ /obj/item/clothing/accessory/arm_guard/heavy
+ )
+
+/obj/item/clothing/suit/armor/carrier/heavy/sec
+ starting_accessories = list(
+ /obj/item/clothing/accessory/armor_plate/heavy/sec,
+ /obj/item/clothing/accessory/leg_guard/heavy/sec,
+ /obj/item/clothing/accessory/arm_guard/heavy/sec
+ )
+
+/obj/item/clothing/accessory/armor_plate
+ name = "corporate armor plate"
+ desc = "A particularly light-weight armor plate in stylish corporate black. Unfortunately, not very good if you hold it with your hands."
+ desc_info = "These items must be hooked onto plate carriers for them to work!"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ icon_state = "plate_sec"
+ item_state = "plate_sec"
+ contained_sprite = TRUE
+ slot = ACCESSORY_SLOT_ARMOR_PLATE
+ body_parts_covered = UPPER_TORSO|LOWER_TORSO
+ w_class = ITEMSIZE_NORMAL
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_PISTOL,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/armor_plate/generic
+ name = "kevlar armor plate"
+ desc = "A light-weight kevlar armor plate in drab black colors. A galactic favourite of Zavodskoi fans."
+ icon_state = "plate_generic"
+ item_state = "plate_generic"
+
+/obj/item/clothing/accessory/armor_plate/hos
+ name = "commander armor plate"
+ desc = "A particularly light-weight armor plate with really cool gold bands. Even more stylish when the gold bands are covered in the blood of your goons!"
+ icon_state = "plate_sec_commander"
+ item_state = "plate_sec_commander"
+
+/obj/item/clothing/accessory/armor_plate/ballistic
+ name = "ballistic armor plate"
+ desc = "A heavy alloy ballistic armor plate in gunmetal grey. Shockingly stylish, but also shockingly tiring to wear!"
+ icon_state = "plate_ballistic"
+ item_state = "plate_ballistic"
+ armor = list(
+ melee = ARMOR_MELEE_RESISTANT,
+ bullet = ARMOR_BALLISTIC_AP,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR,
+ bomb = ARMOR_BOMB_PADDED
+ )
+ slowdown = 0.5
+
+/obj/item/clothing/accessory/armor_plate/riot
+ name = "riot armor plate"
+ desc = "A heavily padded riot armor plate. Many Biesellites wish they had these for Black Friday!"
+ icon_state = "plate_riot"
+ item_state = "plate_riot"
+ armor = list(
+ melee = ARMOR_MELEE_VERY_HIGH,
+ bullet = ARMOR_BALLISTIC_SMALL,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR,
+ bomb = ARMOR_BOMB_PADDED
+ )
+ slowdown = 0.5
+
+/obj/item/clothing/accessory/armor_plate/ablative
+ name = "ablative armor plate"
+ desc = "A heavy ablative armor plate. Shine like a diamond!"
+ icon_state = "plate_ablative"
+ item_state = "plate_ablative"
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_PISTOL,
+ laser = ARMOR_LASER_RIFLES,
+ energy = ARMOR_ENERGY_RESISTANT
+ )
+ slowdown = 0.5
+ siemens_coefficient = 0
+
+/obj/item/clothing/accessory/armor_plate/military
+ name = "military armor plate"
+ desc = "A heavy military armor plate. Worn by Solarian fanatics everywhere since the 2100s."
+ icon_state = "plate_military"
+ item_state = "plate_military"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_MAJOR,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED,
+ )
+ slowdown = 0.5
+
+/obj/item/clothing/accessory/armor_plate/heavy
+ name = "heavy armor plate"
+ desc = "A heavy and menacing armor plate. Tan armor plates went out of style centuries ago!"
+ icon_state = "plate_heavy"
+ item_state = "plate_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_MAJOR,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED,
+ )
+ slowdown = 0.5
+
+/obj/item/clothing/accessory/armor_plate/heavy/sec
+ name = "heavy corporate armor plate"
+ desc = "A heavy and stylish armor plate with blue highlights. That prevents teamkills, right?"
+ icon_state = "plate_sec_heavy"
+ item_state = "plate_sec_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/head/helmet/security
+ name = "corporate helmet"
+ desc = "A shiny helmet in corporate black! Goes well with the respective plate carrier."
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_sec"
+ item_state = "helm_sec"
+
+/obj/item/clothing/head/helmet/security/heavy
+ name = "corporate heavy helmet"
+ desc = "A shiny and heavy helmet in corporate black! Goes well with the respective plate carrier."
+ icon_state = "helm_sec_heavy"
+ item_state = "helm_sec_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/head/helmet/military
+ name = "military helmet"
+ desc = "A helmet in drab olive. Used by Solarian fanatics since the 2100s. You really had to pick the least original kit, didn't you?"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ contained_sprite = TRUE
+ icon_state = "helm_military"
+ item_state = "helm_military"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_MAJOR,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED,
+ )
\ No newline at end of file
diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm
index 765d07c11ca..b5e6cda29d0 100644
--- a/code/modules/clothing/suits/storage.dm
+++ b/code/modules/clothing/suits/storage.dm
@@ -63,7 +63,7 @@
icon_state = "[initial(icon_state)][opened ? "_open" : ""]"
item_state = icon_state
-/obj/item/clothing/suit/storage/vest/merc/Initialize()
+/obj/item/clothing/suit/armor/carrier/heavy/Initialize()
. = ..()
pockets = new/obj/item/storage/internal(src)
pockets.storage_slots = 4
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 66d10e0a8f4..0bbc8eb3130 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -7,7 +7,7 @@
overlay_state = null
slot_flags = SLOT_TIE
w_class = ITEMSIZE_SMALL
- var/slot = "decor"
+ var/slot = ACCESSORY_SLOT_GENERIC
var/obj/item/clothing/has_suit = null //the suit the tie may be attached to
var/image/inv_overlay = null //overlay used when attached to clothing.
var/image/mob_overlay = null
@@ -268,7 +268,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
siemens_coefficient = 0.9
w_class = ITEMSIZE_NORMAL
- slot = "over"
+ slot = ACCESSORY_SLOT_CAPE
var/allow_tail_hiding = TRUE //in case if you want to allow someone to switch the HIDETAIL var or not
/obj/item/clothing/accessory/poncho/verb/toggle_hide_tail()
@@ -488,11 +488,11 @@
overlay_state = "galaxycape"
/obj/item/clothing/accessory/poncho/trinary
- name = "trinary perfection cape"
- desc = "A brilliant red and brown cape, commonly worn by those who serve the Trinary Perfection."
- icon_state = "trinary_cape"
- item_state = "trinary_cape"
- overlay_state = "trinary_cape"
+ name = "trinary perfection cape"
+ desc = "A brilliant red and brown cape, commonly worn by those who serve the Trinary Perfection."
+ icon_state = "trinary_cape"
+ item_state = "trinary_cape"
+ overlay_state = "trinary_cape"
//tau ceti legion ribbons
/obj/item/clothing/accessory/legion
@@ -501,8 +501,8 @@
icon_state = "senior_ribbon"
item_state = "senior_ribbon"
overlay_state = "senior_ribbon"
- slot = "over"
- flippable = 1
+ slot = ACCESSORY_SLOT_CAPE
+ flippable = TRUE
/obj/item/clothing/accessory/legion/specialist
name = "specialist medallion"
@@ -516,7 +516,7 @@
desc = "A series of complex tubing meant to dissipate heat from the skin passively."
icon_state = "venter"
item_state = "venter"
- slot = "over"
+ slot = ACCESSORY_SLOT_CAPE
/obj/item/clothing/accessory/offworlder/bracer
name = "legbrace"
diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm
index abc23cd9e22..f8f9976872b 100644
--- a/code/modules/clothing/under/accessories/armband.dm
+++ b/code/modules/clothing/under/accessories/armband.dm
@@ -2,8 +2,8 @@
name = "red armband"
desc = "A fancy red armband!"
icon_state = "red"
- slot = "armband"
- flippable = 1
+ slot = ACCESSORY_SLOT_ARMBAND
+ flippable = TRUE
/obj/item/clothing/accessory/armband/sec
name = "security armband"
@@ -49,7 +49,7 @@
name = "science exo-stellar ribbon"
desc = "Durable cloth meant to be worn over or attached to the chest pieces of the ESS modules. This one is purple."
icon_state = "ribbon_sci"
- slot = "over"
+ slot = ACCESSORY_SLOT_CAPE
flippable = 0
/obj/item/clothing/accessory/armband/offworlder/engineering
diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm
new file mode 100644
index 00000000000..f122803a3d3
--- /dev/null
+++ b/code/modules/clothing/under/accessories/armor.dm
@@ -0,0 +1,197 @@
+//Leg guards.
+/obj/item/clothing/accessory/leg_guard
+ name = "corporate leg guards"
+ desc = "These will protect your legs and feet."
+ desc_info = "These items must be hooked onto plate carriers for them to work!"
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ icon_state = "legguards_sec"
+ item_state = "legguards_sec"
+ contained_sprite = TRUE
+ slot = ACCESSORY_SLOT_LEG_GUARDS
+ w_class = ITEMSIZE_NORMAL
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_PISTOL,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED
+ )
+ body_parts_covered = LEGS|FEET
+ contained_sprite = TRUE
+ drop_sound = 'sound/items/drop/boots.ogg'
+ pickup_sound = 'sound/items/pickup/boots.ogg'
+
+/obj/item/clothing/accessory/leg_guard/ablative
+ name = "ablative leg guards"
+ desc = "These will protect your legs and feet from energy weapons."
+ icon_state = "legguards_ablative"
+ item_state = "legguards_ablative"
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_SMALL,
+ laser = ARMOR_LASER_RIFLES,
+ energy = ARMOR_ENERGY_RESISTANT,
+ bomb = ARMOR_BOMB_PADDED
+ )
+ siemens_coefficient = 0
+
+/obj/item/clothing/accessory/leg_guard/ballistic
+ name = "ballistic leg guards"
+ desc = "These will protect your legs and feet from ballistic weapons."
+ icon_state = "legguards_ballistic"
+ item_state = "legguards_ballistic"
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_RIFLE,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/leg_guard/riot
+ name = "riot leg guards"
+ desc = "These will protect your legs and feet from close combat weapons."
+ icon_state = "legguards_riot"
+ item_state = "legguards_riot"
+ armor = list(
+ melee = ARMOR_MELEE_VERY_HIGH,
+ bullet = ARMOR_BALLISTIC_SMALL,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/leg_guard/military
+ name = "military leg guards"
+ desc = "These will protect your legs and feet from most things."
+ icon_state = "legguards_military"
+ item_state = "legguards_military"
+ armor = list(
+ melee = ARMOR_MELEE_VERY_HIGH,
+ bullet = ARMOR_BALLISTIC_SMALL,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/leg_guard/heavy
+ name = "heavy leg guards"
+ desc = "These leg guards will protect your legs and feet from most things."
+ icon_state = "legguards_heavy"
+ item_state = "legguards_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_RESISTANT,
+ bullet = ARMOR_BALLISTIC_PISTOL,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_RESISTANT,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/leg_guard/heavy/sec
+ name = "heavy corporate leg guards"
+ icon_state = "legguards_sec_heavy"
+ item_state = "legguards_sec_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+//Arm guards.
+/obj/item/clothing/accessory/arm_guard
+ name = "corporate arm guards"
+ desc = "These arm guards will protect your hands and arms."
+ icon = 'icons/clothing/kit/modular_armor.dmi'
+ icon_state = "armguards_sec"
+ item_state = "armguards_sec"
+ contained_sprite = TRUE
+ slot = ACCESSORY_SLOT_ARM_GUARDS
+ body_parts_covered = HANDS|ARMS
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_MINOR,
+ laser = ARMOR_LASER_MAJOR,
+ energy = ARMOR_ENERGY_MINOR,
+ bomb = ARMOR_BOMB_MINOR
+ )
+ w_class = ITEMSIZE_NORMAL
+ contained_sprite = TRUE
+ drop_sound = 'sound/items/drop/axe.ogg'
+ pickup_sound = 'sound/items/pickup/axe.ogg'
+
+/obj/item/clothing/accessory/arm_guard/ablative
+ name = "ablative arm guards"
+ desc = "These arm guards will protect your hands and arms from energy weapons."
+ icon_state = "armguards_ablative"
+ item_state = "armguards_ablative"
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_SMALL,
+ laser = ARMOR_LASER_RIFLES,
+ energy = ARMOR_ENERGY_RESISTANT
+ )
+ siemens_coefficient = 0
+
+/obj/item/clothing/accessory/arm_guard/ballistic
+ name = "ballistic arm guards"
+ desc = "These arm guards will protect your hands and arms from ballistic weapons."
+ icon_state = "armguards_ballistic"
+ item_state = "armguards_ballistic"
+ armor = list(
+ melee = ARMOR_MELEE_KNIVES,
+ bullet = ARMOR_BALLISTIC_RIFLE,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR
+ )
+
+/obj/item/clothing/accessory/arm_guard/riot
+ name = "riot arm guards"
+ desc = "These arm guards will protect your hands and arms from close combat weapons."
+ icon_state = "armguards_riot"
+ item_state = "armguards_riot"
+ armor = list(
+ melee = ARMOR_MELEE_VERY_HIGH,
+ bullet = ARMOR_BALLISTIC_SMALL,
+ laser = ARMOR_LASER_SMALL,
+ energy = ARMOR_ENERGY_MINOR
+ )
+
+/obj/item/clothing/accessory/arm_guard/military
+ name = "military arm guards"
+ desc = "These arm guards will protect your hands and arms from most things."
+ icon_state = "armguards_military"
+ item_state = "armguards_military"
+ armor = list(
+ melee = ARMOR_MELEE_RESISTANT,
+ bullet = ARMOR_BALLISTIC_PISTOL,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_RESISTANT,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/arm_guard/heavy
+ name = "heavy arm guards"
+ desc = "These arm guards will protect your hands and arms from most things."
+ icon_state = "armguards_heavy"
+ item_state = "armguards_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_RESISTANT,
+ bullet = ARMOR_BALLISTIC_PISTOL,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_RESISTANT,
+ bomb = ARMOR_BOMB_PADDED
+ )
+
+/obj/item/clothing/accessory/arm_guard/heavy/sec
+ name = "heavy corporate arm guards"
+ icon_state = "armguards_sec_heavy"
+ item_state = "armguards_sec_heavy"
+ armor = list(
+ melee = ARMOR_MELEE_MAJOR,
+ bullet = ARMOR_BALLISTIC_RESISTANT,
+ laser = ARMOR_LASER_HANDGUNS,
+ energy = ARMOR_ENERGY_SMALL,
+ bomb = ARMOR_BOMB_PADDED
+ )
diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm
index 0f8e9d4775e..cf7d43cc2fe 100644
--- a/code/modules/clothing/under/accessories/holster.dm
+++ b/code/modules/clothing/under/accessories/holster.dm
@@ -2,7 +2,7 @@
name = "shoulder holster"
desc = "A handgun holster."
icon_state = "holster"
- slot = "utility"
+ slot = ACCESSORY_SLOT_UTILITY
var/obj/item/holstered = null
var/sound_in = 'sound/weapons/holster/holsterin.ogg'
var/sound_out = 'sound/weapons/holster/holsterout.ogg'
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index b4a4c51280e..d3ede838aba 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -2,7 +2,7 @@
name = "load bearing equipment"
desc = "Used to hold things when you don't have enough hands."
icon_state = "webbing"
- slot = "utility"
+ slot = ACCESSORY_SLOT_UTILITY
var/slots = 3
var/obj/item/storage/internal/hold
w_class = ITEMSIZE_NORMAL
diff --git a/code/modules/custom_ka/core.dm b/code/modules/custom_ka/core.dm
index 25835cbc80b..ec85d0b1d6e 100644
--- a/code/modules/custom_ka/core.dm
+++ b/code/modules/custom_ka/core.dm
@@ -372,7 +372,7 @@
accuracy = round(recoil_increase*0.25)
accuracy_wielded = accuracy * 0.5
-/obj/item/gun/custom_ka/attack_self(mob/user as mob)
+/obj/item/gun/custom_ka/unique_action(mob/user)
. = ..()
if(!wielded)
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 743578d6706..d82f160d5f8 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -1648,9 +1648,9 @@ All custom items with worn sprites must follow the contained sprite system: http
contained_sprite = TRUE
/obj/item/fluff/cress_book //Lyric Book - Emily Cress - mattatlas
- name = "lyric book"
- desc = "An old, faded folder containing various alphabetically organized lyrics of several songs, including musical sheets for guitars. A dark purple H is scribbled on the center, along with half a heart on the \
- left and a cut on the bottom right. The lyrics inside have two copies each: one in Sol Common and one in Tau Ceti Basic. It generally looks to be hard rock."
+ name = "lyric folder"
+ desc = "An old, slightly faded folder containing various alphabetically organized lyrics of several songs, including musical sheets for guitars. The name on the folder reads \"Hyo\". \
+ The lyrics inside have two copies each: one in Sol Common and one in Tau Ceti Basic. It generally looks to be hard rock or metal, with overall somber lyrics."
icon = 'icons/obj/custom_items/cress_items.dmi'
icon_state = "cress_book"
w_class = ITEMSIZE_SMALL
@@ -1660,9 +1660,9 @@ All custom items with worn sprites must follow the contained sprite system: http
/obj/item/fluff/cress_book/attack_self(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- user.visible_message("[user] begins searching through \the [src] pages.")
+ user.visible_message("[user] begins searching through \the [src]'s pages...")
if(do_after(user, 25))
- to_chat(user, "You read on the pages of \the [src]: [pick(lyrics)]")
+ to_chat(user, "You pick out a song in the folder and read the lyrics: [pick(lyrics)]")
/obj/item/modular_computer/laptop/fluff/harrow_laptop //Developer's Laptop - Danny Harrow - brainos
diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm
index ac7e1a360be..aeca3f4cfbd 100644
--- a/code/modules/item_worth/worths_list.dm
+++ b/code/modules/item_worth/worths_list.dm
@@ -485,12 +485,12 @@ var/list/worths = list(
/obj/item/clothing/suit/unathi/mantle = 80,
/obj/item/clothing/suit/cultrobes = 200,
/obj/item/clothing/suit/storage/vest/heavy/ert = 2500,
- /obj/item/clothing/suit/storage/vest/merc = 3000,
+ /obj/item/clothing/suit/armor/carrier/heavy = 3000,
/obj/item/clothing/suit/armor/vest/ert = 2500,
/obj/item/clothing/suit/armor/vest = 550,
- /obj/item/clothing/suit/armor/riot = 700,
- /obj/item/clothing/suit/armor/bulletproof = 700,
- /obj/item/clothing/suit/armor/laserproof = 700,
+ /obj/item/clothing/suit/armor/carrier/riot = 700,
+ /obj/item/clothing/suit/armor/carrier/ballistic = 700,
+ /obj/item/clothing/suit/armor/carrier/ablative = 700,
/obj/item/clothing/suit/armor/reactive = 5000,
/obj/item/clothing/suit/armor/centcomm = 2000,
/obj/item/clothing/suit/armor/heavy = 1000,
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 4e803d555a4..674885a7014 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -13,7 +13,7 @@
new /datum/stack_recipe("[display_name] sword hilt", /obj/item/material/sword_hilt, 10, time = 100, one_per_turf = 0, on_floor = 1, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] sword blade", /obj/item/material/sword_blade, 15, time = 100, one_per_turf = 0, on_floor = 1, supplied_material = "[name]"),
new /datum/stack_recipe("[display_name] ring", /obj/item/clothing/ring/material, 1, on_floor = 1, supplied_material = "[name]"),
- new /datum/stack_recipe("[display_name] armor plate", /obj/item/material/armor_plating, 3, time = 20, on_floor = 1, supplied_material = "[name]")
+ new /datum/stack_recipe("[display_name] armor plating", /obj/item/material/armor_plating, 3, time = 20, on_floor = 1, supplied_material = "[name]")
))
if(integrity >= 50)
diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm
index 5e692f2080a..066b6c65181 100644
--- a/code/modules/mining/minebot.dm
+++ b/code/modules/mining/minebot.dm
@@ -2,7 +2,7 @@
icon_state = "miningdrone"
mod_type = "Mining"
law_type = /datum/ai_laws/mining_drone
- module_type = /obj/item/robot_module/mining_drone/basic
+ module_type = /obj/item/robot_module/mining_drone
holder_type = /obj/item/holder/drone/mining
maxHealth = 45
health = 45
@@ -15,7 +15,6 @@
var/seeking_player = FALSE
var/health_upgrade
var/ranged_upgrade
- var/melee_upgrade
var/drill_upgrade
/mob/living/silicon/robot/drone/mining/Initialize()
@@ -47,6 +46,20 @@
update_icon()
density = FALSE
+/mob/living/silicon/robot/drone/mining/examine(mob/user)
+ . = ..()
+ if(health_upgrade)
+ to_chat(user, SPAN_NOTICE("\The [src] appears to have a reinforced chassis."))
+ if(ranged_upgrade || drill_upgrade)
+ var/output_text = "\The [src]'s lights indicates it has"
+ if(ranged_upgrade && drill_upgrade)
+ output_text += " fully upgraded mining equipment."
+ else if(ranged_upgrade)
+ output_text += " a stationbound class KA mounted to it."
+ else if(drill_upgrade)
+ output_text += " a jackhammer drill mounted to it."
+ to_chat(user, SPAN_NOTICE(output_text))
+
/mob/living/silicon/robot/drone/mining/updatename()
real_name = "NT-I-[rand(100,999)]"
name = real_name
@@ -87,6 +100,11 @@
to_chat(user, SPAN_WARNING("\The [src] is not compatible with \the [W]."))
return
+ if(istype(W, /obj/item/device/mine_bot_upgrade))
+ var/obj/item/device/mine_bot_upgrade/MBU = W
+ MBU.upgrade_bot(src, user)
+ return
+
else if (W.GetID())
if(!allowed(user))
to_chat(user, SPAN_WARNING("Access denied."))
@@ -130,29 +148,22 @@
icon_state = "mainboard"
icon = 'icons/obj/module.dmi'
-/obj/item/device/mine_bot_upgrade/afterattack(var/mob/living/silicon/robot/drone/mining/M, mob/user, proximity)
- if(!istype(M) || !proximity)
- return
- if(upgrade_bot(M, user))
- to_chat(user, SPAN_NOTICE("You successfully install \the [src] into \the [M]."))
-
/obj/item/device/mine_bot_upgrade/proc/upgrade_bot(var/mob/living/silicon/robot/drone/mining/M, mob/user)
- if(M.melee_upgrade)
+ if(M.drill_upgrade)
to_chat(user, SPAN_WARNING("[src] already has a drill upgrade installed!"))
return
M.mod_type = initial(M.mod_type)
M.uneq_all()
- qdel(M.module)
- M.module = null
+ QDEL_NULL(M.module)
if(M.ranged_upgrade)
- new /obj/item/robot_module/mining_drone/drillandka(M)
+ M.module = new /obj/item/robot_module/mining_drone/drillandka(M, M)
else
- new /obj/item/robot_module/mining_drone/drill(M)
- M.melee_upgrade = TRUE
+ M.module = new /obj/item/robot_module/mining_drone/drill(M, M)
+ M.drill_upgrade = TRUE
M.module.rebuild()
M.recalculate_synth_capacities()
+ to_chat(user, SPAN_NOTICE("You successfully install \the [src] into \the [M]."))
qdel(src)
- return TRUE
/obj/item/device/mine_bot_upgrade/health
name = "minebot chassis upgrade"
@@ -168,8 +179,8 @@
var/datum/robot_component/C = M.components[V]
C.max_damage = 30
M.health_upgrade = TRUE
+ to_chat(user, SPAN_NOTICE("You successfully install \the [src] into \the [M]."))
qdel(src)
- return TRUE
/obj/item/device/mine_bot_upgrade/ka
name = "minebot kinetic accelerator upgrade"
@@ -180,17 +191,16 @@
return
M.mod_type = initial(M.mod_type)
M.uneq_all()
- qdel(M.module)
- M.module = null
- if(M.melee_upgrade)
- new /obj/item/robot_module/mining_drone/drillandka(M)
+ QDEL_NULL(M.module)
+ if(M.drill_upgrade)
+ M.module = new /obj/item/robot_module/mining_drone/drillandka(M, M)
else
- new /obj/item/robot_module/mining_drone/ka(M)
+ M.module = new /obj/item/robot_module/mining_drone/ka(M, M)
M.ranged_upgrade = TRUE
M.module.rebuild()
M.recalculate_synth_capacities()
+ to_chat(user, SPAN_NOTICE("You successfully install \the [src] into \the [M]."))
qdel(src)
- return TRUE
/mob/living/silicon/robot/drone/mining/roundstart/Initialize()
. = ..()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index d0076f23ccb..99707d22266 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -150,7 +150,7 @@
//buckled_to
if(buckled_to)
- msg += "[get_pronoun("He")] [get_pronoun("is")] [icon2html(buckled_to, user)] buckled_to to [buckled_to]!\n"
+ msg += "[get_pronoun("He")] [get_pronoun("is")] [icon2html(buckled_to, user)] buckled to [buckled_to]!\n"
//belt
if(belt)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index 3bc283ca2e4..d9e15e8b585 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -183,6 +183,7 @@
/mob/living/carbon/human/proc/ClothesSlowdown()
for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, wear_mask, shoes, l_ear, r_ear, glasses, belt))
. += I.slowdown
+ . += I.slowdown_accessory
/mob/living/carbon/human/get_pulling_movement_delay()
. = ..()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 3b5f6fb3131..d8dbed0c88b 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -967,9 +967,14 @@ var/global/list/robot_modules = list(
no_slip = TRUE
networks = list(NETWORK_MINE)
-/obj/item/robot_module/mining_drone/proc/set_up_default(var/mob/living/silicon/robot/R)
+/obj/item/robot_module/mining_drone/Initialize(mapload, mob/living/silicon/robot/R)
+ . = ..()
+ set_up_default(R)
+
+/obj/item/robot_module/mining_drone/proc/set_up_default(var/mob/living/silicon/robot/R, var/has_drill = TRUE)
modules += new /obj/item/device/flash(src)
- modules += new /obj/item/pickaxe/drill(src)
+ if(has_drill)
+ modules += new /obj/item/pickaxe/drill(src)
modules += new /obj/item/storage/bag/ore/drone(src)
modules += new /obj/item/storage/bag/sheetsnatcher/borg(src)
modules += new /obj/item/gripper/miner(src)
@@ -996,23 +1001,16 @@ var/global/list/robot_modules = list(
emag = new /obj/item/gun/energy/plasmacutter/mounted(src)
emag.name = "Mounted Plasma Cutter"
-/obj/item/robot_module/mining_drone/basic/Initialize(mapload, mob/living/silicon/robot/robot)
- . = ..()
- set_up_default(src)
-
-/obj/item/robot_module/mining_drone/drill/Initialize(mapload, mob/living/silicon/robot/robot)
- . = ..()
- set_up_default(src, FALSE)
+/obj/item/robot_module/mining_drone/drill/set_up_default(mob/living/silicon/robot/R)
+ ..(R, FALSE)
modules += new /obj/item/pickaxe/jackhammer(src)
-/obj/item/robot_module/mining_drone/ka/Initialize(mapload, mob/living/silicon/robot/robot)
- . = ..()
- set_up_default(src)
+/obj/item/robot_module/mining_drone/ka/set_up_default(mob/living/silicon/robot/R)
+ ..(R)
modules += new /obj/item/gun/custom_ka/cyborg(src)
-/obj/item/robot_module/mining_drone/drillandka/Initialize(mapload, mob/living/silicon/robot/robot)
- . = ..()
- set_up_default(src, FALSE)
+/obj/item/robot_module/mining_drone/drillandka/set_up_default(mob/living/silicon/robot/R)
+ ..(R, FALSE)
modules += new /obj/item/pickaxe/jackhammer(src)
modules += new /obj/item/gun/custom_ka/cyborg(src)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 03ac137bf11..6ad1ea8e798 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1335,6 +1335,18 @@
set hidden = 1
set_face_dir(client.client_dir(WEST))
+/mob/living/verb/unique_action()
+ set hidden = 1
+ var/obj/item/gun/dakka = get_active_hand()
+ if(istype(dakka))
+ dakka.unique_action(src)
+
+/mob/living/verb/toggle_firing_mode()
+ set hidden = 1
+ var/obj/item/gun/dakka = get_active_hand()
+ if(istype(dakka))
+ dakka.toggle_firing_mode(src)
+
/mob/proc/adjustEarDamage()
return
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index fd5f5a6b81f..3a9b5ae5f7e 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -35,6 +35,8 @@
var/obj/screen/gun/move/gun_move_icon = null
var/obj/screen/gun/run/gun_run_icon = null
var/obj/screen/gun/mode/gun_setting_icon = null
+ var/obj/screen/gun/unique_action_icon = null
+ var/obj/screen/gun/toggle_firing_mode = null
var/obj/screen/up_hint = null
//spells hud icons - this interacts with add_spell and remove_spell
diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm
index 837b35e2889..95b86ec9d3a 100644
--- a/code/modules/modular_computers/computers/modular_computer/core.dm
+++ b/code/modules/modular_computers/computers/modular_computer/core.dm
@@ -79,7 +79,7 @@
verbs += /obj/item/modular_computer/proc/eject_usb
if(battery_module && battery_module.hotswappable)
verbs += /obj/item/modular_computer/proc/eject_battery
- if(ai_slot && ai_slot.stored_card)
+ if(ai_slot)
verbs += /obj/item/modular_computer/proc/eject_ai
if(personal_ai)
verbs += /obj/item/modular_computer/proc/eject_personal_ai
diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm
index 048df45c28c..f93e2f51d18 100644
--- a/code/modules/modular_computers/computers/subtypes/preset_console.dm
+++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm
@@ -80,6 +80,10 @@
_app_preset_type = /datum/modular_computer_app_presets/command/account
enrolled = 1
+/obj/item/modular_computer/console/preset/command/account/centcomm
+ name = "centcomm accounts database"
+ _app_preset_type = /datum/modular_computer_app_presets/command/account/centcomm
+
// Security
/obj/item/modular_computer/console/preset/security
name = "security console"
diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm
index 71c1fb6f837..e01c4218db5 100644
--- a/code/modules/modular_computers/file_system/programs/app_presets.dm
+++ b/code/modules/modular_computers/file_system/programs/app_presets.dm
@@ -325,6 +325,19 @@
)
return _prg_list
+/datum/modular_computer_app_presets/command/account/centcomm/return_install_programs(obj/item/modular_computer/comp)
+ var/list/_prg_list = list(
+ new /datum/computer_file/program/ntnetdownload(comp),
+ new /datum/computer_file/program/filemanager(comp),
+ new /datum/computer_file/program/newsbrowser(comp),
+ new /datum/computer_file/program/manifest(comp),
+ new /datum/computer_file/program/civilian/cargoorder(comp),
+ new /datum/computer_file/program/civilian/cargocontrol(comp),
+ new /datum/computer_file/program/records/employment(comp),
+ new /datum/computer_file/program/account_db(comp, TRUE)
+ )
+ return _prg_list
+
/datum/modular_computer_app_presets/security
name = "security"
display_name = "Security"
diff --git a/code/modules/modular_computers/file_system/programs/command/account_database.dm b/code/modules/modular_computers/file_system/programs/command/account_database.dm
index 8a426c10aa9..f8ed6f6a675 100644
--- a/code/modules/modular_computers/file_system/programs/command/account_database.dm
+++ b/code/modules/modular_computers/file_system/programs/command/account_database.dm
@@ -12,14 +12,17 @@
color = LIGHT_COLOR_BLUE
var/machine_id = ""
+ var/centcomm_db = FALSE
-/datum/computer_file/program/account_db/New()
+/datum/computer_file/program/account_db/New(obj/item/modular_computer/comp, var/is_centcomm_db = FALSE)
..()
if(current_map)
machine_id = "[station_name()] Acc. DB #[SSeconomy.num_financial_terminals++]"
else
machine_id = "NT-Net Relay Back-up Software DB" // created during map generation inside the ntnet relay, not used by players
+ centcomm_db = is_centcomm_db
+
/datum/computer_file/program/account_db/proc/get_held_card()
var/obj/item/card/id/held_card
if(computer.card_slot?.stored_card)
@@ -84,7 +87,8 @@
data["accounts"] = list()
if(get_access_level())
- for(var/M in SSeconomy.all_money_accounts)
+ var/list/SSeconomy_accounts = centcomm_db ? SSeconomy.all_money_accounts : SSeconomy.get_public_accounts()
+ for(var/M in SSeconomy_accounts)
var/datum/money_account/D = SSeconomy.get_account(M)
var/account_number = "[M]"
data["accounts"][account_number] = list()
@@ -234,7 +238,8 @@