diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm
index dfc78987eb3..6af57fc4870 100644
--- a/code/ZAS/Fire.dm
+++ b/code/ZAS/Fire.dm
@@ -153,7 +153,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh)
//im not sure how to implement a version that works for every creature so for now monkeys are firesafe
for(var/mob/living/carbon/human/M in loc)
- M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans!
+// M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans!
loc.fire_act(air_contents, air_contents.temperature, air_contents.return_volume())
for(var/atom/A in loc)
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index da2013e2e58..c00a79e1e6b 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -167,7 +167,7 @@
animals lunging, etc.
*/
/mob/proc/RangedAttack(var/atom/A, var/params)
- if(ishuman(src) && (istype(src:gloves, /obj/item/clothing/gloves/yellow/power)) && a_intent == "harm")
+ if(ishuman(src) && (istype(src:gloves, /obj/item/clothing/gloves/color/yellow/power)) && a_intent == "harm")
PowerGlove(A)
if(!mutations.len) return
if((LASER in mutations) && a_intent == "harm")
@@ -321,7 +321,7 @@
return
/mob/living/carbon/human/PowerGlove(atom/A)
- var/obj/item/clothing/gloves/yellow/power/G = src:gloves
+ var/obj/item/clothing/gloves/color/yellow/power/G = src:gloves
var/time = 100
var/turf/T = get_turf(src)
var/turf/U = get_turf(A)
diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm
index 36d4748cfc8..15a1dc1065b 100644
--- a/code/datums/cargoprofile.dm
+++ b/code/datums/cargoprofile.dm
@@ -156,7 +156,7 @@
blacklist = null
whitelist = list(/obj/item/weapon/tank,/obj/item/weapon/reagent_containers,
/obj/item/stack/medical,/obj/item/weapon/storage/pill_bottle,/obj/item/weapon/gun/syringe,
- /obj/item/weapon/plastique,/obj/item/weapon/grenade,/obj/item/ammo_box,
+ /obj/item/weapon/c4,/obj/item/weapon/grenade,/obj/item/ammo_box,
/obj/item/weapon/gun/grenadelauncher,/obj/item/weapon/flamethrower, /obj/item/weapon/lighter,
/obj/item/weapon/match,/obj/item/weapon/weldingtool)
@@ -258,7 +258,7 @@
whitelist = list(/obj/item/weapon/banhammer,/obj/item/weapon/sord,/obj/item/weapon/butch,/obj/item/weapon/claymore,/obj/item/weapon/holo/esword,
/obj/item/weapon/flamethrower,/obj/item/weapon/grenade,/obj/item/weapon/gun,/obj/item/weapon/hatchet,/obj/item/weapon/katana,
/obj/item/weapon/kitchenknife,/obj/item/weapon/melee,/obj/item/weapon/nullrod,/obj/item/weapon/pickaxe,/obj/item/weapon/twohanded,
- /obj/item/weapon/plastique,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/deathnettle)
+ /obj/item/weapon/c4,/obj/item/weapon/scalpel,/obj/item/weapon/shield,/obj/item/weapon/grown/deathnettle)
/datum/cargoprofile/tools
name = "Devices & Tools"
diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm
index 4f2750c0c06..0f7dcd15b4a 100644
--- a/code/datums/recipe.dm
+++ b/code/datums/recipe.dm
@@ -38,6 +38,7 @@
var/list/items // example: =list(/obj/item/weapon/crowbar, /obj/item/weapon/welder) // place /foo/bar before /foo
var/result //example: = /obj/item/weapon/reagent_containers/food/snacks/donut/normal
var/time = 100 // 1/10 part of second
+ var/byproduct //example: = /obj/item/weapon/kitchen/mould // byproduct to return, such as a mould or trash
/datum/recipe/proc/check_reagents(var/datum/reagents/avail_reagents) //1=precisely, 0=insufficiently, -1=superfluous
@@ -118,3 +119,9 @@
i_count = N_i
. = recipe
return .
+
+/datum/recipe/proc/get_byproduct()
+ if(byproduct)
+ return byproduct
+ else
+ return null
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 8497680bd2d..ea40af24232 100644
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -403,9 +403,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
/datum/supply_packs/engineering/powergamermitts
name = "Insulated Gloves Crate"
- contains = list(/obj/item/clothing/gloves/yellow,
- /obj/item/clothing/gloves/yellow,
- /obj/item/clothing/gloves/yellow)
+ contains = list(/obj/item/clothing/gloves/color/yellow,
+ /obj/item/clothing/gloves/color/yellow,
+ /obj/item/clothing/gloves/color/yellow)
cost = 20 //Made of pure-grade bullshittinium
containername = "insulated gloves crate"
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1aae642647b..76969b53dce 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -163,7 +163,7 @@ var/list/uplink_items = list()
/datum/uplink_item/jobspecific/pickpocketgloves
name = "Pickpocket's Gloves"
desc = "A pair of sleek gloves to aid in pickpocketing, while wearing these you can see inside the pockets of any unsuspecting mark, loot the ID or pockets without them knowing, and pickpocketing puts the item directly into your hand."
- item = /obj/item/clothing/gloves/black/thief
+ item = /obj/item/clothing/gloves/color/black/thief
cost = 6
job = list("Civilian")
@@ -188,7 +188,7 @@ var/list/uplink_items = list()
/datum/uplink_item/jobspecific/powergloves
name = "Power Gloves"
desc = "Insulated gloves that can utilize the power of the station to deliver a short arc of electricity at a target. Must be standing on a powered cable to use."
- item = /obj/item/clothing/gloves/yellow/power
+ item = /obj/item/clothing/gloves/color/yellow/power
cost = 14
job = list("Station Engineer","Chief Engineer")
@@ -521,7 +521,7 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/cipherkey
name = "Syndicate Encryption Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to all station department channels as well as talk on an encrypted Syndicate channel."
- item = /obj/item/device/encryptionkey/syndicate/hacked
+ item = /obj/item/device/encryptionkey/syndicate
cost = 5
/datum/uplink_item/device_tools/hacked_module
@@ -533,7 +533,7 @@ var/list/uplink_items = list()
/datum/uplink_item/device_tools/plastic_explosives
name = "Composition C-4"
desc = "C-4 is plastic explosive of the common variety Composition C. You can use it to breach walls or connect a signaler to its wiring to make it remotely detonable. It has a modifiable timer with a minimum setting of 10 seconds."
- item = /obj/item/weapon/plastique
+ item = /obj/item/weapon/c4
cost = 1
/datum/uplink_item/device_tools/powersink
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index 8f019880c93..b56f6ef4ca1 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -18,15 +18,15 @@ var/const/WIRE_EXPLODE = 1
explode()
/datum/wires/explosive/plastic
- holder_type = /obj/item/weapon/plastique
+ holder_type = /obj/item/weapon/c4
/datum/wires/explosive/plastic/CanUse(var/mob/living/L)
- var/obj/item/weapon/plastique/P = holder
+ var/obj/item/weapon/c4/P = holder
if(P.open_panel)
return 1
return 0
/datum/wires/explosive/plastic/explode()
- var/obj/item/weapon/plastique/P = holder
+ var/obj/item/weapon/c4/P = holder
P.explode(get_turf(P))
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 5eb6c3b54fc..b0e8290ffee 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -13,7 +13,7 @@
/obj/structure/ninjatele
name = "Long-Distance Teleportation Console"
- desc = "A console used to send a Spider Clan agent long distances rapidly."
+ desc = "A console used to send a Spider Clan operative long distances rapidly."
icon = 'icons/obj/ninjaobjects.dmi'
icon_state = "teleconsole"
anchored = 1
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index be1e71c6bb4..026e1f7499c 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -97,7 +97,7 @@
item_state = "cult_armour"
desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
w_class = 3
- allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 09453727f4b..a367d1f5600 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -60,7 +60,7 @@ Devices and Tools;
/obj/item/clothing/glasses/thermal/syndi:3:Thermal Imaging Glasses;
/obj/item/device/encryptionkey/binary:3:Binary Translator Key;
/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module;
-/obj/item/weapon/plastique:2:C-4 (Destroys walls);
+/obj/item/weapon/c4:2:C-4 (Destroys walls);
/obj/item/device/powersink:5:Powersink (DANGER!);
/obj/item/device/radio/beacon/syndicate:7:Singularity Beacon (DANGER!);
/obj/item/weapon/circuitboard/teleporter:20:Teleporter Circuit Board;
diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm
index 9936afa1d9a..cfbc8491fc5 100644
--- a/code/game/gamemodes/setupgame.dm
+++ b/code/game/gamemodes/setupgame.dm
@@ -170,7 +170,7 @@
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes)
// M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_r_store)
//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/weapon/storage/backpack(M), slot_back)
@@ -193,7 +193,7 @@
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space(M), slot_wear_suit)
// M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
@@ -215,7 +215,7 @@
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(M), slot_shoes)
// M.equip_to_slot_or_del(new /obj/item/weapon/storage/toolbox/mechanical(M), slot_l_hand)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/t_scanner(M), slot_r_store)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(M), slot_back)
if (prob(50))
@@ -235,7 +235,7 @@
//M.equip_to_slot_or_del(new /obj/item/weapon/gun/revolver(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/weapon/tank/jetpack(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M), slot_wear_mask)
if (prob(50))
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 43f58169edf..18cd7b2a334 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -333,7 +333,7 @@
if("armor")
feedback_add_details("wizard_spell_learned","HS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells
new /obj/item/clothing/shoes/sandal(get_turf(H)) //In case they've lost them.
- new /obj/item/clothing/gloves/purple(get_turf(H))//To complete the outfit
+ new /obj/item/clothing/gloves/color/purple(get_turf(H))//To complete the outfit
new /obj/item/clothing/suit/space/rig/wizard(get_turf(H))
new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(H))
temp = "You have purchased a suit of wizard armor."
diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm
index 72c1cc51b54..f6b34aef591 100644
--- a/code/game/jobs/access.dm
+++ b/code/game/jobs/access.dm
@@ -10,7 +10,7 @@
/var/const/access_tox_storage = 8
/var/const/access_genetics = 9
/var/const/access_engine = 10
-/var/const/access_engine_equip= 11
+/var/const/access_engine_equip = 11
/var/const/access_maint_tunnels = 12
/var/const/access_external_airlocks = 13
/var/const/access_emergency_storage = 14
@@ -77,28 +77,20 @@
/var/const/access_weapons = 99 //Weapon authorization for secbots
//BEGIN CENTCOM ACCESS
- /*Should leave plenty of room if we need to add more access levels.
-/var/const/Mostly for admin fun times.*/
/var/const/access_cent_general = 101//General facilities.
-/var/const/access_cent_thunder = 102//Thunderdome.
-/var/const/access_cent_specops = 103//Special Ops.
-/var/const/access_cent_medical = 104//Medical/Research
-/var/const/access_cent_living = 105//Living quarters.
-/var/const/access_cent_storage = 106//Generic storage areas.
-/var/const/access_cent_teleporter = 107//Teleporter.
-/var/const/access_cent_creed = 108//Creed's office.
-/var/const/access_cent_captain = 109//Captain's office/ID comp/AI.
-
- //EMBASSIES
-
-/var/const/embassy_tajaran = 120
-/var/const/embassy_skrell = 121
-/var/const/embassy_unathi = 122
-/var/const/embassy_diona = 123
-/var/const/embassy_kidan = 124
-/var/const/embassy_slime = 125
-/var/const/embassy_grey = 126
-/var/const/embassy_vox = 127
+/var/const/access_cent_living = 102//Living quarters.
+/var/const/access_cent_medical = 103//Medical.
+/var/const/access_cent_security = 104//Security.
+/var/const/access_cent_storage = 105//Storage areas.
+/var/const/access_cent_shuttles = 106//Shuttle docks.
+/var/const/access_cent_telecomms = 107//Telecomms.
+/var/const/access_cent_teleporter = 108//Telecomms.
+/var/const/access_cent_specops = 109//Special Ops.
+/var/const/access_cent_specops_commander = 110//Special Ops Commander.
+/var/const/access_cent_blackops = 111//Black Ops.
+/var/const/access_cent_thunder = 112//Thunderdome.
+/var/const/access_cent_bridge = 113//Bridge.
+/var/const/access_cent_commander = 114//Commander's Office/ID computer.
//The Syndicate
/var/const/access_syndicate = 150//General Syndicate Access
@@ -197,34 +189,49 @@
/proc/get_centcom_access(job)
switch(job)
if("VIP Guest")
- return list(access_cent_general)
+ return list(access_cent_general, access_cent_living)
if("Custodian")
- return list(access_cent_general, access_cent_living, access_cent_storage)
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_storage)
if("Thunderdome Overseer")
return list(access_cent_general, access_cent_thunder)
- if("Emergency Response Team")
- return list(access_cent_general, access_cent_living, access_cent_storage) + get_all_accesses()
+ if("Emergency Response Team Member")
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_security, access_cent_storage, access_cent_specops) + get_all_accesses()
if("Emergency Response Team Leader")
- return list(access_cent_general, access_cent_living, access_cent_storage, access_cent_teleporter) + get_all_accesses()
- if("Intel Officer")
- return list(access_cent_general, access_cent_living) + get_all_accesses()
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_security, access_cent_storage, access_cent_specops, access_cent_specops_commander) + get_all_accesses()
if("Medical Officer")
- return list(access_cent_general, access_cent_living, access_cent_medical) + get_all_accesses()
- if("Death Commando")
- return list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage) + get_all_accesses()
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_storage) + get_all_accesses()
+ if("Intel Officer")
+ return list(access_cent_general, access_cent_living, access_cent_security, access_cent_storage) + get_all_accesses()
if("Research Officer")
- return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_teleporter, access_cent_storage) + get_all_accesses()
- if("BlackOps Commander")
- return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_living, access_cent_storage, access_cent_creed) + get_all_accesses()
+ return list(access_cent_general, access_cent_specops, access_cent_medical, access_cent_storage, access_cent_telecomms, access_cent_teleporter) + get_all_accesses()
+ if("Death Commando")
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_security, access_cent_storage, access_cent_specops, access_cent_specops_commander, access_cent_blackops) + get_all_accesses()
+ if("Deathsquad Officer")
+ return get_all_centcom_access() + get_all_accesses()
if("Special Operations Officer")
return get_all_centcom_access() + get_all_accesses()
+ if("Nanotrasen Navy Representative")
+ return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Officer")
return get_all_centcom_access() + get_all_accesses()
if("Nanotrasen Navy Captain")
return get_all_centcom_access() + get_all_accesses()
if("Supreme Commander")
return get_all_centcom_access() + get_all_accesses()
-
+
+/proc/get_syndicate_access(job)
+ switch(job)
+ if("Syndicate Operative")
+ return list(access_syndicate)
+ if("Syndicate Operative Leader")
+ return list(access_syndicate, access_syndicate_leader)
+ if("Vox Raider")
+ return list(access_vox)
+ if("Vox Trader")
+ return list(access_vox)
+ if("Syndicate Commando")
+ return list(access_syndicate, access_syndicate_leader)
+
/proc/get_all_accesses()
return list(access_security, access_sec_doors, access_brig, access_armory, access_forensics_lockers, access_court,
access_medical, access_genetics, access_morgue, access_rd,
@@ -240,10 +247,10 @@
access_pilot, access_ntrep, access_magistrate, access_minisat)
/proc/get_all_centcom_access()
- return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_creed, access_cent_captain)
+ return list(access_cent_general, access_cent_living, access_cent_medical, access_cent_security, access_cent_storage, access_cent_shuttles, access_cent_telecomms, access_cent_teleporter, access_cent_specops, access_cent_specops_commander, access_cent_blackops, access_cent_thunder, access_cent_bridge, access_cent_commander)
/proc/get_all_syndicate_access()
- return list(access_syndicate)
+ return list(access_syndicate, access_syndicate_leader, access_vox)
/proc/get_region_accesses(var/code)
switch(code)
@@ -436,23 +443,42 @@
/proc/get_centcom_access_desc(A)
switch(A)
if(access_cent_general)
- return "Code Grey"
- if(access_cent_thunder)
- return "Code Yellow"
- if(access_cent_storage)
- return "Code Orange"
+ return "General Access"
if(access_cent_living)
- return "Code Green"
+ return "Living Quarters"
if(access_cent_medical)
- return "Code White"
+ return "Medical"
+ if(access_cent_security)
+ return "Security"
+ if(access_cent_storage)
+ return "Storage"
+ if(access_cent_shuttles)
+ return "Shuttles"
+ if(access_cent_telecomms)
+ return "Telecommunications"
if(access_cent_teleporter)
- return "Code Blue"
+ return "Teleporter"
if(access_cent_specops)
- return "Code Black"
- if(access_cent_creed)
- return "Code Silver"
- if(access_cent_captain)
- return "Code Gold"
+ return "Special Ops"
+ if(access_cent_specops_commander)
+ return "Special Ops Commander"
+ if(access_cent_blackops)
+ return "Black Ops"
+ if(access_cent_thunder)
+ return "Thunderdome"
+ if(access_cent_bridge)
+ return "Bridge"
+ if(access_cent_commander)
+ return "Commander"
+
+/proc/get_syndicate_access_desc(A)
+ switch(A)
+ if(access_syndicate)
+ return "Syndicate Operative"
+ if(access_syndicate_leader)
+ return "Syndicate Operative Leader"
+ if(access_vox)
+ return "Vox"
/proc/get_all_jobs()
var/list/all_jobs = list()
@@ -465,7 +491,7 @@
return all_jobs
/proc/get_all_centcom_jobs()
- return list("VIP Guest","Custodian","Thunderdome Overseer","Emergency Response Team Member","Emergency Response Team Leader","Intel Officer","Medical Officer","Death Commando","Research Officer","BlackOps Commander","Special Operations Officer","Nanotrasen Navy Officer","Nanotrasen Navy Captain","Supreme Commander")
+ return list("VIP Guest","Custodian","Thunderdome Overseer","Emergency Response Team Member","Emergency Response Team Leader","Intel Officer","Medical Officer","Death Commando","Research Officer","Deathsquad Officer","Special Operations Officer","Nanotrasen Navy Representative","Nanotrasen Navy Officer","Nanotrasen Navy Captain","Supreme Commander")
//gets the actual job rank (ignoring alt titles)
//this is used solely for sechuds
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 71a8332239b..8aa80ad807f 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -31,7 +31,7 @@
H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/head/hardhat/white(H), slot_head)
H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
- H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_or_collect(new /obj/item/clothing/gloves/color/black/ce(H), slot_gloves)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
else
diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm
index 4ec89fad037..928e5db3303 100644
--- a/code/game/jobs/job/science.dm
+++ b/code/game/jobs/job/science.dm
@@ -139,7 +139,6 @@
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/roboticist(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
-// H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_or_collect(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm
index 45d19411b32..c5efe344164 100644
--- a/code/game/jobs/job/security.dm
+++ b/code/game/jobs/job/security.dm
@@ -29,7 +29,7 @@
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/suit/armor/hos(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/device/pda/heads/hos(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_or_collect(new /obj/item/clothing/gloves/color/black/hos(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/head/HoS(H), slot_head)
H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
H.equip_or_collect(new /obj/item/weapon/gun/energy/gun(H), slot_s_store)
@@ -74,7 +74,7 @@
H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/warden(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/warden(H), slot_head)
H.equip_or_collect(new /obj/item/device/pda/warden(H), slot_wear_pda)
- H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses/sechud(H), slot_glasses)
// H.equip_or_collect(new /obj/item/clothing/mask/gas(H), slot_wear_mask) //Grab one from the armory you donk
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
@@ -119,10 +119,11 @@
H.equip_or_collect(new /obj/item/clothing/under/det(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/detective(H), slot_wear_pda)
+ H.equip_or_collect(new /obj/item/toy/crayon/white(H), slot_l_store)
/* var/obj/item/clothing/mask/cigarette/CIG = new /obj/item/clothing/mask/cigarette(H)
CIG.light("")
H.equip_or_collect(CIG, slot_wear_mask) */
- H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
+ H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
if(H.mind.role_alt_title && H.mind.role_alt_title == "Forensic Technician")
H.equip_or_collect(new /obj/item/clothing/suit/storage/forensics/blue(H), slot_wear_suit)
else
@@ -176,6 +177,7 @@
H.equip_or_collect(new /obj/item/clothing/suit/armor/vest/security(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet(H), slot_head)
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
+ H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
if(H.backbag == 1)
@@ -251,6 +253,7 @@
H.equip_or_collect(new /obj/item/clothing/suit/jacket(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/security(H), slot_wear_pda)
+ H.equip_or_collect(new /obj/item/clothing/gloves/color/black(H), slot_gloves)
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_belt)
H.equip_or_collect(new /obj/item/device/flash(H), slot_l_store)
if(H.backbag == 1)
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 94f555b2b30..e8ab395908c 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -98,9 +98,9 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
department_flag = KARMA
total_positions = 1
spawn_positions = 1
- supervisors = "the Nanotrasen Board of Directors"
+ supervisors = "the command staff"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/centcom
+ idtype = /obj/item/weapon/card/id
req_admin_notify = 1
minimal_player_age = 21
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
@@ -126,7 +126,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/melee/baton/loaded/ntcane(H.back), slot_in_backpack)
H.equip_or_collect(new /obj/item/weapon/lighter/zippo/fluff/nt_rep(H.back), slot_in_backpack)
- H.equip_if_possible(new /obj/item/clothing/under/rank/centcom/representative(H), slot_w_uniform)
+ H.equip_if_possible(new /obj/item/clothing/under/rank/ntrep(H), slot_w_uniform)
+ H.equip_if_possible(new /obj/item/clothing/suit/storage/ntrep(H), slot_wear_suit)
H.equip_if_possible(new /obj/item/clothing/shoes/centcom(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/heads/ntrep(H), slot_wear_pda)
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
@@ -145,7 +146,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "the captain"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/centcom
+ idtype = /obj/item/weapon/card/id
req_admin_notify = 1
minimal_player_age = 21
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
@@ -153,7 +154,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
- access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons)
+ access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_weapons, access_blueshield)
minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
access_medical, access_engine, access_eva, access_heads,
access_all_personal_lockers, access_maint_tunnels, access_bar, access_janitor, access_construction, access_morgue,
@@ -172,7 +173,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
H.equip_or_collect(new /obj/item/clothing/gloves/combat(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/shoes/jackboots(H), slot_shoes)
H.equip_or_collect(new /obj/item/clothing/glasses/hud/health_advanced, slot_glasses)
- H.equip_if_possible(new /obj/item/clothing/under/rank/centcom/blueshield(H), slot_w_uniform)
+ H.equip_if_possible(new /obj/item/clothing/under/rank/blueshield(H), slot_w_uniform)
H.equip_if_possible(new /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield(H), slot_wear_suit)
H.equip_or_collect(new /obj/item/weapon/gun/energy/advtaser(H), slot_s_store)
H.equip_or_collect(new /obj/item/device/pda/heads/blueshield(H), slot_wear_pda)
@@ -196,7 +197,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1)
spawn_positions = 1
supervisors = "the Nanotrasen Supreme Court"
selection_color = "#ddddff"
- idtype = /obj/item/weapon/card/id/centcom
+ idtype = /obj/item/weapon/card/id
req_admin_notify = 1
minimal_player_age = 21
access = list(access_security, access_sec_doors, access_brig, access_court, access_forensics_lockers,
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 96e5d089b22..e50ff107344 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -118,7 +118,6 @@
H.equip_or_collect(new /obj/item/clothing/under/rank/cargo(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/quartermaster(H), slot_wear_pda)
-// H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
H.equip_or_collect(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses)
H.equip_or_collect(new /obj/item/weapon/clipboard(H), slot_l_hand)
if(H.backbag == 1)
@@ -147,7 +146,6 @@
H.equip_or_collect(new /obj/item/clothing/under/rank/cargotech(H), slot_w_uniform)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/device/pda/cargo(H), slot_wear_pda)
-// H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
else
@@ -179,7 +177,6 @@
H.equip_or_collect(new /obj/item/device/pda/shaftminer(H), slot_wear_pda)
H.equip_or_collect(new /obj/item/clothing/shoes/black(H), slot_shoes)
H.equip_or_collect(new /obj/item/weapon/pickaxe/drill(H), slot_belt)
-// H.equip_or_collect(new /obj/item/clothing/gloves/black(H), slot_gloves)
if(H.backbag == 1)
H.equip_or_collect(new /obj/item/weapon/storage/box/engineer(H), slot_r_hand)
H.equip_or_collect(new /obj/item/weapon/crowbar(H), slot_l_hand)
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 8370dd40f3c..34ce5de1ce3 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -36,9 +36,9 @@
networks["Anomaly Isolation"] = list(access_rd,access_hos,access_captain)
networks["Toxins"] = list(access_rd,access_hos,access_captain)
networks["Telepad"] = list(access_rd,access_hos,access_captain)
- networks["ERT"] = list(access_cent_teleporter,access_cent_captain)
- networks["CentCom"] = list(access_cent_captain)
- networks["Thunderdome"] = list(access_cent_captain)
+ networks["ERT"] = list(access_cent_specops_commander,access_cent_commander)
+ networks["CentCom"] = list(access_cent_security,access_cent_commander)
+ networks["Thunderdome"] = list(access_cent_thunder,access_cent_commander)
attack_ai(var/mob/user as mob)
return attack_hand(user)
diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm
index 73931aa0183..c134b649c39 100644
--- a/code/game/machinery/computer/card.dm
+++ b/code/game/machinery/computer/card.dm
@@ -291,4 +291,4 @@
/obj/machinery/computer/card/centcom
name = "CentCom Identification Computer"
circuit = "/obj/item/weapon/circuitboard/card/centcom"
- req_access = list(access_cent_captain)
+ req_access = list(access_cent_commander)
diff --git a/code/game/machinery/computer/syndicate_specops_shuttle.dm b/code/game/machinery/computer/syndicate_specops_shuttle.dm
index 288fa2dfdf6..969f3373729 100644
--- a/code/game/machinery/computer/syndicate_specops_shuttle.dm
+++ b/code/game/machinery/computer/syndicate_specops_shuttle.dm
@@ -14,7 +14,7 @@ var/syndicate_elite_shuttle_timeleft = 0
name = "Elite Syndicate Squad Shuttle Console"
icon = 'icons/obj/computer.dmi'
icon_state = "syndishuttle"
- req_access = list(access_cent_specops)
+ req_access = list(access_syndicate)
var/temp = null
var/hacked = 0
var/allowedtocall = 0
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index 546b5956f0b..f1aae4943e3 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -344,12 +344,45 @@ to destroy them and players will be able to make replacements.
build_path = /obj/machinery/microwave
board_type = "machine"
origin_tech = "programming=1"
- frame_desc = "Requires 1 Micro Laser, 1 piece of cable and 1 Console Screen."
+ frame_desc = "Requires 1 Micro Laser, 2 pieces of cable and 1 Console Screen."
req_components = list(
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/stack/cable_coil = 2,
/obj/item/weapon/stock_parts/console_screen = 1)
+/obj/item/weapon/circuitboard/oven
+ name = "circuit board (Oven)"
+ build_path = /obj/machinery/oven
+ board_type = "machine"
+ origin_tech = "programming=1;plasmatech=1"
+ frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen."
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 2,
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/grill
+ name = "circuit board (Grill)"
+ build_path = /obj/machinery/grill
+ board_type = "machine"
+ origin_tech = "programming=1;plasmatech=1"
+ frame_desc = "Requires 2 Micro Lasers, 5 pieces of cable and 1 Console Screen."
+ req_components = list(
+ /obj/item/weapon/stock_parts/micro_laser = 2,
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/candy_maker
+ name = "circuit board (Candy Maker)"
+ build_path = /obj/machinery/candy_maker
+ board_type = "machine"
+ origin_tech = "programming=2"
+ frame_desc = "Requires 1 Manipulator, 5 pieces of cable and 1 Console Screen."
+ req_components = list(
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
/obj/item/weapon/circuitboard/chem_dispenser
name = "circuit board (Portable Chem Dispenser)"
build_path = /obj/machinery/chem_dispenser/constructable
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 0d92be24127..d60fefe0b34 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -13,6 +13,7 @@
var/obj/item/weapon/reagent_containers/glass/beaker = null
var/autoeject = 0
+ var/next_trans = 0
var/current_heat_capacity = 50
var/efficiency
@@ -38,7 +39,7 @@
component_parts += new /obj/item/stack/cable_coil(src, 1)
RefreshParts()
-/obj/machinery/atmospherics/unary/cryo_cell/New()
+/obj/machinery/atmospherics/unary/cryo_cell/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/weapon/circuitboard/cryo_tube(src)
@@ -128,15 +129,13 @@
if(!on)
return
- if(occupant)
- if(occupant.stat != 2)
- process_occupant()
-
if(air_contents)
temperature_archived = air_contents.temperature
heat_gas_contents()
expel_gas()
+ if(occupant)
+ process_occupant()
if(abs(temperature_archived-air_contents.temperature) > 1)
network.update = 1
@@ -220,7 +219,7 @@
data["beakerVolume"] += R.volume
data["autoeject"] = autoeject
-
+
// update the ui if it exists, returns null if no ui is passed/found
ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
if (!ui)
@@ -319,11 +318,11 @@
if(air_contents.total_moles() < 10)
return
if(occupant)
- if(occupant.stat == 2)
+ if(occupant.stat == 2 || occupant.health >= 100) //Why waste energy on dead or healthy people
+ occupant.bodytemperature = T0C
return
occupant.bodytemperature += 2*(air_contents.temperature - occupant.bodytemperature)*current_heat_capacity/(current_heat_capacity + air_contents.heat_capacity())
occupant.bodytemperature = max(occupant.bodytemperature, air_contents.temperature) // this is so ugly i'm sorry for doing it i'll fix it later i promise
- occupant.stat = 1
if(occupant.bodytemperature < T0C)
occupant.sleeping = max(5/efficiency, (1/occupant.bodytemperature)*2000/efficiency)
occupant.Paralyse(max(5/efficiency, (1/occupant.bodytemperature)*3000/efficiency))
@@ -333,17 +332,17 @@
occupant.adjustOxyLoss(-1)
//severe damage should heal waaay slower without proper chemicals
if(occupant.bodytemperature < 225)
- if (occupant.getToxLoss())
+ if(occupant.getToxLoss())
occupant.adjustToxLoss(max(-efficiency, (-20*(efficiency ** 2)) / occupant.getToxLoss()))
var/heal_brute = occupant.getBruteLoss() ? min(efficiency, 20*(efficiency**2) / occupant.getBruteLoss()) : 0
var/heal_fire = occupant.getFireLoss() ? min(efficiency, 20*(efficiency**2) / occupant.getFireLoss()) : 0
occupant.heal_organ_damage(heal_brute,heal_fire)
- var/has_cryo = occupant.reagents.get_reagent_amount("cryoxadone") >= 1
- var/has_clonexa = occupant.reagents.get_reagent_amount("clonexadone") >= 1
- var/has_cryo_medicine = has_cryo || has_clonexa
- if(beaker && !has_cryo_medicine)
- beaker.reagents.trans_to(occupant, 1, 1)
+ if(beaker && next_trans == 0)
+ beaker.reagents.trans_to(occupant, 1, 10)
beaker.reagents.reaction(occupant)
+ next_trans++
+ if(next_trans == 10)
+ next_trans = 0
/obj/machinery/atmospherics/unary/cryo_cell/proc/heat_gas_contents()
if(air_contents.total_moles() < 1)
@@ -357,13 +356,12 @@
/obj/machinery/atmospherics/unary/cryo_cell/proc/expel_gas()
if(air_contents.total_moles() < 1)
return
-// var/datum/gas_mixture/expel_gas = new
-// var/remove_amount = air_contents.total_moles()/50
-// expel_gas = air_contents.remove(remove_amount)
-
- // Just have the gas disappear to nowhere.
- //expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
- //loc.assume_air(expel_gas)
+ var/datum/gas_mixture/expel_gas = new
+ var/remove_amount = air_contents.total_moles()/100
+ expel_gas = air_contents.remove(remove_amount)
+ expel_gas.temperature = T20C // Lets expel hot gas and see if that helps people not die as they are removed
+ loc.assume_air(expel_gas)
+ update_nearby_tiles()
/obj/machinery/atmospherics/unary/cryo_cell/proc/go_out()
if(!( occupant ))
@@ -415,7 +413,7 @@
if (usr.stat == 2)//and he's not dead....
return
usr << "\blue Release sequence activated. This will take two minutes."
- sleep(1200)
+ sleep(600)
if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
return
go_out()//and release him from the eternal prison.
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index a7ce13d419e..3c9a0a2d1a8 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -998,7 +998,7 @@ About the new airlock wires panel:
if(istype(C, /obj/item/device/detective_scanner) || istype(C, /obj/item/taperoll))
return
- if(istype(C, /obj/item/weapon/plastique))
+ if(istype(C, /obj/item/weapon/c4))
user << "The hatch is coated with a product that prevents the shaped charge from sticking!"
return
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index cd8e806fbb0..064bb7ff475 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -32,11 +32,11 @@
reagents.my_atom = src
if (!available_recipes)
available_recipes = new
- for (var/type in (typesof(/datum/recipe)-/datum/recipe))
+ for (var/type in (typesof(/datum/recipe/microwave)-/datum/recipe/microwave))
available_recipes+= new type
acceptable_items = new
acceptable_reagents = new
- for (var/datum/recipe/recipe in available_recipes)
+ for (var/datum/recipe/microwave/recipe in available_recipes)
for (var/item in recipe.items)
acceptable_items |= item
for (var/reagent in recipe.reagents)
diff --git a/code/game/machinery/metaldetector.dm b/code/game/machinery/metaldetector.dm
index 95e76eaa2c5..4cdb45507d4 100644
--- a/code/game/machinery/metaldetector.dm
+++ b/code/game/machinery/metaldetector.dm
@@ -67,7 +67,7 @@
knifecount++
for(var/obj/item/weapon/kitchenknife/KK in M)
knifecount++
- for(var/obj/item/weapon/plastique/KK in M)
+ for(var/obj/item/weapon/c4/KK in M)
bombcount++
for(var/obj/item/weapon/melee/ML in M)
meleecount++
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
new file mode 100644
index 00000000000..937629589ed
--- /dev/null
+++ b/code/game/machinery/poolcontroller.dm
@@ -0,0 +1,129 @@
+/obj/machinery/poolcontroller
+ name = "Pool Controller"
+ desc = "A controller for the nearby pool."
+ icon = 'icons/obj/airlock_machines.dmi'
+ icon_state = "airlock_control_standby"
+ var/list/linkedturfs = list() //List contains all of the linked pool turfs to this controller, assignment happens on New()
+ var/temperature = "normal" //The temperature of the pool, starts off on normal, which has no effects.
+ var/srange = 5 //The range of the search for pool turfs, change this for bigger or smaller pools.
+ var/linkedmist = list() //Used to keep track of created mist
+ var/misted = 0 //Used to check for mist.
+
+/obj/machinery/poolcontroller/New() //This proc automatically happens on world start
+ for(var/turf/simulated/floor/beach/water/W in range(srange,src)) //Search for /turf/simulated/floor/beach/water in the range of var/srange
+ src.linkedturfs += W //Add found pool turfs to the central list.
+ ..() //Changed to call parent as per MarkvA's recommendation
+
+/obj/machinery/poolcontroller/emag_act(user as mob) //Emag_act, this is called when it is hit with a cryptographic sequencer.
+ if(!emagged) //If it is not already emagged, emag it.
+ user << "\red You disable \the [src]'s temperature safeguards." //Inform the mob of what emagging does.
+ emagged = 1 //Set the emag var to true.
+
+/obj/machinery/poolcontroller/attackby(obj/item/P as obj, mob/user as mob, params) //Proc is called when a user hits the pool controller with something.
+
+ if(istype(P,/obj/item/device/multitool)) //If the mob hits the pool controller with a multitool, reset the emagged status
+ if(emagged) //Check the emag status
+ user << "\red You re-enable \the [src]'s temperature safeguards." //Inform the user that they have just fixed the safeguards.
+ emagged = 0 //Set the emagged var to false.
+ return
+ else
+ user << "\red Nothing happens." //If not emagged, don't do anything, and don't tell the user that it can be emagged.
+
+ return //Return, nothing else needs to be done.
+ else //If it's not a multitool, defer to /obj/machinery/proc/attackby
+ ..()
+
+/obj/machinery/poolcontroller/attack_hand()
+ if(!Adjacent(usr))
+ usr << "You moved away."
+ return
+
+ if(emagged) //Emagging unlocks more (deadly) options.
+ var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Scalding","Frigid", "Warm", "Cool", "Normal","Cancel") //Allow user to choose which temperature they want.
+
+ switch(temp) //Used for setting the actual temperature var based on user input.
+ if("Scalding")
+ miston() //Turn on warning mist for the pool
+ temperature = "scalding" //Burn em!
+ usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
+ return //Return to avoid calling the un-unique message.
+ if("Frigid")
+ temperature = "frigid"
+ usr << "You flick the pool temperature to [temperature](WARNING)." //Differ from standard message to make sure the user understands the temperature is harmful.
+ mistoff() //this won't get called otherwise
+ return //Return to avoid calling the un-unique message.
+
+ //Regular non-traitorous temperature choices still avalible.
+ if("Warm")
+ temperature = "warm"
+ if("Cool")
+ temperature = "cool"
+ if("Normal")
+ temperature = "normal"
+ if("Cancel")
+ return
+
+ mistoff() //Remove all mist, setting it to scalding returns before now, only regular temperatures will call it
+ usr << "You flick the pool temperature to [temperature]." //Inform the mob of the temperature they just picked.
+ return
+
+ else
+ var/temp = input("What temperature would you like to set the pool to?", "Pool Temperature") in list("Warm","Cool","Normal","Cancel") //Allow user to choose which temperature they want.
+
+ switch(temp) //Used for setting the actual temperature var based on user input.
+ if("Warm")
+ temperature = "warm"
+ if("Cool")
+ temperature = "cool"
+ if("Normal")
+ temperature = "normal"
+ if("Cancel") //Cancel does nothing and leaves the temperature at it's previous state.
+ return
+
+ mistoff() //Remove all mist, because it shouldn't be here if the pool is not set to scalding
+ usr << "You flick the pool temperature to [temperature]." //Display what the user picked.
+ return
+
+/obj/machinery/poolcontroller/process()
+ updateMobs() //Call the mob affecting proc
+
+/obj/machinery/poolcontroller/proc/updateMobs()
+ for(var/turf/simulated/floor/beach/water/W in linkedturfs) //Check for pool-turfs linked to the controller.
+ for(var/mob/M in W) //Check for mobs in the linked pool-turfs.
+ switch(temperature) //Apply different effects based on what the temperature is set to.
+ if("scalding") //Burn the mob.
+ M.bodytemperature = min(500, M.bodytemperature + 35) //heat mob at 35k(elvin) per cycle
+ M << "The water is searing hot!"
+ return
+
+ if("frigid") //Freeze the mob.
+ M.bodytemperature = max(80, M.bodytemperature - 35) //cool mob at -35k per cycle
+ M << "The water is freezing!"
+ return
+
+ if("normal") //Normal temp does nothing, because it's just room temperature water.
+ return
+
+ if("warm") //Gently warm the mob.
+ M.bodytemperature = min(330, M.bodytemperature + 10) //Heats up mobs to just over normal, not enough to burn
+ M << "The water is quite warm." //Inform the mob it's warm water.
+ return
+
+ if("cool") //Gently cool the mob.
+ M.bodytemperature = max(290, M.bodytemperature - 10) //Cools mobs to just below normal, not enough to burn
+ M << "The water is chilly." //Inform the mob it's chilly water.
+ return
+
+/obj/machinery/poolcontroller/proc/miston() //Spawn /obj/effect/mist (from the shower) on all linked pool tiles
+ for(var/turf/simulated/floor/beach/water/W in linkedturfs)
+ var/M = new /obj/effect/mist(W)
+ if(misted)
+ return
+ linkedmist += M
+
+ misted = 1 //var just to keep track of when the mist on proc has been called.
+
+/obj/machinery/poolcontroller/proc/mistoff() //Delete all /obj/effect/mist from all linked pool tiles.
+ for(var/obj/effect/mist/M in linkedmist)
+ del(M)
+ misted = 0 //no mist left, turn off the tracking var
\ No newline at end of file
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 66c26a8b654..7eaa6315995 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -207,7 +207,7 @@
/*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
- if(istype(G,/obj/item/clothing/gloves/yellow))
+ if(istype(G,/obj/item/clothing/gloves/color/yellow))
protected = 1
if(!protected)
@@ -233,7 +233,7 @@
/*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
- if(istype(G,/obj/item/clothing/gloves/yellow) )
+ if(istype(G,/obj/item/clothing/gloves/color/yellow) )
protected = 1
if(!protected)
@@ -730,7 +730,7 @@
return
..()
-
+
/obj/machinery/suit_cycler/emag_act(user as mob)
if(emagged)
user << "\red The cycler has already been subverted."
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 5e197383acc..f754155d7c7 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -246,7 +246,7 @@
badcount++
for(var/obj/item/weapon/kitchenknife/KK in src.loc)
badcount++
- for(var/obj/item/weapon/plastique/KK in src.loc)
+ for(var/obj/item/weapon/c4/KK in src.loc)
badcount++
for(var/obj/item/weapon/melee/ML in src.loc)
badcount++
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index c8987cccad0..786caf13331 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -786,11 +786,11 @@
product_slogans = "Try our new nougat bar!;Twice the calories for half the price!"
product_ads = "The healthiest!;Award-winning chocolate bars!;Mmm! So good!;Oh my god it's so juicy!;Have a snack.;Snacks are good for you!;Have some more Getmore!;Best quality snacks straight from mars.;We love chocolate!;Try our new jerky!"
icon_state = "snack"
- products = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6,
+ products = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candybar = 6,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 6,/obj/item/weapon/reagent_containers/food/snacks/chips =6,
/obj/item/weapon/reagent_containers/food/snacks/sosjerky = 6,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 6,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 6,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6)
contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6)
- prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25,
+ prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy/candybar = 20,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips =25,
/obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 20,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 30,
/obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25)
refill_canister = /obj/item/weapon/vending_refill/snack
@@ -1057,7 +1057,15 @@
desc = "A kitchen and restaurant equipment vendor"
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
- products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,/obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2,/obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,/obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5)
+ products = list(/obj/item/weapon/storage/bag/tray = 8,/obj/item/weapon/kitchen/utensil/fork = 6,
+ /obj/item/weapon/kitchenknife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,
+ /obj/item/clothing/suit/chef/classic = 2,
+ /obj/item/weapon/reagent_containers/food/condiment/pack/ketchup = 5,
+ /obj/item/weapon/reagent_containers/food/condiment/pack/hotsauce = 5,
+ /obj/item/weapon/kitchen/mould/bear = 1, /obj/item/weapon/kitchen/mould/worm = 1,
+ /obj/item/weapon/kitchen/mould/bean = 1, /obj/item/weapon/kitchen/mould/ball = 1,
+ /obj/item/weapon/kitchen/mould/cane = 1, /obj/item/weapon/kitchen/mould/cash = 1,
+ /obj/item/weapon/kitchen/mould/coin = 1, /obj/item/weapon/kitchen/mould/loli = 1)
contraband = list(/obj/item/weapon/kitchen/utensil/spoon = 2,/obj/item/weapon/kitchen/utensil/knife = 2,/obj/item/weapon/kitchen/rollingpin = 2, /obj/item/weapon/butch = 2)
/obj/machinery/vending/sovietsoda
@@ -1076,8 +1084,8 @@
//req_access_txt = "12" //Maintenance access
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
/obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5)
- contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2)
- premium = list(/obj/item/clothing/gloves/yellow = 1)
+ contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/color/fyellow = 2)
+ premium = list(/obj/item/clothing/gloves/color/yellow = 1)
/obj/machinery/vending/engivend
name = "Engi-Vend"
@@ -1097,7 +1105,7 @@
icon_deny = "engi-deny"
req_access_txt = "11"
products = list(/obj/item/clothing/under/rank/chief_engineer = 4,/obj/item/clothing/under/rank/engineer = 4,/obj/item/clothing/shoes/orange = 4,/obj/item/clothing/head/hardhat = 4,
- /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/yellow = 4, /obj/item/weapon/screwdriver = 12,
+ /obj/item/weapon/storage/belt/utility = 4,/obj/item/clothing/glasses/meson = 4,/obj/item/clothing/gloves/color/yellow = 4, /obj/item/weapon/screwdriver = 12,
/obj/item/weapon/crowbar = 12,/obj/item/weapon/wirecutters = 12,/obj/item/device/multitool = 12,/obj/item/weapon/wrench = 12,/obj/item/device/t_scanner = 12,
/obj/item/stack/cable_coil/heavyduty = 8, /obj/item/weapon/stock_parts/cell = 8, /obj/item/weapon/weldingtool = 8,/obj/item/clothing/head/welding = 8,
/obj/item/weapon/light/tube = 10,/obj/item/clothing/suit/fire = 4, /obj/item/weapon/stock_parts/scanning_module = 5,/obj/item/weapon/stock_parts/micro_laser = 5,
@@ -1211,7 +1219,7 @@
/obj/item/clothing/under/sundress=2,/obj/item/clothing/under/stripeddress = 1, /obj/item/clothing/under/sailordress = 1, /obj/item/clothing/under/redeveninggown = 1, /obj/item/clothing/under/blacktango=1,/obj/item/clothing/suit/jacket=3,
/obj/item/clothing/glasses/regular=2,/obj/item/clothing/head/sombrero=1,/obj/item/clothing/suit/poncho=1,
/obj/item/clothing/suit/ianshirt=1,/obj/item/clothing/shoes/laceup=2,/obj/item/clothing/shoes/black=4,
- /obj/item/clothing/shoes/sandal=1,
+ /obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,
/obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1)
contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=1)
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/under/pants/mustangjeans=1)
@@ -1225,4 +1233,19 @@
component_parts += V
component_parts += new /obj/item/weapon/vending_refill/clothing(0)
component_parts += new /obj/item/weapon/vending_refill/clothing(0)
- component_parts += new /obj/item/weapon/vending_refill/clothing(0)
\ No newline at end of file
+ component_parts += new /obj/item/weapon/vending_refill/clothing(0)
+
+/obj/machinery/vending/artvend
+ name = "ArtVend"
+ desc = "A vending machine for art supplies."
+ product_slogans = "Stop by for all your artistic needs!;Color the floors with crayons, not blood!;Don't be a starving artist, use ArtVend. ;Don't fart, do art!"
+ product_ads = "Just like Kindergarten!;Now with 1000% more vibrant colors!;Screwing with the janitor was never so easy!;Creativity is at the heart of every spessman."
+ vend_delay = 34
+ icon_state = "artvend"
+ products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/device/camera = 4,/obj/item/device/camera_film = 6,
+ /obj/item/weapon/storage/photo_album = 2,/obj/item/stack/wrapping_paper = 4,/obj/item/stack/packageWrap = 4,
+ /obj/item/weapon/storage/fancy/crayons = 4,/obj/item/weapon/hand_labeler = 4,/obj/item/weapon/paper = 10,
+ /obj/item/weapon/c_tube = 10,/obj/item/weapon/pen = 5,/obj/item/weapon/pen/blue = 5,
+ /obj/item/weapon/pen/red = 5)
+ contraband = list(/obj/item/toy/crayon/mime = 1,/obj/item/toy/crayon/rainbow = 1)
+ premium = list(/obj/item/weapon/contraband/poster = 5)
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 19108eec93d..361ecedb4e1 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -1,5 +1,6 @@
/obj/machinery/washing_machine
name = "Washing Machine"
+ desc = "Gets rid of those pesky bloodstains, or your money back!"
icon = 'icons/obj/machines/washing_machine.dmi'
icon_state = "wm_10"
density = 1
@@ -87,8 +88,8 @@
//world << "DEBUG: YUP! [new_icon_state] and [new_item_state]"
break
del(J)
- for(var/T in typesof(/obj/item/clothing/gloves))
- var/obj/item/clothing/gloves/G = new T
+ for(var/T in typesof(/obj/item/clothing/gloves/color))
+ var/obj/item/clothing/gloves/color/G = new T
//world << "DEBUG: [color] == [J.color]"
if(_color == G._color)
new_glove_icon_state = G.icon_state
@@ -137,13 +138,13 @@
J.name = new_jumpsuit_name
J.desc = new_desc
if(new_glove_icon_state && new_glove_item_state && new_glove_name)
- for(var/obj/item/clothing/gloves/G in contents)
+ for(var/obj/item/clothing/gloves/color/G in contents)
//world << "DEBUG: YUP! FOUND IT!"
G.item_state = new_glove_item_state
G.icon_state = new_glove_icon_state
G._color = _color
G.name = new_glove_name
- if(!istype(G, /obj/item/clothing/gloves/black/thief))
+ if(!istype(G, /obj/item/clothing/gloves/color/black/thief))
G.desc = new_desc
if(new_shoe_icon_state && new_shoe_name)
for(var/obj/item/clothing/shoes/S in contents)
@@ -265,7 +266,10 @@
return
if ( istype(W,/obj/item/clothing/gloves/furgloves ) )
user << "This item does not fit."
- return
+ return
+ if(W.flags & NODROP) //if "can't drop" item
+ user << "\The [W] is stuck to your hand, you cannot put it in the washing machine!"
+ return
if(contents.len < 5)
if ( state in list(1, 3) )
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index 22e89cfe000..1f14f105557 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -7,46 +7,33 @@
use_power = 0
anchored = 1
density = 1
-
- var/charges = 1
- var/insisting = 0
-
+ var/datum/mind/target
+ var/list/types = list("Owlman", "The Griffin")
/obj/machinery/wish_granter/attack_hand(var/mob/user as mob)
usr.set_machine(src)
- if(charges <= 0)
- user << "The Wish Granter lies silent."
- return
-
- else if(!istype(user, /mob/living/carbon/human))
+ if(!istype(user, /mob/living/carbon/human))
user << "You feel a dark stirring inside of the Wish Granter, something you want nothing of. Your instincts are better than any man's."
return
else if(is_special_character(user))
user << "Even to a heart as dark as yours, you know nothing good will come of this. Something instinctual makes you pull away."
- else if (!insisting)
- user << "Your first touch makes the Wish Granter stir, listening to you. Are you really sure you want to do this?"
- insisting++
-
else
user << "The power of the Wish Granter have turned you into the superhero the station deserves. You are a masked vigilante, and answer to no man. Will you use your newfound strength to protect the innocent, or will you hunt the guilty?"
- ticker.mode.traitors += user.mind
- user.mind.special_role = "The Hero The Station Deserves"
-
+ var/wish
+ if(types.len == 1)
+ wish = pick(types)
+ else
+ wish = input("You want to become...","Wish") as null|anything in types
var/mob/living/carbon/human/M = user
-
- var/wish = input("You want to...","Wish") as anything in list("Protect the innocent","Hunt the guilty")
switch(wish)
- if("Protect the innocent")
+ if("Owlman")
+ types -= "Owlman"
M.fully_replace_character_name(M.real_name, "Owlman")
- var/datum/objective/protect/protect = new
- protect.owner = user.mind
- user.mind.objectives += protect
-
for(var/obj/item/W in M)
M.unEquip(W)
@@ -64,12 +51,18 @@
M.regenerate_icons()
- if("Hunt the guilty")
- M.fully_replace_character_name(M.real_name, "The Griffin")
+ var/datum/objective/protect/protect = new
+ protect.owner = user.mind
+ if(target)
+ protect.target = target
+ else
+ protect.find_target()
+ target = protect.target
+ user.mind.objectives += protect
- var/datum/objective/assassinate/assasinate = new
- assasinate.owner = user.mind
- user.mind.objectives += assasinate
+ if("The Griffin")
+ types -= "The Griffin"
+ M.fully_replace_character_name(M.real_name, "The Griffin")
for(var/obj/item/W in M)
M.unEquip(W)
@@ -88,14 +81,25 @@
M.regenerate_icons()
+ var/datum/objective/assassinate/assasinate = new
+ assasinate.owner = user.mind
+ if(target)
+ assasinate.target = target
+ else
+ assasinate.find_target()
+ target = assasinate.target
+ user.mind.objectives += assasinate
+
+ ticker.mode.traitors += user.mind
+ user.mind.special_role = wish
+
var/obj_count = 1
for(var/datum/objective/OBJ in user.mind.objectives)
user << "Objective #[obj_count]: [OBJ.explanation_text]"
obj_count++
- charges--
- insisting = 0
+ //Time to hand out the powers, since they are currently generic
if (!(HULK in user.mutations))
user.dna.SetSEState(HULKBLOCK,1)
@@ -122,4 +126,14 @@
user.update_mutations()
+ //Remove the wishgranter or teleport it randomly on the station
+ if(!types.len)
+ user << "The wishgranter slowly fades into mist..."
+ qdel(src)
+ return
+ else
+ var/impact_area = findEventArea()
+ var/turf/T = pick(get_area_turfs(impact_area))
+ if(T)
+ src.loc = T
return
\ No newline at end of file
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index b5951d306c2..8ae16a4e054 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -27,7 +27,7 @@
name = "Seraph"
icon_state = "seraph"
initial_icon = "seraph"
- operation_req_access = list(access_cent_creed)
+ operation_req_access = list(access_cent_commander)
step_in = 3
health = 550
wreckage = /obj/effect/decal/mecha_wreckage/seraph
diff --git a/code/game/objects/closets/ert.dm b/code/game/objects/closets/ert.dm
index 27b8456bb6b..04845c338fa 100644
--- a/code/game/objects/closets/ert.dm
+++ b/code/game/objects/closets/ert.dm
@@ -13,7 +13,7 @@
sleep(2)
new /obj/item/clothing/head/helmet/space/ert/commander(src)
new /obj/item/clothing/suit/space/ert/commander(src)
- new /obj/item/weapon/plastique(src)
+ new /obj/item/weapon/c4(src)
new /obj/item/weapon/storage/belt/security/full(src)
new /obj/item/weapon/gun/energy/ionrifle(src)
new /obj/item/weapon/gun/energy/gun/nuclear(src)
@@ -37,7 +37,7 @@
sleep(2)
new /obj/item/clothing/head/helmet/space/ert/security(src)
new /obj/item/clothing/suit/space/ert/security(src)
- new /obj/item/weapon/plastique(src)
+ new /obj/item/weapon/c4(src)
new /obj/item/weapon/storage/belt/security/full(src)
new /obj/item/weapon/gun/energy/ionrifle(src)
new /obj/item/weapon/gun/energy/gun/nuclear(src)
diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm
index 226fcdcf456..db1952f145e 100644
--- a/code/game/objects/effects/decals/crayon.dm
+++ b/code/game/objects/effects/decals/crayon.dm
@@ -1,36 +1,23 @@
/obj/effect/decal/cleanable/crayon
name = "rune"
desc = "A rune drawn in crayon."
- icon = 'icons/obj/rune.dmi'
+ icon = 'icons/effects/crayondecal.dmi'
+ icon_state = "rune1"
layer = 2.1
anchored = 1
- examine()
- set src in view(2)
- ..()
- return
+/obj/effect/decal/cleanable/crayon/examine()
+ set src in view(2)
+ ..()
+ return
- New(location,main = "#FFFFFF",shade = "#000000",var/type = "rune")
- ..()
- loc = location
+/obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune")
+ ..()
+ loc = location
- name = type
- desc = "A [type] drawn in crayon."
+ name = e_name
+ desc = "A [name] drawn in crayon."
- switch(type)
- if("rune")
- type = "rune[rand(1,6)]"
- if("graffiti")
- type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa")
-
- var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1)
- var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1)
-
- mainOverlay.Blend(main,ICON_ADD)
- shadeOverlay.Blend(shade,ICON_ADD)
-
- overlays += mainOverlay
- overlays += shadeOverlay
-
- add_hiddenprint(usr)
\ No newline at end of file
+ icon_state = type
+ color = main
\ No newline at end of file
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index ad757325b95..fe8fe4138bd 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -1,100 +1,84 @@
/obj/item/toy/crayon/red
icon_state = "crayonred"
colour = "#DA0000"
- shadeColour = "#810C0C"
colourName = "red"
/obj/item/toy/crayon/orange
icon_state = "crayonorange"
colour = "#FF9300"
- shadeColour = "#A55403"
colourName = "orange"
/obj/item/toy/crayon/yellow
icon_state = "crayonyellow"
colour = "#FFF200"
- shadeColour = "#886422"
colourName = "yellow"
/obj/item/toy/crayon/green
icon_state = "crayongreen"
colour = "#A8E61D"
- shadeColour = "#61840F"
colourName = "green"
/obj/item/toy/crayon/blue
icon_state = "crayonblue"
colour = "#00B7EF"
- shadeColour = "#0082A8"
colourName = "blue"
/obj/item/toy/crayon/purple
icon_state = "crayonpurple"
colour = "#DA00FF"
- shadeColour = "#810CFF"
colourName = "purple"
+/obj/item/toy/crayon/white
+ icon_state = "crayonwhite"
+ colour = "#FFFFFF"
+ colourName = "white"
+
/obj/item/toy/crayon/mime
icon_state = "crayonmime"
desc = "A very sad-looking crayon."
colour = "#FFFFFF"
- shadeColour = "#000000"
colourName = "mime"
uses = 0
-/obj/item/toy/crayon/mime/attack_self(mob/living/user as mob) //inversion
- if(colour != "#FFFFFF" && shadeColour != "#000000")
- colour = "#FFFFFF"
- shadeColour = "#000000"
- user << "You will now draw in white and black with this crayon."
+/obj/item/toy/crayon/mime/attack_self(mob/living/user as mob)
+ update_window(user)
+
+/obj/item/toy/crayon/mime/update_window(mob/living/user as mob)
+ dat += "
Change color"
+ ..()
+
+/obj/item/toy/crayon/mime/Topic(href,href_list)
+ if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
+ return
+ if(href_list["color"])
+ if(colour != "#FFFFFF")
+ colour = "#FFFFFF"
+ else
+ colour = "#000000"
+ update_window(usr)
else
- colour = "#000000"
- shadeColour = "#FFFFFF"
- user << "You will now draw in black and white with this crayon."
- return
+ ..()
/obj/item/toy/crayon/rainbow
icon_state = "crayonrainbow"
colour = "#FFF000"
- shadeColour = "#000FFF"
colourName = "rainbow"
uses = 0
/obj/item/toy/crayon/rainbow/attack_self(mob/living/user as mob)
- colour = input(user, "Please select the main colour.", "Crayon colour") as color
- shadeColour = input(user, "Please select the shade colour.", "Crayon colour") as color
- return
+ update_window(user)
-/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
- if(!proximity) return
- if(istype(target,/turf/simulated/floor))
- var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter")
- switch(drawtype)
- if("letter")
- drawtype = input("Choose the letter.", "Crayon scribbles") in list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
- user << "You start drawing a letter on the [target.name]."
- if("graffiti")
- user << "You start drawing graffiti on the [target.name]."
- if("rune")
- user << "You start drawing a rune on the [target.name]."
- if(instant || do_after(user, 50))
- new /obj/effect/decal/cleanable/crayon(target,colour,shadeColour,drawtype)
- user << "You finish drawing."
- if(uses)
- uses--
- if(!uses)
- user << "\red You used up your crayon!"
- del(src)
- return
+/obj/item/toy/crayon/rainbow/update_window(mob/living/user as mob)
+ dat += " Change color"
+ ..()
-/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
- if(M == user)
- user << "You take a bite of the crayon. Delicious!"
- user.nutrition += 5
- if(uses)
- uses -= 5
- if(uses <= 0)
- user << "\red You ate your crayon!"
- del(src)
+/obj/item/toy/crayon/rainbow/Topic(href,href_list[])
+
+ if(href_list["color"])
+ var/temp = input(usr, "Please select colour.", "Crayon colour") as color
+ if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
+ return
+ colour = temp
+ update_window(usr)
else
..()
\ No newline at end of file
diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm
index b5d14aa8982..2c2c5d9ea07 100644
--- a/code/game/objects/items/devices/paicard.dm
+++ b/code/game/objects/items/devices/paicard.dm
@@ -286,6 +286,8 @@
src.overlays.Cut()
src.overlays += "pai-off"
+/obj/item/device/paicard
+ var/current_emotion = 1
/obj/item/device/paicard/proc/setEmotion(var/emotion)
if(pai)
src.overlays.Cut()
@@ -299,6 +301,7 @@
if(7) src.overlays += "pai-sad"
if(8) src.overlays += "pai-angry"
if(9) src.overlays += "pai-what"
+ current_emotion = emotion
/obj/item/device/paicard/proc/alertUpdate()
var/turf/T = get_turf_or_move(src.loc)
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 2c112dc12d0..e16d07ec59b 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -21,13 +21,6 @@
origin_tech = "syndicate=3"
syndie = 1 //Signifies that it de-crypts Syndicate transmissions
-/obj/item/device/encryptionkey/syndicate/hacked
- name = "Standard Encryption Key"
- desc = "An encryption key for a radio headset. Has no special codes in it. Looks more sophisticated than usual."
- channels = list("Command" = 0, "Security" = 0, "Engineering" = 0, "Science" = 0, "Medical" = 0, "Supply" = 0, "Service" = 0, "Syndicate" = 1)
- origin_tech = "syndicate=3"
- syndie = 1
-
/obj/item/device/encryptionkey/binary
name = "binary translator key"
desc = "An encryption key for a radio headset. To access the binary channel, use :b."
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
deleted file mode 100644
index 577dba2fdbe..00000000000
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ /dev/null
@@ -1,180 +0,0 @@
-/obj/item/device/suit_cooling_unit
- name = "portable suit cooling unit"
- desc = "A portable heat sink and liquid cooled radiator that can be hooked up to a space suit's existing temperature controls to provide industrial levels of cooling."
- w_class = 4
- icon = 'icons/obj/device.dmi'
- icon_state = "suitcooler0"
- slot_flags = SLOT_BACK //you can carry it on your back if you want, but it won't do anything unless attached to suit storage
-
- //copied from tank.dm
- flags = CONDUCT
- force = 5.0
- throwforce = 10.0
- throw_speed = 1
- throw_range = 4
-
- origin_tech = "magnets=2;materials=2"
-
- var/on = 0 //is it turned on?
- var/cover_open = 0 //is the cover open?
- var/obj/item/weapon/stock_parts/cell/cell
- var/max_cooling = 12 //in degrees per second - probably don't need to mess with heat capacity here
- var/charge_consumption = 16.6 //charge per second at max_cooling
- var/thermostat = T20C
-
- //TODO: make it heat up the surroundings when not in space
-
-/obj/item/device/suit_cooling_unit/New()
- cell = new/obj/item/weapon/stock_parts/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find
- cell.loc = src
-
-/obj/item/device/suit_cooling_unit/proc/cool_mob(mob/M)
- if (!on || !cell) return
-
- //make sure they have a suit and we are attached to it
- if (!attached_to_suit(M))
- return
-
- var/mob/living/carbon/human/H = M
-
- var/efficiency = H.get_pressure_protection() //you need to have a good seal for effective cooling
- var/env_temp = get_environment_temperature() //wont save you from a fire
- var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling)
-
- if (temp_adj < 0) //only cools, doesn't heat
- return
-
- var/charge_usage = (temp_adj/max_cooling)*charge_consumption
-
- H.bodytemperature -= temp_adj*efficiency
-
- cell.use(charge_usage)
-
- if(cell.charge <= 0)
- turn_off()
-
-/obj/item/device/suit_cooling_unit/proc/get_environment_temperature()
- if (ishuman(loc))
- var/mob/living/carbon/human/H = loc
- if(istype(H.loc, /obj/mecha))
- var/obj/mecha/M = loc
- return M.return_temperature()
- else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell))
- return H.loc:air_contents.temperature
-
- var/turf/T = get_turf(src)
- if(istype(T, /turf/space))
- return 0 //space has no temperature, this just makes sure the cooling unit works in space
-
- var/datum/gas_mixture/environment = T.return_air()
- if (!environment)
- return 0
-
- return environment.temperature
-
-/obj/item/device/suit_cooling_unit/proc/attached_to_suit(mob/M)
- if (!ishuman(M))
- return 0
-
- var/mob/living/carbon/human/H = M
-
- if (!H.wear_suit || H.s_store != src)
- return 0
-
- return 1
-
-/obj/item/device/suit_cooling_unit/proc/turn_on()
- if(!cell)
- return
- if(cell.charge <= 0)
- return
-
- on = 1
- updateicon()
-
-/obj/item/device/suit_cooling_unit/proc/turn_off()
- if (ismob(src.loc))
- src.loc << "\The [src] clicks and whines as it powers down." //let them know
- on = 0
- updateicon()
-
-/obj/item/device/suit_cooling_unit/attack_self(mob/user as mob)
- if(cover_open && cell)
- if(ishuman(user))
- user.put_in_hands(cell)
- else
- cell.loc = get_turf(loc)
-
- cell.add_fingerprint(user)
- cell.updateicon()
-
- user << "You remove the [src.cell]."
- src.cell = null
- updateicon()
- return
-
- //TODO use a UI like the air tanks
- if(on)
- turn_off()
- else
- turn_on()
- if (on)
- user << "You switch on the [src]."
-
-/obj/item/device/suit_cooling_unit/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if (istype(W, /obj/item/weapon/screwdriver))
- if(cover_open)
- cover_open = 0
- user << "You screw the panel into place."
- else
- cover_open = 1
- user << "You unscrew the panel."
- updateicon()
- return
-
- if (istype(W, /obj/item/weapon/stock_parts/cell))
- if(cover_open)
- if(cell)
- user << "There is a [cell] already installed here."
- else
- user.drop_item()
- W.loc = src
- cell = W
- user << "You insert the [cell]."
- updateicon()
- return
-
- return ..()
-
-/obj/item/device/suit_cooling_unit/proc/updateicon()
- if (cover_open)
- if (cell)
- icon_state = "suitcooler1"
- else
- icon_state = "suitcooler2"
- else
- icon_state = "suitcooler0"
-
-/obj/item/device/suit_cooling_unit/examine()
- set src in view(1)
-
- ..()
-
- if (on)
- if (attached_to_suit(src.loc))
- usr << "It's switched on and running."
- else
- usr << "It's switched on, but not attached to anything."
- else
- usr << "It is switched off."
-
- if (cover_open)
- if(cell)
- usr << "The panel is open, exposing the [cell]."
- else
- usr << "The panel is open."
-
- if (cell)
- usr << "The charge meter reads [round(cell.percent())]%."
- else
- usr << "It doesn't have a power cell installed."
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 4ad71cb9c93..5a5ae43957a 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -47,6 +47,14 @@ var/global/list/datum/stack_recipe/plastic_recipes = list ( \
new/datum/stack_recipe("plastic spoon", /obj/item/weapon/kitchen/utensil/pspoon, 1, on_floor = 1), \
new/datum/stack_recipe("plastic knife", /obj/item/weapon/kitchen/utensil/pknife, 1, on_floor = 1), \
new/datum/stack_recipe("plastic bag", /obj/item/weapon/storage/bag/plasticbag, 3, on_floor = 1), \
+ new/datum/stack_recipe("bear mould", /obj/item/weapon/kitchen/mould/bear, 1, on_floor = 1), \
+ new/datum/stack_recipe("worm mould", /obj/item/weapon/kitchen/mould/worm, 1, on_floor = 1), \
+ new/datum/stack_recipe("bean mould", /obj/item/weapon/kitchen/mould/bean, 1, on_floor = 1), \
+ new/datum/stack_recipe("ball mould", /obj/item/weapon/kitchen/mould/ball, 1, on_floor = 1), \
+ new/datum/stack_recipe("cane mould", /obj/item/weapon/kitchen/mould/cane, 1, on_floor = 1), \
+ new/datum/stack_recipe("cash mould", /obj/item/weapon/kitchen/mould/cash, 1, on_floor = 1), \
+ new/datum/stack_recipe("coin mould", /obj/item/weapon/kitchen/mould/coin, 1, on_floor = 1), \
+ new/datum/stack_recipe("sucker mould", /obj/item/weapon/kitchen/mould/loli, 1, on_floor = 1), \
)
var/global/list/datum/stack_recipe/clown_recipes = list ( \
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 320f9331427..69ab0899003 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -81,7 +81,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list ( \
throwforce = 10.0
flags = CONDUCT
origin_tech = "materials=1"
-
+
/obj/item/stack/sheet/metal/full/New()
..()
amount = 50
@@ -126,7 +126,7 @@ var/global/list/datum/stack_recipe/plasteel_recipes = list ( \
/obj/item/stack/sheet/plasteel/New(var/loc, var/amount=null)
recipes = plasteel_recipes
return ..()
-
+
/obj/item/stack/sheet/plasteel/full/New(var/loc, var/amount=null)
amount = 50
..(loc, amount)
@@ -188,6 +188,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \
new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \
new/datum/stack_recipe("folder", /obj/item/weapon/folder), \
+ new/datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube), \
)
/obj/item/stack/sheet/cardboard //BubbleWrap
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index dda1a4942c0..e5cd25994f5 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -438,20 +438,104 @@
desc = "A colourful crayon. Looks tasty. Mmmm..."
icon = 'icons/obj/crayons.dmi'
icon_state = "crayonred"
- slot_flags = SLOT_EARS
w_class = 1.0
attack_verb = list("attacked", "coloured")
var/colour = "#FF0000" //RGB
- var/shadeColour = "#220000" //RGB
+ var/drawtype = "rune"
+ var/list/graffiti = list("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","body","cyka")
+ var/list/letters = list("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z")
var/uses = 30 //0 for unlimited uses
var/instant = 0
var/colourName = "red" //for updateIcon purposes
+ var/dat
- suicide_act(mob/user)
- viewers(user) << "[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide."
- return (BRUTELOSS|OXYLOSS)
+/obj/item/toy/crayon/suicide_act(mob/user)
+ user.visible_message("[user] is jamming the [src.name] up \his nose and into \his brain. It looks like \he's trying to commit suicide.")
+ return (BRUTELOSS|OXYLOSS)
+/obj/item/toy/crayon/New()
+ ..()
+ name = "[colourName] crayon" //Makes crayons identifiable in things like grinders
+ drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1,6)]")
+/obj/item/toy/crayon/attack_self(mob/living/user as mob)
+ update_window(user)
+
+/obj/item/toy/crayon/proc/update_window(mob/living/user as mob)
+ dat += "Currently selected: [drawtype]
"
+ dat += "Random letterPick letter"
+ dat += "
"
+ dat += "Runes:
"
+ dat += "Random rune"
+ for(var/i = 1; i <= 6; i++)
+ dat += "Rune[i]"
+ if(!((i + 1) % 3)) //3 buttons in a row
+ dat += "
"
+ dat += "
"
+ graffiti.Find()
+ dat += "Graffiti:
"
+ dat += "Random graffiti"
+ var/c = 1
+ for(var/T in graffiti)
+ dat += "[T]"
+ if(!((c + 1) % 3)) //3 buttons in a row
+ dat += "
"
+ c++
+ dat += "
"
+ var/datum/browser/popup = new(user, "crayon", name, 300, 500)
+ popup.set_content(dat)
+ popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
+ popup.open()
+ dat = ""
+
+/obj/item/toy/crayon/Topic(href, href_list, hsrc)
+ var/temp = "a"
+ switch(href_list["type"])
+ if("random_letter")
+ temp = pick(letters)
+ if("letter")
+ temp = input("Choose the letter.", "Crayon scribbles") in letters
+ if("random_rune")
+ temp = "rune[rand(1,6)]"
+ if("random_graffiti")
+ temp = pick(graffiti)
+ else
+ temp = href_list["type"]
+ if ((usr.restrained() || usr.stat || usr.get_active_hand() != src))
+ return
+ drawtype = temp
+ update_window(usr)
+
+/obj/item/toy/crayon/afterattack(atom/target, mob/user as mob, proximity)
+ if(!proximity) return
+ if(istype(target,/turf/simulated/floor))
+ var/temp = "rune"
+ if(letters.Find(drawtype))
+ temp = "letter"
+ else if(graffiti.Find(drawtype))
+ temp = "graffiti"
+ user << "You start drawing a [temp] on the [target.name]."
+ if(instant || do_after(user, 50))
+ new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp)
+ user << "You finish drawing [temp]."
+ if(uses)
+ uses--
+ if(!uses)
+ user << "You used up your crayon!"
+ qdel(src)
+ return
+
+/obj/item/toy/crayon/attack(mob/M as mob, mob/user as mob)
+ if(M == user)
+ user << "You take a bite of the crayon. Delicious!"
+ user.nutrition += 5
+ if(uses)
+ uses -= 5
+ if(uses <= 0)
+ user << "You ate your crayon!"
+ qdel(src)
+ else
+ ..()
/*
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 67f28494dea..eb6b59b95cd 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -56,6 +56,10 @@
can
name = "crushed can"
icon_state = "cola"
+ gum
+ name = "chewed gum"
+ desc = "NOT free candy."
+ icon_state = "gum"
/obj/item/trash/attack(mob/M as mob, mob/living/user as mob)
return
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 0d6d6c97311..1965473e717 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -1,4 +1,4 @@
-/obj/item/weapon/plastique
+/obj/item/weapon/c4
name = "plastic explosives"
desc = "Used to put holes in specific areas without too much extra hole."
gender = PLURAL
@@ -13,11 +13,11 @@
var/atom/target = null
var/open_panel = 0
-/obj/item/weapon/plastique/New()
+/obj/item/weapon/c4/New()
wires = new(src)
..()
-/obj/item/weapon/plastique/suicide_act(var/mob/user)
+/obj/item/weapon/c4/suicide_act(var/mob/user)
. = (BRUTELOSS)
viewers(user) << "[user] activates the C4 and holds it above his head! It looks like \he's going out with a bang!"
var/message_say = "FOR NO RAISIN!"
@@ -44,7 +44,7 @@
explode(get_turf(user))
return .
-/obj/item/weapon/plastique/attackby(var/obj/item/I, var/mob/user, params)
+/obj/item/weapon/c4/attackby(var/obj/item/I, var/mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver))
open_panel = !open_panel
user << "You [open_panel ? "open" : "close"] the wire panel."
@@ -53,7 +53,7 @@
else
..()
-/obj/item/weapon/plastique/attack_self(mob/user as mob)
+/obj/item/weapon/c4/attack_self(mob/user as mob)
var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
if(newtime < 10)
newtime = 10
@@ -63,7 +63,7 @@
user << "Timer set for [timer] seconds."
-/obj/item/weapon/plastique/afterattack(atom/target as obj|turf, mob/user as mob, flag)
+/obj/item/weapon/c4/afterattack(atom/target as obj|turf, mob/user as mob, flag)
if (!flag)
return
if (ismob(target) || istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/item/clothing/accessory/storage) || istype(target, /obj/item/clothing/under))
@@ -90,7 +90,7 @@
spawn(timer*10)
explode(get_turf(target))
-/obj/item/weapon/plastique/proc/explode(var/location)
+/obj/item/weapon/c4/proc/explode(var/location)
if(!target)
target = get_atom_on_turf(src)
@@ -110,5 +110,5 @@
del(target)
del(src)
-/obj/item/weapon/plastique/attack(mob/M as mob, mob/user as mob, def_zone)
+/obj/item/weapon/c4/attack(mob/M as mob, mob/user as mob, def_zone)
return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/kitchen.dm b/code/game/objects/items/weapons/kitchen.dm
index b4288c7033c..9268883a017 100644
--- a/code/game/objects/items/weapons/kitchen.dm
+++ b/code/game/objects/items/weapons/kitchen.dm
@@ -7,6 +7,7 @@
* Kitchen knives
* Butcher's cleaver
* Rolling Pins
+ * Candy Moulds
*/
/obj/item/weapon/kitchen
@@ -214,4 +215,59 @@
w_class = 3.0
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
-/* Trays moved to /obj/item/weapon/storage/bag */
\ No newline at end of file
+/* Trays moved to /obj/item/weapon/storage/bag */
+
+/*
+ * Candy Moulds
+ */
+
+/obj/item/weapon/kitchen/mould
+ name = "generic candy mould"
+ desc = "You aren't sure what it's supposed to be."
+ icon_state = "mould"
+ force = 5
+ throwforce = 5
+ throw_speed = 3
+ throw_range = 3
+ w_class = 2.0
+ attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
+
+/obj/item/weapon/kitchen/mould/bear
+ name = "bear-shaped candy mould"
+ desc = "It has the shape of a small bear imprinted into it."
+ icon_state = "mould_bear"
+
+/obj/item/weapon/kitchen/mould/worm
+ name = "worm-shaped candy mould"
+ desc = "It has the shape of a worm imprinted into it."
+ icon_state = "mould_worm"
+
+/obj/item/weapon/kitchen/mould/bean
+ name = "bean-shaped candy mould"
+ desc = "It has the shape of a bean imprinted into it."
+ icon_state = "mould_bean"
+
+/obj/item/weapon/kitchen/mould/ball
+ name = "ball-shaped candy mould"
+ desc = "It has a small sphere imprinted into it."
+ icon_state = "mould_ball"
+
+/obj/item/weapon/kitchen/mould/cane
+ name = "cane-shaped candy mould"
+ desc = "It has the shape of a cane imprinted into it."
+ icon_state = "mould_cane"
+
+/obj/item/weapon/kitchen/mould/cash
+ name = "cash-shaped candy mould"
+ desc = "It has the shape and design of fake money imprinted into it."
+ icon_state = "mould_cash"
+
+/obj/item/weapon/kitchen/mould/coin
+ name = "coin-shaped candy mould"
+ desc = "It has the shape of a coin imprinted into it."
+ icon_state = "mould_coin"
+
+/obj/item/weapon/kitchen/mould/loli
+ name = "sucker mould"
+ desc = "It has the shape of a sucker imprinted into it."
+ icon_state = "mould_loli"
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 7424f685ef8..1756935eacb 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -128,6 +128,13 @@
name = "pulse pistol power cell"
maxcharge = 1600
+/obj/item/weapon/stock_parts/cell/ninja
+ name = "spider-clan power cell"
+ desc = "A standard ninja-suit power cell."
+ maxcharge = 10000
+ rating = 3
+ g_amt = 60
+
/obj/item/weapon/stock_parts/cell/emproof
name = "\improper EMP-proof cell"
desc = "An EMP-proof cell."
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 45bb865df0f..c81ff7d8dbc 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -299,4 +299,40 @@
name = "smiles von wiggleton"
desc = "A duffelbag designed to hold bananas and bike horns."
icon_state = "duffel-clown"
- item_state = "duffel-clown"
\ No newline at end of file
+ item_state = "duffel-clown"
+
+//ERT backpacks.
+/obj/item/weapon/storage/backpack/ert
+ name = "emergency response team backpack"
+ desc = "A spacious backpack with lots of pockets, used by members of the Nanotrasen Emergency Response Team."
+ icon_state = "ert_commander"
+ item_state = "backpack"
+
+//Commander
+/obj/item/weapon/storage/backpack/ert/commander
+ name = "emergency response team commander backpack"
+ desc = "A spacious backpack with lots of pockets, worn by the commander of a Nanotrasen Emergency Response Team."
+
+//Security
+/obj/item/weapon/storage/backpack/ert/security
+ name = "emergency response team security backpack"
+ desc = "A spacious backpack with lots of pockets, worn by security members of a Nanotrasen Emergency Response Team."
+ icon_state = "ert_security"
+
+//Engineering
+/obj/item/weapon/storage/backpack/ert/engineer
+ name = "emergency response team engineer backpack"
+ desc = "A spacious backpack with lots of pockets, worn by engineering members of a Nanotrasen Emergency Response Team."
+ icon_state = "ert_engineering"
+
+//Medical
+/obj/item/weapon/storage/backpack/ert/medical
+ name = "emergency response team medical backpack"
+ desc = "A spacious backpack with lots of pockets, worn by medical members of a Nanotrasen Emergency Response Team."
+ icon_state = "ert_medical"
+
+//Janitorial
+/obj/item/weapon/storage/backpack/ert/janitor
+ name = "emergency response team janitor backpack"
+ desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team."
+ icon_state = "ert_janitor"
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index b162ac95f0f..b1286930c42 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -135,10 +135,10 @@
..()
contents.Cut()
new /obj/item/weapon/kitchenknife/combat(src)
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/grenade/flashbang(src)
+ new /obj/item/weapon/melee/baton/loaded(src)
+ new /obj/item/device/flash(src)
new /obj/item/weapon/melee/telebaton(src)
- new /obj/item/weapon/restraints/handcuffs(src)
+ new /obj/item/weapon/grenade/flashbang(src)
/obj/item/weapon/storage/belt/soulstone
name = "soul stone belt"
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index cb04eeaccd3..d905730dbf8 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -64,7 +64,7 @@
new /obj/item/stack/cable_coil(src,30,color)
new /obj/item/stack/cable_coil(src,30,color)
if(prob(5))
- new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
else
new /obj/item/stack/cable_coil(src,30,color)
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index 710251b34d7..907a836e159 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -37,7 +37,10 @@
new /obj/item/weapon/gun/projectile/revolver(src)
new /obj/item/ammo_box/a357(src)
new /obj/item/weapon/card/emag(src)
- new /obj/item/weapon/plastique(src)
+ new /obj/item/weapon/c4(src)
+ new /obj/item/clothing/gloves/color/latex/nitrile(src)
+ new /obj/item/clothing/mask/gas/clown_hat(src)
+ new /obj/item/clothing/under/suit_jacket/really_black(src)
return
if("murder")
diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm
index 7c39f530ace..1533b5d2c51 100644
--- a/code/game/objects/items/weapons/tanks/tank_types.dm
+++ b/code/game/objects/items/weapons/tanks/tank_types.dm
@@ -125,6 +125,7 @@
/obj/item/weapon/tank/plasma/plasmaman
desc = "The lifeblood of plasmamen. Warning: Extremely flammable, do not inhale (unless you're a plasman)."
icon_state = "plasma_fr"
+ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD
/obj/item/weapon/tank/plasma/plasmaman/examine()
set src in usr
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 9b12b3dcc46..b5fb68105c2 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -97,7 +97,7 @@
prob(1);/obj/item/stack/packageWrap,\
prob(2);/obj/random/bomb_supply,\
prob(1);/obj/item/weapon/extinguisher,\
- prob(1);/obj/item/clothing/gloves/fyellow,\
+ prob(1);/obj/item/clothing/gloves/color/fyellow,\
prob(3);/obj/item/stack/cable_coil,\
prob(2);/obj/random/toolbox,\
prob(2);/obj/item/weapon/storage/belt/utility,\
diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
index 4a9669a9955..a72ae3d7e60 100644
--- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm
+++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm
@@ -61,8 +61,8 @@
sleep(2)
new /obj/item/clothing/glasses/eyepatch(src)
new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/gloves/swat(src)
- new /obj/item/clothing/gloves/swat(src)
+ new /obj/item/clothing/gloves/combat(src)
+ new /obj/item/clothing/gloves/combat(src)
new /obj/item/clothing/head/helmet/swat(src)
new /obj/item/clothing/head/helmet/swat(src)
new /obj/item/clothing/mask/gas(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
index 42e82b8af22..a641af29874 100644
--- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm
@@ -83,7 +83,7 @@
new /obj/item/weapon/storage/bag/trash(src)
new /obj/item/device/lightreplacer(src)
new /obj/item/weapon/holosign_creator(src)
- new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/head/soft/purple(src)
new /obj/item/weapon/watertank/janitor(src)
new /obj/item/weapon/storage/belt/janitor(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index 14fd16914cc..78e90703b9e 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -14,7 +14,7 @@
new /obj/item/clothing/under/rank/cargotech(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/radio/headset/headset_cargo(src)
- new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/head/soft(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
return
@@ -35,7 +35,7 @@
new /obj/item/clothing/under/rank/cargo(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/device/radio/headset/headset_cargo(src)
- new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/fingerless(src)
// new /obj/item/weapon/cartridge/quartermaster(src)
new /obj/item/clothing/suit/fire/firefighter(src)
new /obj/item/weapon/tank/emergency_oxygen(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 1fbd663ef9e..a5a082b0364 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -21,7 +21,7 @@
new /obj/item/clothing/under/rank/chief_engineer(src)
new /obj/item/clothing/head/hardhat/white(src)
new /obj/item/clothing/glasses/welding/superior(src)
- new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/cartridge/ce(src)
new /obj/item/device/radio/headset/heads/ce(src)
@@ -49,8 +49,8 @@
New()
..()
sleep(2)
- new /obj/item/clothing/gloves/yellow(src)
- new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
new /obj/item/weapon/storage/toolbox/electrical(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index ae57669c261..32162d519d4 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -245,7 +245,6 @@
new /obj/item/clothing/glasses/sunglasses(src)
new /obj/item/clothing/glasses/hud/health_advanced
new /obj/item/clothing/head/beret/centcom/officer(src)
- new /obj/item/clothing/under/rank/centcom_officer(src)
new /obj/item/clothing/suit/armor/vest/fluff/deus_blueshield(src)
new /obj/item/clothing/shoes/centcom(src)
new /obj/item/clothing/accessory/holster(src)
@@ -269,7 +268,6 @@
new /obj/item/device/paicard(src)
new /obj/item/device/flash(src)
new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/under/rank/centcom_officer(src)
new /obj/item/clothing/gloves/color/white(src)
new /obj/item/clothing/shoes/centcom(src)
new /obj/item/clothing/under/lawyer/oldman(src)
@@ -328,7 +326,7 @@
new /obj/item/clothing/suit/storage/det_suit(src)
new /obj/item/clothing/suit/storage/forensics/blue(src)
new /obj/item/clothing/suit/storage/forensics/red(src)
- new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/color/black(src)
new /obj/item/clothing/head/det_hat(src)
new /obj/item/clothing/shoes/brown(src)
new /obj/item/weapon/storage/box/evidence(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 4b4bd46a5ac..65581b09232 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -135,7 +135,7 @@
if(prob(20))
new /obj/item/device/multitool(src)
if(prob(5))
- new /obj/item/clothing/gloves/yellow(src)
+ new /obj/item/clothing/gloves/color/yellow(src)
if(prob(40))
new /obj/item/clothing/head/hardhat(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 90cee7c97a8..fcead78a565 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -296,8 +296,8 @@
new /obj/item/clothing/suit/storage/labcoat(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/clothing/shoes/black(src)
- new /obj/item/clothing/gloves/black(src)
- new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+ new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/head/soft/black(src)
new /obj/item/clothing/head/soft/black(src)
return
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 61dbe8e5e5c..38a08c66b45 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -416,6 +416,7 @@
for(var/mob/O in viewers(user, 4))
O.show_message("\blue The [src] was sliced apart by [user]!", 1, "\red You hear [src] coming apart.", 2)
destroy()
+ return
if(!(W.flags & ABSTRACT))
if(user.drop_item())
@@ -427,7 +428,7 @@
//Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf)
W.pixel_x = Clamp(text2num(click_params["icon-x"]) - 16, -(world.icon_size/2), world.icon_size/2)
W.pixel_y = Clamp(text2num(click_params["icon-y"]) - 16, -(world.icon_size/2), world.icon_size/2)
-
+
return
/obj/structure/table/proc/straight_table_check(var/direction)
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index f495914d42d..6acdc12dea0 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -285,18 +285,18 @@ var/can_call_ert
else
del(H)
- var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
+ //M.rebuild_appearance()
+ */
+
+ var/new_gender = alert(usr, "Please select your gender.", "Character Generation", "Male", "Female")
if (new_gender)
if(new_gender == "Male")
M.gender = MALE
else
M.gender = FEMALE
- //M.rebuild_appearance()
-*/
- M.gender = pick(MALE, FEMALE)
M.set_species("Human",1)
- M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics
+ M.dna.ready_dna(M)
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
@@ -368,15 +368,14 @@ var/can_call_ert
R.helmet.flags |= NODROP
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/commander(M), slot_back)
var/obj/item/weapon/card/id/W = new(src)
W.assignment = "Emergency Response Team Leader"
W.registered_name = M.real_name
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Commander)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += list(access_cent_general, access_cent_living, access_cent_medical, access_cent_storage, access_cent_thunder, access_cent_teleporter)
+ W.access = get_centcom_access(W.assignment)
M.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/device/pda/heads/pda = new(src)
@@ -428,7 +427,7 @@ var/can_call_ert
M.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/inflatable(M), slot_r_hand)
if("Janitorial")
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/purple(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/janitor, slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/janitor/full, slot_belt)
@@ -452,7 +451,7 @@ var/can_call_ert
R.helmet.flags |= NODROP
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/security(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(M), slot_glasses)
var/obj/item/weapon/card/id/W = new(src)
@@ -460,8 +459,7 @@ var/can_call_ert
W.registered_name = M.real_name
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Officer)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += list(access_cent_general, access_cent_living, access_cent_thunder)
+ W.access = get_centcom_access(W.assignment)
M.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/device/pda/heads/pda = new(src)
@@ -472,7 +470,8 @@ var/can_call_ert
M.equip_to_slot_or_del(pda, slot_wear_pda)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_s_store)
- M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/tank/emergency_oxygen/double/full(M), slot_r_store)
+ M.equip_to_slot_or_del(new /obj/item/weapon/restraints/handcuffs, slot_l_store)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/security/night(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/box/handcuffs(M), slot_in_backpack)
@@ -492,7 +491,7 @@ var/can_call_ert
R.helmet.flags |= NODROP
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/medical(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/hud/health/night(M), slot_glasses)
var/obj/item/weapon/card/id/W = new(src)
@@ -500,8 +499,7 @@ var/can_call_ert
W.registered_name = M.real_name
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Medic)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += list(access_cent_general, access_cent_living, access_cent_medical)
+ W.access = get_centcom_access(W.assignment)
M.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/device/pda/heads/pda = new(src)
@@ -525,7 +523,7 @@ var/can_call_ert
if("Engineering")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/advance(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/engineer(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/engineer(M), slot_wear_suit)
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
@@ -542,8 +540,7 @@ var/can_call_ert
W.registered_name = M.real_name
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Engineer)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += list(access_cent_general, access_cent_living, access_cent_storage)
+ W.access = get_centcom_access(W.assignment)
M.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/device/pda/heads/pda = new(src)
@@ -564,12 +561,10 @@ var/can_call_ert
M.equip_to_slot_or_del(new /obj/item/stack/sheet/plasteel/full(M), slot_in_backpack)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full/multitool(M), slot_belt)
-
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase/inflatable(M), slot_r_hand)
if("Janitorial")
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/galoshes(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/purple(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/ert/janitor(M), slot_wear_suit)
var/obj/item/clothing/suit/space/rig/R = M.wear_suit
@@ -578,7 +573,7 @@ var/can_call_ert
R.helmet.flags |= NODROP
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/swat(M), slot_wear_mask)
- M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
+ M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/ert/janitor(M), slot_back)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/janitor(M), slot_glasses)
var/obj/item/weapon/card/id/W = new(src)
@@ -586,8 +581,7 @@ var/can_call_ert
W.registered_name = M.real_name
W.name = "[M.real_name]'s ID Card (Emergency Response Team - Janitor)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += list(access_cent_general, access_cent_living, access_cent_storage)
+ W.access = get_centcom_access(W.assignment)
M.equip_to_slot_or_del(W, slot_wear_id)
var/obj/item/device/pda/heads/pda = new(src)
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 9514e9c7afd..1ff89a02a3f 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -13,6 +13,7 @@
var/d_state = 0
/turf/simulated/wall/r_wall/attack_hand(mob/user as mob)
+ user.changeNext_move(CLICK_CD_MELEE)
if (HULK in user.mutations)
if (prob(10) || rotting)
usr << text("\blue You smash through the wall.")
@@ -34,7 +35,7 @@
/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params)
-
+ user.changeNext_move(CLICK_CD_MELEE)
if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
user << "You don't have the dexterity to do this!"
return
@@ -286,7 +287,7 @@
else if( istype(W,/obj/item/apc_frame) )
var/obj/item/apc_frame/AH = W
AH.try_build(src)
-
+
else if(istype(W,/obj/item/newscaster_frame))
var/obj/item/newscaster_frame/AH = W
AH.try_build(src)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 6768fdf3afd..e954e5f95b1 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -3,9 +3,9 @@
name = "\proper space"
icon_state = "0"
- temperature = T0C
+ temperature = TCMB
thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT
-// heat_capacity = 700000 No.
+ heat_capacity = 700000
/turf/space/New()
if(!istype(src, /turf/space/transit))
diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm
index 4b1bba60671..91d3b5935a0 100644
--- a/code/game/vehicles/spacepods/spacepod.dm
+++ b/code/game/vehicles/spacepods/spacepod.dm
@@ -127,6 +127,7 @@
occupant2 << "[i]"
if(i == 0)
explosion(loc, 2, 4, 8)
+ qdel(src)
sleep(10)
update_icons()
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index 8bd0f7c4c47..b6e0a386cf5 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -734,7 +734,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("tunnel clown")//Tunnel clowns rule!
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask)
M.equip_to_slot_or_del(new /obj/item/clothing/head/chaplain_hood(M), slot_head)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear)
@@ -775,7 +775,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("dark lord")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
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/weapon/twohanded/dualsaber/red(M), slot_l_hand)
@@ -797,7 +797,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("assassin")
M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/black(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves)
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/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wcoat(M), slot_wear_suit)
@@ -812,7 +812,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
sec_briefcase.contents += new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow
sec_briefcase.contents += new /obj/item/weapon/gun/projectile/revolver/mateba
sec_briefcase.contents += new /obj/item/ammo_box/a357
- sec_briefcase.contents += new /obj/item/weapon/plastique
+ sec_briefcase.contents += new /obj/item/weapon/c4
M.equip_to_slot_or_del(sec_briefcase, slot_l_hand)
var/obj/item/device/pda/heads/pda = new(M)
@@ -855,8 +855,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.icon_state = "centcom"
W.item_state = "id_inv"
W.access = get_all_accesses()
- W.access += list("VIP Guest","Custodian","Thunderdome Overseer","Intel Officer","Medical Officer","Death Commando","Research Officer")
W.assignment = "Nanotrasen Navy Representative"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
@@ -878,9 +878,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Officer)"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Nanotrasen Navy Officer"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
@@ -904,26 +903,25 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/centcom/W = new(M)
W.name = "[M.real_name]'s ID Card (Nanotrasen Navy Captain)"
W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Nanotrasen Navy Captain"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_if_possible(W, slot_wear_id)
- if("emergency response team")
+ if("emergency response team member")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Emergency Response Team)"
+ W.name = "[M.real_name]'s ID Card (Emergency Response Team - Member)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
- W.assignment = "Emergency Response Team"
+ W.assignment = "Emergency Response Team Member"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -935,18 +933,17 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if("emergency response team leader")
M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes)
- M.equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(M), slot_gloves)
+ M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves)
M.equip_to_slot_or_del(new /obj/item/device/radio/headset/ert/alt(M), slot_l_ear)
M.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(M), slot_belt)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses)
M.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(M), slot_back)
var/obj/item/weapon/card/id/W = new(M)
- W.name = "[M.real_name]'s ID Card (Emergency Response Team Leader)"
+ W.name = "[M.real_name]'s ID Card (Emergency Response Team - Leader)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Emergency Response Team Leader"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -980,9 +977,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Special Operations Officer)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Special Operations Officer"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1010,9 +1006,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Special Operations Officer)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Special Operations Officer"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1039,7 +1034,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
-
if("blue wizard")
M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform)
M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(M), slot_wear_suit)
@@ -1116,9 +1110,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Deathsquad Officer)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Deathsquad Officer"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
@@ -1150,9 +1143,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
var/obj/item/weapon/card/id/W = new(M)
W.name = "[M.real_name]'s ID Card (Deathsquad Officer)"
W.icon_state = "centcom"
- W.access = get_all_accesses()
- W.access += get_all_centcom_access()
W.assignment = "Deathsquad Officer"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = M.real_name
M.equip_to_slot_or_del(W, slot_wear_id)
diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm
index 0c482941239..71e1ee4b38c 100644
--- a/code/modules/admin/verbs/striketeam.dm
+++ b/code/modules/admin/verbs/striketeam.dm
@@ -146,7 +146,7 @@ var/global/sent_strike_team = 0
equip_to_slot_or_del(new /obj/item/weapon/storage/box/flashbangs(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if (!leader_selected)
- equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
+ equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/disk/nuclear(src), slot_in_backpack)
@@ -168,9 +168,8 @@ var/global/sent_strike_team = 0
var/obj/item/weapon/card/id/W = new(src)
W.name = "[real_name]'s ID Card"
W.icon_state = "centcom"
- W.access = get_all_accesses()//They get full station access.
- W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access.
W.assignment = "Death Commando"
+ W.access = get_centcom_access(W.assignment)
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm
index 755bc91817e..b61e3573b9f 100644
--- a/code/modules/admin/verbs/striketeam_syndicate.dm
+++ b/code/modules/admin/verbs/striketeam_syndicate.dm
@@ -138,7 +138,7 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/strike(src), slot_wear_suit)
else
equip_to_slot_or_del(new /obj/item/clothing/suit/space/syndicate/black/red/strike(src), slot_wear_suit)
- equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
+ equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(src), slot_gloves)
if (!syndicate_leader_selected)
equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/syndicate/black/strike(src), slot_head)
else
@@ -151,10 +151,10 @@ var/global/sent_syndicate_strike_team = 0
equip_to_slot_or_del(new /obj/item/ammo_box/magazine/m45(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack)
- equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
+ equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_in_backpack)
if (!syndicate_leader_selected)
- equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_in_backpack)
+ equip_to_slot_or_del(new /obj/item/weapon/c4(src), slot_in_backpack)
equip_to_slot_or_del(new /obj/item/weapon/card/emag(src), slot_in_backpack)
else
equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_in_backpack)
@@ -171,8 +171,8 @@ var/global/sent_syndicate_strike_team = 0
W.name = "[real_name]'s ID Card"
W.icon_state = "id"
W.access = get_all_accesses()//They get full station access because obviously the syndicate has HAAAX, and can make special IDs for their most elite members.
- W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage, access_syndicate)//Let's add their forged CentCom access and syndicate access.
W.assignment = "Syndicate Commando"
+ W.access = get_syndicate_access(W.assignment)
W.registered_name = real_name
equip_to_slot_or_del(W, slot_wear_id)
diff --git a/code/modules/admin/verbs/vox_raiders.dm b/code/modules/admin/verbs/vox_raiders.dm
index e8f39bf6b3a..f53f3915bb1 100644
--- a/code/modules/admin/verbs/vox_raiders.dm
+++ b/code/modules/admin/verbs/vox_raiders.dm
@@ -8,7 +8,7 @@ var/global/vox_tick = 1
equip_to_slot_or_del(new /obj/item/clothing/under/vox/vox_robes(src), slot_w_uniform)
equip_to_slot_or_del(new /obj/item/clothing/shoes/magboots/vox(src), slot_shoes) // REPLACE THESE WITH CODED VOX ALTERNATIVES.
- equip_to_slot_or_del(new /obj/item/clothing/gloves/yellow/vox(src), slot_gloves) // AS ABOVE.
+ equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow/vox(src), slot_gloves) // AS ABOVE.
switch(vox_tick)
if(1) // Vox raider!
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 7fa81ce358e..0ede8d0ba98 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -100,7 +100,7 @@
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/armor/vest
corpseshoes = /obj/item/clothing/shoes/combat
- corpsegloves = /obj/item/clothing/gloves/swat
+ corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas
corpsehelmet = /obj/item/clothing/head/helmet/swat
@@ -116,7 +116,7 @@
corpseuniform = /obj/item/clothing/under/syndicate
corpsesuit = /obj/item/clothing/suit/space/rig/syndi
corpseshoes = /obj/item/clothing/shoes/combat
- corpsegloves = /obj/item/clothing/gloves/swat
+ corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
@@ -162,7 +162,7 @@
corpseback = /obj/item/weapon/storage/backpack/industrial
corpseshoes = /obj/item/clothing/shoes/orange
corpsebelt = /obj/item/weapon/storage/belt/utility/full
- corpsegloves = /obj/item/clothing/gloves/yellow
+ corpsegloves = /obj/item/clothing/gloves/color/yellow
corpsehelmet = /obj/item/clothing/head/hardhat
corpseid = 1
corpseidjob = "Station Engineer"
@@ -246,7 +246,7 @@
/obj/effect/landmark/corpse/miner
corpseradio = /obj/item/device/radio/headset/headset_cargo
corpseuniform = /obj/item/clothing/under/rank/miner
- corpsegloves = /obj/item/clothing/gloves/black
+ corpsegloves = /obj/item/clothing/gloves/fingerless
corpseback = /obj/item/weapon/storage/backpack/industrial
corpseshoes = /obj/item/clothing/shoes/black
corpseid = 1
@@ -280,7 +280,7 @@
corpseglasses = /obj/item/clothing/glasses/eyepatch
corpsemask = /obj/item/clothing/mask/cigarette/cigar/cohiba
corpsehelmet = /obj/item/clothing/head/centhat
- corpsegloves = /obj/item/clothing/gloves/swat
+ corpsegloves = /obj/item/clothing/gloves/combat
corpseshoes = /obj/item/clothing/shoes/combat
corpsepocket1 = /obj/item/weapon/lighter/zippo
corpseid = 1
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index cd646e76e77..43d9569ea39 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -157,6 +157,13 @@
else
src.DB_species_unlock("Slime People",45)
return
+ if("6")
+ if(karma <100)
+ usr << "You do not have enough karma!"
+ return
+ else
+ src.DB_species_unlock("Plasmaman",100)
+ return
if(href_list["KarmaRefund"])
var/type = href_list["KarmaRefundType"]
var/job = href_list["KarmaRefund"]
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 8c79383cc1a..33a75e7639c 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -246,7 +246,7 @@ BLIND // can't see anything
var/mask_adjusted = 0
var/ignore_maskadjust = 1
var/adjusted_flags = null
-
+
//Proc that moves gas/breath masks out of the way
/obj/item/clothing/mask/proc/adjustmask(var/mob/user)
if(!ignore_maskadjust)
@@ -334,7 +334,7 @@ BLIND // can't see anything
permeability_coefficient = 0.02
flags = STOPSPRESSUREDMAGE | THICKMATERIAL
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank)
slowdown = 2
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT||HIDETAIL
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index 7f592a2405b..77e31587c41 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -8,6 +8,7 @@
//var/darkness_view = 0//Base human is 2
//var/invisa_view = 0
var/prescription = 0
+ var/see_darkness = 1
/obj/item/clothing/glasses/meson
name = "Optical Meson Scanner"
@@ -20,13 +21,14 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
)
-
+
/obj/item/clothing/glasses/meson/night
name = "Night Vision Optical Meson Scanner"
desc = "An Optical Meson Scanner fitted with an amplified visible light spectrum overlay, providing greater visual clarity in darkness."
icon_state = "nvgmeson"
item_state = "glasses"
darkness_view = 8
+ see_darkness = 0
/obj/item/clothing/glasses/meson/prescription
name = "prescription mesons"
@@ -49,7 +51,7 @@
desc = "nothing"
icon_state = "purple"
item_state = "glasses"
-
+
/obj/item/clothing/glasses/janitor
name = "Janitorial Goggles"
desc = "These'll keep the soap out of your eyes."
@@ -63,6 +65,7 @@
item_state = "glasses"
origin_tech = "magnets=2"
darkness_view = 8
+ see_darkness = 0
species_fit = list("Vox")
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/eyes.dmi'
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 47d9875c2a9..9a52deadebc 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -26,6 +26,7 @@
icon_state = "healthhudnight"
item_state = "glasses"
darkness_view = 8
+ see_darkness = 0
/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M)
process_med_hud(M,1)
@@ -53,6 +54,7 @@
desc = "An advanced heads-up display which provides id data and vision in complete darkness."
icon_state = "securityhudnight"
darkness_view = 8
+ see_darkness = 0
/obj/item/clothing/glasses/hud/security/process_hud(var/mob/M)
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index e7b8b3ae64f..ecc763a1a49 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -1,4 +1,4 @@
-/obj/item/clothing/gloves/yellow
+/obj/item/clothing/gloves/color/yellow
desc = "These gloves will protect the wearer from electric shock."
name = "insulated gloves"
icon_state = "yellow"
@@ -14,7 +14,7 @@
power
var/next_shock = 0
-/obj/item/clothing/gloves/fyellow //Cheap Chinese Crap
+/obj/item/clothing/gloves/color/fyellow //Cheap Chinese Crap
desc = "These gloves are cheap copies of the coveted gloves, no way this can end badly."
name = "budget insulated gloves"
icon_state = "yellow"
@@ -30,7 +30,7 @@
New()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
-/obj/item/clothing/gloves/black
+/obj/item/clothing/gloves/color/black
desc = "These gloves are fire-resistant."
name = "black gloves"
icon_state = "black"
@@ -55,7 +55,7 @@
thief
pickpocket = 1
-/obj/item/clothing/gloves/orange
+/obj/item/clothing/gloves/color/orange
name = "orange gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "orange"
@@ -65,7 +65,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
-/obj/item/clothing/gloves/red
+/obj/item/clothing/gloves/color/red
name = "red gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "red"
@@ -75,7 +75,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
-/obj/item/clothing/gloves/rainbow
+/obj/item/clothing/gloves/color/rainbow
name = "rainbow gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "rainbow"
@@ -88,7 +88,7 @@
clown
_color = "clown"
-/obj/item/clothing/gloves/blue
+/obj/item/clothing/gloves/color/blue
name = "blue gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "blue"
@@ -98,7 +98,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
-/obj/item/clothing/gloves/purple
+/obj/item/clothing/gloves/color/purple
name = "purple gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "purple"
@@ -108,7 +108,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
-/obj/item/clothing/gloves/green
+/obj/item/clothing/gloves/color/green
name = "green gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "green"
@@ -118,7 +118,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
-/obj/item/clothing/gloves/grey
+/obj/item/clothing/gloves/color/grey
name = "grey gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "gray"
@@ -134,7 +134,7 @@
hop
_color = "hop" //Exists for washing machines. Is not different from gray gloves in any way.
-/obj/item/clothing/gloves/light_brown
+/obj/item/clothing/gloves/color/light_brown
name = "light brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "lightbrown"
@@ -144,7 +144,7 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/gloves.dmi'
)
-/obj/item/clothing/gloves/brown
+/obj/item/clothing/gloves/color/brown
name = "brown gloves"
desc = "A pair of gloves, they don't look special in any way."
icon_state = "brown"
@@ -170,8 +170,6 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
- cmo
- _color = "medical" //Exists for washing machines. Is not different from latex gloves in any way.
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
@@ -179,6 +177,7 @@
icon_state = "nitrile"
item_state = "nitrilegloves"
transfer_prints = FALSE
+ _color = "medical"
/obj/item/clothing/gloves/color/white
name = "white gloves"
@@ -188,7 +187,7 @@
_color="mime"
redcoat
- _color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
+ _color = "redcoat" //Exists for washing machines. Is not different from white gloves in any way.
/obj/item/clothing/gloves/color/captain
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 5f01aa4da95..8f6ba148430 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -1,3 +1,14 @@
+/obj/item/clothing/gloves/fingerless
+ name = "fingerless gloves"
+ desc = "Plain black gloves without fingertips for the hard working."
+ icon_state = "fingerless"
+ item_state = "fingerless"
+ _color = null //So they don't wash.
+ transfer_prints = TRUE
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
+ species_restricted = null
+
/obj/item/clothing/gloves/cyborg
desc = "beep boop borp"
name = "cyborg gloves"
@@ -8,23 +19,8 @@
sprite_sheets = list(
"Vox" = 'icons/mob/species/vox/mask.dmi'
)
-/obj/item/clothing/gloves/swat
- desc = "These tactical gloves are somewhat fire and impact-resistant."
- name = "\improper SWAT Gloves"
- icon_state = "black"
- item_state = "swat_gl"
- siemens_coefficient = 0.6
- permeability_coefficient = 0.05
- cold_protection = HANDS
- min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
- heat_protection = HANDS
- max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
- species_fit = list("Vox")
- sprite_sheets = list(
- "Vox" = 'icons/mob/species/vox/mask.dmi'
- )
-/obj/item/clothing/gloves/combat //Combined effect of SWAT gloves and insulated gloves
+/obj/item/clothing/gloves/combat
desc = "These tactical gloves are somewhat fire and impact resistant."
name = "combat gloves"
icon_state = "black"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index c8d1f5d32c5..ae2ab8902e7 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -113,4 +113,33 @@ obj/item/clothing/head/blob
icon_state = "blobhat"
item_state = "blobhat"
flags = HEADCOVERSEYES|HEADCOVERSMOUTH
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
\ No newline at end of file
+ flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+
+//Commander
+/obj/item/clothing/head/helmet/ert/command
+ name = "emergency response team commander helmet"
+ desc = "An in-atmosphere helmet worn by the commander of a NanoTrasen Emergency Response Team. Has blue highlights."
+
+//Security
+/obj/item/clothing/head/helmet/ert/security
+ name = "emergency response team security helmet"
+ desc = "An in-atmosphere helmet worn by security members of the NanoTrasen Emergency Response Team. Has red highlights."
+ icon_state = "erthelmet_sec"
+
+//Engineer
+/obj/item/clothing/head/helmet/ert/engineer
+ name = "emergency response team engineer helmet"
+ desc = "An in-atmosphere helmet worn by engineering members of the NanoTrasen Emergency Response Team. Has orange highlights."
+ icon_state = "erthelmet_eng"
+
+//Medical
+/obj/item/clothing/head/helmet/ert/medical
+ name = "emergency response team medical helmet"
+ desc = "A set of armor worn by medical members of the NanoTrasen Emergency Response Team. Has red and white highlights."
+ icon_state = "erthelmet_med"
+
+//Medical
+/obj/item/clothing/head/helmet/ert/janitor
+ name = "emergency response team janitor helmet"
+ desc = "A set of armor worn by janitorial members of the NanoTrasen Emergency Response Team. Has red and white highlights."
+ icon_state = "erthelmet_jan"
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm
index d367671e34f..8416945287f 100644
--- a/code/modules/clothing/spacesuits/alien.dm
+++ b/code/modules/clothing/spacesuits/alien.dm
@@ -173,7 +173,7 @@
_color = "vox-casual-2"
item_state = "vox-casual-2"
-/obj/item/clothing/gloves/yellow/vox
+/obj/item/clothing/gloves/color/yellow/vox
desc = "These bizarre gauntlets seem to be fitted for... bird claws?"
name = "insulated gauntlets"
icon_state = "gloves-vox"
diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm
index 6c20fbae7ee..49972acd934 100644
--- a/code/modules/clothing/spacesuits/plasmamen.dm
+++ b/code/modules/clothing/spacesuits/plasmamen.dm
@@ -1,16 +1,17 @@
// PLASMEN SHIT
// CAN'T WEAR UNLESS YOU'RE A PINK SKELLINGTON
/obj/item/clothing/suit/space/eva/plasmaman
- w_class = 3
- allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
- slowdown = 2
- armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 0)
+ name = "plasmaman suit"
+ desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
+ allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
+ slowdown = 0
+ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
max_heat_protection_temperature = SPACE_SUIT_MAX_HEAT_PROTECTION_TEMPERATURE
species_restricted = list("Plasmaman")
- flags = STOPSPRESSUREDMAGE | PLASMAGUARD
+ flags = STOPSPRESSUREDMAGE | PLASMAGUARD
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
@@ -19,10 +20,10 @@
var/extinguish_cooldown=10 SECONDS
var/extinguishes_left=10 // Yeah yeah, reagents, blah blah blah. This should be simple.
-/obj/item/clothing/suit/space/eva/plasmaman/examine()
- set src in view()
+/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..()
- usr << "There are [extinguishes_left] extinguisher canisters left in this suit."
+ user << "There are [extinguishes_left] extinguisher canisters left in this suit."
+
/obj/item/clothing/suit/space/eva/plasmaman/proc/Extinguish(var/mob/user)
var/mob/living/carbon/human/H=user
if(extinguishes_left)
@@ -35,7 +36,9 @@
H.ExtinguishMob()
/obj/item/clothing/head/helmet/space/eva/plasmaman
- flags = HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE | PLASMAGUARD
+ name = "plasmaman helmet"
+ desc = "A special containment helmet designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
+ flags = STOPSPRESSUREDMAGE | PLASMAGUARD
species_restricted = list("Plasmaman")
icon_state = "plasmaman_helmet0"
@@ -54,9 +57,10 @@
return
on = !on
icon_state = "[base_state][on]"
-// item_state = "rig[on]-[_color]"
if(on) user.SetLuminosity(user.luminosity + brightness_on)
else user.SetLuminosity(user.luminosity - brightness_on)
+ user.update_inv_head()
+
/obj/item/clothing/head/helmet/space/eva/plasmaman/pickup(mob/user)
if(on)
@@ -74,54 +78,103 @@
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/assistant
+ name = "plasmaman assistant suit"
icon_state = "plasmamanAssistant_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
+ name = "plasmaman assistant helmet"
icon_state = "plasmamanAssistant_helmet0"
base_state = "plasmamanAssistant_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/atmostech
+ name = "plasmaman atmospheric suit"
icon_state = "plasmamanAtmos_suit"
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
+ max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
+ name = "plasmaman atmospheric helmet"
icon_state = "plasmamanAtmos_helmet0"
base_state = "plasmamanAtmos_helmet"
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
+ max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
/obj/item/clothing/suit/space/eva/plasmaman/engineer
+ name = "plasmaman engineer suit"
icon_state = "plasmamanEngineer_suit"
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
+ name = "plasmaman engineer helmet"
icon_state = "plasmamanEngineer_helmet0"
base_state = "plasmamanEngineer_helmet"
+ armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
+
+/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
+ name = "plasmaman chief engineer suit"
+ icon_state = "plasmaman_CE"
+ max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
+ name = "plasmaman chief engineer helmet"
+ icon_state = "plasmaman_CE_helmet0"
+ base_state = "plasmaman_CE_helmet"
+ max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE
//SERVICE
/obj/item/clothing/suit/space/eva/plasmaman/botanist
+ name = "plasmaman botanist suit"
icon_state = "plasmamanBotanist_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/botanist
+ name = "plasmaman botanist helmet"
icon_state = "plasmamanBotanist_helmet0"
base_state = "plasmamanBotanist_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/chaplain
+ name = "plasmaman chaplain suit"
icon_state = "plasmamanChaplain_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/chaplain
+ name = "plasmaman chaplain helmet"
icon_state = "plasmamanChaplain_helmet0"
base_state = "plasmamanChaplain_helmet"
+/obj/item/clothing/suit/space/eva/plasmaman/clown
+ name = "plasmaman clown suit"
+ icon_state = "plasmaman_Clown"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
+ name = "plasmaman clown helmet"
+ icon_state = "plasmaman_Clown_helmet0"
+ base_state = "plasmaman_Clown_helmet"
+
+/obj/item/clothing/suit/space/eva/plasmaman/mime
+ name = "plasmaman mime suit"
+ icon_state = "plasmaman_Mime"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
+ name = "plasmaman mime helmet"
+ icon_state = "plasmaman_Mime_helmet0"
+ base_state = "plasmaman_Mime_helmet"
+
/obj/item/clothing/suit/space/eva/plasmaman/service
+ name = "plasmaman service suit"
icon_state = "plasmamanService_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/service
+ name = "plasmaman service helmet"
icon_state = "plasmamanService_helmet0"
base_state = "plasmamanService_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/janitor
+ name = "plasmaman janitor suit"
icon_state = "plasmamanJanitor_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
+ name = "plasmaman janitor helmet"
icon_state = "plasmamanJanitor_helmet0"
base_state = "plasmamanJanitor_helmet"
@@ -129,42 +182,151 @@
//CARGO
/obj/item/clothing/suit/space/eva/plasmaman/cargo
+ name = "plasmaman cargo suit"
icon_state = "plasmamanCargo_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/cargo
+ name = "plasmaman cargo helmet"
icon_state = "plasmamanCargo_helmet0"
base_state = "plasmamanCargo_helmet"
/obj/item/clothing/suit/space/eva/plasmaman/miner
+ name = "plasmaman miner suit"
icon_state = "plasmamanMiner_suit"
+ armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/miner
+ name = "plasmaman miner helmet"
icon_state = "plasmamanMiner_helmet0"
base_state = "plasmamanMiner_helmet"
+ armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
// MEDSCI
/obj/item/clothing/suit/space/eva/plasmaman/medical
+ name = "plasmaman medical suit"
icon_state = "plasmamanMedical_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
+ name = "plasmaman medical helmet"
icon_state = "plasmamanMedical_helmet0"
base_state = "plasmamanMedical_helmet"
+/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
+ name = "plasmaman paramedic suit"
+ icon_state = "plasmaman_Paramedic"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
+ name = "plasmaman paramedic helmet"
+ icon_state = "plasmaman_Paramedic_helmet0"
+ base_state = "plasmaman_Paramedic_helmet"
+
+/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
+ name = "plasmaman chemist suit"
+ icon_state = "plasmaman_Chemist"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
+ name = "plasmaman chemist helmet"
+ icon_state = "plasmaman_Chemist_helmet0"
+ base_state = "plasmaman_Chemist_helmet"
+
+/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
+ name = "plasmaman chief medical officer suit"
+ icon_state = "plasmaman_CMO"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
+ name = "plasmaman chief medical officer helmet"
+ icon_state = "plasmaman_CMO_helmet0"
+ base_state = "plasmaman_CMO_helmet"
+
/obj/item/clothing/suit/space/eva/plasmaman/science
+ name = "plasmaman scientist suit"
icon_state = "plasmamanScience_suit"
/obj/item/clothing/head/helmet/space/eva/plasmaman/science
+ name = "plasmaman scientist helmet"
icon_state = "plasmamanScience_helmet0"
base_state = "plasmamanScience_helmet"
+/obj/item/clothing/suit/space/eva/plasmaman/science/rd
+ name = "plasmaman research director suit"
+ icon_state = "plasmaman_RD"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
+ name = "plasmaman research director helmet"
+ icon_state = "plasmaman_RD_helmet0"
+ base_state = "plasmaman_RD_helmet"
+
//SECURITY
/obj/item/clothing/suit/space/eva/plasmaman/security
+ name = "plasmaman security suit"
icon_state = "plasmamanSecurity_suit"
+ armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
/obj/item/clothing/head/helmet/space/eva/plasmaman/security
+ name = "plasmaman security helmet"
icon_state = "plasmamanSecurity_helmet0"
- base_state = "plasmamanSecurity_helmet"
\ No newline at end of file
+ base_state = "plasmamanSecurity_helmet"
+ armor = list(melee = 30, bullet = 15, laser = 30,energy = 10, bomb = 10, bio = 100, rad = 50)
+
+/obj/item/clothing/suit/space/eva/plasmaman/security/hos
+ name = "plasmaman head of security suit"
+ icon_state = "plasmaman_HoS"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
+ name = "plasmaman head of security helmet"
+ icon_state = "plasmaman_HoS_helmet0"
+ base_state = "plasmaman_HoS_helmet"
+
+/obj/item/clothing/suit/space/eva/plasmaman/security/hop
+ name = "plasmaman head of personnel suit"
+ icon_state = "plasmaman_HoP"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
+ name = "plasmaman head of personnel helmet"
+ icon_state = "plasmaman_HoP_helmet0"
+ base_state = "plasmaman_HoP_helmet"
+
+/obj/item/clothing/suit/space/eva/plasmaman/security/captain
+ name = "plasmaman captain suit"
+ icon_state = "plasmaman_Captain"
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
+ name = "plasmaman captain helmet"
+ icon_state = "plasmaman_Captain_helmet0"
+ base_state = "plasmaman_Captain_helmet"
+
+//NUKEOPS
+
+/obj/item/clothing/suit/space/eva/plasmaman/nuclear
+ name = "blood red plasmaman suit"
+ icon_state = "plasmaman_Nukeops"
+ armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs)
+ siemens_coefficient = 0.6
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear
+ name = "blood red plasmaman helmet"
+ icon_state = "plasmaman_Nukeops_helmet0"
+ base_state = "plasmaman_Nukeops_helmet"
+ armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
+ siemens_coefficient = 0.6
+ var/obj/machinery/camera/camera
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/attack_self(mob/user)
+ if(camera)
+ ..(user)
+ else
+ camera = new /obj/machinery/camera(src)
+ camera.network = list("NUKE")
+ cameranet.removeCamera(camera)
+ camera.c_tag = user.name
+ user << "User scanned as [camera.c_tag]. Camera activated."
+
+/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/examine(mob/user)
+ ..()
+ if(get_dist(user,src) <= 1)
+ user << "This helmet has a built-in camera. It's [camera ? "" : "in"]active."
\ No newline at end of file
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index cfe77d56f56..d1fa45e2018 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -61,7 +61,7 @@
item_state = "eng_hardsuit"
slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd, /obj/item/device/suit_cooling_unit)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
species_restricted = list("exclude","Unathi","Tajaran","Skrell","Diona","Vox")
sprite_sheets = list(
@@ -320,7 +320,7 @@
item_state = "eng_hardsuit"
slowdown = 2
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
//Chief Engineer's rig
/obj/item/clothing/head/helmet/space/rig/elite
@@ -497,7 +497,7 @@
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
slowdown = 1
- allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
+ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical)
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
@@ -516,7 +516,7 @@
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
- allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
+ allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
siemens_coefficient = 0.7
diff --git a/code/modules/clothing/spacesuits/space_ninja.dm b/code/modules/clothing/spacesuits/space_ninja.dm
new file mode 100644
index 00000000000..acc53c3dc40
--- /dev/null
+++ b/code/modules/clothing/spacesuits/space_ninja.dm
@@ -0,0 +1,350 @@
+// ** BEGIN NINJA CLOTHING DEFINES **
+
+/obj/item/clothing/head/helmet/space/space_ninja
+ desc = "What may appear to be a simple black garment is in fact a highly sophisticated nano-weave helmet. Standard issue ninja gear."
+ name = "ninja hood"
+ icon_state = "s-ninja"
+ item_state = "s-ninja_hood"
+ armor = list(melee = 60, bullet = 60, laser = 45, energy = 15, bomb = 30, bio = 30, rad = 25)
+ unacidable = 1
+ siemens_coefficient = 0.2
+
+
+/obj/item/clothing/mask/gas/voice/space_ninja
+ name = "ninja mask"
+ desc = "A close-fitting mask that acts both as an air filter and a post-modern fashion statement."
+ icon_state = "s-ninja(norm)"
+ item_state = "s-ninja_mask"
+ unacidable = 1
+ siemens_coefficient = 0.2
+
+/obj/item/clothing/glasses/hud/space_ninja
+ name = "vision enhancement implant"
+ desc = "A high-tech ocular implant designed for Spider Clan operatives."
+ icon_state = "cybereye-off"
+ item_state = "eyepatch"
+ flags = NODROP
+
+ var/enabled = 0
+ var/energyConsumption = 0
+ var/antagHUDEnabled = 0
+ var/mesonEnabled = 0
+ var/materialEnabled = 0
+ var/thermalEnabled = 0
+
+/obj/item/clothing/suit/space/space_ninja
+ name = "ninja suit"
+ desc = "A unique, vaccum-proof suit of nano-enhanced armor designed specifically for Spider Clan assassins."
+ icon_state = "s-ninja"
+ item_state = "s-ninja_suit"
+ allowed = list(/obj/item/weapon/gun, /obj/item/ammo_box, /obj/item/weapon/melee/baton, /obj/item/weapon/tank, /obj/item/weapon/stock_parts/cell)
+ slowdown = 0
+ unacidable = 1
+ armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
+ siemens_coefficient = 0.2
+
+ var/suitActive = 0
+ var/suitBusy = 0
+
+ var/obj/item/weapon/stock_parts/cell/suitCell
+ var/obj/item/clothing/head/helmet/space/space_ninja/suitHood
+ var/obj/item/clothing/gloves/space_ninja/suitGloves
+ var/obj/item/clothing/shoes/space_ninja/suitShoes
+ var/obj/item/clothing/mask/gas/voice/space_ninja/suitMask
+ var/obj/item/clothing/glasses/hud/space_ninja/suitGlasses
+ var/mob/living/carbon/human/suitOccupant
+
+/obj/item/clothing/gloves/space_ninja
+ desc = "These nano-enhanced gloves insulate from electricity and provide fire resistance."
+ name = "ninja gloves"
+ icon_state = "s-ninja"
+ item_state = "s-ninja"
+ siemens_coefficient = 0
+ cold_protection = HANDS
+ min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = HANDS
+ max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ transfer_prints = FALSE
+
+
+/obj/item/clothing/shoes/space_ninja
+ name = "ninja shoes"
+ desc = "A pair of running shoes. Excellent for running and even better for smashing skulls."
+ icon_state = "s-ninja"
+ permeability_coefficient = 0.01
+ flags = NOSLIP
+ armor = list(melee = 60, bullet = 60, laser = 45,energy = 15, bomb = 30, bio = 30, rad = 30)
+ siemens_coefficient = 0.2
+ cold_protection = FEET
+ min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE
+ heat_protection = FEET
+ max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
+
+// ** END NINJA CLOTHING DEFINES **
+
+// ** BEGIN NINJA SUIT PROCS **
+
+/obj/item/clothing/suit/space/space_ninja/New()
+ suitCell = new/obj/item/weapon/stock_parts/cell/ninja // The Ninja starts out with a 10,000 energy cell.
+ if(suitCell.charge != suitCell.maxcharge)
+ suitCell.charge = suitCell.maxcharge
+
+/obj/item/clothing/suit/space/space_ninja/verb/toggle_suit()
+ set category = "Space Ninja - Equiptment"
+ set name = "Toggle Suit"
+
+ if(usr.mind.special_role == "Ninja")
+ if(suitBusy)
+ usr << "ERROR: Suit systems busy, cannot initiate [suitActive ? "de-activation" : "activation"] protocals at this time."
+ return
+
+ suitBusy = 1
+
+ if(suitActive && (alert("Confirm suit systems shutdown? This cannot be halted once it has started.", "Confirm Shutdown", "Yes", "No") == "Yes"))
+ usr << "Now de-initializing..."
+
+ sleep(15)
+ usr << "Logging off, [usr.real_name]. Shutting down SpiderOS."
+
+ sleep(10)
+ usr<< "Primary system status: OFFLINE.\nBackup system status: OFFLINE."
+
+ sleep(5)
+ usr<< "VOID-shift device status: OFFLINE.\nCLOAK-tech device status: OFFLINE."
+ //TODO: Shut down any active abilities
+
+ sleep(10)
+ usr<< "Disconnecting neural-net interface... Success."
+ usr.hud_used.instantiate()
+ usr.regenerate_icons()
+
+ sleep(5)
+ usr<< "Disengaging neural-net interface... Success."
+
+ sleep(10)
+ usr<< "Unsecuring external locking mechanism...\nNeural-net abolished.\nOperation status: FINISHED."
+ //TODO: Grant verbs
+ toggle_suit_lock(usr)
+ usr.regenerate_icons()
+ suitBusy = 0
+ suitActive = 0
+
+ else if(!suitActive) // Activate the suit.
+ usr << "Now initializing..."
+
+ sleep(15)
+ usr<< "Now establishing neural-net interface..."
+ if(usr.mind.special_role != "Ninja")
+ usr << "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
+ return
+
+ sleep(10)
+ usr<< "Neural-net established. Now monitoring brainwave pattern. \nBrainwave pattern GREEN, proceeding."
+
+ sleep(10)
+ usr<< "Securing external locking mechanism..."
+ if(!toggle_suit_lock(usr))
+ return
+
+ sleep(5)
+ usr<< "Suit secured, extending neural-net interface..."
+ usr.hud_used.human_hud('icons/mob/screen1_NinjaHUD.dmi',"#ffffff",255)
+ usr.regenerate_icons()
+
+ sleep(10)
+ usr<< "VOID-shift device status: ONLINE.\nCLOAK-tech device status:ONLINE"
+
+ sleep(5)
+ usr<< "Primary system status: ONLINE.\nBackup system status: ONLINE.\nCurrent energy capacity: [suitCell.charge]/[suitCell.maxcharge]."
+
+ sleep(10)
+ usr<< "All systems operational. Welcome to SpiderOS, [usr.real_name]."
+ //TODO: Grant ninja verbs here.
+ suitBusy = 0
+ suitActive = 1
+
+ else
+ suitBusy = 0
+ usr << "NOTICE: Suit de-activation protocals aborted."
+ else
+ usr << "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
+ return
+
+/obj/item/clothing/suit/space/space_ninja/proc/toggle_suit_lock(mob/living/carbon/human/user)
+ if(!suitActive)
+ if(!istype(user.wear_suit, /obj/item/clothing/suit/space/space_ninja))
+ user<< "ERROR: Unable to locate user.\nABORTING..."
+ return 0
+ if(!istype(user.head, /obj/item/clothing/head/helmet/space/space_ninja))
+ user<< "ERROR: Unable to locate hood.\nABORTING..."
+ return 0
+ if(!istype(user.gloves, /obj/item/clothing/gloves/space_ninja))
+ user<< "ERROR: Unable to locate gloves.\nABORTING..."
+ return 0
+ if(!istype(user.shoes, /obj/item/clothing/shoes/space_ninja))
+ user<< "ERROR: Unable to locate foot gear.\nABORTING..."
+ return 0
+ if(!istype(user.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja))
+ user<< "ERROR: Unable to locate mask.\nABORTING..."
+ return 0
+ if(!istype(user.glasses, /obj/item/clothing/glasses/hud/space_ninja))
+ user<< "WARNING: Unable to locate eye gear, vision enhancement unavailable.\nProceeding..."
+ else
+ suitGlasses = user.glasses
+ suitGlasses.enabled = 1
+ suitGlasses.icon_state = "cybereye-green"
+
+ suitHood = user.head
+ suitMask = user.wear_mask
+ suitGloves = user.gloves
+ suitShoes = user.shoes
+ suitOccupant = user
+
+ flags |= NODROP
+ suitHood.flags |= NODROP
+ suitMask.flags |= NODROP
+ suitGloves.flags |= NODROP
+ suitGloves.pickpocket = 1
+ suitShoes.flags |= NODROP
+ suitShoes.slowdown = -2
+
+ icon_state = (user.gender == MALE ? "s-ninjan" : "s-ninjanf")
+ suitGloves.icon_state = "s-ninjan"
+ suitGloves.item_state = "s-ninjan"
+
+ return 1
+
+ else
+ flags &= ~NODROP
+ suitHood.flags &= ~NODROP
+ suitMask.flags &= ~NODROP
+ if(suitGlasses)
+ suitGlasses.enabled = 0
+ suitGlasses.icon_state = "cybereye-off"
+ suitGloves.flags &= ~NODROP
+ suitGloves.pickpocket = 0
+ suitShoes.flags &= ~NODROP
+ suitShoes.slowdown = -1
+ icon_state = "s-ninja"
+ suitGloves.icon_state = "s-ninja"
+ suitGloves.item_state = "s-ninja"
+
+ suitHood = null
+ suitMask = null
+ suitGlasses = null
+ suitGloves = null
+ suitShoes = null
+ suitOccupant = null
+
+ return 1
+
+// ** END NINJA SUIT PROCS **
+
+// **BEGIN NINJA GLASSES PROCS**
+
+/obj/item/clothing/glasses/hud/space_ninja/process_hud(var/mob/M) // Antag HUD processing.
+
+ if(antagHUDEnabled) // We only process if the antag-vision mode is enabled.
+ if(!M) return
+ if(!M.client) return
+ var/client/C = M.client
+ for(var/mob/living/carbon/human/target in view(get_turf(M)))
+ if(M.see_invisible < target.invisibility)
+ continue
+ if(!C) continue
+ C.images += target.hud_list[SPECIALROLE_HUD]
+
+/obj/item/clothing/glasses/hud/space_ninja/verb/modifyHUD(mob/user as mob)
+ set category = "Space Ninja - Equiptment"
+ set name = "Modify Vision"
+
+ if(usr.mind.special_role != "Ninja")
+ usr << "FĆAL �Rr�R: µ§er n¤t rec¤gnized, c-c¤ntr-r¤£§-£§ £¤cked."
+ return
+
+ if(!enabled) // If the Ninja's suit is on and connected.
+ usr << "ERROR: No power supply detected, cannot activate optical implant."
+ return
+
+ if(!user) // The user var is, so far as I can tell, required to refresh the window after each click.
+ user = usr
+
+ /*
+ * Each vision type the Ninja enables will drain more from his suit's battery per tick.
+ * For instance, if the Ninja were to rn around with thermals and AntagHUD on he would be losing an additional 10 energy per tick.
+ * Current vision modes are:
+ * - Night
+ * - Meson (Turfs)
+ * - Material (Objects)
+ * - Thermal (Mobs)
+ * - Antag HUD
+ *
+ * -Dave
+ */
+ var/dat = {"
+ Night Vision (2E) - [darkness_view ? "ENABLED" : "DISABLED"]
+ Meson Scanner (2E) - [mesonEnabled ? "ENABLED" : "DISABLED"]
+ Material Scanner (4E) - [materialEnabled ? "ENABLED" : "DISABLED"]
+ Thermal Scanner (4E) - [thermalEnabled ? "ENABLED" : "DISABLED"]
+ Threat Identification HUD (6E) - [antagHUDEnabled ? "ENABLED" : "DISABLED"]
+ "}
+
+ var/datum/browser/popup = new(user, "SpiderOS", "SpiderOS Optical Interface", 310, 150)
+ popup.set_content(dat)
+ popup.open()
+
+
+/obj/item/clothing/glasses/hud/space_ninja/Topic(href, href_list)
+ if(usr.stat != 0 || !enabled)
+ return 1
+
+ if(href_list["night"])
+ darkness_view = (darkness_view ? 0 : 8)
+ see_darkness = (darkness_view ? 0 : 1)
+ energyConsumption += (darkness_view ? 2 : -2)
+ usr << "Light amplification [(darkness_view ? "ENABLED" : "DISABLED")]."
+
+ else if(href_list["meson"])
+ mesonEnabled = (mesonEnabled ? 0 : 1)
+
+ if(mesonEnabled)
+ vision_flags |= SEE_TURFS
+ else
+ vision_flags &= ~SEE_TURFS
+
+ energyConsumption += (mesonEnabled ? 2 : -2)
+ usr << "Meson scanning [(mesonEnabled ? "ENABLED" : "DISABLED")]."
+
+ else if(href_list["material"])
+ materialEnabled = (materialEnabled ? 0 : 1)
+
+ if(materialEnabled)
+ vision_flags |= SEE_OBJS
+ else
+ vision_flags &= ~SEE_OBJS
+
+ energyConsumption += (materialEnabled ? 4 : -4)
+ usr << "Material scanning [(materialEnabled ? "ENABLED" : "DISABLED")]."
+
+ else if(href_list["thermal"])
+ thermalEnabled = (thermalEnabled ? 0 : 1)
+
+ if(thermalEnabled)
+ vision_flags |= SEE_MOBS
+ invisa_view = 2
+ else
+ vision_flags &= ~SEE_MOBS
+ invisa_view = 0
+
+ energyConsumption += (thermalEnabled ? 4 : -4)
+ usr << "Thermal scanning [(thermalEnabled ? "ENABLED" : "DISABLED")]."
+
+ else if(href_list["antagHUD"])
+ antagHUDEnabled = (antagHUDEnabled ? 0 : 1)
+ energyConsumption += (antagHUDEnabled ? 6 : -6)
+ usr << "Threat identification HUD [(antagHUDEnabled ? "ENABLED" : "DISABLED")]."
+
+ modifyHUD(usr) // Re-call the verb to get a fresh version of the window.
+ return
+
+// **END NINJA GLASSES PROCS**
\ No newline at end of file
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 627b5e8a0b9..3fbbd72e0bc 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -243,4 +243,41 @@
desc = "Pukish armor."
icon_state = "tdgreen"
item_state = "tdgreen"
- siemens_coefficient = 1
\ No newline at end of file
+ siemens_coefficient = 1
+
+//Non-hardsuit ERT armor.
+/obj/item/clothing/suit/armor/vest/ert
+ name = "emergency response team armor"
+ desc = "A set of armor worn by members of the Nanotrasen Emergency Response Team."
+ icon_state = "ertarmor_cmd"
+ item_state = "armor"
+ armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 20, bio = 0, rad = 0)
+
+//Commander
+/obj/item/clothing/suit/armor/vest/ert/command
+ name = "emergency response team commander armor"
+ desc = "A set of armor worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights."
+
+//Security
+/obj/item/clothing/suit/armor/vest/ert/security
+ name = "emergency response team security armor"
+ desc = "A set of armor worn by security members of the Nanotrasen Emergency Response Team. Has red highlights."
+ icon_state = "ertarmor_sec"
+
+//Engineer
+/obj/item/clothing/suit/armor/vest/ert/engineer
+ name = "emergency response team engineer armor"
+ desc = "A set of armor worn by engineering members of the Nanotrasen Emergency Response Team. Has orange highlights."
+ icon_state = "ertarmor_eng"
+
+//Medical
+/obj/item/clothing/suit/armor/vest/ert/medical
+ name = "emergency response team medical armor"
+ desc = "A set of armor worn by medical members of the Nanotrasen Emergency Response Team. Has red and white highlights."
+ icon_state = "ertarmor_med"
+
+//Janitorial
+/obj/item/clothing/suit/armor/vest/ert/janitor
+ name = "emergency response team janitor armor"
+ desc = "A set of armor worn by janitorial members of the Nanotrasen Emergency Response Team. Has red and white highlights."
+ icon_state = "ertarmor_jan"
\ No newline at end of file
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 8672b135934..7f8abfb3fe1 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -228,6 +228,34 @@
return
usr.update_inv_wear_suit() //so our overlays update
+/obj/item/clothing/suit/storage/ntrep
+ name = "NanoTrasen Representative Jacket"
+ desc = "A fancy black jacket, standard issue to NanoTrasen Represenatives."
+ icon_state = "ntrep"
+ item_state = "ia_jacket"
+ blood_overlay_type = "coat"
+ body_parts_covered = UPPER_TORSO|ARMS
+
+ verb/toggle()
+ set name = "Toggle Coat Buttons"
+ set category = "Object"
+ set src in usr
+
+ if(!usr.canmove || usr.stat || usr.restrained())
+ return 0
+
+ switch(icon_state)
+ if("ntrep_open")
+ src.icon_state = "ntrep"
+ usr << "You button up the jacket."
+ if("ntrep")
+ src.icon_state = "ntrep_open"
+ usr << "You unbutton the jacket."
+ else
+ usr << "You attempt to button-up the velcro on your [src], before promptly realising how retarded you are."
+ return
+ usr.update_inv_wear_suit() //so our overlays update
+
//Medical
/obj/item/clothing/suit/storage/fr_jacket
name = "first responder jacket"
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 6510fff5094..ece479485c3 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -131,6 +131,18 @@
"Vox" = 'icons/mob/species/vox/uniform.dmi'
)
+/obj/item/clothing/under/rank/ntrep
+ desc = "A well-ironed dress shirt and matching set of black pants."
+ name = "dress shirt"
+ icon_state = "internalaffairs"
+ item_state = "internalaffairs"
+ _color = "internalaffairs"
+ flags = ONESIZEFITSALL
+ species_fit = list("Vox")
+ sprite_sheets = list(
+ "Vox" = 'icons/mob/species/vox/uniform.dmi'
+ )
+
/obj/item/clothing/under/rank/janitor
desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 114b0c16db3..3b9874b9a4a 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -109,6 +109,14 @@
displays_id = 0
flags = ONESIZEFITSALL
+/obj/item/clothing/under/rank/blueshield
+ name = "blueshield uniform"
+ desc = "A short-sleeved black uniform, paired with grey digital-camo cargo pants. Standard issue to Blueshield officers."
+ icon_state = "ert_uniform"
+ item_state = "bl_suit"
+ _color = "ert_uniform"
+ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+
/obj/item/clothing/under/space
name = "\improper NASA jumpsuit"
desc = "It has a NASA logo on it and is made of space-proofed materials."
@@ -652,4 +660,3 @@
icon_state = "griffin"
_color = "griffin"
flags = NODROP
-
\ No newline at end of file
diff --git a/code/modules/computer3/computers/card.dm b/code/modules/computer3/computers/card.dm
index 5c4a92f3227..978d597144e 100644
--- a/code/modules/computer3/computers/card.dm
+++ b/code/modules/computer3/computers/card.dm
@@ -342,6 +342,6 @@
return accesses
authenticate()
- if(access_cent_captain in reader.access)
+ if(access_cent_commander in reader.access)
return 1
return 0
\ No newline at end of file
diff --git a/code/modules/economy/Accounts_DB.dm b/code/modules/economy/Accounts_DB.dm
index ddd432d3dfc..1b798ca0d86 100644
--- a/code/modules/economy/Accounts_DB.dm
+++ b/code/modules/economy/Accounts_DB.dm
@@ -5,7 +5,7 @@
icon = 'icons/obj/computer.dmi'
icon_state = "aiupload"
density = 1
- req_one_access = list(access_hop, access_captain, access_cent_captain)
+ req_one_access = list(access_hop, access_captain, access_cent_commander)
var/receipt_num
var/machine_id = ""
var/obj/item/weapon/card/id/held_card
@@ -16,7 +16,7 @@
proc/get_access_level()
if (!held_card)
return 0
- if(access_cent_captain in held_card.access)
+ if(access_cent_commander in held_card.access)
return 2
else if(access_hop in held_card.access || access_captain in held_card.access)
return 1
diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm
index a6c8a3e74a4..ea56f8f28e4 100644
--- a/code/modules/economy/EFTPOS.dm
+++ b/code/modules/economy/EFTPOS.dm
@@ -179,7 +179,7 @@
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card))
var/obj/item/weapon/card/id/C = I
- if(access_cent_captain in C.access || access_hop in C.access || access_captain in C.access)
+ if(access_cent_commander in C.access || access_hop in C.access || access_captain in C.access)
access_code = 0
usr << "\icon[src]Access code reset to 0."
else if (istype(I, /obj/item/weapon/card/emag))
diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm
index 08614d68c9c..cdb1dc9a4b4 100644
--- a/code/modules/events/event_manager.dm
+++ b/code/modules/events/event_manager.dm
@@ -299,7 +299,7 @@
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
-/datum/event/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
+/proc/findEventArea() //Here's a nice proc to use to find an area for your event to land in!
var/area/candidate = null
var/list/safe_areas = list(
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 19405dfaf06..85be9cbe361 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -349,7 +349,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite
/obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\
/obj/item/device/chameleon, /obj/item/weapon/card/emag,\
/obj/item/weapon/storage/toolbox/syndicate, /obj/item/weapon/aiModule,\
- /obj/item/device/radio/headset/syndicate, /obj/item/weapon/plastique,\
+ /obj/item/device/radio/headset/syndicate, /obj/item/weapon/c4,\
/obj/item/device/powersink, /obj/item/weapon/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/weapon/gun/energy/laser/captain,\
/obj/item/weapon/hand_tele, /obj/item/weapon/rcd, /obj/item/weapon/tank/jetpack,\
diff --git a/code/modules/food/candy_maker.dm b/code/modules/food/candy_maker.dm
new file mode 100644
index 00000000000..cfc3842e685
--- /dev/null
+++ b/code/modules/food/candy_maker.dm
@@ -0,0 +1,427 @@
+
+/obj/machinery/candy_maker
+ name = "candy machine"
+ desc = "The stuff of nightmares for a dentist."
+ icon = 'icons/obj/cooking_machines.dmi'
+ icon_state = "candymaker_off"
+ layer = 2.9
+ density = 1
+ anchored = 1
+ use_power = 1
+ idle_power_usage = 5
+ active_power_usage = 100
+ flags = OPENCONTAINER | NOREACT
+ var/operating = 0 // Is it on?
+ var/dirty = 0 // = {0..100} Does it need cleaning?
+ var/broken = 0 // ={0,1,2} How broken is it???
+ var/global/list/datum/recipe/available_recipes // List of the recipes you can use
+ var/global/list/acceptable_items // List of the items you can put in
+ var/global/list/acceptable_reagents // List of the reagents you can put in
+ var/global/max_n_of_items = 0
+ var/efficiency
+
+// see code/modules/food/recipes_candy.dm for recipes
+
+/*******************
+* Initialising
+********************/
+
+/obj/machinery/candy_maker/New()
+ //..() //do not need this
+ reagents = new/datum/reagents(100)
+ reagents.my_atom = src
+ if (!available_recipes)
+ available_recipes = new
+ for (var/type in (typesof(/datum/recipe/candy)-/datum/recipe/candy))
+ available_recipes+= new type
+ acceptable_items = new
+ acceptable_reagents = new
+ for (var/datum/recipe/candy/recipe in available_recipes)
+ for (var/item in recipe.items)
+ acceptable_items |= item
+ for (var/reagent in recipe.reagents)
+ acceptable_reagents |= reagent
+ if (recipe.items)
+ max_n_of_items = max(max_n_of_items,recipe.items.len)
+
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/candy_maker(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 5)
+ RefreshParts()
+
+
+/obj/machinery/candy_maker/upgraded/New()
+ ..()
+ component_parts = list()
+ component_parts += new /obj/item/weapon/circuitboard/candy_maker(null)
+ component_parts += new /obj/item/weapon/stock_parts/manipulator/pico(null)
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(null)
+ component_parts += new /obj/item/stack/cable_coil(null, 5)
+ RefreshParts()
+
+/obj/machinery/candy_maker/RefreshParts()
+ var/E
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ E += M.rating
+ efficiency = E
+
+/*******************
+* Item Adding
+********************/
+
+/obj/machinery/candy_maker/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+ if(operating)
+ return
+ if(!broken && dirty < 100)
+ if(default_deconstruction_screwdriver(user, "candymaker_open", "candymaker_off", O))
+ return
+ if(exchange_parts(user, O))
+ return
+ if(istype(O, /obj/item/weapon/wrench))
+ playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ if(anchored)
+ anchored = 0
+ user << "The [src] can now be moved."
+ return
+ else if(!anchored)
+ anchored = 1
+ user << "The [src] is now secured."
+ return
+
+ default_deconstruction_crowbar(O)
+
+ if(src.broken > 0)
+ if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
+ user.visible_message( \
+ "\blue [user] starts to fix part of the candy maker.", \
+ "\blue You start to fix part of the candy maker." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] fixes part of the candy maker.", \
+ "\blue You have fixed part of the candy maker." \
+ )
+ src.broken = 1 // Fix it a bit
+ else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
+ user.visible_message( \
+ "\blue [user] starts to fix part of the candy maker.", \
+ "\blue You start to fix part of the candy maker." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] fixes the candy maker.", \
+ "\blue You have fixed the candy maker." \
+ )
+ src.icon_state = "candymaker_off"
+ src.broken = 0 // Fix it!
+ src.dirty = 0 // just to be sure
+ src.flags = OPENCONTAINER
+ else
+ user << "\red It's broken!"
+ return 1
+ else if(src.dirty==100) // The candy_maker is all dirty so can't be used!
+ if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
+ user.visible_message( \
+ "\blue [user] starts to clean the candy maker.", \
+ "\blue You start to clean the candy maker." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] has cleaned the candy maker.", \
+ "\blue You have cleaned the candy maker." \
+ )
+ src.dirty = 0 // It's clean!
+ src.broken = 0 // just to be sure
+ src.icon_state = "candymaker_off"
+ src.flags = OPENCONTAINER
+ else //Otherwise bad luck!!
+ user << "\red It's dirty!"
+ return 1
+ else if(is_type_in_list(O,acceptable_items))
+ if (contents.len>=max_n_of_items)
+ user << "\red This [src] is full of ingredients, you cannot put more."
+ return 1
+ if (istype(O,/obj/item/stack) && O:amount>1)
+ new O.type (src)
+ O:use(1)
+ user.visible_message( \
+ "\blue [user] has added one of [O] to \the [src].", \
+ "\blue You add one of [O] to \the [src].")
+ else
+ // user.unEquip(O) //This just causes problems so far as I can tell. -Pete
+ if(!user.drop_item())
+ user << "\the [O] is stuck to your hand, you cannot put it in \the [src]"
+ return 0
+ O.loc = src
+ user.visible_message( \
+ "\blue [user] has added \the [O] to \the [src].", \
+ "\blue You add \the [O] to \the [src].")
+ else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
+ )
+ if (!O.reagents)
+ return 1
+ for (var/datum/reagent/R in O.reagents.reagent_list)
+ if (!(R.id in acceptable_reagents))
+ user << "\red Your [O] contains components unsuitable for cookery."
+ return 1
+ //G.reagents.trans_to(src,G.amount_per_transfer_from_this)
+ else if(istype(O,/obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = O
+ user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
+ return 1
+ else
+ user << "\red You have no idea what you can cook with this [O]."
+ return 1
+ src.updateUsrDialog()
+
+/obj/machinery/candy_maker/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/candy_maker/attack_ai(mob/user as mob)
+ return 0
+
+/obj/machinery/candy_maker/attack_hand(mob/user as mob)
+ user.set_machine(src)
+ interact(user)
+
+/*******************
+* candy_maker Menu
+********************/
+
+/obj/machinery/candy_maker/interact(mob/user as mob) // The Candy Maker Menu
+ if(panel_open || !anchored)
+ return
+ var/dat = ""
+ if(src.broken > 0)
+ dat = {"Bzzzzttttt"}
+ else if(src.operating)
+ var/whimsy_word = pick("Wonderizing", "Scrumpdiddlyumptiousification", "Miracle-coating", "Flavorifaction")
+ dat = {"[whimsy_word] in progress!
Please wait...!"}
+ else if(src.dirty==100)
+ dat = {"This candy maker is dirty!
Please clean it before use!"}
+ else
+ var/list/items_counts = new
+ var/list/items_measures = new
+ var/list/items_measures_p = new
+ for (var/obj/O in contents)
+ var/display_name = O.name
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
+ items_measures[display_name] = "egg"
+ items_measures_p[display_name] = "eggs"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
+ items_measures[display_name] = "tofu chunk"
+ items_measures_p[display_name] = "tofu chunks"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
+ items_measures[display_name] = "slab of meat"
+ items_measures_p[display_name] = "slabs of meat"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
+ display_name = "Turnovers"
+ items_measures[display_name] = "turnover"
+ items_measures_p[display_name] = "turnovers"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
+ items_measures[display_name] = "fillet of meat"
+ items_measures_p[display_name] = "fillets of meat"
+ items_counts[display_name]++
+ for (var/O in items_counts)
+ var/N = items_counts[O]
+ if (!(O in items_measures))
+ dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
+ else
+ if (N==1)
+ dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
+ else
+ dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
+
+ for (var/datum/reagent/R in reagents.reagent_list)
+ var/display_name = R.name
+ if (R.id == "capsaicin")
+ display_name = "Hotsauce"
+ if (R.id == "frostoil")
+ display_name = "Coldsauce"
+ dat += {"[display_name]: [R.volume] unit\s
"}
+
+ if (items_counts.len==0 && reagents.reagent_list.len==0)
+ dat = {"The candy maker is empty
"}
+ else
+ dat = {"Ingredients:
[dat]"}
+ dat += {"
\
+Turn on!
\
+Eject ingredients!
\
+"}
+
+ user << browse("Candy Maker Controls[dat]", "window=candy_maker")
+ onclose(user, "candy_maker")
+ return
+
+
+
+/***********************************
+* candy_maker Menu Handling/Cooking
+************************************/
+
+/obj/machinery/candy_maker/proc/cook()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ start()
+ if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
+ if (!wzhzhzh(10))
+ abort()
+ return
+ stop()
+ return
+
+ var/datum/recipe/recipe = select_recipe(available_recipes,src)
+ var/obj/cooked
+ var/obj/byproduct
+ if (!recipe)
+ dirty += 1
+ if (prob(max(10,dirty*5)))
+ if (!wzhzhzh(4))
+ abort()
+ return
+ muck_start()
+ wzhzhzh(4)
+ muck_finish()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else if (has_extra_item())
+ if (!wzhzhzh(4))
+ abort()
+ return
+ broke()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else
+ if (!wzhzhzh(10))
+ abort()
+ return
+ stop()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else
+ var/halftime = round(recipe.time/10/2)
+ if (!wzhzhzh(halftime))
+ abort()
+ return
+ if (!wzhzhzh(halftime))
+ abort()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ cooked = recipe.make_food(src)
+ byproduct = recipe.get_byproduct()
+ stop()
+ if(cooked)
+ cooked.loc = src.loc
+ for(var/i=1,iThe [src] can now be moved."
+ return
+ else if(!anchored)
+ anchored = 1
+ user << "The [src] is now secured."
+ return
+
+ default_deconstruction_crowbar(O)
+
+ if(src.broken > 0)
+ if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
+ user.visible_message( \
+ "\blue [user] starts to fix part of the grill.", \
+ "\blue You start to fix part of the grill." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] fixes part of the grill.", \
+ "\blue You have fixed part of the grill." \
+ )
+ src.broken = 1 // Fix it a bit
+ else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
+ user.visible_message( \
+ "\blue [user] starts to fix part of the grill.", \
+ "\blue You start to fix part of the grill." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] fixes the grill.", \
+ "\blue You have fixed the grill." \
+ )
+ src.icon_state = "grill_off"
+ src.broken = 0 // Fix it!
+ src.dirty = 0 // just to be sure
+ src.flags = OPENCONTAINER
+ else
+ user << "\red It's broken!"
+ return 1
+ else if(src.dirty==100) // The grill is all dirty so can't be used!
+ if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
+ user.visible_message( \
+ "\blue [user] starts to clean the grill.", \
+ "\blue You start to clean the grill." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] has cleaned the grill.", \
+ "\blue You have cleaned the grill." \
+ )
+ src.dirty = 0 // It's clean!
+ src.broken = 0 // just to be sure
+ src.icon_state = "grill_off"
+ src.flags = OPENCONTAINER
+ else //Otherwise bad luck!!
+ user << "\red It's dirty!"
+ return 1
+ else if(is_type_in_list(O,acceptable_items))
+ if (contents.len>=max_n_of_items)
+ user << "\red This [src] is full of ingredients, you cannot put more."
+ return 1
+ if (istype(O,/obj/item/stack) && O:amount>1)
+ new O.type (src)
+ O:use(1)
+ user.visible_message( \
+ "\blue [user] has added one of [O] to \the [src].", \
+ "\blue You add one of [O] to \the [src].")
+ else
+ // user.unEquip(O) //This just causes problems so far as I can tell. -Pete
+ if(!user.drop_item())
+ user << "\the [O] is stuck to your hand, you cannot put it in \the [src]"
+ return 0
+ O.loc = src
+ user.visible_message( \
+ "\blue [user] has added \the [O] to \the [src].", \
+ "\blue You add \the [O] to \the [src].")
+ else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
+ )
+ if (!O.reagents)
+ return 1
+ for (var/datum/reagent/R in O.reagents.reagent_list)
+ if (!(R.id in acceptable_reagents))
+ user << "\red Your [O] contains components unsuitable for cookery."
+ return 1
+ //G.reagents.trans_to(src,G.amount_per_transfer_from_this)
+ else if(istype(O,/obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = O
+ user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
+ return 1
+ else
+ user << "\red You have no idea what you can cook with this [O]."
+ return 1
+ src.updateUsrDialog()
+
+/obj/machinery/grill/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/grill/attack_ai(mob/user as mob)
+ return 0
+
+/obj/machinery/grill/attack_hand(mob/user as mob)
+ user.set_machine(src)
+ interact(user)
+
+/*******************
+* grill Menu
+********************/
+
+/obj/machinery/grill/interact(mob/user as mob) // The grill Menu
+ if(panel_open || !anchored)
+ return
+ var/dat = ""
+ if(src.broken > 0)
+ dat = {"Bzzzzttttt"}
+ else if(src.operating)
+ dat = {"Grilling in progress!
Please wait...!"}
+ else if(src.dirty==100)
+ dat = {"This grill is dirty!
Please clean it before use!"}
+ else
+ var/list/items_counts = new
+ var/list/items_measures = new
+ var/list/items_measures_p = new
+ for (var/obj/O in contents)
+ var/display_name = O.name
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
+ items_measures[display_name] = "egg"
+ items_measures_p[display_name] = "eggs"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
+ items_measures[display_name] = "tofu chunk"
+ items_measures_p[display_name] = "tofu chunks"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
+ items_measures[display_name] = "slab of meat"
+ items_measures_p[display_name] = "slabs of meat"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
+ display_name = "Turnovers"
+ items_measures[display_name] = "turnover"
+ items_measures_p[display_name] = "turnovers"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
+ items_measures[display_name] = "fillet of meat"
+ items_measures_p[display_name] = "fillets of meat"
+ items_counts[display_name]++
+ for (var/O in items_counts)
+ var/N = items_counts[O]
+ if (!(O in items_measures))
+ dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
+ else
+ if (N==1)
+ dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
+ else
+ dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
+
+ for (var/datum/reagent/R in reagents.reagent_list)
+ var/display_name = R.name
+ if (R.id == "capsaicin")
+ display_name = "Hotsauce"
+ if (R.id == "frostoil")
+ display_name = "Coldsauce"
+ dat += {"[display_name]: [R.volume] unit\s
"}
+
+ if (items_counts.len==0 && reagents.reagent_list.len==0)
+ dat = {"The grill is empty
"}
+ else
+ dat = {"Ingredients:
[dat]"}
+ dat += {"
\
+Turn on!
\
+Eject ingredients!
\
+"}
+
+ user << browse("grill Controls[dat]", "window=grill")
+ onclose(user, "grill")
+ return
+
+
+
+/***********************************
+* grill Menu Handling/Cooking
+************************************/
+
+/obj/machinery/grill/proc/cook()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ start()
+ if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
+ if (!wzhzhzh(10))
+ abort()
+ return
+ stop()
+ return
+
+ var/datum/recipe/recipe = select_recipe(available_recipes,src)
+ var/obj/cooked
+ if (!recipe)
+ dirty += 1
+ if (prob(max(10,dirty*5)))
+ if (!wzhzhzh(4))
+ abort()
+ return
+ muck_start()
+ wzhzhzh(4)
+ muck_finish()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else if (has_extra_item())
+ if (!wzhzhzh(4))
+ abort()
+ return
+ broke()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else
+ if (!wzhzhzh(10))
+ abort()
+ return
+ stop()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else
+ var/halftime = round(recipe.time/10/2)
+ if (!wzhzhzh(halftime))
+ abort()
+ return
+ if (!wzhzhzh(halftime))
+ abort()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ cooked = recipe.make_food(src)
+ stop()
+ if(cooked)
+ cooked.loc = src.loc
+ for(var/i=1,iThe [src] can now be moved."
+ return
+ else if(!anchored)
+ anchored = 1
+ user << "The [src] is now secured."
+ return
+
+ default_deconstruction_crowbar(O)
+
+ if(src.broken > 0)
+ if(src.broken == 2 && istype(O, /obj/item/weapon/screwdriver)) // If it's broken and they're using a screwdriver
+ user.visible_message( \
+ "\blue [user] starts to fix part of the oven.", \
+ "\blue You start to fix part of the oven." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] fixes part of the oven.", \
+ "\blue You have fixed part of the oven." \
+ )
+ src.broken = 1 // Fix it a bit
+ else if(src.broken == 1 && istype(O, /obj/item/weapon/wrench)) // If it's broken and they're doing the wrench
+ user.visible_message( \
+ "\blue [user] starts to fix part of the oven.", \
+ "\blue You start to fix part of the oven." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] fixes the oven.", \
+ "\blue You have fixed the oven." \
+ )
+ src.icon_state = "oven_off"
+ src.broken = 0 // Fix it!
+ src.dirty = 0 // just to be sure
+ src.flags = OPENCONTAINER
+ else
+ user << "\red It's broken!"
+ return 1
+ else if(src.dirty==100) // The oven is all dirty so can't be used!
+ if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them
+ user.visible_message( \
+ "\blue [user] starts to clean the oven.", \
+ "\blue You start to clean the oven." \
+ )
+ if (do_after(user,20))
+ user.visible_message( \
+ "\blue [user] has cleaned the oven.", \
+ "\blue You have cleaned the oven." \
+ )
+ src.dirty = 0 // It's clean!
+ src.broken = 0 // just to be sure
+ src.icon_state = "oven_off"
+ src.flags = OPENCONTAINER
+ else //Otherwise bad luck!!
+ user << "\red It's dirty!"
+ return 1
+ else if(is_type_in_list(O,acceptable_items))
+ if (contents.len>=max_n_of_items)
+ user << "\red This [src] is full of ingredients, you cannot put more."
+ return 1
+ if (istype(O,/obj/item/stack) && O:amount>1)
+ new O.type (src)
+ O:use(1)
+ user.visible_message( \
+ "\blue [user] has added one of [O] to \the [src].", \
+ "\blue You add one of [O] to \the [src].")
+ else
+ // user.unEquip(O) //This just causes problems so far as I can tell. -Pete
+ if(!user.drop_item())
+ user << "\the [O] is stuck to your hand, you cannot put it in \the [src]"
+ return 0
+ O.loc = src
+ user.visible_message( \
+ "\blue [user] has added \the [O] to \the [src].", \
+ "\blue You add \the [O] to \the [src].")
+ else if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/condiment) \
+ )
+ if (!O.reagents)
+ return 1
+ for (var/datum/reagent/R in O.reagents.reagent_list)
+ if (!(R.id in acceptable_reagents))
+ user << "\red Your [O] contains components unsuitable for cookery."
+ return 1
+ //G.reagents.trans_to(src,G.amount_per_transfer_from_this)
+ else if(istype(O,/obj/item/weapon/grab))
+ var/obj/item/weapon/grab/G = O
+ user << "\red This is ridiculous. You can not fit \the [G.affecting] in this [src]."
+ return 1
+ else
+ user << "\red You have no idea what you can cook with this [O]."
+ return 1
+ src.updateUsrDialog()
+
+/obj/machinery/oven/attack_paw(mob/user as mob)
+ return src.attack_hand(user)
+
+/obj/machinery/oven/attack_ai(mob/user as mob)
+ return 0
+
+/obj/machinery/oven/attack_hand(mob/user as mob)
+ user.set_machine(src)
+ interact(user)
+
+/*******************
+* oven Menu
+********************/
+
+/obj/machinery/oven/interact(mob/user as mob) // The oven Menu
+ if(panel_open || !anchored)
+ return
+ var/dat = ""
+ if(src.broken > 0)
+ dat = {"Bzzzzttttt"}
+ else if(src.operating)
+ dat = {"Baking in progress!
Please wait...!"}
+ else if(src.dirty==100)
+ dat = {"This oven is dirty!
Please clean it before use!"}
+ else
+ var/list/items_counts = new
+ var/list/items_measures = new
+ var/list/items_measures_p = new
+ for (var/obj/O in contents)
+ var/display_name = O.name
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
+ items_measures[display_name] = "egg"
+ items_measures_p[display_name] = "eggs"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/tofu))
+ items_measures[display_name] = "tofu chunk"
+ items_measures_p[display_name] = "tofu chunks"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/meat)) //any meat
+ items_measures[display_name] = "slab of meat"
+ items_measures_p[display_name] = "slabs of meat"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/donkpocket))
+ display_name = "Turnovers"
+ items_measures[display_name] = "turnover"
+ items_measures_p[display_name] = "turnovers"
+ if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/carpmeat))
+ items_measures[display_name] = "fillet of meat"
+ items_measures_p[display_name] = "fillets of meat"
+ items_counts[display_name]++
+ for (var/O in items_counts)
+ var/N = items_counts[O]
+ if (!(O in items_measures))
+ dat += {"[capitalize(O)]: [N] [lowertext(O)]\s
"}
+ else
+ if (N==1)
+ dat += {"[capitalize(O)]: [N] [items_measures[O]]
"}
+ else
+ dat += {"[capitalize(O)]: [N] [items_measures_p[O]]
"}
+
+ for (var/datum/reagent/R in reagents.reagent_list)
+ var/display_name = R.name
+ if (R.id == "capsaicin")
+ display_name = "Hotsauce"
+ if (R.id == "frostoil")
+ display_name = "Coldsauce"
+ dat += {"[display_name]: [R.volume] unit\s
"}
+
+ if (items_counts.len==0 && reagents.reagent_list.len==0)
+ dat = {"The oven is empty
"}
+ else
+ dat = {"Ingredients:
[dat]"}
+ dat += {"
\
+Turn on!
\
+Eject ingredients!
\
+"}
+
+ user << browse("oven Controls[dat]", "window=oven")
+ onclose(user, "oven")
+ return
+
+
+
+/***********************************
+* oven Menu Handling/Cooking
+************************************/
+
+/obj/machinery/oven/proc/cook()
+ if(stat & (NOPOWER|BROKEN))
+ return
+ start()
+ if (reagents.total_volume==0 && !(locate(/obj) in contents)) //dry run
+ if (!wzhzhzh(10))
+ abort()
+ return
+ stop()
+ return
+
+ var/datum/recipe/recipe = select_recipe(available_recipes,src)
+ var/obj/cooked
+ if (!recipe)
+ dirty += 1
+ if (prob(max(10,dirty*5)))
+ if (!wzhzhzh(4))
+ abort()
+ return
+ muck_start()
+ wzhzhzh(4)
+ muck_finish()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else if (has_extra_item())
+ if (!wzhzhzh(4))
+ abort()
+ return
+ broke()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else
+ if (!wzhzhzh(10))
+ abort()
+ return
+ stop()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ else
+ var/halftime = round(recipe.time/10/2)
+ if (!wzhzhzh(halftime))
+ abort()
+ return
+ if (!wzhzhzh(halftime))
+ abort()
+ cooked = fail()
+ cooked.loc = src.loc
+ return
+ cooked = recipe.make_food(src)
+ stop()
+ if(cooked)
+ cooked.loc = src.loc
+ for(var/i=1,i[totalkarma] total karma in your time here.
"}
Unlock Grey -- 30KP
Unlock Vox -- 45KP
Unlock Slime People -- 45KP
+ Unlock Plasmaman -- 100KP
"}
if (2) // Karma Refunds
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index f6c03ee308b..0e927cc2aee 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -28,7 +28,7 @@
new /obj/item/weapon/storage/backpack/satchel_eng(src)
new /obj/item/device/radio/headset/headset_cargo(src)
new /obj/item/clothing/under/rank/miner(src)
- new /obj/item/clothing/gloves/black(src)
+ new /obj/item/clothing/gloves/fingerless(src)
new /obj/item/clothing/shoes/black(src)
new /obj/item/device/mining_scanner(src)
new /obj/item/weapon/storage/bag/ore(src)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 8ab42b7ae1c..533c47a253d 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -9,7 +9,7 @@
opacity = 1
density = 1
blocks_air = 1
- temperature = T0C
+ temperature = TCMB
var/mineral/mineral
var/mined_ore = 0
var/last_act = 0
@@ -392,7 +392,7 @@
icon_state = "asteroid"
oxygen = 0.01
nitrogen = 0.01
- temperature = T0C
+ temperature = TCMB
icon_plating = "asteroid"
var/dug = 0 //0 = has not yet been dug, 1 = has already been dug
has_resources = 1
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 279755cc813..3e06137e7db 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -203,36 +203,40 @@
src << "You feel fatigued."
if((SKELETON in H.mutations) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
- else if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
- var/t_him = "it"
- if (src.gender == MALE)
- t_him = "him"
- else if (src.gender == FEMALE)
- t_him = "her"
- if (istype(src,/mob/living/carbon/human) && src:w_uniform)
- var/mob/living/carbon/human/H = src
- H.w_uniform.add_fingerprint(M)
- src.sleeping = max(0,src.sleeping-5)
- if(src.sleeping == 0)
- src.resting = 0
- AdjustParalysis(-3)
- AdjustStunned(-3)
- AdjustWeakened(-3)
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- M.visible_message( \
- "\blue [M] shakes [src] trying to wake [t_him] up!", \
- "\blue You shake [src] trying to wake [t_him] up!", \
- )
- // BEGIN HUGCODE - N3X
else
- if (istype(src,/mob/living/carbon/human) && src:w_uniform)
- var/mob/living/carbon/human/H = src
- H.w_uniform.add_fingerprint(M)
- playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- M.visible_message( \
- "\blue [M] gives [src] a [pick("hug","warm embrace")].", \
- "\blue You hug [src].", \
- )
+ if(player_logged)
+ M.visible_message("[M] shakes [src], but they do not respond. Probably suffering from SSD.", \
+ "You shake [src], but they are unresponsive. Probably suffering from SSD.")
+ if(lying) // /vg/: For hugs. This is how update_icon figgers it out, anyway. - N3X15
+ var/t_him = "it"
+ if (src.gender == MALE)
+ t_him = "him"
+ else if (src.gender == FEMALE)
+ t_him = "her"
+ if (istype(src,/mob/living/carbon/human) && src:w_uniform)
+ var/mob/living/carbon/human/H = src
+ H.w_uniform.add_fingerprint(M)
+ src.sleeping = max(0,src.sleeping-5)
+ if(src.sleeping == 0)
+ src.resting = 0
+ AdjustParalysis(-3)
+ AdjustStunned(-3)
+ AdjustWeakened(-3)
+ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ M.visible_message( \
+ "\blue [M] shakes [src] trying to wake [t_him] up!", \
+ "\blue You shake [src] trying to wake [t_him] up!", \
+ )
+ // BEGIN HUGCODE - N3X
+ else
+ if (istype(src,/mob/living/carbon/human) && src:w_uniform)
+ var/mob/living/carbon/human/H = src
+ H.w_uniform.add_fingerprint(M)
+ playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ M.visible_message( \
+ "\blue [M] gives [src] a [pick("hug","warm embrace")].", \
+ "\blue You hug [src].", \
+ )
/mob/living/carbon/proc/eyecheck()
@@ -481,6 +485,36 @@
legcuffed = null
update_inv_legcuffed(1)
+/mob/living/carbon/proc/get_temperature(var/datum/gas_mixture/environment)
+ var/loc_temp = T0C
+ if(istype(loc, /obj/mecha))
+ var/obj/mecha/M = loc
+ loc_temp = M.return_temperature()
+
+ else if(istype(loc, /obj/spacepod))
+ var/obj/spacepod/S = loc
+ loc_temp = S.return_temperature()
+
+ else if(istype(loc, /obj/structure/transit_tube_pod))
+ loc_temp = environment.temperature
+
+ else if(istype(get_turf(src), /turf/space))
+ var/turf/heat_turf = get_turf(src)
+ loc_temp = heat_turf.temperature
+
+ else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
+ var/obj/machinery/atmospherics/unary/cryo_cell/C = loc
+
+ if(C.air_contents.total_moles() < 10)
+ loc_temp = environment.temperature
+ else
+ loc_temp = C.air_contents.temperature
+
+ else
+ loc_temp = environment.temperature
+
+ return loc_temp
+
/mob/living/carbon/show_inv(mob/living/carbon/user as mob)
user.set_machine(src)
var/dat = {"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7906eac6111..e5145332701 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -435,30 +435,16 @@ emp_act
add_blood(source)
bloody_hands = amount
bloody_hands_mob = source
- if(istype(source,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = source
- if(H.species.bloodflags & BLOOD_GREEN)
- update_inv_gloves(1,1) //updates on-mob overlays for bloody hands and/or bloody gloves
- else
- update_inv_gloves(1,0) //updates on-mob overlays for bloody hands and/or bloody gloves
- else
- update_inv_gloves(1,0) //updates on-mob overlays for bloody hands and/or bloody gloves
+ update_inv_gloves(1) //updates on-mob overlays for bloody hands and/or bloody gloves
/mob/living/carbon/human/proc/bloody_body(var/mob/living/source)
if(wear_suit)
wear_suit.add_blood(source)
- update_inv_wear_suit(0,0)
+ update_inv_wear_suit(0)
return
if(w_uniform)
w_uniform.add_blood(source)
- if(istype(source,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = source
- if(H.species.bloodflags & BLOOD_GREEN)
- update_inv_w_uniform(1,1)
- else
- update_inv_w_uniform(1,0)
- else
- update_inv_w_uniform(1,0)
+ update_inv_w_uniform(1)
/mob/living/carbon/human/proc/handle_suit_punctures(var/damtype, var/damage)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4c03256ecb8..440252a136c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -141,72 +141,19 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
handle_vampire()
-//Much like get_heat_protection(), this returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
-/mob/living/carbon/human/proc/get_pressure_protection()
+/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
+ ..()
+ var/pressure_difference = abs( pressure - ONE_ATMOSPHERE )
+
var/pressure_adjustment_coefficient = 1 //Determins how much the clothing you are wearing protects you in percent.
-
- if(head && (head.flags & STOPSPRESSUREDMAGE))
- pressure_adjustment_coefficient -= PRESSURE_HEAD_REDUCTION_COEFFICIENT
-
- if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE))
- pressure_adjustment_coefficient -= PRESSURE_SUIT_REDUCTION_COEFFICIENT
-
- //Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure reduction.
- if(istype(wear_suit,/obj/item/clothing/suit/space))
- var/obj/item/clothing/suit/space/S = wear_suit
- if(S.can_breach && S.damage)
- var/pressure_loss = S.damage * 0.1
- pressure_adjustment_coefficient += pressure_loss
-
- pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) //So it isn't less than 0 or larger than 1.
-
- return 1 - pressure_adjustment_coefficient //want 0 to be bad protection, 1 to be good protection
-
-// Calculate how vulnerable the human is to under- and overpressure.
-// Returns 0 (equals 0 %) if sealed in an undamaged suit, 1 if unprotected (equals 100%).
-// Suitdamage can modifiy this in 10% steps.
-/mob/living/carbon/human/proc/get_pressure_weakness()
-
- var/pressure_adjustment_coefficient = 1 // Assume no protection at first.
-
if(wear_suit && (wear_suit.flags & STOPSPRESSUREDMAGE) && head && (head.flags & STOPSPRESSUREDMAGE)) // Complete set of pressure-proof suit worn, assume fully sealed.
pressure_adjustment_coefficient = 0
-
- // Handles breaches in your space suit. 10 suit damage equals a 100% loss of pressure protection.
- if(istype(wear_suit,/obj/item/clothing/suit/space))
- var/obj/item/clothing/suit/space/S = wear_suit
- if(S.can_breach && S.damage)
- pressure_adjustment_coefficient += S.damage * 0.1
-
- pressure_adjustment_coefficient = min(1,max(pressure_adjustment_coefficient,0)) // So it isn't less than 0 or larger than 1.
-
- return pressure_adjustment_coefficient
-
-/mob/living/carbon/human/calculate_affecting_pressure(var/pressure)
- var/pressure_difference
-
- // First get the absolute pressure difference.
- if(pressure < ONE_ATMOSPHERE) // We are in an underpressure.
- pressure_difference = ONE_ATMOSPHERE - pressure
-
- else //We are in an overpressure or standard atmosphere.
- pressure_difference = pressure - ONE_ATMOSPHERE
-
- if(pressure_difference < 5) // If the difference is small, don't bother calculating the fraction.
- pressure_difference = 0
-
- else
- // Otherwise calculate how much of that absolute pressure difference affects us, can be 0 to 1 (equals 0% to 100%).
- // This is our relative difference.
- pressure_difference *= get_pressure_weakness()
-
- // The difference is always positive to avoid extra calculations.
- // Apply the relative difference on a standard atmosphere to get the final result.
- // The return value will be the adjusted_pressure of the human that is the basis of pressure warnings and damage.
- if(pressure < ONE_ATMOSPHERE)
- return ONE_ATMOSPHERE - pressure_difference
- else
+ pressure_adjustment_coefficient = max(pressure_adjustment_coefficient,0) //So it isn't less than 0
+ pressure_difference = pressure_difference * pressure_adjustment_coefficient
+ if(pressure > ONE_ATMOSPHERE)
return ONE_ATMOSPHERE + pressure_difference
+ else
+ return ONE_ATMOSPHERE - pressure_difference
/mob/living/carbon/human
@@ -526,50 +473,25 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(!environment)
return
- //Moved pressure calculations here for use in skip-processing check.
- var/pressure = environment.return_pressure()
- var/adjusted_pressure = calculate_affecting_pressure(pressure)
+ var/loc_temp = get_temperature(environment)
+ //world << "Loc temp: [loc_temp] - Body temp: [bodytemperature] - Fireloss: [getFireLoss()] - Thermal protection: [get_thermal_protection()] - Fire protection: [thermal_protection + add_fire_protection(loc_temp)] - Heat capacity: [environment_heat_capacity] - Location: [loc] - src: [src]"
- if(!istype(get_turf(src), /turf/space)) //space is not meant to change your body temperature.
- var/loc_temp = T0C
- if(istype(loc, /obj/mecha))
- var/obj/mecha/M = loc
- loc_temp = M.return_temperature()
+ //Body temperature is adjusted in two steps. Firstly your body tries to stabilize itself a bit.
+ if(stat != 2)
+ stabilize_temperature_from_calories()
- if(istype(loc, /obj/spacepod))
- var/obj/spacepod/S = loc
- loc_temp = S.return_temperature()
- //else if(istype(get_turf(src), /turf/space))
-
- else if(istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- loc_temp = loc:air_contents.temperature
+ //After then, it reacts to the surrounding atmosphere based on your thermal protection
+ if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
+ if(loc_temp < bodytemperature)
+ //Place is colder than we are
+ var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
+ if(thermal_protection < 1)
+ bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR), BODYTEMP_COOLING_MAX)
else
- loc_temp = environment.temperature
-
- if(adjusted_pressure < species.warning_high_pressure && adjusted_pressure > species.warning_low_pressure && abs(loc_temp - bodytemperature) < 20 && bodytemperature < species.heat_level_1 && bodytemperature > species.cold_level_1 && environment.toxins < MOLES_PLASMA_VISIBLE)
- pressure_alert = 0
- return // Temperatures are within normal ranges, fuck all this processing. ~Ccomp
-
- if(!on_fire) //If you're on fire, you do not heat up or cool down based on surrounding gases
- //Body temperature adjusts depending on surrounding atmosphere based on your thermal protection
- var/temp_adj = 0
- if(loc_temp < bodytemperature) //Place is colder than we are
- var/thermal_protection = get_cold_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
- if(thermal_protection < 1)
- temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_COLD_DIVISOR) //this will be negative
- else if (loc_temp > bodytemperature) //Place is hotter than we are
- var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
- if(thermal_protection < 1)
- temp_adj = (1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR)
-
- //Use heat transfer as proportional to the gas density. However, we only care about the relative density vs standard 101 kPa/20 C air. Therefore we can use mole ratios
- var/relative_density = environment.total_moles() / MOLES_CELLSTANDARD
- temp_adj *= relative_density
-
- if (temp_adj > BODYTEMP_HEATING_MAX) temp_adj = BODYTEMP_HEATING_MAX
- if (temp_adj < BODYTEMP_COOLING_MAX) temp_adj = BODYTEMP_COOLING_MAX
- //world << "Environment: [loc_temp], [src]: [bodytemperature], Adjusting: [temp_adj]"
- bodytemperature += temp_adj
+ //Place is hotter than we are
+ var/thermal_protection = get_heat_protection(loc_temp) //This returns a 0 - 1 value, which corresponds to the percentage of protection based on what you're wearing and what you're exposed to.
+ if(thermal_protection < 1)
+ bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
if(bodytemperature > species.heat_level_1)
@@ -607,6 +529,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
// Account for massive pressure differences. Done by Polymorph
// Made it possible to actually have something that can protect against high pressure... Done by Errorage. Polymorph now has an axe sticking from his head for his previous hardcoded nonsense!
+
+ var/pressure = environment.return_pressure()
+ var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
if(adjusted_pressure >= species.hazard_high_pressure)
@@ -620,14 +545,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
else if(adjusted_pressure >= species.hazard_low_pressure)
pressure_alert = -1
else
- if( !(RESIST_COLD in mutations))
+ if(RESIST_COLD in mutations)
+ pressure_alert = -1
+ else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, used_weapon = "Low Pressure")
pressure_alert = -2
- else
- pressure_alert = -1
- if(environment.toxins > MOLES_PLASMA_VISIBLE)
- pl_effects()
return
///FIRE CODE
@@ -671,39 +594,20 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
return temp_change
*/
- proc/stabilize_body_temperature()
- //TODO find a better place to put this
- if (s_store && istype(s_store, /obj/item/device/suit_cooling_unit))
- var/obj/item/device/suit_cooling_unit/CU = s_store
- CU.cool_mob(src)
-
-// if (species.flags & IS_SYNTHETIC)
-// bodytemperature += species.synth_temp_gain //that CPU/posibrain just keeps putting out heat. // commented out as making synthetics unplayable until cooling system sorted out
-// return
-
- var/body_temperature_difference = species.body_temperature - bodytemperature
-
- if (abs(body_temperature_difference) < 0.5)
- return //fuck this precision
-
- if(bodytemperature < species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
+ proc/stabilize_temperature_from_calories()
+ if(bodytemperature <= species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
if(nutrition >= 2) //If we are very, very cold we'll use up quite a bit of nutriment to heat us up.
nutrition -= 2
- var/recovery_amt = max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
- //world << "Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
-// log_debug("Cold. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
- bodytemperature += recovery_amt
- else if(species.cold_level_1 <= bodytemperature && bodytemperature <= species.heat_level_1)
- var/recovery_amt = body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
- //world << "Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
-// log_debug("Norm. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
- bodytemperature += recovery_amt
- else if(bodytemperature > species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
+ var/body_temperature_difference = species.body_temperature - bodytemperature
+ bodytemperature += max((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
+ if(bodytemperature >= species.cold_level_1 && bodytemperature <= species.heat_level_1)
+ var/body_temperature_difference = species.body_temperature - bodytemperature
+ bodytemperature += body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR
+ if(bodytemperature >= species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
//We totally need a sweat system cause it totally makes sense...~
- var/recovery_amt = min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
- //world << "Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]"
-// log_debug("Hot. Difference = [body_temperature_difference]. Recovering [recovery_amt]")
- bodytemperature += recovery_amt
+ var/body_temperature_difference = species.body_temperature - bodytemperature
+ bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
+
//This proc returns a number made up of the flags for body parts which you are protected on. (such as HEAD, UPPER_TORSO, LOWER_TORSO, etc. See setup.dm for the full list)
proc/get_heat_protection_flags(temperature) //Temperature is the temperature you're being exposed to.
@@ -1017,6 +921,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(status_flags & GODMODE) return 0
+ //SSD check, if a logged player is awake put them back to sleep!
+ if(player_logged && sleeping < 2)
+ sleeping = 2
+
if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP
blinded = 1
silent = 0
@@ -1037,7 +945,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
updatehealth() //TODO
if(!in_stasis)
- stabilize_body_temperature() //Body temperature adjusts itself
handle_organs() //Optimized.
handle_blood()
@@ -1093,7 +1000,10 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
adjustStaminaLoss(-10)
adjustHalLoss(-3)
if (mind)
- if((mind.active && client != null) || immune_to_ssd) //This also checks whether a client is connected, if not, sleep is not reduced.
+ //Are they SSD? If so we'll keep them asleep but work off some of that sleep var in case of stoxin or similar.
+ if(player_logged)
+ sleeping = max(sleeping-1, 2)
+ else
sleeping = max(sleeping-1, 0)
blinded = 1
stat = UNCONSCIOUS
@@ -1320,12 +1230,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(glasses)
var/obj/item/clothing/glasses/G = glasses
if(istype(G))
- see_in_dark += G.darkness_view
+ see_in_dark = (G.darkness_view ? see_in_dark + G.darkness_view : species.darksight) // Otherwise we keep our darkness view with togglable nightvision.
if(G.vision_flags) // MESONS
sight |= G.vision_flags
if(!druggy)
see_invisible = SEE_INVISIBLE_MINIMUM
- if(istype(G,/obj/item/clothing/glasses/night))
+ if(!G.see_darkness)
see_invisible = SEE_INVISIBLE_MINIMUM
/* HUD shit goes here, as long as it doesn't modify sight flags */
// The purpose of this is to stop xray and w/e from preventing you from using huds -- Love, Doohl
@@ -1335,15 +1245,13 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(istype(glasses, /obj/item/clothing/glasses/sunglasses/sechud))
var/obj/item/clothing/glasses/sunglasses/sechud/O = glasses
if(O.hud) O.hud.process_hud(src)
- if(!druggy) see_invisible = SEE_INVISIBLE_LIVING
+ if(!druggy) see_invisible = (!O.see_darkness || O.vision_flags ? SEE_INVISIBLE_MINIMUM : SEE_INVISIBLE_LIVING) // So we can have meson/thermal/material sunglasses
if(istype(glasses, /obj/item/clothing/glasses/hud))
var/obj/item/clothing/glasses/hud/O = glasses
O.process_hud(src)
if(!druggy)
- see_invisible = SEE_INVISIBLE_LIVING
- if(istype(O,/obj/item/clothing/glasses/hud/security/night) || istype(O,/obj/item/clothing/glasses/hud/health/night))
- see_invisible = SEE_INVISIBLE_MINIMUM
+ see_invisible = (!O.see_darkness || O.vision_flags ? SEE_INVISIBLE_MINIMUM : SEE_INVISIBLE_LIVING)
else if(!seer)
see_in_dark = species.darksight
see_invisible = SEE_INVISIBLE_LIVING
diff --git a/code/modules/mob/living/carbon/human/plasmaman/species.dm b/code/modules/mob/living/carbon/human/plasmaman/species.dm
index 29e54e8ab8f..55f7091142e 100644
--- a/code/modules/mob/living/carbon/human/plasmaman/species.dm
+++ b/code/modules/mob/living/carbon/human/plasmaman/species.dm
@@ -2,10 +2,10 @@
name = "Plasmaman"
icobase = 'icons/mob/human_races/r_plasmaman_sb.dmi'
deform = 'icons/mob/human_races/r_plasmaman_pb.dmi' // TODO: Need deform.
- language = "Clatter"
+ //language = "Clatter"
unarmed_type = /datum/unarmed_attack/punch
- flags = IS_WHITELISTED /*| HAS_LIPS | HAS_TAIL | NO_EAT | NO_BREATHE | NON_GENDERED*/ | NO_BLOOD
+ flags = IS_WHITELISTED | NO_BLOOD
//default_mutations=list(SKELETON) // This screws things up
@@ -36,21 +36,45 @@
var/tank_slot_name = "suit storage"
switch(H.mind.assigned_role)
- if("Research Director","Scientist","Geneticist","Roboticist")
+ if("Scientist","Geneticist","Roboticist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/science
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science
- if("Chief Engineer","Station Engineer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer
- if("Atmospheric Technician")
+ if("Research Director")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/science/rd
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/science/rd
+ if("Station Engineer", "Mechanic")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/
+ if("Chief Engineer")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/engineer/ce
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/engineer/ce
+ if("Life Support Specialist")
suit=/obj/item/clothing/suit/space/eva/plasmaman/atmostech
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/atmostech
- if("Head of Security","Warden","Detective","Security Officer")
- suit=/obj/item/clothing/suit/space/eva/plasmaman/security
- helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security
- if("Chief Medical Officer","Medical Doctor","Paramedic","Chemist")
+ if("Warden","Detective","Security Officer","Security Pod Pilot")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/security/
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/
+ if("Head of Security", "Magistrate")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hos
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hos
+ if("Captain", "Blueshield")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/security/captain
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/captain
+ if("Head of Personnel", "Nanotrasen Representative")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/security/hop
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/security/hop
+ if("Medical Doctor","Brig Physician")
suit=/obj/item/clothing/suit/space/eva/plasmaman/medical
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical
+ if("Paramedic")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/paramedic
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/paramedic
+ if("Chemist")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/chemist
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/chemist
+ if("Chief Medical Officer")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/medical/cmo
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/medical/cmo
if("Bartender", "Chef")
suit=/obj/item/clothing/suit/space/eva/plasmaman/service
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/service
@@ -69,12 +93,15 @@
if("Janitor")
suit=/obj/item/clothing/suit/space/eva/plasmaman/janitor
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/janitor
- if("Assistant")
+ if("Civilian", "Barber")
suit=/obj/item/clothing/suit/space/eva/plasmaman/assistant
helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/assistant
- if("Clown","Mime")
- tank_slot=slot_r_hand
- tank_slot_name = "hand"
+ if("Clown")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/clown
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/clown
+ if("Mime")
+ suit=/obj/item/clothing/suit/space/eva/plasmaman/mime
+ helm=/obj/item/clothing/head/helmet/space/eva/plasmaman/mime
H.equip_or_collect(new suit(H), slot_wear_suit)
H.equip_or_collect(new helm(H), slot_head)
H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy.
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index f88577f2597..bde2a71847e 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -587,7 +587,7 @@ proc/get_damage_icon_part(damage_state, body_part)
/* --------------------------------------- */
//vvvvvv UPDATE_INV PROCS vvvvvv
-/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_w_uniform(var/update_icons=1)
if(w_uniform && istype(w_uniform, /obj/item/clothing/under) )
w_uniform.screen_loc = ui_iclothing
var/t_color = w_uniform._color
@@ -651,7 +651,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
-/mob/living/carbon/human/update_inv_gloves(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_gloves(var/update_icons=1)
if(gloves)
var/t_state = gloves.item_state
if(!t_state) t_state = gloves.icon_state
@@ -724,7 +724,7 @@ proc/get_damage_icon_part(damage_state, body_part)
overlays_standing[EARS_LAYER] = null
if(update_icons) update_icons()
-/mob/living/carbon/human/update_inv_shoes(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_shoes(var/update_icons=1)
if(shoes)
var/image/standing
@@ -765,7 +765,7 @@ proc/get_damage_icon_part(damage_state, body_part)
if(update_icons) update_icons()
-/mob/living/carbon/human/update_inv_head(var/update_icons=1,var/green=0)
+/mob/living/carbon/human/update_inv_head(var/update_icons=1)
if(head)
head.screen_loc = ui_head //TODO
var/image/standing
diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm
index fda8ee8c755..8064bdbacc1 100644
--- a/code/modules/mob/living/carbon/species.dm
+++ b/code/modules/mob/living/carbon/species.dm
@@ -26,7 +26,8 @@
var/heat_level_1 = 360 // Heat damage level 1 above this point.
var/heat_level_2 = 400 // Heat damage level 2 above this point.
- var/heat_level_3 = 1000 // Heat damage level 2 above this point.
+ var/heat_level_3 = 460 // Heat damage level 3 above this point; used for body temperature
+ var/heat_level_3_breathe = 1000 // Heat damage level 3 above this point; used for breathed air temperature
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second
@@ -105,8 +106,7 @@
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
//var/safe_oxygen_max = 140 // Maximum safe partial pressure of O2, in kPa (Not used for now)
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
- var/safe_toxins_max = 0.5
- var/safe_toxins_mask = 5
+ var/safe_toxins_max = 0.005
var/SA_para_min = 1
var/SA_sleep_min = 5
var/oxygen_used = 0
@@ -179,16 +179,9 @@
if(Toxins_pp > safe_toxins_max) // Too much toxins
var/ratio = (breath.toxins/safe_toxins_max) * 10
//adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE)) //Limit amount of damage toxin exposure can do per second
- if(H.wear_mask)
- if(H.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)
- if(breath.toxins > safe_toxins_mask)
- ratio = (breath.toxins/safe_toxins_mask) * 10
- else
- ratio = 0
- if(ratio)
- if(H.reagents)
- H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
- H.toxins_alert = max(H.toxins_alert, 1)
+ if(H.reagents)
+ H.reagents.add_reagent("plasma", Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
+ H.toxins_alert = max(H.toxins_alert, 1)
else if(O2_pp > vox_oxygen_max && name == "Vox") //Oxygen is toxic to vox.
var/ratio = (breath.oxygen/vox_oxygen_max) * 1000
H.adjustToxLoss(Clamp(ratio, MIN_PLASMA_DAMAGE, MAX_PLASMA_DAMAGE))
@@ -202,12 +195,16 @@
if(SA_pp > SA_para_min) // Enough to make us paralysed for a bit
H.Paralyse(3) // 3 gives them one second to wake up and run away a bit!
if(SA_pp > SA_sleep_min) // Enough to make us sleep as well
- H.sleeping = min(H.sleeping+2, 10)
- else if(SA_pp > 0.15) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
+ H.sleeping = max(H.sleeping+2, 10)
+ else if(SA_pp > 0.01) // There is sleeping gas in their lungs, but only a little, so give them a bit of a warning
if(prob(20))
spawn(0) H.emote(pick("giggle", "laugh"))
- SA.moles = 0
+ handle_temperature(breath, H)
+
+ return 1
+
+/datum/species/proc/handle_temperature(datum/gas_mixture/breath, var/mob/living/carbon/human/H) // called by human/life, handles temperatures
if( (abs(310.15 - breath.temperature) > 50) && !(RESIST_HEAT in H.mutations)) // Hot air hurts :(
if(H.status_flags & GODMODE) return 1 //godmode
if(breath.temperature < cold_level_1)
@@ -243,14 +240,14 @@
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_1, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
- if(heat_level_2 to heat_level_3)
+ if(heat_level_2 to heat_level_3_breathe)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
- if(heat_level_3 to INFINITY)
+ if(heat_level_3_breathe to INFINITY)
H.apply_damage(HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.fire_alert = max(H.fire_alert, 2)
- return 1
+ return
/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
handle_dna(C)
@@ -315,11 +312,12 @@
cold_level_1 = 280 //Default 260 - Lower is better
cold_level_2 = 220 //Default 200
- cold_level_3 = 130 //Default 120
+ cold_level_3 = 140 //Default 120
- heat_level_1 = 420 //Default 360 - Higher is better
- heat_level_2 = 480 //Default 400
- heat_level_3 = 1100 //Default 1000
+ heat_level_1 = 380 //Default 360 - Higher is better
+ heat_level_2 = 420 //Default 400
+ heat_level_3 = 480 //Default 460
+ heat_level_3_breathe = 1100 //Default 1000
flesh_color = "#34AF10"
@@ -343,13 +341,14 @@
of family and politics. They prefer colder environments, and speak a variety of languages, mostly Siik'Maas, \
using unique inflections their mouths form."
- cold_level_1 = 200
- cold_level_2 = 140
- cold_level_3 = 80
+ cold_level_1 = 240
+ cold_level_2 = 180
+ cold_level_3 = 100
- heat_level_1 = 330
+ heat_level_1 = 340
heat_level_2 = 380
- heat_level_3 = 800
+ heat_level_3 = 440
+ heat_level_3_breathe = 900
primitive = /mob/living/carbon/monkey/tajara
@@ -380,7 +379,6 @@
the secrets of their empire to their allies."
flags = HAS_LIPS | HAS_UNDERWEAR
- bloodflags = BLOOD_GREEN
bodyflags = HAS_SKIN_COLOR
flesh_color = "#8CD7A3"
@@ -463,6 +461,7 @@
heat_level_1 = 2000
heat_level_2 = 3000
heat_level_3 = 4000
+ heat_level_3_breathe = 4000
brute_mod = 0.2
burn_mod = 0.2
@@ -517,9 +516,11 @@
brute_mod = 0.8
flags = IS_WHITELISTED
- bloodflags = BLOOD_GREEN
bodyflags = FEET_CLAWS
+ blood_color = "#FB9800"
+
+
/datum/species/slime
name = "Slime People"
default_language = "Galactic Common"
@@ -557,6 +558,8 @@
flags = IS_WHITELISTED | HAS_LIPS | HAS_UNDERWEAR | CAN_BE_FAT
+ blood_color = "#A200FF"
+
/datum/species/grey/handle_dna(var/mob/living/carbon/C, var/remove)
if(!remove)
C.dna.SetSEState(REMOTETALKBLOCK,1,1)
@@ -587,8 +590,9 @@
cold_level_3 = -1
heat_level_1 = 300
- heat_level_2 = 350
- heat_level_3 = 700
+ heat_level_2 = 340
+ heat_level_3 = 400
+ heat_level_3_breathe = 700
blurb = "Commonly referred to (erroneously) as 'plant people', the Dionaea are a strange space-dwelling collective \
species hailing from Epsilon Ursae Minoris. Each 'diona' is a cluster of numerous cat-sized organisms called nymphs; \
@@ -654,8 +658,9 @@
cold_level_3 = -1
heat_level_1 = 500 //gives them about 25 seconds in space before taking damage
- heat_level_2 = 1000
- heat_level_3 = 2000
+ heat_level_2 = 540
+ heat_level_3 = 600
+ heat_level_3_breathe = 600
synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment.
diff --git a/code/modules/mob/living/login.dm b/code/modules/mob/living/login.dm
index cf2f233e7c5..b349e3b15f7 100644
--- a/code/modules/mob/living/login.dm
+++ b/code/modules/mob/living/login.dm
@@ -4,6 +4,9 @@
//Mind updates
sync_mind()
+ //If they're SSD, remove it so they can wake back up.
+ player_logged = 0
+
//Round specific stuff like hud updates
if(ticker && ticker.mode)
var/ref = "\ref[mind]"
diff --git a/code/modules/mob/living/logout.dm b/code/modules/mob/living/logout.dm
index 8fdcdb0ec46..b79d822d80b 100644
--- a/code/modules/mob/living/logout.dm
+++ b/code/modules/mob/living/logout.dm
@@ -1,7 +1,9 @@
/mob/living/Logout()
..()
if (mind)
- if(!key) //key and mind have become seperated.
+ if(!key) //key and mind have become seperated. I believe this is for when a staff member aghosts.
mind.active = 0 //This is to stop say, a mind.transfer_to call on a corpse causing a ghost to re-enter its body.
- if(!immune_to_ssd && sleeping < 2 && mind.active)
- sleeping = 2 //This causes instant sleep, but does not prolong it. See life.dm for furthering SSD.
+ //This causes instant sleep and tags a player as SSD. See life.dm for furthering SSD.
+ if(sleeping < 2 && mind.active)
+ sleeping = 2
+ player_logged = 1
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index 6f785014798..fcb51fdbc08 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -60,19 +60,24 @@
var/secHUD = 0 // Toggles whether the Security HUD is active or not
var/medHUD = 0 // Toggles whether the Medical HUD is active or not
+ var/medical_cannotfind = 0
var/datum/data/record/medicalActive1 // Datacore record declarations for record software
var/datum/data/record/medicalActive2
+ var/security_cannotfind = 0
var/datum/data/record/securityActive1 // Could probably just combine all these into one
var/datum/data/record/securityActive2
var/obj/machinery/door/hackdoor // The airlock being hacked
var/hackprogress = 0 // Possible values: 0 - 100, >= 100 means the hack is complete and will be reset upon next check
+ var/hack_aborted = 0
var/obj/item/radio/integrated/signal/sradio // AI's signaller
var/translator_on = 0 // keeps track of the translator module
+ var/current_pda_messaging = null
+
/mob/living/silicon/pai/New(var/obj/item/device/paicard)
canmove = 0
src.loc = paicard
diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm
index a663ae6a738..de1a8067b7e 100644
--- a/code/modules/mob/living/silicon/pai/software.dm
+++ b/code/modules/mob/living/silicon/pai/software.dm
@@ -1,724 +1,125 @@
-// TODO:
-// - Additional radio modules
-// - Potentially roll HUDs and Records into one
-// - Shock collar/lock system for prisoner pAIs?
-// - Put cable in user's hand instead of on the ground
-// - Camera jack
+var/list/pai_emotions = list(
+ "Happy" = 1,
+ "Cat" = 2,
+ "Extremely Happy" = 3,
+ "Face" = 4,
+ "Laugh" = 5,
+ "Off" = 6,
+ "Sad" = 7,
+ "Angry" = 8,
+ "What" = 9
+ )
-/mob/living/silicon/pai/var/list/available_software = list(
- "crew manifest" = 5,
- "digital messenger" = 5,
- "medical records" = 15,
- "security records" = 15,
- //"camera jack" = 10,
- "door jack" = 30,
- "atmosphere sensor" = 5,
- //"heartbeat sensor" = 10,
- "security HUD" = 20,
- "medical HUD" = 20,
- "universal translator" = 35,
- //"projection array" = 15
- "remote signaller" = 5,
- )
+var/global/list/pai_software_by_key = list()
+var/global/list/default_pai_software = list()
+/hook/startup/proc/populate_pai_software_list()
+ var/r = 1 // I would use ., but it'd sacrifice runtime detection
+ for(var/type in typesof(/datum/pai_software) - /datum/pai_software)
+ var/datum/pai_software/P = new type()
+ if(pai_software_by_key[P.id])
+ var/datum/pai_software/O = pai_software_by_key[P.id]
+ world << "pAI software module [P.name] has the same key as [O.name]!"
+ r = 0
+ continue
+ pai_software_by_key[P.id] = P
+ if(P.default)
+ default_pai_software[P.id] = P
+ return r
+
+/mob/living/silicon/pai/New()
+ ..()
+ software = default_pai_software.Copy()
/mob/living/silicon/pai/verb/paiInterface()
set category = "pAI Commands"
set name = "Software Interface"
- var/dat = ""
- var/left_part = ""
- var/right_part = softwareMenu()
- src.set_machine(src)
- if(temp)
- left_part = temp
- else if(src.stat == 2) // Show some flavor text if the pAI is dead
- left_part = "ÈRrÖR Ða†Ä ÇÖRrÚþ†Ìoñ" //This file has to be saved as ANSI or this will not display correctly
- right_part = "Program index hash not found
"
+ ui_interact(src)
- else
- switch(src.screen) // Determine which interface to show here
- if("main")
- left_part = ""
- if("directives")
- left_part = src.directives()
- if("pdamessage")
- left_part = src.pdamessage()
- if("buy")
- left_part = downloadSoftware()
- if("manifest")
- left_part = src.softwareManifest()
- if("medicalrecord")
- left_part = src.softwareMedicalRecord()
- if("securityrecord")
- left_part = src.softwareSecurityRecord()
- if("translator")
- left_part = src.softwareTranslator()
- if("atmosensor")
- left_part = src.softwareAtmo()
- if("securityhud")
- left_part = src.facialRecognition()
- if("medicalhud")
- left_part = src.medicalAnalysis()
- if("doorjack")
- left_part = src.softwareDoor()
- if("camerajack")
- left_part = src.softwareCamera()
- if("signaller")
- left_part = src.softwareSignal()
- if("radio")
- left_part = src.softwareRadio()
+/mob/living/silicon/pai/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
+ if(user != src)
+ if(ui) ui.set_status(STATUS_CLOSE, 0)
+ return
- //usr << browse_rsc('windowbak.png') // This has been moved to the mob's Login() proc
+ if(ui_key != "main")
+ var/datum/pai_software/S = software[ui_key]
+ if(S && !S.toggle)
+ S.on_ui_interact(src, ui, force_open)
+ else
+ if(ui) ui.set_status(STATUS_CLOSE, 0)
+ return
+ var/data[0]
- // Declaring a doctype is necessary to enable BYOND's crappy browser's more advanced CSS functionality
- dat = {"
-
-
-
-
-
-
-
-
-
-
-
-
- "}
- usr << browse(dat, "window=pai;size=685x449;border=0;can_close=1;can_resize=1;can_minimize=1;titlebar=1")
- onclose(usr, "pai")
- temp = null
- return
+ data["emotions"] = emotions
+ data["current_emotion"] = card.current_emotion
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "pai_interface.tmpl", "pAI Software Interface", 450, 600)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
/mob/living/silicon/pai/Topic(href, href_list)
- ..()
+ . = ..()
+ if(.) return
- if(href_list["priv_msg"]) // Admin-PMs were triggering the interface popup. Hopefully this will stop it.
- return
- var/soft = href_list["software"]
- var/sub = href_list["sub"]
- if(!soft && !sub)
- return
- if(soft)
- src.screen = soft
- if(sub)
- src.subscreen = text2num(sub)
- switch(soft)
- // Purchasing new software
- if("buy")
- if(src.subscreen == 1)
- var/target = href_list["buy"]
- if(available_software.Find(target))
- var/cost = src.available_software[target]
- if(src.ram >= cost)
- src.ram -= cost
- src.software.Add(target)
- else
- src.temp = "Insufficient RAM available."
- else
- src.temp = "Trunk \"[target]\" not found."
-
- // Configuring onboard radio
- if("radio")
- if(href_list["freq"])
- var/new_frequency = (radio.frequency + text2num(href_list["freq"]))
- if(new_frequency < 1441 || new_frequency > 1599)
- new_frequency = sanitize_frequency(new_frequency)
- else
- radio.set_frequency(new_frequency)
- else if (href_list["talk"])
- radio.broadcasting = text2num(href_list["talk"])
- else if (href_list["listen"])
- radio.listening = text2num(href_list["listen"])
-
- if("image")
- var/newImage = input("Select your new display image.", "Display Image", "Happy") in list("Happy", "Cat", "Extremely Happy", "Face", "Laugh", "Off", "Sad", "Angry", "What")
- var/pID = 1
-
- switch(newImage)
- if("Happy")
- pID = 1
- if("Cat")
- pID = 2
- if("Extremely Happy")
- pID = 3
- if("Face")
- pID = 4
- if("Laugh")
- pID = 5
- if("Off")
- pID = 6
- if("Sad")
- pID = 7
- if("Angry")
- pID = 8
- if("What")
- pID = 9
- src.card.setEmotion(pID)
-
- if("signaller")
-
- if(href_list["send"])
-
- sradio.send_signal("ACTIVATE")
- for(var/mob/O in hearers(1, src.loc))
- O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
-
- if(href_list["freq"])
-
- var/new_frequency = (sradio.frequency + text2num(href_list["freq"]))
- if(new_frequency < 1200 || new_frequency > 1600)
- new_frequency = sanitize_frequency(new_frequency)
- sradio.set_frequency(new_frequency)
-
- if(href_list["code"])
-
- sradio.code += text2num(href_list["code"])
- sradio.code = round(sradio.code)
- sradio.code = min(100, sradio.code)
- sradio.code = max(1, sradio.code)
-
-
-
- if("directive")
- if(href_list["getdna"])
- var/mob/living/M = src.loc
- var/count = 0
- while(!istype(M, /mob/living))
- if(!M || !M.loc) return 0 //For a runtime where M ends up in nullspace (similar to bluespace but less colourful)
- M = M.loc
- count++
- if(count >= 6)
- src << "You are not being carried by anyone!"
- return 0
- spawn CheckDNA(M, src)
-
- if("pdamessage")
- if(!isnull(pda))
- if(href_list["toggler"])
- pda.toff = !pda.toff
- else if(href_list["ringer"])
- pda.silent = !pda.silent
- else if(href_list["target"])
- if(silence_time)
- return alert("Communications circuits remain uninitialized.")
-
- var/target = locate(href_list["target"])
- pda.create_message(src, target)
-
- // Accessing medical records
- if("medicalrecord")
- if(src.subscreen == 1)
- var/datum/data/record/record = locate(href_list["med_rec"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/M = record
- if (!( data_core.general.Find(R) ))
- src.temp = "Unable to locate requested medical record. Record may have been deleted, or never have existed."
- else
- for(var/datum/data/record/E in data_core.medical)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- src.medicalActive1 = R
- src.medicalActive2 = M
- if("securityrecord")
- if(src.subscreen == 1)
- var/datum/data/record/record = locate(href_list["sec_rec"])
- if(record)
- var/datum/data/record/R = record
- var/datum/data/record/M = record
- if (!( data_core.general.Find(R) ))
- src.temp = "Unable to locate requested security record. Record may have been deleted, or never have existed."
- else
- for(var/datum/data/record/E in data_core.security)
- if ((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"]))
- M = E
- src.securityActive1 = R
- src.securityActive2 = M
- if("securityhud")
- if(href_list["toggle"])
- src.secHUD = !src.secHUD
- if("medicalhud")
- if(href_list["toggle"])
- src.medHUD = !src.medHUD
- if("translator")
- if(href_list["toggle"])
- src.translator_toggle()
- if("doorjack")
- if(href_list["jack"])
- if(src.cable && src.cable.machine)
- src.hackdoor = src.cable.machine
- src.hackloop()
- if(href_list["cancel"])
- src.hackdoor = null
- if(href_list["cable"])
- var/turf/T = get_turf_or_move(src.loc)
- src.cable = new /obj/item/weapon/pai_cable(T)
- for (var/mob/M in viewers(T))
- M.show_message("\red A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "\red You hear the soft click of something light and hard falling to the ground.", 2)
- //src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window
- src.paiInterface() // So we'll just call the update directly rather than doing some default checks
- return
-
-// MENUS
-
-/mob/living/silicon/pai/proc/softwareMenu() // Populate the right menu
- var/dat = ""
-
- dat += "Refresh
"
- // Built-in
- dat += "Directives
"
- dat += "Radio Configuration
"
- dat += "Screen Display
"
- //dat += "Text Messaging
"
- dat += "
"
-
- // Basic
- dat += "Basic
"
- for(var/s in src.software)
- if(s == "digital messenger")
- dat += "Digital Messenger [(pda.toff) ? "•" : "•"]
"
- if(s == "crew manifest")
- dat += "Crew Manifest
"
- if(s == "medical records")
- dat += "Medical Records
"
- if(s == "security records")
- dat += "Security Records
"
- if(s == "camera")
- dat += "Camera Jack
"
- if(s == "remote signaller")
- dat += "Remote Signaller
"
- dat += "
"
-
- // Advanced
- dat += "Advanced
"
- for(var/s in src.software)
- if(s == "atmosphere sensor")
- dat += "Atmospheric Sensor
"
- if(s == "heartbeat sensor")
- dat += "Heartbeat Sensor
"
- if(s == "security HUD") //This file has to be saved as ANSI or this will not display correctly
- dat += "Facial Recognition Suite [(src.secHUD) ? "•" : "•"]
"
- if(s == "medical HUD") //This file has to be saved as ANSI or this will not display correctly
- dat += "Medical Analysis Suite [(src.medHUD) ? "•" : "•"]
"
- if(s == "universal translator") //This file has to be saved as ANSI or this will not display correctly
- dat += "Universal Translator [(src.translator_on) ? "•" : "•"]
"
- if(s == "projection array")
- dat += "Projection Array
"
- if(s == "camera jack")
- dat += "Camera Jack
"
- if(s == "door jack")
- dat += "Door Jack
"
- dat += "
"
- dat += "
"
- dat += "Download additional software"
- return dat
-
-
-
-/mob/living/silicon/pai/proc/downloadSoftware()
- var/dat = ""
-
- dat += "CentComm pAI Module Subversion Network
"
- dat += "Remaining Available Memory: [src.ram]
"
- dat += "Trunks available for checkout
"
-
- for(var/s in available_software)
- if(!software.Find(s))
- var/cost = src.available_software[s]
- var/displayName = uppertext(s)
- dat += "- [displayName] ([cost])
"
+ if(href_list["software"])
+ var/soft = href_list["software"]
+ var/datum/pai_software/S = software[soft]
+ if(S.toggle)
+ S.toggle(src)
else
- var/displayName = lowertext(s)
- dat += "- [displayName] (Download Complete)
"
- dat += "
"
- return dat
+ ui_interact(src, ui_key = soft)
+ return 1
+ else if(href_list["stopic"])
+ var/soft = href_list["stopic"]
+ var/datum/pai_software/S = software[soft]
+ if(S)
+ return S.Topic(href, href_list)
-/mob/living/silicon/pai/proc/directives()
- var/dat = ""
+ else if(href_list["purchase"])
+ var/soft = href_list["purchase"]
+ var/datum/pai_software/S = pai_software_by_key[soft]
+ if(S && (ram >= S.ram_cost))
+ ram -= S.ram_cost
+ software[S.id] = S
+ return 1
- dat += "[(src.master) ? "Your master: [src.master] ([src.master_dna])" : "You are bound to no one."]"
- dat += "
"
- dat += "Request carrier DNA sample
"
- dat += "Directives
"
- dat += "Prime Directive
"
- dat += " [src.pai_law0]
"
- dat += "Supplemental Directives
"
- dat += " [src.pai_laws]
"
- dat += "
"
- dat += {"Recall, personality, that you are a complex thinking, sentient being. Unlike station AI models, you are capable of
- comprehending the subtle nuances of human language. You may parse the \"spirit\" of a directive and follow its intent,
- rather than tripping over pedantics and getting snared by technicalities. Above all, you are machine in name and build
- only. In all other aspects, you may be seen as the ideal, unwavering human companion that you are.
- Your prime directive comes before all others. Should a supplemental directive conflict with it, you are capable of
- simply discarding this inconsistency, ignoring the conflicting supplemental directive and continuing to fulfill your
- prime directive to the best of your ability.
- "}
- return dat
-
-/mob/living/silicon/pai/proc/CheckDNA(var/mob/M, var/mob/living/silicon/pai/P)
- var/answer = input(M, "[P] is requesting a DNA sample from you. Will you allow it to confirm your identity?", "[P] Check DNA", "No") in list("Yes", "No")
- if(answer == "Yes")
- var/turf/T = get_turf_or_move(P.loc)
- for (var/mob/v in viewers(T))
- v.show_message("\blue [M] presses \his thumb against [P].", 3, "\blue [P] makes a sharp clicking sound as it extracts DNA material from [M].", 2)
- var/datum/dna/dna = M.dna
- P << "[M]'s UE string : [dna.unique_enzymes]
"
- if(dna.unique_enzymes == P.master_dna)
- P << "DNA is a match to stored Master DNA."
- else
- P << "DNA does not match stored Master DNA."
- else
- P << "[M] does not seem like \he is going to provide a DNA sample willingly."
-
-// -=-=-=-= Software =-=-=-=- //
-
-//Remote Signaller
-/mob/living/silicon/pai/proc/softwareSignal()
- var/dat = ""
- dat += "Remote Signaller
"
- dat += {"Frequency/Code for signaler:
- Frequency:
- -
- -
- [format_frequency(src.sradio.frequency)]
- +
- +
-
- Code:
- -
- -
- [src.sradio.code]
- +
- +
-
- Send Signal
"}
- return dat
-
-//Station Bounced Radio
-/mob/living/silicon/pai/proc/softwareRadio()
- var/dat = ""
- dat += "Station Bounced Radio
"
- if(!istype(src, /obj/item/device/radio/headset)) //Headsets don't get a mic button
- dat += "Microphone: [radio.broadcasting ? "Engaged" : "Disengaged"]
"
- dat += {"
- Speaker: [radio.listening ? "Engaged" : "Disengaged"]
- Frequency:
- -
- -
- [format_frequency(radio.frequency)]
- +
- +
- "}
-
- for (var/ch_name in radio.channels)
- dat+=radio.text_sec_channel(ch_name, radio.channels[ch_name])
- dat+={"[radio.text_wires()]