mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-02-07 14:50:21 +00:00
248 lines
8.6 KiB
Plaintext
248 lines
8.6 KiB
Plaintext
/obj/item/mecha_parts/mecha_equipment/tool/sleeper
|
|
name = "mounted sleeper"
|
|
desc = "A sleeper. Mountable to an exosuit. (Can be attached to: Medical Exosuits)"
|
|
icon = 'icons/obj/Cryogenic2.dmi'
|
|
icon_state = "sleeper_0"
|
|
origin_tech = list(TECH_DATA = 2, TECH_BIO = 3)
|
|
energy_drain = 20
|
|
range = MELEE
|
|
equip_cooldown = 30
|
|
mech_flags = EXOSUIT_MODULE_MEDICAL
|
|
var/mob/living/carbon/human/occupant = null
|
|
var/datum/global_iterator/pr_mech_sleeper
|
|
var/inject_amount = 5
|
|
required_type = list(/obj/mecha/medical)
|
|
salvageable = 0
|
|
allow_duplicate = TRUE
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/New()
|
|
..()
|
|
pr_mech_sleeper = new /datum/global_iterator/mech_sleeper(list(src),0)
|
|
pr_mech_sleeper.set_delay(equip_cooldown)
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Destroy()
|
|
qdel(pr_mech_sleeper)
|
|
for(var/atom/movable/AM in src)
|
|
AM.forceMove(get_turf(src))
|
|
return ..()
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Exit(atom/movable/O)
|
|
return 0
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/action(var/mob/living/carbon/human/target)
|
|
if(!action_checks(target))
|
|
return
|
|
if(!istype(target))
|
|
return
|
|
if(target.buckled)
|
|
occupant_message("[target] will not fit into the sleeper because they are buckled to [target.buckled].")
|
|
return
|
|
if(occupant)
|
|
occupant_message("The sleeper is already occupied")
|
|
return
|
|
if(target.has_buckled_mobs())
|
|
occupant_message(span("warning", "\The [target] has other entities attached to it. Remove them first."))
|
|
return
|
|
occupant_message("You start putting [target] into [src].")
|
|
chassis.visible_message("[chassis] starts putting [target] into the [src].")
|
|
var/C = chassis.loc
|
|
var/T = target.loc
|
|
if(do_after_cooldown(target))
|
|
if(chassis.loc!=C || target.loc!=T)
|
|
return
|
|
if(occupant)
|
|
occupant_message("<font color=\"red\"><B>The sleeper is already occupied!</B></font>")
|
|
return
|
|
target.forceMove(src)
|
|
occupant = target
|
|
target.reset_view(src)
|
|
occupant.Stasis(3)
|
|
/*
|
|
if(target.client)
|
|
target.client.perspective = EYE_PERSPECTIVE
|
|
target.client.eye = chassis
|
|
*/
|
|
set_ready_state(0)
|
|
pr_mech_sleeper.start()
|
|
occupant_message("<font color='blue'>[target] successfully loaded into [src]. Life support functions engaged.</font>")
|
|
chassis.visible_message("[chassis] loads [target] into [src].")
|
|
log_message("[target] loaded. Life support functions engaged.")
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/go_out()
|
|
if(!occupant)
|
|
return
|
|
occupant.forceMove(get_turf(src))
|
|
occupant_message("[occupant] ejected. Life support functions disabled.")
|
|
log_message("[occupant] ejected. Life support functions disabled.")
|
|
occupant.reset_view()
|
|
/*
|
|
if(occupant.client)
|
|
occupant.client.eye = occupant.client.mob
|
|
occupant.client.perspective = MOB_PERSPECTIVE
|
|
*/
|
|
occupant.Stasis(0)
|
|
occupant = null
|
|
pr_mech_sleeper.stop()
|
|
set_ready_state(1)
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/detach()
|
|
if(occupant)
|
|
occupant_message("Unable to detach [src] - equipment occupied.")
|
|
return
|
|
pr_mech_sleeper.stop()
|
|
return ..()
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/get_equip_info()
|
|
var/output = ..()
|
|
if(output)
|
|
var/temp = ""
|
|
if(occupant)
|
|
temp = "<br />\[Occupant: [occupant] (Health: [occupant.health]%)\]<br /><a href='?src=\ref[src];view_stats=1'>View stats</a>|<a href='?src=\ref[src];eject=1'>Eject</a>"
|
|
return "[output] [temp]"
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/Topic(href,href_list)
|
|
..()
|
|
var/datum/topic_input/top_filter = new /datum/topic_input(href,href_list)
|
|
if(top_filter.get("eject"))
|
|
go_out()
|
|
if(top_filter.get("view_stats"))
|
|
chassis.occupant << browse(get_occupant_stats(),"window=msleeper")
|
|
onclose(chassis.occupant, "msleeper")
|
|
return
|
|
if(top_filter.get("inject"))
|
|
inject_reagent(top_filter.getType("inject",/datum/reagent),top_filter.getObj("source"))
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_occupant_stats()
|
|
if(!occupant)
|
|
return
|
|
return {"<html>
|
|
<head>
|
|
<title>[occupant] statistics</title>
|
|
<script language='javascript' type='text/javascript'>
|
|
[js_byjax]
|
|
</script>
|
|
<style>
|
|
h3 {margin-bottom:2px;font-size:14px;}
|
|
#lossinfo, #reagents, #injectwith {padding-left:15px;}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<h3>Health statistics</h3>
|
|
<div id="lossinfo">
|
|
[get_occupant_dam()]
|
|
</div>
|
|
<h3>Reagents in bloodstream</h3>
|
|
<div id="reagents">
|
|
[get_occupant_reagents()]
|
|
</div>
|
|
<div id="injectwith">
|
|
[get_available_reagents()]
|
|
</div>
|
|
</body>
|
|
</html>"}
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_occupant_dam()
|
|
var/t1
|
|
switch(occupant.stat)
|
|
if(0)
|
|
t1 = "Conscious"
|
|
if(1)
|
|
t1 = "Unconscious"
|
|
if(2)
|
|
t1 = "*dead*"
|
|
else
|
|
t1 = "Unknown"
|
|
return {"<font color="[occupant.health > 50 ? "blue" : "red"]"><b>Health:</b> [occupant.health]% ([t1])</font><br />
|
|
<font color="[occupant.bodytemperature > 50 ? "blue" : "red"]"><b>Core Temperature:</b> [src.occupant.bodytemperature-T0C]°C ([src.occupant.bodytemperature*1.8-459.67]°F)</font><br />
|
|
<font color="[occupant.getBruteLoss() < 60 ? "blue" : "red"]"><b>Brute Damage:</b> [occupant.getBruteLoss()]%</font><br />
|
|
<font color="[occupant.getOxyLoss() < 60 ? "blue" : "red"]"><b>Respiratory Damage:</b> [occupant.getOxyLoss()]%</font><br />
|
|
<font color="[occupant.getToxLoss() < 60 ? "blue" : "red"]"><b>Toxin Content:</b> [occupant.getToxLoss()]%</font><br />
|
|
<font color="[occupant.getFireLoss() < 60 ? "blue" : "red"]"><b>Burn Severity:</b> [occupant.getFireLoss()]%</font><br />
|
|
"}
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_occupant_reagents()
|
|
if(occupant.reagents)
|
|
for(var/datum/reagent/R in occupant.reagents.reagent_list)
|
|
if(R.volume > 0)
|
|
. += "[R]: [round(R.volume,0.01)]<br />"
|
|
return . || "None"
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/get_available_reagents()
|
|
var/output
|
|
var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/SG = locate(/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun) in chassis
|
|
if(SG && SG.reagents && islist(SG.reagents.reagent_list))
|
|
for(var/datum/reagent/R in SG.reagents.reagent_list)
|
|
if(R.volume > 0)
|
|
output += "<a href=\"?src=\ref[src];inject=\ref[R];source=\ref[SG]\">Inject [R.name]</a><br />"
|
|
return output
|
|
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/proc/inject_reagent(var/datum/reagent/R,var/obj/item/mecha_parts/mecha_equipment/tool/syringe_gun/SG)
|
|
if(!R || !occupant || !SG || !(SG in chassis.equipment))
|
|
return 0
|
|
var/to_inject = min(R.volume, inject_amount)
|
|
if(to_inject && occupant.reagents.get_reagent_amount(R.id) + to_inject > inject_amount*4)
|
|
occupant_message("Sleeper safeties prohibit you from injecting more than [inject_amount*4] units of [R.name].")
|
|
else
|
|
occupant_message("Injecting [occupant] with [to_inject] units of [R.name].")
|
|
log_message("Injecting [occupant] with [to_inject] units of [R.name].")
|
|
//SG.reagents.trans_id_to(occupant,R.id,to_inject)
|
|
SG.reagents.remove_reagent(R.id,to_inject)
|
|
occupant.reagents.add_reagent(R.id,to_inject)
|
|
update_equip_info()
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/update_equip_info()
|
|
if(..())
|
|
send_byjax(chassis.occupant,"msleeper.browser","lossinfo",get_occupant_dam())
|
|
send_byjax(chassis.occupant,"msleeper.browser","reagents",get_occupant_reagents())
|
|
send_byjax(chassis.occupant,"msleeper.browser","injectwith",get_available_reagents())
|
|
return 1
|
|
return
|
|
|
|
/obj/item/mecha_parts/mecha_equipment/tool/sleeper/verb/eject()
|
|
set name = "Sleeper Eject"
|
|
set category = "Exosuit Interface"
|
|
set src = usr.loc
|
|
set popup_menu = 0
|
|
if(usr!=src.occupant || usr.stat == 2)
|
|
return
|
|
to_chat(usr,"<span class='notice'>Release sequence activated. This will take one minute.</span>")
|
|
sleep(600)
|
|
if(!src || !usr || !occupant || (occupant != usr)) //Check if someone's released/replaced/bombed him already
|
|
return
|
|
go_out()//and release him from the eternal prison.
|
|
|
|
/datum/global_iterator/mech_sleeper
|
|
|
|
/datum/global_iterator/mech_sleeper/process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S)
|
|
if(!S.chassis)
|
|
S.set_ready_state(1)
|
|
return stop()
|
|
if(!S.chassis.has_charge(S.energy_drain))
|
|
S.set_ready_state(1)
|
|
S.log_message("Deactivated.")
|
|
S.occupant_message("[src] deactivated - no power.")
|
|
return stop()
|
|
var/mob/living/carbon/M = S.occupant
|
|
if(!M)
|
|
return
|
|
if(M.health > 0)
|
|
M.adjustOxyLoss(-1)
|
|
M.updatehealth()
|
|
M.AdjustStunned(-4)
|
|
M.AdjustWeakened(-4)
|
|
M.AdjustStunned(-4)
|
|
M.Paralyse(2)
|
|
M.Weaken(2)
|
|
M.Stun(2)
|
|
if(M.reagents.get_reagent_amount("inaprovaline") < 5)
|
|
M.reagents.add_reagent("inaprovaline", 5)
|
|
S.chassis.use_power(S.energy_drain)
|
|
S.update_equip_info()
|
|
return |