diff --git a/code/ATMOSPHERICS/_atmospherics_helpers.dm b/code/ATMOSPHERICS/_atmospherics_helpers.dm index f85fa84b93..d4de419ad0 100644 --- a/code/ATMOSPHERICS/_atmospherics_helpers.dm +++ b/code/ATMOSPHERICS/_atmospherics_helpers.dm @@ -130,7 +130,7 @@ var/total_specific_power = 0 //the power required to remove one mole of filterable gas for (var/g in filtering) var/ratio = source.gas[g]/total_filterable_moles //this converts the specific power per mole of pure gas to specific power per mole of scrubbed gas - total_specific_power = specific_power_gas[g]*ratio + total_specific_power += specific_power_gas[g]*ratio //Figure out how much of each gas to filter if (isnull(total_transfer_moles)) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 7237cccbca..9ae50b11af 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -85,6 +85,9 @@ obj/machinery/atmospherics/proc/check_connect_types(obj/machinery/atmospherics/a return node.pipe_color /obj/machinery/atmospherics/process() + last_flow_rate = 0 + last_power_draw = 0 + build_network() /obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 43874a64d9..561a2bf7df 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -17,6 +17,7 @@ var/frequency = 1439 var/datum/radio_frequency/radio_connection + var/hibernate = 0 //Do we even process? var/scrubbing = 1 //0 = siphoning, 1 = scrubbing var/list/scrubbing_gas = list("carbon_dioxide") @@ -126,8 +127,8 @@ /obj/machinery/atmospherics/unary/vent_scrubber/process() ..() - last_power_draw = 0 - last_flow_rate = 0 + if (hibernate) + return 1 if (!node) use_power = 0 @@ -149,6 +150,12 @@ power_draw = pump_gas(src, environment, air_contents, transfer_moles, power_rating) + if(scrubbing && power_draw < 0 && controller_iteration > 10) //99% of all scrubbers + //Fucking hibernate because you ain't doing shit. + hibernate = 1 + spawn(rand(100,200)) //hibernate for 10 or 20 seconds randomly + hibernate = 0 + if (power_draw >= 0) last_power_draw = power_draw use_power(power_draw) diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 55b1b23a9f..09e6f845c8 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -7,6 +7,8 @@ var/list/directory = list() //list of all ckeys with associated client var/global/list/player_list = list() //List of all mobs **with clients attached**. Excludes /mob/new_player var/global/list/mob_list = list() //List of all mobs, including clientless +var/global/list/human_mob_list = list() //List of all human mobs and sub-types, including clientless +var/global/list/silicon_mob_list = list() //List of all silicon mobs, including clientless var/global/list/living_mob_list = list() //List of all alive mobs, including clientless. Excludes /mob/new_player var/global/list/dead_mob_list = list() //List of all dead mobs, including clientless. Excludes /mob/new_player diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index b9b4225a41..3ee4e26a7a 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -11,3 +11,9 @@ /proc/isfloor(turf/T) return (istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor) || istype(T, /turf/simulated/shuttle/floor)) + +/proc/turf_clear(turf/T) + for(var/atom/A in T) + if(A.simulated) + return 0 + return 1 diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index c6b331f137..75166b3f48 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -444,6 +444,8 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/sortmobs() var/list/moblist = list() var/list/sortmob = sortAtom(mob_list) + for(var/mob/eye/M in sortmob) + moblist.Add(M) for(var/mob/living/silicon/ai/M in sortmob) moblist.Add(M) for(var/mob/living/silicon/pai/M in sortmob) diff --git a/code/game/machinery/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm index 484db52462..65864b0b70 100644 --- a/code/game/machinery/computer3/laptop.dm +++ b/code/game/machinery/computer3/laptop.dm @@ -55,19 +55,11 @@ qdel(src) return - if(!stored_computer.manipulating) - stored_computer.manipulating = 1 - stored_computer.loc = loc - stored_computer.stat &= ~MAINT - stored_computer.update_icon() - loc = null - usr << "You open \the [src]." - - spawn(5) - stored_computer.manipulating = 0 - qdel(src) - else - usr << "\red You are already opening the computer!" + stored_computer.loc = loc + stored_computer.stat &= ~MAINT + stored_computer.update_icon() + loc = stored_computer + usr << "You open \the [src]." AltClick() @@ -82,12 +74,10 @@ if(stored_computer) stored_computer.eject_id() - /obj/machinery/computer3/laptop/verb/eject_id() set category = "Object" set name = "Eject ID Card" set src in oview(1) - var/obj/item/part/computer/cardslot/C = locate() in src.contents if(!C) @@ -104,7 +94,7 @@ return usr << "You remove [card] from the laptop." - C.remove(card) + C.remove(4) /obj/machinery/computer3/laptop @@ -117,7 +107,6 @@ pixel_y = -3 show_keyboard = 0 - var/manipulating = 0 // To prevent disappearing bug var/obj/item/device/laptop/portable = null New(var/L, var/built = 0) @@ -157,12 +146,11 @@ portable=new portable.stored_computer = src - if(!manipulating) - portable.loc = loc - loc = portable - stat |= MAINT - if(user) - user << "You close \the [src]." + portable.loc = loc + loc = portable + stat |= MAINT + if(user) + user << "You close \the [src]." auto_use_power() if(stat&MAINT) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index fbb6e8b10c..3ea9b5157f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -393,9 +393,9 @@ occupant.ckey = null //Make an announcement and log the person entering storage. - control_computer.frozen_crew += "[occupant.real_name]" + control_computer.frozen_crew += "[occupant.real_name], [occupant.mind.assigned_role] - [worldtime2text()]" - announce.autosay("[occupant.real_name] [on_store_message]", "[on_store_name]") + announce.autosay("[occupant.real_name], [occupant.mind.assigned_role] [on_store_message]", "[on_store_name]") visible_message("\The [initial(name)] hums and hisses as it moves [occupant.real_name] into storage.", 3) // Delete the mob. diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 65038649d4..95c4191622 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -24,7 +24,7 @@ desc = "It's just an ordinary box." icon_state = "box" item_state = "syringe_kit" - var/foldable = null // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard + var/foldable = /obj/item/stack/material/cardboard // BubbleWrap - if set, can be folded (when empty) into a sheet of cardboard // BubbleWrap - A box can be folded up to make card /obj/item/weapon/storage/box/attack_self(mob/user as mob) @@ -598,7 +598,6 @@ icon_state = "light" desc = "This box is shaped on the inside so that only light tubes and bulbs fit." item_state = "syringe_kit" - foldable = /obj/item/stack/material/cardboard //BubbleWrap storage_slots=21 can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb) max_storage_space = 42 //holds 21 items of w_class 2 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 6158c59bc8..cd6dfda8db 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1236,7 +1236,7 @@ var/global/floorIsLava = 0 if(!ai_number) usr << "No AIs located" //Just so you know the thing is actually working and not just ignoring you. -/datum/admins/proc/show_skills(var/mob/living/carbon/human/M as mob in world) +/datum/admins/proc/show_skills() set category = "Admin" set name = "Show Skills" @@ -1246,6 +1246,9 @@ var/global/floorIsLava = 0 usr << "Error: you are not an admin!" return + var/mob/living/carbon/human/M = input("Select mob.", "Select mob.") as null|anything in human_mob_list + if(!M) return + show_skill_window(usr, M) return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index a373062568..af1e049b39 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -711,66 +711,70 @@ var/list/admin_verbs_mentor = list( if(holder) src.holder.output_ai_laws() -/client/proc/rename_silicon(mob/living/silicon/S in mob_list) +/client/proc/rename_silicon() set name = "Rename Silicon" set category = "Admin" - if(!istype(S)) - return + if(!check_rights(R_ADMIN)) return - if(holder) - var/new_name = sanitizeSafe(input(src, "Enter new name. Leave blank or as is to cancel.", "Enter new silicon name", S.real_name)) - if(new_name && new_name != S.real_name) - admin_log_and_message_admins("has renamed the silicon '[S.real_name]' to '[new_name]'") - S.SetName(new_name) + var/mob/living/silicon/S = input("Select silicon.", "Rename Silicon.") as null|anything in silicon_mob_list + if(!S) return + + var/new_name = sanitizeSafe(input(src, "Enter new name. Leave blank or as is to cancel.", "[S.real_name] - Enter new silicon name", S.real_name)) + if(new_name && new_name != S.real_name) + admin_log_and_message_admins("has renamed the silicon '[S.real_name]' to '[new_name]'") + S.SetName(new_name) feedback_add_details("admin_verb","RAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/manage_silicon_laws(mob/living/silicon/S in mob_list) +/client/proc/manage_silicon_laws() set name = "Manage Silicon Laws" set category = "Admin" - if(!istype(S)) - return + if(!check_rights(R_ADMIN)) return - if(holder) - var/obj/nano_module/law_manager/L = new(S) - L.ui_interact(usr, state = admin_state) + var/mob/living/silicon/S = input("Select silicon.", "Manage Silicon Laws") as null|anything in silicon_mob_list + if(!S) return + + var/obj/nano_module/law_manager/L = new(S) + L.ui_interact(usr, state = admin_state) admin_log_and_message_admins("has opened [S]'s law manager.") feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/change_human_appearance_admin(mob/living/carbon/human/H in world) +/client/proc/change_human_appearance_admin() set name = "Change Mob Appearance - Admin" set desc = "Allows you to change the mob appearance" set category = "Admin" - if(!istype(H)) - return + if(!check_rights(R_FUN)) return - if(holder) - admin_log_and_message_admins("is altering the appearance of [H].") - H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0, state = admin_state) + var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Admin") as null|anything in human_mob_list + if(!H) return + + admin_log_and_message_admins("is altering the appearance of [H].") + H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0, state = admin_state) feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/client/proc/change_human_appearance_self(mob/living/carbon/human/H in mob_list) +/client/proc/change_human_appearance_self() set name = "Change Mob Appearance - Self" set desc = "Allows the mob to change its appearance" set category = "Admin" - if(!istype(H)) - return + if(!check_rights(R_FUN)) return + + var/mob/living/carbon/human/H = input("Select mob.", "Change Mob Appearance - Self") as null|anything in human_mob_list + if(!H) return if(!H.client) usr << "Only mobs with clients can alter their own appearance." return - if(holder) - switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) - if("Yes") - admin_log_and_message_admins("has allowed [H] to change \his appearance, without whitelisting of races.") - H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0) - if("No") - admin_log_and_message_admins("has allowed [H] to change \his appearance, with whitelisting of races.") - H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) + switch(alert("Do you wish for [H] to be allowed to select non-whitelisted races?","Alter Mob Appearance","Yes","No","Cancel")) + if("Yes") + admin_log_and_message_admins("has allowed [H] to change \his appearance, without whitelisting of races.") + H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 0) + if("No") + admin_log_and_message_admins("has allowed [H] to change \his appearance, with whitelisting of races.") + H.change_appearance(APPEARANCE_ALL, H.loc, check_species_whitelist = 1) feedback_add_details("admin_verb","CMAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/change_security_level() @@ -795,12 +799,14 @@ var/list/admin_verbs_mentor = list( // feedback_add_details("admin_verb","MP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return -/client/proc/editappear(mob/living/carbon/human/M as mob in mob_list) +/client/proc/editappear() set name = "Edit Appearance" set category = "Fun" if(!check_rights(R_FUN)) return + var/mob/living/carbon/human/M = input("Select mob.", "Edit Appearance") as null|anything in human_mob_list + if(!istype(M, /mob/living/carbon/human)) usr << "\red You can only do this to humans!" return diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index b947f3f710..26cae206e9 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -137,7 +137,7 @@ send2adminirc("PlayerPM from [key_name(src)]: [html_decode(msg)]") - src << "" + create_text_tag("pm_out_alt", "", src) + " to : [msg]" + src << "" + create_text_tag("pm_out_alt", "", src) + " to Admin IRC: [msg]" log_admin("PM: [key_name(src)]->IRC: [msg]") for(var/client/X in admins) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index ec90235a2a..63eae8e994 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -516,12 +516,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that for(var/areatype in areas_without_camera) world << "* [areatype]" -/client/proc/cmd_admin_dress(var/mob/living/carbon/human/M in mob_list) +/client/proc/cmd_admin_dress() set category = "Fun" set name = "Select equipment" - if(!ishuman(M)) - alert("Invalid mob") - return + + var/mob/living/carbon/human/M = input("Select mob.", "Select equipment.") as null|anything in human_mob_list + if(!M) return + //log_admin("[key_name(src)] has alienized [M.key].") var/list/dresspacks = list( "strip", diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 0848c17a11..35c206fd4b 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -236,8 +236,9 @@ datum/preferences /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return update_preview_icon() - user << browse_rsc(preview_icon_front, "previewicon.png") - user << browse_rsc(preview_icon_side, "previewicon2.png") + if(preview_icon_front && preview_icon_side) + user << browse_rsc(preview_icon_front, "previewicon.png") + user << browse_rsc(preview_icon_side, "previewicon2.png") var/dat = "
" if(path) @@ -1667,6 +1668,7 @@ datum/preferences var/status = organ_data[name] var/obj/item/organ/external/O = character.organs_by_name[name] if(O) + O.status = 0 if(status == "amputated") character.organs_by_name[O.limb_name] = null character.organs -= O diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index eed1e40ab2..fda22b17f9 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -100,7 +100,7 @@ else dat += "Lock in new transaction

" - dat += "Transaction purpose: [transaction_purpose]
" + dat += "Transaction purpose: [transaction_purpose]
" dat += "Value: $[transaction_amount]
" dat += "Linked account: [linked_account ? linked_account.owner_name : "None"]
" dat += "Change access code
" diff --git a/code/modules/events/event_dynamic.dm b/code/modules/events/event_dynamic.dm index 0dbe3a5017..3539130c27 100644 --- a/code/modules/events/event_dynamic.dm +++ b/code/modules/events/event_dynamic.dm @@ -188,28 +188,35 @@ var/list/event_last_fired = list() active_with_role["Cyborg"] = 0 active_with_role["Janitor"] = 0 active_with_role["Gardener"] = 0 - active_with_role["Any"] = player_list.len for(var/mob/M in player_list) - if(!M.mind || !M.client || M.client.inactivity > 10 * 10 * 60) // longer than 10 minutes AFK counts them as inactive + if(!M.mind || !M.client || M.client.is_afk(10 MINUTES)) // longer than 10 minutes AFK counts them as inactive continue - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "engineering robot module") - active_with_role["Engineer"]++ - if(M.mind.assigned_role in list("Chief Engineer", "Station Engineer")) + active_with_role["Any"]++ + + if(istype(M, /mob/living/silicon/robot)) + var/mob/living/silicon/robot/R = M + if(R.module) + if(istype(R.module, /obj/item/weapon/robot_module/engineering)) + active_with_role["Engineer"]++ + else if(istype(R.module, /obj/item/weapon/robot_module/security)) + active_with_role["Security"]++ + else if(istype(R.module, /obj/item/weapon/robot_module/medical)) + active_with_role["Medical"]++ + else if(istype(R.module, /obj/item/weapon/robot_module/research)) + active_with_role["Scientist"]++ + + if(M.mind.assigned_role in engineering_positions) active_with_role["Engineer"]++ - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "medical robot module") - active_with_role["Medical"]++ if(M.mind.assigned_role in medical_positions) active_with_role["Medical"]++ - if(istype(M, /mob/living/silicon/robot) && M:module && M:module.name == "security robot module") - active_with_role["Security"]++ if(M.mind.assigned_role in security_positions) active_with_role["Security"]++ - if(M.mind.assigned_role in list("Research Director", "Scientist")) + if(M.mind.assigned_role in science_positions) active_with_role["Scientist"]++ if(M.mind.assigned_role == "AI") diff --git a/code/modules/events/infestation.dm b/code/modules/events/infestation.dm index 629579f794..c88472688f 100644 --- a/code/modules/events/infestation.dm +++ b/code/modules/events/infestation.dm @@ -58,14 +58,10 @@ spawn_area_type = /area/security/tactical locstring = "tactical equipment storage" - //world << "looking for [spawn_area_type]" for(var/areapath in typesof(spawn_area_type)) - //world << " checking [areapath]" var/area/A = locate(areapath) - //world << " A: [A], contents.len: [A.contents.len]" - //world << " B: [B], contents.len: [B.contents.len]" for(var/turf/simulated/floor/F in A.contents) - if(!F.contents.len) + if(turf_clear(F)) turfs += F var/list/spawn_types = list() diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 57579cdb72..e62a96c2ce 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -7,7 +7,7 @@ for(var/areapath in typesof(/area/hallway)) var/area/A = locate(areapath) for(var/turf/simulated/floor/F in A.contents) - if(!F.contents.len) + if(turf_clear(F)) turfs += F if(turfs.len) //Pick a turf to spawn at if we can diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2874d16d39..c8d5651b29 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -670,6 +670,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp client.images -= ghostimage //remove ourself mob/dead/observer/MayRespawn(var/feedback = 0) + if(!client || !mind) + return 0 + if(mind.current && mind.current.stat != DEAD) + if(feedback) + src << "Your non-dead body prevent you from respawning." + return 0 if(config.antag_hud_restricted && has_enabled_antagHUD == 1) if(feedback) src << "antagHUD restrictions prevent you from respawning." diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 39c8eaf799..4f31bd5a84 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -37,6 +37,7 @@ hud_list[SPECIALROLE_HUD] = image('icons/mob/hud.dmi', src, "hudblank") hud_list[STATUS_HUD_OOC] = image('icons/mob/hud.dmi', src, "hudhealthy") + human_mob_list |= src ..() if(dna) @@ -44,6 +45,7 @@ make_blood() /mob/living/carbon/human/Destroy() + human_mob_list -= src for(var/organ in organs) qdel(organ) return ..() diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index ec6ddefe1c..1fefa272e5 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -185,7 +185,7 @@ This is another way of saying that we won't bother dealing with them.*/ else src << "No holopad connected." - return + return 0 return 1 /mob/living/silicon/ai/proc/holopad_emote(var/message) //This is called when the AI uses the 'me' verb while using a holopad. @@ -206,7 +206,7 @@ M.show_message(rendered, 2) else //This shouldn't occur, but better safe then sorry. src << "No holopad connected." - return + return 0 return 1 /mob/living/silicon/ai/emote(var/act, var/type, var/message) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 77b13a8b11..de27956678 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -27,11 +27,13 @@ #define MED_HUD 2 //Medical HUD mode /mob/living/silicon/New() + silicon_mob_list |= src ..() add_language("Galactic Common") init_subsystems() /mob/living/silicon/Destroy() + silicon_mob_list -= src for(var/datum/alarm_handler/AH in alarm_manager.all_handlers) AH.unregister(src) ..() diff --git a/code/modules/nano/modules/law_manager.dm b/code/modules/nano/modules/law_manager.dm index 93caa4c48b..98c2cdc905 100644 --- a/code/modules/nano/modules/law_manager.dm +++ b/code/modules/nano/modules/law_manager.dm @@ -34,10 +34,7 @@ return 1 if(href_list["set_view"]) - if(is_malf(usr) || owner.is_ai_malf()) - current_view = text2num(href_list["set_view"]) - else - current_view = 0 + current_view = text2num(href_list["set_view"]) return 1 if(href_list["law_channel"]) @@ -170,12 +167,8 @@ data["isAI"] = owner.isAI() data["isMalf"] = is_malf(user) - data["isAIMalf"] = owner.is_ai_malf() data["isSlaved"] = owner.is_slaved() data["isAdmin"] = is_admin(user) - - if(!(data["isMalf"] || data["isAIMalf"])) - current_view = 0 data["view"] = current_view var/channels[0] @@ -183,9 +176,7 @@ channels[++channels.len] = list("channel" = ch_name) data["channel"] = owner.lawchannel data["channels"] = channels - - if(data["isMalf"] || data["isAIMalf"]) - data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws) + data["law_sets"] = package_multiple_laws(data["isAdmin"] ? admin_laws : player_laws) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) @@ -216,15 +207,6 @@ /obj/nano_module/law_manager/proc/is_malf(var/mob/user) return (is_admin(user) && !owner.is_slaved()) || owner.is_malf_or_traitor() -/mob/living/silicon/proc/is_ai_malf() - return 0 - -/mob/living/silicon/robot/is_ai_malf() - return is_slaved() && connected_ai.is_malf_or_traitor() - -/mob/living/silicon/ai/is_ai_malf() - return 0 - /mob/living/silicon/proc/is_slaved() return 0 diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 3c4f166fa6..b7541153a5 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -882,11 +882,14 @@ Note that amputating the affected organ does in fact remove the infection from t dislocated = -1 //TODO, make robotic limbs a separate type, remove snowflake cannot_break = 1 get_icon() + unmutate() for (var/obj/item/organ/external/T in children) if(T) T.robotize() /obj/item/organ/external/proc/mutate() + if(src.status & ORGAN_ROBOT) + return src.status |= ORGAN_MUTATED owner.update_body() diff --git a/html/changelog.html b/html/changelog.html index a333ef505e..73f2aecf83 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,7 +56,21 @@ -->
-

01 June 2015

+

04 June 2015

+

PsiOmegaDelta updated:

+
    +
  • AI eyes can now be found in the observer follow list.
  • +
  • Synths can now review all law modules that can be found on the station from their law manager.
  • +
  • Synths can state these laws if desired, however this is strongly discouraged unless subverted/malfunctioning.
  • +
  • Astral projecting mobs, such as wizards or cultists, may no longer respawn as something else while their body lives.
  • +
+

Techhead updated:

+
    +
  • Prison break event has been expanded to include Virology or Xenobiology
  • +
  • Prison break event will warn Enginering and the AI beforehand so they can take preventive measures.
  • +
  • Disabling area power will now prevent doors from opening during the event
  • +
+

02 June 2015

Techhead updated:

    @@ -97,7 +111,7 @@

    Atlantis updated:

    • NanoUI for Robotics Control Console
    • -
    • NanoUI for Supermatter Crystal - AI/Robot only, purely informational
    • +
    • NanoUI for Supermatter Crystal - AI/Robot only, purely informational

    Chinsky updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 602ce3ee80..c7acac5135 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -1851,7 +1851,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2015-05-26: Atlantis: - rscadd: NanoUI for Robotics Control Console - - rscdel: NanoUI for Supermatter Crystal - AI/Robot only, purely informational + - rscadd: NanoUI for Supermatter Crystal - AI/Robot only, purely informational Chinsky: - rscadd: Meat limbs now can be attached. Use limb on missing area, then hemostat to finalize it. @@ -1930,9 +1930,20 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. PsiOmegaDelta: - rscadd: You can now review the server revision date and hash by using the 'Show Server Revision' verb in the OOC category. -2015-06-01: - Techhead: - - rscadd: Re-adds extended capacity emergency oxygen tanks to relevant jobs. 2015-06-02: Techhead: - rscadd: Re-adds extended capacity emergency oxygen tanks to relevant jobs. +2015-06-04: + PsiOmegaDelta: + - rscadd: AI eyes can now be found in the observer follow list. + - rscadd: Synths can now review all law modules that can be found on the station + from their law manager. + - rscadd: Synths can state these laws if desired, however this is strongly discouraged + unless subverted/malfunctioning. + - bugfix: Astral projecting mobs, such as wizards or cultists, may no longer respawn + as something else while their body lives. + Techhead: + - rscadd: Prison break event has been expanded to include Virology or Xenobiology + - rscadd: Prison break event will warn Enginering and the AI beforehand so they + can take preventive measures. + - bugfix: Disabling area power will now prevent doors from opening during the event diff --git a/html/changelogs/Techhead-Prisonbreak.yml b/html/changelogs/Techhead-Prisonbreak.yml deleted file mode 100644 index 783108bc90..0000000000 --- a/html/changelogs/Techhead-Prisonbreak.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Techhead -delete-after: True - -changes: - - rscadd: "Prison break event has been expanded to include Virology or Xenobiology" - - rscadd: "Prison break event will warn Enginering and the AI beforehand so they can take preventive measures." - - bugfix: "Disabling area power will now prevent doors from opening during the event" diff --git a/nano/templates/law_manager.tmpl b/nano/templates/law_manager.tmpl index d4860c2b90..fa91140881 100644 --- a/nano/templates/law_manager.tmpl +++ b/nano/templates/law_manager.tmpl @@ -41,18 +41,16 @@ } -{{if data.isSlaved && data.isAdmin}} - This unit is law synced to {{:data.isSlaved}}. +{{if data.isSlaved}} +
      Law synced to {{:data.isSlaved}}.
      {{/if}} -{{if data.isMalf || data.isAIMalf}} -
      -
      - {{:helper.link('Law Management', null, {'set_view' : 0}, data.view == 0 ? 'selected' : null)}} - {{:helper.link('Law Sets', null, {'set_view' : 1}, data.view == 1 ? 'selected' : null)}} -
      +
      +
      + {{:helper.link('Law Management', null, {'set_view' : 0}, data.view == 0 ? 'selected' : null)}} + {{:helper.link('Law Sets', null, {'set_view' : 1}, data.view == 1 ? 'selected' : null)}}
      -{{/if}} +
      {{if data.view == 0}} {{if data.has_ion_laws}} @@ -196,6 +194,8 @@
      {{/if}} {{else data.view == 1}} +
      Remember: Stating laws other than those currently loaded may be grounds for decommissioning - NanoTrasen
      + {{for data.law_sets}}
      @@ -246,7 +246,7 @@

      - {{:helper.link('Load Laws', null, {'transfer_laws' : value.ref}, data.isSlaved ? 'disabled' : null)}}{{:helper.link('State Laws', null, {'state_law_set' : value.ref})}} + {{:helper.link('Load Laws', null, {'transfer_laws' : value.ref}, data.isMalf ? null : 'disabled')}}{{:helper.link('State Laws', null, {'state_law_set' : value.ref})}}
      {{/for}}