From 044766ef11f3fb6331777cb329010626a1780e5b Mon Sep 17 00:00:00 2001 From: DJSnapshot Date: Mon, 10 Mar 2014 15:52:01 -0700 Subject: [PATCH 01/17] quick fix for APCs related to IPC charging. --- code/modules/power/apc.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index a98eb6a1971..da6f562706d 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -212,7 +212,7 @@ // update the APC icon to show the three base states // also add overlays for indicator lights /obj/machinery/power/apc/update_icon() - + if (!status_overlays) status_overlays = 1 status_overlays_lock = new @@ -230,9 +230,9 @@ status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red status_overlays_lock[2] = image(icon, "apcox-1") - status_overlays_charging[1] = image(icon, "apco3-0") + status_overlays_charging[1] = image(icon, "apco3-0") status_overlays_charging[2] = image(icon, "apco3-1") - status_overlays_charging[3] = image(icon, "apco3-2") + status_overlays_charging[3] = image(icon, "apco3-2") status_overlays_equipment[1] = image(icon, "apco0-0") // 0=red, 1=green, 2=blue status_overlays_equipment[2] = image(icon, "apco0-1") @@ -243,13 +243,13 @@ status_overlays_lighting[2] = image(icon, "apco1-1") status_overlays_lighting[3] = image(icon, "apco1-2") status_overlays_lighting[4] = image(icon, "apco1-3") - + status_overlays_environ[1] = image(icon, "apco2-0") status_overlays_environ[2] = image(icon, "apco2-1") status_overlays_environ[3] = image(icon, "apco2-2") status_overlays_environ[4] = image(icon, "apco2-3") - + var/update = check_updates() //returns 0 if no need to update icons. // 1 if we need to update the icon_state @@ -275,7 +275,7 @@ icon_state = "apcemag" else if(update_state & UPSTATE_WIREEXP) icon_state = "apcewires" - + if(!(update_state & UPSTATE_ALLGOOD)) @@ -286,7 +286,7 @@ if(update & 2) - + if(overlays.len) overlays = 0 @@ -301,7 +301,7 @@ /obj/machinery/power/apc/proc/check_updates() - var/last_update_state = update_state + var/last_update_state = update_state var/last_update_overlay = update_overlay update_state = 0 update_overlay = 0 @@ -344,7 +344,7 @@ update_overlay |= APC_UPOVERLAY_EQUIPMENT1 else if(equipment == 2) update_overlay |= APC_UPOVERLAY_EQUIPMENT2 - + if(!lighting) update_overlay |= APC_UPOVERLAY_LIGHTING0 else if(lighting == 1) @@ -644,6 +644,7 @@ user << "\blue You slot your fingers into the APC interface and siphon off some of the stored charge for your own use." if(src.cell.charge < 0) src.cell.charge = 0 if(H.nutrition > 500) H.nutrition = 500 + src.charging = 1 else user << "\blue You are already fully charged." From b03493fbaeb7e18842059ad7b84c61406864c61e Mon Sep 17 00:00:00 2001 From: ZomgPonies Date: Sat, 1 Mar 2014 00:41:18 -0500 Subject: [PATCH 02/17] Efficiency: Joblist Conflicts: code/__HELPERS/global_lists.dm --- code/__HELPERS/global_lists.dm | 6 ++++++ code/__HELPERS/names.dm | 6 +++--- code/datums/mind.dm | 2 +- code/game/gamemodes/intercept_report.dm | 4 ++-- code/game/jobs/access.dm | 6 +++--- code/game/machinery/computer/card.dm | 2 +- code/game/machinery/computer/security.dm | 4 ++-- code/game/machinery/computer/skills.dm | 4 ++-- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 22e6376836e..531dbeb0dba 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -17,6 +17,7 @@ var/global/list/landmarks_list = list() //list of all landmarks created var/global/list/surgery_steps = list() //list of all surgery steps |BS12 var/global/list/side_effects = list() //list of all medical sideeffects types by thier names |BS12 var/global/list/mechas_list = list() //list of all mechs. Used by hostile mobs target tracking. +var/global/list/joblist = list() //list of all jobstypes, minus borg and AI //Languages/species/whitelist. var/global/list/all_species[0] @@ -85,6 +86,11 @@ var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Al var/datum/medical_effect/M = new T side_effects[M.name] = T + //List of job. I can't believe this was calculated multiple times per tick! + paths = typesof(/datum/job) -list(/datum/job,/datum/job/ai,/datum/job/cyborg) + for(var/T in paths) + var/datum/job/J = new T + joblist[J.title] = J //Languages and species. paths = typesof(/datum/language)-/datum/language diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 7dd535a2fe9..ca682b42611 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -200,7 +200,7 @@ var/syndicate_code_response//Code response for traitors. code_phrase += " " code_phrase += pick(last_names) if(2) - code_phrase += pick(get_all_jobs())//Returns a job. + code_phrase += pick(joblist)//Returns a job. safety -= 1 if(2) switch(rand(1,2))//Places or things. @@ -270,7 +270,7 @@ var/syndicate_code_response//Code response for traitors. if(5) syndicate_code_phrase += pick("Do we have","Is there","Where is","Where's","Who's") syndicate_code_phrase += " " - syndicate_code_phrase += "[pick(get_all_jobs())]" + syndicate_code_phrase += "[pick(joblist)]" syndicate_code_phrase += "?" switch(choice) @@ -299,7 +299,7 @@ var/syndicate_code_response//Code response for traitors. syndicate_code_response += pick(last_names) else syndicate_code_response += " the " - syndicate_code_response += "[pic(get_all_jobs())]" + syndicate_code_response += "[pic(joblist)]" syndicate_code_response += "." else syndicate_code_response += pick("*shrug*","*smile*","*blink*","*sigh*","*laugh*","*nod*","*giggle*") diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 8d2a926c8ea..6a8bddf55cd 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -357,7 +357,7 @@ datum/mind if(!check_rights(R_ADMIN)) return if (href_list["role_edit"]) - var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in get_all_jobs() + var/new_role = input("Select new role", "Assigned role", assigned_role) as null|anything in joblist if (!new_role) return assigned_role = new_role diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 54c1ac6b079..2ee0fe7d919 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -213,11 +213,11 @@ if(prob(prob_right_job)) if(correct_person) if(correct_person:assigned_role=="MODE") - changeling_job = pick(get_all_jobs()) + changeling_job = pick(joblist) else changeling_job = correct_person:assigned_role else - changeling_job = pick(get_all_jobs()) + changeling_job = pick(joblist) if(prob(prob_right_dude) && ticker.mode == "changeling") if(correct_person:assigned_role=="MODE") changeling_name = correct_person:current diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 3edf971d622..a6a5c38d304 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -433,10 +433,10 @@ rank = src:rank assignment = src:assignment - if( rank in get_all_jobs() ) + if( rank in joblist ) return rank - if( assignment in get_all_jobs() ) + if( assignment in joblist ) return assignment return "Unknown" @@ -489,7 +489,7 @@ proc/FindNameFromID(var/mob/living/carbon/human/H) return ID.registered_name proc/get_all_job_icons() //For all existing HUD icons - return get_all_jobs() + list("Prisoner") + return joblist + list("Prisoner") /obj/proc/GetJobName() //Used in secHUD icon generation if (!istype(src, /obj/item/device/pda) && !istype(src,/obj/item/weapon/card/id)) diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 911ccace956..1d724b83cd9 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -108,7 +108,7 @@ header += "
" var/jobs_all = "" - var/list/alljobs = (istype(src,/obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : get_all_jobs()) + "Custom" + var/list/alljobs = (istype(src,/obj/machinery/computer/card/centcom)? get_all_centcom_jobs() : joblist) + "Custom" for(var/job in alljobs) jobs_all += "[replacetext(job, " ", " ")] " //make sure there isn't a line break in the middle of a job diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 479633ff100..a772ff88f16 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -501,7 +501,7 @@ What a mess.*/ if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
Rank:
" temp += "" else @@ -520,7 +520,7 @@ What a mess.*/ if ("Change Rank") if (active1) active1.fields["rank"] = href_list["rank"] - if(href_list["rank"] in get_all_jobs()) + if(href_list["rank"] in joblist) active1.fields["real_rank"] = href_list["real_rank"] if ("Change Criminal Status") diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 0327bb04df7..3068d993011 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -359,7 +359,7 @@ What a mess.*/ if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
Rank:
" temp += "" else @@ -380,7 +380,7 @@ What a mess.*/ if(PDA_Manifest.len) PDA_Manifest.Cut() active1.fields["rank"] = href_list["rank"] - if(href_list["rank"] in get_all_jobs()) + if(href_list["rank"] in joblist) active1.fields["real_rank"] = href_list["real_rank"] if ("Delete Record (ALL) Execute") From ebc188c600b49f568fe8cfdb8a0bd0d7a4b784c9 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 9 Mar 2014 10:25:36 -0500 Subject: [PATCH 03/17] Code effeciency project: HUD items rewrite Before: Every tick each HUD item would recalculate and redo images for every mob in view. For items like the secHUD where we're transversing implants and the various records this gets very expensive. After: Mobs use their hud_list variable to store varius huditem images, when conditions change for those specific huditem images it updates the specific ones on demand. As a backup every 30 ticks or so the mob will update all of their hud_list. Also: moved proc/RoundHealth() from 2 seperate locations into __HELPERS/mobs.dm Conflicts: code/modules/mob/living/living.dm --- code/__HELPERS/mobs.dm | 24 ++- code/datums/mind.dm | 16 +- .../game/gamemodes/autotraitor/autotraitor.dm | 1 + code/game/gamemodes/revolution/revolution.dm | 1 + .../gamemodes/revolution/rp-revolution.dm | 2 +- .../gamemodes/revolution/rp_revolution.dm | 1 + code/game/jobs/job_controller.dm | 4 + code/game/machinery/computer/security.dm | 2 + .../items/weapons/implants/implanter.dm | 3 + code/modules/clothing/glasses/hud.dm | 133 ++-------------- code/modules/mob/dead/observer/observer.dm | 108 +++---------- code/modules/mob/living/carbon/human/human.dm | 15 +- .../mob/living/carbon/human/human_damage.dm | 10 ++ code/modules/mob/living/carbon/human/life.dm | 149 ++++++++++++++++++ .../mob/living/carbon/human/update_icons.dm | 4 + code/modules/mob/living/living.dm | 12 +- code/modules/mob/living/living_defines.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 11 ++ .../modules/mob/living/silicon/robot/robot.dm | 12 ++ code/modules/mob/living/silicon/silicon.dm | 4 +- code/modules/surgery/implant.dm | 2 + code/modules/virus2/disease2.dm | 2 + code/modules/virus2/helpers.dm | 5 +- code/setup.dm | 12 +- icons/mob/hud.dmi | Bin 2951 -> 2955 bytes 25 files changed, 314 insertions(+), 223 deletions(-) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 324cfad6323..521f07c35e5 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -74,4 +74,26 @@ proc/age2agedescription(age) if(45 to 60) return "middle-aged" if(60 to 70) return "aging" if(70 to INFINITY) return "elderly" - else return "unknown" \ No newline at end of file + else return "unknown" + +proc/RoundHealth(health) + switch(health) + if(100 to INFINITY) + return "health100" + if(70 to 100) + return "health80" + if(50 to 70) + return "health60" + if(30 to 50) + return "health40" + if(18 to 30) + return "health25" + if(5 to 18) + return "health10" + if(1 to 5) + return "health1" + if(-99 to 0) + return "health0" + else + return "health-100" + return "0" diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 6a8bddf55cd..ce47a37a761 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -499,6 +499,9 @@ datum/mind else if(href_list["implant"]) var/mob/living/carbon/human/H = current + + H.hud_updateflag |= (1 << IMPLOYAL_HUD) // updates that players HUD images so secHUD's pick up they are implanted or not. + switch(href_list["implant"]) if("remove") for(var/obj/item/weapon/implant/loyalty/I in H.contents) @@ -540,6 +543,8 @@ datum/mind log_admin("[key_name_admin(usr)] has de-traitor'ed [current].") else if (href_list["revolution"]) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) + switch(href_list["revolution"]) if("clear") if(src in ticker.mode.revolutionaries) @@ -633,6 +638,7 @@ datum/mind usr << "\red Reequipping revolutionary goes wrong!" else if (href_list["cult"]) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["cult"]) if("clear") if(src in ticker.mode.cult) @@ -682,6 +688,8 @@ datum/mind usr << "\red Spawning amulet failed!" else if (href_list["wizard"]) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) + switch(href_list["wizard"]) if("clear") if(src in ticker.mode.wizards) @@ -710,6 +718,7 @@ datum/mind usr << "\blue The objectives for wizard [key] have been generated. You can edit them and anounce manually." else if (href_list["changeling"]) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["changeling"]) if("clear") if(src in ticker.mode.changelings) @@ -744,6 +753,10 @@ datum/mind domutcheck(current, null) else if (href_list["nuclear"]) + var/mob/living/carbon/human/H = current + + current.hud_updateflag |= (1 << SPECIALROLE_HUD) + switch(href_list["nuclear"]) if("clear") if(src in ticker.mode.syndicates) @@ -773,7 +786,6 @@ datum/mind if("lair") current.loc = get_turf(locate("landmark*Syndicate-Spawn")) if("dressup") - var/mob/living/carbon/human/H = current del(H.belt) del(H.back) del(H.l_ear) @@ -800,6 +812,7 @@ datum/mind usr << "\red No valid nuke found!" else if (href_list["traitor"]) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["traitor"]) if("clear") if(src in ticker.mode.traitors) @@ -882,6 +895,7 @@ datum/mind current.radiation -= 50 else if (href_list["silicon"]) + current.hud_updateflag |= (1 << SPECIALROLE_HUD) switch(href_list["silicon"]) if("unmalf") if(src in ticker.mode.malf_ai) diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index 06b5274a925..43dea8c32fc 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -135,6 +135,7 @@ newtraitor << "\red ATTENTION: \black It is time to pay your debt to the Syndicate..." newtraitor << "You are now a traitor." newtraitor.mind.special_role = "traitor" + newtraitor.hud_updateflag |= 1 << SPECIALROLE_HUD var/obj_count = 1 newtraitor << "\blue Your current objectives:" if(!config.objectives_disabled) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 3211c496429..f6199dcb167 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -208,6 +208,7 @@ if(rev_mind in revolutionaries) revolutionaries -= rev_mind rev_mind.special_role = null + rev_mind.current.hud_updateflag |= 1 << SPECIALROLE_HUD if(beingborged) rev_mind.current << "\red The frame's firmware detects and deletes your neural reprogramming! You remember nothing from the moment you were flashed until now." diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm index 7456e73403b..963579af7c8 100644 --- a/code/game/gamemodes/revolution/rp-revolution.dm +++ b/code/game/gamemodes/revolution/rp-revolution.dm @@ -304,4 +304,4 @@ mob/living/carbon/human/proc else if(choice == "No!") M << "\red You reject this traitorous cause!" src << "\red [M] does not support the revolution!" - M.mind.rev_cooldown = world.time+50 \ No newline at end of file + M.mind.rev_cooldown = world.time+50 diff --git a/code/game/gamemodes/revolution/rp_revolution.dm b/code/game/gamemodes/revolution/rp_revolution.dm index f4504835b3e..70fd1387f04 100644 --- a/code/game/gamemodes/revolution/rp_revolution.dm +++ b/code/game/gamemodes/revolution/rp_revolution.dm @@ -116,6 +116,7 @@ if(config.objectives_disabled) rev_mind.current << "Within the rules, try to act as an opposing force to the crew. Further RP and try to make sure other players have fun! If you are confused or at a loss, always adminhelp, and before taking extreme actions, please try to also contact the administration! Think through your actions and make the roleplay immersive! Please remember all rules aside from those without explicit exceptions apply to antagonists." update_rev_icons_added(rev_mind) + H.hud_updateflag |= 1 << SPECIALROLE_HUD return 1 ///////////////////////////// diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 2330ebcb748..83603ce838a 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -439,6 +439,10 @@ var/global/datum/controller/occupations/job_master var/obj/item/clothing/glasses/G = H.glasses G.prescription = 1 // H.update_icons() + + H.hud_updateflag |= (1 << ID_HUD) + H.hud_updateflag |= (1 << IMPLOYAL_HUD) + H.hud_updateflag |= (1 << SPECIALROLE_HUD) return 1 diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index a772ff88f16..5ec442a3dda 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -525,6 +525,8 @@ What a mess.*/ if ("Change Criminal Status") if (active2) + for(var/mob/living/carbon/human/H in player_list) + H.hud_updateflag |= 1 << WANTED_HUD switch(href_list["criminal2"]) if("none") active2.fields["criminal"] = "None" diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 28eeaaf5b8a..3706ef6bfdd 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -47,8 +47,11 @@ affected.implants += src.imp imp.part = affected + H.hud_updateflag |= 1 << IMPLOYAL_HUD + src.imp = null update() + return diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index aedb20c70d6..f541c837e6a 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -14,80 +14,25 @@ name = "Health Scanner HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." icon_state = "healthhud" - proc - RoundHealth(health) - RoundHealth(health) - switch(health) - if(100 to INFINITY) - return "health100" - if(70 to 100) - return "health80" - if(50 to 70) - return "health60" - if(30 to 50) - return "health40" - if(18 to 30) - return "health25" - if(5 to 18) - return "health10" - if(1 to 5) - return "health1" - if(-99 to 0) - return "health0" - else - return "health-100" - return "0" - - process_hud(var/mob/M) - if(!M) return - if(!M.client) return - var/client/C = M.client - var/image/holder - for(var/mob/living/carbon/human/patient in view(get_turf(M))) - if(M.see_invisible < patient.invisibility) - continue - var/foundVirus = 0 - for(var/datum/disease/D in patient.viruses) - if(!D.hidden[SCANNER]) - foundVirus++ - for (var/ID in patient.virus2) - if (ID in virusDB) - foundVirus = 1 - break - if(!C) continue - - holder = patient.hud_list[HEALTH_HUD] - if(patient.stat == 2) - holder.icon_state = "hudhealth-100" - else - holder.icon_state = "hud[RoundHealth(patient.health)]" - C.images += holder - - holder = patient.hud_list[STATUS_HUD] - if(patient.stat == 2) - holder.icon_state = "huddead" - else if(patient.status_flags & XENO_HOST) - holder.icon_state = "hudxeno" - else if(foundVirus) - holder.icon_state = "hudill" - else if(patient.has_brain_worms()) - var/mob/living/simple_animal/borer/B = patient.has_brain_worms() - if(B.controlling) - holder.icon_state = "hudbrainworm" - else - holder.icon_state = "hudhealthy" - else - holder.icon_state = "hudhealthy" - C.images += holder +/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M) + if(!M) return + if(!M.client) return + var/client/C = M.client + for(var/mob/living/carbon/human/patient in view(get_turf(M))) + if(M.see_invisible < patient.invisibility) + continue + C.images += patient.hud_list[HEALTH_HUD] + C.images += patient.hud_list[STATUS_HUD] /obj/item/clothing/glasses/hud/security name = "Security HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their ID status and security records." icon_state = "securityhud" + var/global/list/jobs[0] /obj/item/clothing/glasses/hud/security/jensenshades name = "Augmented shades" @@ -98,62 +43,16 @@ invisa_view = 2 /obj/item/clothing/glasses/hud/security/process_hud(var/mob/M) + if(!M) return if(!M.client) return var/client/C = M.client - var/image/holder for(var/mob/living/carbon/human/perp in view(get_turf(M))) if(M.see_invisible < perp.invisibility) continue if(!C) continue - var/perpname = perp.name - holder = perp.hud_list[ID_HUD] - if(perp.wear_id) - var/obj/item/weapon/card/id/I = perp.wear_id.GetID() - if(I) - perpname = I.registered_name - holder.icon_state = "hud[ckey(I.GetJobName())]" - C.images += holder - else - perpname = perp.name - holder.icon_state = "hudunknown" - C.images += holder - else - perpname = perp.name - holder.icon_state = "hudunknown" - C.images += holder - - for(var/datum/data/record/E in data_core.general) - if(E.fields["name"] == perpname) - holder = perp.hud_list[WANTED_HUD] - for (var/datum/data/record/R in data_core.security) - if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) - holder.icon_state = "hudwanted" - C.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated")) - holder.icon_state = "hudprisoner" - C.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled")) - holder.icon_state = "hudparolled" - C.images += holder - break - else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released")) - holder.icon_state = "hudreleased" - C.images += holder - break - for(var/obj/item/weapon/implant/I in perp) - if(I.implanted) - if(istype(I,/obj/item/weapon/implant/tracking)) - holder = perp.hud_list[IMPTRACK_HUD] - holder.icon_state = "hud_imp_tracking" - C.images += holder - if(istype(I,/obj/item/weapon/implant/loyalty)) - holder = perp.hud_list[IMPLOYAL_HUD] - holder.icon_state = "hud_imp_loyal" - C.images += holder - if(istype(I,/obj/item/weapon/implant/chem)) - holder = perp.hud_list[IMPCHEM_HUD] - holder.icon_state = "hud_imp_chem" - C.images += holder \ No newline at end of file + C.images += perp.hud_list[ID_HUD] + C.images += perp.hud_list[WANTED_HUD] + C.images += perp.hud_list[IMPTRACK_HUD] + C.images += perp.hud_list[IMPLOYAL_HUD] + C.images += perp.hud_list[IMPCHEM_HUD] diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 98f6e91e128..ec85aaeaa49 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -102,10 +102,11 @@ Works together with spawning an observer, noted above. for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") client.images.Remove(hud) + if(antagHUD) var/list/target_list = list() - for(var/mob/living/target in oview(src)) - if( target.mind&&(target.mind.special_role||issilicon(target)) ) + for(var/mob/living/target in oview(src, 14)) + if(target.mind&&(target.mind.special_role||issilicon(target)) ) target_list += target if(target_list.len) assess_targets(target_list, src) @@ -113,91 +114,19 @@ Works together with spawning an observer, noted above. process_medHUD(src) -// Direct copied from medical HUD glasses proc, used to determine what health bar to put over the targets head. -/mob/dead/proc/RoundHealth(var/health) - switch(health) - if(100 to INFINITY) - return "health100" - if(70 to 100) - return "health80" - if(50 to 70) - return "health60" - if(30 to 50) - return "health40" - if(18 to 30) - return "health25" - if(5 to 18) - return "health10" - if(1 to 5) - return "health1" - if(-99 to 0) - return "health0" - else - return "health-100" - return "0" - - -// Pretty much a direct copy of Medical HUD stuff, except will show ill if they are ill instead of also checking for known illnesses. - -/mob/dead/proc/process_medHUD(var/mob/M) - var/client/C = M.client - var/image/holder - for(var/mob/living/carbon/human/patient in oview(M)) - var/foundVirus = 0 - if(patient.virus2.len) - foundVirus = 1 - if(!C) return - holder = patient.hud_list[HEALTH_HUD] - if(patient.stat == 2) - holder.icon_state = "hudhealth-100" - else - holder.icon_state = "hud[RoundHealth(patient.health)]" - C.images += holder - - holder = patient.hud_list[STATUS_HUD] - if(patient.stat == 2) - holder.icon_state = "huddead" - else if(patient.status_flags & XENO_HOST) - holder.icon_state = "hudxeno" - else if(foundVirus) - holder.icon_state = "hudill" - else if(patient.has_brain_worms()) - var/mob/living/simple_animal/borer/B = patient.has_brain_worms() - if(B.controlling) - holder.icon_state = "hudbrainworm" - else - holder.icon_state = "hudhealthy" - else - holder.icon_state = "hudhealthy" - - C.images += holder - - -/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) - var/icon/tempHud = 'icons/mob/hud.dmi' - for(var/mob/living/target in target_list) - if(iscarbon(target)) - switch(target.mind.special_role) - if("traitor","Syndicate") - U.client.images += image(tempHud,target,"hudsyndicate") - if("Revolutionary") - U.client.images += image(tempHud,target,"hudrevolutionary") - if("Head Revolutionary") - U.client.images += image(tempHud,target,"hudheadrevolutionary") - if("Cultist") - U.client.images += image(tempHud,target,"hudcultist") - if("Changeling") - U.client.images += image(tempHud,target,"hudchangeling") - if("Wizard","Fake Wizard") - U.client.images += image(tempHud,target,"hudwizard") - if("Hunter","Sentinel","Drone","Queen") - U.client.images += image(tempHud,target,"hudalien") - if("Death Commando") - U.client.images += image(tempHud,target,"huddeathsquad") - if("Ninja") - U.client.images += image(tempHud,target,"hudninja") - else//If we don't know what role they have but they have one. - U.client.images += image(tempHud,target,"hudunknown1") +/mob/dead/proc/process_medHUD(var/mob/M) + var/client/C = M.client + for(var/mob/living/carbon/human/patient in oview(M, 14)) + C.images += patient.hud_list[HEALTH_HUD] + C.images += patient.hud_list[STATUS_HUD_OOC] + +/mob/dead/proc/assess_targets(list/target_list, mob/dead/observer/U) + var/client/C = U.client + for(var/mob/living/carbon/human/target in target_list) + C.images += target.hud_list[SPECIALROLE_HUD] + + +/* else//If the silicon mob has no law datum, no inherent laws, or a law zero, add them to the hud. var/mob/living/silicon/silicon_target = target if(!silicon_target.laws||(silicon_target.laws&&(silicon_target.laws.zeroth||!silicon_target.laws.inherent.len))||silicon_target.mind.special_role=="traitor") @@ -205,8 +134,9 @@ Works together with spawning an observer, noted above. U.client.images += image(tempHud,silicon_target,"hudmalborg") else U.client.images += image(tempHud,silicon_target,"hudmalai") - return 1 - +*/ + return 1 + /mob/proc/ghostize(var/can_reenter_corpse = 1) if(key) var/mob/dead/observer/ghost = new(src) //Transfer safety to observer spawning proc. diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d3fdd69ce72..aeb78fdeca0 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -4,7 +4,7 @@ voice_name = "unknown" icon = 'icons/mob/human.dmi' icon_state = "body_m_s" - var/list/hud_list = list() + var/list/hud_list[9] var/datum/species/species //Contains icon generation and language information, set during New(). var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. @@ -54,8 +54,16 @@ dna = new /datum/dna(null) dna.species=species.name - for(var/i=0;i<7;i++) // 2 for medHUDs and 5 for secHUDs - hud_list += image('icons/mob/hud.dmi', src, "hudunknown") + hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100") + hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealthy") + hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudunknown") + hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy") + ..() @@ -553,6 +561,7 @@ modified = 1 spawn() + hud_updateflag |= 1 << WANTED_HUD if(istype(usr,/mob/living/carbon/human)) var/mob/living/carbon/human/U = usr U.handle_regular_hud_updates() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 91b7ef0f96d..39964670139 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -47,6 +47,7 @@ take_overall_damage(amount, 0) else heal_overall_damage(-amount, 0) + hud_updateflag |= 1 << HEALTH_HUD /mob/living/carbon/human/adjustFireLoss(var/amount) if(species && species.burn_mod) @@ -56,6 +57,7 @@ take_overall_damage(0, amount) else heal_overall_damage(0, -amount) + hud_updateflag |= 1 << HEALTH_HUD /mob/living/carbon/human/Stun(amount) if(HULK in mutations) return @@ -97,6 +99,8 @@ if (O.status & ORGAN_MUTATED) O.unmutate() src << "Your [O.display_name] is shaped normally again." + hud_updateflag |= 1 << HEALTH_HUD + //////////////////////////////////////////// //Returns a list of damaged organs @@ -124,6 +128,7 @@ var/datum/organ/external/picked = pick(parts) if(picked.heal_damage(brute,burn)) UpdateDamageIcon() + hud_updateflag |= 1 << HEALTH_HUD updatehealth() //Damages ONE external organ, organ gets randomly selected from damagable ones. @@ -135,6 +140,7 @@ var/datum/organ/external/picked = pick(parts) if(picked.take_damage(brute,burn,sharp)) UpdateDamageIcon() + hud_updateflag |= 1 << HEALTH_HUD updatehealth() @@ -156,6 +162,7 @@ parts -= picked updatehealth() + hud_updateflag |= 1 << HEALTH_HUD if(update) UpdateDamageIcon() // damage MANY external organs, in random order @@ -175,6 +182,7 @@ parts -= picked updatehealth() + hud_updateflag |= 1 << HEALTH_HUD if(update) UpdateDamageIcon() @@ -200,6 +208,7 @@ This function restores all organs. if(istype(E, /datum/organ/external)) if (E.heal_damage(brute, burn)) UpdateDamageIcon() + hud_updateflag |= 1 << HEALTH_HUD else return 0 return @@ -243,6 +252,7 @@ This function restores all organs. // Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life(). updatehealth() + hud_updateflag |= 1 << HEALTH_HUD //Embedded projectile code. if(!organ) return diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7769752abdf..a0206483507 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -63,6 +63,9 @@ in_stasis = istype(loc, /obj/structure/closet/body_bag/cryobag) && loc:opened == 0 if(in_stasis) loc:used++ + if(life_tick%30==15) + hud_updateflag = 1022 + //No need to update all of these procs if the guy is dead. if(stat != DEAD && !in_stasis) if(air_master.current_cycle%4==2 || failed_last_breath) //First, resolve location and get a breath @@ -1125,6 +1128,10 @@ proc/handle_regular_hud_updates() if(!client) return 0 + if(hud_updateflag) + handle_hud_list() + + for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe client.images.Remove(hud) @@ -1544,6 +1551,148 @@ return temp +/* + Called by life(), instead of having the individual hud items update icons each tick and check for status changes + we only set those statuses and icons upon changes. Then those HUD items will simply add those pre-made images. + This proc below is only called when those HUD elements need to change as determined by the mobs hud_updateflag. +*/ + + +/mob/living/carbon/human/proc/handle_hud_list() + + if(hud_updateflag & 1 << HEALTH_HUD) + var/image/holder = hud_list[HEALTH_HUD] + if(stat == 2) + holder.icon_state = "hudhealth-100" // X_X + else + holder.icon_state = "hud[RoundHealth(health)]" + + hud_list[HEALTH_HUD] = holder + + if(hud_updateflag & 1 << STATUS_HUD) + var/foundVirus = 0 + for(var/datum/disease/D in viruses) + if(!D.hidden[SCANNER]) + foundVirus++ + for (var/ID in virus2) + if (ID in virusDB) + foundVirus = 1 + break + + var/image/holder = hud_list[STATUS_HUD] + var/image/holder2 = hud_list[STATUS_HUD_OOC] + if(stat == 2) + holder.icon_state = "huddead" + holder2.icon_state = "huddead" + else if(status_flags & XENO_HOST) + holder.icon_state = "hudxeno" + holder2.icon_state = "hudxeno" + else if(foundVirus) + holder.icon_state = "hudill" + else if(has_brain_worms()) + var/mob/living/simple_animal/borer/B = has_brain_worms() + if(B.controlling) + holder.icon_state = "hudbrainworm" + else + holder.icon_state = "hudhealthy" + holder2.icon_state = "hudbrainworm" + else + holder.icon_state = "hudhealthy" + if(virus2.len) + holder2.icon_state = "hudill" + else + holder2.icon_state = "hudhealthy" + + hud_list[STATUS_HUD] = holder + hud_list[STATUS_HUD_OOC] = holder2 + + if(hud_updateflag & 1 << ID_HUD) + var/image/holder = hud_list[ID_HUD] + if(wear_id) + var/obj/item/weapon/card/id/I = wear_id.GetID() + if(I) + holder.icon_state = "hud[ckey(I.GetJobName())]" + else + holder.icon_state = "hudunknown" + else + holder.icon_state = "hudunknown" + + + hud_list[ID_HUD] = holder + + if(hud_updateflag & 1 << WANTED_HUD) + var/image/holder = hud_list[WANTED_HUD] + holder.icon_state = "hudblank" + var/perpname = name + if(wear_id) + var/obj/item/weapon/card/id/I = wear_id.GetID() + if(I) + perpname = I.registered_name + + for(var/datum/data/record/E in data_core.general) + if(E.fields["name"] == perpname) + for (var/datum/data/record/R in data_core.security) + if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "*Arrest*")) + holder.icon_state = "hudwanted" + break + else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Incarcerated")) + holder.icon_state = "hudprisoner" + break + else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Parolled")) + holder.icon_state = "hudparolled" + break + else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released")) + holder.icon_state = "hudreleased" + break + hud_list[WANTED_HUD] = holder + + if(hud_updateflag & 1 << IMPLOYAL_HUD || hud_updateflag & 1 << IMPCHEM_HUD || hud_updateflag & 1 << IMPTRACK_HUD) + var/image/holder1 = hud_list[IMPTRACK_HUD] + var/image/holder2 = hud_list[IMPLOYAL_HUD] + var/image/holder3 = hud_list[IMPCHEM_HUD] + + holder1.icon_state = "hudblank" + holder2.icon_state = "hudblank" + holder3.icon_state = "hudblank" + + for(var/obj/item/weapon/implant/I in src) + if(I.implanted) + if(istype(I,/obj/item/weapon/implant/tracking)) + holder1.icon_state = "hud_imp_tracking" + if(istype(I,/obj/item/weapon/implant/loyalty)) + holder2.icon_state = "hud_imp_loyal" + if(istype(I,/obj/item/weapon/implant/chem)) + holder3.icon_state = "hud_imp_chem" + + hud_list[IMPTRACK_HUD] = holder1 + hud_list[IMPLOYAL_HUD] = holder2 + hud_list[IMPCHEM_HUD] = holder3 + + if(hud_updateflag & 1 << SPECIALROLE_HUD) + var/image/holder = hud_list[SPECIALROLE_HUD] + holder.icon_state = "hudblank" + switch(mind.special_role) + if("traitor","Syndicate") + holder.icon_state = "hudsyndicate" + if("Revolutionary") + holder.icon_state = "hudrevolutionary" + if("Head Revolutionary") + holder.icon_state = "hudheadrevolutionary" + if("Cultist") + holder.icon_state = "hudcultist" + if("Changeling") + holder.icon_state = "hudchangeling" + if("Wizard","Fake Wizard") + holder.icon_state = "hudwizard" + if("Death Commando") + holder.icon_state = "huddeathsquad" + if("Ninja") + holder.icon_state = "hudninja" + + hud_list[SPECIALROLE_HUD] = holder + + hud_updateflag = 0 + #undef HUMAN_MAX_OXYLOSS #undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index a937ca56a8b..38ad9cc0d03 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -516,6 +516,10 @@ proc/get_damage_icon_part(damage_state, body_part) overlays_standing[ID_LAYER] = null else overlays_standing[ID_LAYER] = null + + hud_updateflag |= 1 << ID_HUD + hud_updateflag |= 1 << WANTED_HUD + if(update_icons) update_icons() /mob/living/carbon/human/update_inv_gloves(var/update_icons=1) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 57bb02ce5c3..7827363dae7 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -258,6 +258,12 @@ var/mob/living/carbon/C = src C.handcuffed = initial(C.handcuffed) + if (C.legcuffed && !initial(C.legcuffed)) + C.drop_from_inventory(C.legcuffed) + C.legcuffed = initial(C.legcuffed) + hud_updateflag |= 1 << HEALTH_HUD + hud_updateflag |= 1 << STATUS_HUD + /mob/living/proc/rejuvenate() // shut down various types of badness @@ -303,7 +309,9 @@ // make the icons look correct regenerate_icons() - + + hud_updateflag |= 1 << HEALTH_HUD + hud_updateflag |= 1 << STATUS_HUD return /mob/living/proc/UpdateDamageIcon() @@ -766,4 +774,4 @@ loc = target_vent.loc var/area/new_area = get_area(loc) if(new_area) - new_area.Entered(src) \ No newline at end of file + new_area.Entered(src) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 2b3d9f861ad..a93bfd2d191 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -5,6 +5,8 @@ var/maxHealth = 100 //Maximum health that should be possible. var/health = 100 //A mob's health + var/hud_updateflag = 0 + //Damage related vars, NOTE: THESE SHOULD ONLY BE MODIFIED BY PROCS var/bruteloss = 0.0 //Brutal damage caused by brute force (punching, being clubbed by a toolbox ect... this also accounts for pressure damage) var/oxyloss = 0.0 //Oxygen depravation damage (no air in lungs) @@ -35,4 +37,4 @@ var/tod = null // Time of death var/update_slimes = 1 - var/silent = null //Can't talk. Value goes down every life proc. \ No newline at end of file + var/silent = null //Can't talk. Value goes down every life proc. diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f652f77ec86..154a7f047f3 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -115,6 +115,17 @@ var/list/ai_list = list() src << "These laws may be changed by other players, or by you being the traitor." job = "AI" + + hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + + ai_list += src ..() return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index be0642ec249..12ae12babeb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -126,6 +126,18 @@ var/datum/robot_component/cell_component = components["power cell"] cell_component.wrapped = cell cell_component.installed = 1 + + hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100") + hud_list[ID_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[WANTED_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPLOYAL_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPCHEM_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[IMPTRACK_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") + + + playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index bfa45124985..6f770c8a71d 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -7,7 +7,7 @@ var/list/alarms_to_show = list() var/list/alarms_to_clear = list() immune_to_ssd = 1 - + var/list/hud_list[9] var/list/alarm_types_show = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) var/list/alarm_types_clear = list("Motion" = 0, "Fire" = 0, "Atmosphere" = 0, "Power" = 0, "Camera" = 0) @@ -191,4 +191,4 @@ dat += data_core.get_manifest(1) // make it monochrome dat += "
" src << browse(dat, "window=airoster") - onclose(src, "airoster") \ No newline at end of file + onclose(src, "airoster") diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index c39267b9032..a57d1d89ca9 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -184,6 +184,8 @@ "\blue You take [obj] out of incision on [target]'s [affected.display_name]s with \the [tool]." ) affected.implants -= obj + target.hud_updateflag |= 1 << IMPLOYAL_HUD + //Handle possessive brain borers. if(istype(obj,/mob/living/simple_animal/borer)) var/mob/living/simple_animal/borer/worm = obj diff --git a/code/modules/virus2/disease2.dm b/code/modules/virus2/disease2.dm index 59c713ae983..bb64a5366db 100644 --- a/code/modules/virus2/disease2.dm +++ b/code/modules/virus2/disease2.dm @@ -79,6 +79,7 @@ for(var/datum/disease2/effectholder/e in effects) e.effect.deactivate(mob) mob.virus2.Remove("[uniqueID]") + mob.hud_updateflag |= 1 << STATUS_HUD /datum/disease2/disease/proc/minormutate() //uniqueID = rand(0,10000) @@ -175,6 +176,7 @@ proc/virus2_lesser_infection() for(var/mob/living/carbon/human/G in player_list) if(G.client && G.stat != DEAD) candidates += G + if(!candidates.len) return candidates = shuffle(candidates) diff --git a/code/modules/virus2/helpers.dm b/code/modules/virus2/helpers.dm index 0c95af7e09f..1748d20b500 100644 --- a/code/modules/virus2/helpers.dm +++ b/code/modules/virus2/helpers.dm @@ -80,6 +80,7 @@ proc/airborne_can_reach(turf/source, turf/target) D.minormutate() // log_debug("Adding virus") M.virus2["[D.uniqueID]"] = D + M.hud_updateflag |= 1 << STATUS_HUD //Infects mob M with random lesser disease, if he doesn't have one /proc/infect_mob_random_lesser(var/mob/living/carbon/M) @@ -87,12 +88,14 @@ proc/airborne_can_reach(turf/source, turf/target) D.makerandom() D.infectionchance = 1 M.virus2["[D.uniqueID]"] = D + M.hud_updateflag |= 1 << STATUS_HUD //Infects mob M with random greated disease, if he doesn't have one /proc/infect_mob_random_greater(var/mob/living/carbon/M) var/datum/disease2/disease/D = new /datum/disease2/disease D.makerandom(1) M.virus2["[D.uniqueID]"] = D + M.hud_updateflag |= 1 << STATUS_HUD //Fancy prob() function. /proc/dprob(var/p) @@ -138,4 +141,4 @@ proc/airborne_can_reach(turf/source, turf/target) for (var/ID in victim.virus2) var/datum/disease2/disease/V = victim.virus2[ID] if(V && V.spreadtype != vector) continue - infect_virus2(src,V) \ No newline at end of file + infect_virus2(src,V) diff --git a/code/setup.dm b/code/setup.dm index 96bc6222087..854276561c9 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -691,13 +691,15 @@ var/list/be_special_flags = list( #define RIGHT 2 // for secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans. -#define HEALTH_HUD 1 // dead, alive, sick, health status -#define STATUS_HUD 2 // a simple line rounding the mob's number health +#define HEALTH_HUD 1 // a simple line rounding the mob's number health +#define STATUS_HUD 2 // alive, dead, diseased, etc. #define ID_HUD 3 // the job asigned to your ID #define WANTED_HUD 4 // wanted, released, parroled, security status -#define IMPLOYAL_HUD 5 // loyality implant +#define IMPLOYAL_HUD 5 // loyality implant #define IMPCHEM_HUD 6 // chemical implant -#define IMPTRACK_HUD 7 // tracking implant +#define IMPTRACK_HUD 7 // tracking implant +#define SPECIALROLE_HUD 8 // AntagHUD image +#define STATUS_HUD_OOC 9 // STATUS_HUD without virus db check for someone being ill. //Pulse levels, very simplified #define PULSE_NONE 0 //so !M.pulse checks would be possible @@ -758,4 +760,4 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define COLOR_PINK "#FF00FF" #define COLOR_YELLOW "#FFFF00" #define COLOR_ORANGE "#FF9900" -#define COLOR_WHITE "#FFFFFF" \ No newline at end of file +#define COLOR_WHITE "#FFFFFF" diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 006a6c64b13c30782241ad090ec269f0b302d34f..0ea9293c2acc6f5a8b959bed768324f0488f2767 100644 GIT binary patch delta 575 zcmV-F0>J%;7mF9LmH~eydQ@0+L}hbha%pgMX>V=-0C=30m(On7Fbu}e$x{UFwHwl= z8G6}eXfgD#zCyuBw8ci2JW7t2J^kpU13F*k;~+tc^wm(}Bs=jDO5 zNKUJ-tNYLEa?vPtd|rP< zB}N4EOdjEWamom{Q<5}h?GX6v&h2`Q!w)mqFEiNt8SLG5j&n0u9KCR=Nyl@fqb;{L z+yCtQ1U~jisWK#tUZv#3im;CQYVrWx^ttIRMRH0EN!bPAhEpqvF>{m)le%CayP7c< zrb{~Z;wa{(5r=ZMttR0n#Z8-a1*bOQbN_ZEzlTs11IN?-5So1DdaUgvV%`vwi z-Ew05?DuE)84VWIE|)&AimU8GvYQA}-?X;UJV#6=P*XbrGvRMwXGqAi`B3G+SpKSK z$W;q2B`^R{th_7uhLOf2SQY~H5v&WlDUXsz59S8p-t2z`(EN{igbeMZgCgZf+dNO5 zREh=6Dl`HQX`euolcYC-42Xh>%Oaavj*?n%7OA0Fse~F&w&p-^KFDv&2qlZfFHM772#|M?n7l8l( delta 571 zcmV-B0>u4`7l#+HmH~eudQ@0+L}hbha%pgMX>V=-0C=30mrZUPF${&*_9={Hn-)$S z7u|GIBq*|It`N`?XT(G!O(~6C_w?o1DUbq9@wC$zpCnRz{PE@L>;1Qf$JO2UhvlBN zNKUIStJ{z3<>DZ|2K(6DEEj>L5B2;}Dpj`SMVNeGiZvWBmJ5F`TI|Q`<)Tv>_`H6L zN{k5RnLNV%=JJ;(q4u5W7KQ*wo4eZUf#kmF+N8dTsq~kf#(U#k* z?LYQ?03Z86sWK#tQKjU>im;BxYVrWx^tl@?MRH0EN!bPAj#Dp*F>{m)le%CayP7c< z=1T_l;wa{>6Ni6Y^%Oab4j*@zC7OA0Fse~F&w&p-^KFBZ22qg4*MWZcxLCH_P42yWx8?ZfveLe~$%ZeIQ~ZgmPpm z7<;m6Zgnor7Afy@oaVAl3N_TZ1vhUh$22#oisk+k|JQ{tSND&1r@son0aNy>#DrdU J6SKqv#|K~(6(#@x From 94a4d27100f485f0d032438fd8724abe473335db Mon Sep 17 00:00:00 2001 From: yashaldie Date: Mon, 10 Mar 2014 23:39:36 -0400 Subject: [PATCH 04/17] Fixes adding encryption keys to borgs adding Encryption keys were not working on borgs. and also causing a run-time error. This should fix it. --- code/game/objects/items/devices/radio/radio.dm | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index bd3eeb495d4..ea3a2168785 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -742,20 +742,25 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use src.channels = list() src.syndie = 0 + var/mob/living/silicon/robot/D = src.loc + if(D.module) + for(var/ch_name in D.module.channels) + if(ch_name in src.channels) + continue + src.channels += ch_name + src.channels[ch_name] += D.module.channels[ch_name] if(keyslot) for(var/ch_name in keyslot.channels) if(ch_name in src.channels) continue src.channels += ch_name - src.channels[ch_name] = keyslot.channels[ch_name] - + src.channels[ch_name] += keyslot.channels[ch_name] + if(keyslot.syndie) src.syndie = 1 - var/mob/living/silicon/robot/Ro = usr - if(Ro.module) - src.config(Ro.module.channels) + - for (var/ch_name in channels) + for (var/ch_name in src.channels) if(!radio_controller) sleep(30) // Waiting for the radio_controller to be created. if(!radio_controller) From b429605adc3ecd6362944e12d796deb18c9c5273 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Tue, 11 Mar 2014 02:51:13 -0500 Subject: [PATCH 05/17] MedicHUD bugfix Because the HUD stuff is now in Life() if someone dies their healthbar and status aren't updated. We're fixing that here. --- code/modules/mob/living/carbon/human/death.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index fb82ca3e7ed..018f154b864 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -58,6 +58,12 @@ dizziness = 0 jitteriness = 0 + + hud_updateflag |= 1 << HEALTH_HUD + hud_updateflag |= 1 << STATUS_HUD + + handle_hud_list() + //Handle species-specific deaths. if(species) species.handle_death(src) From bdd955b036222a63dbe45c3c952d11d2f0283f5f Mon Sep 17 00:00:00 2001 From: yashaldie Date: Tue, 11 Mar 2014 05:45:10 -0400 Subject: [PATCH 06/17] Fixes Diona Nymph handling updates Diona Nymphs were not getting their Handling procs called. --- code/modules/mob/living/carbon/monkey/life.dm | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 4ec4d413062..bb1b48a0cad 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -22,15 +22,16 @@ if(loc) environment = loc.return_air() - if (stat != DEAD && !istype(src,/mob/living/carbon/monkey/diona)) //still breathing - //First, resolve location and get a breath - if(air_master.current_cycle%4==2) - //Only try to take a breath every 4 seconds, unless suffocating - 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) + if (stat != DEAD) + if(!istype(src,/mob/living/carbon/monkey/diona)) //still breathing + //First, resolve location and get a breath + if(air_master.current_cycle%4==2) + //Only try to take a breath every 4 seconds, unless suffocating + 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) //Updates the number of stored chemicals for powers From 1f7a444ab1e436c190b1d964fe5d039b6dd9cb5a Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Wed, 12 Mar 2014 13:15:23 +1300 Subject: [PATCH 07/17] Fixed plasma glass outputting slag Fixes #4560 Code was missing continue statements. --- code/modules/mining/machine_processing.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 313ae1cf1b2..96e36aae41f 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -298,6 +298,7 @@ new /obj/item/stack/sheet/mineral/clown(output.loc) else on = 0 + continue if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) if (ore_glass > 0 && ore_plasma > 0) ore_glass--; @@ -305,6 +306,7 @@ new /obj/item/stack/sheet/glass/plasmaglass(output.loc) else on = 0 + continue if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) if (ore_glass > 0 && ore_plasma > 0 && ore_iron > 0) ore_glass--; From 51177f266319f5fefca137752b2d51f1538c68b0 Mon Sep 17 00:00:00 2001 From: Jarcolr Date: Thu, 13 Mar 2014 18:56:01 +0200 Subject: [PATCH 08/17] You can now flip coins,AKA the D2 --- code/modules/mining/ores_coins.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index b01be5edf93..8b1ecfc80eb 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -150,3 +150,14 @@ string_attached = null user << "\blue You detach the string from the coin." else ..() + +/obj/item/weapon/coin/attack_self(mob/user as mob) + var/result = rand(1, sides) + var/comment = "" + if(result == 1) + comment = "tails" + else if(result == 2) + comment = "heads" + user.visible_message("[user] has thrown [src]. It lands on [comment]! ", \ + "You throw [src]. It lands on [comment]! ", \ + "You hear [src] landing on [comment]! ") From c8c7ea34e9966ca0774dcd26f17bffccc1265c9e Mon Sep 17 00:00:00 2001 From: Jarcolr Date: Thu, 13 Mar 2014 19:33:54 +0200 Subject: [PATCH 09/17] Forgot var/sides = 2 Oops. --- code/modules/mining/ores_coins.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 8b1ecfc80eb..d29e0d02520 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -81,6 +81,7 @@ throwforce = 0.0 w_class = 1.0 var/string_attached + var/sides = 2 /obj/item/weapon/coin/New() pixel_x = rand(0,16)-8 From 53d0fac4e3d8f810dcf5760a9ba9e400ba5b602d Mon Sep 17 00:00:00 2001 From: Jarcolr Date: Fri, 14 Mar 2014 18:39:22 +0200 Subject: [PATCH 10/17] Small tweak to coin flipping. Last one,I swear. --- code/modules/mining/ores_coins.dm | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index d29e0d02520..b59ec2114b2 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -88,39 +88,39 @@ pixel_y = rand(0,8)-8 /obj/item/weapon/coin/gold - name = "Gold coin" + name = "gold coin" icon_state = "coin_gold" /obj/item/weapon/coin/silver - name = "Silver coin" + name = "silver coin" icon_state = "coin_silver" /obj/item/weapon/coin/diamond - name = "Diamond coin" + name = "diamond coin" icon_state = "coin_diamond" /obj/item/weapon/coin/iron - name = "Iron coin" + name = "iron coin" icon_state = "coin_iron" /obj/item/weapon/coin/plasma - name = "Solid plasma coin" + name = "solid plasma coin" icon_state = "coin_plasma" /obj/item/weapon/coin/uranium - name = "Uranium coin" + name = "uranium coin" icon_state = "coin_uranium" /obj/item/weapon/coin/clown - name = "Bananaium coin" + name = "bananaium coin" icon_state = "coin_clown" /obj/item/weapon/coin/adamantine - name = "Adamantine coin" + name = "adamantine coin" icon_state = "coin_adamantine" /obj/item/weapon/coin/mythril - name = "Mythril coin" + name = "mythril coin" icon_state = "coin_mythril" /obj/item/weapon/coin/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -159,6 +159,5 @@ comment = "tails" else if(result == 2) comment = "heads" - user.visible_message("[user] has thrown [src]. It lands on [comment]! ", \ - "You throw [src]. It lands on [comment]! ", \ - "You hear [src] landing on [comment]! ") + user.visible_message("[user] has thrown the [src]. It lands on [comment]! ", \ + "You throw the [src]. It lands on [comment]! ") From f1fdbb02c0f0022755398e3a19ef2ea866d2c127 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sat, 15 Mar 2014 00:57:11 -0500 Subject: [PATCH 11/17] HUD-Optimization bugfix, mobs with no clients will update their health HUD image as well. --- code/modules/mob/living/carbon/human/life.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a0206483507..bf7c1fc1884 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1126,11 +1126,11 @@ return 1 proc/handle_regular_hud_updates() - if(!client) return 0 - if(hud_updateflag) handle_hud_list() - + + + if(!client) return 0 for(var/image/hud in client.images) if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe From 7ce4073135fe3bcb6809974741afbf34206ec11b Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sat, 15 Mar 2014 04:05:56 -0500 Subject: [PATCH 12/17] Code effeciency project: Ore processing. Before: The stacker and processor used del(item) to get rid of the items causing /obj/movable/del() to spike up and cause fun amounts of lag. Also we have seperate variables for if a certain ore type is selected in the processing machine and the cooking portion of process() uses a huge string of if()'s which check 8 or so variables and is terrible and probably a pain in the ass should someone decide to later add ore types and recipes. After: We just set item.loc = null when it goes in the stacker of processor and garbage collection takes care of it within a tick. Those different variables for ore selection are now just one variable which is a bitfield, much easier to read, much easier to expand upon. --- code/modules/mining/machine_processing.dm | 169 ++++++++++++---------- code/modules/mining/machine_stacking.dm | 105 ++++++++------ 2 files changed, 158 insertions(+), 116 deletions(-) diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 96e36aae41f..db58e039fbc 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -1,3 +1,12 @@ +#define ORE_PROC_GOLD 1 +#define ORE_PROC_SILVER 2 +#define ORE_PROC_DIAMOND 4 +#define ORE_PROC_GLASS 8 +#define ORE_PROC_PLASMA 16 +#define ORE_PROC_URANIUM 32 +#define ORE_PROC_IRON 64 +#define ORE_PROC_CLOWN 128 + /**********************Mineral processing unit console**************************/ /obj/machinery/mineral/processing_unit_console @@ -32,83 +41,83 @@ //iron if(machine.ore_iron || machine.ore_glass || machine.ore_plasma || machine.ore_uranium || machine.ore_gold || machine.ore_silver || machine.ore_diamond || machine.ore_clown || machine.ore_adamantine) if(machine.ore_iron) - if (machine.selected_iron==1) + if (machine.selected & ORE_PROC_IRON) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Iron: [machine.ore_iron]
") else - machine.selected_iron = 0 + machine.selected &= ~ORE_PROC_IRON //sand - glass if(machine.ore_glass) - if (machine.selected_glass==1) + if (machine.selected & ORE_PROC_GLASS) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Sand: [machine.ore_glass]
") else - machine.selected_glass = 0 + machine.selected &= ~ORE_PROC_GLASS //plasma if(machine.ore_plasma) - if (machine.selected_plasma==1) + if (machine.selected & ORE_PROC_PLASMA) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Plasma: [machine.ore_plasma]
") else - machine.selected_plasma = 0 + machine.selected &= ~ORE_PROC_PLASMA //uranium if(machine.ore_uranium) - if (machine.selected_uranium==1) + if (machine.selected & ORE_PROC_URANIUM) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Uranium: [machine.ore_uranium]
") else - machine.selected_uranium = 0 + machine.selected &= ~ORE_PROC_URANIUM //gold if(machine.ore_gold) - if (machine.selected_gold==1) + if (machine.selected & ORE_PROC_GOLD) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Gold: [machine.ore_gold]
") else - machine.selected_gold = 0 + machine.selected &= ~ORE_PROC_GOLD //silver if(machine.ore_silver) - if (machine.selected_silver==1) + if (machine.selected & ORE_PROC_SILVER) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Silver: [machine.ore_silver]
") else - machine.selected_silver = 0 + machine.selected &= ~ORE_PROC_SILVER //diamond if(machine.ore_diamond) - if (machine.selected_diamond==1) + if (machine.selected & ORE_PROC_DIAMOND) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Diamond: [machine.ore_diamond]
") else - machine.selected_diamond = 0 + machine.selected &= ~ORE_PROC_DIAMOND //bananium if(machine.ore_clown) - if (machine.selected_clown==1) + if (machine.selected & ORE_PROC_CLOWN) dat += text("Smelting ") else dat += text("Not smelting ") dat += text("Bananium: [machine.ore_clown]
") else - machine.selected_clown = 0 + machine.selected &= ~ORE_PROC_CLOWN //On or off @@ -132,44 +141,44 @@ src.add_fingerprint(usr) if(href_list["sel_iron"]) if (href_list["sel_iron"] == "yes") - machine.selected_iron = 1 + machine.selected |= ORE_PROC_IRON else - machine.selected_iron = 0 + machine.selected &= ~ORE_PROC_IRON if(href_list["sel_glass"]) if (href_list["sel_glass"] == "yes") - machine.selected_glass = 1 + machine.selected |= ORE_PROC_GLASS else - machine.selected_glass = 0 + machine.selected &= ~ORE_PROC_GLASS if(href_list["sel_plasma"]) if (href_list["sel_plasma"] == "yes") - machine.selected_plasma = 1 + machine.selected |= ORE_PROC_PLASMA else - machine.selected_plasma = 0 + machine.selected &= ~ORE_PROC_PLASMA if(href_list["sel_uranium"]) if (href_list["sel_uranium"] == "yes") - machine.selected_uranium = 1 + machine.selected |= ORE_PROC_URANIUM else - machine.selected_uranium = 0 + machine.selected &= ~ORE_PROC_URANIUM if(href_list["sel_gold"]) if (href_list["sel_gold"] == "yes") - machine.selected_gold = 1 + machine.selected |= ORE_PROC_GOLD else - machine.selected_gold = 0 + machine.selected &= ~ORE_PROC_GOLD if(href_list["sel_silver"]) if (href_list["sel_silver"] == "yes") - machine.selected_silver = 1 + machine.selected |= ORE_PROC_SILVER else - machine.selected_silver = 0 + machine.selected &= ~ORE_PROC_SILVER if(href_list["sel_diamond"]) if (href_list["sel_diamond"] == "yes") - machine.selected_diamond = 1 + machine.selected |= ORE_PROC_DIAMOND else - machine.selected_diamond = 0 + machine.selected &= ~ORE_PROC_DIAMOND if(href_list["sel_clown"]) if (href_list["sel_clown"] == "yes") - machine.selected_clown = 1 + machine.selected |= ORE_PROC_CLOWN else - machine.selected_clown = 0 + machine.selected &= ~ORE_PROC_CLOWN if(href_list["set_on"]) if (href_list["set_on"] == "on") machine.on = 1 @@ -187,6 +196,7 @@ icon_state = "furnace" density = 1 anchored = 1.0 + luminosity = 3 //Big fire with window, yeah it puts out a little light. var/obj/machinery/mineral/input = null var/obj/machinery/mineral/output = null var/obj/machinery/mineral/CONSOLE = null @@ -199,6 +209,8 @@ var/ore_iron = 0; var/ore_clown = 0; var/ore_adamantine = 0; + var/selected = 0 +/* var/selected_gold = 0 var/selected_silver = 0 var/selected_diamond = 0 @@ -207,8 +219,10 @@ var/selected_uranium = 0 var/selected_iron = 0 var/selected_clown = 0 +*/ var/on = 0 //0 = off, 1 =... oh you know! + /obj/machinery/mineral/processing_unit/New() ..() spawn( 5 ) @@ -227,14 +241,17 @@ var/i for (i = 0; i < 10; i++) if (on) - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + + + + if (selected == ORE_PROC_GLASS) if (ore_glass > 0) ore_glass--; new /obj/item/stack/sheet/glass(output.loc) else on = 0 continue - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) + if (selected == ORE_PROC_GLASS + ORE_PROC_IRON) if (ore_glass > 0 && ore_iron > 0) ore_glass--; ore_iron--; @@ -242,49 +259,49 @@ else on = 0 continue - if (selected_glass == 0 && selected_gold == 1 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_GOLD) if (ore_gold > 0) ore_gold--; new /obj/item/stack/sheet/mineral/gold(output.loc) else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_SILVER) if (ore_silver > 0) ore_silver--; new /obj/item/stack/sheet/mineral/silver(output.loc) else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_DIAMOND) if (ore_diamond > 0) ore_diamond--; new /obj/item/stack/sheet/mineral/diamond(output.loc) else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_PLASMA) if (ore_plasma > 0) ore_plasma--; new /obj/item/stack/sheet/mineral/plasma(output.loc) else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_URANIUM) if (ore_uranium > 0) ore_uranium--; new /obj/item/stack/sheet/mineral/uranium(output.loc) else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) + if (selected == ORE_PROC_IRON) if (ore_iron > 0) ore_iron--; new /obj/item/stack/sheet/metal(output.loc) else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) + if (selected == ORE_PROC_IRON + ORE_PROC_PLASMA) if (ore_iron > 0 && ore_plasma > 0) ore_iron--; ore_plasma--; @@ -292,14 +309,14 @@ else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 0 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 1) + if (selected == ORE_PROC_CLOWN) if (ore_clown > 0) ore_clown--; new /obj/item/stack/sheet/mineral/clown(output.loc) else on = 0 continue - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_GLASS + ORE_PROC_PLASMA) if (ore_glass > 0 && ore_plasma > 0) ore_glass--; ore_plasma--; @@ -307,7 +324,7 @@ else on = 0 continue - if (selected_glass == 1 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 1 && selected_clown == 0) + if (selected == ORE_PROC_GLASS + ORE_PROC_IRON + ORE_PROC_PLASMA) if (ore_glass > 0 && ore_plasma > 0 && ore_iron > 0) ore_glass--; ore_iron--; @@ -316,10 +333,10 @@ else on = 0 continue - //THESE TWO ARE CODED FOR URIST TO USE WHEN HE GETS AROUND TO IT. - //They were coded on 18 Feb 2012. If you're reading this in 2015, then firstly congratulations on the world not ending on 21 Dec 2012 and secondly, Urist is apparently VERY lazy. ~Errorage - //Iamgoofball here, this comment I'm typing right now was made in 11/1/2013. If you're reading this in 2020, then please let me know if the world has gone into a nuclear apocalypse. Also Urist has been tried and hung for how lazy he was. That and he was jaywalking. - /*if (selected_glass == 0 && selected_gold == 0 && selected_silver == 0 && selected_diamond == 1 && selected_plasma == 0 && selected_uranium == 1 && selected_iron == 0 && selected_clown == 0) + + /* + + if (selected == ORE_PROC_URANIUM + ORE_PROC_DIAMOND) if (ore_uranium >= 2 && ore_diamond >= 1) ore_uranium -= 2 ore_diamond -= 1 @@ -327,62 +344,64 @@ else on = 0 continue - if (selected_glass == 0 && selected_gold == 0 && selected_silver == 1 && selected_diamond == 0 && selected_plasma == 1 && selected_uranium == 0 && selected_iron == 0 && selected_clown == 0) + if (selected == ORE_PROC_SILVER + ORE_PROC_PLASMA) if (ore_silver >= 1 && ore_plasma >= 3) ore_silver -= 1 ore_plasma -= 3 new /obj/item/stack/sheet/mineral/mythril(output.loc) else on = 0 - continue*/ + continue + + */ //if a non valid combination is selected var/b = 1 //this part checks if all required ores are available - if (!(selected_gold || selected_silver ||selected_diamond || selected_uranium | selected_plasma || selected_iron || selected_iron)) + if (!selected) b = 0 - if (selected_gold == 1) + if (selected & ORE_PROC_GOLD) if (ore_gold <= 0) b = 0 - if (selected_silver == 1) + if (selected & ORE_PROC_SILVER) if (ore_silver <= 0) b = 0 - if (selected_diamond == 1) + if (selected & ORE_PROC_DIAMOND) if (ore_diamond <= 0) b = 0 - if (selected_uranium == 1) + if (selected & ORE_PROC_URANIUM) if (ore_uranium <= 0) b = 0 - if (selected_plasma == 1) + if (selected & ORE_PROC_PLASMA) if (ore_plasma <= 0) b = 0 - if (selected_iron == 1) + if (selected & ORE_PROC_IRON) if (ore_iron <= 0) b = 0 - if (selected_glass == 1) + if (selected & ORE_PROC_GLASS) if (ore_glass <= 0) b = 0 - if (selected_clown == 1) + if (selected & ORE_PROC_CLOWN) if (ore_clown <= 0) b = 0 if (b) //if they are, deduct one from each, produce slag and shut the machine off - if (selected_gold == 1) + if (selected & ORE_PROC_GOLD) ore_gold-- - if (selected_silver == 1) + if (selected & ORE_PROC_SILVER) ore_silver-- - if (selected_diamond == 1) + if (selected & ORE_PROC_DIAMOND) ore_diamond-- - if (selected_uranium == 1) + if (selected & ORE_PROC_URANIUM) ore_uranium-- - if (selected_plasma == 1) + if (selected & ORE_PROC_PLASMA) ore_plasma-- - if (selected_iron == 1) + if (selected & ORE_PROC_IRON) ore_iron-- - if (selected_clown == 1) + if (selected & ORE_PROC_CLOWN) ore_clown-- new /obj/item/weapon/ore/slag(output.loc) on = 0 @@ -399,44 +418,44 @@ if (istype(O,/obj/item/weapon/ore/iron)) ore_iron++; O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/glass)) ore_glass++; O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/diamond)) ore_diamond++; O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/plasma)) ore_plasma++ O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/gold)) ore_gold++ O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/silver)) ore_silver++ O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/uranium)) ore_uranium++ O.loc = null - del(O) + //del(O) continue if (istype(O,/obj/item/weapon/ore/clown)) ore_clown++ O.loc = null - del(O) + //del(O) continue O.loc = src.output.loc else break - return \ No newline at end of file + return diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm index 86f844f6237..138a42aaaa7 100644 --- a/code/modules/mining/machine_stacking.dm +++ b/code/modules/mining/machine_stacking.dm @@ -242,85 +242,108 @@ /obj/machinery/mineral/stacking_machine/process() if (src.output && src.input) - var/obj/item/O + var/obj/item/stack/O while (locate(/obj/item, input.loc)) - O = locate(/obj/item, input.loc) + O = locate(/obj/item/stack, input.loc) + if(isnull(O)) + var/obj/item/I = locate(/obj/item, input.loc) + if (istype(I,/obj/item/weapon/ore/slag)) + I.loc = null + else + I.loc = output.loc + continue if (istype(O,/obj/item/stack/sheet/metal)) - ore_iron+= O:amount; - del(O) + ore_iron+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/diamond)) - ore_diamond+= O:amount; - del(O) + ore_diamond+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/plasma)) - ore_plasma+= O:amount - del(O) + ore_plasma+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/gold)) - ore_gold+= O:amount - del(O) + ore_gold+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/silver)) - ore_silver+= O:amount - del(O) + ore_silver+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/clown)) - ore_clown+= O:amount - del(O) + ore_clown+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/uranium)) - ore_uranium+= O:amount - del(O) + ore_uranium+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/glass/plasmaglass)) - ore_plasmaglass+= O:amount - del(O) + ore_plasmaglass+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/glass/plasmarglass)) - ore_plasmarglass+= O:amount - del(O) + ore_plasmarglass+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/glass)) - ore_glass+= O:amount - del(O) + ore_glass+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/rglass)) - ore_rglass+= O:amount - del(O) + ore_rglass+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/plasteel)) - ore_plasteel+= O:amount - del(O) + ore_plasteel+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/adamantine)) - ore_adamantine+= O:amount - del(O) + ore_adamantine+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/mineral/mythril)) - ore_mythril+= O:amount - del(O) + ore_mythril+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/cardboard)) - ore_cardboard+= O:amount - del(O) + ore_cardboard+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/wood)) - ore_wood+= O:amount - del(O) + ore_wood+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/cloth)) - ore_cloth+= O:amount - del(O) + ore_cloth+= O.amount + O.loc = null + //del(O) continue if (istype(O,/obj/item/stack/sheet/leather)) - ore_leather+= O:amount - del(O) - continue - if (istype(O,/obj/item/weapon/ore/slag)) - del(O) + ore_leather+= O.amount + O.loc = null + //del(O) continue O.loc = src.output.loc + if (ore_gold >= stack_amt) var/obj/item/stack/sheet/mineral/gold/G = new /obj/item/stack/sheet/mineral/gold G.amount = stack_amt From 31ed2999c5fde2606c003775a57af590fb0badb5 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sat, 15 Mar 2014 06:31:53 -0500 Subject: [PATCH 13/17] Runtime fix on spawned mobs with no minds/client. --- code/modules/mob/living/carbon/human/life.dm | 40 ++++++++++---------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bf7c1fc1884..14cf1d45af6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1671,25 +1671,27 @@ if(hud_updateflag & 1 << SPECIALROLE_HUD) var/image/holder = hud_list[SPECIALROLE_HUD] holder.icon_state = "hudblank" - switch(mind.special_role) - if("traitor","Syndicate") - holder.icon_state = "hudsyndicate" - if("Revolutionary") - holder.icon_state = "hudrevolutionary" - if("Head Revolutionary") - holder.icon_state = "hudheadrevolutionary" - if("Cultist") - holder.icon_state = "hudcultist" - if("Changeling") - holder.icon_state = "hudchangeling" - if("Wizard","Fake Wizard") - holder.icon_state = "hudwizard" - if("Death Commando") - holder.icon_state = "huddeathsquad" - if("Ninja") - holder.icon_state = "hudninja" - - hud_list[SPECIALROLE_HUD] = holder + if(mind) + + switch(mind.special_role) + if("traitor","Syndicate") + holder.icon_state = "hudsyndicate" + if("Revolutionary") + holder.icon_state = "hudrevolutionary" + if("Head Revolutionary") + holder.icon_state = "hudheadrevolutionary" + if("Cultist") + holder.icon_state = "hudcultist" + if("Changeling") + holder.icon_state = "hudchangeling" + if("Wizard","Fake Wizard") + holder.icon_state = "hudwizard" + if("Death Commando") + holder.icon_state = "huddeathsquad" + if("Ninja") + holder.icon_state = "hudninja" + + hud_list[SPECIALROLE_HUD] = holder hud_updateflag = 0 From 3d18b94d7dda7d25ec8e12f866358de2b9a45121 Mon Sep 17 00:00:00 2001 From: Mloc-Argent Date: Sat, 15 Mar 2014 18:02:24 +0000 Subject: [PATCH 14/17] Fixes #4589 Signed-off-by: Mloc-Argent --- code/game/machinery/doors/windowdoor.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index c8d0d4d110b..a940a9db923 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -130,11 +130,12 @@ var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) - if(src.req_access.len) - ae.conf_access = src.req_access - else if (src.req_one_access.len) - ae.conf_access = src.req_one_access - ae.one_access = 1 + if(src.req_access) + if(src.req_access.len) + ae.conf_access = src.req_access + else if (src.req_one_access.len) + ae.conf_access = src.req_one_access + ae.one_access = 1 else ae = electronics electronics = null From 02cc696bf35820a2004b8c307ba03c18a3a9ce50 Mon Sep 17 00:00:00 2001 From: Segrain Date: Sat, 15 Mar 2014 23:02:57 +0300 Subject: [PATCH 15/17] Fix for #4589. --- code/game/machinery/doors/airlock.dm | 4 +++- code/game/machinery/doors/windowdoor.dm | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index ccb53acc440..3168fe4e7d9 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1203,6 +1203,8 @@ About the new airlock wires panel: var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) + if(!src.req_access) + src.check_access() if(src.req_access.len) ae.conf_access = src.req_access else if (src.req_one_access.len) @@ -1329,4 +1331,4 @@ About the new airlock wires panel: src.locked = 0 src.open() src.locked = 1 - return + return \ No newline at end of file diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index a940a9db923..289cd495354 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -130,12 +130,13 @@ var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) - if(src.req_access) - if(src.req_access.len) - ae.conf_access = src.req_access - else if (src.req_one_access.len) - ae.conf_access = src.req_one_access - ae.one_access = 1 + if(!src.req_access) + src.check_access() + if(src.req_access.len) + ae.conf_access = src.req_access + else if (src.req_one_access.len) + ae.conf_access = src.req_one_access + ae.one_access = 1 else ae = electronics electronics = null @@ -228,6 +229,8 @@ var/obj/item/weapon/airlock_electronics/ae if(!electronics) ae = new/obj/item/weapon/airlock_electronics( src.loc ) + if(!src.req_access) + src.check_access() if(src.req_access.len) ae.conf_access = src.req_access else if (src.req_one_access.len) @@ -343,5 +346,4 @@ /obj/machinery/door/window/brigdoor/southright dir = SOUTH icon_state = "rightsecure" - base_state = "rightsecure" - + base_state = "rightsecure" \ No newline at end of file From 89b55a335ec02bf94f4f0ce16b1c4fa347e0001f Mon Sep 17 00:00:00 2001 From: Segrain Date: Sun, 16 Mar 2014 08:17:18 +0300 Subject: [PATCH 16/17] Fix for #4592. --- icons/effects/blood.dmi | Bin 58849 -> 58952 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/effects/blood.dmi b/icons/effects/blood.dmi index c254397a20d1856474f9b5ada0c9b6f8580cb265..9820bb1f8ac420743d1f1689d59203770be6bcd7 100644 GIT binary patch delta 16455 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 delta 16351 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 L6vZn<4TJs%t)wBV From 6e56a81531f464a9fb7a3852d79c061962f3c5b8 Mon Sep 17 00:00:00 2001 From: Ccomp5950 Date: Sun, 16 Mar 2014 04:07:46 -0500 Subject: [PATCH 17/17] PDA NanoUI bugfix. modes that update every 5 ticks won't require clicking the pda 5 times to get a UI window open. We now check to see if a UI already exists if not we don't check --- code/game/objects/items/devices/PDA/PDA.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ec1e6195d20..7f954721d4d 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -330,10 +330,11 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null) ui_tick++ + var/datum/nanoui/old_ui = nanomanager.get_open_ui(user, src, "main") var/auto_update = 1 if(mode in no_auto_update) auto_update = 0 - if(mode == lastmode && ui_tick % 5 && mode in update_every_five) + if(old_ui && (mode == lastmode && ui_tick % 5 && mode in update_every_five)) return lastmode = mode