diff --git a/baystation12.dme b/baystation12.dme
index 970e2ba7be..ef839733bc 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -53,6 +53,9 @@
#define FILE_DIR "sound/voice"
#define FILE_DIR "sound/voice/Serithi"
#define FILE_DIR "sound/weapons"
+#define FILE_DIR "tools"
+#define FILE_DIR "tools/AddToChangelog"
+#define FILE_DIR "tools/AddToChangelog/AddToChangelog"
// END_FILE_DIR
// BEGIN_PREFERENCES
#define DEBUG
@@ -255,6 +258,8 @@
#include "code\game\gamemodes\nuclear\pinpointer.dm"
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\revolution\rp_revolution.dm"
+#include "code\game\gamemodes\sandbox\h_sandbox.dm"
+#include "code\game\gamemodes\sandbox\sandbox.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
#include "code\game\gamemodes\wizard\rightandwrong.dm"
#include "code\game\gamemodes\wizard\soulstone.dm"
diff --git a/code/WorkInProgress/kilakk/responseteam.dm b/code/WorkInProgress/kilakk/responseteam.dm
new file mode 100644
index 0000000000..c5b49537c4
--- /dev/null
+++ b/code/WorkInProgress/kilakk/responseteam.dm
@@ -0,0 +1,197 @@
+// emergency response teams
+// work in progress
+
+var/const/members_possible = 5
+var/sent_emergency_team = 0
+
+/client/proc/response_team()
+ set name = "Dispatch Emergency Response Team"
+ set category = "Special Verbs"
+ set desc = "Send an emergency response team to the station"
+
+ if(!holder)
+ usr << "\red Only administrators may use this command."
+ return
+ if(!ticker)
+ usr << "\red The game hasn't started yet!"
+ return
+ if(ticker.current_state == GAME_STATE_PREGAME)
+ usr << "\red The round hasn't started yet!"
+ return
+ if(sent_emergency_team == 1)
+ usr << "\red Central Command has already dispatched an emergency response team!"
+ return
+ if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes")
+ return
+ if(get_security_level() != "red") // Allow admins to reconsider if the alert level isn't Red
+ switch(alert("The station has not entered code red recently. Do you still want to dispatch a response team?",,"Yes","No"))
+ if("No")
+ return
+
+ var/situation = null
+ while(!situation)
+ situation = copytext(sanitize(input(src, "Please specify the mission the emergency response team will undertake.", "Specify Mission", "")),1,MAX_MESSAGE_LEN)
+ if(!situation)
+ if(alert("You haven't specified a mission. Exit the setup process?",,"No","Yes")=="Yes")
+ return
+
+ if(sent_emergency_team)
+ usr << "\red Looks like somebody beat you to it!"
+ return
+
+ sent_emergency_team = 1
+ message_admins("[key_name_admin(usr)] has dispatched an Emergency Response Team.", 1)
+ log_admin("[key_name(usr)] used Dispatch Response Team.")
+
+ var/member_number = members_possible
+ var/leader_selected = 0
+
+ // Shamelessly stolen nuke code
+ var/nuke_code
+ var/temp_code
+ for(var/obj/machinery/nuclearbomb/N in world)
+ temp_code = text2num(N.r_code)
+ if(temp_code)
+ nuke_code = N.r_code
+ break
+
+/* var/list/candidates = list() // ghosts who can be picked
+ var/list/members = list() // ghosts who have been picked
+ for(var/mob/dead/observer/G in player_list)
+ if(!G.client.holder && !G.client.is_afk())
+ if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD))
+ candidates += G.key
+ for(var/i=members_possible,(i>0&&candidates.len), i--)
+ var/candidate = input("Choose characters to spawn as response team members. This will go on until there are no more ghosts to pick from or until all slots are full.", "Active Players") as null|anything in candidates */
+
+ // I tried doing this differently. Ghosts get a pop-up box similar to pAIs and one-click-antag
+ // Biggest diff here is in how the candidates list is updated
+ alert(usr, "Active ghosts are currently being given a chance to be considered to join the emergency response team. Please wait about 30 seconds.") // There's probably a better way to do this, with a fancy count-down timer or something
+
+ var/list/candidates = list()
+ var/list/members = list()
+ var/time_passed = world.time
+
+ for(var/mob/dead/observer/G in player_list)
+ if(!jobban_isbanned(G, "Syndicate") || !jobban_isbanned(G, "Emergency Response Team") || !jobban_isbanned(G, "Security Officer"))
+ spawn(0)
+ switch(alert(G, "Do you want to be considered for the Emergency Response Team? Please answer in 30 seconds!",,"Yes","No"))
+ if("Yes")
+ if((world.time-time_passed)>300)
+ return
+ candidates += G.key
+ if("No")
+ return
+ else
+ return
+
+ sleep(300)
+
+ for(var/i=members_possible,(i>0&&candidates.len), i--) // The rest of the choosing process is just an input with a list of candidates on it
+ var/chosen = input("Time's up! Choose characters to spawn as reponse team members. This will go on until there are no more ghosts to pick from or until all slots are full.", "Considered Players") as null|anything in candidates
+ candidates -= chosen
+ members += chosen
+
+ command_alert("Sensors indicate that [station_name()] has entered Code Red and is in need of assistance. We will prepare and dispatch an emergency response team to deal with the situation.", "NMV Icarus Command")
+
+ for(var/obj/effect/landmark/L in world)
+ if(L.name == "Response Team")
+ leader_selected = member_number == 1?1:0 // The last person selected will be the leader
+
+ var/mob/living/carbon/human/new_member = create_response_team(L, leader_selected)
+
+ new_member.age = !leader_selected ? rand(23,35) : rand(35,45)
+
+ if(members.len)
+ new_member.key = pick(members)
+ members -= new_member.key
+
+ if(!new_member.key) // It works ok? sort of
+ del(new_member)
+ break
+
+ switch(alert(new_member, "You are an Emergency Response Team member! Are you a boy or a girl?",,"Male","Female"))
+ if("Male")
+ new_member.gender = MALE
+ if("Female")
+ new_member.gender = FEMALE
+
+ var/new_name = input(new_member, "...Erm, what was your name again?", "Choose your name") as text
+
+ if(!new_name)
+ new_member.real_name = "Agent [pick("Red","Yellow","Orange","Silver","Gold", "Pink", "Purple", "Rainbow")]" // Choose a "random" agent name
+ new_member.name = usr.real_name
+ else
+ new_member.real_name = new_name
+ new_member.name = new_name
+
+ new_member.dna.ready_dna(new_member)
+ new_member.update_body(1)
+
+ new_member.mind_initialize()
+ new_member.mind.assigned_role = "Emergency Response Team"
+ new_member.mind.special_role = "Emergency Response Team"
+ ticker.mode.traitors += new_member.mind // ERTs will show up at the end of the round on the "traitor" list
+
+ new_member << "\blue You are the Emergency Response Team[!leader_selected?"!":" Leader!"] \nAs a response team [!leader_selected?"member":"leader"] you answer directly to [!leader_selected?"your team leader.":"Central Command."] \nYou have been deployed by NanoTrasen Central Command in Tau Ceti to resolve a Code Red alert aboard [station_name()], and have been provided with the following instructions and information regarding your mission: \red [situation]"
+ new_member.mind.store_memory("Mission Parameters: \red [situation].")
+
+ if(leader_selected)
+ new_member << "\red The Nuclear Authentication Code is: [nuke_code]. You are instructed not to detonate the nuclear device aboard [station_name()] unless absolutely necessary."
+ new_member.mind.store_memory("Nuclear Authentication Code: \red [nuke_code]")
+
+ new_member.equip_response_team(leader_selected) // Start equipping them
+
+ member_number--
+ return 1
+
+// Mob creation
+/client/proc/create_response_team(obj/spawn_location, leader_selected = 0)
+ var/mob/living/carbon/human/new_member = new(spawn_location.loc)
+
+ return new_member
+
+// Equip mob
+/mob/living/carbon/human/proc/equip_response_team(leader_selected = 0)
+
+ // Headset
+ equip_to_slot_or_del(new /obj/item/device/radio/headset/ert(src), slot_ears)
+
+ // Uniform
+ equip_to_slot_or_del(new /obj/item/clothing/under/rank/centcom_officer(src), slot_w_uniform)
+ equip_to_slot_or_del(new /obj/item/clothing/shoes/swat(src), slot_shoes)
+ equip_to_slot_or_del(new /obj/item/clothing/gloves/swat(src), slot_gloves)
+ equip_to_slot_or_del(new /obj/item/weapon/gun/energy/gun(src), slot_belt)
+
+ // Glasses
+ equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/sechud(src), slot_glasses)
+
+ // Backpack
+ equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(src), slot_back)
+
+ // Put stuff into their backpacks
+ equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack)
+ equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid(src), slot_in_backpack) // Not sure about this
+
+ // Loyalty implants
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)
+ L.imp_in = src
+ L.implanted = 1
+
+ // ID cards
+ var/obj/item/weapon/card/id/E = new(src)
+ E.name = "[real_name]'s ID Card (Emergency Response Team)"
+ E.icon_state = "centcom"
+ E.access = get_all_accesses() // ERTs can go everywhere on the station
+ if(leader_selected)
+ E.name = "[real_name]'s ID Card (Emergency Response Team Leader)"
+ E.access += get_all_centcom_access()
+ E.assignment = "Emergency Response Team Leader"
+ else
+ E.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)
+ E.assignment = "Emergency Response Team"
+ E.registered_name = real_name
+ equip_to_slot_or_del(E, slot_wear_id)
+
+ return 1
+
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index e2a9e1e1bf..e3f69881da 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -122,8 +122,10 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
+
if("Vox")
icobase = 'icons/mob/human_races/r_vox.dmi'
+
else
icobase = 'icons/mob/human_races/r_human.dmi'
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 196160a30c..07f7443fc8 100755
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -183,24 +183,85 @@ var/global/list/obj/item/device/pda/PDAs = list()
default_cartridge = /obj/item/weapon/cartridge/medical
icon_state = "pda-gene"
+
// Special AI/pAI PDAs that cannot explode.
/obj/item/device/pda/ai
icon_state = "NONE"
ttone = "data"
detonate = 0
+
+/obj/item/device/pda/ai/proc/set_name_and_job(newname as text, newjob as text)
+ owner = newname
+ ownjob = newjob
+ name = newname + " (" + ownjob + ")"
+
+
+//AI verb and proc for sending PDA messages.
+/obj/item/device/pda/ai/verb/cmd_send_pdamesg()
+ set category = "AI IM"
+ set name = "Send Message"
+ set src in usr
+ if(usr.stat == 2)
+ usr << "You can't send PDA messages because you are dead!"
+ return
+ var/list/plist = available_pdas()
+ if (plist)
+ var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist)
+ if (!c) // if the user hasn't selected a PDA file we can't send a message
+ return
+ var/selected = plist[c]
+ create_message(usr, selected)
+
+
+/obj/item/device/pda/ai/verb/cmd_toggle_pda_receiver()
+ set category = "AI IM"
+ set name = "Toggle Sender/Receiver"
+ set src in usr
+ if(usr.stat == 2)
+ usr << "You can't do that because you are dead!"
+ return
+ toff = !toff
+ usr << "PDA sender/receiver toggled [(toff ? "Off" : "On")]!"
+
+
+/obj/item/device/pda/ai/verb/cmd_toggle_pda_silent()
+ set category = "AI IM"
+ set name = "Toggle Ringer"
+ set src in usr
+ if(usr.stat == 2)
+ usr << "You can't do that because you are dead!"
+ return
+ silent=!silent
+ usr << "PDA ringer toggled [(silent ? "Off" : "On")]!"
+
+
+/obj/item/device/pda/ai/verb/cmd_show_message_log()
+ set category = "AI IM"
+ set name = "Show Message Log"
+ set src in usr
+ if(usr.stat == 2)
+ usr << "You can't do that because you are dead!"
+ return
+ var/HTML = "
AI PDA Message Log[tnote]"
+ usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
+
+
/obj/item/device/pda/ai/can_use()
return 1
+
/obj/item/device/pda/ai/attack_self(mob/user as mob)
if ((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
return
+
/obj/item/device/pda/ai/pai
ttone = "assist"
+
/*
* The Actual PDA
*/
@@ -832,6 +893,7 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
usr << "You cannot do this while restrained."
+
/obj/item/device/pda/proc/id_check(mob/user as mob, choice as num)//To check for IDs; 1 for in-pda use, 2 for out of pda use.
if(choice == 1)
if (id)
@@ -1071,21 +1133,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
M.Stun(8)
M.Weaken(5)
-
-//AI verb and proc for sending PDA messages.
-
-/mob/living/silicon/ai/verb/cmd_send_pdamesg()
- set category = "AI Commands"
- set name = "PDA - Send Message"
+/obj/item/device/pda/proc/available_pdas()
var/list/names = list()
var/list/plist = list()
var/list/namecounts = list()
- if(usr.stat == 2)
- usr << "You can't send PDA messages because you are dead!"
- return
-
- if(src.aiPDA.toff)
+ if (toff)
usr << "Turn on your receiver in order to send messages."
return
@@ -1098,8 +1151,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
continue
else if (P.toff)
continue
- else if (P == src.aiPDA)
- continue
var/name = P.owner
if (name in names)
@@ -1110,52 +1161,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
namecounts[name] = 1
plist[text("[name]")] = P
-
- var/c = input(usr, "Please select a PDA") as null|anything in sortList(plist)
-
- if (!c)
- return
-
- var/selected = plist[c]
- src.aiPDA.create_message(src, selected)
-
-
-/mob/living/silicon/ai/verb/cmd_toggle_pda_receiver()
- set category = "AI Commands"
- set name = "PDA - Toggle Sender/Receiver"
- if(usr.stat == 2)
- usr << "You can't do that because you are dead!"
- return
- if(!isnull(aiPDA))
- aiPDA.toff = !aiPDA.toff
- usr << "PDA sender/receiver toggled [(aiPDA.toff ? "Off" : "On")]!"
- else
- usr << "You do not have a PDA. You should make an issue report about this."
-
-/mob/living/silicon/ai/verb/cmd_toggle_pda_silent()
- set category = "AI Commands"
- set name = "PDA - Toggle Ringer"
- if(usr.stat == 2)
- usr << "You can't do that because you are dead!"
- return
- if(!isnull(aiPDA))
- //0
- aiPDA.silent = !aiPDA.silent
- usr << "PDA ringer toggled [(aiPDA.silent ? "Off" : "On")]!"
- else
- usr << "You do not have a PDA. You should make an issue report about this."
-
-/mob/living/silicon/ai/verb/cmd_show_message_log()
- set category = "AI Commands"
- set name = "PDA - Show Message Log"
- if(usr.stat == 2)
- usr << "You can't do that because you are dead!"
- return
- if(!isnull(aiPDA))
- var/HTML = "AI PDA Message Log[aiPDA.tnote]"
- usr << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0")
- else
- usr << "You do not have a PDA. You should make an issue report about this."
+ return plist
+
//Some spare PDAs in a box
/obj/item/weapon/storage/box/PDAs
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 413333f397..b19a4cdf72 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -186,7 +186,7 @@
new /obj/item/weapon/gun/energy/taser(src)
new /obj/item/clothing/glasses/sunglasses/sechud(src)
new /obj/item/taperoll/police(src)
- new /obj/item/device/hailer
+ new /obj/item/device/hailer(src)
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 62b8b84324..a9ad1c223b 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -66,7 +66,10 @@ var/list/admin_verbs_admin = list(
/client/proc/toggleattacklogs,
/client/proc/toggledebuglogs,
/datum/admins/proc/show_skills,
- /client/proc/check_customitem_activity
+ /client/proc/check_customitem_activity,
+ /* Currently unticked.
+ /client/proc/response_team
+ */
)
var/list/admin_verbs_ban = list(
/client/proc/unban_panel,
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 7d8f1289ce..f476e60c25 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -88,7 +88,7 @@ BLIND // can't see anything
desc = "Comfortable-looking shoes."
gender = PLURAL //Carn: for grammarically correct text-parsing
var/chained = 0
-
+ siemens_coefficient = 0.9
body_parts_covered = FEET
slot_flags = SLOT_FEET
@@ -105,6 +105,7 @@ BLIND // can't see anything
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_OCLOTHING
var/blood_overlay_type = "suit"
+ siemens_coefficient = 0.9
//Spacesuit
//Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together.
@@ -120,6 +121,7 @@ BLIND // can't see anything
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE
+ siemens_coefficient = 0.9
/obj/item/clothing/suit/space
name = "Space suit"
@@ -137,6 +139,7 @@ BLIND // can't see anything
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
+ siemens_coefficient = 0.9
//Under clothing
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 05c4bf03e3..a5e9911100 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -3,7 +3,7 @@
name = "ninja gloves"
icon_state = "s-ninja"
item_state = "s-ninja"
- siemens_coefficient = 0
+ siemens_coefficient = 0.2
var/draining = 0
var/candrain = 0
var/mindrain = 200
@@ -32,7 +32,7 @@
name = "\improper SWAT Gloves"
icon_state = "black"
item_state = "swat_gl"
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
permeability_coefficient = 0.05
cold_protection = HANDS
@@ -70,3 +70,4 @@
icon_state = "leather"
item_state = "ggloves"
permeability_coefficient = 0.9
+ siemens_coefficient = 0.9
diff --git a/code/modules/clothing/gloves/stungloves.dm b/code/modules/clothing/gloves/stungloves.dm
index b892f001d3..dd53138968 100644
--- a/code/modules/clothing/gloves/stungloves.dm
+++ b/code/modules/clothing/gloves/stungloves.dm
@@ -9,7 +9,7 @@
if(C.amount >= 2)
C.use(2)
wired = 1
- siemens_coefficient = 1
+ siemens_coefficient = 3.0
user << "You wrap some wires around [src]."
update_icon()
else
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index dfca62aa01..defc0a49ed 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -10,6 +10,7 @@
armor = list(melee = 30, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
icon_action_button = "action_hardhat"
+ siemens_coefficient = 0.9
attack_self(mob/user)
if(!isturf(user.loc))
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 23debe8aab..ec2ef1b3fa 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -10,7 +10,7 @@
min_cold_protection_temperature = HELMET_MIN_COLD_PROTECITON_TEMPERATURE
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECITON_TEMPERATURE
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
/obj/item/clothing/head/helmet/warden
name = "warden's hat"
@@ -26,6 +26,7 @@
flags = FPRINT|TABLEPASS|HEADCOVERSEYES
armor = list(melee = 82, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0)
flags_inv = HIDEEARS
+ siemens_coefficient = 0.7
/obj/item/clothing/head/helmet/swat
name = "\improper SWAT helmet"
@@ -37,6 +38,7 @@
flags_inv = HIDEEARS|HIDEEYES
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE
+ siemens_coefficient = 0.5
/obj/item/clothing/head/helmet/thunderdome
name = "\improper Thunderdome helmet"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index ae80fe26b4..893c8f47e5 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -7,6 +7,7 @@
item_state = "chef"
desc = "The commander in chef's head wear."
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
//Captain: This probably shouldn't be space-worthy
/obj/item/clothing/head/caphat
@@ -15,6 +16,7 @@
desc = "It's good being the king."
flags = FPRINT|TABLEPASS
item_state = "caphat"
+ siemens_coefficient = 0.9
//Captain: This probably shouldn't be space-worthy
/obj/item/clothing/head/helmet/cap
@@ -25,6 +27,7 @@
flags_inv = 0
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECITON_TEMPERATURE
+ siemens_coefficient = 0.9
//Chaplain
/obj/item/clothing/head/chaplain_hood
@@ -32,6 +35,7 @@
desc = "It's hood that covers the head. It keeps you warm during the space winters."
icon_state = "chaplain_hood"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR
+ siemens_coefficient = 0.9
//Chaplain
/obj/item/clothing/head/nun_hood
@@ -39,6 +43,7 @@
desc = "Maximum piety in this star system."
icon_state = "nun_hood"
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|BLOCKHAIR
+ siemens_coefficient = 0.9
//Mime
/obj/item/clothing/head/beret
@@ -46,6 +51,7 @@
desc = "A beret, an artists favorite headwear."
icon_state = "beret"
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
//Security
/obj/item/clothing/head/beret/sec
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 19bb098b4f..32f01a10c8 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -6,6 +6,7 @@
desc = "It's good to be emperor."
flags = FPRINT|TABLEPASS
item_state = "centhat"
+ siemens_coefficient = 0.9
/obj/item/clothing/head/hairflower
name = "hair flower pin"
@@ -26,6 +27,7 @@
icon_state = "tophat"
item_state = "that"
flags = FPRINT|TABLEPASS
+ siemens_coefficient = 0.9
/obj/item/clothing/head/redcoat
name = "redcoat's hat"
@@ -45,6 +47,7 @@
icon_state = "plaguedoctor"
flags = FPRINT | TABLEPASS
permeability_coefficient = 0.01
+ siemens_coefficient = 0.9
/obj/item/clothing/head/hasturhood
name = "hastur's hood"
@@ -57,6 +60,7 @@
desc = "It allows quick identification of trained medical personnel."
icon_state = "nursehat"
flags = FPRINT|TABLEPASS
+ siemens_coefficient = 0.9
/obj/item/clothing/head/syndicatefake
name = "red space-helmet replica"
@@ -65,6 +69,7 @@
desc = "A plastic replica of a syndicate agent's space helmet, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!"
flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ siemens_coefficient = 2.0
/obj/item/clothing/head/cueball
name = "cueball helmet"
@@ -82,6 +87,7 @@
flags = FPRINT|TABLEPASS
flags_inv = 0
+
/obj/item/clothing/head/greenbandana
name = "green bandana"
desc = "It's a green bandana with some fine nanotech lining."
@@ -132,6 +138,7 @@
desc = "A working man's cap."
icon_state = "flat_cap"
item_state = "detective"
+ siemens_coefficient = 0.9
/obj/item/clothing/head/pirate
name = "pirate hat"
@@ -210,6 +217,7 @@
icon_state = "witch"
item_state = "witch"
flags = FPRINT | TABLEPASS | BLOCKHAIR
+ siemens_coefficient = 2.0
/obj/item/clothing/head/chicken
name = "chicken suit head"
@@ -217,6 +225,7 @@
icon_state = "chickenhead"
item_state = "chickensuit"
flags = FPRINT | TABLEPASS | BLOCKHAIR
+ siemens_coefficient = 2.0
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
@@ -224,6 +233,7 @@
icon_state = "bearpelt"
item_state = "bearpelt"
flags = FPRINT | TABLEPASS | BLOCKHAIR
+ siemens_coefficient = 2.0
/obj/item/clothing/head/xenos
name = "xenos helmet"
@@ -232,3 +242,4 @@
desc = "A helmet made out of chitinous alien hide."
flags = FPRINT | TABLEPASS | BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ siemens_coefficient = 2.0
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index b3c1eb5b9b..1e9f6d4f89 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -23,6 +23,7 @@
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE)
icon_action_button = "action_welding"
+ siemens_coefficient = 0.9
/obj/item/clothing/head/welding/attack_self()
toggle()
@@ -158,6 +159,7 @@
flags = FPRINT | TABLEPASS
var/icon/mob
var/icon/mob2
+ siemens_coefficient = 1.5
update_icon(var/mob/living/carbon/human/user)
if(!istype(user)) return
diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm
index 3d4bfc8dcf..af286a0e9b 100644
--- a/code/modules/clothing/head/soft_caps.dm
+++ b/code/modules/clothing/head/soft_caps.dm
@@ -6,6 +6,7 @@
item_state = "helmet"
color = "cargo"
var/flipped = 0
+ siemens_coefficient = 0.9
dropped()
src.icon_state = "[color]soft"
diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm
index 129c69e90f..49d9505bce 100644
--- a/code/modules/clothing/masks/boxing.dm
+++ b/code/modules/clothing/masks/boxing.dm
@@ -15,6 +15,7 @@
flags = FPRINT|TABLEPASS|BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
+ siemens_coefficient = 3.0
/obj/item/clothing/mask/luchador/tecnicos
name = "Tecnicos Mask"
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 6031221882..f8d643d5e3 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -8,6 +8,7 @@
item_state = "gas_alt"
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
+ siemens_coefficient = 0.9
//Plague Dr suit can be found in clothing/suits/bio.dm
/obj/item/clothing/mask/gas/plaguedoctor
@@ -21,11 +22,13 @@
name = "\improper SWAT mask"
desc = "A close-fitting tactical mask that can be connected to an air supply."
icon_state = "swat"
+ siemens_coefficient = 0.7
/obj/item/clothing/mask/gas/syndicate
name = "syndicate mask"
desc = "A close-fitting tactical mask that can be connected to an air supply."
icon_state = "swat"
+ siemens_coefficient = 0.7
/obj/item/clothing/mask/gas/voice
name = "gas mask"
@@ -41,6 +44,7 @@
icon_state = "s-ninja"
item_state = "s-ninja_mask"
vchange = 1
+ siemens_coefficient = 0.2
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
@@ -76,6 +80,7 @@
name = "Death Commando Mask"
icon_state = "death_commando_mask"
item_state = "death_commando_mask"
+ siemens_coefficient = 0.2
/obj/item/clothing/mask/gas/cyborg
name = "cyborg visor"
diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm
index 52b28bd8f1..8df98f42dd 100644
--- a/code/modules/clothing/masks/miscellaneous.dm
+++ b/code/modules/clothing/masks/miscellaneous.dm
@@ -81,6 +81,7 @@
flags = FPRINT|TABLEPASS|BLOCKHAIR
flags_inv = HIDEFACE
w_class = 2
+ siemens_coefficient = 0.9
/obj/item/clothing/mask/horsehead
name = "horse head mask"
@@ -91,3 +92,4 @@
flags_inv = HIDEFACE
w_class = 2
var/voicechange = 0
+ siemens_coefficient = 0.9
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index ef3ab188c0..d7c6177893 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -7,7 +7,7 @@
flags = NOSLIP
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
- siemens_coefficient = 0
+ siemens_coefficient = 0.8
/obj/item/clothing/shoes/mime
name = "mime shoes"
@@ -20,7 +20,7 @@
icon_state = "swat"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
flags = NOSLIP
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
/obj/item/clothing/shoes/combat //Basically SWAT shoes combined with galoshes.
name = "combat boots"
@@ -28,7 +28,7 @@
icon_state = "swat"
armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 10, rad = 0)
flags = NOSLIP
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
cold_protection = FEET
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECITON_TEMPERATURE
@@ -42,7 +42,7 @@
permeability_coefficient = 0.01
flags = NOSLIP
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
- siemens_coefficient = 0
+ siemens_coefficient = 0.2
cold_protection = FEET
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECITON_TEMPERATURE
@@ -82,7 +82,7 @@
icon_state = "jackboots"
item_state = "jackboots"
color = "hosred"
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
/obj/item/clothing/shoes/cult
name = "boots"
@@ -90,7 +90,7 @@
icon_state = "cult"
item_state = "cult"
color = "cult"
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
cold_protection = FEET
min_cold_protection_temperature = SHOE_MIN_COLD_PROTECITON_TEMPERATURE
diff --git a/code/modules/clothing/spacesuits/captain.dm b/code/modules/clothing/spacesuits/captain.dm
index 56537aec50..7757b1a209 100644
--- a/code/modules/clothing/spacesuits/captain.dm
+++ b/code/modules/clothing/spacesuits/captain.dm
@@ -26,4 +26,4 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 7b01ae1cf9..4695e884ca 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -4,7 +4,7 @@
icon_state = "ert_commander"
item_state = "helm-command"
armor = list(melee = 50, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 60)
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
/obj/item/clothing/suit/space/ert
name = "emergency response team suit"
@@ -19,7 +19,7 @@
/obj/item/weapon/screwdriver, /obj/item/weapon/weldingtool, /obj/item/weapon/wirecutters, /obj/item/weapon/wrench, /obj/item/device/multitool, \
/obj/item/device/radio, /obj/item/device/analyzer, /obj/item/weapon/gun/energy/laser, /obj/item/weapon/gun/energy/pulse_rifle, \
/obj/item/weapon/gun/energy/taser, /obj/item/weapon/melee/baton, /obj/item/weapon/gun/energy/gun)
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
//Commander
/obj/item/clothing/head/helmet/space/ert/commander
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index bf62ddfef3..c4d8327a0a 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -25,7 +25,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
//Deathsquad suit
/obj/item/clothing/head/helmet/space/deathsquad
@@ -34,7 +34,7 @@
icon_state = "deathsquad"
item_state = "deathsquad"
armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30)
- siemens_coefficient = 0
+ siemens_coefficient = 0.2
/obj/item/clothing/head/helmet/space/deathsquad/beret
name = "officer's beret"
@@ -42,6 +42,7 @@
icon_state = "beret_badge"
armor = list(melee = 65, bullet = 55, laser = 35,energy = 20, bomb = 30, bio = 30, rad = 30)
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
+ siemens_coefficient = 0.9
//Space santa outfit suit
/obj/item/clothing/head/helmet/space/santahat
@@ -68,6 +69,7 @@
item_state = "pirate"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
flags = FPRINT | TABLEPASS | HEADCOVERSEYES | BLOCKHAIR | STOPSPRESSUREDMAGE
+ siemens_coefficient = 0.9
/obj/item/clothing/suit/space/pirate
name = "pirate coat"
@@ -78,5 +80,6 @@
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+ siemens_coefficient = 0.9
diff --git a/code/modules/clothing/spacesuits/ninja.dm b/code/modules/clothing/spacesuits/ninja.dm
index 086ac7a2c9..8f49738fbf 100644
--- a/code/modules/clothing/spacesuits/ninja.dm
+++ b/code/modules/clothing/spacesuits/ninja.dm
@@ -5,7 +5,7 @@
item_state = "s-ninja_mask"
allowed = list(/obj/item/weapon/cell)
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 25)
- siemens_coefficient = 0
+ siemens_coefficient = 0.2
/obj/item/clothing/suit/space/space_ninja
@@ -16,7 +16,7 @@
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/cell)
slowdown = 0
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
- siemens_coefficient = 0
+ siemens_coefficient = 0.2
//Important parts of the suit.
var/mob/living/carbon/affecting = null//The wearer.
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm
index d63b11b001..c735156ef8 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/rig.dm
@@ -86,7 +86,7 @@
item_state = "syndie_helm"
color = "syndi"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
/obj/item/clothing/suit/space/rig/syndi
@@ -98,7 +98,7 @@
w_class = 3
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_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs)
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
//Wizard Rig
@@ -110,7 +110,7 @@
color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
/obj/item/clothing/suit/space/rig/wizard
icon_state = "rig-wiz"
@@ -121,7 +121,7 @@
w_class = 3
unacidable = 1
armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60)
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
//Medical Rig
@@ -148,7 +148,7 @@
item_state = "sec_helm"
color = "sec"
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
/obj/item/clothing/suit/space/rig/security
icon_state = "rig-sec"
@@ -157,7 +157,7 @@
item_state = "sec_hardsuit"
armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10)
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton)
- siemens_coefficient = 0
+ siemens_coefficient = 0.7
//Atmospherics Rig (BS12)
diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm
index e2fc9e6d64..f2829fbdf8 100644
--- a/code/modules/clothing/spacesuits/syndi.dm
+++ b/code/modules/clothing/spacesuits/syndi.dm
@@ -6,7 +6,7 @@
item_state = "syndicate"
desc = "Has a tag: Totally not property of an enemy corporation, honest."
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
- siemens_coefficient = 0
+ siemens_coefficient = 0.8
/obj/item/clothing/suit/space/syndicate
name = "red space suit"
@@ -17,7 +17,7 @@
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen)
slowdown = 1
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
- siemens_coefficient = 0
+ siemens_coefficient = 0.8
//Green syndicate space suit
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 4e10a8ce63..fdd54d6350 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -8,7 +8,7 @@
min_cold_protection_temperature = ARMOR_MIN_COLD_PROTECITON_TEMPERATURE
heat_protection = UPPER_TORSO|LOWER_TORSO
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECITON_TEMPERATURE
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
/obj/item/clothing/suit/armor/vest
@@ -42,6 +42,7 @@
slowdown = 1
armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
+ siemens_coefficient = 0.5
/obj/item/clothing/suit/armor/bulletproof
@@ -51,7 +52,7 @@
item_state = "armor"
blood_overlay_type = "armor"
armor = list(melee = 10, bullet = 80, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0)
-
+ siemens_coefficient = 0.7
/obj/item/clothing/suit/armor/laserproof
name = "Ablative Armor Vest"
@@ -60,7 +61,7 @@
item_state = "armor_reflec"
blood_overlay_type = "armor"
armor = list(melee = 10, bullet = 10, laser = 80, energy = 50, bomb = 0, bio = 0, rad = 0)
-
+ siemens_coefficient = 0
/obj/item/clothing/suit/armor/swat
name = "swat suit"
@@ -77,6 +78,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
+ siemens_coefficient = 0.5
/obj/item/clothing/suit/armor/swat/officer
@@ -151,6 +153,7 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS
min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECITON_TEMPERATURE
+ siemens_coefficient = 0
/obj/item/clothing/suit/armor/heavy
name = "heavy armor"
@@ -162,6 +165,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
slowdown = 3
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ siemens_coefficient = 0
/obj/item/clothing/suit/armor/tdome
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 978df443d1..2dbe3d01fc 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -7,6 +7,7 @@
flags = FPRINT|TABLEPASS|HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
+ siemens_coefficient = 0.9
/obj/item/clothing/suit/bio_suit
name = "bio suit"
@@ -22,6 +23,7 @@
allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen)
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ siemens_coefficient = 0.9
//Standard biosuit, orange stripe
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 0029cca694..c3f1ce7aa4 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -16,6 +16,7 @@
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
+ siemens_coefficient = 3.0
/obj/item/clothing/suit/redtag
name = "red laser tag armour"
@@ -25,6 +26,7 @@
blood_overlay_type = "armor"
body_parts_covered = UPPER_TORSO|LOWER_TORSO
allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
+ siemens_coefficient = 3.0
/*
* Costume
@@ -145,6 +147,7 @@
item_state = "chickensuit"
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET
flags_inv = HIDESHOES|HIDEJUMPSUIT
+ siemens_coefficient = 2.0
/obj/item/clothing/suit/monkeysuit
@@ -154,6 +157,7 @@
item_state = "monkeysuit"
body_parts_covered = UPPER_TORSO|ARMS|LOWER_TORSO|LEGS|FEET|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
+ siemens_coefficient = 2.0
/obj/item/clothing/suit/holidaypriest
@@ -269,30 +273,35 @@
desc = "A rather skimpy pink swimsuit."
icon_state = "stripper_p_under"
color = "stripper_p"
+ siemens_coefficient = 1
/obj/item/clothing/under/stripper/stripper_green
name = "green swimsuit"
desc = "A rather skimpy green swimsuit."
icon_state = "stripper_g_under"
color = "stripper_g"
+ siemens_coefficient = 1
/obj/item/clothing/suit/stripper/stripper_pink
name = "pink skimpy dress"
desc = "A rather skimpy pink dress."
icon_state = "stripper_p_over"
item_state = "stripper_p"
+ siemens_coefficient = 1
/obj/item/clothing/suit/stripper/stripper_green
name = "green skimpy dress"
desc = "A rather skimpy green dress."
icon_state = "stripper_g_over"
item_state = "stripper_g"
+ siemens_coefficient = 1
/obj/item/clothing/under/stripper/mankini
name = "the mankini"
desc = "No honest man would wear this abomination"
icon_state = "mankini"
color = "mankini"
+ siemens_coefficient = 1
/obj/item/clothing/suit/xenos
name = "xenos suit"
@@ -301,35 +310,42 @@
item_state = "xenos_helm"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
+ siemens_coefficient = 2.0
//swimsuit
+/obj/item/clothing/under/swimsuit/
+ siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/black
name = "black swimsuit"
desc = "An oldfashioned black swimsuit."
icon_state = "swim_black"
color = "swim_black"
+ siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/blue
name = "blue swimsuit"
desc = "An oldfashioned blue swimsuit."
icon_state = "swim_blue"
color = "swim_blue"
+ siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/purple
name = "purple swimsuit"
desc = "An oldfashioned purple swimsuit."
icon_state = "swim_purp"
color = "swim_purp"
+ siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/green
name = "green swimsuit"
desc = "An oldfashioned green swimsuit."
icon_state = "swim_green"
color = "swim_green"
+ siemens_coefficient = 1
/obj/item/clothing/under/swimsuit/red
name = "red swimsuit"
desc = "An oldfashioned red swimsuit."
icon_state = "swim_red"
color = "swim_red"
+ siemens_coefficient = 1
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index e67d84fda6..8fa3b506c7 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -3,11 +3,13 @@
desc = "Strange-looking hat-wear that most certainly belongs to a real magic user."
icon_state = "wizard"
//Not given any special protective value since the magic robes are full-body protection --NEO
+ siemens_coefficient = 0.8
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
desc = "Strange-looking, red, hat-wear that most certainly belongs to a real magic user."
icon_state = "redwizard"
+ siemens_coefficient = 0.8
/obj/item/clothing/head/wizard/fake
name = "wizard hat"
@@ -18,12 +20,14 @@
name = "Witch Hat"
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
+ siemens_coefficient = 0.8
/obj/item/clothing/head/wizard/magus
name = "Magus Helm"
desc = "A mysterious helmet that hums with an unearthly power"
icon_state = "magus"
item_state = "magus"
+ siemens_coefficient = 0.8
/obj/item/clothing/suit/wizrobe
@@ -37,7 +41,7 @@
armor = list(melee = 30, bullet = 20, laser = 20,energy = 20, bomb = 20, bio = 20, rad = 20)
allowed = list(/obj/item/weapon/teleportation_scroll)
flags_inv = HIDEJUMPSUIT
-
+ siemens_coefficient = 0.8
/obj/item/clothing/suit/wizrobe/red
name = "red wizard robe"
@@ -72,12 +76,14 @@
item_state = "wizrobe"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 1.0
/obj/item/clothing/head/wizard/marisa/fake
name = "Witch Hat"
desc = "Strange-looking hat-wear, makes you want to cast fireballs."
icon_state = "marisa"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 1.0
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "Witch Robe"
@@ -86,4 +92,5 @@
item_state = "marisarobe"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 1.0
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index 84b5fc213b..5a3f34f552 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -6,7 +6,7 @@
color = "black"
desc = "It's a plain jumpsuit. It seems to have a small dial on the wrist."
origin_tech = "syndicate=3"
- siemens_coefficient = 0
+ siemens_coefficient = 0.8
var/list/clothing_choices = list()
New()
diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm
index bbc6e492af..ecec4174ec 100644
--- a/code/modules/clothing/under/jobs/security.dm
+++ b/code/modules/clothing/under/jobs/security.dm
@@ -16,6 +16,7 @@
color = "warden"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
/obj/item/clothing/under/rank/security
name = "security officer's jumpsuit"
@@ -25,6 +26,7 @@
color = "secred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
/obj/item/clothing/under/rank/dispatch
name = "dispatcher's uniform"
@@ -34,6 +36,7 @@
color = "dispatch"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
/obj/item/clothing/under/rank/security2
name = "security officer's uniform"
@@ -43,6 +46,7 @@
color = "redshirt2"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
/*
* Detective
@@ -55,6 +59,7 @@
color = "detective"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
+ siemens_coefficient = 0.9
/obj/item/clothing/head/det_hat
@@ -63,6 +68,7 @@
icon_state = "detective"
allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen)
armor = list(melee = 50, bullet = 5, laser = 25,energy = 10, bomb = 0, bio = 0, rad = 0)
+ siemens_coefficient = 0.9
/*
* Head of Security
@@ -75,7 +81,7 @@
color = "hosred"
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
flags = FPRINT | TABLEPASS
- siemens_coefficient = 0
+ siemens_coefficient = 0.8
/obj/item/clothing/head/helmet/HoS
@@ -86,7 +92,7 @@
armor = list(melee = 80, bullet = 60, laser = 50,energy = 10, bomb = 25, bio = 10, rad = 0)
flags_inv = 0
flags_inv = HIDEEARS
- siemens_coefficient = 0
+ siemens_coefficient = 0.8
/obj/item/clothing/suit/armor/hos
@@ -97,7 +103,7 @@
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
armor = list(melee = 65, bullet = 30, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0)
flags_inv = HIDEJUMPSUIT
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
/obj/item/clothing/head/helmet/HoS/dermal
@@ -105,6 +111,7 @@
desc = "You're not quite sure how you manage to take it on and off, but it implants nicely in your head."
icon_state = "dermal"
item_state = "dermal"
+ siemens_coefficient = 0.6
//Jensen cosplay gear
/obj/item/clothing/under/rank/head_of_security/jensen
@@ -113,7 +120,7 @@
icon_state = "jensen"
item_state = "jensen"
color = "jensen"
- siemens_coefficient = 0
+ siemens_coefficient = 0.6
/obj/item/clothing/suit/armor/hos/jensen
name = "armored trenchcoat"
@@ -121,4 +128,4 @@
icon_state = "jensencoat"
item_state = "jensencoat"
flags_inv = 0
- siemens_coefficient = 0
\ No newline at end of file
+ siemens_coefficient = 0.6
\ No newline at end of file
diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm
index facfc39646..413d90e674 100644
--- a/code/modules/clothing/under/syndicate.dm
+++ b/code/modules/clothing/under/syndicate.dm
@@ -6,7 +6,7 @@
color = "syndicate"
has_sensor = 0
armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
- siemens_coefficient = 0
+ siemens_coefficient = 0.9
/obj/item/clothing/under/syndicate/combat
name = "combat turtleneck"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index e84a3c27fa..79be30e4c4 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -14,16 +14,24 @@ emp_act
if(istype(P, /obj/item/projectile/energy/electrode))
var/datum/organ/external/select_area = get_organ(def_zone) // We're checking the outside, buddy!
var/list/body_parts = list(head, wear_mask, wear_suit, w_uniform, gloves, shoes) // What all are we checking?
+ // var/deflectchance=90 //Is it a CRITICAL HIT with that taser?
for(var/bp in body_parts) //Make an unregulated var to pass around.
if(!bp)
continue //Does this thing we're shooting even exist?
if(bp && istype(bp ,/obj/item/clothing)) // If it exists, and it's clothed
var/obj/item/clothing/C = bp // Then call an argument C to be that clothing!
if(C.body_parts_covered & select_area.body_part) // Is that body part being targeted covered?
+ P.agony=P.agony*C.siemens_coefficient
+ visible_message("\red [src]'s [C.name] absorbs some of the shock from the [P.name]!")
+ apply_effect(P.agony,AGONY,0)
+ del P
+ /* Commenting out new-old taser nerf.
if(C.siemens_coefficient == 0) //If so, is that clothing shock proof?
- visible_message("\red The [P.name] gets deflected by [src]'s [C.name]!") //DEFLECT!
- del P
-
+ if(prob(deflectchance))
+ visible_message("\red The [P.name] gets deflected by [src]'s [C.name]!") //DEFLECT!
+ visible_message("\red Taser hit for [P.damage] damage!")
+ del P
+*/
/* Commenting out old Taser nerf
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor))
if(istype(P, /obj/item/projectile/energy/electrode))
@@ -32,6 +40,7 @@ emp_act
return -1
*/
// END TASER NERF
+
if(wear_suit && istype(wear_suit, /obj/item/clothing/suit/armor/laserproof))
if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam))
var/reflectchance = 40 - round(P.damage/3)
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index a28652f8ca..be07fcba53 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -961,19 +961,21 @@
del a
if(halloss > 100)
- src << "You're too tired to keep going..."
+ src << "You're in too much pain to keep going..."
for(var/mob/O in oviewers(src, null))
- O.show_message("[src] slumps to the ground panting, too weak to continue fighting.", 1)
- Paralyse(3)
+ O.show_message("[src] slumps to the ground, too weak to continue fighting.", 1)
+ Paralyse(10)
setHalLoss(99)
if(paralysis)
AdjustParalysis(-1)
blinded = 1
stat = UNCONSCIOUS
+ if(halloss > 0)
+ adjustHalLoss(-6)
else if(sleeping)
handle_dreams()
- adjustHalLoss(-5)
+ adjustHalLoss(-6)
if (mind)
if((mind.active && client != null) || immune_to_ssd) //This also checks whether a client is connected, if not, sleep is not reduced.
sleeping = max(sleeping-1, 0)
@@ -982,9 +984,14 @@
if( prob(10) && health && !hal_crit )
spawn(0)
emote("snore")
+ else if(resting)
+ if(halloss > 0)
+ adjustHalLoss(-6)
//CONSCIOUS
else
stat = CONSCIOUS
+ if(halloss > 0)
+ adjustHalLoss(-2)
//Eyes
if(sdisabilities & BLIND) //disabled-blind, doesn't get better on its own
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index c506b35250..9d29d317c8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -444,9 +444,11 @@ proc/get_damage_icon_part(damage_state, body_part)
if("skrell")
race_icon = 'icons/mob/human_races/r_skrell.dmi'
deform_icon = 'icons/mob/human_races/r_def_skrell.dmi'
+
if("vox")
race_icon = 'icons/mob/human_races/r_vox.dmi'
deform_icon = 'icons/mob/human_races/r_def_vox.dmi'
+
else
race_icon = 'icons/mob/human_races/r_human.dmi'
deform_icon = 'icons/mob/human_races/r_def_human.dmi'
diff --git a/code/modules/mob/living/damage_procs.dm b/code/modules/mob/living/damage_procs.dm
index 2d98dd45d3..78b04c9245 100644
--- a/code/modules/mob/living/damage_procs.dm
+++ b/code/modules/mob/living/damage_procs.dm
@@ -49,6 +49,8 @@
Weaken(effect/(blocked+1))
if(PARALYZE)
Paralyse(effect/(blocked+1))
+ if(AGONY)
+ halloss += effect // Useful for objects that cause "subdual" damage. PAIN!
if(IRRADIATE)
radiation += max((((effect - (effect*(getarmor(null, "rad")/100))))/(blocked+1)),0)//Rads auto check armor
if(STUTTER)
@@ -62,7 +64,7 @@
return 1
-/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/blocked = 0)
+/mob/living/proc/apply_effects(var/stun = 0, var/weaken = 0, var/paralyze = 0, var/irradiate = 0, var/stutter = 0, var/eyeblur = 0, var/drowsy = 0, var/blocked = 0, var/agony = 0)
if(blocked >= 2) return 0
if(stun) apply_effect(stun, STUN, blocked)
if(weaken) apply_effect(weaken, WEAKEN, blocked)
@@ -71,4 +73,5 @@
if(stutter) apply_effect(stutter, STUTTER, blocked)
if(eyeblur) apply_effect(eyeblur, EYE_BLUR, blocked)
if(drowsy) apply_effect(drowsy, DROWSY, blocked)
+ if(agony) apply_effect(agony, AGONY, blocked)
return 1
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 16b85018b6..f65ba033cd 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -178,28 +178,17 @@ var/list/ai_list = list()
//usr <<"You can only change your display once!"
//return
-/mob/living/silicon/ai/Stat()
- ..()
- statpanel("Status")
- if (client.statpanel == "Status")
- stat(null, "Station Time: [worldtime2text()]")
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
- if (timeleft)
- stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
- if(ticker.mode.name == "AI malfunction")
- var/datum/game_mode/malfunction/malf = ticker.mode
- for (var/datum/mind/malfai in malf.malf_ai)
- if (mind == malfai)
- if (malf.apcs >= 3)
- stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
-
- if(!stat)
- stat(null, text("System integrity: [(health+100)/2]%"))
- else
- stat(null, text("Systems nonfunctional"))
+// displays the malf_ai information if the AI is the malf
+/mob/living/silicon/ai/show_malf_ai()
+ if(ticker.mode.name == "AI malfunction")
+ var/datum/game_mode/malfunction/malf = ticker.mode
+ for (var/datum/mind/malfai in malf.malf_ai)
+ if (mind == malfai) // are we the evil one?
+ if (malf.apcs >= 3)
+ stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
+
/mob/living/silicon/ai/proc/ai_alerts()
set category = "AI Commands"
set name = "Show Alerts"
@@ -236,17 +225,11 @@ var/list/ai_list = list()
viewalerts = 1
src << browse(dat, "window=aialerts&can_close=0")
+// this verb lets the ai see the stations manifest
/mob/living/silicon/ai/proc/ai_roster()
set category = "AI Commands"
set name = "Show Crew Manifest"
- var/dat
-
- dat += "Crew Manifest
"
- if(data_core)
- dat += data_core.get_manifest(0) // make it monochrome
- dat += "
"
- src << browse(dat, "window=airoster")
- onclose(src, "airoster")
+ show_station_manifest()
/mob/living/silicon/ai/proc/ai_call_shuttle()
set category = "AI Commands"
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index f1fb58b01a..863708d18c 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -75,23 +75,20 @@
..()
usr << browse_rsc('html/paigrid.png') // Go ahead and cache the interface resources as early as possible
-
+
+// this function shows the information about being silenced as a pAI in the Status panel
+/mob/living/silicon/pai/proc/show_silenced()
+ if(src.silence_time)
+ var/timeleft = round((silence_time - world.timeofday)/10 ,1)
+ stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+
+
/mob/living/silicon/pai/Stat()
..()
statpanel("Status")
if (src.client.statpanel == "Status")
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
- if (timeleft)
- stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
- if(src.silence_time)
- var/timeleft = round((silence_time - world.timeofday)/10 ,1)
- stat(null, "Communications system reboot in -[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
- if(!src.stat)
- stat(null, text("System integrity: [(src.health+100)/2]%"))
- else
- stat(null, text("Systems nonfunctional"))
-
+ show_silenced()
+
if (proc_holder_list.len)//Generic list for proc_holder objects.
for(var/obj/effect/proc_holder/P in proc_holder_list)
statpanel("[P.panel]","",P)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 7f96570274..0f87682cdf 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -29,6 +29,8 @@
var/obj/item/device/mmi/mmi = null
+ var/obj/item/device/pda/ai/rbPDA = null
+
var/opened = 0
var/emagged = 0
var/wiresexposed = 0
@@ -101,6 +103,12 @@
playsound(loc, 'sound/voice/liveagain.ogg', 75, 1)
+// setup the PDA and its name
+/mob/living/silicon/robot/proc/setup_PDA()
+ if (!rbPDA)
+ rbPDA = new/obj/item/device/pda/ai(src)
+ rbPDA.set_name_and_job(custom_name,braintype)
+
//If there's an MMI in the robot, have it ejected when the mob goes away. --NEO
//Improved /N
/mob/living/silicon/robot/Del()
@@ -238,6 +246,8 @@
radio.config(channels)
updateicon()
+/
+
/mob/living/silicon/robot/proc/updatename(var/prefix as text)
if(istype(mmi, /obj/item/device/mmi/posibrain))
@@ -252,6 +262,9 @@
changed_name = "[(prefix ? "[prefix] " : "")][braintype]-[num2text(ident)]"
real_name = changed_name
name = real_name
+
+ // if we've changed our name, we also need to update the display name for our PDA
+ setup_PDA()
/mob/living/silicon/robot/verb/Namepick()
if(custom_name)
@@ -271,6 +284,13 @@
set name = "Show Alerts"
robot_alerts()
+// this verb lets cyborgs see the stations manifest
+/mob/living/silicon/robot/verb/cmd_station_manifest()
+ set category = "Robot Commands"
+ set name = "Show Station Manifest"
+ show_station_manifest()
+
+
/mob/living/silicon/robot/proc/robot_alerts()
var/dat = "Current Station Alerts\n"
dat += "Close
"
@@ -301,35 +321,52 @@
return 1
return 0
+// this function shows information about the malf_ai gameplay type in the status screen
+/mob/living/silicon/robot/show_malf_ai()
+ ..()
+ if(ticker.mode.name == "AI malfunction")
+ var/datum/game_mode/malfunction/malf = ticker.mode
+ for (var/datum/mind/malfai in malf.malf_ai)
+ if(connected_ai)
+ if(connected_ai.mind == malfai)
+ if(malf.apcs >= 3)
+ stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
+ else if(ticker.mode:malf_mode_declared)
+ stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
+ return 0
+
+
+// this function displays jetpack pressure in the stat panel
+/mob/living/silicon/robot/proc/show_jetpack_pressure()
+ // if you have a jetpack, show the internal tank pressure
+ var/obj/item/weapon/tank/jetpack/current_jetpack = installed_jetpack()
+ if (current_jetpack)
+ stat("Internal Atmosphere Info", current_jetpack.name)
+ stat("Tank Pressure", current_jetpack.air_contents.return_pressure())
+
+
+// this function returns the robots jetpack, if one is installed
+/mob/living/silicon/robot/proc/installed_jetpack()
+ if(module)
+ return (locate(/obj/item/weapon/tank/jetpack) in module.modules)
+ return 0
+
+
+// this function displays the cyborgs current cell charge in the stat panel
+/mob/living/silicon/robot/proc/show_cell_power()
+ if(cell)
+ stat(null, text("Charge Left: [cell.charge]/[cell.maxcharge]"))
+ else
+ stat(null, text("No Cell Inserted!"))
+
+
+// update the status screen display
/mob/living/silicon/robot/Stat()
..()
statpanel("Status")
if (client.statpanel == "Status")
- if(emergency_shuttle.online && emergency_shuttle.location < 2)
- var/timeleft = emergency_shuttle.timeleft()
- if (timeleft)
- stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
-
- if(ticker.mode.name == "AI malfunction")
- var/datum/game_mode/malfunction/malf = ticker.mode
- for (var/datum/mind/malfai in malf.malf_ai)
- if(connected_ai)
- if(connected_ai.mind == malfai)
- if(malf.apcs >= 3)
- stat(null, "Time until station control secured: [max(malf.AI_win_timeleft/(malf.apcs/3), 0)] seconds")
- else if(ticker.mode:malf_mode_declared)
- stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
-
- if(cell)
- stat(null, text("Charge Left: [cell.charge]/[cell.maxcharge]"))
- else
- stat(null, text("No Cell Inserted!"))
-
- if(module)
- internal = locate(/obj/item/weapon/tank/jetpack) in module.modules
- if(internal)
- stat("Internal Atmosphere Info", internal.name)
- stat("Tank Pressure", internal.air_contents.return_pressure())
+ show_cell_power()
+ show_jetpack_pressure()
/mob/living/silicon/robot/restrained()
return 0
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 8ef637cd5f..1f4b0ec4fe 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -144,4 +144,51 @@
return 0
if (bot.connected_ai == ai)
return 1
- return 0
\ No newline at end of file
+ return 0
+
+
+// this function shows the health of the pAI in the Status panel
+/mob/living/silicon/proc/show_system_integrity()
+ if(!src.stat)
+ stat(null, text("System integrity: [(src.health+100)/2]%"))
+ else
+ stat(null, text("Systems nonfunctional"))
+
+
+// This is a pure virtual function, it should be overwritten by all subclasses
+/mob/living/silicon/proc/show_malf_ai()
+ return 0
+
+
+// this function displays the station time in the status panel
+/mob/living/silicon/proc/show_station_time()
+ stat(null, "Station Time: [worldtime2text()]")
+
+
+// this function displays the shuttles ETA in the status panel if the shuttle has been called
+/mob/living/silicon/proc/show_emergency_shuttle_eta()
+ if(emergency_shuttle.online && emergency_shuttle.location < 2)
+ var/timeleft = emergency_shuttle.timeleft()
+ if (timeleft)
+ stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+
+
+// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
+/mob/living/silicon/Stat()
+ ..()
+ statpanel("Status")
+ if (src.client.statpanel == "Status")
+ show_station_time()
+ show_emergency_shuttle_eta()
+ show_system_integrity()
+ show_malf_ai()
+
+// this function displays the stations manifest in a separate window
+/mob/living/silicon/proc/show_station_manifest()
+ var/dat
+ dat += "Crew Manifest
"
+ if(data_core)
+ dat += data_core.get_manifest(0) // make it monochrome
+ dat += "
"
+ src << browse(dat, "window=airoster")
+ onclose(src, "airoster")
\ No newline at end of file
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index f1cf54af15..f7c965d2fd 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -144,8 +144,10 @@ datum/preferences
icobase = 'icons/mob/human_races/r_lizard.dmi'
if("Skrell")
icobase = 'icons/mob/human_races/r_skrell.dmi'
+
if("Vox")
icobase = 'icons/mob/human_races/r_vox.dmi'
+
else
icobase = 'icons/mob/human_races/r_human.dmi'
preview_icon = new /icon(icobase, "torso_[g]")
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index 4d0e8bfac3..d166dccd38 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -740,8 +740,10 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
base = new('icons/mob/human_races/r_lizard.dmi')
if("skrell")
base = new('icons/mob/human_races/r_skrell.dmi')
+
if("vox")
base = new('icons/mob/human_races/r_vox.dmi')
+
else
base = new('icons/mob/human_races/r_human.dmi')
if(base)
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4aa930167e..7948a457c9 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -174,7 +174,7 @@
playsound(user, fire_sound, 50, 1)
in_chamber.on_hit(M)
if (!in_chamber.nodamage)
- user.apply_damage(in_chamber.damage*2.5, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]")
+ user.apply_damage(in_chamber.damage*100, in_chamber.damage_type, "head", used_weapon = "Point blank shot in the mouth with \a [in_chamber]")
else
user << "You feel dumb for trying this..."
del(in_chamber)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 9fa70809b5..8f2ea173cf 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -48,6 +48,7 @@
var/stutter = 0
var/eyeblur = 0
var/drowsy = 0
+ var/agony = 0
proc/on_hit(var/atom/target, var/blocked = 0)
@@ -55,7 +56,7 @@
if(!isliving(target)) return 0
if(isanimal(target)) return 0
var/mob/living/L = target
- L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, blocked)
+ L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
return 1
proc/check_fire(var/mob/living/target as mob, var/mob/living/user as mob) //Checks if you can hit them or not.
@@ -114,6 +115,7 @@
msg_admin_attack("ATTACK: UNKNOWN shot [M] ([M.ckey]) with a [src]") //BS12 EDIT ALG
spawn(0)
+
if(A)
if (!forcedodge)
forcedodge = A.bullet_act(src, def_zone) // searches for return value
@@ -125,7 +127,6 @@
loc = A.loc
permutated.Add(A)
return 0
-
if(istype(A,/turf))
for(var/obj/O in A)
O.bullet_act(src)
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index 02456cc1ea..b8789eca59 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -9,14 +9,15 @@
/obj/item/projectile/energy/electrode
name = "electrode"
icon_state = "spark"
- /* - Old taser bit
- nodamage = 0
+ nodamage = 1
+ /*
stun = 10
weaken = 10
stutter = 10
*/
- damage = 40
+ agony = 40
damage_type = HALLOSS
+ //Damage will be handled on the MOB side, to prevent window shattering.
diff --git a/code/setup.dm b/code/setup.dm
index 538e4e6548..c72f57f880 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -427,6 +427,7 @@ var/list/global_mutations = list() // list of hidden mutation things
#define WEAKEN "weaken"
#define PARALYZE "paralize"
#define IRRADIATE "irradiate"
+#define AGONY "agony" // Added in PAIN!
#define STUTTER "stutter"
#define EYE_BLUR "eye_blur"
#define DROWSY "drowsy"
diff --git a/icons/mob/human_races/r_def_vox.dmi b/icons/mob/human_races/r_def_vox.dmi
new file mode 100644
index 0000000000..4dad2129d5
Binary files /dev/null and b/icons/mob/human_races/r_def_vox.dmi differ
diff --git a/icons/mob/human_races/r_vox.dmi b/icons/mob/human_races/r_vox.dmi
new file mode 100644
index 0000000000..4dad2129d5
Binary files /dev/null and b/icons/mob/human_races/r_vox.dmi differ
diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi
index 4d681afb9f..4b002767f3 100644
Binary files a/icons/mob/mask.dmi and b/icons/mob/mask.dmi differ
diff --git a/maps/tgstation.2.1.0.0.1.dmm b/maps/tgstation.2.1.0.0.1.dmm
index 196a64fd3f..ffd412c4cc 100644
--- a/maps/tgstation.2.1.0.0.1.dmm
+++ b/maps/tgstation.2.1.0.0.1.dmm
@@ -7217,7 +7217,7 @@
"cIO" = (/obj/structure/stool/bed/chair{dir = 1},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed)
"cIP" = (/obj/machinery/computer/pod{id = "NTrasen"; name = "Hull Door Control"},/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; frequency = 1441; name = "Spec Ops Intercom"; pixel_y = 28},/turf/unsimulated/floor{icon_state = "grimy"},/area/centcom/creed)
"cIQ" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/secure/briefcase,/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
-"cIR" = (/turf/unsimulated/floor{tag = "icon-yellow (NORTHWEST)"; icon_state = "yellow"; dir = 9},/area/centcom/control)
+"cIR" = (/obj/effect/landmark{name = "Response Team"; tag = "Response Team"},/turf/unsimulated/floor{icon_state = "dark"},/area/centcom/control)
"cIS" = (/turf/unsimulated/floor{tag = "icon-yellow (NORTHEAST)"; icon_state = "yellow"; dir = 5},/area/centcom/control)
"cIT" = (/turf/unsimulated/floor{tag = "icon-whitehall (NORTHWEST)"; icon_state = "whitehall"; dir = 9},/area/centcom/control)
"cIU" = (/turf/unsimulated/floor{tag = "icon-whitehall (NORTHEAST)"; icon_state = "whitehall"; dir = 5},/area/centcom/control)
@@ -10032,6 +10032,7 @@
"dKV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/stool/bed/roller,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/medbay)
"dKW" = (/obj/structure/table/reinforced,/obj/machinery/computer/med_data/laptop,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
"dKX" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/camera{c_tag = "Medbay Foyer"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = -22},/obj/structure/table/reinforced,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/medical/medbay)
+"dKY" = (/obj/effect/landmark{name = "Response Team"; tag = "Response Team"},/turf/unsimulated/floor{tag = "icon-yellow (NORTHWEST)"; icon_state = "yellow"; dir = 9},/area/centcom/control)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -10437,10 +10438,10 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaactjctjctjctjctjctjctjctjctjctjctjctjctjcFycFycFycFycFycFycFycFycFycFycFycFycFycIhcIicIicIhaaaaaaaaacHzcIjcHZcHZcHZcHZcHzcHFcEOcHGcEicEJcEJcGAcEAcEAcEAcEAcEAcEAcEAcEAcEAcGJcEJcEJcEiaaaaaaaaaaaaaaacEicIkcHMcEicIccIlcIccFccHOcHOcHOcHOcHOcHOcEicEOcIecFecFecIfcEOcIgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacImcIncIncIncIncIocIocIncIncIpaaacHzcHZcHZcHZcHZcIqcHzcIrcEOcIscEicEicItcEicEicEicEicEicIucEicEicEicEicEicEicEicEiaaaaaaaaaaaaaaacEicIvcHMcEicFCcFccFccFccHOaaaaaaaaaaaaaaacEicEOcIecFecFecIfcEOcIgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIwcIxcIycIzcIAcIzcIzcIBcICcIncIpcHzcHZcIDcIEcIFcIGcHzcIHcEOcEOcEOcEOcEOcEOcIIcEicEicIJcIJcIJcEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicEicEicEicEicEicEicEicHOaaaaaaaaaaaaaaacIKcEOcIecFecFecIfcEOcIgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIwcIxcIycIzcIzcIzcIzcIzcIzcILcIMcHzcHZcINcIOcIPcIOcHzcIQcEOcIRcIScITcIUcEOcIVcEicEicEicIWcEicEicEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcEOcEOcIYcIYcEOcEOcIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIwcIxcIycIZcIZcIZcIZcIZcIZcIncJacHzcHZcHZcHZcHZcHZcHzcJbcEOcJccJdcJecJfcEOcJgcEicEzcGJcEJcGAcJhcEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicJicEOcEOcEOcEOcJjcEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJkcIncIncIncIncIncIncIncIncJaaaacHzcHzcHzcHzcHzcHzcHzcJlcEOcJmcJncJocJpcEOcJqcEicJrcJscJtcJscJucEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicEicEicEicEicEicEicEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicJvcEOcJwcJxcJycJzcEOcJAcJBcEIcJCcEJcJDcFScHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJEcJFcJGcJGcJGcJHcJIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIwcIxcIycIzcIzcIzcIzcIzcIzcILcIMcHzcHZcINcIOcIPcIOcHzcIQcIRdKYcIScITcIUcEOcIVcEicEicEicIWcEicEicEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIXcEOcEOcIYcIYcEOcEOcIXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIwcIxcIycIZcIZcIZcIZcIZcIZcIncJacHzcHZcHZcHZcHZcHZcHzcJbcIRcJccJdcJecJfcEOcJgcEicEzcGJcEJcGAcJhcEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicJicEOcEOcEOcEOcJjcEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJkcIncIncIncIncIncIncIncIncJaaaacHzcHzcHzcHzcHzcHzcHzcJlcIRcJmcJncJocJpcEOcJqcEicJrcJscJtcJscJucEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicEicEicEicEicEicEicEiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicJvcIRcJwcJxcJycJzcEOcJAcJBcEIcJCcEJcJDcFScHOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJEcJFcJGcJGcJGcJHcJIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicEOcEOcEOcEOcEOcEOcEOcJJcJBcETcHecGUcHecJKcHOaaaaaaaaaaaaaaaaaaaaaaaaaaacJEcJLcJMcJNcJOcJNcJPcJQcJIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEicJRcJScJTcJUcEOcJVcJWcJXcJBcJYcJZcKacJZcKbcHOaaaaaaaaaaaaaaaaaaaaaaaaaaacKccKdcKecKfcKfcKfcKgcKhcKcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcJBcKicJBcJBcJBcJBcEIcEJcKjcEJcKkcHOcHOcHOaaaaaaaaaaaaaaaaaaaaacKccKlcKecKfcKfcKmcKgcKncKcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa