From 61841bfd7aaa8ae61ef0b1f27916789961b5f979 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 19 Oct 2015 11:36:21 -0700 Subject: [PATCH 01/28] NanoUI Bodyscanner Oh dear god this took fucking hours of work. I don't think it's even better than the fucking whitetext. Ahhhg god. --- code/game/machinery/adv_med.dm | 636 ++++++++++++++++++--------------- nano/templates/adv_med.tmpl | 308 ++++++++++++++++ 2 files changed, 659 insertions(+), 285 deletions(-) create mode 100644 nano/templates/adv_med.tmpl diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 1d6e07b04c6..12feea91c04 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -12,12 +12,12 @@ light_color = "#00FF00" - power_change() - ..() - if(!(stat & (BROKEN|NOPOWER))) - set_light(2) - else - set_light(0) +/obj/machinery/bodyscanner/power_change() + ..() + if(!(stat & (BROKEN|NOPOWER))) + set_light(2) + else + set_light(0) /obj/machinery/bodyscanner/New() ..() @@ -66,130 +66,85 @@ default_deconstruction_crowbar(G) if(istype(G, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/TYPECAST_YOUR_SHIT = G if(panel_open) - user << "\blue Close the maintenance panel first." + user << "Close the maintenance panel first." return - if(!ismob(G:affecting)) + if(!ismob(TYPECAST_YOUR_SHIT.affecting)) return - if (src.occupant) - user << "\blue The scanner is already occupied!" + if(occupant) + user << "The scanner is already occupied!" return - for(var/mob/living/carbon/slime/M in range(1,G:affecting)) - if(M.Victim == G:affecting) - usr << "[G:affecting.name] will not fit into the sleeper because they have a slime latched onto their head." + for(var/mob/living/carbon/slime/M in range(1, TYPECAST_YOUR_SHIT.affecting)) + if(M.Victim == TYPECAST_YOUR_SHIT.affecting) + user << "[TYPECAST_YOUR_SHIT.affecting.name] has a fucking slime attached to them, deal with that first." return - var/mob/M = G:affecting - if (M.abiotic()) - user << "\blue Subject cannot have abiotic items on." + var/mob/M = TYPECAST_YOUR_SHIT.affecting + if(M.abiotic()) + user << "Subject cannot have abiotic items on." return - if (M.client) + /*if(M.client) M.client.perspective = EYE_PERSPECTIVE - M.client.eye = src - M.loc = src - src.occupant = M - src.icon_state = "body_scanner_1" - src.add_fingerprint(user) - //G = null + M.client.eye = src*///THIS IS FUCKING POINTLESS BECAUSE OF ON-LIFE() FUCKING RESET_VIEW() AHHHHHHHHHHGGGGGGGGGG + M.forceMove(src) + occupant = M + icon_state = "body_scanner_1" + add_fingerprint(user) qdel(G) - return -/obj/machinery/bodyscanner/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) + +/obj/machinery/bodyscanner/MouseDrop_T(mob/living/carbon/O, mob/user as mob) if(!istype(O)) - return - if(O.loc == user) //no you can't pull things out of your ass - return - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other - return - if(O.anchored || get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source - return - if(!ismob(O)) //humans only - return - if(istype(O, /mob/living/simple_animal) || istype(O, /mob/living/silicon)) //animals and robutts dont fit - return - if(!ishuman(user) && !isrobot(user)) //No ghosts or mice putting people into the sleeper - return - if(user.loc==null) // just in case someone manages to get a closet into the blue light dimension, as unlikely as that seems - return - if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? - return + return 0 //not a mob + if(user.incapacitated()) + return 0 //user shouldn't be doing things + if(O.anchored) + return 0 //mob is anchored??? + if(get_dist(user, src) > 1 || get_dist(user, O) > 1) + return 0 //doesn't use adjacent() to allow for non-cardinal (fuck my life) + if(!ishuman(user) && !isrobot(user)) + return 0 //not a borg or human if(panel_open) - user << "\blue Close the maintenance panel first." - return + user << "Close the maintenance panel first." + return 0 //panel open if(occupant) - user << "\blue The body scanner is already occupied!" - return - var/mob/living/L = O - if(!istype(L) || L.buckled) - return - if(L.abiotic()) - user << "\blue Subject cannot have abiotic items on." - return - for(var/mob/living/carbon/slime/M in range(1,L)) - if(M.Victim == L) - usr << "[L.name] will not fit into the body scanner because they have a slime latched onto their head." - return - if(L == user) - visible_message("[user] climbs into the body scanner.") + user << "\The [src] is already occupied." + return 0 //occupied + + if(O.buckled) + return 0 + if(O.abiotic()) + user << "Subject cannot have abiotic items on." + return 0 + for(var/mob/living/carbon/slime/M in range(1, O)) + if(M.Victim == O) + user << "[O] has a fucking slime attached to them, deal with that first." + return 0 + + if(O == user) + visible_message("[user] climbs into \the [src].") else - visible_message("[user] puts [L.name] into the body scanner.") + visible_message("[user] puts [O] into the body scanner.") - if (L.client) - L.client.perspective = EYE_PERSPECTIVE - L.client.eye = src - L.loc = src - src.occupant = L - src.icon_state = "bodyscanner" - src.add_fingerprint(user) - return - -/*/obj/machinery/bodyscanner/allow_drop() - return 0*/ + O.forceMove(src) + occupant = O + icon_state = "bodyscanner" + add_fingerprint(user) /obj/machinery/bodyscanner/relaymove(mob/user as mob) - if (user.stat) - return - src.go_out() - return + if(user.incapacitated()) + return 0 //maybe they should be able to get out with cuffs, but whatever + go_out() /obj/machinery/bodyscanner/verb/eject() set src in oview(1) set category = "Object" set name = "Eject Body Scanner" - if (usr.stat != 0) + if(usr.incapacitated()) return - src.go_out() + go_out() add_fingerprint(usr) - return - -/obj/machinery/bodyscanner/verb/move_inside() - set src in oview(1) - set category = "Object" - set name = "Enter Body Scanner" - - if (usr.stat != 0) - return - if (src.occupant) - usr << "\blue The scanner is already occupied!" - return - if (panel_open) - usr << "\blue Close the maintenance panel first." - return - if (usr.abiotic()) - usr << "\blue Subject cannot have abiotic items on." - return - usr.pulling = null - usr.client.perspective = EYE_PERSPECTIVE - usr.client.eye = src - usr.loc = src - src.occupant = usr - src.icon_state = "bodyscanner" - for(var/obj/O in src) - //O = null - qdel(O) - //Foreach goto(124) - src.add_fingerprint(usr) - return /obj/machinery/bodyscanner/proc/go_out() if ((!( src.occupant ) || src.locked)) @@ -305,28 +260,6 @@ return return -/* - -/obj/machinery/body_scanconsole/process() //not really used right now - if(stat & (NOPOWER|BROKEN)) - return - //use_power(250) // power stuff - -// var/mob/M //occupant -// if (!( src.status )) //remove this -// return -// if ((src.connected && src.connected.occupant)) //connected & occupant ok -// M = src.connected.occupant -// else -// if (istype(M, /mob)) -// //do stuff -// else -/// src.temphtml = "Process terminated due to lack of occupant in scanning chamber." -// src.status = null -// src.updateDialog() -// return - -*/ /obj/machinery/body_scanconsole/attackby(var/obj/item/weapon/G as obj, var/mob/user as mob, params) if (istype(G, /obj/item/weapon/screwdriver)) @@ -365,181 +298,314 @@ if(!src.connected) findscanner() - if (src.connected) - if(!connected.occupant) - user << "The scanner is empty." - return - if(!ishuman(connected.occupant)) - user << "\red This device can only scan compatible lifeforms." - return - var/dat - if (src.delete && src.temphtml) //Window in buffer but its just simple message, so nothing - src.delete = src.delete - else if (!src.delete && src.temphtml) //Window in buffer - its a menu, dont add clear message - dat = text("[]

Main Menu", src.temphtml, src) - else - if (src.connected) //Is something connected? - var/mob/living/carbon/human/occupant = src.connected.occupant - dat = "Occupant Statistics:
" //Blah obvious - if (istype(occupant)) //is there REALLY someone in there? - var/t1 - switch(occupant.stat) // obvious, see what their status is - if(0) - t1 = "Conscious" - if(1) - t1 = "Unconscious" - else - t1 = "*dead*" - if (!istype(occupant,/mob/living/carbon/human)) - dat += "This device can only scan human occupants." - else - dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1) + ui_interact(user) - if(occupant.virus2.len) - dat += text("Viral pathogen detected in blood stream.
") - dat += text("[]\t-Brute Damage %: []

", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss()) - dat += text("[]\t-Respiratory Damage %: []
", (occupant.getOxyLoss() < 60 ? "" : ""), occupant.getOxyLoss()) - dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss()) - dat += text("[]\t-Burn Severity %: []

", (occupant.getFireLoss() < 60 ? "" : ""), occupant.getFireLoss()) +/obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] - dat += text("[]\tRadiation Level %: []
", (occupant.radiation < 10 ?"" : ""), occupant.radiation) - dat += text("[]\tGenetic Tissue Damage %: []
", (occupant.getCloneLoss() < 1 ?"" : ""), occupant.getCloneLoss()) - dat += text("[]\tApprox. Brain Damage %: []
", (occupant.getBrainLoss() < 1 ?"" : ""), occupant.getBrainLoss()) - dat += text("Paralysis Summary %: [] ([] seconds left!)
", occupant.paralysis, round(occupant.paralysis / 4)) - dat += text("Body Temperature: [occupant.bodytemperature-T0C]°C ([occupant.bodytemperature*1.8-459.67]°F)

") + data["connected"] = connected ? 1 : 0 - if(occupant.has_brain_worms()) - dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" + if(connected) + data["occupied"] = connected.occupant ? 1 : 0 - if(occupant.vessel) - var/blood_volume = round(occupant.vessel.get_reagent_amount("blood")) - var/blood_percent = blood_volume / 560 - blood_percent *= 100 - dat += text("[]\tBlood Level %: [] ([] units)

", (blood_volume > 448 ?"" : ""), blood_percent, blood_volume) - if(occupant.reagents) - dat += text("Epinephrine units: [] units
", occupant.reagents.get_reagent_amount("Epinephrine")) - dat += text("Ether: [] units
", occupant.reagents.get_reagent_amount("ether")) - dat += text("[]\tSilver Sulfadiazine: [] units

", (occupant.reagents.get_reagent_amount("silver_sulfadiazine") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("silver_sulfadiazine")) - dat += text("[]\tStyptic Powder: [] units
", (occupant.reagents.get_reagent_amount("styptic_powder") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("styptic_powder")) - dat += text("[]\tsalbutamol: [] units
", (occupant.reagents.get_reagent_amount("salbutamol") < 30 ? "" : ""), occupant.reagents.get_reagent_amount("salbutamol")) + var/occupantData[0] + if(connected.occupant && ishuman(connected.occupant)) + var/mob/living/carbon/human/H = connected.occupant + occupantData["name"] = H.name + occupantData["stat"] = H.stat + occupantData["health"] = H.health - dat += "
" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" - dat += "" + occupantData["hasVirus"] = H.virus2.len - for(var/obj/item/organ/external/e in occupant.organs) + occupantData["bruteLoss"] = H.getBruteLoss() + occupantData["oxyLoss"] = H.getOxyLoss() + occupantData["toxLoss"] = H.getToxLoss() + occupantData["fireLoss"] = H.getFireLoss() - dat += "" - var/AN = "" - var/open = "" - var/infected = "" - var/robot = "" - var/imp = "" - var/bled = "" - var/splint = "" - var/internal_bleeding = "" - var/lung_ruptured = "" - for(var/datum/wound/W in e.wounds) if(W.internal) - internal_bleeding = "
Internal bleeding" - break - if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured()) - lung_ruptured = "Lung ruptured:" - if(e.status & ORGAN_SPLINTED) - splint = "Splinted:" - if(e.status & ORGAN_BLEEDING) - bled = "Bleeding:" - if(e.status & ORGAN_BROKEN) - AN = "[e.broken_description]:" - if(e.status & ORGAN_ROBOT) - robot = "Prosthetic:" - if(e.open) - open = "Open:" - switch (e.germ_level) - if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200) - infected = "Mild Infection:" - if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) - infected = "Mild Infection+:" - if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) - infected = "Mild Infection++:" - if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) - infected = "Acute Infection:" - if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) - infected = "Acute Infection+:" - if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400) - infected = "Acute Infection++:" - if (INFECTION_LEVEL_THREE to INFINITY) - infected = "Septic:" + occupantData["radLoss"] = H.radiation + occupantData["cloneLoss"] = H.getCloneLoss() + occupantData["brainLoss"] = H.getBrainLoss() + occupantData["paralysis"] = H.paralysis + occupantData["paralysisSeconds"] = round(H.paralysis / 4) + occupantData["bodyTemperature"] = H.bodytemperature - var/unknown_body = 0 - for(var/I in e.implants) - if(is_type_in_list(I,known_implants)) - imp += "[I] implanted:" - else - unknown_body++ + occupantData["hasBorer"] = H.has_brain_worms() - if(unknown_body || e.hidden) - imp += "Unknown body present:" - if(!AN && !open && !infected & !imp) - AN = "None:" - if(!(e.status & ORGAN_DESTROYED)) - dat += "" - else - dat += "" - dat += "" - for(var/obj/item/organ/i in occupant.internal_organs) - var/mech = i.desc - var/infection = "None" - switch (i.germ_level) - if (1 to INFECTION_LEVEL_ONE + 200) - infection = "Mild Infection:" - if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) - infection = "Mild Infection+:" - if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) - infection = "Mild Infection++:" - if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) - infection = "Acute Infection:" - if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) - infection = "Acute Infection+:" - if (INFECTION_LEVEL_TWO + 300 to INFINITY) - infection = "Acute Infection++:" + var/bloodData[0] + if(H.vessel) + var/blood_volume = round(H.vessel.get_reagent_amount("blood")) + bloodData["volume"] = blood_volume + bloodData["percent"] = round(((blood_volume / 560)*100)) + + occupantData["blood"] = bloodData + + var/reagentData[0] + if(H.reagents) + reagentData["epinephrine"] = H.reagents.get_reagent_amount("Epinephrine") + reagentData["ether"] = H.reagents.get_reagent_amount("ether") + reagentData["silver_sulfadiazine"] = H.reagents.get_reagent_amount("silver_sulfadiazine") + reagentData["styptic_powder"] = H.reagents.get_reagent_amount("styptic_powder") + reagentData["salbutamol"] = H.reagents.get_reagent_amount("salbutamol") + + occupantData["reagents"] = reagentData + + var/extOrganData[0] + for(var/obj/item/organ/external/E in H.organs) + var/organData[0] + organData["name"] = E.name + organData["open"] = E.open + organData["germ_level"] = E.germ_level + organData["bruteLoss"] = E.brute_dam + organData["fireLoss"] = E.burn_dam + + var/implantData[0] + for(var/obj/I in E.implants) + var/implantSubData[0] + implantSubData["name"] = I.name + if(is_type_in_list(I, known_implants)) + implantSubData["known"] = 1 + + implantData.Add(list(implantSubData)) + + organData["implants"] = implantData + organData["implants_len"] = implantData.len + + var/organStatus[0] + if(E.status & ORGAN_DESTROYED) + organStatus["destroyed"] = 1 + if(E.status & ORGAN_BROKEN) + organStatus["broken"] = E.broken_description + if(E.status & ORGAN_ROBOT) + organStatus["robotic"] = 1 + if(E.status & ORGAN_SPLINTED) + organStatus["splinted"] = 1 + if(E.status & ORGAN_BLEEDING) + organStatus["bleeding"] = 1 + + organData["status"] = organStatus + + if(istype(E, /obj/item/organ/external/chest) && H.is_lung_ruptured()) + organData["lungRuptured"] = 1 + + for(var/datum/wound/W in E.wounds) + if(W.internal) + organData["internalBleeding"] = 1 + break + + extOrganData.Add(list(organData)) + + occupantData["extOrgan"] = extOrganData + + var/intOrganData[0] + for(var/obj/item/organ/I in H.internal_organs) + var/organData[0] + organData["name"] = I.name + organData["desc"] = I.desc + organData["germ_level"] = I.germ_level + organData["damage"] = I.damage + + intOrganData.Add(list(organData)) + + occupantData["intOrgan"] = intOrganData + + occupantData["blind"] = (H.sdisabilities & BLIND) + occupantData["nearsighted"] = (H.disabilities & NEARSIGHTED) + + data["occupant"] = occupantData + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if(!ui) + ui = new(user, src, ui_key, "adv_med.tmpl", "Body Scanner", 690, 600) + ui.set_initial_data(data) + ui.open() + ui.set_auto_update(1) - dat += "" - dat += "" - dat += "" - dat += "
OrganBurn DamageBrute DamageOther Wounds
[e.name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured][e.name]--Not Found
[i.name]N/A[i.damage][infection]:[mech]
" - if(occupant.sdisabilities & BLIND) - dat += text("Cataracts detected.
") - if(occupant.sdisabilities & NEARSIGHTED) - dat += text("Retinal misalignment detected.
") - src.printing_text = dat - dat += "

Print medical condition
" - else - dat += "\The [src] is empty." - else - dat = " Error: No Body Scanner connected." - dat += text("Close", user) - user << browse(dat, "window=scanconsole;size=430x600") - return /obj/machinery/body_scanconsole/Topic(href, href_list) if(..()) return 1 if (href_list["print_p"]) - if (!(src.printing) && src.printing_text) - src.printing = 1 - for(var/mob/O in viewers(usr)) - O.show_message("\blue \the [src] rattles and prints out a sheet of paper.", 1) - var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc ) + generate_printing_text() + + if (!(printing) && printing_text) + printing = 1 + visible_message("\The [src] rattles and prints out a sheet of paper.") + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(loc) P.info = "
Body Scan - [href_list["name"]]

" P.info += "Time of scan: [worldtime2text(world.time)]

" - P.info += "[src.printing_text]" + P.info += "[printing_text]" P.info += "

Notes:
" P.name = "Body Scan - [href_list["name"]]" - src.printing = null - src.printing_text = null \ No newline at end of file + printing = null + printing_text = null + +/obj/machinery/body_scanconsole/proc/generate_printing_text() + var/dat = "" + + if(connected) + var/mob/living/carbon/human/occupant = connected.occupant + dat = "Occupant Statistics:
" //Blah obvious + if(istype(occupant)) //is there REALLY someone in there? + var/t1 + switch(occupant.stat) // obvious, see what their status is + if(0) + t1 = "Conscious" + if(1) + t1 = "Unconscious" + else + t1 = "*dead*" + dat += "[occupant.health > 50 ? "" : ""]\tHealth %: [occupant.health], ([t1])
" + + if(occupant.virus2.len) + dat += "Viral pathogen detected in blood stream.
" + + var/extra_font = null + extra_font = (occupant.getBruteLoss() < 60 ? "" : "") + dat += "[extra_font]\t-Brute Damage %: [occupant.getBruteLoss()]
" + + extra_font = (occupant.getOxyLoss() < 60 ? "" : "") + dat += "[extra_font]\t-Respiratory Damage %: [occupant.getOxyLoss()]
" + + extra_font = (occupant.getToxLoss() < 60 ? "" : "") + dat += "[extra_font]\t-Toxin Content %: [occupant.getToxLoss()]
" + + extra_font = (occupant.getFireLoss() < 60 ? "" : "") + dat += "[extra_font]\t-Burn Severity %: [occupant.getFireLoss()]
" + + extra_font = (occupant.radiation < 10 ?"" : "") + dat += "[extra_font]\tRadiation Level %: [occupant.radiation]
" + + extra_font = (occupant.getCloneLoss() < 1 ?"" : "") + dat += "[extra_font]\tGenetic Tissue Damage %: [occupant.getCloneLoss()]
" + + extra_font = (occupant.getBrainLoss() < 1 ?"" : "") + dat += "[extra_font]\tApprox. Brain Damage %: [occupant.getBrainLoss()]
" + + dat += "Paralysis Summary %: [occupant.paralysis] ([round(occupant.paralysis / 4)] seconds left!)
" + dat += "Body Temperature: [occupant.bodytemperature-T0C]°C ([occupant.bodytemperature*1.8-459.67]°F)
" + + dat += "
" + + if(occupant.has_brain_worms()) + dat += "Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended.
" + + if(occupant.vessel) + var/blood_volume = round(occupant.vessel.get_reagent_amount("blood")) + var/blood_percent = blood_volume / 560 + blood_percent *= 100 + + extra_font = (blood_volume > 448 ? "" : "") + dat += "[extra_font]\tBlood Level %: [blood_percent] ([blood_volume] units)
" + + if(occupant.reagents) + dat += "Epinephrine units: [occupant.reagents.get_reagent_amount("Epinephrine")] units
" + dat += "Ether: [occupant.reagents.get_reagent_amount("ether")] units
" + + extra_font = (occupant.reagents.get_reagent_amount("silver_sulfadiazine") < 30 ? "" : "") + dat += "[extra_font]\tSilver Sulfadiazine: [occupant.reagents.get_reagent_amount("silver_sulfadiazine")]
" + + extra_font = (occupant.reagents.get_reagent_amount("styptic_powder") < 30 ? "" : "") + dat += "[extra_font]\tStyptic Powder: [occupant.reagents.get_reagent_amount("styptic_powder")] units
" + + extra_font = (occupant.reagents.get_reagent_amount("salbutamol") < 30 ? "" : "") + dat += "[extra_font]\tSalbutamol: [occupant.reagents.get_reagent_amount("salbutamol")] units
" + + dat += "
" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + dat += "" + + for(var/obj/item/organ/external/e in occupant.organs) + dat += "" + var/AN = "" + var/open = "" + var/infected = "" + var/robot = "" + var/imp = "" + var/bled = "" + var/splint = "" + var/internal_bleeding = "" + var/lung_ruptured = "" + for(var/datum/wound/W in e.wounds) if(W.internal) + internal_bleeding = "
Internal bleeding" + break + if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured()) + lung_ruptured = "Lung ruptured:" + if(e.status & ORGAN_SPLINTED) + splint = "Splinted:" + if(e.status & ORGAN_BLEEDING) + bled = "Bleeding:" + if(e.status & ORGAN_BROKEN) + AN = "[e.broken_description]:" + if(e.status & ORGAN_ROBOT) + robot = "Prosthetic:" + if(e.open) + open = "Open:" + switch (e.germ_level) + if (INFECTION_LEVEL_ONE to INFECTION_LEVEL_ONE + 200) + infected = "Mild Infection:" + if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) + infected = "Mild Infection+:" + if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) + infected = "Mild Infection++:" + if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) + infected = "Acute Infection:" + if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) + infected = "Acute Infection+:" + if (INFECTION_LEVEL_TWO + 300 to INFECTION_LEVEL_TWO + 400) + infected = "Acute Infection++:" + if (INFECTION_LEVEL_THREE to INFINITY) + infected = "Septic:" + + var/unknown_body = 0 + for(var/I in e.implants) + if(is_type_in_list(I,known_implants)) + imp += "[I] implanted:" + else + unknown_body++ + + if(unknown_body || e.hidden) + imp += "Unknown body present:" + if(!AN && !open && !infected & !imp) + AN = "None:" + if(!(e.status & ORGAN_DESTROYED)) + dat += "" + else + dat += "" + dat += "" + for(var/obj/item/organ/i in occupant.internal_organs) + var/mech = i.desc + var/infection = "None" + switch (i.germ_level) + if (1 to INFECTION_LEVEL_ONE + 200) + infection = "Mild Infection:" + if (INFECTION_LEVEL_ONE + 200 to INFECTION_LEVEL_ONE + 300) + infection = "Mild Infection+:" + if (INFECTION_LEVEL_ONE + 300 to INFECTION_LEVEL_ONE + 400) + infection = "Mild Infection++:" + if (INFECTION_LEVEL_TWO to INFECTION_LEVEL_TWO + 200) + infection = "Acute Infection:" + if (INFECTION_LEVEL_TWO + 200 to INFECTION_LEVEL_TWO + 300) + infection = "Acute Infection+:" + if (INFECTION_LEVEL_TWO + 300 to INFINITY) + infection = "Acute Infection++:" + + dat += "" + dat += "" + dat += "" + dat += "
OrganBurn DamageBrute DamageOther Wounds
[e.name][e.burn_dam][e.brute_dam][robot][bled][AN][splint][open][infected][imp][internal_bleeding][lung_ruptured][e.name]--Not Found
[i.name]N/A[i.damage][infection]:[mech]
" + if(occupant.sdisabilities & BLIND) + dat += "Cataracts detected.
" + if(occupant.disabilities & NEARSIGHTED) + dat += "Retinal misalignment detected.
" + else + dat += "\The [src] is empty." + else + dat = " Error: No Body Scanner connected." + + printing_text = dat \ No newline at end of file diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl new file mode 100644 index 00000000000..c0af251aa9f --- /dev/null +++ b/nano/templates/adv_med.tmpl @@ -0,0 +1,308 @@ + +{{if !data.occupied}} +

No occupant detected.

+{{else}} +

Occupant Data:

+
+
+ Name: +
+
+ {{:data.occupant.name}} +
+
+
+
+ Health: +
+ {{:helper.displayBar(data.occupant.health, 0, 100, (data.occupant.health >= 50) ? 'good' : (data.occupant.health >= 25) ? 'average' : 'bad')}} +
+ {{:helper.round(data.occupant.health*10)/10}}% +
+
+
+ Status: +
+
+ {{if data.occupant.stat==0}} + Alive + {{else data.occupant.stat==1}} + Critical + {{else}} + Dead + {{/if}} +
+
+ {{:helper.link('Print', 'document', {'print_p' : 1, 'name' : data.occupant.name})}} +
+

Damage:

+
+ Brute: +
+
+ {{:data.occupant.bruteLoss}} +

+
+ Burn: +
+
+ {{:data.occupant.fireLoss}} +

+
+ Oxygen: +
+
+ {{:data.occupant.oxyLoss}} +

+
+ Toxins: +
+
+ {{:data.occupant.toxLoss}} +

+
+ Brain: +
+
+ {{:data.occupant.brainLoss}} +

+
+ Radiation Level: +
+
+ {{:data.occupant.radLoss}} +

+
+ Genetic: +
+
+ {{:data.occupant.cloneLoss}} +

+
+ Paralysis: +
+
+ {{:data.occupant.paralysis}}% ({{:data.occupant.paralysisSeconds}} seconds left!) +

+
+
+
+ Body Temperature: +
+
+ {{:data.occupant.bodyTemperature}} +
+
+ {{if data.occupant.hasVirus}} +
+ Viral pathogen detected in blood stream. +
+ {{/if}} + {{if data.occupant.hasBorer}} +
+ Large growth detected in frontal lobe, possibly cancerous. Surgical removal is recommended. +
+ {{/if}} + {{if data.occupant.blind}} + Pupils unresponsive.
+ {{/if}} + {{if data.occupant.nearsighted}} + Retinal Misalignment Detected + {{/if}} +
+
+ Blood +
+ Volume +
+
+ {{:data.occupant.blood.volume}} +
+
+ Percent +
+
+ {{:data.occupant.blood.percent}}% +
+
+
+
+ Reagents +
+ Epinephrine +
+
+ {{:data.occupant.reagents.epinephrine}} +
+
+ Ether +
+
+ {{:data.occupant.reagents.ether}} +
+
+ + Silver Sulfadiazine + +
+
+ + {{:data.occupant.reagents.silver_sulfadiazine}} + +
+
+ + Styptic Powder + +
+
+ + {{:data.occupant.reagents.styptic_powder}} + +
+
+ + Salbutamol + +
+
+ + {{:data.occupant.reagents.salbutamol}} + +
+
+
+ External Organs +
+ {{for data.occupant.extOrgan}} +
+ {{if value.status.destroyed}} +
+ {{:value.name}} - DESTROYED +
+ {{else}} +
+ {{:value.name}} +
+
+ {{if value.status.broken}} + {{:value.status.broken}} + {{else value.status.splinted}} + Splinted + {{else value.status.robotic}} + Robotic + {{/if}} +
+
+  Brute/Burn +
+
+ {{:value.bruteLoss}}/{{:value.fireLoss}} +
+
+  Injuries +
+
+ {{if !value.status.bleeding}} + {{if !value.status.internalBleeding}} + No Injuries Detected + {{else}} + Internal Bleeding Detected + {{/if}} + {{else}} + {{if value.status.internalBleeding}} +
Internal Bleeding Detected. External Bleeding Detected.
+ {{else}} + External Bleeding Detected + {{/if}} + {{/if}} +
+ {{if value.germ_level > 100}} +
+  Infection +
+
+ {{if value.germ_level < 300}} + Mild Infection + {{else value.germ_level < 400}} + Mild Infection+ + {{else value.germ_level < 500}} + Mild Infection++ + {{else value.germ_level < 700}} + Acute Infection + {{else value.germ_level < 800}} + Acute Infection+ + {{else value.germ_level < 900}} + Acute Infection++ + {{else value.germ_level >= 900}} + Septic + {{/if}} +
+ {{/if}} + {{if value.open}} +
+  Operation Status +
+
+ Open Incision +
+ {{/if}} + {{if value.implants_len}} +
+  Implants +

+ {{for value.implants :impValue:impindex}} +
+   {{:impValue.known ? impValue.name : "Unknown"}} +

+ {{/for}} + {{/if}} + {{/if}} +

+ {{/for}} +
+ Internal Organs +
+ {{for data.occupant.intOrgan}} +
+
+ {{:value.name}} +
+
+ {{:value.desc != null ? value.desc : ""}} +
+ {{if value.germ_level > 100}} +
+  Infection +
+
+ {{if value.germ_level < 300}} + Mild Infection + {{else value.germ_level < 400}} + Mild Infection+ + {{else value.germ_level < 500}} + Mild Infection++ + {{else value.germ_level < 700}} + Acute Infection + {{else value.germ_level < 800}} + Acute Infection+ + {{else value.germ_level < 900}} + Acute Infection++ + {{else value.germ_level >= 900}} + Septic + {{/if}} +
+ {{/if}} +
+  Damage +
+
+ {{:value.damage}} +
+
+ {{/for}} +
+{{/if}} \ No newline at end of file From c36e35a42161d3b5aebb17b1b331045974b41ca6 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 19 Oct 2015 16:09:01 -0700 Subject: [PATCH 02/28] CF BodyTemp --- code/game/machinery/adv_med.dm | 3 ++- nano/templates/adv_med.tmpl | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 12feea91c04..9662358a32f 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -328,7 +328,8 @@ occupantData["brainLoss"] = H.getBrainLoss() occupantData["paralysis"] = H.paralysis occupantData["paralysisSeconds"] = round(H.paralysis / 4) - occupantData["bodyTemperature"] = H.bodytemperature + occupantData["bodyTempC"] = H.bodytemperature-T0C + occupantData["bodyTempF"] = (((H.bodytemperature-T0C) * 1.8) + 32) occupantData["hasBorer"] = H.has_brain_worms() diff --git a/nano/templates/adv_med.tmpl b/nano/templates/adv_med.tmpl index c0af251aa9f..92049364561 100644 --- a/nano/templates/adv_med.tmpl +++ b/nano/templates/adv_med.tmpl @@ -93,7 +93,7 @@ Used In File(s): \code\game\machinery\adv_med.dm Body Temperature:
- {{:data.occupant.bodyTemperature}} + {{:data.occupant.bodyTempC}}°C, {{:data.occupant.bodyTempF}}°F
{{if data.occupant.hasVirus}} From 931d053b1d675030939cdc0382251d7e1218f84f Mon Sep 17 00:00:00 2001 From: KasparoVy Date: Mon, 19 Oct 2015 20:02:21 -0400 Subject: [PATCH 03/28] Adds More Vox Hair (Head+Facial) A straight-up port from VG. Saw that someone on Bay went for it and this was the first I've seen of VG's different Vox hairstyles so I figured I'd make a pull here too. I know some of these look weird, so if there's any that you absolutely don't want in, just specify them and I'll axe it. --- .../mob/new_player/sprite_accessories.dm | 53 +++++++++++++++++- icons/mob/human_face.dmi | Bin 63086 -> 74179 bytes 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index febe62ba4e8..0fd9804bd46 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -781,6 +781,36 @@ icon_state = "vox_keetquills" species_allowed = list("Vox") + vox_quills_kingly + name = "Kingly Vox Quills" + icon_state = "vox_kingly" + species_allowed = list("Vox") + + vox_quills_fluff + name = "Fluffy Quills" + icon_state = "vox_afro" + species_allowed = list("Vox") + + vox_quills_mohawk + name = "Quill Mohawk" + icon_state = "vox_mohawk" + species_allowed = list("Vox") + + vox_quills_long + name = "Long Vox Quills" + icon_state = "vox_yasu" + species_allowed = list("Vox") + + vox_horns + name = "Vox Spikes" + icon_state = "vox_horns" + species_allowed = list("Vox") + + vox_nights + name = "Vox Pigtails" + icon_state = "vox_nights" + species_allowed = list("Vox") + // Apollo-specific //Wryn antennae @@ -855,10 +885,31 @@ species_allowed = list("Tajaran") taj_smallstache - name = "Tajara Smallsatche" + name = "Tajara Smallstache" icon_state = "facial_smallstache" species_allowed = list("Tajaran") + vox_colonel + name = "Vox Colonel Beard" + icon_state = "vox_colonel" + species_allowed = list("Vox") + + vox_long + name = "Long Mustache" + icon_state = "vox_fu" + species_allowed = list("Vox") + + vox_neck + name = "Neck Quills" + icon_state = "vox_neck" + species_allowed = list("Vox") + + vox_beard + name = "Vox Quill Beard" + icon_state = "vox_beard" + species_allowed = list("Vox") + + //Vulpkanin vulp_blaze diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 7d24d3ceadb28c7772d1eca8e213d8ebdb426ad2..b7ebe8a9c6e07a1d4bc6ddf00d98cc95247adabf 100644 GIT binary patch literal 74179 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
RL@fIz)0v#&HW$=z&=FD5CnX9;p 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 MbPTjBHSHt*7eLw~jQ{`u literal 63086 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 Avkf;4&N-6DDo{efC$(8>b*iTcuGe)itG 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 Date: Tue, 20 Oct 2015 16:15:22 -0400 Subject: [PATCH 04/28] Fixed pipe dispenser Pipe dispenser was outputting dual-port air vent in place of digital valve. --- code/game/machinery/pipe/pipe_dispenser.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 68df2d59ed1..31b58bcac10 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -16,7 +16,7 @@ Bent Pipe
Manifold
Manual Valve
-Digital Valve
+Digital Valve
Pipe Cap
4-Way Manifold
Manual T-Valve
From a404929d1634312e25fac800aaef0d1eb82036a6 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 21 Oct 2015 23:59:59 -0400 Subject: [PATCH 05/28] Multiverse Sword --- code/game/gamemodes/objective.dm | 30 ++ code/game/gamemodes/wizard/artefact.dm | 306 +++++++++++++++++++ code/game/objects/items/weapons/cards_ids.dm | 11 +- code/modules/admin/secrets.dm | 1 + code/modules/admin/topic.dm | 4 + code/modules/admin/verbs/onlyone.dm | 49 ++- 6 files changed, 397 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 96acbacb0e8..fe6a5da9fe2 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -347,6 +347,36 @@ datum/objective/hijack return 0 return 1 +/datum/objective/hijackclone + explanation_text = "Hijack the emergency shuttle by ensuring only you (or your copies) escape." + + check_completion() + if(!owner.current) + return 0 + if(!emergency_shuttle.returned()) + return 0 + + var/area/A = locate(/area/shuttle/escape/centcom) + + for(var/mob/living/player in player_list) //Make sure nobody else is onboard + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) + continue + if(get_area(player) == A) + if(player.real_name != owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/shuttle/floor4)) + return 0 + + for(var/mob/living/player in player_list) //Make sure at least one of you is onboard + if(player.mind && player.mind != owner) + if(player.stat != DEAD) + if(istype(player, /mob/living/silicon)) + continue + if(get_area(player) == A) + if(player.real_name == owner.current.real_name && !istype(get_turf(player.mind.current), /turf/simulated/shuttle/floor4)) + return 1 + return 0 + datum/objective/block explanation_text = "Do not allow any organic lifeforms to escape on the shuttle alive." diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index ef0dddac0fa..53fd96d5fc5 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -213,3 +213,309 @@ user << " You can see...everything!" visible_message("[user] stares into [src], their eyes glazing over.") user.ghostize(1) + +/////////////////////Multiverse Blade//////////////////// +var/global/list/multiverse = list() + +/obj/item/weapon/multisword + name = "multiverse sword" + desc = "A weapon capable of conquering the universe and beyond. Activate it to summon copies of yourself from others dimensions to fight by your side." + icon = 'icons/obj/weapons.dmi' + icon_state = "energy_katana" + item_state = "energy_katana" + hitsound = 'sound/weapons/bladeslice.ogg' + flags = CONDUCT + slot_flags = SLOT_BELT + force = 20 + throwforce = 10 + sharp = 1 + edge = 1 + w_class = 2 + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + var/faction = list("unassigned") + var/cooldown = 0 + var/cooldown_between_uses = 400 //time in deciseconds between uses--default of 40 seconds. + var/assigned = "unassigned" + var/evil = TRUE + var/duplicate_self = 0 //Do we want the species randomized along with equipment should the user be duplicated in their entirety? + var/sword_type = /obj/item/weapon/multisword //type of sword to equip. + +/obj/item/weapon/multisword/New() + ..() + multiverse |= src + + +/obj/item/weapon/multisword/Destroy() + multiverse.Remove(src) + return ..() + +/obj/item/weapon/multisword/attack_self(mob/user) + if(user.mind.special_role == "apprentice") + user << "You know better than to touch your teacher's stuff." + return + if(cooldown < world.time) + var/faction_check = 0 + for(var/F in faction) + if(F in user.faction) + faction_check = 1 + break + if(faction_check == 0) + faction = list("[user.real_name]") + assigned = "[user.real_name]" + user.faction = list("[user.real_name]") + user << "You bind the sword to yourself. You can now use it to summon help." + if(!usr.mind.special_role) + if(prob(30)) + user << "With your new found power you could easily conquer the station!" + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone + hijack_objective.owner = usr.mind + usr.mind.objectives += hijack_objective + hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" + usr << "Objective #[1]: [hijack_objective.explanation_text]" + ticker.mode.traitors += usr.mind + usr.mind.special_role = "[usr.real_name] Prime" + evil = TRUE + else + user << "With your new found power you could easily defend the station!" + var/datum/objective/survive/new_objective = new /datum/objective/survive + new_objective.owner = usr.mind + new_objective.explanation_text = "Survive, and help defend the innocent from the mobs of multiverse clones." + usr << "Objective #[1]: [new_objective.explanation_text]" + usr.mind.objectives += new_objective + ticker.mode.traitors += usr.mind + usr.mind.special_role = "[usr.real_name] Prime" + evil = FALSE + else + var/list/candidates = get_candidates(BE_WIZARD) + if(candidates.len) + var/client/C = pick(candidates) + spawn_copy(C, get_turf(user.loc), user) + user << "The sword flashes, and you find yourself face to face with...you!" + cooldown = world.time + cooldown_between_uses + for(var/obj/item/weapon/multisword/M in multiverse) + if(M.assigned == assigned) + M.cooldown = cooldown + + else + user << "You fail to summon any copies of yourself. Perhaps you should try again in a bit." + else + user << "[src] is recharging! Keep in mind it shares a cooldown with the swords wielded by your copies." + + +/obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T) + var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) + C.prefs.copy_to(M) + M.key = C.key + M.mind.name = usr.real_name + M << "You are an alternate version of [usr.real_name] from another universe! Help them accomplish their goals at all costs." + M.real_name = usr.real_name + M.name = usr.real_name + M.faction = list("[usr.real_name]") + if(duplicate_self) + M.set_species(usr.get_species()) //duplicate the sword user's species. + else + if(prob(50)) + var/list/all_species = list("Human","Unathi","Skrell","Tajaran","Kidan","Golem","Machine","Slime People","Grey","Vulpkanin") + M.set_species(pick(all_species)) + M.dna = usr.dna.Clone() + M.update_body() + M.update_hair() + M.UpdateAppearance() + domutcheck(M, null) + equip_copy(M) + + if(evil) + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone + hijack_objective.owner = M.mind + M.mind.objectives += hijack_objective + hijack_objective.explanation_text = "Ensure only [usr.real_name] and their copies are on the shuttle!" + M << "Objective #[1]: [hijack_objective.explanation_text]" + M.mind.special_role = "multiverse traveller" + log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] hijack.") + else + var/datum/objective/protect/new_objective = new /datum/objective/protect + new_objective.owner = M.mind + new_objective.target = usr.mind + new_objective.explanation_text = "Protect [usr.real_name], your copy, and help them defend the innocent from the mobs of multiverse clones." + M.mind.objectives += new_objective + M << "Objective #[1]: [new_objective.explanation_text]" + M.mind.special_role = "multiverse traveller" + log_game("[M.key] was made a multiverse traveller with the objective to help [usr.real_name] protect the station.") + +/obj/item/weapon/multisword/proc/equip_copy(var/mob/living/carbon/human/M) + + var/obj/item/weapon/multisword/sword = new sword_type + sword.assigned = assigned + sword.faction = list("[assigned]") + sword.evil = evil + + if(duplicate_self) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) + M.equip_or_collect(new /obj/item/clothing/under/color/random(M), slot_w_uniform) + M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(sword, slot_r_hand) //Don't duplicate the hands, or duplicate swords could be generated...or weird cases of factionless swords. + else + var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator") + + switch(randomize) + if("mobster") + M.equip_to_slot_or_del(new /obj/item/clothing/head/fedora(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/black(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/really_black(M), slot_w_uniform) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("roman") + var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionaire) + M.equip_to_slot_or_del(new hat(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/under/roman(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/weapon/shield/riot/roman(M), slot_l_hand) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("wizard") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(M), slot_head) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("cyborg") + if(M.get_species() != "Machine") + for(var/obj/item/organ/O in M.organs) + O.robotize() + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("syndicate") + M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/swat(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/vest(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(M),slot_wear_mask) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("assistant") + M.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(M), slot_shoes) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("animu") + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/head/kitty(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/under/schoolgirl(M), slot_w_uniform) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("cultist") + M.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("highlander") + M.equip_to_slot_or_del(new /obj/item/clothing/under/kilt(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/head/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("clown") + M.equip_to_slot_or_del(new /obj/item/clothing/under/rank/clown(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/clown_hat(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/weapon/bikehorn(M), slot_l_store) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("killer") + M.equip_to_slot_or_del(new /obj/item/clothing/under/overalls(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/latex(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/surgical(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/clothing/head/welding(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/apron(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/weapon/kitchen/utensil/knife(M), slot_l_store) + M.equip_to_slot_or_del(new /obj/item/weapon/scalpel(M), slot_r_store) + M.equip_to_slot_or_del(sword, slot_r_hand) + for(var/obj/item/carried_item in M.contents) + if(!istype(carried_item, /obj/item/weapon/implant)) + carried_item.add_blood(M) + + if("pirate") + M.equip_to_slot_or_del(new /obj/item/clothing/under/pirate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/head/bandana(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("soviet") + M.equip_to_slot_or_del(new /obj/item/clothing/head/hgpiratecap(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/hgpirate(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/under/soviet(M), slot_w_uniform) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("officer") + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/deathsquad/beret(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(M), slot_shoes) + M.equip_to_slot_or_del(new /obj/item/clothing/gloves/combat(M), slot_gloves) + M.equip_to_slot_or_del(new /obj/item/clothing/mask/cigarette/cigar/havana(M), slot_wear_mask) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/suit/jacket/miljacket(M), slot_wear_suit) + M.equip_to_slot_or_del(new /obj/item/clothing/under/syndicate(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/clothing/glasses/eyepatch(M), slot_glasses) + M.equip_to_slot_or_del(sword, slot_r_hand) + + if("gladiator") + M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/gladiator(M), slot_head) + M.equip_to_slot_or_del(new /obj/item/clothing/under/gladiator(M), slot_w_uniform) + M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) + M.equip_to_slot_or_del(sword, slot_r_hand) + + + else + return + + M.update_icons() + + var/obj/item/weapon/card/id/W = new /obj/item/weapon/card/id + if(duplicate_self) + var/duplicated_access = usr.get_item_by_slot(slot_wear_id) + if(duplicated_access && istype(duplicated_access, /obj/item/weapon/card/id)) + var/obj/item/weapon/card/id/duplicated_id = duplicated_access + W.access = duplicated_id.access + W.icon_state = duplicated_id.icon_state + else + W.access += access_maint_tunnels + W.icon_state = "centcom" + else + W.access += access_maint_tunnels + W.icon_state = "centcom" + W.assignment = "Multiverse Traveller" + W.registered_name = M.real_name + W.update_label(M.real_name) + M.equip_to_slot_or_del(W, slot_wear_id) + + +/obj/item/weapon/multisword/pike //If We are to be used and spent, let it be for a noble purpose. + name = "phantom pike" + desc = "A fishing pike that appears to be imbued with a peculiar energy." + icon_state = "harpoon" + item_state = "harpoon" + cooldown_between_uses = 200 //Half the time + duplicate_self = 1 + sword_type = /obj/item/weapon/multisword/pike diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 84fad33f60c..ee203dad9b4 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -179,6 +179,13 @@ /obj/item/weapon/card/id/proc/is_untrackable() return untrackable +/obj/item/weapon/card/id/proc/update_label(newname, newjob) + if(newname || newjob) + name = "[(!newname) ? "identification card" : "[newname]'s ID Card"][(!newjob) ? "" : " ([newjob])"]" + return + + name = "[(!registered_name) ? "identification card" : "[registered_name]'s ID Card"][(!assignment) ? "" : " ([assignment])"]" + /obj/item/weapon/card/id/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() @@ -623,12 +630,12 @@ assignment = "Green Team Fighter" icon_state = "TDgreen" desc = "This ID card is given to those who fought inside the thunderdome for the Green Team. Not many have lived to see one of those, even fewer lived to keep it." - + /obj/item/weapon/card/id/lifetime name = "Lifetime ID Card" desc = "A modified ID card given only to those people who have devoted their lives to the better interests of Nanotrasen. It sparkles blue." icon_state = "lifetimeid" - + // Decals /obj/item/weapon/id_decal name = "identification card decal" diff --git a/code/modules/admin/secrets.dm b/code/modules/admin/secrets.dm index a064788ebba..7ae8cb1fe28 100644 --- a/code/modules/admin/secrets.dm +++ b/code/modules/admin/secrets.dm @@ -100,6 +100,7 @@ TDM
Everyone is the traitor   There can only be one!   + There can only be me!   Dodgeball (TDM)!
Round-enders
The floor is lava! (DANGEROUS: extremely lame)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c58d9edf765..12dbc638e57 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -2668,6 +2668,10 @@ feedback_add_details("admin_secrets_fun_used","OO") usr.client.only_one() // message_admins("[key_name_admin(usr)] has triggered HIGHLANDER") + if("onlyme") + feedback_inc("admin_secrets_fun_used",1) + feedback_add_details("admin_secrets_fun_used","OM") + usr.client.only_me() if("onlyoneteam") feedback_inc("admin_secrets_fun_used",1) feedback_add_details("admin_secrets_fun_used","OOT") diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index ae1e053659b..a07e7dfb58a 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -5,9 +5,9 @@ var/list/incompatible_species = list("Plasmaman") for(var/mob/living/carbon/human/H in player_list) - if(H.stat == DEAD || !(H.client)) + if(H.stat == DEAD || !(H.client)) continue - if(is_special_character(H)) + if(is_special_character(H)) continue if(H.species.name in incompatible_species) H.set_species("Human") @@ -55,3 +55,48 @@ message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1) log_admin("[key_name(usr)] used there can be only one.") nologevent = 1 + world << sound('sound/music/THUNDERDOME.ogg') + +/client/proc/only_me() + if(!ticker) + alert("The game hasn't started yet!") + return + + for(var/mob/living/carbon/human/H in player_list) + if(H.stat == 2 || !(H.client)) continue + if(is_special_character(H)) continue + + ticker.mode.traitors += H.mind + H.mind.special_role = "[H.real_name] Prime" + + var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone + hijack_objective.owner = H.mind + H.mind.objectives += hijack_objective + + H << "You are the multiverse summoner. Activate your blade to summon copies of yourself from another universe to fight by your side." + var/obj_count = 1 + for(var/datum/objective/OBJ in H.mind.objectives) + H << "Objective #[obj_count]: [OBJ.explanation_text]" + obj_count++ + + var/obj/item/slot_item_ID = H.get_item_by_slot(slot_wear_id) + qdel(slot_item_ID) + var/obj/item/slot_item_hand = H.get_item_by_slot(slot_r_hand) + H.unEquip(slot_item_hand) + + var /obj/item/weapon/multisword/multi = new(H) + H.equip_to_slot_or_del(multi, slot_r_hand) + + var/obj/item/weapon/card/id/W = new(H) + W.icon_state = "centcom" + W.access = get_all_accesses() + W.access += get_all_centcom_access() + W.assignment = "Multiverse Summoner" + W.registered_name = H.real_name + W.update_label(H.real_name) + H.equip_to_slot_or_del(W, slot_wear_id) + + message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ME! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1) + log_admin("[key_name(usr)] used there can be only me.") + nologevent = 1 + world << sound('sound/music/THUNDERDOME.ogg') \ No newline at end of file From 51e2384d974d4c9bbc00fa2811f8271168e48117 Mon Sep 17 00:00:00 2001 From: cmbradsh Date: Thu, 22 Oct 2015 00:05:19 -0400 Subject: [PATCH 06/28] item/examine() wasn't returning its value, thus all items seemed to be infinitely far away when using the return value from ..() in subclasses. --- code/game/objects/items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6f4597ef7d8..d8b7e540bb2 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -136,7 +136,7 @@ if(5.0) size = "huge" - ..(user, distance, "", "It is a [size] item.") + . = ..(user, distance, "", "It is a [size] item.") if(user.research_scanner) //Mob has a research scanner active. var/msg = "*--------*
" From 77a354979cf7308cfcb0ce6ba5294c8992336a5e Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 22 Oct 2015 01:13:37 -0400 Subject: [PATCH 07/28] tweaks --- code/game/gamemodes/wizard/artefact.dm | 93 ++++++++++++++++++++++---- code/modules/admin/verbs/onlyone.dm | 2 +- 2 files changed, 80 insertions(+), 15 deletions(-) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 53fd96d5fc5..99ab89d3a7b 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -237,6 +237,7 @@ var/global/list/multiverse = list() var/cooldown_between_uses = 400 //time in deciseconds between uses--default of 40 seconds. var/assigned = "unassigned" var/evil = TRUE + var/probability_evil = 30 //what's the probability this sword will be evil when activated? var/duplicate_self = 0 //Do we want the species randomized along with equipment should the user be duplicated in their entirety? var/sword_type = /obj/item/weapon/multisword //type of sword to equip. @@ -265,7 +266,7 @@ var/global/list/multiverse = list() user.faction = list("[user.real_name]") user << "You bind the sword to yourself. You can now use it to summon help." if(!usr.mind.special_role) - if(prob(30)) + if(prob(probability_evil)) user << "With your new found power you could easily conquer the station!" var/datum/objective/hijackclone/hijack_objective = new /datum/objective/hijackclone hijack_objective.owner = usr.mind @@ -308,20 +309,22 @@ var/global/list/multiverse = list() M.key = C.key M.mind.name = usr.real_name M << "You are an alternate version of [usr.real_name] from another universe! Help them accomplish their goals at all costs." - M.real_name = usr.real_name - M.name = usr.real_name M.faction = list("[usr.real_name]") if(duplicate_self) M.set_species(usr.get_species()) //duplicate the sword user's species. else if(prob(50)) - var/list/all_species = list("Human","Unathi","Skrell","Tajaran","Kidan","Golem","Machine","Slime People","Grey","Vulpkanin") + var/list/all_species = list("Human","Unathi","Skrell","Tajaran","Kidan","Golem","Diona","Machine","Slime People","Grey","Vulpkanin") M.set_species(pick(all_species)) - M.dna = usr.dna.Clone() + M.real_name = usr.real_name //this is clear down here in case the user happens to become a golem; that way they have the proper name. + M.name = usr.real_name + if(duplicate_self) + M.dna = usr.dna.Clone() + M.UpdateAppearance() + domutcheck(M, null) M.update_body() M.update_hair() - M.UpdateAppearance() - domutcheck(M, null) + equip_copy(M) if(evil) @@ -350,11 +353,70 @@ var/global/list/multiverse = list() sword.evil = evil if(duplicate_self) - M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) - M.equip_or_collect(new /obj/item/weapon/storage/backpack(M), slot_back) - M.equip_or_collect(new /obj/item/clothing/under/color/random(M), slot_w_uniform) - M.equip_or_collect(new /obj/item/clothing/shoes/black(M), slot_shoes) - M.equip_to_slot_or_del(sword, slot_r_hand) //Don't duplicate the hands, or duplicate swords could be generated...or weird cases of factionless swords. + //Duplicates the user's current equipent + var/mob/living/carbon/human/H = usr + + var/obj/head = H.get_item_by_slot(slot_head) + if(head) + M.equip_to_slot_or_del(new head.type(M), slot_head) + + var/obj/mask = H.get_item_by_slot(slot_wear_mask) + if(mask) + M.equip_to_slot_or_del(new mask.type(M), slot_wear_mask) + + var/obj/glasses = H.get_item_by_slot(slot_glasses) + if(glasses) + M.equip_to_slot_or_del(new glasses.type(M), slot_glasses) + + var/obj/left_ear = H.get_item_by_slot(slot_l_ear) + if(left_ear) + M.equip_to_slot_or_del(new left_ear.type(M), slot_l_ear) + + var/obj/right_ear = H.get_item_by_slot(slot_r_ear) + if(right_ear) + M.equip_to_slot_or_del(new right_ear.type(M), slot_r_ear) + + var/obj/uniform = H.get_item_by_slot(slot_w_uniform) + if(uniform) + M.equip_to_slot_or_del(new uniform.type(M), slot_w_uniform) + + var/obj/suit = H.get_item_by_slot(slot_wear_suit) + if(suit) + M.equip_to_slot_or_del(new suit.type(M), slot_wear_suit) + + var/obj/gloves = H.get_item_by_slot(slot_gloves) + if(gloves) + M.equip_to_slot_or_del(new gloves.type(M), slot_gloves) + + var/obj/shoes = H.get_item_by_slot(slot_shoes) + if(shoes) + M.equip_to_slot_or_del(new shoes.type(M), slot_shoes) + + var/obj/belt = H.get_item_by_slot(slot_belt) + if(belt) + M.equip_to_slot_or_del(new belt.type(M), slot_belt) + + var/obj/pda = H.get_item_by_slot(slot_wear_pda) + if(pda) + M.equip_to_slot_or_del(new pda.type(M), slot_wear_pda) + + var/obj/back = H.get_item_by_slot(slot_back) + if(back) + M.equip_to_slot_or_del(new back.type(M), slot_back) + + var/obj/suit_storage = H.get_item_by_slot(slot_s_store) + if(suit_storage) + M.equip_to_slot_or_del(new suit_storage.type(M), slot_s_store) + + var/obj/left_pocket = H.get_item_by_slot(slot_l_store) + if(left_pocket) + M.equip_to_slot_or_del(new left_pocket.type(M), slot_l_store) + + var/obj/right_pocket = H.get_item_by_slot(slot_r_store) + if(right_pocket) + M.equip_to_slot_or_del(new right_pocket.type(M), slot_r_store) + + M.equip_to_slot_or_del(sword, slot_r_hand) //Don't duplicate what's equipped to hands, or else duplicate swords could be generated...or weird cases of factionless swords. else var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator") @@ -490,8 +552,6 @@ var/global/list/multiverse = list() else return - M.update_icons() - var/obj/item/weapon/card/id/W = new /obj/item/weapon/card/id if(duplicate_self) var/duplicated_access = usr.get_item_by_slot(slot_wear_id) @@ -510,6 +570,10 @@ var/global/list/multiverse = list() W.update_label(M.real_name) M.equip_to_slot_or_del(W, slot_wear_id) + M.update_icons() + +/obj/item/weapon/multisword/pure_evil + probability_evil = 100 /obj/item/weapon/multisword/pike //If We are to be used and spent, let it be for a noble purpose. name = "phantom pike" @@ -517,5 +581,6 @@ var/global/list/multiverse = list() icon_state = "harpoon" item_state = "harpoon" cooldown_between_uses = 200 //Half the time + probability_evil = 100 duplicate_self = 1 sword_type = /obj/item/weapon/multisword/pike diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index a07e7dfb58a..ca404f5cfc5 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -84,7 +84,7 @@ var/obj/item/slot_item_hand = H.get_item_by_slot(slot_r_hand) H.unEquip(slot_item_hand) - var /obj/item/weapon/multisword/multi = new(H) + var /obj/item/weapon/multisword/pure_evil/multi = new(H) H.equip_to_slot_or_del(multi, slot_r_hand) var/obj/item/weapon/card/id/W = new(H) From cc9861ecadc2dfb1ef7d2cf9e46a2bcac80589de Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 22 Oct 2015 02:11:36 -0400 Subject: [PATCH 08/28] duplication tweaks --- code/game/gamemodes/wizard/artefact.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 99ab89d3a7b..8c2fa530834 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -305,7 +305,10 @@ var/global/list/multiverse = list() /obj/item/weapon/multisword/proc/spawn_copy(var/client/C, var/turf/T) var/mob/living/carbon/human/M = new/mob/living/carbon/human(T) - C.prefs.copy_to(M) + if(duplicate_self) + usr.client.prefs.copy_to(M) + else + C.prefs.copy_to(M) M.key = C.key M.mind.name = usr.real_name M << "You are an alternate version of [usr.real_name] from another universe! Help them accomplish their goals at all costs." From 2e8e5c3a37009e888f620a8f81b788f41875cb59 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 22 Oct 2015 02:48:46 -0400 Subject: [PATCH 09/28] friendly-fire-proofing --- code/game/gamemodes/wizard/artefact.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 8c2fa530834..97cdc43c189 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -250,6 +250,12 @@ var/global/list/multiverse = list() multiverse.Remove(src) return ..() +/obj/item/weapon/multisword/attack(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief. + if(M.faction == user.faction) + user << "The [src] detects benevolent energies in your target and redirects your attack!" + return + ..() + /obj/item/weapon/multisword/attack_self(mob/user) if(user.mind.special_role == "apprentice") user << "You know better than to touch your teacher's stuff." From c4341992d15b1d019101bbbcc961df4ff095cd90 Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Thu, 22 Oct 2015 21:52:20 -0400 Subject: [PATCH 10/28] last tweaks --- code/game/gamemodes/wizard/artefact.dm | 6 +++++- code/modules/admin/verbs/onlyone.dm | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 97cdc43c189..3008d2db0c7 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -251,7 +251,7 @@ var/global/list/multiverse = list() return ..() /obj/item/weapon/multisword/attack(mob/living/M as mob, mob/living/user as mob) //to prevent accidental friendly fire or out and out grief. - if(M.faction == user.faction) + if(M.real_name == user.real_name) user << "The [src] detects benevolent energies in your target and redirects your attack!" return ..() @@ -427,6 +427,9 @@ var/global/list/multiverse = list() M.equip_to_slot_or_del(sword, slot_r_hand) //Don't duplicate what's equipped to hands, or else duplicate swords could be generated...or weird cases of factionless swords. else + if(M.get_species() == "Tajaran" || M.get_species() == "Unathi") + M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) //If they can't wear shoes, give them a pair of sandals. + var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator") switch(randomize) @@ -577,6 +580,7 @@ var/global/list/multiverse = list() W.assignment = "Multiverse Traveller" W.registered_name = M.real_name W.update_label(M.real_name) + W.SetOwnerInfo(M) M.equip_to_slot_or_del(W, slot_wear_id) M.update_icons() diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index ca404f5cfc5..97e7f716a3c 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -96,6 +96,8 @@ W.update_label(H.real_name) H.equip_to_slot_or_del(W, slot_wear_id) + H.update_icons() + message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ME! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1) log_admin("[key_name(usr)] used there can be only me.") nologevent = 1 From c093a644292364e36160276ae219d6c08fc7336b Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Fri, 23 Oct 2015 12:45:20 -0700 Subject: [PATCH 11/28] Makes upgraded hydroponic trays actually do something --- code/modules/hydroponics/trays/tray.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 874637995a0..5bc193892a0 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -514,8 +514,8 @@ health = 0 dead = 0 - nutrilevel = max(0,min(nutrilevel,10)) - waterlevel = max(0,min(waterlevel,100)) + nutrilevel = max(0,min(nutrilevel,maxnutri)) + waterlevel = max(0,min(waterlevel,maxwater)) pestlevel = max(0,min(pestlevel,10)) weedlevel = max(0,min(weedlevel,10)) toxins = max(0,min(toxins,10)) @@ -793,8 +793,8 @@ if(!Adjacent(user)) return - user << "Water: [round(waterlevel,0.1)]/100" - user << "Nutrient: [round(nutrilevel,0.1)]/10" + user << "Water: [round(waterlevel,0.1)]/[maxwater]" + user << "Nutrient: [round(nutrilevel,0.1)]/[maxnutri]" if(weedlevel >= 5) user << "\The [src] is infested with weeds!" @@ -864,4 +864,4 @@ if(istype(holding, /obj/item/weapon/tank)) usr << "\blue You eject [holding.name] from [src]." holding.loc = loc - holding = null + holding = null \ No newline at end of file From aa1186ae2de64e5291a70881ba81897e74cd8d59 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Fri, 23 Oct 2015 14:57:18 -0700 Subject: [PATCH 12/28] Dead humans are now no longer able to emote --- code/modules/mob/living/carbon/human/emote.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 414335a243e..6bc82f363d7 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,4 +1,8 @@ /mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null,var/force) + + if (stat == DEAD) + return // No screaming bodies + var/param = null if (findtext(act, "-", 1, null)) var/t1 = findtext(act, "-", 1, null) @@ -814,4 +818,4 @@ set desc = "Sets an extended description of your character's features." set category = "IC" - flavor_text = TextPreview(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) + flavor_text = TextPreview(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text) \ No newline at end of file From 95e574d4d5dbeecc1f75a18a341da58e70df8860 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Fri, 23 Oct 2015 15:16:58 -0700 Subject: [PATCH 13/28] Moves around the deathgasp emote in the human death proc This should prevent the death check from stopping our dying gasp --- code/modules/mob/living/carbon/human/death.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 4307c6cbd0b..fc2bc6e4c0e 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -84,6 +84,9 @@ if(stat == DEAD) return if(healths) healths.icon_state = "health5" + if(!gibbed) + emote("deathgasp") //let the world KNOW WE ARE DEAD + stat = DEAD dizziness = 0 jitteriness = 0 @@ -128,8 +131,6 @@ H.mind.kills += "[name] ([ckey])" if(!gibbed) - emote("deathgasp") //let the world KNOW WE ARE DEAD - update_canmove() if(client) blind.layer = 0 @@ -175,4 +176,4 @@ /mob/living/carbon/human/proc/Drain() ChangeToHusk() mutations |= NOCLONE - return + return \ No newline at end of file From 24bc5aaddec5ceb62b39041e78f5c020972395c8 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Fri, 23 Oct 2015 15:22:56 -0700 Subject: [PATCH 14/28] First test of the sleeper UI. This will probably summon 50 demons --- code/game/machinery/Sleeper.dm | 43 +++++++++++++- nano/templates/sleeper.tmpl | 104 +++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 3 deletions(-) create mode 100644 nano/templates/sleeper.tmpl diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 2459e1cc121..58e700f94e6 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -7,6 +7,8 @@ icon = 'icons/obj/Cryogenic2.dmi' icon_state = "console" var/obj/machinery/sleeper/connected = null + var/ui_title = "Sleeper" + anchored = 1 //About time someone fixed this. density = 1 var/orient = "LEFT" @@ -165,6 +167,40 @@ onclose(user, "sleeper") return +/obj/machinery/sleep_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) + var/data[0] + var/mob/living/carbon/human/occupant = connected.occupant + 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["bodyTemperature"] = occupant.bodytemperature + data["occupant"] = occupantData + data["maxchem"] = connected.max_chem + data["minhealth"] = connected.min_health + + var/chemicals[0] + for (var/re in connected.injection_chems) + var/datum/reagent/temp = chemical_reagents_list[re] + if(temp) + chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("chemical" = temp.id), "occ_amount" = occupant.reagents.get_reagent_amount(temp)))) + data["chemicals"] = chemicals + + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + if (!ui) + // Test values for window size right now + ui = new(user, src, ui_key, "sleeper.tmpl", ui_title, 390, 655) + ui.set_initial_data(data) + ui.open() + /obj/machinery/sleep_console/Topic(href, href_list) if(..()) return 1 @@ -219,7 +255,7 @@ var/amounts = list(5, 10) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 - var/efficiency + var/max_chem var/initial_bin_rating = 1 var/min_health = 25 var/injection_chems = list() @@ -271,7 +307,7 @@ I += M.rating injection_chems = possible_chems[I] - efficiency = E + max_chem = E * 20 min_health = -E * 25 /obj/machinery/sleeper/process() @@ -412,6 +448,7 @@ go_out() ..(severity) +// ??? /obj/machinery/sleeper/alter_health(mob/living/M as mob) if (M.health > 0) if (M.getOxyLoss() >= 10) @@ -449,7 +486,7 @@ /obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount) if(src.occupant) if(src.occupant.reagents) - if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 20 * efficiency) + if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= max_chem) src.occupant.reagents.add_reagent(chemical, amount) user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [chemical] in his/her bloodstream." return diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl new file mode 100644 index 00000000000..d39309821b0 --- /dev/null +++ b/nano/templates/sleeper.tmpl @@ -0,0 +1,104 @@ + +

Sleeper Status

+ +
+ {{if !data.hasOccupant}} +
Sleeper Unoccupied
+ {{else}} +
+ {{:data.occupant.name}} =>  + {{if data.occupant.stat == 0}} + Conscious + {{else data.occupant.stat == 1}} + Unconscious + {{else}} + DEAD + {{/if}} +
+ + {{if data.occupant.stat < 2}} +
+
Health:
+ {{if data.occupant.health >= 0}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} + {{else}} + {{:helper.displayBar(data.occupant.health, 0, data.occupant.minHealth, 'average 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)}}
+
+ {{/if}} + {{/if}} +
+ +

Sleeper Operation

+
+
+ Sleeper Status: +
+
+ {{:helper.link('Eject Occupant', 'arrowreturnthick-1-s', {'ejectify' : 1}, data.hasOccupant ? null : 'disabled')}} +
+
+
 
+
+
+ Beaker: +
+
+ {{if data.isBeakerLoaded}} + {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
+ {{if data.beakerVolume}} + {{:data.beakerVolume}} units remaining
+ {{else}} + Beaker is empty + {{/if}} + {{else}} + No beaker loaded + {{/if}} +
+
+ {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
+
+
+ {{if data.hasOccupant}} +
+ Chemicals: +
+ {{for data.chemicals}} +  {{:value.title}} : + {{:helper.displayBar(value.occ_amount, 0, data.maxchem, 'good')}} +
{{:helper.round(value.occ_amount)}}/{{:data.maxchem}}
+
+ {{:helper.link('5', 'gear', {'chemical' : value.id, 'amount' : 5}, (value.occ_amount + 5 > data.maxchem) ? 'disabled' : null)}} + {{:helper.link('10', 'gear', {'chemical' : value.id, 'amount' : 10}, ((value.occ_amount + 10) > data.maxchem) ? 'disabled' : null)}} + {{/for}} + {{/if}} +
From f98d2d066c5b7e2872202127222332dbe1c5bc78 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 24 Oct 2015 10:20:22 -0700 Subject: [PATCH 15/28] Hopefully fix Spacepod bullshit. I cleaned up part of my giant mess, and tried to ensure that the references will never be incorrect, however THAT PROBABLY WON'T FUCKING WORK, so I also added a proc spacepods call every time they want to interface with the occupant vars, which checks that the occupants are actually valid, and nulls them/moves them as appropriate. If this happens, it will make a debug log message and yell about it. --- code/game/vehicles/spacepods/spacepod.dm | 183 +++++++++++------------ 1 file changed, 91 insertions(+), 92 deletions(-) diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index d1525fde451..29df0f8f8f5 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -85,6 +85,7 @@ pr_give_air = null qdel(ion_trail) ion_trail = null + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() if(occupant) occupant.forceMove(get_turf(src)) occupant = null @@ -148,6 +149,7 @@ var/oldhealth = health health = max(0, health - damage) var/percentage = (health / initial(health)) * 100 + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() if(occupant && oldhealth > health && percentage <= 25 && percentage > 0) var/sound/S = sound('sound/effects/engine_alert2.ogg') S.wait = 0 //No queue @@ -186,6 +188,7 @@ /obj/spacepod/ex_act(severity) + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() switch(severity) if(1) var/mob/living/carbon/human/H = occupant @@ -207,6 +210,7 @@ deal_damage(50) /obj/spacepod/emp_act(severity) + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() switch(severity) if(1) if(src.occupant) src.occupant << "The pod console flashes 'Heavy EMP WAVE DETECTED'." //warn the occupants @@ -464,129 +468,119 @@ . = t_air.return_temperature() return -/obj/spacepod/proc/moved_inside(var/mob/living/carbon/human/H as mob) - var/fukkendisk = usr.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) - if(fukkendisk) - usr << "\red The nuke-disk locks the door as you try to get in. You evil person." - return - - if(H && H.client && H in range(1)) - if(src.occupant && src.occupant2) - H << "[src.name] is full." - return - - if(src.occupant && !src.occupant2) - if(src.occupant == H) - H.visible_message("You climb over the console and drop down into the secondary seat.") - H.reset_view(src) - H.stop_pulling() - H.forceMove(src) - if(src.occupant == H) occupant = null - src.occupant2 = H - src.add_fingerprint(H) - src.forceMove(src.loc) - playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) - return 1 - - else - if(!src.occupant) - H.reset_view(src) - H.stop_pulling() - H.forceMove(src) - src.occupant = H - src.add_fingerprint(H) - src.forceMove(src.loc) - playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) - return 1 - else - return - else - return 0 - /obj/spacepod/proc/moved_other_inside(var/mob/living/carbon/human/H as mob) - if(!src.occupant2) - H.reset_view(src) + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + if(!occupant2) H.stop_pulling() H.forceMove(src) - src.occupant2 = H - src.forceMove(src.loc) + occupant2 = H + H.forceMove(src) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) return 1 - else + +/obj/spacepod/MouseDrop_T(mob/M, mob/user) + if(!isliving(M)) return - - -/obj/spacepod/MouseDrop_T(mob/M as mob, mob/user as mob) - if(!isliving(M)) return + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() if(M != user && M.stat == DEAD && allow2enter) - if(src.occupant2 && !src.occupant) + if(occupant2 && !occupant) usr << "You can't put a corpse into the driver's seat!" - return - if(!src.occupant2) + return 0 + if(!occupant2) visible_message("[user.name] starts loading [M.name] into the pod!") sleep(10) moved_other_inside(M) if(M == user) - move_inside(user) + enter_pod(user) -/obj/spacepod/verb/move_inside(var/mob/user) +/obj/spacepod/verb/enter_pod(mob/user = usr) set category = "Object" set name = "Enter Pod" set src in oview(1) - var/fukkendisk = usr.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other - return - if (!ishuman(user)) return + if(!istype(user)) + return 0 + + var/fukkendisk = user.GetTypeInAllContents(/obj/item/weapon/disk/nuclear) + + if(user.incapacitated()) //are you cuffed, dying, lying, stunned or other + return 0 + if(!ishuman(user)) + return 0 if(fukkendisk) - user << "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod." - return + user << "The nuke-disk is locking the door every time you try to open it. You get the feeling that it doesn't want to go into the spacepod." + return 0 for(var/mob/living/carbon/slime/S in range(1,usr)) if(S.Victim == user) user << "You're too busy getting your life sucked out of you." - return + return 0 - try_user_enter(user) + move_inside(user) -/obj/spacepod/proc/try_user_enter(var/mob/user) - if(!src.occupant && !src.occupant2) - visible_message("[user] starts to climb into [src.name]") - if(enter_after(40,user)) - if(!src.occupant) - moved_inside(user) - else if(src.occupant != user) - user << "[src.occupant] was faster. Try better next time, loser." - else user << "You stop entering the spacepod." - return +/obj/spacepod/proc/move_inside(mob/user) + if(!istype(user)) + log_debug("SHIT'S GONE WRONG WITH THE SPACEPOD [src] AT [x], [y], [z], AREA [get_area(src)], TURF [get_turf(src)]") - if(!allow2enter) - user << "The door is locked!" - return + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() - if(occupant && occupant2) - user << "You can't fit in \the [src], it's full!" - return + if(!occupant) + visible_message("[user] starts to climb into \the [src].") + if(do_after(user, 40, target = src)) + if(!occupant) + user.stop_pulling() + occupant = user + user.forceMove(src) + add_fingerprint(user) + playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) + else + user << "[occupant] was faster. Try better next time, loser." + else + user << "You stop entering \the [src]." - if(occupant && !occupant2) - user << "You start climbing into the passenger bay." - user_enter(user) - - if(!occupant && occupant2) - user << "You start climbing into the pilot's seat." - user_enter(user) - -/obj/spacepod/proc/user_enter(var/mob/user) - visible_message("[user] starts to climb into \the [src.name].") - if(enter_after(40,user)) - moved_inside(user) + else if(!occupant2) + visible_message("[user] starts to climb into \the [src].") + if(do_after(user, 40, target = src)) + if(!occupant2) + user.stop_pulling() + occupant2 = user + user.forceMove(src) + add_fingerprint(user) + playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) + else + user << "[occupant] was faster. Try better next time, loser." + else + user << "You stop entering \the [src]." else - user << "You stop entering the spacepod." + user << "You can't fit in \the [src], it's full!" + +/obj/spacepod/proc + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() // /obj/spacepod/proc/__SANITY_CHECK_FUCKING_OCCUPANT_VARS() + if(occupant) + if(!ismob(occupant)) + occupant = null + occupant.forceMove(get_turf(src)) + log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + else if(occupant.loc != src) + occupant = null + log_debug("##SPACEPOD WARNING: OCCUPANT [occupant] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + if(occupant2) + if(!ismob(occupant2)) + occupant2 = null + occupant2.forceMove(get_turf(src)) + log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant2], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + else if(occupant2.loc != src) + occupant2 = null + log_debug("##SPACEPOD WARNING: OCCUPANT [occupant2] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + + if(!occupant && !allow2enter) + allow2enter = 1 + log_debug("##SPACEPOD WARNING: SOME FUCKHEAD LEFT THE DOORS LOCKED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") /obj/spacepod/verb/exit_pod() set name = "Exit pod" @@ -595,7 +589,10 @@ var/mob/user = usr var/spos = 0 - if(!ismob(user)) return + if(!istype(user)) + return + + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() if(occupant == user) spos = 1 if(occupant2 == user) spos = 2 @@ -618,6 +615,8 @@ set category = "Spacepod" set src = usr.loc + __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + if(!occupant2) usr << "There is no one in the second seat." return @@ -685,7 +684,7 @@ return equipment_system.weapon_system.fire_weapons() -obj/spacepod/verb/toggleLights() +/obj/spacepod/verb/toggleLights() set name = "Toggle Lights" set category = "Spacepod" set src = usr.loc From 3381874471a35c7b0831036b1faf848c1aeb5bc7 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sat, 24 Oct 2015 15:35:11 -0700 Subject: [PATCH 16/28] Decrease Vulgarity, fix mistake --- code/game/vehicles/spacepods/spacepod.dm | 30 ++++++++++++------------ 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index 29df0f8f8f5..14d36cc9833 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -85,7 +85,7 @@ pr_give_air = null qdel(ion_trail) ion_trail = null - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(occupant) occupant.forceMove(get_turf(src)) occupant = null @@ -149,7 +149,7 @@ var/oldhealth = health health = max(0, health - damage) var/percentage = (health / initial(health)) * 100 - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(occupant && oldhealth > health && percentage <= 25 && percentage > 0) var/sound/S = sound('sound/effects/engine_alert2.ogg') S.wait = 0 //No queue @@ -188,7 +188,7 @@ /obj/spacepod/ex_act(severity) - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() switch(severity) if(1) var/mob/living/carbon/human/H = occupant @@ -210,7 +210,7 @@ deal_damage(50) /obj/spacepod/emp_act(severity) - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() switch(severity) if(1) if(src.occupant) src.occupant << "The pod console flashes 'Heavy EMP WAVE DETECTED'." //warn the occupants @@ -469,7 +469,7 @@ return /obj/spacepod/proc/moved_other_inside(var/mob/living/carbon/human/H as mob) - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(!occupant2) H.stop_pulling() H.forceMove(src) @@ -482,7 +482,7 @@ if(!isliving(M)) return - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(M != user && M.stat == DEAD && allow2enter) if(occupant2 && !occupant) @@ -527,7 +527,7 @@ if(!istype(user)) log_debug("SHIT'S GONE WRONG WITH THE SPACEPOD [src] AT [x], [y], [z], AREA [get_area(src)], TURF [get_turf(src)]") - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(!occupant) visible_message("[user] starts to climb into \the [src].") @@ -560,27 +560,27 @@ user << "You can't fit in \the [src], it's full!" /obj/spacepod/proc - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() // /obj/spacepod/proc/__SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() // /obj/spacepod/proc/__occupant_sanity_check() if(occupant) if(!ismob(occupant)) - occupant = null occupant.forceMove(get_turf(src)) log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - else if(occupant.loc != src) occupant = null + else if(occupant.loc != src) log_debug("##SPACEPOD WARNING: OCCUPANT [occupant] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + occupant = null if(occupant2) if(!ismob(occupant2)) - occupant2 = null occupant2.forceMove(get_turf(src)) log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant2], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - else if(occupant2.loc != src) occupant2 = null + else if(occupant2.loc != src) log_debug("##SPACEPOD WARNING: OCCUPANT [occupant2] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + occupant2 = null if(!occupant && !allow2enter) allow2enter = 1 - log_debug("##SPACEPOD WARNING: SOME FUCKHEAD LEFT THE DOORS LOCKED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + log_debug("##SPACEPOD WARNING: DOORS WERE STILL LOCKED WITH NO OCCUPANT, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") /obj/spacepod/verb/exit_pod() set name = "Exit pod" @@ -592,7 +592,7 @@ if(!istype(user)) return - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(occupant == user) spos = 1 if(occupant2 == user) spos = 2 @@ -615,7 +615,7 @@ set category = "Spacepod" set src = usr.loc - __SANITY_CHECK_FUCKING_OCCUPANT_VARS() + __occupant_sanity_check() if(!occupant2) usr << "There is no one in the second seat." From 9e0e68a8b67167d44b1e841676eca972c8eb0a91 Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sun, 25 Oct 2015 10:35:39 -0700 Subject: [PATCH 17/28] Sleepers now use NanoUI Also cuts out a few points of weirdness; No dialysis on bloodless races like IPCs, and dialysis on simple_animals is no longer possible through the interface or through href twiddling, as that caused a runtime. Also, prevents href tweaking to dispense chemicals the sleeper doesn't have. --- code/game/machinery/Sleeper.dm | 99 +++++++++++++------ .../mob/living/carbon/human/human_defines.dm | 1 + code/modules/reagents/Chemistry-Readme.dm | 3 + .../modules/reagents/newchem/newchem_procs.dm | 8 ++ nano/templates/sleeper.tmpl | 81 +++++++++++---- 5 files changed, 140 insertions(+), 52 deletions(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 58e700f94e6..bc7e13343e6 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -8,7 +8,7 @@ icon_state = "console" var/obj/machinery/sleeper/connected = null var/ui_title = "Sleeper" - + anchored = 1 //About time someone fixed this. density = 1 var/orient = "LEFT" @@ -41,10 +41,6 @@ /obj/machinery/sleep_console/RefreshParts() /obj/machinery/sleep_console/process() - if(stat & (NOPOWER|BROKEN)) - return - src.updateUsrDialog() - return /obj/machinery/sleep_console/ex_act(severity) switch(severity) @@ -118,6 +114,8 @@ findsleeper() if (src.connected) + ui_interact(user) + /* var/mob/living/occupant = src.connected.occupant var/dat = "Occupant Statistics:
" if (occupant) @@ -165,6 +163,7 @@ dat += text("

Close", user) user << browse(dat, "window=sleeper;size=400x500") onclose(user, "sleeper") + */ return /obj/machinery/sleep_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) @@ -172,6 +171,7 @@ var/mob/living/carbon/human/occupant = connected.occupant data["hasOccupant"] = occupant ? 1 : 0 var/occupantData[0] + var/crisis = 0 if (occupant) occupantData["name"] = occupant.name occupantData["stat"] = occupant.stat @@ -183,57 +183,87 @@ occupantData["toxLoss"] = occupant.getToxLoss() occupantData["fireLoss"] = occupant.getFireLoss() occupantData["bodyTemperature"] = occupant.bodytemperature + occupantData["paralysis"] = occupant.paralysis + occupantData["hasBlood"] = 0 + crisis = (occupant.health < connected.min_health) + // I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent + // Runtime is aptly named, isn't she? + if (ishuman(occupant) && !(occupant.species.flags & NO_BLOOD) && occupant.vessel) + 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) + data["occupant"] = occupantData data["maxchem"] = connected.max_chem data["minhealth"] = connected.min_health + data["dialysis"] = connected.filtering + if (connected.beaker) + data["isBeakerLoaded"] = 1 + data["beakerFreeSpace"] = round(connected.beaker.reagents.maximum_volume - connected.beaker.reagents.total_volume) var/chemicals[0] for (var/re in connected.injection_chems) var/datum/reagent/temp = chemical_reagents_list[re] if(temp) - chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("chemical" = temp.id), "occ_amount" = occupant.reagents.get_reagent_amount(temp)))) + var/reagent_amount = 0 + var/pretty_amount + var/injectable = occupant ? 1 : 0 + var/overdosing = 0 + var/caution = 0 // To make things clear that you're coming close to an overdose + if (crisis && !(temp.id in connected.emergency_chems)) + injectable = 0 + + if (occupant && occupant.reagents) + reagent_amount = occupant.reagents.get_reagent_amount(temp.id) + // If they're mashing the highest concentration, they get one warning + if (temp.overdose_threshold && reagent_amount + 10 > temp.overdose_threshold) + caution = 1 + if (temp.id in occupant.reagents.overdose_list()) + overdosing = 1 + + // Because I don't know how to do this on the nano side + pretty_amount = round(reagent_amount, 0.1) + + chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("chemical" = temp.id), "occ_amount" = reagent_amount, "pretty_amount" = pretty_amount, "injectable" = injectable, "overdosing" = overdosing, "od_warning" = caution))) data["chemicals"] = chemicals ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - // Test values for window size right now - ui = new(user, src, ui_key, "sleeper.tmpl", ui_title, 390, 655) + ui = new(user, src, ui_key, "sleeper.tmpl", ui_title, 550, 655) ui.set_initial_data(data) ui.open() + ui.set_auto_update(1) /obj/machinery/sleep_console/Topic(href, href_list) + if(!connected | usr == connected.occupant) + return 0 + if(..()) return 1 if(panel_open) usr << "Close the maintenance panel first." - return 1 + return 0 if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) - usr.set_machine(src) if (href_list["chemical"]) if (src.connected) if (src.connected.occupant) if (src.connected.occupant.stat == DEAD) usr << "\red \b This person has no life for to preserve anymore. Take them to a department capable of reanimating them." - else if(src.connected.occupant.health > src.connected.min_health || href_list["chemical"] == "epinephrine") + else if(src.connected.occupant.health > src.connected.min_health || (href_list["chemical"] in connected.emergency_chems)) src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) else usr << "\red \b This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!" - src.updateUsrDialog() - if (href_list["refresh"]) - src.updateUsrDialog() if (href_list["removebeaker"]) src.connected.remove_beaker() - src.updateUsrDialog() if (href_list["togglefilter"]) src.connected.toggle_filter() - src.updateUsrDialog() if (href_list["ejectify"]) src.connected.eject() - src.updateUsrDialog() src.add_fingerprint(usr) - return + return 1 ///////////////////////////////////////// // THE SLEEPER ITSELF @@ -252,6 +282,7 @@ list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine"), list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol"), list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid", "omnizine")) + var/emergency_chems = list("epinephrine") // Desnowflaking var/amounts = list(5, 10) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 @@ -264,12 +295,12 @@ light_color = LIGHT_COLOR_CYAN - power_change() - ..() - if(!(stat & (BROKEN|NOPOWER))) - set_light(2) - else - set_light(0) +/obj/machinery/sleeper/power_change() + ..() + if(!(stat & (BROKEN|NOPOWER))) + set_light(2) + else + set_light(0) /obj/machinery/sleeper/New() ..() @@ -313,10 +344,14 @@ /obj/machinery/sleeper/process() if(filtering > 0) if(beaker) + // To prevent runtimes from drawing blood from runtime, and to prevent getting IPC blood. + if(!istype(occupant) || !occupant.dna || (occupant.species && occupant.species.flags & NO_BLOOD)) + filtering = 0 + return + if(beaker.reagents.total_volume < beaker.reagents.maximum_volume) src.occupant.vessel.trans_to(beaker, 1) for(var/datum/reagent/x in src.occupant.reagents.reagent_list) - // world << "FILTERING CHEMS" src.occupant.reagents.trans_to(beaker, 3) src.occupant.vessel.trans_to(beaker, 1) src.updateDialog() @@ -342,7 +377,6 @@ beaker = G G.forceMove(src) user.visible_message("[user] adds \a [G] to \the [src]!", "You add \a [G] to \the [src]!") - src.updateUsrDialog() return else @@ -484,11 +518,14 @@ return /obj/machinery/sleeper/proc/inject_chemical(mob/living/user as mob, chemical, amount) + if (!(chemical in injection_chems)) + user << "The sleeper does not offer that chemical!" + return + if(src.occupant) if(src.occupant.reagents) if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= max_chem) src.occupant.reagents.add_reagent(chemical, amount) - user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [chemical] in his/her bloodstream." return else user << "You can not inject any more of this chemical." @@ -532,7 +569,7 @@ /obj/machinery/sleeper/verb/eject() set name = "Eject Sleeper" - set category = null + set category = "Object" set src in oview(1) if(usr.stat != 0) return @@ -543,7 +580,7 @@ /obj/machinery/sleeper/verb/remove_beaker() set name = "Remove Beaker" - set category = null + set category = "Object" set src in oview(1) if(usr.stat != 0) return @@ -557,7 +594,7 @@ /obj/machinery/sleeper/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob) if(O.loc == user) //no you can't pull things out of your ass return - if(user.restrained() || user.stat || user.weakened || user.stunned || user.paralysis || user.resting) //are you cuffed, dying, lying, stunned or other + if(user.incapacitated()) //are you cuffed, dying, lying, stunned or other return if(get_dist(user, src) > 1 || get_dist(user, O) > 1 || user.contents.Find(src)) // is the mob anchored, too far away from you, or are you too far away from the source return @@ -620,7 +657,7 @@ /obj/machinery/sleeper/verb/move_inside() set name = "Enter Sleeper" - set category = null + set category = "Object" set src in oview(1) if(usr.stat != 0 || !(ishuman(usr))) return diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index eb53f62a774..c6513be0799 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -73,6 +73,7 @@ var/mob/remoteview_target = null var/meatleft = 3 //For chef item var/decaylevel = 0 // For rotting bodies + var/max_blood = 560 // For stuff in the vessel var/slime_color = "blue" //For slime people this defines their color, it's blue by default to pay tribute to the old icons var/check_mutations=0 // Check mutations on next life tick diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index 77921d0ab07..61e2a0c82a0 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -98,6 +98,9 @@ About the Holder: Returns the amount of the matching reagent inside the holder. Returns 0 if the reagent is missing. + overdose_list() + Returns a list of all the chemical IDs in the reagent holder that are overdosing + Important variables: total_volume diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index b2d6edc0995..faf530f6b3e 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -82,6 +82,14 @@ datum/reagents/proc/metabolize(var/mob/M) addiction_tick++ update_total() +/datum/reagents/proc/overdose_list() + var/od_chems[0] + for(var/datum/reagent/R in reagent_list) + if(R.overdosed) + od_chems.Add(R.id) + return od_chems + + datum/reagents/proc/reagent_on_tick() for(var/datum/reagent/R in reagent_list) R.on_tick() diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl index d39309821b0..6b480301393 100644 --- a/nano/templates/sleeper.tmpl +++ b/nano/templates/sleeper.tmpl @@ -19,13 +19,16 @@ Used In File(s): \code\game\machinery\Sleeper.dm {{/if}}
- {{if data.occupant.stat < 2}}
Health:
- {{if data.occupant.health >= 0}} + {{if data.occupant.health >= data.occupant.maxHealth}} {{:helper.displayBar(data.occupant.health, 0, data.occupant.maxHealth, 'good')}} - {{else}} + {{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)}}
@@ -53,7 +56,29 @@ Used In File(s): \code\game\machinery\Sleeper.dm {{:helper.displayBar(data.occupant.fireLoss, 0, data.occupant.maxHealth, 'bad')}}
{{:helper.round(data.occupant.fireLoss)}}
- {{/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}} +
+ {{/if}} {{/if}} @@ -69,36 +94,50 @@ Used In File(s): \code\game\machinery\Sleeper.dm
 
- Beaker: + Dialysis Beaker:
- {{if data.isBeakerLoaded}} - {{:data.beakerLabel ? data.beakerLabel : 'No label'}}
- {{if data.beakerVolume}} - {{:data.beakerVolume}} units remaining
- {{else}} - Beaker is empty - {{/if}} + {{if data.isBeakerLoaded}} + {{:helper.round(data.beakerFreeSpace)}} units of space remaining
{{else}} - No beaker loaded + No Dialysis Output Beaker Loaded {{/if}}
- {{:helper.link('Eject Beaker', 'eject', {'ejectBeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{:helper.link('Eject Beaker', 'eject', {'removebeaker' : 1}, data.isBeakerLoaded ? null : 'disabled')}} + {{if data.isBeakerLoaded}} +
+
+ {{:helper.link('On', 'power', {'togglefilter' : 1}, data.occupant.hasBlood ? (data.dialysis ? 'selected' : null) : 'disabled')}}{{:helper.link('Off', 'close', {'togglefilter' : 1}, data.dialysis ? null : 'selected')}} +
+
+ {{/if}}
- {{if data.hasOccupant}}
Chemicals:
+ {{for data.chemicals}} -  {{:value.title}} : +
+ {{:value.title}}: + {{if value.overdosing}} + {{:helper.displayBar(value.occ_amount, 0, data.maxchem, 'bad')}} + {{else value.od_warning}} + {{:helper.displayBar(value.occ_amount, 0, data.maxchem, 'average')}} + {{else}} {{:helper.displayBar(value.occ_amount, 0, data.maxchem, 'good')}} -
{{:helper.round(value.occ_amount)}}/{{:data.maxchem}}
-
- {{:helper.link('5', 'gear', {'chemical' : value.id, 'amount' : 5}, (value.occ_amount + 5 > data.maxchem) ? 'disabled' : null)}} - {{:helper.link('10', 'gear', {'chemical' : value.id, 'amount' : 10}, ((value.occ_amount + 10) > data.maxchem) ? 'disabled' : null)}} + {{/if}} +
{{:value.pretty_amount}}/{{:data.maxchem}}
+
+
+
+ {{:helper.link('5', 'gear', {'chemical' : value.id, 'amount' : 5}, (!value.injectable || ((value.occ_amount + 5) > data.maxchem)) ? 'disabled' : null)}} + {{:helper.link('10', 'gear', {'chemical' : value.id, 'amount' : 10}, (!value.injectable || ((value.occ_amount + 10) > data.maxchem)) ? 'disabled' : null)}} +
+
{{/for}} - {{/if}}
+ From 5c06f724ce5724274b1bdb6d11cfe17e69cbc6a7 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Sun, 25 Oct 2015 13:44:06 -0700 Subject: [PATCH 18/28] my ability to care is waning --- code/game/vehicles/spacepods/spacepod.dm | 59 ++++++++++++------------ 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/code/game/vehicles/spacepods/spacepod.dm b/code/game/vehicles/spacepods/spacepod.dm index 14d36cc9833..effd1bd64b9 100644 --- a/code/game/vehicles/spacepods/spacepod.dm +++ b/code/game/vehicles/spacepods/spacepod.dm @@ -85,7 +85,7 @@ pr_give_air = null qdel(ion_trail) ion_trail = null - __occupant_sanity_check() + occupant_sanity_check() if(occupant) occupant.forceMove(get_turf(src)) occupant = null @@ -149,7 +149,7 @@ var/oldhealth = health health = max(0, health - damage) var/percentage = (health / initial(health)) * 100 - __occupant_sanity_check() + occupant_sanity_check() if(occupant && oldhealth > health && percentage <= 25 && percentage > 0) var/sound/S = sound('sound/effects/engine_alert2.ogg') S.wait = 0 //No queue @@ -188,7 +188,7 @@ /obj/spacepod/ex_act(severity) - __occupant_sanity_check() + occupant_sanity_check() switch(severity) if(1) var/mob/living/carbon/human/H = occupant @@ -210,7 +210,7 @@ deal_damage(50) /obj/spacepod/emp_act(severity) - __occupant_sanity_check() + occupant_sanity_check() switch(severity) if(1) if(src.occupant) src.occupant << "The pod console flashes 'Heavy EMP WAVE DETECTED'." //warn the occupants @@ -469,7 +469,7 @@ return /obj/spacepod/proc/moved_other_inside(var/mob/living/carbon/human/H as mob) - __occupant_sanity_check() + occupant_sanity_check() if(!occupant2) H.stop_pulling() H.forceMove(src) @@ -482,7 +482,7 @@ if(!isliving(M)) return - __occupant_sanity_check() + occupant_sanity_check() if(M != user && M.stat == DEAD && allow2enter) if(occupant2 && !occupant) @@ -527,7 +527,7 @@ if(!istype(user)) log_debug("SHIT'S GONE WRONG WITH THE SPACEPOD [src] AT [x], [y], [z], AREA [get_area(src)], TURF [get_turf(src)]") - __occupant_sanity_check() + occupant_sanity_check() if(!occupant) visible_message("[user] starts to climb into \the [src].") @@ -559,28 +559,27 @@ else user << "You can't fit in \the [src], it's full!" -/obj/spacepod/proc - __occupant_sanity_check() // /obj/spacepod/proc/__occupant_sanity_check() - if(occupant) - if(!ismob(occupant)) - occupant.forceMove(get_turf(src)) - log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupant = null - else if(occupant.loc != src) - log_debug("##SPACEPOD WARNING: OCCUPANT [occupant] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupant = null - if(occupant2) - if(!ismob(occupant2)) - occupant2.forceMove(get_turf(src)) - log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant2], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupant2 = null - else if(occupant2.loc != src) - log_debug("##SPACEPOD WARNING: OCCUPANT [occupant2] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") - occupant2 = null +/obj/spacepod/proc/occupant_sanity_check() + if(occupant) + if(!ismob(occupant)) + occupant.forceMove(get_turf(src)) + log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + occupant = null + else if(occupant.loc != src) + log_debug("##SPACEPOD WARNING: OCCUPANT [occupant] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + occupant = null + if(occupant2) + if(!ismob(occupant2)) + occupant2.forceMove(get_turf(src)) + log_debug("##SPACEPOD WARNING: NON-MOB OCCUPANT [occupant2], TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + occupant2 = null + else if(occupant2.loc != src) + log_debug("##SPACEPOD WARNING: OCCUPANT [occupant2] ESCAPED, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + occupant2 = null - if(!occupant && !allow2enter) - allow2enter = 1 - log_debug("##SPACEPOD WARNING: DOORS WERE STILL LOCKED WITH NO OCCUPANT, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") + if(!occupant && !allow2enter) + allow2enter = 1 + log_debug("##SPACEPOD WARNING: DOORS WERE STILL LOCKED WITH NO OCCUPANT, TURF [get_turf(src)] | AREA [get_area(src)] | COORDS [x], [y], [z]") /obj/spacepod/verb/exit_pod() set name = "Exit pod" @@ -592,7 +591,7 @@ if(!istype(user)) return - __occupant_sanity_check() + occupant_sanity_check() if(occupant == user) spos = 1 if(occupant2 == user) spos = 2 @@ -615,7 +614,7 @@ set category = "Spacepod" set src = usr.loc - __occupant_sanity_check() + occupant_sanity_check() if(!occupant2) usr << "There is no one in the second seat." From a2669d6791c324f4c768effffbc86d941ea5d65e Mon Sep 17 00:00:00 2001 From: Crazylemon64 Date: Sun, 25 Oct 2015 14:09:03 -0700 Subject: [PATCH 19/28] Sleeper now has a temperature and pulse readout --- code/game/machinery/Sleeper.dm | 87 +++++++++++++--------------------- nano/css/shared.css | 25 ++++++++++ nano/templates/sleeper.tmpl | 58 +++++++++++++++++++++++ 3 files changed, 117 insertions(+), 53 deletions(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index bc7e13343e6..3d645492681 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -115,56 +115,6 @@ if (src.connected) ui_interact(user) - /* - var/mob/living/occupant = src.connected.occupant - var/dat = "Occupant Statistics:
" - if (occupant) - var/t1 - switch(occupant.stat) - if(0) - t1 = "Conscious" - if(1) - t1 = "Unconscious" - if(2) - t1 = "*dead*" - else - dat += text("[]\tHealth %: [] ([])

", (occupant.health > 50 ? "" : ""), occupant.health, t1) - if(iscarbon(occupant)) - var/mob/living/carbon/C = occupant - dat += text("[]\t-Pulse, bpm: []
", (C.pulse == PULSE_NONE || C.pulse == PULSE_THREADY ? "" : ""), C.get_pulse(GETPULSE_TOOL)) - dat += text("[]\t-Brute Damage %: []
", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss()) - dat += text("[]\t-Respiratory Damage %: []
", (occupant.getOxyLoss() < 60 ? "" : ""), occupant.getOxyLoss()) - dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss()) - dat += text("[]\t-Burn Severity %: []
", (occupant.getFireLoss() < 60 ? "" : ""), occupant.getFireLoss()) - dat += text("
Paralysis Summary %: [] ([] seconds left!)
", occupant.paralysis, round(occupant.paralysis / 4)) - if(occupant.reagents) - for(var/chemical in connected.injection_chems) - var/datum/reagent/C = chemical_reagents_list[chemical] - dat += "[C.name]: [occupant.reagents.get_reagent_amount(chemical)] units
" - dat += "Refresh Meter Readings
" - if(src.connected.beaker) - dat += "
Remove Beaker
" - if(src.connected.filtering) - dat += "Stop Dialysis
" - dat += text("Output Beaker has [] units of free space remaining

", src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume) - else - dat += "
Start Dialysis
" - dat += text("Output Beaker has [] units of free space remaining

", src.connected.beaker.reagents.maximum_volume - src.connected.beaker.reagents.total_volume) - else - dat += "
No Dialysis Output Beaker is present.

" - for(var/chemical in connected.injection_chems) - var/datum/reagent/C = chemical_reagents_list[chemical] - dat += "Inject [C.name]: " - for(var/amount in connected.amounts) - dat += "[amount] units
" - dat += "
Eject Patient" - else - dat += "The sleeper is empty." - dat += text("

Close", user) - user << browse(dat, "window=sleeper;size=400x500") - onclose(user, "sleeper") - */ - return /obj/machinery/sleep_console/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] @@ -182,13 +132,44 @@ occupantData["oxyLoss"] = occupant.getOxyLoss() occupantData["toxLoss"] = occupant.getToxLoss() occupantData["fireLoss"] = occupant.getFireLoss() - occupantData["bodyTemperature"] = occupant.bodytemperature 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) + // I wanna do something where the bar gets bluer as the temperature gets lower + // For now, I'll just use the standard format for the temperature status + 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 + + crisis = (occupant.health < connected.min_health) // I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent // Runtime is aptly named, isn't she? - if (ishuman(occupant) && !(occupant.species.flags & NO_BLOOD) && occupant.vessel) + 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 @@ -223,7 +204,7 @@ overdosing = 1 // Because I don't know how to do this on the nano side - pretty_amount = round(reagent_amount, 0.1) + pretty_amount = round(reagent_amount, 0.05) chemicals.Add(list(list("title" = temp.name, "id" = temp.id, "commands" = list("chemical" = temp.id), "occ_amount" = reagent_amount, "pretty_amount" = pretty_amount, "injectable" = injectable, "overdosing" = overdosing, "od_warning" = caution))) data["chemicals"] = chemicals diff --git a/nano/css/shared.css b/nano/css/shared.css index 786b577e615..b9ceac02814 100644 --- a/nano/css/shared.css +++ b/nano/css/shared.css @@ -606,4 +606,29 @@ th.misc { .Pearl { color: #C6CACB; +} + +/* Status bar colors for sleeper temperatures */ +.cold1 { + color: #94B8FF; +} + +.cold2 { + color: #6699FF; +} + +.cold3 { + color: #293D66; +} + +.hot1 { + color: #FF9966; +} + +.hot2 { + color: #993D00; +} + +.hot3 { + color: #FF6600; } \ No newline at end of file diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl index 6b480301393..efe73830ea9 100644 --- a/nano/templates/sleeper.tmpl +++ b/nano/templates/sleeper.tmpl @@ -56,9 +56,67 @@ Used In File(s): \code\game\machinery\Sleeper.dm {{: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}}
+
+
Pulse:
{{:data.occupant.pulse}} bpm
+
Blood Level:
{{if data.occupant.bloodPercent <= 60}} From f822d37f63e06727fc605efc398e724fc3d73562 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Sun, 25 Oct 2015 20:54:47 -0700 Subject: [PATCH 20/28] I like spans! I hate old crusty unused functions that use text()! --- code/game/machinery/Sleeper.dm | 63 +++++++++------------------------- 1 file changed, 17 insertions(+), 46 deletions(-) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 3d645492681..0035170d4dd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -232,11 +232,11 @@ if (src.connected) if (src.connected.occupant) if (src.connected.occupant.stat == DEAD) - usr << "\red \b This person has no life for to preserve anymore. Take them to a department capable of reanimating them." + usr << "This person has no life for to preserve anymore. Take them to a department capable of reanimating them." else if(src.connected.occupant.health > src.connected.min_health || (href_list["chemical"] in connected.emergency_chems)) src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"])) else - usr << "\red \b This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!" + usr << "This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!" if (href_list["removebeaker"]) src.connected.remove_beaker() if (href_list["togglefilter"]) @@ -269,7 +269,7 @@ var/filtering = 0 var/max_chem var/initial_bin_rating = 1 - var/min_health = 25 + var/min_health = -25 var/injection_chems = list() idle_power_usage = 1250 active_power_usage = 2500 @@ -361,7 +361,7 @@ return else - user << "\red The sleeper has a beaker already." + user << "The sleeper has a beaker already." return if (istype(G, /obj/item/weapon/screwdriver)) @@ -393,12 +393,12 @@ if(istype(G, /obj/item/weapon/grab)) if(panel_open) - user << "\blue Close the maintenance panel first." + user << "Close the maintenance panel first." return if(!ismob(G:affecting)) return if(src.occupant) - user << "\blue The sleeper is already occupied!" + user << "The sleeper is already occupied!" return for(var/mob/living/carbon/slime/M in range(1,G:affecting)) if(M.Victim == G:affecting) @@ -409,7 +409,7 @@ if(do_after(user, 20, target = G:affecting)) if(src.occupant) - user << "\blue The sleeper is already occupied!" + user << "The sleeper is already occupied!" return if(!G || !G:affecting) return var/mob/M = G:affecting @@ -419,7 +419,7 @@ M.forceMove(src) src.occupant = M src.icon_state = "sleeper" - M << "\blue You feel cool air surround you. You go numb as your senses turn inward." + M << "You feel cool air surround you. You go numb as your senses turn inward." src.add_fingerprint(user) qdel(G) @@ -464,6 +464,7 @@ ..(severity) // ??? +// This looks cool, although mildly broken, should it be included again? /obj/machinery/sleeper/alter_health(mob/living/M as mob) if (M.health > 0) if (M.getOxyLoss() >= 10) @@ -518,36 +519,6 @@ user << "There's no occupant in the sleeper!" return - -/obj/machinery/sleeper/proc/check(mob/living/user as mob) - if(src.occupant) - user << text("\blue Occupant ([]) Statistics:", src.occupant) - var/t1 - switch(src.occupant.stat) - if(0.0) - t1 = "Conscious" - if(1.0) - t1 = "Unconscious" - if(2.0) - t1 = "*dead*" - else - user << text("[]\t Health %: [] ([])", (src.occupant.health > 50 ? "\blue " : "\red "), src.occupant.health, t1) - user << text("[]\t -Core Temperature: []°C ([]°F)

", (src.occupant.bodytemperature > 50 ? "" : ""), src.occupant.bodytemperature-T0C, src.occupant.bodytemperature*1.8-459.67) - user << text("[]\t -Brute Damage %: []", (src.occupant.getBruteLoss() < 60 ? "\blue " : "\red "), src.occupant.getBruteLoss()) - user << text("[]\t -Respiratory Damage %: []", (src.occupant.getOxyLoss() < 60 ? "\blue " : "\red "), src.occupant.getOxyLoss()) - user << text("[]\t -Toxin Content %: []", (src.occupant.getToxLoss() < 60 ? "\blue " : "\red "), src.occupant.getToxLoss()) - user << text("[]\t -Burn Severity %: []", (src.occupant.getFireLoss() < 60 ? "\blue " : "\red "), src.occupant.getFireLoss()) - user << "\blue Expected time till occupant can safely awake: (note: If health is below 20% these times are inaccurate)" - user << text("\blue \t [] second\s (if around 1 or 2 the sleeper is keeping them asleep.)", src.occupant.paralysis / 5) - if(src.beaker) - user << text("\blue \t Dialysis Output Beaker has [] of free space remaining.", src.beaker.reagents.maximum_volume - src.beaker.reagents.total_volume) - else - user << "\blue No Dialysis Output Beaker loaded." - else - user << "\blue There is no one inside!" - return - - /obj/machinery/sleeper/verb/eject() set name = "Eject Sleeper" set category = "Object" @@ -590,10 +561,10 @@ if(!istype(user.loc, /turf) || !istype(O.loc, /turf)) // are you in a container/closet/pod/etc? return if(panel_open) - user << "\blue Close the maintenance panel first." + user << "Close the maintenance panel first." return if(occupant) - user << "\blue The sleeper is already occupied!" + user << "The sleeper is already occupied!" return /* if(isrobot(user)) if(!istype(user:module, /obj/item/weapon/robot_module/medical)) @@ -603,7 +574,7 @@ if(!istype(L) || L.buckled) return if(L.abiotic()) - user << "\blue Subject cannot have abiotic items on." + user << "Subject cannot have abiotic items on." return for(var/mob/living/carbon/slime/M in range(1,L)) if(M.Victim == L) @@ -616,7 +587,7 @@ if(do_after(user, 20, target = L)) if(src.occupant) - user << "\blue The sleeper is already occupied!" + user << ">The sleeper is already occupied!" return if(!L) return @@ -626,7 +597,7 @@ L.forceMove(src) src.occupant = L src.icon_state = "sleeper" - L << "\blue You feel cool air surround you. You go numb as your senses turn inward." + L << "You feel cool air surround you. You go numb as your senses turn inward." src.add_fingerprint(user) if(user.pulling == L) user.pulling = null @@ -643,10 +614,10 @@ if(usr.stat != 0 || !(ishuman(usr))) return if(src.occupant) - usr << "\blue The sleeper is already occupied!" + usr << "The sleeper is already occupied!" return if (panel_open) - usr << "\blue Close the maintenance panel first." + usr << "Close the maintenance panel first." return if(usr.restrained() || usr.stat || usr.weakened || usr.stunned || usr.paralysis || usr.resting) //are you cuffed, dying, lying, stunned or other return @@ -657,7 +628,7 @@ visible_message("[usr] starts climbing into the sleeper.") if(do_after(usr, 20, target = usr)) if(src.occupant) - usr << "\blue The sleeper is already occupied!" + usr << "The sleeper is already occupied!" return usr.stop_pulling() usr.client.perspective = EYE_PERSPECTIVE From 7d0f7d636331ec33871afa0a0d4e6a5432c5c43e Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Sun, 25 Oct 2015 22:13:13 -0700 Subject: [PATCH 21/28] The other half of my monkey recycler fix Forgot to fix this, the first time through! --- code/game/machinery/kitchen/monkeyrecycler.dm | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 22115ad0cdc..810143f6583 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -53,11 +53,11 @@ var/mob/living/carbon/human/target = grabbed if(issmall(target)) if(target.stat == 0) - user << "\red The monkey is struggling far too much to put it in the recycler." + user << "The monkey is struggling far too much to put it in the recycler." else user.drop_item() qdel(target) - user << "\blue You stuff the monkey in the machine." + user << "You stuff the monkey in the machine." playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1) var/offset = prob(50) ? -2 : 2 animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking @@ -65,22 +65,23 @@ src.grinded++ sleep(50) pixel_x = initial(pixel_x) - user << "\blue The machine now has [grinded] monkeys worth of material stored." + user << "The machine now has [grinded] monkey\s worth of material stored." else - user << "\red The machine only accepts monkeys!" + user << "The machine only accepts monkeys!" else - user << "\red The machine only accepts monkeys!" + user << "The machine only accepts monkeys!" return /obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) if (src.stat != 0) //NOPOWER etc return if(grinded >= required_grind) - user << "\blue The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." + user << "The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= required_grind - new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc) - user << "\blue The machine's display flashes that it has [grinded] monkeys worth of material left." - else - user << "\red The machine needs at least [required_grind] monkey\s worth of material to produce a monkey cube. It only has [grinded]." - return + for(var/i = 0, i < cube_production, i++) // Forgot to fix this bit the first time through + new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc) + user << "The machine's display flashes that it has [grinded] monkey\s worth of material left." + else // I'm not sure if the \s macro works with a word in between; I'll play it safe + user << "The machine needs at least [required_grind] monkey\s worth of material to compress [cube_production] monkey\s. It only has [grinded]." + return \ No newline at end of file From a78d8a00442b00ec23deeaba7ed7f07e7bfaead9 Mon Sep 17 00:00:00 2001 From: Crazylemon Date: Sun, 25 Oct 2015 23:26:00 -0700 Subject: [PATCH 22/28] Sleeper now has fancy little degree symbols for temperature --- nano/templates/sleeper.tmpl | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/nano/templates/sleeper.tmpl b/nano/templates/sleeper.tmpl index efe73830ea9..8cd59a4e4b9 100644 --- a/nano/templates/sleeper.tmpl +++ b/nano/templates/sleeper.tmpl @@ -63,50 +63,50 @@ Used In File(s): \code\game\machinery\Sleeper.dm
Patient Temperature:
{{if data.occupant.temperatureSuitability == -3}} {{:helper.displayBar(data.occupant.bodyTemperature, 0, data.occupant.maxTemp, 'cold3')}} -
{{:helper.round(data.occupant.btCelsius)}}C, {{:helper.round(data.occupant.btFaren)}}F
+
{{: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, 'cold2')}} -
{{:helper.round(data.occupant.btCelsius)}}C, {{:helper.round(data.occupant.btFaren)}}F
+
{{: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, 'cold1')}} -
{{:helper.round(data.occupant.btCelsius)}}C, {{:helper.round(data.occupant.btFaren)}}F
+
{{: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
+
{{: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, 'hot1')}} -
{{:helper.round(data.occupant.btCelsius)}}C, {{:helper.round(data.occupant.btFaren)}}F
+
{{: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, 'hot2')}} -
{{:helper.round(data.occupant.btCelsius)}}C, {{:helper.round(data.occupant.btFaren)}}F
+
{{: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, 'hot3')}} -
{{:helper.round(data.occupant.btCelsius)}}C, {{:helper.round(data.occupant.btFaren)}}F
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
{{/if}} If you can get the changing temperature bars to work right, congratulations -->
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
+
{{: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
+
{{: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
+
{{: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
+
{{: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
+
{{: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
+
{{: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
+
{{:helper.round(data.occupant.btCelsius)}}°C, {{:helper.round(data.occupant.btFaren)}}°F
{{/if}}
From b3075c0f8d6ed6437e8fa584024648d42d10e98f Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 26 Oct 2015 17:40:49 -0700 Subject: [PATCH 23/28] PDA Fixes & Retro Tweaks --- nano/templates/pda.tmpl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 753e06f299e..4f74a358930 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -69,6 +69,14 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm margin: 0 2px 2px 0; } + .uiIcon16 { + background-image: none; + float: left; + width: auto; + height: auto; + margin: 0 0 0 0; + } + #uiTitleText { color: #000000; } @@ -307,7 +315,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm

Current Conversations

{{for data.convopdas}}
- {{:helper.link(value.Name, 'circle-arrow-s', {'choice' : "Select Conversation", 'convo' : value.Reference } , null, 'pdalink fixedLeftWider')}} + {{:helper.link(value.Name, 'circle-arrow-s', {'choice' : "Select Conversation", 'convo' : value.Reference } , null, 'pdalink')}} {{if data.cartridge}} {{if data.cartridge.access.access_detonate_pda && value.Detonate}} {{:helper.link('*Detonate*', 'radiation', {'choice' : "Detonate", 'target' : value.Reference}, null, 'pdalink fixedLeft')}} @@ -324,7 +332,7 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm

Other PDAs

{{for data.pdas}}
- {{:helper.link(value.Name, 'circle-arrow-s', {'choice' : "Message", 'target' : value.Reference}, null, 'pdalink fixedLeftWider')}} + {{:helper.link(value.Name, 'circle-arrow-s', {'choice' : "Message", 'target' : value.Reference}, null, 'pdalink')}} {{if data.cartridge}} {{if data.cartridge.access.access_detonate_pda && value.Detonate}} {{:helper.link('*Detonate*', 'radiation', {'choice' : "Detonate", 'target' : value.Reference}, null, 'pdalink fixedLeft')}} {{/if}} {{if data.cartridge.access.access_clown}} {{:helper.link('*Send Virus*', 'star', {'choice' : "Send Honk", 'target' : value.Reference}, null, 'pdalink fixedLeft')}} {{/if}} From 206f7079df610fb00f9db2a98356bb78e3f69f40 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 26 Oct 2015 12:04:44 -0700 Subject: [PATCH 24/28] Clean up mob code a bit Does the following: - Cleans up how gravity works, a little bit - Pushes duplicated procs for slimes/xenos/humans up to carbon/Life() - carbon/Life() is now a thing, it handles the non-special stuff for all carbons - Mob controller no longer ticks a seperate entity, mob_master is now just a reference to the mob process, which ticks. --- code/controllers/Processes/mob.dm | 23 ++-- code/game/turfs/turf.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 9 +- .../mob/living/carbon/alien/humanoid/life.dm | 66 +---------- .../mob/living/carbon/alien/larva/life.dm | 56 +-------- code/modules/mob/living/carbon/alien/life.dm | 34 +++--- code/modules/mob/living/carbon/brain/life.dm | 44 +------ code/modules/mob/living/carbon/human/life.dm | 110 ++--------------- code/modules/mob/living/carbon/life.dm | 111 ++++++++++++++++++ .../modules/mob/living/carbon/metroid/life.dm | 50 +------- code/modules/mob/living/living.dm | 12 +- code/modules/mob/living/silicon/ai/life.dm | 8 +- .../mob/living/simple_animal/simple_animal.dm | 33 +++++- 13 files changed, 209 insertions(+), 349 deletions(-) diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index c1dd47236f1..8de5b1d6774 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -1,12 +1,16 @@ +var/global/datum/controller/process/mob/mob_master + /datum/controller/process/mob + var/current_cycle /datum/controller/process/mob/setup() name = "mob" schedule_interval = 20 // every 2 seconds start_delay = 16 - if(!mob_master) - mob_master = new - mob_master.Setup() + log_startup_progress("Mob ticker starting up.") + if(mob_master) + qdel(mob_master) //only one mob master + mob_master = src /datum/controller/process/mob/started() ..() @@ -29,17 +33,4 @@ else catchBadType(M) mob_list -= M - mob_master.process() - -var/global/datum/controller/mob_system/mob_master - -/datum/controller/mob_system - var/current_cycle - var/starttime - -/datum/controller/mob_system/proc/Setup() - log_startup_progress("Mob ticker starting up.") - starttime = world.timeofday - -/datum/controller/mob_system/proc/process() current_cycle++ \ No newline at end of file diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 85494318fa9..8cd2500b0e0 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -105,7 +105,7 @@ var/mob/O = M if(!O.lastarea) O.lastarea = get_area(O.loc) - O.update_gravity(O.mob_has_gravity(src)) +// O.update_gravity(O.mob_has_gravity(src)) var/loopsanity = 100 for(var/atom/A in range(1)) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 0ec7e3c8ded..88000afe32f 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -85,7 +85,7 @@ return health = maxHealth - getOxyLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() -/mob/living/carbon/alien/proc/handle_environment(var/datum/gas_mixture/environment) +/mob/living/carbon/alien/handle_environment(var/datum/gas_mixture/environment) //If there are alien weeds on the ground then heal if needed or give some toxins if(locate(/obj/structure/alien/weeds) in loc) @@ -136,7 +136,7 @@ fire_alert = max(fire_alert, 2) return -/mob/living/carbon/alien/proc/handle_mutations_and_radiation() +/mob/living/carbon/alien/handle_mutations_and_radiation() if(getFireLoss()) if((RESIST_HEAT in mutations) || prob(5)) adjustFireLoss(-1) @@ -171,11 +171,6 @@ bodytemperature += BODYTEMP_HEATING_MAX //If you're on fire, you heat up! return -/mob/living/carbon/alien/proc/handle_wetness() - if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so - wetlevel = max(wetlevel - 1,0) - return - /mob/living/carbon/alien/IsAdvancedToolUser() return has_fine_manipulation diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 2b6407398d2..6e4fe3705f4 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -9,70 +9,12 @@ /mob/living/carbon/alien/humanoid/Life() - set invisibility = 0 - set background = BACKGROUND_ENABLED - - ..() - - var/datum/gas_mixture/environment = loc.return_air() - - if (stat != DEAD) //still breathing - - //First, resolve location and get a breath - - if(mob_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - spawn(0) breathe() - - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Disabilities - handle_disabilities() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null - - //Handle temperature/pressure differences between body and environment - handle_environment(environment) - - //stuff in the stomach - handle_stomach() - - //Handle being on fire - handle_fire() - - //Decrease wetness over time - handle_wetness() - - //Status updates, death etc. - handle_regular_status_updates() - - handle_actions() - - update_canmove() + . = ..() update_icons() - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - - if(client) - handle_regular_hud_updates() -/mob/living/carbon/alien/humanoid/proc/handle_disabilities() +/mob/living/carbon/alien/humanoid/handle_disabilities() if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 10)) src << "You have a seizure!" @@ -110,7 +52,7 @@ temp_change = (temperature - current) return temp_change -/mob/living/carbon/alien/humanoid/proc/handle_regular_status_updates() +/mob/living/carbon/alien/humanoid/handle_regular_status_updates() updatehealth() if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP @@ -191,7 +133,7 @@ return 1 -/mob/living/carbon/alien/humanoid/proc/handle_regular_hud_updates() +/mob/living/carbon/alien/humanoid/handle_regular_hud_updates() if (stat == 2 || (XRAY in mutations)) sight |= SEE_TURFS diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index 01e36955196..d4e57324826 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -3,61 +3,16 @@ /mob/living/carbon/alien/larva var/temperature_alert = 0 - /mob/living/carbon/alien/larva/Life() - set invisibility = 0 - set background = BACKGROUND_ENABLED - - ..() - var/datum/gas_mixture/enviroment = loc.return_air() - if (stat != DEAD) //still breathing - + if(..()) //still breathing // GROW! if(amount_grown < max_grown) amount_grown++ - //First, resolve location and get a breath - if(mob_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - spawn(0) breathe() - else //Still give containing object the chance to interact - if(istype(loc, /obj/)) - var/obj/location_as_object = loc - location_as_object.handle_internal_lifeform(src, 0) - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null - - //Handle temperature/pressure differences between body and environment - handle_environment(enviroment) - - //stuff in the stomach - //handle_stomach() - - //Status updates, death etc. - handle_regular_status_updates() - update_canmove() - - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - //some kind of bug in canmove() isn't properly calling update_icons, so this is here as a placeholder update_icons() - if(client) - handle_regular_hud_updates() - -/mob/living/carbon/alien/larva/proc/handle_regular_status_updates() +/mob/living/carbon/alien/larva/handle_regular_status_updates() updatehealth() if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP @@ -133,7 +88,7 @@ return 1 -/mob/living/carbon/alien/larva/proc/handle_regular_hud_updates() +/mob/living/carbon/alien/larva/handle_regular_hud_updates() if (stat == 2 || (XRAY in mutations)) sight |= SEE_TURFS @@ -210,7 +165,4 @@ if(!client.adminobs) reset_view(null) - return 1 - -/mob/living/carbon/alien/larva/proc/handle_random_events() - return + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 58f43b525b3..ffd8c3bca5e 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -1,4 +1,17 @@ -/mob/living/carbon/alien/proc/handle_chemicals_in_body() +/mob/living/carbon/alien/Life() + if(..()) + //First, resolve location and get a breath + if(mob_master.current_cycle%4==2) + //Only try to take a breath every 4 seconds, unless suffocating + spawn(0) breathe() + + else //Still give containing object the chance to interact + if(istype(loc, /obj/)) + var/obj/location_as_object = loc + location_as_object.handle_internal_lifeform(src, 0) + return 1 + +/mob/living/carbon/alien/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) @@ -102,21 +115,4 @@ //Temporary fixes to the alerts. - return 1 - -/mob/living/carbon/alien/proc/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) - stomach_contents.Remove(M) - continue - if(istype(M, /mob/living/carbon) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(mob_master.current_cycle%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 606959d5de8..0cfa62d008f 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -1,39 +1,5 @@ -/mob/living/carbon/brain/Life() - set invisibility = 0 - //set background = 1 - ..() - - if(stat != DEAD) - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - var/datum/gas_mixture/environment // Added to prevent null location errors-- TLE - if(loc) - environment = loc.return_air() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null - - //Handle temperature/pressure differences between body and environment - if(environment) // More error checking -- TLE - handle_environment(environment) - - //Status updates, death etc. - handle_regular_status_updates() - update_canmove() - - if(client) - handle_regular_hud_updates() - - /mob/living/carbon/brain/ - proc/handle_mutations_and_radiation() + handle_mutations_and_radiation() if (radiation) if (radiation > 100) @@ -68,7 +34,7 @@ adjustToxLoss(3) updatehealth() - proc/handle_environment(datum/gas_mixture/environment) + handle_environment(datum/gas_mixture/environment) if(!environment) return var/environment_heat_capacity = environment.heat_capacity() @@ -104,7 +70,7 @@ - proc/handle_chemicals_in_body() + handle_chemicals_in_body() if(reagents) reagents.metabolize(src) @@ -120,7 +86,7 @@ return //TODO: DEFERRED - proc/handle_regular_status_updates() //TODO: comment out the unused bits >_> + handle_regular_status_updates() //TODO: comment out the unused bits >_> updatehealth() if(stat == DEAD) //DEAD. BROWN BREAD. SWIMMING WITH THE SPESS CARP @@ -191,7 +157,7 @@ return 1 - proc/handle_regular_hud_updates() + handle_regular_hud_updates() if (stat == 2 || (XRAY in src.mutations)) sight |= SEE_TURFS diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index d2117d84cfa..6e68b30c7f0 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -43,26 +43,9 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc var/tinttotal = 0 // Total level of visually impairing items /mob/living/carbon/human/Life() - set invisibility = 0 - //set background = 1 - - if (notransform) return - if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE - - ..() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - blinded = null fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it. tinttotal = tintcheck() //here as both hud updates and status updates call it - - //TODO: seperate this out - // update the current life tick, can be used to e.g. only do something every 4 ticks life_tick++ - var/datum/gas_mixture/environment = loc.return_air() in_stasis = 0 if(istype(loc, /obj/structure/closet/body_bag/cryobag)) @@ -71,13 +54,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc loc_as_cryobag.used++ in_stasis = 1 - if(life_tick % 30 == 15) + if(mob_master.current_cycle % 30 == 15) hud_updateflag = 1022 voice = GetVoice() - //No need to update all of these procs if the guy is dead. - if(stat != DEAD && !in_stasis) + if(..() && !in_stasis) if(mob_master.current_cycle % 4 == 2 || failed_last_breath) //First, resolve location and get a breath breathe() //Only try to take a breath every 4 ticks, unless suffocating @@ -87,43 +69,15 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc location_as_object.handle_internal_lifeform(src, 0) if(check_mutations) -// testing("Updating [src.real_name]'s mutations: "+english_list(mutations)) domutcheck(src,null) update_mutations() check_mutations=0 - //Updates the number of stored chemicals for powers - handle_changeling() - - //Mutations and radiation - handle_mutations_and_radiation() - - //Chemicals in the body - handle_chemicals_in_body() - - //Disabilities - handle_disabilities() - - //Random events (vomiting etc) - handle_random_events() - handle_virus_updates() - //Check if we're on fire - handle_fire() - - //Decrease wetness over time - handle_wetness() - - //stuff in the stomach - handle_stomach() - handle_shock() - handle_pain() - handle_heartbeat() - handle_heartattack() if(!client) @@ -137,28 +91,12 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle return //We go ahead and process them 5 times for HUD images and other stuff though. - - //Handle temperature/pressure differences between body and environment - handle_environment(environment) //Optimized a good bit. - - //Status updates, death etc. - handle_regular_status_updates() //Optimized a bit - handle_actions() - update_canmove() - //Update our name based on whether our face is obscured/disfigured name = get_visible_name() - - handle_regular_hud_updates() - pulse = handle_pulse() - // Grabbing - for(var/obj/item/weapon/grab/G in src) - G.process() - if(mind && mind.vampire) handle_vampire() if(life_tick == 1) @@ -180,7 +118,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return ONE_ATMOSPHERE - pressure_difference -/mob/living/carbon/human/proc/handle_disabilities() +/mob/living/carbon/human/handle_disabilities() if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) visible_message("[src] starts having a seizure!","You have a seizure!") @@ -245,7 +183,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc // as cloneloss adjustCloneLoss(0.1) -/mob/living/carbon/human/proc/handle_mutations_and_radiation() +/mob/living/carbon/human/handle_mutations_and_radiation() if(getFireLoss()) if((RESIST_HEAT in mutations) || (prob(1))) heal_organ_damage(0,1) @@ -450,7 +388,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return species.handle_breath(breath, src) -/mob/living/carbon/human/proc/handle_environment(datum/gas_mixture/environment) +/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment) if(!environment) return @@ -559,11 +497,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return //END FIRE CODE -/mob/living/carbon/human/proc/handle_wetness() - if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so - wetlevel = max(wetlevel - 1,0) - return - /* /mob/living/carbon/human/proc/adjust_body_temperature(current, loc_temp, boost) var/temperature = current @@ -736,7 +669,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return covered -/mob/living/carbon/human/proc/handle_chemicals_in_body() +/mob/living/carbon/human/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) @@ -850,7 +783,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return //TODO: DEFERRED -/mob/living/carbon/human/proc/handle_regular_status_updates() +/mob/living/carbon/human/handle_regular_status_updates() if(status_flags & GODMODE) return 0 @@ -958,7 +891,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(halloss > 0) adjustHalLoss(-1) - if(embedded_flag && !(life_tick % 10)) + if(embedded_flag && !(mob_master.current_cycle % 10)) var/list/E E = get_visible_implants(0) if(!E.len) @@ -1062,7 +995,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return 1 -/mob/living/carbon/human/proc/handle_regular_hud_updates() +/mob/living/carbon/human/handle_regular_hud_updates() if(hud_updateflag) handle_hud_list() @@ -1388,7 +1321,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc reset_view(null) return 1 -/mob/living/carbon/human/proc/handle_random_events() +/mob/living/carbon/human/handle_random_events() // Puke if toxloss is too high if(!stat) if (getToxLoss() >= 45 && nutrition > 20) @@ -1433,7 +1366,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc for (var/ID in virus2) var/datum/disease2/disease/V = virus2[ID] V.cure(src) - if(life_tick % 3) //don't spam checks over all objects in view every tick. + if(mob_master.current_cycle % 3) //don't spam checks over all objects in view every tick. for(var/obj/effect/decal/cleanable/O in view(1,src)) if(istype(O,/obj/effect/decal/cleanable/blood)) var/obj/effect/decal/cleanable/blood/B = O @@ -1464,24 +1397,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc V.dead = 1 return -/mob/living/carbon/human/proc/handle_stomach() - spawn(0) - for(var/mob/living/M in stomach_contents) - if(M.loc != src) - stomach_contents.Remove(M) - continue - if(isliving(M) && stat != 2) - if(M.stat == 2) - M.death(1) - stomach_contents.Remove(M) - qdel(M) - continue - if(mob_master.current_cycle%3==1) - if(!(M.status_flags & GODMODE)) - M.adjustBruteLoss(5) - nutrition += 10 - -/mob/living/carbon/human/proc/handle_changeling() +/mob/living/carbon/human/handle_changeling() if(mind && mind.changeling) mind.changeling.regenerate() @@ -1537,7 +1453,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc /mob/living/carbon/human/proc/handle_pulse() - if(life_tick % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) + if(mob_master.current_cycle % 5) return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load) if(species && species.flags & NO_BLOOD) return PULSE_NONE //No blood, no pulse. diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 248a3154388..b65aa6623d2 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -12,3 +12,114 @@ if (internals) internals.icon_state = "internal0" return + +/mob/living/carbon/Life() + set invisibility = 0 + set background = BACKGROUND_ENABLED + + if(notransform) + return + if(!loc) + return + var/datum/gas_mixture/environment = loc.return_air() + + //Handle temperature/pressure differences between body and environment + handle_environment(environment) + + //Apparently, the person who wrote this code designed it so that + //blinded get reset each cycle and then get activated later in the + //code. Very ugly. I dont care. Moving this stuff here so its easy + //to find it. + blinded = null + + handle_regular_status_updates() // Status updates, death etc. + + if(stat != DEAD) + + //Updates the number of stored chemicals for powers + handle_changeling() + + //Mutations and radiation + handle_mutations_and_radiation() + + //Chemicals in the body + handle_chemicals_in_body() + + //Disabilities + handle_disabilities() + + //Random events (vomiting etc) + handle_random_events() + + . = 1 + + handle_fire() + + //Decrease wetness over time + handle_wetness() + + //stuff in the stomach + handle_stomach() + + update_canmove() + + update_gravity(mob_has_gravity()) + + for(var/obj/item/weapon/grab/G in src) + G.process() + + handle_actions() + + if(client) + handle_regular_hud_updates() + + return . + + + +//remember to remove the "proc" of the child procs of these. + +/mob/living/carbon/proc/handle_changeling() + return + +/mob/living/carbon/proc/handle_mutations_and_radiation() + return + +/mob/living/carbon/proc/handle_chemicals_in_body() + return + +/mob/living/carbon/proc/handle_disabilities() + return + +/mob/living/carbon/proc/handle_random_events() + return + +/mob/living/carbon/proc/handle_environment(var/datum/gas_mixture/environment) + return + +/mob/living/carbon/proc/handle_regular_status_updates() + return + +/mob/living/carbon/proc/handle_wetness() + if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so + wetlevel = max(wetlevel - 1,0) + +/mob/living/carbon/proc/handle_stomach() + spawn(0) + for(var/mob/living/M in stomach_contents) + if(M.loc != src) + stomach_contents.Remove(M) + continue + if(istype(M, /mob/living/carbon) && stat != 2) + if(M.stat == 2) + M.death(1) + stomach_contents.Remove(M) + qdel(M) + continue + if(mob_master.current_cycle%3==1) + if(!(M.status_flags & GODMODE)) + M.adjustBruteLoss(5) + nutrition += 10 + +/mob/living/carbon/proc/handle_regular_hud_updates() + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 05e078553a8..b70075a084b 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -6,46 +6,12 @@ var/SStun = 0 // stun variable /mob/living/carbon/slime/Life() - set invisibility = 0 - //set background = 1 - - if (src.notransform) - return - - ..() - - if(stat != DEAD) - //Chemicals in the body - handle_chemicals_in_body() - + if(..()) handle_nutrition() - handle_targets() - if (!ckey) handle_speech_and_mood() - var/datum/gas_mixture/environment - if(src.loc) - environment = loc.return_air() - - //Apparently, the person who wrote this code designed it so that - //blinded get reset each cycle and then get activated later in the - //code. Very ugly. I dont care. Moving this stuff here so its easy - //to find it. - src.blinded = null - - regular_hud_updates() // Basically just deletes any screen objects :< - - if(environment) - handle_environment(environment) // Handle temperature/pressure differences between body and environment - - handle_regular_status_updates() // Status updates, death etc. - - handle_actions() - - handle_wetness() - /mob/living/carbon/slime/proc/AIprocess() // the master AI process if(AIproc || stat == DEAD || client) return @@ -126,7 +92,7 @@ AIproc = 0 -/mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment) +/mob/living/carbon/slime/handle_environment(datum/gas_mixture/environment) if(!environment) adjustToxLoss(rand(10,20)) return @@ -141,7 +107,7 @@ loc_temp = loc:air_contents.temperature else loc_temp = environment.temperature - + //Account for massive pressure differences if(bodytemperature < (T0C + 5)) // start calculating temperature damage etc if(bodytemperature <= (T0C - 40)) // stun temperature @@ -154,7 +120,7 @@ adjustToxLoss(round(sqrt(bodytemperature)) * 2) else Tempstun = 0 - + /*moved after the temperature damage code so freeze beams can instantly kill slimes -Deity Link*/ if(loc_temp < 310.15) // a cold place @@ -183,7 +149,7 @@ temp_change = (temperature - current) return temp_change -/mob/living/carbon/slime/proc/handle_chemicals_in_body() +/mob/living/carbon/slime/handle_chemicals_in_body() if(reagents) reagents.metabolize(src) if (reagents.get_reagent_amount("plasma")>=5) @@ -196,7 +162,7 @@ return //TODO: DEFERRED -/mob/living/carbon/slime/proc/handle_regular_status_updates() +/mob/living/carbon/slime/handle_regular_status_updates() if(is_adult) health = 200 - (getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()) @@ -289,10 +255,6 @@ else Evolve() -/mob/living/carbon/slime/proc/handle_wetness() - if(mob_master.current_cycle%20==2) //dry off a bit once every 20 ticks or so - wetlevel = max(wetlevel - 1,0) - return /mob/living/carbon/slime/proc/handle_targets() if(Tempstun) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3d7f30d87ff..9806145854b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -890,11 +890,15 @@ /mob/living/proc/float(on) if(throwing) return - if(on && !floating) - animate(src, pixel_y = 2, time = 10, loop = -1) + var/fixed = 0 + if(anchored || (buckled && buckled.anchored)) + fixed = 1 + if(on && !floating && !fixed) + animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1) floating = 1 - else if(!on && floating) - animate(src, pixel_y = initial(pixel_y), time = 10) + else if(((!on || fixed) && floating)) + var/final_pixel_y = get_standard_pixel_y_offset(lying) + animate(src, pixel_y = final_pixel_y, time = 10) floating = 0 /mob/living/proc/can_use_vents() diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 40facde6f9c..06698318f44 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -12,6 +12,8 @@ src.updatehealth() + update_gravity(mob_has_gravity()) + if (src.malfhack) if (src.malfhack.aidisabled) src << "\red ERROR: APC access disabled, hack attempt canceled." @@ -174,7 +176,7 @@ sleep(50) theAPC = null - process_queued_alarms() + process_queued_alarms() regular_hud_updates() switch(src.sensor_mode) if (SEC_HUD) @@ -191,12 +193,12 @@ health = 100 - getOxyLoss() - getToxLoss() - getBruteLoss() else health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - + /mob/living/silicon/ai/proc/lacks_power() var/turf/T = get_turf(src) var/area/A = get_area(src) return ((!A.power_equip) && A.requires_power == 1 || istype(T, /turf/space)) && !istype(src.loc,/obj/item) - + /mob/living/silicon/ai/rejuvenate() ..() add_ai_verbs(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index c8c9c8c37c0..ae8f7da7d4c 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -88,10 +88,9 @@ return /mob/living/simple_animal/Life() - if(paralysis || stunned || weakened || buckled || resting) - canmove = 0 - else - canmove = 1 + + update_gravity(mob_has_gravity()) + update_canmove() //Health if(stat == DEAD) @@ -554,4 +553,28 @@ if(speak_emote.len) verb = pick(speak_emote) - return verb \ No newline at end of file + return verb + +/mob/living/simple_animal/update_canmove() + if(paralysis || stunned || weakened || stat || resting) + drop_r_hand() + drop_l_hand() + canmove = 0 + else if(buckled) + canmove = 0 + else + canmove = 1 + update_transform() + return canmove + +/mob/living/simple_animal/update_transform() + var/matrix/ntransform = matrix(transform) //aka transform.Copy() + var/changed = 0 + + if(resize != RESIZE_DEFAULT_SIZE) + changed++ + ntransform.Scale(resize) + resize = RESIZE_DEFAULT_SIZE + + if(changed) + animate(src, transform = ntransform, time = 2, easing = EASE_IN|EASE_OUT) \ No newline at end of file From 0061844a778d6dcdab48468c985eec9e95600c97 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 26 Oct 2015 12:08:49 -0700 Subject: [PATCH 25/28] No humans, you do not need to update action buttons twice --- code/modules/mob/living/carbon/human/life.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6e68b30c7f0..64df304df4f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -91,8 +91,6 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle return //We go ahead and process them 5 times for HUD images and other stuff though. - handle_actions() - //Update our name based on whether our face is obscured/disfigured name = get_visible_name() pulse = handle_pulse() From 88bb132f225be4f39d1df7828fe569d8fcbcf580 Mon Sep 17 00:00:00 2001 From: MrStonedOne Date: Tue, 27 Oct 2015 08:53:38 -0700 Subject: [PATCH 26/28] Adds the ability to access game preferences while not in lobby Also removed a few preferences_toggles verbs that are no longer needed. Haven't tested this too much yet, but from what I can tell, no ill effects of doing this have been observed. --- code/modules/client/preferences.dm | 1 - code/modules/client/preferences_toggles.dm | 66 +++------------------- 2 files changed, 7 insertions(+), 60 deletions(-) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 210b1ddea65..23add6c8b59 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -905,7 +905,6 @@ datum/preferences proc/process_link(mob/user, list/href_list) if(!user) return - if(!istype(user, /mob/new_player)) return if(href_list["preference"] == "job") switch(href_list["task"]) if("close") diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 0eae2206ba0..ec3aa30a778 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -178,7 +178,7 @@ src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) feedback_add_details("admin_verb","Thb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + // This needs a toggle because you people are awful and spammed terrible music /client/verb/toggle_instruments() set name = "Hear/Silence Instruments" @@ -192,56 +192,6 @@ src << "You will no longer hear musical instruments." feedback_add_details("admin_verb","TInstru") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -//be special -/client/verb/toggle_be_special(role in be_special_flags) - set name = "Toggle Special Role Candidacy" - set category = "Preferences" - set desc = "Toggles which special roles you would like to be a candidate for, during events." - var/role_flag = be_special_flags[role] - if(!role_flag) return - if(!player_old_enough_antag(src,be_special_flags[role])) - var/available_in_days_antag = available_in_days_antag(src,be_special_flags[role]) - src << "This role is not yet available to you. You need to wait another [available_in_days_antag] days." - return - prefs.be_special ^= role_flag - prefs.save_preferences(src) - src << "You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible)." - feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/change_ui() - set name = "Change UI" - set category = "Preferences" - set desc = "Configure your user interface" - - if(!ishuman(usr)) - usr << "This only for human" - return - - var/UI_style_new = input(usr, "Select a style, we recommend White for customization") in list("White", "Midnight", "Orange", "old") - if(!UI_style_new) return - - var/UI_style_alpha_new = input(usr, "Select a new alpha (transparency) parameter for UI, between 50 and 255") as num - if(!UI_style_alpha_new | !(UI_style_alpha_new <= 255 && UI_style_alpha_new >= 50)) return - - var/UI_style_color_new = input(usr, "Choose your UI color. Dark colors are not recommended!") as color|null - if(!UI_style_color_new) return - - //update UI - var/list/icons = usr.hud_used.adding + usr.hud_used.other +usr.hud_used.hotkeybuttons - icons.Add(usr.zone_sel) - - for(var/obj/screen/I in icons) - I.icon = ui_style2icon(UI_style_new) - I.color = UI_style_color_new - I.alpha = UI_style_alpha_new - - if(alert("Like it? Save changes?",,"Yes", "No") == "Yes") - prefs.UI_style = UI_style_new - prefs.UI_style_alpha = UI_style_alpha_new - prefs.UI_style_color = UI_style_color_new - prefs.save_preferences(src) - usr << "UI was saved" - /client/verb/toggle_media() set name = "Hear/Silence Streaming" set category = "Preferences" @@ -255,12 +205,10 @@ media.update_music() else media.stop_music() - -/client/verb/toggle_member_publicity() - set name = "Toggle Membership Publicity" + +/client/verb/setup_character() + set name = "Game Preferences" set category = "Preferences" - set desc = "Toggles whether other players can see that you are a BYOND member (OOC blag icon/colours)." - - prefs.toggles ^= MEMBER_PUBLIC - prefs.save_preferences(src) - src << "Others can[(prefs.toggles & MEMBER_PUBLIC) ? "" : " not"] see whether you are a BYOND member." + set desc = "Allows you to access the Setup Character screen. Changes to your character won't take effect until next round, but other changes will." + prefs.current_tab = 1 + prefs.ShowChoices(usr) \ No newline at end of file From 983fdc3f8cb8f8dd4a1c212c81d81ee391d9158c Mon Sep 17 00:00:00 2001 From: orelbis fernandez Date: Wed, 28 Oct 2015 18:43:05 -0400 Subject: [PATCH 27/28] Security HUD Tried to make it look more like a gun, this one looks more like s faucet. --- icons/mob/hud.dmi | Bin 5378 -> 5378 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index cc0fcbf3e09ed8c610bb90a23d8d6aae4d666937..2e297c0eda64df5ce2b5c7f5132795797c7c528b 100644 GIT binary patch delta 1876 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 N002ovPDHLkV1oT?j{N`t From a6e381bd9bd4efdaae4a57c64ea9eee233815c05 Mon Sep 17 00:00:00 2001 From: orelbis fernandez Date: Wed, 28 Oct 2015 20:16:02 -0400 Subject: [PATCH 28/28] Forgot to Edit HoS --- icons/mob/hud.dmi | Bin 5378 -> 5375 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 2e297c0eda64df5ce2b5c7f5132795797c7c528b..fc720126d475650a8b86fa958b4836c2856c8589 100644 GIT binary patch delta 3839 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