////////////////////////////////////
///// Rendering stats window ///////
////////////////////////////////////
/obj/mecha/proc/get_stats_html()
var/output = {"
[name] data
[get_stats_part()]
[get_equipment_list()]
[get_commands()]
"}
return output
/obj/mecha/proc/report_internal_damage()
var/output = null
var/list/dam_reports = list(
"[MECHA_INT_FIRE]" = "INTERNAL FIRE",
"[MECHA_INT_TEMP_CONTROL]" = "LIFE SUPPORT SYSTEM MALFUNCTION",
"[MECHA_INT_TANK_BREACH]" = "GAS TANK BREACH",
"[MECHA_INT_CONTROL_LOST]" = "COORDINATION SYSTEM CALIBRATION FAILURE - Recalibrate",
"[MECHA_INT_SHORT_CIRCUIT]" = "SHORT CIRCUIT"
)
for(var/tflag in dam_reports)
var/intdamflag = text2num(tflag)
if(hasInternalDamage(intdamflag))
output += dam_reports[tflag]
output += "
"
if(cabin_air.return_pressure() > WARNING_HIGH_PRESSURE)
output += "DANGEROUSLY HIGH CABIN PRESSURE
"
return output
/obj/mecha/proc/get_stats_part()
var/integrity = obj_integrity/max_integrity*100
var/cell_charge = get_charge()
var/tank_pressure = internal_tank ? round(internal_tank.return_pressure(),0.01) : "None"
var/tank_temperature = internal_tank ? internal_tank.return_temperature() : "Unknown"
var/tank_temperature_c = internal_tank ? internal_tank.return_temperature() - T0C : "Unknown"
var/cabin_pressure = round(cabin_air.return_pressure(), 0.01)
. = "[report_internal_damage()]"
. += "[integrity<30?"DAMAGE LEVEL CRITICAL
":null]"
. += "Integrity: [integrity]%
"
. += "Powercell charge: [isnull(cell_charge)?"No powercell installed":"[cell.percent()]%"]
"
. += "Air source: [use_internal_tank?"Internal Airtank":"Environment"]
"
. += "Airtank pressure: [tank_pressure]kPa
"
. += "Airtank temperature: [tank_temperature]°K|[tank_temperature_c]°C
"
. += "Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
"
. += "Cabin temperature: [cabin_air.temperature()]°K|[cabin_air.temperature() - T0C]°C
"
. += "Lights: [lights?"on":"off"]
"
. += "[dna ? "DNA-locked:
[dna] \[Reset\]
" : ""]"
. += "[defense_action.owner ? "Defence Mode: [defence_mode ? "Enabled" : "Disabled"]
" : ""]"
. += "[overload_action.owner ? "Leg Actuators Overload: [leg_overload_mode ? "Enabled" : "Disabled"]
" : ""]"
. += "[thrusters_action.owner ? "Thrusters: [thrusters_active ? "Enabled" : "Disabled"]
" : ""]"
. += "[smoke_action.owner ? "Smoke: [smoke]
" : ""]"
. += "[zoom_action.owner ? "Zoom: [zoom_mode ? "Enabled" : "Disabled"]
" : ""]"
. += "[phasing_action.owner ? "Phase Modulator: [phasing ? "Enabled" : "Disabled"]
" : ""]"
/obj/mecha/proc/get_commands()
. = ""
. += ""
. += ""
. += ""
. += "
"
. += "Eject
"
/obj/mecha/proc/get_equipment_menu() //outputs mecha html equipment menu
. = ""
if(length(equipment))
. += ""
. += ""
. += "
"
for(var/obj/item/mecha_parts/mecha_equipment/W in equipment)
. += "[W.name]
Detach"
. += "
Available equipment slots: [max_equip-length(equipment)]"
. += "
"
/obj/mecha/proc/get_equipment_list() //outputs mecha equipment list in html
if(!length(equipment))
return
. = "Equipment:"
for(var/obj/item/mecha_parts/mecha_equipment/MT in equipment)
. += "
[MT.get_equip_info()]
"
. += "
"
/obj/mecha/proc/get_log_html()
var/output = "[name] Log"
for(var/list/entry in log)
output += {"[time2text(entry["time"],"DDD MMM DD hh:mm:ss")] 2555
[entry["message"]]
"}
output += ""
return output
/obj/mecha/proc/get_log_tgui()
var/list/data = list()
for(var/list/entry in log)
data.Add(list(list(
"time" = time2text(entry["time"], "hh:mm:ss"),
"message" = entry["message"],
)))
return data
/obj/mecha/proc/output_access_dialog(obj/item/card/id/id_card, mob/user)
if(!id_card || !user) return
var/output = {"
Following keycodes are present in this system:
"}
for(var/a in operation_req_access)
output += "[get_access_desc(a)] - Delete
"
output += "
Delete All
"
output += "
Following keycodes were detected on portable device:
"
for(var/a in id_card.access)
if(a in operation_req_access) continue
if(!get_access_desc(a))
continue //there's some strange access without a name
output += "[get_access_desc(a)] - Add
"
output += "
Add All
"
output += "
Finish (Warning! The ID upload panel will be locked. It can be unlocked only through Exosuit Interface.)"
output += ""
user << browse(output, "window=exosuit_add_access")
onclose(user, "exosuit_add_access")
return
/obj/mecha/proc/output_maintenance_dialog(obj/item/card/id/id_card,mob/user)
if(!id_card || !user) return
var/output = {"
[add_req_access?"Edit operation keycodes":null]
[maint_access?"Initiate/Stop maintenance protocol":null]
[(state>0) ?"Set Cabin Air Pressure":null]
"}
user << browse(output, "window=exosuit_maint_console")
onclose(user, "exosuit_maint_console")
return
////////////////////////////////
/////// Messages and Log ///////
////////////////////////////////
/obj/mecha/proc/occupant_message(message as text)
if(message)
if(occupant && occupant.client)
to_chat(occupant, "[bicon(src)] [message]")
return
/obj/mecha/proc/log_message(message as text,red=null)
log.len++
log[length(log)] = list("time"=world.timeofday,"message"="[red?"":null][message][red?"":null]")
return length(log)
/obj/mecha/proc/log_append_to_last(message as text,red=null)
var/list/last_entry = log[length(log)]
last_entry["message"] += "
[red?"":null][message][red?"":null]"
return
/////////////////
///// Topic /////
/////////////////
/obj/mecha/Topic(href, href_list)
..()
if(href_list["update_content"])
if(usr != occupant) return
send_byjax(occupant,"exosuit.browser","content",get_stats_part())
return
if(href_list["close"])
return
if(usr.stat != CONSCIOUS)
return
var/datum/topic_input/afilter = new /datum/topic_input(href,href_list)
if(href_list["select_equip"])
if(usr != occupant) return
var/obj/item/mecha_parts/mecha_equipment/equip = afilter.getObj("select_equip")
if(equip)
selected = equip
occupant_message("You switch to [equip]")
visible_message("[src] raises [equip]")
send_byjax(occupant, "exosuit.browser", "eq_list", get_equipment_list())
return
if(href_list["eject"])
if(usr != occupant) return
go_out()
return
if(href_list["toggle_lights"])
if(usr != occupant) return
toggle_lights()
return
if(href_list["toggle_airtank"])
if(usr != occupant) return
toggle_internal_tank()
return
if(href_list["rmictoggle"])
if(usr != occupant) return
radio.broadcasting = !radio.broadcasting
send_byjax(occupant,"exosuit.browser","rmicstate",(radio.broadcasting?"Engaged":"Disengaged"))
return
if(href_list["rspktoggle"])
if(usr != occupant) return
radio.listening = !radio.listening
send_byjax(occupant,"exosuit.browser","rspkstate",(radio.listening?"Engaged":"Disengaged"))
return
if(href_list["rfreq"])
if(usr != occupant) return
var/new_frequency = (radio.frequency + afilter.getNum("rfreq"))
if(radio.frequency < PUBLIC_LOW_FREQ || radio.frequency > PUBLIC_HIGH_FREQ)
new_frequency = sanitize_frequency(new_frequency)
radio.set_frequency(new_frequency)
send_byjax(occupant,"exosuit.browser","rfreq","[format_frequency(radio.frequency)]")
return
if(href_list["view_log"])
if(usr != occupant) return
occupant << browse(get_log_html(), "window=exosuit_log")
onclose(occupant, "exosuit_log")
return
if(href_list["change_name"])
if(usr != occupant) return
var/newname = strip_html_simple(input(occupant,"Choose new exosuit name","Rename exosuit",initial(name)) as text, MAX_NAME_LEN)
if(newname && trim(newname))
name = newname
log_game("[key_name(occupant)] has renamed an exosuit [newname]")
else
alert(occupant, "nope.avi")
return
if(href_list["toggle_id_upload"])
if(usr != occupant) return
add_req_access = !add_req_access
send_byjax(occupant,"exosuit.browser","t_id_upload","[add_req_access?"L":"Unl"]ock ID upload panel")
return
if(href_list["toggle_maint_access"])
if(usr != occupant) return
if(state)
occupant_message("Maintenance protocols in effect")
return
maint_access = !maint_access
send_byjax(occupant,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols")
return
if(href_list["req_access"] && add_req_access)
if(!in_range(src, usr)) return
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
return
if(href_list["maint_access"] && maint_access)
if(!in_range(src, usr)) return
var/mob/user = afilter.getMob("user")
if(user)
if(state == MECHA_MAINT_OFF)
state = MECHA_MAINT_ON
to_chat(user, "The securing bolts are now exposed.")
if(occupant)
occupant.throw_alert("locked", /atom/movable/screen/alert/mech_maintenance)
else if(state == MECHA_MAINT_ON)
state = MECHA_MAINT_OFF
to_chat(user, "The securing bolts are now hidden.")
if(occupant)
occupant.clear_alert("locked")
output_maintenance_dialog(afilter.getObj("id_card"),user)
return
if(href_list["set_internal_tank_valve"] && state >= MECHA_MAINT_ON)
if(!in_range(src, usr)) return
var/mob/user = afilter.getMob("user")
if(user)
var/new_pressure = input(user,"Input new output pressure","Pressure setting",internal_tank_valve) as num
if(new_pressure)
internal_tank_valve = new_pressure
to_chat(user, "The internal pressure valve has been set to [internal_tank_valve]kPa.")
if(href_list["add_req_access"] && add_req_access && afilter.getObj("id_card"))
if(!in_range(src, usr)) return
operation_req_access += afilter.getNum("add_req_access")
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
return
if(href_list["add_all_req_access"] && add_req_access && afilter.getObj("id_card"))
if(!in_range(src, usr))
return
var/obj/item/card/id/mycard = afilter.getObj("id_card")
var/list/myaccess = mycard.access
for(var/a in myaccess)
if(get_access_desc(a))
operation_req_access += a
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
return
if(href_list["del_req_access"] && add_req_access && afilter.getObj("id_card"))
if(!in_range(src, usr)) return
operation_req_access -= afilter.getNum("del_req_access")
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
return
if(href_list["del_all_req_access"] && add_req_access && afilter.getObj("id_card"))
if(!in_range(src, usr))
return
operation_req_access = list()
output_access_dialog(afilter.getObj("id_card"),afilter.getMob("user"))
return
if(href_list["finish_req_access"])
if(!in_range(src, usr)) return
add_req_access = 0
var/mob/user = afilter.getMob("user")
user << browse(null,"window=exosuit_add_access")
return
if(href_list["dna_lock"])
if(usr != occupant)
return
if(occupant && !iscarbon(occupant))
to_chat(occupant, "You do not have any DNA!")
return
dna = occupant.dna.unique_enzymes
occupant_message("You feel a prick as the needle takes your DNA sample.")
return
if(href_list["reset_dna"])
if(usr != occupant) return
dna = null
if(href_list["repair_int_control_lost"])
if(usr != occupant) return
occupant_message("Recalibrating coordination system.")
log_message("Recalibration of coordination system started.")
var/T = loc
spawn(100)
if(T == loc)
clearInternalDamage(MECHA_INT_CONTROL_LOST)
occupant_message("Recalibration successful.")
log_message("Recalibration of coordination system finished with 0 errors.")
else
occupant_message("Recalibration failed.")
log_message("Recalibration of coordination system failed with 1 error.",1)
//debug
/*
if(href_list["debug"])
if(href_list["set_i_dam"])
setInternalDamage(afilter.getNum("set_i_dam"))
if(href_list["clear_i_dam"])
clearInternalDamage(afilter.getNum("clear_i_dam"))
return
*/
return