diff --git a/code/__DEFINES/stat.dm b/code/__DEFINES/stat.dm
index 0aa113b0f68..756ae54765f 100644
--- a/code/__DEFINES/stat.dm
+++ b/code/__DEFINES/stat.dm
@@ -27,12 +27,6 @@
#define SHUTTLE_TRANSIT_DURATION 300 // 5 minutes = 300 seconds - how long it takes for the shuttle to get to the station
#define SHUTTLE_TRANSIT_DURATION_RETURN 120 // 2 minutes = 120 seconds - for some reason it takes less time to come back, go figure.
-//Shuttle moving status
-#define SHUTTLE_IDLE 0
-#define SHUTTLE_WARMUP 1
-#define SHUTTLE_INTRANSIT 2
-#define SHUTTLE_STRANDED 3
-
//Ferry shuttle processing status
#define IDLE_STATE 0
#define WAIT_LAUNCH 1
diff --git a/code/controllers/Processes/shuttles.dm b/code/controllers/Processes/shuttles.dm
index c7ef656bff2..f16d5b1c396 100644
--- a/code/controllers/Processes/shuttles.dm
+++ b/code/controllers/Processes/shuttles.dm
@@ -120,7 +120,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
var/area/signal_origin = get_area(user)
var/emergency_reason = "\nNature of emergency:\n\n[call_reason]"
- if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
+ if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
emergency.request(null, 0.5, signal_origin, html_decode(emergency_reason), 1)
else
emergency.request(null, 1, signal_origin, html_decode(emergency_reason), 0)
@@ -142,7 +142,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
return
if(ticker.mode.name == "meteor")
return
- if(seclevel2num(get_security_level()) == SEC_LEVEL_RED)
+ if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED)
if(emergency.timeLeft(1) < emergencyCallTime * 0.25)
return
else
diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm
index 30b12c88e81..e65ced5c08c 100644
--- a/code/controllers/configuration.dm
+++ b/code/controllers/configuration.dm
@@ -36,7 +36,7 @@
var/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard
var/traitor_scaling = 0 //if amount of traitors scales based on amount of players
var/protect_roles_from_antagonist = 0// If security and such can be tratior/cult/other
- var/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
+ var/continuous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke.
var/allow_Metadata = 0 // Metadata is supported.
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
var/Ticklag = 0.9
@@ -449,7 +449,7 @@
config.gateway_delay = text2num(value)
if("continuous_rounds")
- config.continous_rounds = 1
+ config.continuous_rounds = 1
if("ghost_interaction")
config.ghost_interaction = 1
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index ec1c34fee60..236b7c8e9b1 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -65,7 +65,9 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
caster.reset_view(0)
return 0
- if((user.z in config.admin_levels) && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
+ if(user.z == ZLEVEL_CENTCOMM && !centcom_cancast) //Certain spells are not allowed on the centcom zlevel
+ return 0
+ if(user.z == ZLEVEL_CENTCOMM && ticker.mode.name == "ragin' mages")
return 0
if(!skipcharge)
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
index 31c09813863..a115406548c 100644
--- a/code/datums/spells/lichdom.dm
+++ b/code/datums/spells/lichdom.dm
@@ -20,9 +20,9 @@
action_icon_state = "skeleton"
/obj/effect/proc_holder/spell/targeted/lichdom/New()
- if(!config.continous_rounds)
+ if(!config.continuous_rounds)
existence_stops_round_end = 1
- config.continous_rounds = 1
+ config.continuous_rounds = 1
..()
/obj/effect/proc_holder/spell/targeted/lichdom/Destroy()
@@ -31,7 +31,7 @@
if(istype(S,/obj/effect/proc_holder/spell/targeted/lichdom) && S != src)
return ..()
if(existence_stops_round_end)
- config.continous_rounds = 0
+ config.continuous_rounds = 0
return ..()
/obj/effect/proc_holder/spell/targeted/lichdom/cast(list/targets,mob/user = usr)
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index bbdbea1c724..69403bc5d8e 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -7,7 +7,6 @@ var/round_start_time = 0
var/hide_mode = 0 // leave here at 0 ! setup() will take care of it when needed for Secret mode -walter0o
var/datum/game_mode/mode = null
- var/post_game = 0
var/event_time = null
var/event = 0
@@ -386,16 +385,13 @@ var/round_start_time = 0
//emergency_shuttle.process() DONE THROUGH PROCESS SCHEDULER
- var/game_finished = 0
- var/mode_finished = 0
- if (config.continous_rounds)
- game_finished = (mode.station_was_nuked)
- mode_finished = (!post_game && mode.check_finished())
+ var/game_finished = shuttle_master.emergency.mode >= SHUTTLE_ENDGAME || mode.station_was_nuked
+ if (config.continuous_rounds)
+ mode.check_finished() // some modes contain var-changing code in here, so call even if we don't uses result
else
- game_finished = (mode.check_finished())
- mode_finished = game_finished
+ game_finished |= mode.check_finished()
- if(!mode.explosion_in_progress && game_finished && (mode_finished || post_game))
+ if(!mode.explosion_in_progress && game_finished)
current_state = GAME_STATE_FINISHED
auto_toggle_ooc(1) // Turn it on
spawn
@@ -409,18 +405,6 @@ var/round_start_time = 0
else
world.Reboot("Round ended.", "end_proper", "proper completion")
- else if (mode_finished)
- post_game = 1
-
- mode.cleanup()
-
- //call a transfer shuttle vote
- spawn(50)
- if(!round_end_announced) // Spam Prevention. Now it should announce only once.
- world << "\red The round has ended!"
- round_end_announced = 1
- vote.autotransfer()
-
return 1
proc/getfactionbyname(var/name)
diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm
index 4d436e29ca9..cc38ef0ef9f 100644
--- a/code/game/gamemodes/malfunction/malfunction.dm
+++ b/code/game/gamemodes/malfunction/malfunction.dm
@@ -148,7 +148,7 @@
if (station_captured && !to_nuke_or_not_to_nuke)
return 1
if (is_malf_ai_dead())
- if(config.continous_rounds)
+ if(config.continuous_rounds)
if(shuttle_master && shuttle_master.emergencyNoEscape)
shuttle_master.emergencyNoEscape = 0
malf_mode_declared = 0
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 34ec44a4245..6926c7f6067 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -111,10 +111,7 @@
..()
statpanel("Status")
- if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- if(timeleft > 0)
- stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
+ show_stat_emergency_shuttle_eta()
if (client.statpanel == "Status")
stat("Chemicals", chemicals)
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 99f0f98e256..7b056987953 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -262,6 +262,9 @@
/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S << "Attempting to dismantle this machine would result in an immediate counterattack. Aborting."
+/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ S << "Destroying this vehicle would destroy us. Aborting."
+
/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisperseTarget(src)
diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm
index 345114a4088..74e81484c97 100644
--- a/code/game/gamemodes/revolution/revolution.dm
+++ b/code/game/gamemodes/revolution/revolution.dm
@@ -203,15 +203,11 @@
//Checks if the round is over//
///////////////////////////////
/datum/game_mode/revolution/check_finished()
- if(config.continous_rounds)
+ if(config.continuous_rounds)
if(finished != 0)
if(shuttle_master && shuttle_master.emergencyNoEscape)
shuttle_master.emergencyNoEscape = 0
- return ..()
- if(finished != 0)
- return 1
- else
- return 0
+ return finished != 0
///////////////////////////////////////////////////
//Deals with converting players to the revolution//
diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm
index 7092469efd1..77703c53715 100644
--- a/code/game/gamemodes/wizard/raginmages.dm
+++ b/code/game/gamemodes/wizard/raginmages.dm
@@ -1,5 +1,5 @@
/datum/game_mode/wizard/raginmages
- name = "Ragin' Mages"
+ name = "ragin' mages"
config_tag = "raginmages"
required_players = 1
required_players_secret = 15
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index d0c6f059f26..b6052320615 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -1,15 +1,19 @@
/mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic
- var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","silenced","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg")
- var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo")
+ var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","arg","uzi","turret","pulsecarbine","decloner","mindflayer","hyperkinetic","advplasmacutter","wormhole","wt550","grenadelauncher","medibeam")
+ var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffhealing", "armor", "scrying", "staffdoor", "special","voodoo","special")
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos","necromantic")
+
usr << "You summoned [summon_type ? "magic" : "guns"]!"
message_admins("[key_name_admin(usr)] summoned [summon_type ? "magic" : "guns"]!")
+
for(var/mob/living/carbon/human/H in player_list)
- if(H.stat == 2 || !(H.client)) continue
+ if(H.stat == 2 || !(H.client))
+ continue
if(H.mind)
- if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice") continue
+ if(H.mind.special_role == "Wizard" || H.mind.special_role == "apprentice")
+ continue
var/randomizeguns = pick(gunslist)
var/randomizemagic = pick(magiclist)
var/randomizemagicspecial = pick(magicspeciallist)
@@ -25,43 +29,65 @@
new /obj/item/weapon/gun/projectile/revolver(get_turf(H))
if("detective")
new /obj/item/weapon/gun/projectile/revolver/detective(get_turf(H))
- if("c20r")
- new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
- if("nuclear")
- new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
if("deagle")
new /obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo(get_turf(H))
if("gyrojet")
new /obj/item/weapon/gun/projectile/automatic/gyropistol(get_turf(H))
if("pulse")
new /obj/item/weapon/gun/energy/pulse_rifle(get_turf(H))
- if("silenced")
+ if("suppressed")
new /obj/item/weapon/gun/projectile/automatic/pistol(get_turf(H))
new /obj/item/weapon/suppressor(get_turf(H))
- if("cannon")
- new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
if("doublebarrel")
new /obj/item/weapon/gun/projectile/revolver/doublebarrel(get_turf(H))
if("shotgun")
- new /obj/item/weapon/gun/projectile/shotgun/(get_turf(H))
+ new /obj/item/weapon/gun/projectile/shotgun(get_turf(H))
if("combatshotgun")
new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H))
- if("bulldog")
- new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
if("arg")
new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
if("mateba")
new /obj/item/weapon/gun/projectile/revolver/mateba(get_turf(H))
+ if("boltaction")
+ new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
+ if("uzi")
+ new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
+ if("cannon")
+ new /obj/item/weapon/gun/energy/lasercannon(get_turf(H))
+ if("crossbow")
+ new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow/large(get_turf(H))
+ if("nuclear")
+ new /obj/item/weapon/gun/energy/gun/nuclear(get_turf(H))
if("sabr")
new /obj/item/weapon/gun/projectile/automatic/proto(get_turf(H))
- if("crossbow")
- new /obj/item/weapon/gun/energy/kinetic_accelerator/crossbow(get_turf(H))
+ if("bulldog")
+ new /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog(get_turf(H))
+ if("c20r")
+ new /obj/item/weapon/gun/projectile/automatic/c20r(get_turf(H))
if("saw")
new /obj/item/weapon/gun/projectile/automatic/l6_saw(get_turf(H))
if("car")
new /obj/item/weapon/gun/projectile/automatic/m90(get_turf(H))
- if("boltaction")
- new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
+ if("turret")
+ new /obj/item/weapon/gun/energy/gun/turret(get_turf(H))
+ if("pulsecarbine")
+ new /obj/item/weapon/gun/energy/pulse_rifle/carbine(get_turf(H))
+ if("decloner")
+ new /obj/item/weapon/gun/energy/decloner(get_turf(H))
+ if("mindflayer")
+ new /obj/item/weapon/gun/energy/mindflayer(get_turf(H))
+ if("hyperkinetic")
+ new /obj/item/weapon/gun/energy/kinetic_accelerator/hyper(get_turf(H))
+ if("advplasmacutter")
+ new /obj/item/weapon/gun/energy/plasmacutter/adv(get_turf(H))
+ if("wormhole")
+ new /obj/item/weapon/gun/energy/wormhole_projector(get_turf(H))
+ if("wt550")
+ new /obj/item/weapon/gun/projectile/automatic/wt550(get_turf(H))
+ if("grenadelauncher")
+ new /obj/item/weapon/gun/projectile/revolver/grenadelauncher(get_turf(H))
+ if("medibeam")
+ new /obj/item/weapon/gun/medbeam(get_turf(H))
else
switch (randomizemagic)
if("fireball")
@@ -80,6 +106,8 @@
new /obj/item/weapon/spellbook/oneuse/horsemask(get_turf(H))
if("charge")
new /obj/item/weapon/spellbook/oneuse/charge(get_turf(H))
+ if("summonitem")
+ new /obj/item/weapon/spellbook/oneuse/summonitem(get_turf(H))
if("wandnothing")
new /obj/item/weapon/gun/magic/wand(get_turf(H))
if("wanddeath")
@@ -109,10 +137,8 @@
H.see_in_dark = 8
H.see_invisible = SEE_INVISIBLE_LEVEL_TWO
H << "The walls suddenly disappear."
-
if("voodoo")
new /obj/item/voodoo(get_turf(H))
-
if("special")
magiclist -= "special" //only one super OP item per summoning max
switch (randomizemagicspecial)
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index 1f91e489934..83c23311297 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -412,6 +412,12 @@
cost = 0
log_name = "SG"
+/datum/spellbook_entry/summon/guns/IsAvailible()
+ if(ticker.mode.name == "ragin' mages")
+ return 0
+ else
+ return 1
+
/datum/spellbook_entry/summon/guns/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
user.rightandwrong(0)
@@ -427,6 +433,12 @@
cost = 0
log_name = "SU"
+/datum/spellbook_entry/summon/magic/IsAvailible()
+ if(ticker.mode.name == "ragin' mages")
+ return 0
+ else
+ return 1
+
/datum/spellbook_entry/summon/magic/Buy(var/mob/living/carbon/human/user,var/obj/item/weapon/spellbook/book)
feedback_add_details("wizard_spell_learned",log_name)
user.rightandwrong(1)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index 2f34c567dd3..37a6c801573 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -203,10 +203,6 @@
/datum/game_mode/wizard/check_finished()
-
- if(config.continous_rounds)
- return ..()
-
var/wizards_alive = 0
var/traitors_alive = 0
for(var/datum/mind/wizard in wizards)
diff --git a/code/game/gamemodes/xenos/xenos.dm b/code/game/gamemodes/xenos/xenos.dm
index f30debb7e98..4ae05c7dd21 100644
--- a/code/game/gamemodes/xenos/xenos.dm
+++ b/code/game/gamemodes/xenos/xenos.dm
@@ -135,15 +135,7 @@
return ..()
/datum/game_mode/xenos/check_finished()
- if(config.continous_rounds)
- if(result)
- return ..()
- if(shuttle_master && shuttle_master.emergency.mode >= SHUTTLE_ESCAPE)
- return ..()
- if(result || station_was_nuked)
- return 1
- else
- return 0
+ return result != 0
/datum/game_mode/xenos/proc/xenos_alive()
var/list/livingxenos = list()
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index f3e6de46321..5251898e7c7 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -1,4 +1,5 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+#define OP_COMPUTER_COOLDOWN 60
/obj/machinery/computer/operating
name = "operating computer"
@@ -7,10 +8,18 @@
icon_keyboard = "med_key"
icon_screen = "crew"
circuit = /obj/item/weapon/circuitboard/operating
- var/mob/living/carbon/human/victim = null
var/obj/machinery/optable/table = null
-
+ var/mob/living/carbon/human/victim = null
light_color = LIGHT_COLOR_PURE_BLUE
+ var/verbose = 1 //general speaker toggle
+ var/patientName = null
+ var/oxyAlarm = 30 //oxy damage at which the computer will beep
+ var/choice = 0 //just for going into and out of the options menu
+ var/healthAnnounce = 1 //healther announcer toggle
+ var/crit = 1 //crit beeping toggle
+ var/nextTick = OP_COMPUTER_COOLDOWN
+ var/healthAlarm = 50
+ var/oxy = 1 //oxygen beeping toggle
/obj/machinery/computer/operating/New()
..()
@@ -24,7 +33,7 @@
add_fingerprint(user)
if(stat & (BROKEN|NOPOWER))
return
- interact(user)
+ ui_interact(user)
/obj/machinery/computer/operating/attack_hand(mob/user)
@@ -36,45 +45,119 @@
add_fingerprint(user)
- interact(user)
+ ui_interact(user)
+
+
+///obj/machinery/computer/operating/interact(mob/user)
+// if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) )
+// if (!istype(user, /mob/living/silicon))
+// user.unset_machine()
+// user << browse(null, "window=op")
+// return
+//
+// user.set_machine(src)
+// var/dat = "
Operating Computer\n"
+// dat += "Close
" //| Update"
+// if(src.table && (src.table.check_victim()))
+// src.victim = src.table.victim
+// dat += {"
+//Patient Information:
+//
+//Name: [src.victim.real_name]
+//Age: [src.victim.age]
+//Blood Type: [src.victim.b_type]
+//
+//Health: [src.victim.health]
+//Brute Damage: [src.victim.getBruteLoss()]
+//Toxins Damage: [src.victim.getToxLoss()]
+//Fire Damage: [src.victim.getFireLoss()]
+//Suffocation Damage: [src.victim.getOxyLoss()]
+//Patient Status: [src.victim.stat ? "Non-Responsive" : "Awake"]
+//Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
+//"}
+// else
+// src.victim = null
+// dat += {"
+//Patient Information:
+//
+//No Patient Detected
+//"}
+// user << browse(dat, "window=op")
+// onclose(user, "op")
+
+/obj/machinery/computer/operating/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)//ui is mostly copy pasta from the sleeper ui
+ var/data[0]
+ var/mob/living/carbon/human/occupant = src.table.victim
+ data["hasOccupant"] = occupant ? 1 : 0
+ var/occupantData[0]
+
+ if (occupant)
+ occupantData["name"] = occupant.name
+ occupantData["stat"] = occupant.stat
+ occupantData["health"] = occupant.health
+ occupantData["maxHealth"] = occupant.maxHealth
+ occupantData["minHealth"] = config.health_threshold_dead
+ occupantData["bruteLoss"] = occupant.getBruteLoss()
+ occupantData["oxyLoss"] = occupant.getOxyLoss()
+ occupantData["toxLoss"] = occupant.getToxLoss()
+ occupantData["fireLoss"] = occupant.getFireLoss()
+ occupantData["paralysis"] = occupant.paralysis
+ occupantData["hasBlood"] = 0
+ occupantData["bodyTemperature"] = occupant.bodytemperature
+ occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
+ // Because we can put simple_animals in here, we need to do something tricky to get things working nice
+ occupantData["temperatureSuitability"] = 0 // 0 is the baseline
+ if (ishuman(occupant) && occupant.species)
+ var/datum/species/sp = occupant.species
+ if (occupant.bodytemperature < sp.cold_level_3)
+ occupantData["temperatureSuitability"] = -3
+ else if (occupant.bodytemperature < sp.cold_level_2)
+ occupantData["temperatureSuitability"] = -2
+ else if (occupant.bodytemperature < sp.cold_level_1)
+ occupantData["temperatureSuitability"] = -1
+ else if (occupant.bodytemperature > sp.heat_level_3)
+ occupantData["temperatureSuitability"] = 3
+ else if (occupant.bodytemperature > sp.heat_level_2)
+ occupantData["temperatureSuitability"] = 2
+ else if (occupant.bodytemperature > sp.heat_level_1)
+ occupantData["temperatureSuitability"] = 1
+ else if (istype(occupant, /mob/living/simple_animal))
+ var/mob/living/simple_animal/silly = occupant
+ if (silly.bodytemperature < silly.minbodytemp)
+ occupantData["temperatureSuitability"] = -3
+ else if (silly.bodytemperature > silly.maxbodytemp)
+ occupantData["temperatureSuitability"] = 3
+ // Blast you, imperial measurement system
+ occupantData["btCelsius"] = occupant.bodytemperature - T0C
+ occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32
+
+ if (ishuman(occupant) && occupant.vessel && !(occupant.species && occupant.species.flags & NO_BLOOD))
+ occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL)
+ occupantData["hasBlood"] = 1
+ occupantData["bloodLevel"] = round(occupant.vessel.get_reagent_amount("blood"))
+ occupantData["bloodMax"] = occupant.max_blood
+ occupantData["bloodPercent"] = round(100*(occupant.vessel.get_reagent_amount("blood")/occupant.max_blood), 0.01) //copy pasta ends here
+
+ occupantData["bloodType"]=occupant.b_type
+
+ data["occupant"] = occupantData
+ data["verbose"]=verbose
+ data["oxyAlarm"]=oxyAlarm
+ data["choice"]=choice
+ data["health"]=healthAnnounce
+ data["crit"]=crit
+ data["healthAlarm"]=healthAlarm
+ data["oxy"]=oxy
+
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open)
+ if (!ui)
+ ui = new(user, src, ui_key, "op_computer.tmpl", "Patient Monitor", 650, 455)
+ ui.set_initial_data(data)
+ ui.open()
+ ui.set_auto_update(1)
-/obj/machinery/computer/operating/interact(mob/user)
- if ( ((get_dist(src, user) > 1) && !isobserver(user)) || (stat & (BROKEN|NOPOWER)) )
- if (!istype(user, /mob/living/silicon))
- user.unset_machine()
- user << browse(null, "window=op")
- return
- user.set_machine(src)
- var/dat = "Operating Computer\n"
- dat += "Close
" //| Update"
- if(src.table && (src.table.check_victim()))
- src.victim = src.table.victim
- dat += {"
-Patient Information:
-
-Name: [src.victim.real_name]
-Age: [src.victim.age]
-Blood Type: [src.victim.b_type]
-
-Health: [src.victim.health]
-Brute Damage: [src.victim.getBruteLoss()]
-Toxins Damage: [src.victim.getToxLoss()]
-Fire Damage: [src.victim.getFireLoss()]
-Suffocation Damage: [src.victim.getOxyLoss()]
-Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
-Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
-"}
- else
- src.victim = null
- dat += {"
-Patient Information:
-
-No Patient Detected
-"}
- user << browse(dat, "window=op")
- onclose(user, "op")
/obj/machinery/computer/operating/Topic(href, href_list)
@@ -82,9 +165,48 @@
return 1
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
+
+ if(href_list["verboseOn"])
+ verbose=1
+ if(href_list["verboseOff"])
+ verbose=0
+ if(href_list["healthOn"])
+ healthAnnounce=1
+ if(href_list["healthOff"])
+ healthAnnounce=0
+ if(href_list["critOn"])
+ crit=1
+ if(href_list["critOff"])
+ crit=0
+ if(href_list["oxyOn"])
+ oxy=1
+ if(href_list["oxyOff"])
+ oxy=0
+ if(href_list["oxy_adj"]!=0)
+ oxyAlarm=oxyAlarm+text2num(href_list["oxy_adj"])
+ if(href_list["choiceOn"])
+ choice=1
+ if(href_list["choiceOff"])
+ choice=0
+ if(href_list["health_adj"]!=0)
+ healthAlarm=healthAlarm+text2num(href_list["health_adj"])
return
/obj/machinery/computer/operating/process()
- if(..())
- src.updateDialog()
+
+ if(table && table.check_victim())
+ if(verbose)
+ if(patientName!=table.victim.name)
+ patientName=table.victim.name
+ atom_say("New patient detected, loading stats")
+ victim = table.victim
+ atom_say("[victim.real_name], [victim.b_type] blood, [victim.stat ? "Non-Responsive" : "Awake"]")
+ if(nextTick < world.time)
+ nextTick=world.time + OP_COMPUTER_COOLDOWN
+ if(crit && victim.health <= -50 )
+ playsound(src.loc, 'sound/machines/defib_success.ogg', 50, 0)
+ if(oxy && victim.getOxyLoss()>oxyAlarm)
+ playsound(src.loc, 'sound/machines/defib_saftyOff.ogg', 50, 0)
+ if(healthAnnounce && victim.health <= healthAlarm)
+ atom_say("[round(victim.health)]")
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 9dede30f469..ea2dadda3b4 100644
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -437,7 +437,7 @@
user << "Under directive 7-10, [station_name()] is quarantined until further notice."
return
- if(seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
+ if(seclevel2num(get_security_level()) >= SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes.
shuttle_master.emergency.request(null, 0.5, null, " Automatic Crew Transfer", 1)
else
shuttle_master.emergency.request(null, 1, null, " Automatic Crew Transfer", 0)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index a211c7d0fda..83e1f3f723e 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -882,8 +882,8 @@ About the new airlock wires panel:
src.closeOther.close()
return ..()
-/obj/machinery/door/airlock/close(var/forced=0)
- if(operating || welded || locked)
+/obj/machinery/door/airlock/close(var/forced=0, var/override = 0)
+ if((operating & !override) || welded || locked)
return
if(!forced)
//despite the name, this wire is for general door control.
@@ -918,11 +918,11 @@ About the new airlock wires panel:
operating = 1
do_animate("closing")
src.layer = 3.1
- sleep(5)
+ if (!override) sleep(5)
src.density = 1
if(!safe)
crush()
- sleep(5)
+ if(!override) sleep(5)
update_icon()
if(visible && !glass)
set_opacity(1)
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index 17e35850d8c..d0477eead0d 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -271,7 +271,7 @@
singular_name = "glass sheet"
icon_state = "sheet-plasmaglass"
materials = list(MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2)
- origin_tech = "materials=3;plasma=2"
+ origin_tech = "materials=3;plasmatech=2"
var/created_window = /obj/structure/window/plasmabasic
var/full_window = /obj/structure/window/full/plasmabasic
@@ -360,7 +360,7 @@
singular_name = "reinforced plasma glass sheet"
icon_state = "sheet-plasmarglass"
materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT/2, MAT_GLASS=MINERAL_MATERIAL_AMOUNT*2)
- origin_tech = "materials=3;plasma=2"
+ origin_tech = "materials=3;plasmatech=2"
var/created_window = /obj/structure/window/plasmareinforced
var/full_window = /obj/structure/window/full/plasmareinforced
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index ecdb2ac28ad..6a3493fc0ea 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1753,4 +1753,33 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/figure/warden
name = "Warden action figure"
icon_state = "warden"
- toysay = "Execute him for breaking in!"
\ No newline at end of file
+ toysay = "Execute him for breaking in!"
+
+//////////////////////////////////////////////////////
+// Magic 8-Ball / Conch //
+//////////////////////////////////////////////////////
+
+/obj/item/toy/eight_ball
+ name = "Magic 8-Ball"
+ desc = "Mystical! Magical! Ages 8+!"
+ icon = 'icons/obj/toy.dmi'
+ icon_state = "eight-ball"
+ var/use_action = "shakes the ball"
+ var/cooldown = 0
+ var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.")
+
+/obj/item/toy/eight_ball/attack_self(mob/user as mob)
+ if(!cooldown)
+ var/answer = pick(possible_answers)
+ user.visible_message("[user] focuses on their question and [use_action]...")
+ user.visible_message("\icon[src] The [src] says \"[answer]\"")
+ spawn(30)
+ cooldown = 0
+ return
+
+/obj/item/toy/eight_ball/conch
+ name = "Magic Conch Shell"
+ desc = "All hail the Magic Conch!"
+ icon_state = "conch"
+ use_action = "pulls the string"
+ possible_answers = list("Yes.", "No.", "Try asking again.", "Nothing.", "I don't think so.", "Neither.", "Maybe someday.")
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index fa10ce2daf8..ac5897367f8 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -461,7 +461,7 @@
max_fuel = 40
w_class = 3.0
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=4;plasma=3"
+ origin_tech = "engineering=4;plasmatech=3"
var/last_gen = 0
change_icons = 0
can_off_process = 1
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index fa525e22e1f..cca76f4b42b 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -1,5 +1,54 @@
/mob/var/suiciding = 0
+/mob/living/carbon/human/proc/do_suicide(damagetype, byitem)
+ var/threshold = (config.health_threshold_crit + config.health_threshold_dead) / 2
+ var/dmgamt = maxHealth - threshold
+
+ var/damage_mod = 1
+ switch(damagetype) //Sorry about the magic numbers.
+ //brute = 1, burn = 2, tox = 4, oxy = 8
+ if(15) //4 damage types
+ damage_mod = 4
+
+ if(6, 11, 13, 14) //3 damage types
+ damage_mod = 3
+
+ if(3, 5, 7, 9, 10, 12) //2 damage types
+ damage_mod = 2
+
+ if(1, 2, 4, 8) //1 damage type
+ damage_mod = 1
+
+ else //This should not happen, but if it does, everything should still work
+ damage_mod = 1
+
+ //Do dmgamt damage divided by the number of damage types applied.
+ if(damagetype & BRUTELOSS)
+ adjustBruteLoss(dmgamt / damage_mod)
+
+ if(damagetype & FIRELOSS)
+ adjustFireLoss(dmgamt / damage_mod)
+
+ if(damagetype & TOXLOSS)
+ adjustToxLoss(dmgamt / damage_mod)
+
+ if(damagetype & OXYLOSS)
+ adjustOxyLoss(dmgamt / damage_mod)
+
+ // Failing that...
+ if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS))
+ if(species.flags & NO_BREATHE)
+ // the ultimate fallback
+ take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0)
+ else
+ adjustOxyLoss(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
+
+ var/obj/item/organ/external/affected = get_organ("head")
+ if(affected)
+ affected.add_autopsy_data(byitem ? "Suicide by [byitem]" : "Suicide", dmgamt)
+
+ updatehealth()
+
/mob/living/carbon/human/verb/suicide()
set hidden = 1
@@ -24,56 +73,11 @@
if(held_item)
var/damagetype = held_item.suicide_act(src)
if(damagetype)
- var/damage_mod = 1
- switch(damagetype) //Sorry about the magic numbers.
- //brute = 1, burn = 2, tox = 4, oxy = 8
- if(15) //4 damage types
- damage_mod = 4
-
- if(6, 11, 13, 14) //3 damage types
- damage_mod = 3
-
- if(3, 5, 7, 9, 10, 12) //2 damage types
- damage_mod = 2
-
- if(1, 2, 4, 8) //1 damage type
- damage_mod = 1
-
- else //This should not happen, but if it does, everything should still work
- damage_mod = 1
-
- //Do 175 damage divided by the number of damage types applied.
- if(damagetype & BRUTELOSS)
- adjustBruteLoss(175/damage_mod)
-
- if(damagetype & FIRELOSS)
- adjustFireLoss(175/damage_mod)
-
- if(damagetype & TOXLOSS)
- adjustToxLoss(175/damage_mod)
-
- if(damagetype & OXYLOSS)
- adjustOxyLoss(175/damage_mod)
-
- //If something went wrong, just do normal oxyloss
- if(!(damagetype | BRUTELOSS) && !(damagetype | FIRELOSS) && !(damagetype | TOXLOSS) && !(damagetype | OXYLOSS))
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
-
- var/obj/item/organ/external/affected = get_organ("head")
- affected.add_autopsy_data("Suicide by [held_item]", 175)
-
- updatehealth()
+ do_suicide(damagetype, held_item)
return
-
- viewers(src) << pick("\red [src] is attempting to bite \his tongue off! It looks like \he's trying to commit suicide.", \
- "\red [src] is jamming \his thumbs into \his eye sockets! It looks like \he's trying to commit suicide.", \
- "\red [src] is twisting \his own neck! It looks like \he's trying to commit suicide.", \
- "\red [src] is holding \his breath! It looks like \he's trying to commit suicide.")
- adjustOxyLoss(max(175 - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
-
- var/obj/item/organ/external/affected = get_organ("head")
- affected.add_autopsy_data("Suicide", 175)
+ viewers(src) << "[src] [pick(species.suicide_messages)] It looks like they're trying to commit suicide."
+ do_suicide(0)
updatehealth()
diff --git a/code/modules/arcade/arcade_prize.dm b/code/modules/arcade/arcade_prize.dm
index 30374d31a52..960ead4a0b6 100644
--- a/code/modules/arcade/arcade_prize.dm
+++ b/code/modules/arcade/arcade_prize.dm
@@ -17,7 +17,7 @@
playsound(src.loc, 'sound/items/bubblewrap.ogg', 30, 1, extrarange = -4, falloff = 10)
icon_state = "prizeconfetti"
src.color = pick(random_color_list)
- var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure) //will add ticket bundles later
+ var/prize_inside = pick(/obj/random/carp_plushie, /obj/random/plushie, /obj/random/figure, /obj/item/toy/eight_ball) //will add ticket bundles later
spawn(10)
user.unEquip(src)
new prize_inside(user.loc)
diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm
index 23d2bcb7bdf..44bb65e9e10 100644
--- a/code/modules/clothing/spacesuits/rig/modules/computer.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm
@@ -57,13 +57,6 @@
else
integrated_ai.get_rig_stats = 0
-/mob/living/Stat()
- . = ..()
- if(. && get_rig_stats)
- var/obj/item/weapon/rig/rig = get_rig()
- if(rig)
- SetupStat(rig)
-
/obj/item/rig_module/ai_container/proc/update_verb_holder()
if(!verb_holder)
verb_holder = new(src)
diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm
index 183255ca635..6e19fab742c 100644
--- a/code/modules/clothing/spacesuits/rig/modules/modules.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm
@@ -225,13 +225,6 @@
/obj/item/rig_module/proc/accepts_item(var/obj/item/input_device)
return 0
-/mob/living/carbon/human/Stat()
- . = ..()
-
- if(. && istype(back,/obj/item/weapon/rig))
- var/obj/item/weapon/rig/R = back
- SetupStat(R)
-
/mob/proc/SetupStat(var/obj/item/weapon/rig/R)
if(R && (R.flags & NODROP) && R.installed_modules.len && statpanel("Hardsuit Modules"))
var/cell_status = R.cell ? "[R.cell.charge]/[R.cell.maxcharge]" : "ERROR"
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2716ba0a439..90b568110b3 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -210,7 +210,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
..()
statpanel("Status")
if (client.statpanel == "Status")
- stat(null, "Station Time: [worldtime2text()]")
+ show_stat_station_time()
if(ticker)
if(ticker.mode)
//world << "DEBUG: ticker not null"
@@ -218,10 +218,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
//world << "DEBUG: malf mode ticker test"
if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
- if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- if(timeleft > 0)
- stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
+ show_stat_emergency_shuttle_eta()
/mob/dead/observer/verb/reenter_corpse()
set category = "Ghost"
diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm
index 956453c4640..e58b3420c93 100644
--- a/code/modules/mob/living/carbon/alien/alien.dm
+++ b/code/modules/mob/living/carbon/alien/alien.dm
@@ -181,10 +181,7 @@
if (client.statpanel == "Status")
stat(null, "Plasma Stored: [getPlasma()]/[max_plasma]")
- if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- if(timeleft > 0)
- stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
+ show_stat_emergency_shuttle_eta()
/mob/living/carbon/alien/Stun(amount)
if(status_flags & CANSTUN)
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 3fe57ec2acc..8e6da1eca78 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -83,12 +83,8 @@ I'm using this for Stat to give it a more nifty interface to work with
..()
if(has_synthetic_assistance())
statpanel("Status")
- stat(null, "Station Time: [worldtime2text()]")
-
- if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- if(timeleft > 0)
- stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
+ show_stat_station_time()
+ show_stat_emergency_shuttle_eta()
if(client.statpanel == "Status")
//Knowing how well-off your mech is doing is really important as an MMI
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index 132965764c4..93b57850974 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -32,9 +32,19 @@
else //Everyone else fails, skip the emote attempt
return
if("squish")
+ var/found_slime_bodypart = 0
+
if(species.name == "Slime People") //Only Slime People can squish
- on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
- else //Everyone else fails, skip the emote attempt
+ on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
+ found_slime_bodypart = 1
+ else
+ for(var/obj/item/organ/external/L in organs) // if your limbs are squishy you can squish too!
+ if(L.dna.species in list("Slime People"))
+ on_CD = handle_emote_CD()
+ found_slime_bodypart = 1
+ break
+
+ if(!found_slime_bodypart) //Everyone else fails, skip the emote attempt
return
if("scream", "fart", "flip", "snap")
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index d82376c2f86..57c29c3d51d 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -252,15 +252,13 @@
stat(null, "Intent: [a_intent]")
stat(null, "Move Mode: [m_intent]")
- stat(null, "Station Time: [worldtime2text()]")
+ show_stat_station_time()
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
if(ticker.mode:malf_mode_declared)
stat(null, "Time left: [max(ticker.mode:AI_win_timeleft/(ticker.mode:apcs/3), 0)]")
- if(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- if(timeleft > 0)
- stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]")
+
+ show_stat_emergency_shuttle_eta()
if(client.statpanel == "Status")
if(locate(/obj/item/device/assembly/health) in src)
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index ae11d2e8746..799226ea321 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -17,6 +17,9 @@
has_organ = list(
"brain" = /obj/item/organ/brain/golem
)
+ suicide_messages = list(
+ "is crumbling into dust!",
+ "is smashing their body apart!")
/datum/species/golem/handle_post_spawn(var/mob/living/carbon/human/H)
if(H.mind)
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 3727bd8de0a..635eb9ede3e 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -20,6 +20,11 @@
bodyflags = FEET_NOSLIP
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
reagent_tag = PROCESS_ORG
+ suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is staring into the closest light source!")
/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
H.dust()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index 82c7864dd46..7c813b4b1be 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -30,4 +30,9 @@
heat_level_1 = 999999999
heat_level_2 = 999999999
heat_level_3 = 999999999
- heat_level_3_breathe = 999999999
\ No newline at end of file
+ heat_level_3_breathe = 999999999
+
+ suicide_messages = list(
+ "is snapping their own bones!",
+ "is collapsing into a pile!",
+ "is twisting their skull off!")
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 20b1ecdfba3..cfb04c5427d 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -88,6 +88,11 @@
//Death vars.
var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
+ var/list/suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their thumbs into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!")
// Language/culture vars.
var/default_language = "Galactic Common" // Default language is used when 'say' is used without modifiers.
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index ff9ae6ff835..349b28b6efb 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -55,6 +55,12 @@
flesh_color = "#34AF10"
reagent_tag = PROCESS_ORG
base_color = "#066000"
+
+ suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!")
/datum/species/unathi/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -100,6 +106,12 @@
reagent_tag = PROCESS_ORG
flesh_color = "#AFA59E"
base_color = "#333333"
+
+ suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!")
/datum/species/tajaran/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -135,6 +147,12 @@
reagent_tag = PROCESS_ORG
flesh_color = "#966464"
base_color = "#B43214"
+
+ suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!")
/datum/species/vulpkanin/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -206,6 +224,13 @@
flesh_color = "#808D11"
reagent_tag = PROCESS_ORG
+
+ suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!",
+ "is deeply inhaling oxygen!")
/datum/species/vox/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
@@ -292,6 +317,13 @@
"eyes" = /obj/item/organ/eyes,
"stack" = /obj/item/organ/stack/vox
)
+
+ suicide_messages = list(
+ "is attempting to bite their tongue off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!",
+ "is huffing oxygen!")
/datum/species/kidan
name = "Kidan"
@@ -311,6 +343,12 @@
dietflags = DIET_HERB
blood_color = "#FB9800"
reagent_tag = PROCESS_ORG
+
+ suicide_messages = list(
+ "is attempting to bite their antenna off!",
+ "is jamming their claws into their eye sockets!",
+ "is twisting their own neck!",
+ "is holding their breath!")
/datum/species/slime
name = "Slime People"
@@ -333,6 +371,10 @@
has_organ = list(
"brain" = /obj/item/organ/brain/slime
)
+
+ suicide_messages = list(
+ "is melting into a puddle!",
+ "is turning a dull, brown color and melting into a puddle!")
/datum/species/grey
name = "Grey"
@@ -433,6 +475,10 @@
"l_foot" = list("path" = /obj/item/organ/external/diona/foot),
"r_foot" = list("path" = /obj/item/organ/external/diona/foot/right)
)
+
+ suicide_messages = list(
+ "is losing branches!",
+ "is pulling themselves apart!")
/datum/species/diona/can_understand(var/mob/other)
var/mob/living/simple_animal/diona/D = other
@@ -526,6 +572,12 @@
"l_foot" = list("path" = /obj/item/organ/external/foot/ipc),
"r_foot" = list("path" = /obj/item/organ/external/foot/right/ipc)
)
+
+ suicide_messages = list(
+ "is powering down!",
+ "is smashing their own monitor!",
+ "is twisting their own neck!",
+ "is blocking their ventilation port!")
/datum/species/machine/handle_death(var/mob/living/carbon/human/H)
H.h_style = ""
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 49488f529ac..8f078f18f90 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -2,6 +2,13 @@
/mob/living/Destroy()
..()
return QDEL_HINT_HARDDEL_NOW
+
+/mob/living/Stat()
+ . = ..()
+ if(. && get_rig_stats)
+ var/obj/item/weapon/rig/rig = get_rig()
+ if(rig)
+ SetupStat(rig)
//mob verbs are a lot faster than object verbs
//for more info on why this is not atom/pull, see examinate() in mob.dm
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 83f12db46dd..f1f5f7862b3 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -142,25 +142,11 @@
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(shuttle_master.emergency.mode >= SHUTTLE_RECALL)
- var/timeleft = shuttle_master.emergency.timeLeft()
- if(timeleft > 0)
- stat(null, "[add_zero(num2text((timeleft / 60) % 60),2)]:[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()
if(statpanel("Status"))
- show_station_time()
- show_emergency_shuttle_eta()
+ show_stat_station_time()
+ show_stat_emergency_shuttle_eta()
show_system_integrity()
show_malf_ai()
..()
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
index e91719c5915..6c4986541a6 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm
@@ -258,7 +258,7 @@
if(spawnees & 128)
C = new(src.loc)
C.name = "Drone plasma overcharge counter"
- C.origin_tech = "plasma=[rand(3,6)]"
+ C.origin_tech = "plasmatech=[rand(3,6)]"
if(spawnees & 256)
C = new(src.loc)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 623905c75e7..e1b2ce1477d 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -990,6 +990,36 @@ var/list/slot_equipment_priority = list( \
statpanel("Status") // Switch to the Status panel again, for the sake of the lazy Stat procs
+// this function displays the station time in the status panel
+/mob/proc/show_stat_station_time()
+ stat(null, "Station Time: [worldtime2text()]")
+
+// this function displays the shuttles ETA in the status panel if the shuttle has been called
+/mob/proc/show_stat_emergency_shuttle_eta()
+ var/obj/docking_port/mobile/emergency/E = shuttle_master.emergency
+
+ if(E.mode >= SHUTTLE_RECALL)
+ var/message = ""
+
+ var/timeleft = E.timeLeft()
+ message = "[add_zero(num2text((timeleft / 60) % 60),2)]:[add_zero(num2text(timeleft % 60), 2)]"
+
+ switch(E.mode)
+ if(SHUTTLE_RECALL, SHUTTLE_ESCAPE)
+ message = "ETR-[message]"
+ if(SHUTTLE_CALL)
+ message = "ETA-[message]"
+ if(SHUTTLE_DOCKED)
+ if(timeleft < 5)
+ message = "Departing..."
+ else
+ message = "ETD-[message]"
+ if(SHUTTLE_STRANDED)
+ message = "ETA-ERR"
+ if(SHUTTLE_ENDGAME)
+ return
+
+ stat(null, message)
/mob/proc/add_stings_to_statpanel(var/list/stings)
for(var/obj/effect/proc_holder/changeling/S in stings)
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index ae999cbcf03..bd5ba3ee0c8 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -30,21 +30,6 @@
return STATUS_INTERACTIVE // interactive (green visibility)
return STATUS_DISABLED // no updates, completely disabled (red visibility)
-/mob/living/silicon/robot/syndicate/default_can_use_topic(var/src_object)
- . = ..()
- if(. != STATUS_INTERACTIVE)
- return
-
- if(z in config.admin_levels) // Syndicate borgs can interact with everything on the admin level
- return STATUS_INTERACTIVE
- if(istype(get_area(src), /area/syndicate_station)) // If elsewhere, they can interact with everything on the syndicate shuttle
- return STATUS_INTERACTIVE
- if(istype(src_object, /obj/machinery)) // Otherwise they can only interact with emagged machinery
- var/obj/machinery/Machine = src_object
- if(Machine.emagged)
- return STATUS_INTERACTIVE
- return STATUS_UPDATE
-
/mob/living/silicon/ai/default_can_use_topic(var/src_object)
. = shared_nano_interaction()
if(. != STATUS_INTERACTIVE)
diff --git a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
index ee5b8ac050a..e2892ee3b89 100644
--- a/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
+++ b/code/modules/reagents/oldchem/reagents/drink/reagents_alcohol.dm
@@ -36,7 +36,8 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && (H.species.name == "Skrell" || H.species.name =="Neara")) //Skrell and Neara get very drunk very quickly.
+ var/obj/item/organ/liver/L = H.internal_organs_by_name["liver"]
+ if(!L || (istype(L) && L.dna.species in list("Skrell", "Neara")))
d*=5
M.dizziness += dizzy_adj.
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 1808e62ed11..260438fbed8 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -402,12 +402,14 @@
var/obj/machinery/door/Door = O
spawn(-1)
if(Door)
- Door.close()
if(istype(Door, /obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = Door
+ A.close(0,1)
if(A.id_tag == "s_docking_airlock")
A.lock()
door_unlock_list += A
+ else
+ Door.close()
else if (istype(AM,/mob))
var/mob/M = AM
if(!M.move_on_shuttle)
diff --git a/config/example/game_options.txt b/config/example/game_options.txt
index 9ccb4871aef..69847e0a6b6 100644
--- a/config/example/game_options.txt
+++ b/config/example/game_options.txt
@@ -69,8 +69,7 @@ BOMBCAP 20
### ROUNDSTART SILICON LAWS ###
## This controls what the AI's laws are at the start of the round.
-## Set to 0/commented for "off", silicons will just start with Asimov.
-## Set to 1 for "custom", silicons will start with the custom laws defined in silicon_laws.txt. (If silicon_laws.txt is empty, the AI will spawn with asimov and Custom boards will auto-delete.)
-## Set to 2 for "random", silicons will start with a random lawset picked from (at the time of writing): P.A.L.A.D.I.N., Corporate, Asimov. More can be added by changing the law datum paths in ai_laws.dm.
+## Set to 0/commented for "off", silicons will just start with Crewsimov.
+## Set to 1 for "random", silicons will start with a random lawset picked from (at the time of writing): Nanotrasen Default, P.A.L.A.D.I.N., Corporate, Robop and Crewsimov. More can be added by changing the law datum "default" variable in ai_laws.dm.
-DEFAULT_LAWS 2
\ No newline at end of file
+DEFAULT_LAWS 1
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 866190c8971..56172c88974 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,34 @@
-->
+
31 January 2016
+
Crazylemon64 updated:
+
+ - Syndicate borgs can now interact with station machinery
+ - People with slime people limbs can now *squish
+ - Skrell's vulnerability to alcohol is checked on their liver, now - a liver transplant will let them take alcohol like a champ - lacking a liver will have the same effect as being a skrell, when drinking
+
+
FalseIncarnate updated:
+
+ - Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
+ - Adds in the Magic Conch Shell, an admin-only shell of power.
+
+
Fox McCloud updated:
+
+ - Updates Summon Guns and Magic to include many of the new guns
+ - Summon Guns/Magic can no longer be used during Ragin' Mages
+
+
Tastyfish updated:
+
+ - The emergency shuttle status in the Status tab now has ETA/ETD/etc like before.
+ - Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
+
+
pinatacolada updated:
+
+ - Adds NanoUI to the operating computer
+ - Adds health announcing, critical and oxygen damage aural alerts to the computer, with a menu to selectively turn them on and off
+
+
29 January 2016
Crazylemon updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 18a867d7ab6..70cedd14768 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -358,3 +358,24 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
bullets to reach a state of what our scientists refer to as "enough dakka,"
Syndicate High Command has decided to restore the Syndicate Strike Team arsenal
to using standard-issue L6 SAW ammunition.
+2016-01-31:
+ Crazylemon64:
+ - bugfix: Syndicate borgs can now interact with station machinery
+ - rscadd: People with slime people limbs can now *squish
+ - tweak: Skrell's vulnerability to alcohol is checked on their liver, now - a liver
+ transplant will let them take alcohol like a champ - lacking a liver will have
+ the same effect as being a skrell, when drinking
+ FalseIncarnate:
+ - rscadd: Adds in the Magic Eight Ball toy, found in Claw Game prize orbs.
+ - rscadd: Adds in the Magic Conch Shell, an admin-only shell of power.
+ Fox McCloud:
+ - rscadd: Updates Summon Guns and Magic to include many of the new guns
+ - tweak: Summon Guns/Magic can no longer be used during Ragin' Mages
+ Tastyfish:
+ - rscadd: The emergency shuttle status in the Status tab now has ETA/ETD/etc like
+ before.
+ - tweak: Code Gamma+ now has a 5 minute emergency shuttle call, like Red.
+ pinatacolada:
+ - rscadd: Adds NanoUI to the operating computer
+ - rscadd: Adds health announcing, critical and oxygen damage aural alerts to the
+ computer, with a menu to selectively turn them on and off
diff --git a/html/changelogs/AutoChangeLog-pr-3461.yml b/html/changelogs/AutoChangeLog-pr-3461.yml
new file mode 100644
index 00000000000..ca27ae1f755
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3461.yml
@@ -0,0 +1,5 @@
+author: Tastyfish
+delete-after: True
+changes:
+ - bugfix: "Species that don't breathe can kill themselves now!"
+ - rscadd: "Suicide messages are now catered to your species."
diff --git a/icons/obj/toy.dmi b/icons/obj/toy.dmi
index 39b795fdc04..6e6d268c9bd 100644
Binary files a/icons/obj/toy.dmi and b/icons/obj/toy.dmi differ
diff --git a/nano/templates/op_computer.tmpl b/nano/templates/op_computer.tmpl
new file mode 100644
index 00000000000..027fdf3443b
--- /dev/null
+++ b/nano/templates/op_computer.tmpl
@@ -0,0 +1,208 @@
+
+Patient Monitor
+
+
+ {{if data.choice==0}}
+ {{if !data.hasOccupant}}
+
No Patient Detected
+ {{else}}
+
+ {{:data.occupant.name}} =>
+ {{if data.occupant.stat == 0}}
+ Conscious
+ {{else data.occupant.stat == 1}}
+ Unconscious
+ {{else}}
+ DEAD
+ {{/if}}
+
+
+
+
Health:
+ {{if data.occupant.health >= data.occupant.maxHealth}}
+ {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}}
+ {{else data.occupant.health > 0}}
+ {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'average')}}
+ {{else data.occupant.health >= data.minhealth}}
+ {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average alignRight')}}
+ {{else}}
+ {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'bad alignRight')}}
+ {{/if}}
+
{{:helper.round(data.occupant.health)}}
+
+
+
+
Brute Damage:
+ {{:helper.displayBar(data.occupant.bruteLoss, 0, data.occupant.maxHealth, 'bad')}}
+
{{:helper.round(data.occupant.bruteLoss)}}
+
+
+
+
Resp. Damage:
+ {{:helper.displayBar(data.occupant.oxyLoss, 0, data.occupant.maxHealth, 'bad')}}
+
{{:helper.round(data.occupant.oxyLoss)}}
+
+
+
+
Toxin Damage:
+ {{:helper.displayBar(data.occupant.toxLoss, 0, data.occupant.maxHealth, 'bad')}}
+
{{:helper.round(data.occupant.toxLoss)}}
+
+
+
+
Burn Severity:
+ {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}}
+
{{:helper.round(data.occupant.fireLoss)}}
+
+
+
+
Patient Temperature:
+ {{if data.occupant.temperatureSuitability == -3}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'bad')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == -2}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == -1}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 0}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'good')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 1}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 2}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'average')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{else data.occupant.temperatureSuitability == 3}}
+ {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'bad')}}
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
+ {{/if}}
+
+ {{if data.occupant.hasBlood}}
+
+
+
Blood Level:
+ {{if data.occupant.bloodPercent <= 60}}
+ {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'bad')}}
+
+ {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl
+
+ {{else data.occupant.bloodPercent <= 90}}
+ {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'average')}}
+
+ {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl
+
+ {{else}}
+ {{:helper.displayBar(data.occupant.bloodLevel, 0, data.occupant.bloodMax, 'good')}}
+
+ {{:data.occupant.bloodPercent}}%, {{:data.occupant.bloodLevel}}cl
+
+ {{/if}}
+
+
Blood Type:
{{:data.occupant.bloodType}}
+
+
+
+
Pulse:
{{:data.occupant.pulse}} bpm
+
+ {{/if}}
+
+
+
+ {{/if}}
+
+
+ {{:helper.link('Options', 'gear', {'choiceOn' : 1})}}
+
+
+ {{else}}
+
+
+ Loudspeaker:
+
+
+ {{:helper.link('On', 'power-off', {'verboseOn' : 1}, data.verbose ? 'selected' : null)}}
+ {{:helper.link('Off', 'close', {'verboseOff' : 1}, data.verbose ? null : 'selected')}}
+
+
+
+
+
+ Health Announcer:
+
+
+ {{:helper.link('On', 'power-off', {'healthOn' : 1}, data.health ? 'selected' : null)}}
+ {{:helper.link('Off', 'close', {'healthOff' : 1}, data.health ? null : 'selected')}}
+
+
+
+
+
+
Health Announcer Threshold:
+ {{:helper.link('-', null, {'health_adj' : -100}, (data.healthAlarm >= 0) ? null : 'disabled')}}
+ {{:helper.link('-', null, {'health_adj' : -10}, (data.healthAlarm >= -90) ? null : 'disabled')}}
+ {{:helper.link('-', null, {'health_adj' : -1}, (data.healthAlarm > -100) ? null : 'disabled')}}
+
+ {{if data.healthAlarm >= 100}}
+ {{:helper.displayBar(data.healthAlarm, 0, 100, 'good')}}
+ {{else data.healthAlarm > 0}}
+ {{:helper.displayBar(data.healthAlarm, 0, 100, 'average')}}
+ {{else data.healthAlarm >= -100}}
+ {{:helper.displayBar(data.healthAlarm, 0, -100, 'average alignRight')}}
+ {{else}}
+ {{:helper.displayBar(data.healthAlarm, 0, -100, 'bad alignRight')}}
+ {{/if}}
+
+ {{:helper.link('+', null, {'health_adj' : 1}, (data.healthAlarm < 100) ? null : 'disabled')}}
+ {{:helper.link('+', null, {'health_adj' : 10}, (data.healthAlarm <= 90) ? null : 'disabled')}}
+ {{:helper.link('+', null, {'health_adj' : 100}, (data.healthAlarm <= 0) ? null : 'disabled')}}
+
{{: data.healthAlarm }}
+
+
+
+
+
+ Oxygen Alarm:
+
+
+ {{:helper.link('On', 'power-off', {'oxyOn' : 1}, data.oxy ? 'selected' : null)}}
+ {{:helper.link('Off', 'close', {'oxyOff' : 1}, data.oxy ? null : 'selected')}}
+
+
+
+
+
+
Oxygen Alert Threshold:
+ {{:helper.link('-', null, {'oxy_adj' : -100}, (data.oxyAlarm >= 100) ? null : 'disabled')}}
+ {{:helper.link('-', null, {'oxy_adj' : -10}, (data.oxyAlarm >= 10) ? null : 'disabled')}}
+ {{:helper.link('-', null, {'oxy_adj' : -1}, (data.oxyAlarm >= 0) ? null : 'disabled')}}
+ {{:helper.displayBar( data.oxyAlarm, 0, 200, 'good')}}
+ {{:helper.link('+', null, {'oxy_adj' : 1}, (data.oxyAlarm < 200) ? null : 'disabled')}}
+ {{:helper.link('+', null, {'oxy_adj' : 10}, (data.oxyAlarm <= 190) ? null : 'disabled')}}
+ {{:helper.link('+', null, {'oxy_adj' : 100}, (data.oxyAlarm <= 100) ? null : 'disabled')}}
+
{{: data.oxyAlarm }}
+
+
+
+
+
+ Critical Alert:
+
+
+ {{:helper.link('On', 'power-off', {'critOn' : 1}, data.crit ? 'selected' : null)}}
+ {{:helper.link('Off', 'close', {'critOff' : 1}, data.crit ? null : 'selected')}}
+
+
+
+
+
+ {{:helper.link('Return', 'arrow-left', {'choiceOff' : 1})}}
+
+
+ {{/if}}
+