diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index 4e5b6d6dfb0..7ad84b4a79d 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -52,4 +52,4 @@
#define INNATE 64 // All mobs can be assumed to speak and understand this language. (audible emotes)
#define NO_TALK_MSG 128 // Do not show the "\The [speaker] talks into \the [radio]" message
#define NO_STUTTER 256 // No stuttering, slurring, or other speech problems
-#define ALT_TRANSMIT 512 // Language is not based on vision or sound (Todo: add this into the say code and use it for the rootspeak languages)
\ No newline at end of file
+#define ALT_TRANSMIT 512 // Language is not based on vision or sound (Todo: add this into the say code and use it for the rootspeak languages)
diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm
index 70456bee77f..d7fd20ac770 100644
--- a/code/_helpers/mobs.dm
+++ b/code/_helpers/mobs.dm
@@ -63,12 +63,12 @@ proc/random_facial_hair_style(gender, species = "Human")
return f_style
-proc/sanitize_name(name, species = "Human")
+proc/sanitize_name(name, species = "Human", robot = 0)
var/datum/species/current_species
if(species)
current_species = all_species[species]
- return current_species ? current_species.sanitize_name(name) : sanitizeName(name)
+ return current_species ? current_species.sanitize_name(name, robot) : sanitizeName(name, MAX_NAME_LEN, robot)
proc/random_name(gender, species = "Human")
diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm
index 68cb5276fad..bd175e4fcc2 100644
--- a/code/_helpers/text.dm
+++ b/code/_helpers/text.dm
@@ -85,7 +85,7 @@
// 0 .. 9
if(48 to 57) //Numbers
if(!last_char_group) continue //suppress at start of string
- if(!allow_numbers) continue
+ if(!allow_numbers) continue // If allow_numbers is 0, then don't do this.
output += ascii2text(ascii_char)
number_of_alphanumeric++
last_char_group = 3
diff --git a/code/datums/autolathe/engineering.dm b/code/datums/autolathe/engineering.dm
index 0921806ac00..ca40b4a6a9e 100644
--- a/code/datums/autolathe/engineering.dm
+++ b/code/datums/autolathe/engineering.dm
@@ -74,6 +74,10 @@
name = "request console electronics"
path =/obj/item/weapon/circuitboard/request
+/datum/category_item/autolathe/engineering/pipelayer
+ name = "pipe layer electronics"
+ path =/obj/item/weapon/circuitboard/pipelayer
+
/datum/category_item/autolathe/engineering/motor
name = "motor"
path =/obj/item/weapon/stock_parts/motor
diff --git a/code/datums/supplypacks/costumes.dm b/code/datums/supplypacks/costumes.dm
index 321c0fde0e4..480913d858a 100644
--- a/code/datums/supplypacks/costumes.dm
+++ b/code/datums/supplypacks/costumes.dm
@@ -78,7 +78,7 @@
/obj/item/clothing/under/scratch,
/obj/item/clothing/under/wedding/bride_white,
/obj/item/clothing/suit/chef,
- /obj/item/clothing/suit/apron/overalls,
+ /obj/item/clothing/suit/storage/apron/overalls,
/obj/item/clothing/under/redcoat,
/obj/item/clothing/under/kilt
)
diff --git a/code/datums/supplypacks/hydroponics.dm b/code/datums/supplypacks/hydroponics.dm
index a962986587e..6b737bfc573 100644
--- a/code/datums/supplypacks/hydroponics.dm
+++ b/code/datums/supplypacks/hydroponics.dm
@@ -51,7 +51,7 @@
/obj/item/weapon/material/minihoe,
/obj/item/device/analyzer/plant_analyzer,
/obj/item/clothing/gloves/botanic_leather,
- /obj/item/clothing/suit/apron,
+ /obj/item/clothing/suit/storage/apron,
/obj/item/weapon/material/minihoe,
/obj/item/weapon/storage/box/botanydisk
)
diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm
index 17203e3d5df..7cea8427786 100644
--- a/code/datums/uplink/tools.dm
+++ b/code/datums/uplink/tools.dm
@@ -58,11 +58,6 @@
item_cost = 15
path = /obj/item/device/encryptionkey/binary
-/datum/uplink_item/item/tools/packagebomb
- name = "Package Bomb (Small)"
- item_cost = 20
- path = /obj/item/weapon/storage/box/syndie_kit/demolitions
-
/datum/uplink_item/item/tools/hacking_tool
name = "Door Hacking Tool"
item_cost = 20
@@ -81,6 +76,11 @@
item_cost = 30
path = /obj/item/clothing/glasses/thermal/syndi
+/datum/uplink_item/item/tools/packagebomb
+ name = "Package Bomb (Small)"
+ item_cost = 30
+ path = /obj/item/weapon/storage/box/syndie_kit/demolitions
+
/datum/uplink_item/item/tools/powersink
name = "Powersink (DANGER!)"
item_cost = 40
@@ -88,13 +88,13 @@
/datum/uplink_item/item/tools/packagebomb/large
name = "Package Bomb (Large)"
- item_cost = 40
+ item_cost = 60
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_heavy
/*
/datum/uplink_item/item/tools/packagebomb/huge
name = "Package Bomb (Huge)
- item_cost = 60
+ item_cost = 100
path = /obj/item/weapon/storage/box/syndie_kit/demolitions_super_heavy
*/
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index 5ecc707227c..12a05e6d3a4 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -290,19 +290,21 @@
/obj/item/weapon/module
icon = 'icons/obj/module.dmi'
icon_state = "std_module"
+ item_state = "std_mod"
w_class = ITEMSIZE_SMALL
- item_state = "electronic"
flags = CONDUCT
var/mtype = 1 // 1=electronic 2=hardware
/obj/item/weapon/module/card_reader
name = "card reader module"
icon_state = "card_mod"
+ item_state = "std_mod"
desc = "An electronic module for reading data and ID cards."
/obj/item/weapon/module/power_control
name = "power control module"
icon_state = "power_mod"
+ item_state = "std_mod"
desc = "Heavy-duty switching circuits for power control."
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
@@ -321,11 +323,13 @@
/obj/item/weapon/module/cell_power
name = "power cell regulator module"
icon_state = "power_mod"
+ item_state = "std_mod"
desc = "A converter and regulator allowing the use of power cells."
/obj/item/weapon/module/cell_power
name = "power cell charger module"
icon_state = "power_mod"
+ item_state = "std_mod"
desc = "Charging circuits for power cells."
diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm
index 1e6913a3748..616080bfbf8 100644
--- a/code/game/antagonist/station/renegade.dm
+++ b/code/game/antagonist/station/renegade.dm
@@ -52,6 +52,7 @@ var/datum/antagonist/renegade/renegades
/obj/item/weapon/gun/projectile/shotgun/pump/combat,
/obj/item/weapon/gun/projectile/shotgun/doublebarrel,
/obj/item/weapon/gun/projectile/revolver/judge,
+ /obj/item/weapon/gun/projectile/revolver/lemat,
list(/obj/item/weapon/gun/projectile/shotgun/doublebarrel/pellet, /obj/item/weapon/gun/projectile/shotgun/doublebarrel/sawn),
list(/obj/item/weapon/gun/projectile/deagle, /obj/item/weapon/gun/projectile/deagle/gold, /obj/item/weapon/gun/projectile/deagle/camo),
list(/obj/item/weapon/gun/projectile/revolver/detective, /obj/item/weapon/gun/projectile/revolver/deckard),
diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm
index 63be38ba7d5..0784a1a9fc5 100644
--- a/code/game/jobs/job/captain.dm
+++ b/code/game/jobs/job/captain.dm
@@ -23,41 +23,41 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
ideal_character_age = 70 // Old geezer captains ftw
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/cap(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/com(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform)
- if(H.age>49)
- // Since we can have something other than the default uniform at this
- // point, check if we can actually attach the medal
- var/obj/item/clothing/uniform = H.w_uniform
- var/obj/item/clothing/accessory/medal/gold/captain/medal = new()
+/datum/job/captain/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/cap(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/com(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform)
+ if(H.age>49)
+ // Since we can have something other than the default uniform at this
+ // point, check if we can actually attach the medal
+ var/obj/item/clothing/uniform = H.w_uniform
+ var/obj/item/clothing/accessory/medal/gold/captain/medal = new()
- if(uniform && uniform.can_attach_accessory(medal))
- uniform.attach_accessory(null, medal)
- else
- qdel(medal)
- H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
+ if(uniform && uniform.can_attach_accessory(medal))
+ uniform.attach_accessory(null, medal)
else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
+ qdel(medal)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
- H.implant_loyalty()
+ H.implant_loyalty()
- return 1
+ return 1
- get_access()
- return get_all_station_access()
+/datum/job/captain/get_access()
+ return get_all_station_access()
@@ -95,22 +95,24 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_hop, access_RC_announce, access_keycard_auth, access_gateway)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
- H.implant_loyalty()
- return 1
+/datum/job/hop/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hop(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_personnel(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack)
+ H.implant_loyalty()
+ return 1
+
+
/datum/job/secretary
title = "Command Secretary"
@@ -131,7 +133,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access = list(access_heads)
minimal_access = list(access_heads)
-/datum/job/secretary/equip(var/mob/living/carbon/human/H)
+/datum/job/secretary/equip(var/mob/living/carbon/human/H, var/alt_title)
if(!H) return 0
H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(H), slot_l_ear)
switch(H.backbag)
diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm
index 02a79c25e4b..3a57b35f0a6 100644
--- a/code/game/jobs/job/civilian.dm
+++ b/code/game/jobs/job/civilian.dm
@@ -15,18 +15,18 @@
alt_titles = list("Barista")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt)
- return 1
+/datum/job/bartender/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/bar(H), slot_belt)
+ return 1
@@ -46,15 +46,15 @@
alt_titles = list("Cook")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chef(H), slot_belt)
- return 1
+/datum/job/chef/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/chefhat(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/chef(H), slot_belt)
+ return 1
@@ -74,21 +74,21 @@
alt_titles = list("Hydroponicist")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
- H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/hyd(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/hyd(H), slot_back)
- return 1
+/datum/job/hydro/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/hydroponics(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/botanic_leather(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/device/analyzer/plant_analyzer(H), slot_s_store)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/botanist(H), slot_belt)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/hyd(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/hyd(H), slot_back)
+ return 1
@@ -112,16 +112,16 @@
ideal_character_age = 40
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/quartermaster(H), slot_belt)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- return 1
+/datum/job/qm/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/quartermaster(H), slot_belt)
+// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
+ H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
+ return 1
@@ -139,14 +139,14 @@
access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station)
minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/cargo(H), slot_belt)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- return 1
+/datum/job/cargo_tech/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/cargo(H), slot_belt)
+// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ return 1
@@ -166,27 +166,27 @@
minimal_access = list(access_mining, access_mining_station, access_mailsorting)
alt_titles = list("Drill Technician","Prospector")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo (H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
-// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
- return 1
+/datum/job/mining/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo (H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+// H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_l_store)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/crowbar(H), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/bag/ore(H), slot_in_backpack)
+ return 1
- equip_survival(var/mob/living/carbon/human/H)
+/datum/job/mining/equip_survival(var/mob/living/carbon/human/H)
if(!H) return 0
H.species.equip_survival_gear(H,1)
return 1
@@ -207,13 +207,13 @@
alt_titles = list("Custodian", "Sanitation Technician")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
- return 1
+/datum/job/janitor/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/janitor(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/janitor(H), slot_belt)
+ return 1
@@ -234,13 +234,13 @@
alt_titles = list("Journalist", "Professor", "Historian", "Writer")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/librarian(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_l_hand)
- return 1
+/datum/job/librarian/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/red(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/librarian(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/barcodescanner(H), slot_l_hand)
+ return 1
@@ -261,22 +261,22 @@
minimal_access = list(access_lawyer, access_sec_doors, access_heads)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/ia(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses)
- H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
+/datum/job/lawyer/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/ia(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand)
- H.implant_loyalty()
+ H.implant_loyalty()
- return 1
+ return 1
diff --git a/code/game/jobs/job/civilian_chaplain.dm b/code/game/jobs/job/civilian_chaplain.dm
index 26065fe1e9e..2533bb72043 100644
--- a/code/game/jobs/job/civilian_chaplain.dm
+++ b/code/game/jobs/job/civilian_chaplain.dm
@@ -15,146 +15,146 @@
alt_titles = list("Counselor")
- equip(var/mob/living/carbon/human/H, var/alt_title, var/ask_questions = TRUE)
- if(!H) return 0
+/datum/job/chaplain/equip(var/mob/living/carbon/human/H, var/alt_title, var/ask_questions = TRUE)
+ if(!H) return 0
- var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H) //BS12 EDIT
- H.equip_to_slot_or_del(B, slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chaplain(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- if(!ask_questions)
- return 1
-
-
- spawn(0)
- var/religion_name = "Christianity"
- var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name), MAX_NAME_LEN)
-
- if (!new_religion)
- new_religion = religion_name
-
- switch(lowertext(new_religion))
- if("christianity")
- B.name = pick("The Holy Bible","The Dead Sea Scrolls")
- if("satanism")
- B.name = "The Unholy Bible"
- if("cthulu")
- B.name = "The Necronomicon"
- if("islam")
- B.name = "Quran"
- if("scientology")
- B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
- if("chaos")
- B.name = "The Book of Lorgar"
- if("imperium")
- B.name = "Uplifting Primer"
- if("toolboxia")
- B.name = "Toolbox Manifesto"
- if("homosexuality")
- B.name = "Guys Gone Wild"
- //if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
- // B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
- // H.setBrainLoss(100) // starts off retarded as fuck
- if("science")
- B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
- else
- B.name = "The Holy Book of [new_religion]"
- feedback_set_details("religion_name","[new_religion]")
-
- spawn(1)
- var/deity_name = "Space Jesus"
- var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name), MAX_NAME_LEN)
-
- if ((length(new_deity) == 0) || (new_deity == "Space Jesus") )
- new_deity = deity_name
- B.deity_name = new_deity
-
- var/accepted = 0
- var/outoftime = 0
- spawn(200) // 20 seconds to choose
- outoftime = 1
- var/new_book_style = "Bible"
-
- while(!accepted)
- if(!B) break // prevents possible runtime errors
- new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon")
- switch(new_book_style)
- if("Koran")
- B.icon_state = "koran"
- B.item_state = "koran"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(4)
- if("Scrapbook")
- B.icon_state = "scrapbook"
- B.item_state = "scrapbook"
- if("Creeper")
- B.icon_state = "creeper"
- B.item_state = "syringe_kit"
- if("White Bible")
- B.icon_state = "white"
- B.item_state = "syringe_kit"
- if("Holy Light")
- B.icon_state = "holylight"
- B.item_state = "syringe_kit"
- if("Athiest")
- B.icon_state = "athiest"
- B.item_state = "syringe_kit"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(10)
- if("Tome")
- B.icon_state = "tome"
- B.item_state = "syringe_kit"
- if("The King in Yellow")
- B.icon_state = "kingyellow"
- B.item_state = "kingyellow"
- if("Ithaqua")
- B.icon_state = "ithaqua"
- B.item_state = "ithaqua"
- if("Scientology")
- B.icon_state = "scientology"
- B.item_state = "scientology"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(8)
- if("the bible melts")
- B.icon_state = "melted"
- B.item_state = "melted"
- if("Necronomicon")
- B.icon_state = "necronomicon"
- B.item_state = "necronomicon"
- else
- // if christian bible, revert to default
- B.icon_state = "bible"
- B.item_state = "bible"
- for(var/area/chapel/main/A in world)
- for(var/turf/T in A.contents)
- if(T.icon_state == "carpetsymbol")
- T.set_dir(2)
-
- H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
-
- switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
- if("Yes")
- accepted = 1
- if("No")
- if(outoftime)
- H << "Welp, out of time, buddy. You're stuck. Next time choose faster."
- accepted = 1
-
- if(ticker)
- ticker.Bible_icon_state = B.icon_state
- ticker.Bible_item_state = B.item_state
- ticker.Bible_name = B.name
- ticker.Bible_deity_name = B.deity_name
- feedback_set_details("religion_deity","[new_deity]")
- feedback_set_details("religion_book","[new_book_style]")
+ var/obj/item/weapon/storage/bible/B = new /obj/item/weapon/storage/bible(H) //BS12 EDIT
+ H.equip_to_slot_or_del(B, slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chaplain(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/chaplain(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ if(!ask_questions)
return 1
+
+ spawn(0)
+ var/religion_name = "Christianity"
+ var/new_religion = sanitize(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name), MAX_NAME_LEN)
+
+ if (!new_religion)
+ new_religion = religion_name
+
+ switch(lowertext(new_religion))
+ if("christianity")
+ B.name = pick("The Holy Bible","The Dead Sea Scrolls")
+ if("satanism")
+ B.name = "The Unholy Bible"
+ if("cthulu")
+ B.name = "The Necronomicon"
+ if("islam")
+ B.name = "Quran"
+ if("scientology")
+ B.name = pick("The Biography of L. Ron Hubbard","Dianetics")
+ if("chaos")
+ B.name = "The Book of Lorgar"
+ if("imperium")
+ B.name = "Uplifting Primer"
+ if("toolboxia")
+ B.name = "Toolbox Manifesto"
+ if("homosexuality")
+ B.name = "Guys Gone Wild"
+ //if("lol", "wtf", "gay", "penis", "ass", "poo", "badmin", "shitmin", "deadmin", "cock", "cocks")
+ // B.name = pick("Woodys Got Wood: The Aftermath", "War of the Cocks", "Sweet Bro and Hella Jef: Expanded Edition")
+ // H.setBrainLoss(100) // starts off retarded as fuck
+ if("science")
+ B.name = pick("Principle of Relativity", "Quantum Enigma: Physics Encounters Consciousness", "Programming the Universe", "Quantum Physics and Theology", "String Theory for Dummies", "How To: Build Your Own Warp Drive", "The Mysteries of Bluespace", "Playing God: Collector's Edition")
+ else
+ B.name = "The Holy Book of [new_religion]"
+ feedback_set_details("religion_name","[new_religion]")
+
+ spawn(1)
+ var/deity_name = "Space Jesus"
+ var/new_deity = sanitize(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name), MAX_NAME_LEN)
+
+ if ((length(new_deity) == 0) || (new_deity == "Space Jesus") )
+ new_deity = deity_name
+ B.deity_name = new_deity
+
+ var/accepted = 0
+ var/outoftime = 0
+ spawn(200) // 20 seconds to choose
+ outoftime = 1
+ var/new_book_style = "Bible"
+
+ while(!accepted)
+ if(!B) break // prevents possible runtime errors
+ new_book_style = input(H,"Which bible style would you like?") in list("Bible", "Koran", "Scrapbook", "Creeper", "White Bible", "Holy Light", "Athiest", "Tome", "The King in Yellow", "Ithaqua", "Scientology", "the bible melts", "Necronomicon")
+ switch(new_book_style)
+ if("Koran")
+ B.icon_state = "koran"
+ B.item_state = "koran"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.set_dir(4)
+ if("Scrapbook")
+ B.icon_state = "scrapbook"
+ B.item_state = "scrapbook"
+ if("Creeper")
+ B.icon_state = "creeper"
+ B.item_state = "syringe_kit"
+ if("White Bible")
+ B.icon_state = "white"
+ B.item_state = "syringe_kit"
+ if("Holy Light")
+ B.icon_state = "holylight"
+ B.item_state = "syringe_kit"
+ if("Athiest")
+ B.icon_state = "athiest"
+ B.item_state = "syringe_kit"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.set_dir(10)
+ if("Tome")
+ B.icon_state = "tome"
+ B.item_state = "syringe_kit"
+ if("The King in Yellow")
+ B.icon_state = "kingyellow"
+ B.item_state = "kingyellow"
+ if("Ithaqua")
+ B.icon_state = "ithaqua"
+ B.item_state = "ithaqua"
+ if("Scientology")
+ B.icon_state = "scientology"
+ B.item_state = "scientology"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.set_dir(8)
+ if("the bible melts")
+ B.icon_state = "melted"
+ B.item_state = "melted"
+ if("Necronomicon")
+ B.icon_state = "necronomicon"
+ B.item_state = "necronomicon"
+ else
+ // if christian bible, revert to default
+ B.icon_state = "bible"
+ B.item_state = "bible"
+ for(var/area/chapel/main/A in world)
+ for(var/turf/T in A.contents)
+ if(T.icon_state == "carpetsymbol")
+ T.set_dir(2)
+
+ H.update_inv_l_hand() // so that it updates the bible's item_state in his hand
+
+ switch(input(H,"Look at your bible - is this what you want?") in list("Yes","No"))
+ if("Yes")
+ accepted = 1
+ if("No")
+ if(outoftime)
+ H << "Welp, out of time, buddy. You're stuck. Next time choose faster."
+ accepted = 1
+
+ if(ticker)
+ ticker.Bible_icon_state = B.icon_state
+ ticker.Bible_item_state = B.item_state
+ ticker.Bible_name = B.name
+ ticker.Bible_deity_name = B.deity_name
+ feedback_set_details("religion_deity","[new_deity]")
+ feedback_set_details("religion_book","[new_book_style]")
+ return 1
+
/datum/job/chaplain/equip_preview(var/mob/living/carbon/human/H, var/alt_title)
return equip(H, alt_title, FALSE)
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index b9cc65dcdef..e8b24b04460 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -28,26 +28,26 @@
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/ce(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- return 1
+/datum/job/chief_engineer/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/ce(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat/white(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ return 1
- equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
+/datum/job/chief_engineer/equip_survival(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.species.equip_survival_gear(H,1)
+ return 1
/datum/job/engineer
@@ -67,26 +67,26 @@
alt_titles = list("Maintenance Technician","Engine Technician","Electrician")
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
- H.equip_to_slot_or_del(new /obj/item/device/pda/engineering(H), slot_l_store)
- return 1
+/datum/job/engineer/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/hardhat(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/device/t_scanner(H), slot_r_store)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/engineering(H), slot_l_store)
+ return 1
- equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
+/datum/job/engineer/equip_survival(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.species.equip_survival_gear(H,1)
+ return 1
/datum/job/atmos
@@ -106,21 +106,21 @@
minimal_player_age = 3
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
- return 1
+/datum/job/atmos/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_eng(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/workboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/atmostech/(H), slot_belt)
+ return 1
- equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
+/datum/job/atmos/equip_survival(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.species.equip_survival_gear(H,1)
+ return 1
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index db8dd443cd3..589abbc0bc0 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -23,21 +23,21 @@
minimal_player_age = 10
ideal_character_age = 50
- equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/cmo(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store)
- return 1
+/datum/job/cmo/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/cmo(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/cmo(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store)
+ return 1
/datum/job/doctor
title = "Medical Doctor"
@@ -55,50 +55,50 @@
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_virology, access_eva)
alt_titles = list("Surgeon","Emergency Physician","Nurse","Virologist")
- equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
+/datum/job/doctor/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
+ if(has_alt_title(H, alt_title,"Emergency Physician"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
+ else if(has_alt_title(H, alt_title,"Surgeon"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/blue(H), slot_head)
+ else if(has_alt_title(H, alt_title,"Virologist"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
- if(has_alt_title(H, alt_title,"Emergency Physician"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
- else if(has_alt_title(H, alt_title,"Surgeon"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/blue(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/surgery/blue(H), slot_head)
- else if(has_alt_title(H, alt_title,"Virologist"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/virologist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/virologist(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(H), slot_wear_mask)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/viro(H), slot_back)
- else if(has_alt_title(H, alt_title,"Medical Doctor"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- else if(has_alt_title(H, alt_title,"Nurse"))
- if(H.gender == FEMALE)
- if(prob(50))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/nursehat(H), slot_head)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/viro(H), slot_back)
+ else if(has_alt_title(H, alt_title,"Medical Doctor"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ else if(has_alt_title(H, alt_title,"Nurse"))
+ if(H.gender == FEMALE)
+ if(prob(50))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nursesuit(H), slot_w_uniform)
else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/purple(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/nurse(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/nursehat(H), slot_head)
else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store)
- return 1
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/purple(H), slot_w_uniform)
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/healthanalyzer(H), slot_s_store)
+ return 1
@@ -121,19 +121,19 @@
minimal_player_age = 3
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/chem(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/chem(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
- return 1
+/datum/job/chemist/equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chemist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/chemist(H), slot_belt)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/chem(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/chem(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit)
+ return 1
/* I'm commenting out Geneticist so you can't actually see it in the job menu, given that you can't play as one - Jon.
@@ -151,19 +151,19 @@
access = list(access_medical, access_morgue, access_surgery, access_chemistry, access_virology, access_genetics, access_research)
minimal_access = list(access_medical, access_morgue, access_genetics, access_research)
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/gen(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
- return 1
+/datum/job/geneticist/equip(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_medsci(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/geneticist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/geneticist(H), slot_belt)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/genetics(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/gen(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
+ return 1
*/
/datum/job/psychiatrist
@@ -182,23 +182,23 @@
minimal_access = list(access_medical, access_medical_equip, access_psychiatrist)
alt_titles = list("Psychologist")
- equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- if(has_alt_title(H, alt_title,"Psychiatrist"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
- else if(has_alt_title(H, alt_title,"Psychologist"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+/datum/job/psychiatrist/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
+ if(has_alt_title(H, alt_title,"Psychiatrist"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform)
+ else if(has_alt_title(H, alt_title,"Psychologist"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych/turtleneck(H), slot_w_uniform)
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
/datum/job/Paramedic
@@ -217,29 +217,29 @@
minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks)
alt_titles = list("Emergency Medical Technician")
- equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
- if(has_alt_title(H, alt_title,"Emergency Medical Technician"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
- else if(has_alt_title(H, alt_title,"Paramedic"))
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/black(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/emt(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_l_store)
- return 1
+/datum/job/Paramedic/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_med(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back)
+ if(has_alt_title(H, alt_title,"Emergency Medical Technician"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
+ else if(has_alt_title(H, alt_title,"Paramedic"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/black(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit)
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/medical/emt(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_l_store)
+ return 1
- equip_survival(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.species.equip_survival_gear(H,1)
- return 1
+/datum/job/Paramedic/equip_survival(var/mob/living/carbon/human/H)
+ if(!H) return 0
+ H.species.equip_survival_gear(H,1)
+ return 1
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 7cfc8b85800..01ea140c10c 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -26,20 +26,20 @@
minimal_player_age = 14
ideal_character_age = 50
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- return 1
+/datum/job/rd/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/rd(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/research_director(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/rd(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/weapon/clipboard(H), slot_l_hand)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ return 1
@@ -61,19 +61,19 @@
minimal_player_age = 14
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
- return 1
+/datum/job/scientist/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
+ return 1
/datum/job/xenobiologist
title = "Xenobiologist"
@@ -93,19 +93,19 @@
minimal_player_age = 14
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
- return 1
+/datum/job/xenobiologist/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/scientist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/science(H), slot_belt)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit)
+ return 1
/datum/job/roboticist
title = "Roboticist"
@@ -125,14 +125,14 @@
minimal_player_age = 7
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
- if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_r_store)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
- return 1
+/datum/job/roboticist/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sci(H), slot_l_ear)
+ if(H.backbag == 2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(H.backbag == 3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/roboticist(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/roboticist(H), slot_r_store)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit)
+ return 1
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 8d9da09cbe1..f7753efc87c 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -20,30 +20,30 @@
access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers,
access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting,
access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks)
- alt_titles = list("Commander")
+ alt_titles = list("Commander", "Chief of Security")
minimum_character_age = 25
minimal_player_age = 14
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
-// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
- H.implant_loyalty()
- return 1
+/datum/job/hos/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hos(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_store)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
+ H.implant_loyalty()
+ return 1
@@ -63,26 +63,26 @@
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_armory, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 5
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
-// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
- H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
- return 1
+/datum/job/warden/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
+// H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
+ H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
+ return 1
@@ -102,31 +102,32 @@
minimal_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels, access_eva, access_external_airlocks)
economic_modifier = 5
minimal_player_age = 3
- equip(var/mob/living/carbon/human/H, var/alt_title)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store)
- if(H.backbag == 1)//Why cant some of these things spawn in his office?
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
- if(has_alt_title(H, alt_title,"Forensic Technician"))
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit, slot_r_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_trench(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/det(H), slot_head)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit(H), slot_r_hand)
- return 1
+
+/datum/job/detective/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/weapon/flame/lighter/zippo(H), slot_l_store)
+ if(H.backbag == 1)//Why cant some of these things spawn in his office?
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_l_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/evidence(H), slot_in_backpack)
+ if(has_alt_title(H, alt_title,"Forensic Technician"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit, slot_r_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/det_trench(H), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/det(H), slot_head)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/crimekit(H), slot_r_hand)
+ return 1
@@ -146,22 +147,23 @@
access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_morgue, access_external_airlocks)
minimal_access = list(access_security, access_eva, access_sec_doors, access_brig, access_maint_tunnels, access_external_airlocks)
minimal_player_age = 3
- equip(var/mob/living/carbon/human/H)
- if(!H) return 0
- H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
- switch(H.backbag)
- if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
- if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
- if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
- H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
- H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store)
- H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
- if(H.backbag == 1)
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
- else
- H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
- return 1
+
+/datum/job/officer/equip(var/mob/living/carbon/human/H, var/alt_title)
+ if(!H) return 0
+ H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_sec(H), slot_l_ear)
+ switch(H.backbag)
+ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back)
+ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back)
+ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
+ if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/boots/jackboots(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt)
+ H.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_s_store)
+ H.equip_to_slot_or_del(new /obj/item/device/flash(H), slot_l_store)
+ if(H.backbag == 1)
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_l_hand)
+ else
+ H.equip_to_slot_or_del(new /obj/item/weapon/handcuffs(H), slot_in_backpack)
+ return 1
diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm
index 0de61b4685f..40726825a19 100644
--- a/code/game/machinery/pipe/pipelayer.dm
+++ b/code/game/machinery/pipe/pipelayer.dm
@@ -1,57 +1,104 @@
/obj/machinery/pipelayer
-
name = "automatic pipe layer"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d"
density = 1
- var/turf/old_turf
- var/old_dir
- var/on = 0
- var/a_dis = 0
- var/P_type = 0
- var/P_type_t = ""
- var/max_metal = 50
- var/metal = 10
- var/obj/item/weapon/wrench/W
+ circuit = /obj/item/weapon/circuitboard/pipelayer
+ var/turf/old_turf // Last turf we were on.
+ var/old_dir // Last direction we were facing.
+ var/on = 0 // Pipelaying online?
+ var/a_dis = 0 // Auto-dismantling - If enabled it will remove floor tiles
+ var/P_type = 0 // Currently selected pipe type
+ var/P_type_t = "" // Name of currently selected pipe type
+ var/max_metal = 50 // Max capacity for internal metal storage
+ var/metal = 0 // Current amount in internal metal storage
+ var/pipe_cost = 0.25 // Cost in steel for each pipe.
+ var/obj/item/weapon/wrench/W // Internal wrench used for wrenching down the pipes
var/list/Pipes = list("regular pipes"=0,"scrubbers pipes"=31,"supply pipes"=29,"heat exchange pipes"=2)
/obj/machinery/pipelayer/New()
W = new(src)
..()
+ default_apply_parts()
+ update_icon()
+/obj/machinery/pipelayer/Destroy()
+ qdel(W)
+ W = null
+ ..()
+
+/obj/machinery/pipelayer/RefreshParts()
+ var/mb_rating = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ mb_rating += M.rating
+ max_metal = mb_rating * initial(max_metal)
+
+/obj/machinery/pipelayer/dismantle()
+ eject_metal()
+ ..()
+
+// Whenever we move, if enabled try and lay pipe
/obj/machinery/pipelayer/Move(new_turf,M_Dir)
..()
if(on && a_dis)
dismantleFloor(old_turf)
- layPipe(old_turf,M_Dir,old_dir)
+ layPipe(old_turf, M_Dir, old_dir)
old_turf = new_turf
- old_dir = turn(M_Dir,180)
+ old_dir = turn(M_Dir, 180)
/obj/machinery/pipelayer/attack_hand(mob/user as mob)
- if(!metal&&!on)
+ if(..())
+ return
+ if(panel_open)
+ if(metal < 1)
+ user << "\The [src] is empty."
+ return
+ var/answer = alert(user, "Do you want to eject all the metal in \the [src]?", , "Yes","No")
+ if(answer == "Yes")
+ var/amount_ejected = eject_metal()
+ user.visible_message("[user] removes [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from the \the [src].",
+ "You remove [amount_ejected] sheet\s of [DEFAULT_WALL_MATERIAL] from \the [src].")
+ return
+ if(!metal && !on)
user << "\The [src] doesn't work without metal."
return
- on=!on
+ on = !on
+ old_turf = get_turf(src)
+ old_dir = dir
user.visible_message("[user] has [!on?"de":""]activated \the [src].", "You [!on?"de":""]activate \the [src].")
return
/obj/machinery/pipelayer/attackby(var/obj/item/W as obj, var/mob/user as mob)
-
- if (istype(W, /obj/item/weapon/wrench))
+ if(default_deconstruction_screwdriver(user, W))
+ return
+ if(default_deconstruction_crowbar(user, W))
+ return
+ if(default_part_replacement(user, W))
+ return
+ if (!panel_open && iswrench(W))
P_type_t = input("Choose pipe type", "Pipe type") as null|anything in Pipes
P_type = Pipes[P_type_t]
user.visible_message("[user] has set \the [src] to manufacture [P_type_t].", "You set \the [src] to manufacture [P_type_t].")
return
-
- if(istype(W, /obj/item/weapon/crowbar))
- a_dis=!a_dis
+ if(!panel_open && iscrowbar(W))
+ a_dis = !a_dis
user.visible_message("[user] has [!a_dis?"de":""]activated auto-dismantling.", "You [!a_dis?"de":""]activate auto-dismantling.")
return
-
+ if(istype(W, /obj/item/pipe))
+ // NOTE - We must check for matter, otherwise the (free) pipe dispenser can be used to get infinite steel.
+ if(!W.matter || W.matter[DEFAULT_WALL_MATERIAL] < pipe_cost * SHEET_MATERIAL_AMOUNT)
+ user << "\The [W] doesn't contain enough [DEFAULT_WALL_MATERIAL] to recycle."
+ else if(metal + pipe_cost > max_metal)
+ user << "\The [src] is full."
+ else
+ user.drop_from_inventory(W)
+ metal += pipe_cost
+ usr << "You recycle \the [W]."
+ qdel(W)
+ return
if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL)
-
var/result = load_metal(W)
if(isnull(result))
user << "Unable to load [W] - no metal found."
@@ -59,23 +106,8 @@
user << "\The [src] is full."
else
user.visible_message("[user] has loaded metal into \the [src].", "You load metal into \the [src]")
-
return
- if(istype(W, /obj/item/weapon/screwdriver))
- if(metal)
- var/m = round(input(usr,"Please specify the amount of metal to remove","Remove metal",min(round(metal),50)) as num, 1)
- m = min(m, 50)
- m = min(m, round(metal))
- m = round(m)
- if(m)
- use_metal(m)
- var/obj/item/stack/material/steel/MM = new (get_turf(src))
- MM.amount = m
- user.visible_message("[user] removes [m] sheet\s of metal from the \the [src].", "You remove [m] sheet\s of metal from \the [src]")
- else
- user << "\The [src] is empty."
- return
..()
/obj/machinery/pipelayer/examine(mob/user)
@@ -83,7 +115,7 @@
user << "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated."
/obj/machinery/pipelayer/proc/reset()
- on=0
+ on = 0
return
/obj/machinery/pipelayer/proc/load_metal(var/obj/item/stack/MM)
@@ -100,12 +132,22 @@
return
/obj/machinery/pipelayer/proc/use_metal(amount)
- if(!metal || metal= 1)
+ var/material/M = get_material_by_name(DEFAULT_WALL_MATERIAL)
+ var/obj/item/stack/material/S = new M.stack_type(get_turf(src))
+ S.amount = min(metal, S.max_amount)
+ metal -= S.amount
+ amount_ejected += S.amount
+ return amount_ejected
+
/obj/machinery/pipelayer/proc/dismantleFloor(var/turf/new_turf)
if(istype(new_turf, /turf/simulated/floor))
var/turf/simulated/floor/T = new_turf
@@ -114,11 +156,11 @@
return new_turf.is_plating()
/obj/machinery/pipelayer/proc/layPipe(var/turf/w_turf,var/M_Dir,var/old_dir)
- if(!on || !(M_Dir in list(1, 2, 4, 8)) || M_Dir==old_dir)
+ if(!on || !(M_Dir in list(NORTH, SOUTH, EAST, WEST)) || M_Dir==old_dir)
return reset()
- if(!use_metal(0.25))
+ if(!use_metal(pipe_cost))
return reset()
- var/fdirn = turn(M_Dir,180)
+ var/fdirn = turn(M_Dir, 180)
var/p_type
var/p_dir
@@ -130,6 +172,8 @@
p_dir=M_Dir
var/obj/item/pipe/P = new (w_turf, pipe_type=p_type, dir=p_dir)
+ // We used metal to make these, so should be reclaimable!
+ P.matter = list(DEFAULT_WALL_MATERIAL = pipe_cost * SHEET_MATERIAL_AMOUNT)
P.attackby(W , src)
return 1
diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm
index 3ecb7c7b2db..e80b7d8f106 100644
--- a/code/game/objects/effects/landmarks.dm
+++ b/code/game/objects/effects/landmarks.dm
@@ -194,7 +194,7 @@
new /obj/item/clothing/under/waiter(src.loc)
var/CHOICE= pick( /obj/item/clothing/head/kitty, /obj/item/clothing/head/rabbitears)
new CHOICE(src.loc)
- new /obj/item/clothing/suit/apron(src.loc)
+ new /obj/item/clothing/suit/storage/apron(src.loc)
delete_me = 1
/obj/effect/landmark/costume/pirate/New()
diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm
index 0bb26b32bc7..90fb43724ed 100644
--- a/code/game/objects/items/devices/translator.dm
+++ b/code/game/objects/items/devices/translator.dm
@@ -16,7 +16,8 @@
if(!listening) //Turning ON
langset = input(user,"Translate to which of your languages?","Language Selection") as null|anything in user.languages
if(langset)
- if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND)))
+ if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND) || (!langset.machine_understands)))
+ //Nonverbal means no spoken words to translate, so I didn't see the need to remove it.
to_chat(user, "\The [src] cannot output that language.")
return
else
@@ -49,6 +50,9 @@
if (language && (language.flags & NONVERBAL))
return //Not gonna translate sign language
+ if (!language.machine_understands)
+ return //Any other languages that it can't translate.
+
if (visual && ((L.sdisabilities & BLIND) || L.eye_blind))
return //Can't see the screen, don't get the message
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index da2b23e0e32..7680231428f 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -6,7 +6,7 @@
icon_state = "tube"
origin_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3)
amount = 10
-
+ w_class = ITEMSIZE_SMALL
/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
if (!istype(M) || !istype(user))
diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm
index 9684bba4dbe..c5e6614de25 100755
--- a/code/game/objects/items/weapons/AI_modules.dm
+++ b/code/game/objects/items/weapons/AI_modules.dm
@@ -10,7 +10,6 @@ AI MODULES
name = "\improper AI module"
icon = 'icons/obj/module.dmi'
icon_state = "std_mod"
- item_state = "electronic"
desc = "An AI Module for transmitting encrypted instructions to the AI."
flags = CONDUCT
force = 5.0
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/engineering.dm b/code/game/objects/items/weapons/circuitboards/machinery/engineering.dm
new file mode 100644
index 00000000000..91aefbf6a58
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/machinery/engineering.dm
@@ -0,0 +1,13 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+/obj/item/weapon/circuitboard/pipelayer
+ name = T_BOARD("pipe layer")
+ build_path = /obj/machinery/pipelayer
+ board_type = new /datum/frame/frame_types/machine
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+ req_components = list(
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1)
diff --git a/code/game/objects/items/weapons/improvised_components.dm b/code/game/objects/items/weapons/improvised_components.dm
index 5d89707e62f..9e6e05a807e 100644
--- a/code/game/objects/items/weapons/improvised_components.dm
+++ b/code/game/objects/items/weapons/improvised_components.dm
@@ -67,41 +67,4 @@
qdel(I)
qdel(src)
user.put_in_hands(finished)
- update_icon(user)
-
-/obj/item/woodcirclet
- name = "wood circlet"
- desc = "A small wood circlet for making a flower crown."
- icon = 'icons/obj/buildingobject.dmi'
- icon_state = "woodcirclet"
- w_class = ITEMSIZE_SMALL
-
-/obj/item/woodcirclet/attackby(obj/item/W as obj, mob/user as mob)
- var/obj/item/complete
- if(istype(W,/obj/item/seeds/poppyseed))
- user << "You attach the poppy to the circlet and create a beautiful flower crown."
- complete = new /obj/item/clothing/head/poppy_crown(get_turf(user))
- user.drop_from_inventory(W)
- user.drop_from_inventory(src)
- qdel(W)
- qdel(src)
- user.put_in_hands(complete)
- return
- else if(istype(W,/obj/item/seeds/sunflowerseed))
- user << "You attach the sunflower to the circlet and create a beautiful flower crown."
- complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user))
- user.drop_from_inventory(W)
- user.drop_from_inventory(src)
- qdel(W)
- qdel(src)
- user.put_in_hands(complete)
- return
- else if(istype(W,/obj/item/seeds/lavenderseed))
- user << "You attach the lavender to the circlet and create a beautiful flower crown."
- complete = new /obj/item/clothing/head/lavender_crown(get_turf(user))
- user.drop_from_inventory(W)
- user.drop_from_inventory(src)
- qdel(W)
- qdel(src)
- user.put_in_hands(complete)
- return
\ No newline at end of file
+ update_icon(user)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/permits.dm b/code/game/objects/items/weapons/permits.dm
new file mode 100644
index 00000000000..8196a9b5ae5
--- /dev/null
+++ b/code/game/objects/items/weapons/permits.dm
@@ -0,0 +1,34 @@
+//This'll be used for gun permits, such as for heads of staff, antags, and bartenders
+
+/obj/item/weapon/permit
+ name = "permit"
+ desc = "A permit for something."
+ icon = 'icons/obj/card.dmi'
+ icon_state = "permit"
+ w_class = ITEMSIZE_TINY
+ var/owner = 0 //To prevent people from just renaming the thing if they steal it
+
+/obj/item/weapon/permit/attack_self(mob/user as mob)
+ if(isliving(user))
+ if(!owner)
+ set_name(user.name)
+ else
+ to_chat(user, "[src] already has an owner!")
+
+/obj/item/weapon/permit/proc/set_name(var/new_name)
+ owner = 1
+ if(new_name)
+ src.name += " ([new_name])"
+ desc += " It belongs to [new_name]."
+
+/obj/item/weapon/permit/emag_act(var/remaining_charges, var/mob/user)
+ to_chat(user, "You reset the naming locks on [src]!")
+ owner = 0
+
+/obj/item/weapon/permit/gun
+ name = "weapon permit"
+ desc = "A card indicating that the owner is allowed to carry a firearm."
+
+/obj/item/weapon/permit/gun/bar
+ name = "bar shotgun permit"
+ desc = "A card indicating that the owner is allowed to carry a shotgun in the bar."
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm
index 490ae2d62b5..3de967d78f7 100644
--- a/code/game/objects/items/weapons/syndie.dm
+++ b/code/game/objects/items/weapons/syndie.dm
@@ -39,6 +39,10 @@
/obj/item/weapon/syndie/c4explosive/proc/detonate()
icon_state = "c-4[size]_1"
+ playsound(loc, 'sound/weapons/armbomb.ogg', 75, 1)
+ for(var/mob/O in hearers(src, null))
+ O.show_message("\icon[src] The [src.name] beeps! ")
+ sleep(50)
explosion(get_turf(src), power, power*2, power*3, power*4, power*5)
for(var/dirn in cardinal) //This is to guarantee that C4 at least breaks down all immediately adjacent walls and doors.
var/turf/simulated/wall/T = get_step(src,dirn)
@@ -89,4 +93,4 @@
/obj/item/weapon/flame/lighter/zippo/c4detonator/attackby(obj/item/weapon/W, mob/user as mob)
if(istype(W, /obj/item/weapon/screwdriver))
detonator_mode = !detonator_mode
- user << "You unscrew the top panel of \the [src] revealing a button."
\ No newline at end of file
+ user << "You unscrew the top panel of \the [src] revealing a button."
diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm
index 5f66562c61e..0c433a63a04 100644
--- a/code/game/objects/items/weapons/towels.dm
+++ b/code/game/objects/items/weapons/towels.dm
@@ -12,6 +12,10 @@
/obj/item/weapon/towel/attack_self(mob/living/user as mob)
user.visible_message(text("[] uses [] to towel themselves off.", user, src))
playsound(user, 'sound/weapons/towelwipe.ogg', 25, 1)
+ if(user.fire_stacks > 0)
+ user.fire_stacks = (max(0, user.fire_stacks - 1.5))
+ else if(user.fire_stacks < 0)
+ user.fire_stacks = (min(0, user.fire_stacks + 1.5))
/obj/item/weapon/towel/random/New()
..()
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index d604eca82cb..56fa0b28b08 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -80,10 +80,8 @@
var/turf/T = get_turf(M)
if(T)
var/obj/effect/energy_net/net = new net_type(T)
- net.layer = M.layer+1
- M.captured = 1
- net.affecting = M
- T.visible_message("[M] was caught in an energy net!")
+ if(net.buckle_mob(M))
+ T.visible_message("[M] was caught in an energy net!")
qdel(src)
// If we miss or hit an obstacle, we still want to delete the net.
@@ -99,107 +97,56 @@
density = 1
opacity = 0
mouse_opacity = 1
- anchored = 1
+ anchored = 0
- var/health = 25
- var/mob/living/affecting = null //Who it is currently affecting, if anyone.
- var/mob/living/master = null //Who shot web. Will let this person know if the net was successful.
- var/countdown = -1
+ can_buckle = 1
+ buckle_movable = 1
+ buckle_lying = 0
+ buckle_dir = SOUTH
-/obj/effect/energy_net/teleport
- countdown = 60
+ var/escape_time = 8 SECONDS
/obj/effect/energy_net/New()
..()
processing_objects |= src
/obj/effect/energy_net/Destroy()
-
- if(affecting)
- var/mob/living/carbon/M = affecting
- M.anchored = initial(affecting.anchored)
- M.captured = 0
- M << "You are free of the net!"
+ if(buckled_mob)
+ to_chat(buckled_mob,"You are free of the net!")
+ unbuckle_mob()
processing_objects -= src
..()
-/obj/effect/energy_net/proc/healthcheck()
-
- if(health <=0)
- density = 0
- src.visible_message("The energy net is torn apart!")
- qdel(src)
- return
-
/obj/effect/energy_net/process()
-
- if(isnull(affecting) || affecting.loc != loc)
+ if(isnull(buckled_mob) || buckled_mob.loc != loc)
qdel(src)
- return
- // Countdown begin set to -1 will stop the teleporter from firing.
- // Clientless mobs can be netted but they will not teleport or decrement the timer.
- var/mob/living/M = affecting
- if(countdown == -1 || (istype(M) && !M.client))
- return
-
- if(countdown > 0)
- countdown--
- return
-
- // TODO: consider removing or altering this; energy nets are useful on their own
- // merits and the teleportation was never properly implemented; it's halfassed.
- density = 0
- invisibility = 101 //Make the net invisible so all the animations can play out.
- health = INFINITY //Make the net invincible so that an explosion/something else won't kill it during anims.
-
- playsound(affecting.loc, 'sound/effects/sparks4.ogg', 50, 1)
- anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phaseout",,affecting.dir)
-
- affecting.visible_message("[affecting] vanishes in a flare of light!")
-
- if(holdingfacility.len)
- affecting.loc = pick(holdingfacility)
-
- affecting << "You appear in a strange place!"
-
- playsound(affecting.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(affecting.loc, 'sound/effects/sparks2.ogg', 50, 1)
- anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phasein",,affecting.dir)
-
- qdel(src)
-
-/obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.get_structure_damage()
- healthcheck()
- return 0
-
-/obj/effect/energy_net/ex_act()
- health = 0
- healthcheck()
-
-/obj/effect/energy_net/attack_hand(var/mob/user)
-
- var/mob/living/carbon/human/H = user
- if(istype(H))
- if(H.species.can_shred(H))
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
- health -= rand(10, 20)
- else
- health -= rand(1,3)
-
- else if (HULK in user.mutations)
- health = 0
- else
- health -= rand(5,8)
-
- H << "You claw at the energy net."
-
- healthcheck()
- return
-
-/obj/effect/energy_net/attackby(obj/item/weapon/W as obj, mob/user as mob)
- health -= W.force
- healthcheck()
+/obj/effect/energy_net/Move()
..()
+ if(buckled_mob)
+ var/mob/living/occupant = buckled_mob
+ occupant.buckled = null
+ occupant.forceMove(src.loc)
+ occupant.buckled = src
+ if (occupant && (src.loc != occupant.loc))
+ unbuckle_mob()
+ qdel(src)
+
+/obj/effect/energy_net/user_unbuckle_mob(mob/user)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ visible_message("[user] begins to tear at \the [src]!")
+ if(do_after(usr, escape_time, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
+ if(!buckled_mob)
+ return
+ visible_message("[user] manages to tear \the [src] apart!")
+ unbuckle_mob()
+
+/obj/effect/energy_net/post_buckle_mob(mob/living/M)
+ if(buckled_mob) //Just buckled someone
+ ..()
+ layer = M.layer+1
+ M.can_pull_size = 0
+ else //Just unbuckled someone
+ M.can_pull_size = initial(M.can_pull_size)
+ qdel(src)
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 0834bf45f25..75c0d5830ff 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -583,7 +583,7 @@ something, make sure it's not in one of the other lists.*/
prob(3);/obj/item/clothing/suit/storage/toggle/brown_jacket,
prob(3);/obj/item/clothing/suit/storage/toggle/leather_jacket,
prob(1);/obj/item/clothing/suit/storage/vest/press,
- prob(3);/obj/item/clothing/suit/apron,
+ prob(3);/obj/item/clothing/suit/storage/apron,
prob(4);/obj/item/clothing/under/color/grey,
prob(2);/obj/item/clothing/under/syndicate/tacticool,
prob(2);/obj/item/clothing/under/pants/camo,
@@ -795,8 +795,8 @@ something, make sure it's not in one of the other lists.*/
prob(3);/obj/item/clothing/glasses/material,
prob(3);/obj/item/clothing/head/soft/yellow,
prob(4);/obj/item/clothing/suit/storage/hazardvest,
- prob(3);/obj/item/clothing/suit/apron/overalls,
- prob(4);/obj/item/clothing/suit/apron,
+ prob(3);/obj/item/clothing/suit/storage/apron/overalls,
+ prob(4);/obj/item/clothing/suit/storage/apron,
prob(2);/obj/item/clothing/under/syndicate/tacticool,
prob(1);/obj/item/clothing/under/syndicate/combat,
prob(2);/obj/item/clothing/accessory/storage/black_vest,
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
index bf7aa92fa66..09161a9f488 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/hydroponics.dm
@@ -13,9 +13,9 @@
..()
switch(rand(1,2))
if(1)
- new /obj/item/clothing/suit/apron(src)
+ new /obj/item/clothing/suit/storage/apron(src)
if(2)
- new /obj/item/clothing/suit/apron/overalls(src)
+ new /obj/item/clothing/suit/storage/apron/overalls(src)
new /obj/item/weapon/storage/bag/plants(src)
new /obj/item/clothing/under/rank/hydroponics(src)
new /obj/item/device/analyzer/plant_analyzer(src)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index 0d8a94944d8..bd23290e301 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -4,7 +4,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "cart"
anchored = 0
- density = 1
+ density = 1
+ climbable = 1
flags = OPENCONTAINER
//copypaste sorry
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index db234a1a2e8..5e0c0d5abb5 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -4,6 +4,7 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "mopbucket"
density = 1
+ climbable = 1
w_class = ITEMSIZE_NORMAL
pressure_resistance = 5
flags = OPENCONTAINER
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 793df9dc436..fa6dec5715b 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -37,7 +37,8 @@
log_ooc("[mob.name]/[key] : [msg]")
- handle_spam_prevention(MUTE_OOC)
+ if(msg)
+ handle_spam_prevention(MUTE_OOC)
var/ooc_style = "everyone"
if(holder && !holder.fakekey)
@@ -107,7 +108,8 @@
log_ooc("(LOCAL) [mob.name]/[key] : [msg]")
- handle_spam_prevention(MUTE_OOC)
+ if(msg)
+ handle_spam_prevention(MUTE_OOC)
var/mob/source = mob.get_looc_source()
var/turf/T = get_turf(source)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index 90d9c9d275c..753094debaf 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -17,7 +17,8 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
adminhelped = 1 //Determines if they get the message to reply by clicking the name.
- handle_spam_prevention(MUTE_ADMINHELP)
+ if(msg)
+ handle_spam_prevention(MUTE_ADMINHELP)
//clean the input msg
if(!msg)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 29b61f15cb2..5628b8774fc 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -565,7 +565,7 @@
M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/plain/monocle(M), slot_glasses)
- M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit)
+ M.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/apron(M), slot_wear_suit)
M.equip_to_slot_or_del(new /obj/item/weapon/material/knife(M), slot_l_store)
M.equip_to_slot_or_del(new /obj/item/weapon/surgical/scalpel(M), slot_r_store)
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index c5eb60a94b2..9fcb8347741 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -10,10 +10,11 @@
if(!msg) return
if(usr.client)
- client.handle_spam_prevention(MUTE_PRAY)
- if(usr.client.prefs.muted & MUTE_PRAY)
- usr << "\red You cannot pray (muted)."
- return
+ if(msg)
+ client.handle_spam_prevention(MUTE_PRAY)
+ if(usr.client.prefs.muted & MUTE_PRAY)
+ usr << "\red You cannot pray (muted)."
+ return
var/image/cross = image('icons/obj/storage.dmi',"bible")
msg = "\blue \icon[cross] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC): [msg]"
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index 23b42457508..d991cd48250 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -32,7 +32,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
pref.age = sanitize_integer(pref.age, get_min_age(), get_max_age(), initial(pref.age))
pref.biological_gender = sanitize_inlist(pref.biological_gender, get_genders(), pick(get_genders()))
pref.identifying_gender = (pref.identifying_gender in all_genders_define_list) ? pref.identifying_gender : pref.biological_gender
- pref.real_name = sanitize_name(pref.real_name, pref.species)
+ pref.real_name = sanitize_name(pref.real_name, pref.species, is_FBP())
if(!pref.real_name)
pref.real_name = random_name(pref.identifying_gender, pref.species)
pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
@@ -76,7 +76,7 @@ datum/preferences/proc/set_biological_gender(var/gender)
if(href_list["rename"])
var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null
if (!isnull(raw_name) && CanUseTopic(user))
- var/new_name = sanitize_name(raw_name, pref.species)
+ var/new_name = sanitize_name(raw_name, pref.species, is_FBP())
if(new_name)
pref.real_name = new_name
return TOPIC_REFRESH
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index 3e239badc7a..e9ec0caf9dd 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -218,7 +218,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
++ind
if(ind > 1)
. += ", "
- . += "\tSynthetic [organ_name]"
+ switch(organ_name)
+ if ("brain")
+ . += "\tPositronic [organ_name]"
+ else
+ . += "\tSynthetic [organ_name]"
else if(status == "digital")
++ind
if(ind > 1)
@@ -607,15 +611,23 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
organ = O_LUNGS
if("Brain")
if(pref.organ_data[BP_HEAD] != "cyborg")
- user << "You may only select an assisted or synthetic brain if you have a full prosthetic body."
+ user << "You may only select a cybernetic or synthetic brain if you have a full prosthetic body."
return
organ = "brain"
- var/list/organ_choices = list("Normal","Assisted","Mechanical")
+ var/list/organ_choices = list("Normal")
if(pref.organ_data[BP_TORSO] == "cyborg")
organ_choices -= "Normal"
if(organ_name == "Brain")
- organ_choices += "Digital"
+ organ_choices += "Cybernetic"
+ organ_choices += "Positronic"
+ organ_choices += "Drone"
+ else
+ organ_choices += "Assisted"
+ organ_choices += "Mechanical"
+ else
+ organ_choices += "Assisted"
+ organ_choices += "Mechanical"
var/new_state = input(user, "What state do you wish the organ to be in?") as null|anything in organ_choices
if(!new_state) return
@@ -625,10 +637,15 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
pref.organ_data[organ] = null
if("Assisted")
pref.organ_data[organ] = "assisted"
- if("Mechanical")
+ if("Cybernetic")
+ pref.organ_data[organ] = "assisted"
+ if ("Mechanical")
pref.organ_data[organ] = "mechanical"
- if("Digital")
+ if("Drone")
pref.organ_data[organ] = "digital"
+ if("Positronic")
+ pref.organ_data[organ] = "mechanical"
+
return TOPIC_REFRESH
else if(href_list["disabilities"])
@@ -654,6 +671,11 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
while(null in pref.rlimb_data)
pref.rlimb_data -= null
+ // Sanitize the name so that there aren't any numbers sticking around.
+ pref.real_name = sanitize_name(pref.real_name, pref.species)
+ if(!pref.real_name)
+ pref.real_name = random_name(pref.identifying_gender, pref.species)
+
/datum/category_item/player_setup_item/general/body/proc/SetSpecies(mob/user)
if(!pref.species_preview || !(pref.species_preview in all_species))
pref.species_preview = "Human"
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm
index dc05e3035d5..bc22cbad241 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm
@@ -1,7 +1,7 @@
// Suit slot
/datum/gear/suit
display_name = "apron, blue"
- path = /obj/item/clothing/suit/apron
+ path = /obj/item/clothing/suit/storage/apron
slot = slot_wear_suit
sort_category = "Suits and Overwear"
cost = 2
@@ -158,7 +158,7 @@
/datum/gear/suit/overalls
display_name = "overalls"
- path = /obj/item/clothing/suit/apron/overalls
+ path = /obj/item/clothing/suit/storage/apron/overalls
cost = 1
/datum/gear/suit/poncho
diff --git a/code/modules/clothing/head/flowercrowns.dm b/code/modules/clothing/head/flowercrowns.dm
new file mode 100644
index 00000000000..6c6469de734
--- /dev/null
+++ b/code/modules/clothing/head/flowercrowns.dm
@@ -0,0 +1,56 @@
+/obj/item/clothing/head/woodcirclet
+ name = "wood circlet"
+ desc = "A small wood circlet for making a flower crown."
+ icon_state = "woodcirclet"
+ w_class = ITEMSIZE_SMALL
+ body_parts_covered = 0
+
+/obj/item/clothing/head/woodcirclet/attackby(obj/item/W as obj, mob/user as mob)
+ var/obj/item/complete
+ if(istype(W,/obj/item/seeds/poppyseed))
+ user << "You attach the poppy to the circlet and create a beautiful flower crown."
+ complete = new /obj/item/clothing/head/poppy_crown(get_turf(user))
+ user.drop_from_inventory(W)
+ user.drop_from_inventory(src)
+ qdel(W)
+ qdel(src)
+ user.put_in_hands(complete)
+ return
+ else if(istype(W,/obj/item/seeds/sunflowerseed))
+ user << "You attach the sunflower to the circlet and create a beautiful flower crown."
+ complete = new /obj/item/clothing/head/sunflower_crown(get_turf(user))
+ user.drop_from_inventory(W)
+ user.drop_from_inventory(src)
+ qdel(W)
+ qdel(src)
+ user.put_in_hands(complete)
+ return
+ else if(istype(W,/obj/item/seeds/lavenderseed))
+ user << "You attach the lavender to the circlet and create a beautiful flower crown."
+ complete = new /obj/item/clothing/head/lavender_crown(get_turf(user))
+ user.drop_from_inventory(W)
+ user.drop_from_inventory(src)
+ qdel(W)
+ qdel(src)
+ user.put_in_hands(complete)
+ return
+
+//Flower crowns
+
+/obj/item/clothing/head/sunflower_crown
+ name = "sunflower crown"
+ desc = "A flower crown weaved with sunflowers."
+ icon_state = "sunflower_crown"
+ body_parts_covered = 0
+
+/obj/item/clothing/head/lavender_crown
+ name = "lavender crown"
+ desc = "A flower crown weaved with lavender."
+ icon_state = "lavender_crown"
+ body_parts_covered = 0
+
+/obj/item/clothing/head/poppy_crown
+ name = "poppy crown"
+ desc = "A flower crown weaved with poppies."
+ icon_state = "poppy_crown"
+ body_parts_covered = 0
\ No newline at end of file
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index b044ba949a4..89dde52fbca 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -346,25 +346,4 @@
name = "sombrero"
desc = "A wide-brimmed hat popularly worn in Mexico."
icon_state = "sombrero"
- body_parts_covered = 0
-
-
-//Flower crowns
-
-/obj/item/clothing/head/sunflower_crown
- name = "sunflower crown"
- desc = "A flower crown weaved with sunflowers."
- icon_state = "sunflower_crown"
- body_parts_covered = 0
-
-/obj/item/clothing/head/lavender_crown
- name = "lavender crown"
- desc = "A flower crown weaved with lavender."
- icon_state = "lavender_crown"
- body_parts_covered = 0
-
-/obj/item/clothing/head/poppy_crown
- name = "poppy crown"
- desc = "A flower crown weaved with poppies."
- icon_state = "poppy_crown"
body_parts_covered = 0
\ No newline at end of file
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 6a3a8cb4384..c5de388c0f1 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -3,7 +3,7 @@
*/
//Botanist
-/obj/item/clothing/suit/apron
+/obj/item/clothing/suit/storage/apron
name = "apron"
desc = "A basic blue apron."
icon_state = "apron"
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 00ea3308928..4394d661955 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -120,7 +120,7 @@
name = "red sweatervest"
icon_state = "sweatervest_red"
*/
-/obj/item/clothing/suit/apron/overalls
+/obj/item/clothing/suit/storage/apron/overalls
name = "coveralls"
desc = "A set of denim overalls."
icon_state = "overalls"
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index e7c7d0ecd95..79e0ce03aec 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -120,7 +120,7 @@
/material/wood/generate_recipes()
..()
recipes += new/datum/stack_recipe("wooden sandals", /obj/item/clothing/shoes/sandal, 1)
- recipes += new/datum/stack_recipe("wood circlet", /obj/item/woodcirclet, 1)
+ recipes += new/datum/stack_recipe("wood circlet", /obj/item/clothing/head/woodcirclet, 1)
recipes += new/datum/stack_recipe("clipboard", /obj/item/weapon/clipboard, 1)
recipes += new/datum/stack_recipe("wood floor tile", /obj/item/stack/tile/wood, 1, 4, 20)
recipes += new/datum/stack_recipe("wooden chair", /obj/structure/bed/chair/wood, 3, time = 10, one_per_turf = 1, on_floor = 1)
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 4d348c8d715..45f4c11cdeb 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -7,10 +7,11 @@
log_say("Ghost/[src.key] : [message]")
if (src.client)
- client.handle_spam_prevention(MUTE_DEADCHAT)
- if(src.client.prefs.muted & MUTE_DEADCHAT)
- src << "\red You cannot talk in deadchat (muted)."
- return
+ if(message)
+ client.handle_spam_prevention(MUTE_DEADCHAT)
+ if(src.client.prefs.muted & MUTE_DEADCHAT)
+ src << "\red You cannot talk in deadchat (muted)."
+ return
. = src.say_dead(message)
@@ -27,10 +28,11 @@
log_emote("Ghost/[src.key] : [message]")
if(src.client)
- client.handle_spam_prevention(MUTE_DEADCHAT)
- if(src.client.prefs.muted & MUTE_DEADCHAT)
- src << "\red You cannot emote in deadchat (muted)."
- return
+ if(message)
+ client.handle_spam_prevention(MUTE_DEADCHAT)
+ if(src.client.prefs.muted & MUTE_DEADCHAT)
+ src << "\red You cannot emote in deadchat (muted)."
+ return
. = src.emote_dead(message)
diff --git a/code/modules/mob/language/monkey.dm b/code/modules/mob/language/monkey.dm
index ce276a358ab..c6024d346b7 100644
--- a/code/modules/mob/language/monkey.dm
+++ b/code/modules/mob/language/monkey.dm
@@ -5,18 +5,70 @@
ask_verb = "chimpers"
exclaim_verb = "screeches"
key = "6"
+ machine_understands = 0
/datum/language/skrell/monkey
name = "Neaera"
desc = "Squik squik squik."
key = "8"
+ machine_understands = 0
/datum/language/unathi/monkey
name = "Stok"
desc = "Hiss hiss hiss."
key = "7"
+ machine_understands = 0
/datum/language/tajaran/monkey
name = "Farwa"
desc = "Meow meow meow."
key = "9"
+ machine_understands = 0
+
+/datum/language/corgi
+ name = "Dog"
+ desc = "Woof woof woof."
+ speech_verb = "barks"
+ ask_verb = "woofs"
+ exclaim_verb = "howls"
+ key = "n"
+ flags = RESTRICTED
+ machine_understands = 0
+ space_chance = 100
+ syllables = list("bark", "woof", "bowwow", "yap", "arf")
+
+/datum/language/cat
+ name = "Cat"
+ desc = "Meow meow meow."
+ speech_verb = "meows"
+ ask_verb = "mrowls"
+ exclaim_verb = "yowls"
+ key = "c"
+ flags = RESTRICTED
+ machine_understands = 0
+ space_chance = 100
+ syllables = list("meow", "mrowl", "purr", "meow", "meow", "meow")
+
+/datum/language/mouse
+ name = "Mouse"
+ desc = "Squeak squeak. *Nibbles on cheese*"
+ speech_verb = "squeaks"
+ ask_verb = "squeaks"
+ exclaim_verb = "squeaks"
+ key = "m"
+ flags = RESTRICTED
+ machine_understands = 0
+ space_chance = 100
+ syllables = list("squeak") // , "gripes", "oi", "meow")
+
+/datum/language/bird
+ name = "Bird"
+ desc = "Chirp chirp, give me food"
+ speech_verb = "chirps"
+ ask_verb = "tweets"
+ exclaim_verb = "squawks"
+ key = "m"
+ flags = RESTRICTED
+ machine_understands = 0
+ space_chance = 100
+ syllables = list("chirp", "squawk", "tweet")
\ No newline at end of file
diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm
index 8c174a2ff74..3e85f4efece 100644
--- a/code/modules/mob/language/outsider.dm
+++ b/code/modules/mob/language/outsider.dm
@@ -4,6 +4,7 @@
speech_verb = "says"
colour = "changeling"
key = "g"
+ machine_understands = 0
flags = RESTRICTED | HIVEMIND
/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
@@ -21,6 +22,7 @@
exclaim_verb = "sings"
colour = "alien"
key = "x"
+ machine_understands = 0
flags = RESTRICTED | HIVEMIND
/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
@@ -80,4 +82,5 @@
exclaim_verb = "chants"
colour = "cult"
key = "y"
+ machine_understands = 0
flags = RESTRICTED | HIVEMIND
diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm
index 8e2f2987c9e..85942fcb4e9 100644
--- a/code/modules/mob/language/station.dm
+++ b/code/modules/mob/language/station.dm
@@ -6,6 +6,7 @@
exclaim_verb = "rustles"
colour = "soghun"
key = "q"
+ machine_understands = 0
flags = RESTRICTED
syllables = list("hs","zt","kr","st","sh")
@@ -18,6 +19,7 @@
name = LANGUAGE_ROOTGLOBAL
desc = "A complex language known instinctively by Dionaea, 'spoken' by emitting modulated radio waves. This version uses low frequency waves for slow communication at long ranges."
key = "w"
+ machine_understands = 0
flags = RESTRICTED | HIVEMIND
/datum/language/unathi
diff --git a/code/modules/mob/language/synthetic.dm b/code/modules/mob/language/synthetic.dm
index 2a2ddb0ff97..36dd57bc692 100644
--- a/code/modules/mob/language/synthetic.dm
+++ b/code/modules/mob/language/synthetic.dm
@@ -6,6 +6,7 @@
ask_verb = "queries"
exclaim_verb = "declares"
key = "b"
+ machine_understands = 0
flags = RESTRICTED | HIVEMIND
var/drone_only
@@ -64,5 +65,6 @@
exclaim_verb = "transmits"
colour = "say_quote"
key = "d"
+ machine_understands = 0
flags = RESTRICTED | HIVEMIND
drone_only = 1
diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm
index 01005b031b9..5c895d43ae0 100644
--- a/code/modules/mob/living/carbon/human/human_attackhand.dm
+++ b/code/modules/mob/living/carbon/human/human_attackhand.dm
@@ -22,7 +22,7 @@
// Should this all be in Touch()?
if(istype(H))
- if(get_accuracy_penalty(H)) //Should only trigger if they're not aiming well
+ if(get_accuracy_penalty(H) && H != src) //Should only trigger if they're not aiming well
var/hit_zone = get_zone_with_miss_chance(H.zone_sel.selecting, src, get_accuracy_penalty(H))
if(!hit_zone)
H.do_attack_animation(src)
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index fe6381c6db9..2ffec342883 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -2,6 +2,8 @@
var/tally = 0
+ var/item_tally = 0
+
if(species.slowdown)
tally = species.slowdown
@@ -33,7 +35,7 @@
tally += 1.5
else
if(shoes)
- tally += shoes.slowdown
+ item_tally += shoes.slowdown
for(var/organ_name in list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/E = get_organ(organ_name)
@@ -50,36 +52,40 @@
if(FAT in src.mutations)
tally += 1.5
- if (bodytemperature < 283.222)
- tally += (283.222 - bodytemperature) / 10 * 1.75
+
+ if (bodytemperature < species.cold_level_1)
+ tally += (species.cold_level_1 - bodytemperature) / 10 * 1.75
tally += max(2 * stance_damage, 0) //damaged/missing feet or legs is slow
if(mRun in mutations)
tally = 0
- if(species.slowdown_fixed)
- return (tally+config.human_delay)
-
// Loop through some slots, and add up their slowdowns. Shoes are handled below, unfortunately.
// Includes slots which can provide armor, the back slot, and suit storage.
- for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store) )
- tally += I.slowdown
+ for(var/obj/item/I in list(wear_suit, w_uniform, back, gloves, head, s_store))
+ item_tally += I.slowdown
// Hands are also included, to make the 'take off your armor instantly and carry it with you to go faster' trick no longer viable.
// This is done seperately to disallow negative numbers.
for(var/obj/item/I in list(r_hand, l_hand) )
- tally += max(I.slowdown, 0)
+ item_tally += max(I.slowdown, 0)
// Dragging heavy objects will also slow you down, similar to above.
if(pulling && istype(pulling, /obj/item))
var/obj/item/pulled = pulling
- tally += max(pulled.slowdown, 0)
+ item_tally += max(pulled.slowdown, 0)
var/turf/T = get_turf(src)
if(T && T.movement_cost)
tally += T.movement_cost
+ if(species.item_slowdown_halved)
+ if(item_tally > 0)
+ item_tally *= 0.5
+
+ tally += item_tally
+
if(CE_SPEEDBOOST in chem_effects)
if (tally >= 0) // cut any penalties in half
tally = tally/2
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 7ecf8cd8eff..3c841f30daf 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -352,13 +352,6 @@
if(!L.is_bruised() && prob(8))
rupture_lung()
- if(should_have_organ("brain"))
- var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
- if(CE_STABLE in chem_effects)
- brainOxPercent = 0.01 //Halved in effect
- if(prob(5))
- adjustBrainLoss(brainOxPercent * oxyloss)
-
oxygen_alert = max(oxygen_alert, 1)
return 0
@@ -377,8 +370,9 @@
safe_pressure_min *= 1.25
else if(breath)
if(breath.total_moles < BREATH_MOLES / 10 || breath.total_moles > BREATH_MOLES * 5)
- if (prob(8))
- rupture_lung()
+ if(is_below_sound_pressure(get_turf(src))) //No more popped lungs from choking/drowning
+ if (prob(8))
+ rupture_lung()
var/safe_exhaled_max = 10
var/safe_toxins_max = 0.2
@@ -925,6 +919,14 @@
for(var/atom/a in hallucinations)
qdel(a)
+ //Brain damage from Oxyloss
+ if(should_have_organ("brain"))
+ var/brainOxPercent = 0.02 //Default2% of your current oxyloss is applied as brain damage, 50 oxyloss is 1 brain damage
+ if(CE_STABLE in chem_effects)
+ brainOxPercent = 0.01 //Halved in effect
+ if(oxyloss >= 20 && prob(5))
+ adjustBrainLoss(brainOxPercent * oxyloss)
+
if(halloss >= species.total_health)
src << "You're in too much pain to keep going..."
src.visible_message("[src] slumps to the ground, too weak to continue fighting.")
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index ff16d332fee..8a8650aa9ba 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -133,7 +133,7 @@
var/appearance_flags = 0 // Appearance/display related features.
var/spawn_flags = 0 // Flags that specify who can spawn as this species
var/slowdown = 0 // Passive movement speed malus (or boost, if negative)
- var/slowdown_fixed = 0 // If this is on, they're not affected by object related slowdown (positive or negative)
+ var/item_slowdown_halved = 0 // If this is on, they're not as affected by item weights for slowdown
var/primitive_form // Lesser form, if any (ie. monkey for humans)
var/greater_form // Greater form, if any, ie. human for monkeys.
var/holder_type
@@ -194,8 +194,8 @@
inherent_verbs = list()
inherent_verbs |= /mob/living/carbon/human/proc/regurgitate
-/datum/species/proc/sanitize_name(var/name)
- return sanitizeName(name)
+/datum/species/proc/sanitize_name(var/name, var/robot = 0)
+ return sanitizeName(name, MAX_NAME_LEN, robot)
/datum/species/proc/equip_survival_gear(var/mob/living/carbon/human/H,var/extendedtank = 1)
var/boxtype = /obj/item/weapon/storage/box/survival //Default survival box
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index dfe57c55b2d..ab55807be8d 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -770,11 +770,6 @@ default behaviour is:
if(buckled.buckle_movable)
anchored = 0
canmove = 1
-
- else if(captured)
- anchored = 1
- canmove = 0
- lying = 0
else
lying = incapacitated(INCAPACITATION_KNOCKDOWN)
canmove = !incapacitated(INCAPACITATION_DISABLED)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index fd4f706b153..1aef4eca81e 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -133,10 +133,11 @@ proc/get_radio_key_from_channel(var/channel)
/mob/living/say(var/message, var/datum/language/speaking = null, var/verb="says", var/alt_name="", var/whispering = 0)
//If you're muted for IC chat
if(client)
- client.handle_spam_prevention(MUTE_IC)
- if((client.prefs.muted & MUTE_IC) || say_disabled)
- src << "You cannot speak in IC (Muted)."
- return
+ if(message)
+ client.handle_spam_prevention(MUTE_IC)
+ if((client.prefs.muted & MUTE_IC) || say_disabled)
+ src << "You cannot speak in IC (Muted)."
+ return
//Redirect to say_dead if talker is dead
if(stat)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
index adb40102f13..26e1b264fda 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm
@@ -114,7 +114,7 @@
return
var/deathtime = world.time - src.timeofdeath
- var/deathtimeminutes = round(deathtime / 300)
+ var/deathtimeminutes = round(deathtime / 600)
var/pluralcheck = "minute"
if(deathtimeminutes == 0)
pluralcheck = ""
@@ -122,11 +122,11 @@
pluralcheck = " [deathtimeminutes] minute and"
else if(deathtimeminutes > 1)
pluralcheck = " [deathtimeminutes] minutes and"
- var/deathtimeseconds = round((deathtime - deathtimeminutes * 300) / 10,1)
+ var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
- if (deathtime < 3000)
+ if (deathtime < 6000)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
- usr << "You must wait 5 minutes to respawn as a drone!"
+ usr << "You must wait 10 minutes to respawn as a drone!"
return
var/list/all_fabricators = list()
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index ccfd19e8aa7..795e535ebfd 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -18,7 +18,7 @@ var/global/list/robot_modules = list(
icon = 'icons/obj/module.dmi'
icon_state = "std_module"
w_class = ITEMSIZE_NO_CONTAINER
- item_state = "electronic"
+ item_state = "std_mod"
flags = CONDUCT
var/hide_on_manifest = 0
var/channels = list()
diff --git a/code/modules/mob/living/simple_animal/animals/bat.dm b/code/modules/mob/living/simple_animal/animals/bat.dm
index d7ed8e5f403..1d722c0b8a6 100644
--- a/code/modules/mob/living/simple_animal/animals/bat.dm
+++ b/code/modules/mob/living/simple_animal/animals/bat.dm
@@ -36,6 +36,8 @@
max_n2 = 0
minbodytemp = 0
+ has_langs = list("Mouse")
+
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/mob/living/owner
diff --git a/code/modules/mob/living/simple_animal/animals/cat.dm b/code/modules/mob/living/simple_animal/animals/cat.dm
index 808ebdb8fa6..9b3df512470 100644
--- a/code/modules/mob/living/simple_animal/animals/cat.dm
+++ b/code/modules/mob/living/simple_animal/animals/cat.dm
@@ -27,6 +27,7 @@
holder_type = /obj/item/weapon/holder/cat
mob_size = MOB_SMALL
+ has_langs = list("Cat")
speak_chance = 1
speak = list("Meow!","Esp!","Purr!","HSSSSS")
speak_emote = list("purrs", "meows")
diff --git a/code/modules/mob/living/simple_animal/animals/corgi.dm b/code/modules/mob/living/simple_animal/animals/corgi.dm
index 8f4adf8e540..11b2302aaa4 100644
--- a/code/modules/mob/living/simple_animal/animals/corgi.dm
+++ b/code/modules/mob/living/simple_animal/animals/corgi.dm
@@ -17,6 +17,7 @@
see_in_dark = 5
mob_size = 8
+ has_langs = list("Dog")
speak_chance = 1
speak = list("YAP", "Woof!", "Bark!", "AUUUUUU")
speak_emote = list("barks", "woofs")
diff --git a/code/modules/mob/living/simple_animal/animals/farm_animals.dm b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
index fc21fbddfde..e65654cdadd 100644
--- a/code/modules/mob/living/simple_animal/animals/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/animals/farm_animals.dm
@@ -167,6 +167,7 @@
response_harm = "kicks"
attacktext = "kicked"
+ has_langs = list("Bird")
speak_chance = 2
speak = list("Cherp.","Cherp?","Chirrup.","Cheep!")
speak_emote = list("cheeps")
@@ -213,6 +214,7 @@ var/global/chicken_count = 0
response_harm = "kicks"
attacktext = "kicked"
+ has_langs = list("Bird")
speak_chance = 2
speak = list("Cluck!","BWAAAAARK BWAK BWAK BWAK!","Bwaak bwak.")
speak_emote = list("clucks","croons")
diff --git a/code/modules/mob/living/simple_animal/animals/fish.dm b/code/modules/mob/living/simple_animal/animals/fish.dm
index 88e0dc2e298..b2778d3c338 100644
--- a/code/modules/mob/living/simple_animal/animals/fish.dm
+++ b/code/modules/mob/living/simple_animal/animals/fish.dm
@@ -3,7 +3,7 @@
name = "fish"
desc = "Its a fishy. No touchy fishy."
icon = 'icons/mob/fish.dmi'
- meat_type = /obj/item/weapon/reagent_containers/food/snacks
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
// By defautl they can be in any water turf. Subtypes might restrict to deep/shallow etc
var/global/list/suitable_turf_types = list(
diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm
index 217ea0b0246..ded7c5214a2 100644
--- a/code/modules/mob/living/simple_animal/animals/goose.dm
+++ b/code/modules/mob/living/simple_animal/animals/goose.dm
@@ -35,6 +35,7 @@
max_n2 = 0
minbodytemp = 0
+ has_langs = list("Bird")
speak_chance = 10
speak = list("HONK!")
emote_hear = list("honks loudly!")
diff --git a/code/modules/mob/living/simple_animal/animals/mouse.dm b/code/modules/mob/living/simple_animal/animals/mouse.dm
index 43b12961bd6..cb06aecb7ee 100644
--- a/code/modules/mob/living/simple_animal/animals/mouse.dm
+++ b/code/modules/mob/living/simple_animal/animals/mouse.dm
@@ -29,6 +29,7 @@
minbodytemp = 223 //Below -50 Degrees Celcius
maxbodytemp = 323 //Above 50 Degrees Celcius
+ has_langs = list("Mouse")
speak_chance = 1
speak = list("Squeek!","SQUEEK!","Squeek?")
speak_emote = list("squeeks","squeeks","squiks")
diff --git a/code/modules/mob/living/simple_animal/animals/parrot.dm b/code/modules/mob/living/simple_animal/animals/parrot.dm
index 03f0261688d..0f0fcb3a6bb 100644
--- a/code/modules/mob/living/simple_animal/animals/parrot.dm
+++ b/code/modules/mob/living/simple_animal/animals/parrot.dm
@@ -46,6 +46,7 @@
stop_automated_movement = 1
universal_speak = 1
+ has_langs = list("Bird")
speak_chance = 2
speak = list("Hi","Hello!","Cracker?","BAWWWWK george mellons griffing me")
speak_emote = list("squawks","says","yells")
diff --git a/code/modules/mob/living/simple_animal/animals/penguin.dm b/code/modules/mob/living/simple_animal/animals/penguin.dm
index 40c085a72f7..90074edef59 100644
--- a/code/modules/mob/living/simple_animal/animals/penguin.dm
+++ b/code/modules/mob/living/simple_animal/animals/penguin.dm
@@ -20,6 +20,7 @@
melee_damage_upper = 15
attacktext = "pecked"
+ has_langs = list("Bird")
speak_chance = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 1179dc889f2..af20f042019 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -271,21 +271,31 @@
update_icon()
ai_log("Life() - stance=[stance] ai_inactive=[ai_inactive]", 4)
- //Movement
- if(!ai_inactive && !stop_automated_movement && wander && !anchored) //Allowed to move?
- handle_wander_movement()
- //Speaking
- if(!ai_inactive && speak_chance && stance == STANCE_IDLE) // Allowed to chatter?
- handle_idle_speaking()
-
- //Stanceyness
+ //AI Actions
if(!ai_inactive)
+ //Stanceyness
handle_stance()
- //Resisting out of things
- if(!ai_inactive && incapacitated(INCAPACITATION_DEFAULT) && stance != STANCE_IDLE)
- resist()
+ //Movement
+ if(!stop_automated_movement && wander && !anchored) //Allowed to move?
+ handle_wander_movement()
+
+ //Speaking
+ if(speak_chance && stance == STANCE_IDLE) // Allowed to chatter?
+ handle_idle_speaking()
+
+ //Resisting out buckles
+ if(stance != STANCE_IDLE && incapacitated(INCAPACITATION_BUCKLED_PARTIALLY))
+ resist()
+
+ //Resisting out of closets
+ if(istype(loc,/obj/structure/closet))
+ var/obj/structure/closet/C = loc
+ if(C.welded)
+ resist()
+ else
+ C.open()
return 1
@@ -807,12 +817,17 @@
//Someone wants help?
/mob/living/simple_animal/proc/HelpRequested(var/mob/living/simple_animal/F)
- if(!(stance == STANCE_IDLE) || stat)
+ if(target_mob || stat)
ai_log("HelpRequested() by [F] but we're busy/dead",2)
return
if(get_dist(src,F) <= follow_dist)
ai_log("HelpRequested() by [F] but we're already here",2)
return
+ if(get_dist(src,F) <= view_range)
+ ai_log("HelpRequested() by [F] and within targetshare range",2)
+ if(F.target_mob && set_target(F.target_mob))
+ handle_stance(STANCE_ATTACK)
+ return
if(set_follow(F, 10 SECONDS))
handle_stance(STANCE_FOLLOW)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index f27a73f4040..57ad0859e13 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -362,7 +362,7 @@
var/deathtimeseconds = round((deathtime - deathtimeminutes * 600) / 10,1)
usr << "You have been dead for[pluralcheck] [deathtimeseconds] seconds."
- if (deathtime < (5 * 600))
+ if ((deathtime < (5 * 600)) && (ticker && ticker.current_state > GAME_STATE_PREGAME))
usr << "You must wait 5 minutes to respawn!"
return
else
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 6a5e39e961f..1901902c80d 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -153,7 +153,6 @@
var/voice_name = "unidentifiable voice"
var/faction = "neutral" //Used for checking whether hostile simple animals will attack you, possibly more stuff later
- var/captured = 0 //Functionally, should give the same effect as being buckled into a chair when true. Only used by energy nets, TODO replace with buckling
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
var/proc_holder_list[] = list()//Right now unused.
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index bbddd4c07bd..a2be896de01 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -322,7 +322,7 @@
if(hit_zone == O_EYES)
attack_eye(affecting, assailant)
else if(hit_zone == BP_HEAD)
- headbut(affecting, assailant)
+ headbutt(affecting, assailant)
else
dislocate(affecting, assailant, hit_zone)
diff --git a/code/modules/mob/mob_grab_specials.dm b/code/modules/mob/mob_grab_specials.dm
index 735d35fe7c3..82dae6e1350 100644
--- a/code/modules/mob/mob_grab_specials.dm
+++ b/code/modules/mob/mob_grab_specials.dm
@@ -88,7 +88,7 @@
attack.handle_eye_attack(attacker, target)
-/obj/item/weapon/grab/proc/headbut(mob/living/carbon/human/target, mob/living/carbon/human/attacker)
+/obj/item/weapon/grab/proc/headbutt(mob/living/carbon/human/target, mob/living/carbon/human/attacker)
if(!istype(attacker))
return
if(target.lying)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index e58c639b648..7eee7bccd04 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -1025,9 +1025,13 @@
icon_state = "tat_campbell"
body_parts = list(BP_R_ARM)
+ left
+ name = "Tattoo (Campbell, L.Arm)"
+ body_parts = list(BP_L_ARM)
+
tat_tiger
name = "Tattoo (Tiger Stripes, Body)"
- icon_state = "tat_campbell"
+ icon_state = "tat_tiger"
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN)
taj_paw_socks
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index e3fabe82f55..4034346fdd1 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -1127,7 +1127,7 @@ Note that amputating the affected organ does in fact remove the infection from t
return !(status & (ORGAN_MUTATED|ORGAN_DEAD))
/obj/item/organ/external/proc/is_malfunctioning()
- return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 10 && prob(brute_dam + burn_dam))
+ return ((robotic >= ORGAN_ROBOT) && (brute_dam + burn_dam) >= 25 && prob(brute_dam + burn_dam))
/obj/item/organ/external/proc/embed(var/obj/item/weapon/W, var/silent = 0)
if(!owner || loc != owner)
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index ef73f3c031d..c58bd2f1662 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -5,9 +5,6 @@
/obj/item/weapon/cell/New()
..()
charge = maxcharge
-
-/obj/item/weapon/cell/initialize()
- ..()
update_icon()
/obj/item/weapon/cell/drain_power(var/drain_check, var/surge, var/power = 0)
diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm
index ace4cb1fb8c..add0170643d 100644
--- a/code/modules/projectiles/ammunition/bullets.dm
+++ b/code/modules/projectiles/ammunition/bullets.dm
@@ -31,6 +31,10 @@
projectile_type = /obj/item/projectile/ion/small
matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100)
+/*
+ * 9mm
+ */
+
/obj/item/ammo_casing/c9mm
desc = "A 9mm bullet casing."
caliber = "9mm"
@@ -65,6 +69,10 @@
projectile_type = /obj/item/projectile/bullet/pistol/ap
*/
+/*
+ * 45 ammo
+ */
+
/obj/item/ammo_casing/c45
desc = "A .45 bullet casing."
caliber = ".45"
@@ -101,6 +109,15 @@
icon_state = "empcasing"
matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100)
+/obj/item/ammo_casing/c45/hp
+ desc = "A .45 hollow-point bullet casing."
+ projectile_type = /obj/item/projectile/bullet/pistol/medium/hollow
+
+
+/*
+ * 10mm
+ */
+
/obj/item/ammo_casing/a10mm
desc = "A 10mm bullet casing."
caliber = "10mm"
@@ -113,6 +130,10 @@
icon_state = "empcasing"
matter = list(DEFAULT_WALL_MATERIAL = 130, "uranium" = 100)
+/*
+ * Shotguns
+ */
+
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12 gauge slug."
@@ -178,6 +199,10 @@
// projectile_type = /obj/item/projectile/bullet/shotgun/ion
matter = list(DEFAULT_WALL_MATERIAL = 360, "uranium" = 240)
+/*
+ * 762mm
+ */
+
/obj/item/ammo_casing/a762
desc = "A 7.62mm bullet casing."
caliber = "a762"
@@ -199,6 +224,12 @@
projectile_type = /obj/item/projectile/bullet/blank
matter = list(DEFAULT_WALL_MATERIAL = 90)
+/obj/item/ammo_casing/a762/hp
+ desc = "A 7.62mm hollow-point bullet casing."
+ projectile_type = /obj/item/projectile/bullet/rifle/a762/hollow
+
+//145mm
+
/obj/item/ammo_casing/a145
desc = "A 14.5mm shell."
icon_state = "lcasing"
@@ -206,6 +237,10 @@
projectile_type = /obj/item/projectile/bullet/rifle/a145
matter = list(DEFAULT_WALL_MATERIAL = 1250)
+/*
+ * 556mm
+ */
+
/obj/item/ammo_casing/a556
desc = "A 5.56mm bullet casing."
caliber = "a556"
@@ -222,6 +257,14 @@
icon_state = "rifle-casing" // Need to make an icon for these
projectile_type = /obj/item/projectile/bullet/rifle/practice
+/obj/item/ammo_casing/a556/hp
+ desc = "A 5.56mm hollow-point bullet casing."
+ projectile_type = /obj/item/projectile/bullet/rifle/a556/hollow
+
+/*
+ * Misc
+ */
+
/obj/item/ammo_casing/rocket
name = "rocket shell"
desc = "A high explosive designed to be fired from a launcher."
diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm
index 71d5d12d2ee..ba6a749ebee 100644
--- a/code/modules/projectiles/effects.dm
+++ b/code/modules/projectiles/effects.dm
@@ -225,9 +225,32 @@
light_power = 0.5
light_color = "#00C6FF"
+//----------------------------
+// Dark matter stun
+//----------------------------
+
+/obj/effect/projectile/darkmatterstun/tracer
+ icon_state = "darkt"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#8837A3"
+
+/obj/effect/projectile/darkmatterstun/muzzle
+ icon_state = "muzzle_darkt"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#8837A3"
+
+/obj/effect/projectile/darkmatterstun/impact
+ icon_state = "impact_darkt"
+ light_range = 2
+ light_power = 0.5
+ light_color = "#8837A3"
+
//----------------------------
// Dark matter
//----------------------------
+
/obj/effect/projectile/darkmatter/tracer
icon_state = "darkb"
light_range = 2
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 1e95f4a213f..e7d31c0226f 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -114,4 +114,93 @@
recoil = 2 // ow my fucking hand
accuracy = -1 // smooth bore + short barrel = shit accuracy
ammo_type = /obj/item/ammo_casing/shotgun
- // ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it.
\ No newline at end of file
+ // ToDo: Remove accuracy debuf in exchange for slightly injuring your hand every time you fire it.
+
+/obj/item/weapon/gun/projectile/revolver/lemat
+ name = "LeMat Revolver"
+ desc = "The LeMat Revolver is a 9 shot revolver with a secondary firing barrel loading shotgun shells. For when you really need something dead."
+ icon_state = "lemat"
+ item_state = "revolver"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
+ handle_casings = CYCLE_CASINGS
+ max_shells = 9
+ caliber = "38"
+ ammo_type = /obj/item/ammo_casing/c38
+ var/secondary_max_shells = 1
+ var/secondary_caliber = "shotgun"
+ var/secondary_ammo_type = /obj/item/ammo_casing/shotgun
+ var/flipped_firing = 0
+ var/list/secondary_loaded = list()
+ var/list/tertiary_loaded = list()
+
+
+/obj/item/weapon/gun/projectile/revolver/lemat/New()
+ for(var/i in 1 to secondary_max_shells)
+ secondary_loaded += new secondary_ammo_type(src)
+ ..()
+
+/obj/item/weapon/gun/projectile/revolver/lemat/verb/swap_firingmode()
+ set name = "Swap Firing Mode"
+ set category = "Object"
+ set desc = "Click to swap from one method of firing to another."
+
+ var/mob/living/carbon/human/M = usr
+ if(!M.mind)
+ return 0
+
+ to_chat(M, "You change the firing mode on \the [src].")
+ if(!flipped_firing)
+ if(max_shells && secondary_max_shells)
+ max_shells = secondary_max_shells
+
+ if(caliber && secondary_caliber)
+ caliber = secondary_caliber
+
+ if(ammo_type && secondary_ammo_type)
+ ammo_type = secondary_ammo_type
+
+ if(secondary_loaded)
+ tertiary_loaded = loaded.Copy()
+ loaded = secondary_loaded
+
+ flipped_firing = 1
+
+ else
+ if(max_shells)
+ max_shells = initial(max_shells)
+
+ if(caliber && secondary_caliber)
+ caliber = initial(caliber)
+
+ if(ammo_type && secondary_ammo_type)
+ ammo_type = initial(ammo_type)
+
+ if(tertiary_loaded)
+ secondary_loaded = loaded.Copy()
+ loaded = tertiary_loaded
+
+ flipped_firing = 0
+
+/obj/item/weapon/gun/projectile/revolver/lemat/spin_cylinder()
+ set name = "Spin cylinder"
+ set desc = "Fun when you're bored out of your skull."
+ set category = "Object"
+
+ chamber_offset = 0
+ visible_message("\The [usr] spins the cylinder of \the [src]!", \
+ "You hear something metallic spin and click.")
+ playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1)
+ if(!flipped_firing)
+ loaded = shuffle(loaded)
+ if(rand(1,max_shells) > loaded.len)
+ chamber_offset = rand(0,max_shells - loaded.len)
+
+/obj/item/weapon/gun/projectile/revolver/lemat/examine(mob/user)
+ ..()
+ if(secondary_loaded)
+ var/to_print
+ for(var/round in secondary_loaded)
+ to_print += round
+ to_chat(user, "\The [src] has a secondary barrel loaded with \a [to_print]")
+ else
+ to_chat(user, "\The [src] has a secondary barrel that is empty.")
diff --git a/code/modules/projectiles/guns/vox.dm b/code/modules/projectiles/guns/vox.dm
index 857b56fa6b7..d3a846ab08f 100644
--- a/code/modules/projectiles/guns/vox.dm
+++ b/code/modules/projectiles/guns/vox.dm
@@ -58,16 +58,30 @@
item_state = "darkcannon"
fire_sound = 'sound/weapons/eLuger.ogg'
w_class = ITEMSIZE_HUGE
- charge_cost = 600
- projectile_type = /obj/item/projectile/beam/darkmatter
+ charge_cost = 300
+ projectile_type = /obj/item/projectile/beam/stun/darkmatter
self_recharge = 1
accuracy = 2
firemodes = list(
+ list(mode_name="stunning", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/stun/darkmatter, charge_cost = 300),
list(mode_name="focused", burst=1, fire_delay=null, move_delay=null, burst_accuracy=list(2), dispersion=null, projectile_type=/obj/item/projectile/beam/darkmatter, charge_cost = 600),
list(mode_name="scatter burst", burst=8, fire_delay=null, move_delay=4, burst_accuracy=list(0, 0, 0, 0, 0, 0, 0, 0), dispersion=list(3, 3, 3, 3, 3, 3, 3, 3, 3), projectile_type=/obj/item/projectile/energy/darkmatter, charge_cost = 300),
)
+/obj/item/projectile/beam/stun/darkmatter
+ name = "dark matter wave"
+ icon_state = "darkt"
+ nodamage = 1
+ taser_effect = 1
+ agony = 55
+ damage_type = HALLOSS
+ light_color = "#8837A3"
+
+ muzzle_type = /obj/effect/projectile/darkmatterstun/muzzle
+ tracer_type = /obj/effect/projectile/darkmatterstun/tracer
+ impact_type = /obj/effect/projectile/darkmatterstun/impact
+
/obj/item/projectile/beam/darkmatter
name = "dark matter bolt"
icon_state = "darkb"
@@ -107,33 +121,29 @@
self_recharge = 1
charge_cost = 600
- projectile_type=/obj/item/projectile/sonic/strong
+ projectile_type=/obj/item/projectile/sonic/weak
firemodes = list(
+ list(mode_name="suppressive", projectile_type=/obj/item/projectile/sonic/weak, charge_cost = 200),
list(mode_name="normal", projectile_type=/obj/item/projectile/sonic/strong, charge_cost = 600),
- list(mode_name="suppressive", projectile_type=/obj/item/projectile/sonic/weak, charge_cost = 300),
)
/obj/item/projectile/sonic
name = "sonic pulse"
icon_state = "sound"
- damage = 15
+ damage = 5
armor_penetration = 30
damage_type = BRUTE
check_armour = "melee"
embed_chance = 0
vacuum_traversal = 0
-// var/amplitude = 10 //Roughly how loud it is, changes the way damage will work, and such
-
/obj/item/projectile/sonic/weak
- agony = 30
+ agony = 50
/obj/item/projectile/sonic/strong
damage = 45
-//Already have thoughts on how to improve this, will take a day or two after initial testing. - Anewbe
-
/obj/item/projectile/sonic/strong/on_hit(var/atom/movable/target, var/blocked = 0)
if(ismob(target))
var/throwdir = get_dir(firer,target)
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index f87f726bf3e..cf62d9e0c8c 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -137,6 +137,10 @@
damage = 20
armor_penetration = 15
+/obj/item/projectile/bullet/pistol/medium/hollow
+ damage = 30
+ armor_penetration = -50
+
/obj/item/projectile/bullet/pistol/strong //revolvers and matebas
damage = 60
@@ -200,6 +204,11 @@
damage = 20
armor_penetration = 50 // At 40 or more armor, this will do more damage than standard rounds.
+/obj/item/projectile/bullet/rifle/a762/hollow
+ damage = 35
+ armor_penetration = -50
+ penetrating = 0
+
/obj/item/projectile/bullet/rifle/a556
damage = 35
@@ -207,6 +216,11 @@
damage = 30
armor_penetration = 50 // At 30 or more armor, this will do more damage than standard rounds.
+/obj/item/projectile/bullet/rifle/a556/hollow
+ damage = 40
+ armor_penetration = -50
+ penetrating = 0
+
/obj/item/projectile/bullet/rifle/a145
damage = 80
stun = 3
diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm
index a0a6a89cb29..41ad4cb5c6c 100644
--- a/code/modules/reagents/Chemistry-Recipes.dm
+++ b/code/modules/reagents/Chemistry-Recipes.dm
@@ -164,7 +164,7 @@
name = "Carthatoline"
id = "carthatoline"
result = "carthatoline"
- required_reagents = list("dylovene" = 1, "carbon" = 2, "phoron" = 0.1)
+ required_reagents = list("anti_toxin" = 1, "carbon" = 2, "phoron" = 0.1)
catalysts = list("phoron" = 1)
result_amount = 2
@@ -1840,4 +1840,4 @@
id = "berrytea"
result = "berrytea"
required_reagents = list("tea" = 5, "berryjuice" = 1)
- result_amount = 6
\ No newline at end of file
+ result_amount = 6
diff --git a/html/changelogs/Anewbe - Aprons.yml b/html/changelogs/Anewbe - Aprons.yml
new file mode 100644
index 00000000000..ac1be695365
--- /dev/null
+++ b/html/changelogs/Anewbe - Aprons.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Aprons now have pockets."
diff --git a/html/changelogs/Anewbe - Automute.yml b/html/changelogs/Anewbe - Automute.yml
new file mode 100644
index 00000000000..6ff50860373
--- /dev/null
+++ b/html/changelogs/Anewbe - Automute.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - bugfix: "Automute shouldn't trigger if you don't type anything."
\ No newline at end of file
diff --git a/html/changelogs/Anewbe - Chief of Security.yml b/html/changelogs/Anewbe - Chief of Security.yml
new file mode 100644
index 00000000000..3ca2a8c8fd1
--- /dev/null
+++ b/html/changelogs/Anewbe - Chief of Security.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Adds the Chief of Security alt title for the HoS."
diff --git a/html/changelogs/Anewbe - Flowercrowns.yml b/html/changelogs/Anewbe - Flowercrowns.yml
new file mode 100644
index 00000000000..fee55236d53
--- /dev/null
+++ b/html/changelogs/Anewbe - Flowercrowns.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Wooden circlets can now be worn on the head."
diff --git a/html/changelogs/Anewbe - Package Bombs.yml b/html/changelogs/Anewbe - Package Bombs.yml
new file mode 100644
index 00000000000..5fa9e3ba889
--- /dev/null
+++ b/html/changelogs/Anewbe - Package Bombs.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Package bombs now beep when activated, and have a delay before exploding."
+ - tweak: "Package bombs are more expensive."
diff --git a/html/changelogs/Anewbe - Robolimbs.yml b/html/changelogs/Anewbe - Robolimbs.yml
new file mode 100644
index 00000000000..62ee10a1f90
--- /dev/null
+++ b/html/changelogs/Anewbe - Robolimbs.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Robolimbs can take a bit more damage before they start malfunctioning."
\ No newline at end of file
diff --git a/html/changelogs/Anewbe - Towels.yml b/html/changelogs/Anewbe - Towels.yml
new file mode 100644
index 00000000000..0d89a8c6766
--- /dev/null
+++ b/html/changelogs/Anewbe - Towels.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Anewbe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Drying yourself off with a towel should actually dry you off a bit now."
diff --git a/html/changelogs/Arokha - Changes.yml b/html/changelogs/Arokha - Changes.yml
new file mode 100644
index 00000000000..07f7da73a34
--- /dev/null
+++ b/html/changelogs/Arokha - Changes.yml
@@ -0,0 +1,38 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Arokha
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Simple animals resist out of buckles and lockers"
+ - tweak: "Simple animals with retaliate but not hostile assist each other better if they also have cooperative"
+ - tweak: "E-nets now are resist-out-of (or clickable) by the one inside or outside, rather than having HP, and can be dragged around"
diff --git a/html/changelogs/Atermonera - FBPnumbernames.yml b/html/changelogs/Atermonera - FBPnumbernames.yml
new file mode 100644
index 00000000000..d96b3075e53
--- /dev/null
+++ b/html/changelogs/Atermonera - FBPnumbernames.yml
@@ -0,0 +1,13 @@
+# Your name.
+author: Atermonera
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "FBPs can now have numbers in their name. The first character cannot be a number."
\ No newline at end of file
diff --git a/html/changelogs/Atermonera - Translators.yml b/html/changelogs/Atermonera - Translators.yml
new file mode 100644
index 00000000000..278506535cc
--- /dev/null
+++ b/html/changelogs/Atermonera - Translators.yml
@@ -0,0 +1,37 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Atermonera
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Common simple animals now have their own language, and as such are no longer understandable by humans."
+ - bugfix: "Translators can't understand the same languages that recorders can't, including the new animal languages."
diff --git a/html/changelogs/Leshana-PR-3181.yml b/html/changelogs/Leshana-PR-3181.yml
new file mode 100644
index 00000000000..dc15d267c9e
--- /dev/null
+++ b/html/changelogs/Leshana-PR-3181.yml
@@ -0,0 +1,4 @@
+author: Leshana
+delete-after: True
+changes:
+ - rscadd: "Upgrades the automatic pipe layer to modernize its code and make it constructable! Constructs and deconstruts like other machines now. Circuits are buildable in the autolathe. Uses steel to make pipes."
diff --git a/html/changelogs/Sin4 - BackIcons.yml b/html/changelogs/Sin4 - BackIcons.yml
new file mode 100644
index 00000000000..01e09326a5e
--- /dev/null
+++ b/html/changelogs/Sin4 - BackIcons.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Sin4
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - bugfix: "Fixed back icons for Z8 Carbine, C20r, fireaxe, spear, and baseball bat."
\ No newline at end of file
diff --git a/html/changelogs/Sin4 - BeforeRoundRespawn.yml b/html/changelogs/Sin4 - BeforeRoundRespawn.yml
new file mode 100644
index 00000000000..f9163f0ef75
--- /dev/null
+++ b/html/changelogs/Sin4 - BeforeRoundRespawn.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Sin4
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "If observing before roundstart, you may respawn."
diff --git a/icons/effects/projectiles.dmi b/icons/effects/projectiles.dmi
index 9664b3e13bc..b20126b60db 100644
Binary files a/icons/effects/projectiles.dmi and b/icons/effects/projectiles.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index ce773c585d2..a69e893b6fc 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index dff3abd7d71..7407aeefb54 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/human_races/markings.dmi b/icons/mob/human_races/markings.dmi
index 636c829bd5f..e4e4101b4bf 100644
Binary files a/icons/mob/human_races/markings.dmi and b/icons/mob/human_races/markings.dmi differ
diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi
index 17994bd3db6..5e2e4a2c696 100644
Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ
diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi
index 393c70e519f..3b1a1dea8fe 100644
Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ
diff --git a/icons/mob/items/righthand_storage.dmi b/icons/mob/items/righthand_storage.dmi
index 16cb0d762f1..e3ecbc1f09b 100644
Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ
diff --git a/icons/obj/buildingobject.dmi b/icons/obj/buildingobject.dmi
index d55e9ec99fb..76fa0e43500 100644
Binary files a/icons/obj/buildingobject.dmi and b/icons/obj/buildingobject.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 920e73a891e..9337d5127c0 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index c1410bfcd41..ccd379fa30b 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ
diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm
index 476433112be..69d65696746 100644
--- a/maps/northern_star/polaris-1.dmm
+++ b/maps/northern_star/polaris-1.dmm
@@ -2254,7 +2254,7 @@
"aRr" = (/obj/structure/cryofeed,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/tiled/white,/area/security/prison)
"aRs" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/clothing/head/soft/orange,/obj/item/clothing/shoes/sandal,/turf/simulated/floor/tiled,/area/security/prison)
"aRt" = (/obj/structure/table/woodentable,/obj/effect/floor_decal/corner/green{dir = 5},/turf/simulated/floor/tiled,/area/hydroponics/garden)
-"aRu" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,/obj/item/clothing/suit/apron/overalls,/obj/machinery/camera/network/prison{c_tag = "SEC - Brig Bedroom"; dir = 8},/turf/simulated/floor/tiled,/area/security/prison)
+"aRu" = (/obj/structure/closet{name = "Prisoner's Locker"},/obj/item/weapon/reagent_containers/food/drinks/bottle/absinthe,/obj/item/clothing/suit/storage/apron/overalls,/obj/machinery/camera/network/prison{c_tag = "SEC - Brig Bedroom"; dir = 8},/turf/simulated/floor/tiled,/area/security/prison)
"aRv" = (/obj/machinery/door/airlock{name = "Toilet"},/turf/simulated/floor/tiled/freezer,/area/security/prison)
"aRw" = (/obj/structure/table/standard,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box{pixel_x = 3; pixel_y = 3},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/weapon/tape_roll{pixel_x = 4; pixel_y = 4},/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/storage/art)
"aRx" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen/blue{pixel_x = -5; pixel_y = -1},/obj/item/weapon/pen/red{pixel_x = -1; pixel_y = 3},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light,/turf/simulated/floor/tiled,/area/storage/art)
@@ -10011,7 +10011,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbb
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbkPbkQbkQbkSbkPbkPdELdELahyahyahyahybtHbtHbYedoobsBaahbtTdIWdIVdIYdIXdIZdIJbvlbvmbvnbMNbykbvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbDKbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahbjWbjWbrwbpMckQbZfclHcqpbrMbjWbjWaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObFrbuqbvQbGZbvSbvTcqsbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLdJadELahyahyahyahydELdELahyahyahyahyahyahybtHbYebsBbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbHDbwRbKGbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbKJbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahbjWbjWbjWcuwcuvbZgcuHcvCbjWbjWbjWaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbKKbxebvSbLZbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyahyahyahyahyahyahyaahaahbtHbEUbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbMHbyjbNtbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaToaYGbynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbyScbIbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahbtHbEUbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbNUbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahbjWbxabjWbjWaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbaRaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbBEbuCbApbAqbArbAsbAtbAubuCdopbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahbtHbEUbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbNUbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahbjWbxabjWbjWbCbaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbaRaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbBEbuCbApbAqbArbAsbAtbAubuCdopbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaabkfbBabBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmbztbtLaahaahaahaahaahahyahyahyahyaahaahaahaahbtHbEUbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDcMebBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbaSbaTbaTbaTbaTbaTbaVbaWbaWbaWbaXbaYbaWbaZbaWbbSbbabbTbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCzbyDbCybwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIbCJbCKbIcbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbJJbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbCVdiNbAZbDabCZbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahbtHbEUbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbObbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfaZGbEjbEjbEjbEjbEjbEjbbUaZGbbVbbXbbWaZGbEgbEgbEgbEgbEgbbYbEkbiDbjYaZdbElaUvbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFbyGbyHbEAbtfbEBbuKbECbEDbuKbySbySbySdBabEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaabkfbBabBabENbEObEPbEQbznbERbESbETbEUbEUbEVbEWbtHbEXbtHaahaahaahaahaahaahaahaahaahaahaahaahaahbtHbEUbwMbEYbEZbFabFbbFcbFdbFebFfbwMbFgbfubFhbFibFjbFkbFlbFmbFibFnbFobFnbyhbyhbyhbyhbyhbPNbFqbRGbyhbfzbeebFsbecbcnbFtbboaZdbFubFubFubFubFubFubFvdoyaZdbFxbFybFxaZdbFzbFAbFBdoCaZdaahaahaZdaZdaZGaZHaZGbEjbEjbcabbZbcHbcGbEjbcIbFQbEjbEgbEgbEgbEgbIQbIQbcJbEgbcKbFDbEgaZdaZdaTobcLbgJaUvbFSaTobypbyqbFTbAlbFUbFVbFWbFXbEqbFYbFZbGabGbbGcbGdbGebGfbGgbGhbGibGjbGjbGkbGlbtbbGmbGnbGobGpbySdoSbGrbGsbGtbGubGvbGwbyWbAJbySaZWaZmaZmaahaahaahaahaahaahbgmbxzbGydpKbgmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/polaris.dme b/polaris.dme
index 2fd1022631f..6544beb95fa 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -831,6 +831,7 @@
#include "code\game\objects\items\weapons\mop_deploy.dm"
#include "code\game\objects\items\weapons\paint.dm"
#include "code\game\objects\items\weapons\paiwire.dm"
+#include "code\game\objects\items\weapons\permits.dm"
#include "code\game\objects\items\weapons\policetape.dm"
#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\RCD.dm"
@@ -862,6 +863,7 @@
#include "code\game\objects\items\weapons\circuitboards\computer\telecomms.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\biogenerator.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\cloning.dm"
+#include "code\game\objects\items\weapons\circuitboards\machinery\engineering.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\jukebox.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\mech_recharger.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\mining_drill.dm"
@@ -1208,6 +1210,7 @@
#include "code\modules\clothing\gloves\gauntlets.dm"
#include "code\modules\clothing\gloves\miscellaneous.dm"
#include "code\modules\clothing\head\collectable.dm"
+#include "code\modules\clothing\head\flowercrowns.dm"
#include "code\modules\clothing\head\hardhat.dm"
#include "code\modules\clothing\head\helmet.dm"
#include "code\modules\clothing\head\jobs.dm"