diff --git a/code/game/machinery/pointdefense.dm b/code/game/machinery/pointdefense.dm index e9d513319a..412775bc05 100644 --- a/code/game/machinery/pointdefense.dm +++ b/code/game/machinery/pointdefense.dm @@ -77,7 +77,7 @@ GLOBAL_LIST_BOILERPLATE(pointdefense_turrets, /obj/machinery/power/pointdefense) if(id_tag) var/list/connected_z_levels = GetConnectedZlevels(get_z(src)) for(var/i = 1 to LAZYLEN(pointdefense_turrets)) - var/obj/machinery/pointdefense/PD = pointdefense_turrets[i] + var/obj/machinery/power/pointdefense/PD = pointdefense_turrets[i] if(!(PD.id_tag == id_tag && (get_z(PD) in connected_z_levels))) continue var/list/turret = list() diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index e1a4cefd15..f2f484ed7c 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -30,25 +30,15 @@ //log_admin("HELP: [key_name(src)]: [msg]") /proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage) -<<<<<<< HEAD - msg = "[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]" - for(var/client/C in GLOB.admins) -======= msg = "[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (RPLY): [msg]" - for(var/client/C in admins) ->>>>>>> fdabe51... Linter Introduction + Cleanup (#8085) + for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins if(R_ADMIN|R_EVENT & C.holder.rights) to_chat(C,msg) C << 'sound/machines/signal.ogg' /proc/Syndicate_announce(var/msg, var/mob/Sender) -<<<<<<< HEAD - msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]" - for(var/client/C in GLOB.admins) -======= msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (RPLY): [msg]" - for(var/client/C in admins) ->>>>>>> fdabe51... Linter Introduction + Cleanup (#8085) + for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins if(R_ADMIN|R_EVENT & C.holder.rights) to_chat(C,msg) C << 'sound/machines/signal.ogg' \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 237a7e4395..865952471b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -467,7 +466,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set_dir(2) //reset dir so the right directional sprites show up return ..() -/mob/observer/dead/stop_orbit(datum/component/orbiter/orbits) +/mob/observer/dead/stop_orbit() . = ..() //restart our floating animation after orbit is done. pixel_y = 0 @@ -965,917 +964,3 @@ mob/observer/dead/MayRespawn(var/feedback = 0) set name = "Respawn" set category = "Ghost" src.abandon_mob() -======= -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = 0 - -/mob/observer/dead - name = "ghost" - desc = "It's a g-g-g-g-ghooooost!" //jinkies! - icon = 'icons/mob/ghost.dmi' - icon_state = "ghost" - stat = DEAD - canmove = 0 - blinded = 0 - anchored = 1 // don't get pushed around - - var/can_reenter_corpse - var/datum/hud/living/carbon/hud = null // hud - var/bootime = 0 - var/started_as_observer //This variable is set to 1 when you enter the game as an observer. - //If you died in the game and are a ghsot - this will remain as null. - //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. - var/has_enabled_antagHUD = 0 - var/medHUD = 0 - var/secHUD = 0 - var/antagHUD = 0 - universal_speak = 1 - var/atom/movable/following = null - var/admin_ghosted = 0 - var/anonsay = 0 - var/ghostvision = 1 //is the ghost able to see things humans can't? - incorporeal_move = 1 - - var/is_manifest = 0 //If set to 1, the ghost is able to whisper. Usually only set if a cultist drags them through the veil. - var/ghost_sprite = null - var/global/list/possible_ghost_sprites = list( - "Clear" = "blank", - "Green Blob" = "otherthing", - "Bland" = "ghost", - "Robed-B" = "ghost1", - "Robed-BAlt" = "ghost2", - "King" = "ghostking", - "Shade" = "shade", - "Hecate" = "ghost-narsie", - "Glowing Statue" = "armour", - "Artificer" = "artificer", - "Behemoth" = "behemoth", - "Harvester" = "harvester", - "Wraith" = "wraith", - "Viscerator" = "viscerator", - "Corgi" = "corgi", - "Tamaskan" = "tamaskan", - "Black Cat" = "blackcat", - "Lizard" = "lizard", - "Goat" = "goat", - "Space Bear" = "bear", - "Bats" = "bat", - "Chicken" = "chicken_white", - "Parrot"= "parrot_fly", - "Goose" = "goose", - "Penguin" = "penguin", - "Brown Crab" = "crab", - "Gray Crab" = "evilcrab", - "Trout" = "trout-swim", - "Salmon" = "salmon-swim", - "Pike" = "pike-swim", - "Koi" = "koi-swim", - "Carp" = "carp", - "Red Robes" = "robe_red", - "Faithless" = "faithless", - "Shadowform" = "forgotten", - "Dark Ethereal" = "bloodguardian", - "Holy Ethereal" = "lightguardian", - "Red Elemental" = "magicRed", - "Blue Elemental" = "magicBlue", - "Pink Elemental" = "magicPink", - "Orange Elemental" = "magicOrange", - "Green Elemental" = "magicGreen", - "Daemon" = "daemon", - "Guard Spider" = "guard", - "Hunter Spider" = "hunter", - "Nurse Spider" = "nurse", - "Rogue Drone" = "drone", - "ED-209" = "ed209", - "Beepsky" = "secbot" - ) - var/last_revive_notification = null // world.time of last notification, used to avoid spamming players from defibs or cloners. - var/cleanup_timer // Refernece to a timer that will delete this mob if no client returns - -/mob/observer/dead/New(mob/body) - - appearance = body - invisibility = INVISIBILITY_OBSERVER - layer = BELOW_MOB_LAYER - plane = PLANE_GHOSTS - alpha = 127 - - sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - see_invisible = SEE_INVISIBLE_OBSERVER - see_in_dark = world.view //I mean. I don't even know if byond has occlusion culling... but... - verbs += /mob/observer/dead/proc/dead_tele - - var/turf/T - if(ismob(body)) - T = get_turf(body) //Where is the body located? - attack_log = body.attack_log //preserve our attack logs by copying them to our ghost - gender = body.gender - if(body.mind && body.mind.name) - name = body.mind.name - else - if(body.real_name) - name = body.real_name - else - if(gender == MALE) - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - else - name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names)) - - mind = body.mind //we don't transfer the mind but we keep a reference to it. - - // Fix for naked ghosts. - // Unclear why this isn't being grabbed by appearance. - if(ishuman(body)) - var/mob/living/carbon/human/H = body - add_overlay(H.overlays_standing) - - if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - forceMove(T) - - if(!name) //To prevent nameless ghosts - name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) - real_name = name - animate(src, pixel_y = 2, time = 10, loop = -1) - ..() - -/mob/observer/dead/Topic(href, href_list) - if (href_list["track"]) - var/mob/target = locate(href_list["track"]) in mob_list - if(target) - ManualFollow(target) - if(href_list["reenter"]) - reenter_corpse() - return - -/mob/observer/dead/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/weapon/book/tome)) - var/mob/observer/dead/M = src - M.manifest(user) - -/mob/observer/dead/CanPass(atom/movable/mover, turf/target) - return TRUE - -/mob/observer/dead/set_stat(var/new_stat) - if(new_stat != DEAD) - CRASH("It is best if observers stay dead, thank you.") - -/mob/observer/dead/examine_icon() - var/icon/I = get_cached_examine_icon(src) - if(!I) - I = getFlatIcon(src, defdir = SOUTH, no_anim = TRUE) - set_cached_examine_icon(src, I, 200 SECONDS) - return I - -/mob/observer/dead/examine(mob/user) - . = ..() - - if(is_admin(user)) - . += "\t>[ADMIN_FULLMONTY(src)]" - -/* -Transfer_mind is there to check if mob is being deleted/not going to have a body. -Works together with spawning an observer, noted above. -*/ - -/mob/observer/dead/Life() - ..() - if(!loc) return - if(!client) return 0 - - handle_regular_hud_updates() - handle_vision() - -/mob/proc/ghostize(var/can_reenter_corpse = 1) - if(key) - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.vr_holder && !can_reenter_corpse) - H.exit_vr() - return 0 - var/mob/observer/dead/ghost = new(src) //Transfer safety to observer spawning proc. - ghost.can_reenter_corpse = can_reenter_corpse - ghost.timeofdeath = src.timeofdeath //BS12 EDIT - ghost.key = key - if(istype(loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = loc - M.update() - else if(istype(loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = loc - B.update() - if(ghost.client) - ghost.client.time_died_as_mouse = ghost.timeofdeath - if(ghost.client && !ghost.client.holder && !config.antag_hud_allowed) // For new ghosts we remove the verb from even showing up if it's not allowed. - ghost.verbs -= /mob/observer/dead/verb/toggle_antagHUD // Poor guys, don't know what they are missing! - return ghost - -/* -This is the proc mobs get to turn into a ghost. Forked from ghostize due to compatibility issues. -*/ -/mob/living/verb/ghost() - set category = "OOC" - set name = "Ghost" - set desc = "Relinquish your life and enter the land of the dead." - - if(stat == DEAD && !forbid_seeing_deadchat) - announce_ghost_joinleave(ghostize(1)) - else - var/response - if(src.client && src.client.holder) - response = alert(src, "You have the ability to Admin-Ghost. The regular Ghost verb will announce your presence to dead chat. Both variants will allow you to return to your body using 'aghost'.\n\nWhat do you wish to do?", "Are you sure you want to ghost?", "Ghost", "Admin Ghost", "Stay in body") - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. If you ghost, you won't be able to play this round until you respawn as a new character! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body") - if(response != "Ghost") - return - resting = 1 - var/turf/location = get_turf(src) - var/special_role = check_special_role() - if(!istype(loc,/obj/machinery/cryopod)) - log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) - else if(special_role) - log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) - var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 - if(ghost) - ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. - ghost.set_respawn_timer() - announce_ghost_joinleave(ghost) - -/mob/observer/dead/can_use_hands() return 0 -/mob/observer/dead/is_active() return 0 - -/mob/observer/dead/Stat() - ..() - if(statpanel("Status")) - if(emergency_shuttle) - var/eta_status = emergency_shuttle.get_status_panel_eta() - if(eta_status) - stat(null, eta_status) - -/mob/observer/dead/verb/reenter_corpse() - set category = "Ghost" - set name = "Re-enter Corpse" - if(!client) return - if(!(mind && mind.current && can_reenter_corpse)) - to_chat(src, "You have no body.") - return - if(mind.current.key && copytext(mind.current.key,1,2)!="@") //makes sure we don't accidentally kick any clients - to_chat(usr, "Another consciousness is in your body... it is resisting you.") - return - if(mind.current.ajourn && mind.current.stat != DEAD) //check if the corpse is astral-journeying (it's client ghosted using a cultist rune). - var/found_rune - for(var/obj/effect/rune/R in mind.current.loc) //whilst corpse is alive, we can only reenter the body if it's on the rune - if(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"]) // Found an astral journey rune. - found_rune = 1 - break - if(!found_rune) - to_chat(usr, "The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.") - return - mind.current.ajourn=0 - mind.current.key = key - mind.current.teleop = null - if(istype(mind.current.loc, /obj/structure/morgue)) - var/obj/structure/morgue/M = mind.current.loc - M.update(1) - else if(istype(mind.current.loc, /obj/structure/closet/body_bag)) - var/obj/structure/closet/body_bag/B = mind.current.loc - B.update(1) - if(!admin_ghosted) - announce_ghost_joinleave(mind, 0, "They now occupy their body again.") - return 1 - -/mob/observer/dead/verb/toggle_medHUD() - set category = "Ghost" - set name = "Toggle MedicHUD" - set desc = "Toggles Medical HUD allowing you to see how everyone is doing" - - medHUD = !medHUD - plane_holder.set_vis(VIS_CH_HEALTH, medHUD) - plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD) - to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_secHUD() - set category = "Ghost" - set name = "Toggle Security HUD" - set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc" - - secHUD = !secHUD - plane_holder.set_vis(VIS_CH_ID, secHUD) - plane_holder.set_vis(VIS_CH_WANTED, secHUD) - plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD) - plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD) - plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD) - to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/verb/toggle_antagHUD() - set category = "Ghost" - set name = "Toggle AntagHUD" - set desc = "Toggles AntagHUD allowing you to see who is the antagonist" - - if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") - return - if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") - return - if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) - var/response = alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?","Yes","No") - if(response == "No") return - can_reenter_corpse = FALSE - set_respawn_timer(-1) // Foreeeever - if(!has_enabled_antagHUD && !client.holder) - has_enabled_antagHUD = TRUE - - antagHUD = !antagHUD - plane_holder.set_vis(VIS_CH_SPECIAL, antagHUD) - to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") - -/mob/observer/dead/proc/dead_tele(var/area/A in return_sorted_areas()) - set category = "Ghost" - set name = "Teleport" - set desc = "Teleport to a location" - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - if(!A) - A = input(usr, "Select an area:", "Ghost Teleport") as null|anything in return_sorted_areas() - if(!A) - return - - usr.forceMove(pick(get_area_turfs(A))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(input in getmobs()) - set category = "Ghost" - set name = "Follow" // "Haunt" - set desc = "Follow and haunt a mob." - - if(!input) - input = input(usr, "Select a mob:", "Ghost Follow") as null|anything in getmobs() - if(!input) - return - - var/target = getmobs()[input] - if(!target) return - ManualFollow(target) - -// This is the ghost's follow verb with an argument -/mob/observer/dead/proc/ManualFollow(var/atom/movable/target) - if(!target) - return - - var/turf/targetloc = get_turf(target) - if(check_holy(targetloc)) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - forceMove(get_turf(target)) - var/mob/M = target - M.following_mobs += src - else - spawn(0) - while(target && following == target && client) - var/turf/T = get_turf(target) - if(!T) - break - // To stop the ghost flickering. - if(loc != T) - forceMove(T) - sleep(15) - - var/icon/I = icon(target.icon,target.icon_state,target.dir) - - var/orbitsize = (I.Width()+I.Height())*0.5 - orbitsize -= (orbitsize/world.icon_size)*(world.icon_size*0.25) - - var/rot_seg - - /* We don't have this pref yet - switch(ghost_orbit) - if(GHOST_ORBIT_TRIANGLE) - rot_seg = 3 - if(GHOST_ORBIT_SQUARE) - rot_seg = 4 - if(GHOST_ORBIT_PENTAGON) - rot_seg = 5 - if(GHOST_ORBIT_HEXAGON) - rot_seg = 6 - else //Circular - rot_seg = 36 //360/10 bby, smooth enough aproximation of a circle - */ - - orbit(target, orbitsize, FALSE, 20, rot_seg) - -/mob/observer/dead/orbit() - set_dir(2) //reset dir so the right directional sprites show up - return ..() - -/mob/observer/dead/stop_orbit() - . = ..() - //restart our floating animation after orbit is done. - pixel_y = 0 - pixel_x = 0 - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - -/mob/observer/dead/proc/stop_following() - following = null - stop_orbit() - -/mob/proc/update_following() - . = get_turf(src) - for(var/mob/observer/dead/M in following_mobs) - if(M.following != src) - following_mobs -= M - else - if(M.loc != .) - M.forceMove(.) - -/mob - var/list/following_mobs = list() - -/mob/Destroy() - for(var/mob/observer/dead/M in following_mobs) - M.stop_following() - following_mobs = null - return ..() - -/mob/observer/dead/Destroy() - if(ismob(following)) - var/mob/M = following - M.following_mobs -= src - stop_following() - return ..() - -/mob/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - update_following() - -/mob/Life() - // to catch teleports etc which directly set loc - update_following() - return ..() - -/mob/proc/check_holy(var/turf/T) - return 0 - -/mob/observer/dead/check_holy(var/turf/T) - if(check_rights(R_ADMIN|R_FUN|R_EVENT, 0, src)) - return 0 - - return (T && T.holy) && (is_manifest || (mind in cult.current_antagonists)) - -/mob/observer/dead/verb/jumptomob(input in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak - set category = "Ghost" - set name = "Jump to Mob" - set desc = "Teleport to a mob" - set popup_menu = FALSE - - if(!istype(usr, /mob/observer/dead)) //Make sure they're an observer! - return - - if(!input) - input = input(usr, "Select a mob:", "Ghost Jump") as null|anything in getmobs() - if(!input) - return - - var/target = getmobs()[input] - if (!target)//Make sure we actually have a target - return - else - var/mob/M = target //Destination mob - var/turf/T = get_turf(M) //Turf of the destination mob - - if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - forceMove(T) - stop_following() - else - to_chat(src, "This mob is not located in the game world.") - -/mob/observer/dead/memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/add_memory() - set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") - -/mob/observer/dead/Post_Incorpmove() - stop_following() - -/mob/observer/dead/verb/analyze_air() - set name = "Analyze Air" - set category = "Ghost" - - if(!istype(usr, /mob/observer/dead)) return - - // Shamelessly copied from the Gas Analyzers - if (!( istype(usr.loc, /turf) )) - return - - var/datum/gas_mixture/environment = usr.loc.return_air() - - var/pressure = environment.return_pressure() - var/total_moles = environment.total_moles - - to_chat(src, "Results:") - if(abs(pressure - ONE_ATMOSPHERE) < 10) - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - else - to_chat(src, "Pressure: [round(pressure,0.1)] kPa") - if(total_moles) - for(var/g in environment.gas) - to_chat(src, "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)") - to_chat(src, "Temperature: [round(environment.temperature-T0C,0.1)]°C ([round(environment.temperature,0.1)]K)") - to_chat(src, "Heat Capacity: [round(environment.heat_capacity(),0.1)]") - -/mob/observer/dead/verb/check_radiation() - set name = "Check Radiation" - set category = "Ghost" - - var/turf/t = get_turf(src) - if(t) - var/rads = SSradiation.get_rads_at_turf(t) - to_chat(src, "Radiation level: [rads ? rads : "0"] Bq.") - - -/mob/observer/dead/verb/become_mouse() - set name = "Become mouse" - set category = "Ghost" - - if(config.disable_player_mice) - to_chat(src, "Spawning as a mouse is currently disabled.") - return - - if(!MayRespawn(1)) - return - - var/turf/T = get_turf(src) - if(!T || (T.z in using_map.admin_levels)) - to_chat(src, "You may not spawn as a mouse on this Z-level.") - return - - var/timedifference = world.time - client.time_died_as_mouse - if(client.time_died_as_mouse && timedifference <= mouse_respawn_time * 600) - var/timedifference_text - timedifference_text = time2text(mouse_respawn_time * 600 - timedifference,"mm:ss") - to_chat(src, "You may only spawn again as a mouse more than [mouse_respawn_time] minutes after your death. You have [timedifference_text] left.") - return - - var/response = alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?","Squeek!","Nope!") - if(response != "Squeek!") return //Hit the wrong key...again. - - - //find a viable mouse candidate - var/mob/living/simple_mob/animal/passive/mouse/host - var/obj/machinery/atmospherics/unary/vent_pump/vent_found - var/list/found_vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/v in machines) - if(!v.welded && v.z == T.z && v.network && v.network.normal_members.len > 20) - found_vents.Add(v) - if(found_vents.len) - vent_found = pick(found_vents) - host = new /mob/living/simple_mob/animal/passive/mouse(vent_found) - else - to_chat(src, "Unable to find any unwelded vents to spawn mice at.") - - if(host) - if(config.uneducated_mice) - host.universal_understand = 0 - announce_ghost_joinleave(src, 0, "They are now a mouse.") - host.ckey = src.ckey - host.add_ventcrawl(vent_found) - to_chat(host, "You are now a mouse. Try to avoid interaction with players, and do not give hints away that you are more than a simple rodent.") - -/mob/observer/dead/verb/view_manfiest() - set name = "Show Crew Manifest" - set category = "Ghost" - - var/dat - dat += "
"
- for(var/t in typesof(/area))
- master += text("[]\n", t)
- //Foreach goto(26)
- src << browse(master)
- return
-*/
-
-/mob/verb/memory()
- set name = "Notes"
- set category = "IC"
- if(mind)
- mind.show_memory(src)
- else
- to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
-
-/mob/verb/add_memory(msg as message)
- set name = "Add Note"
- set category = "IC"
-
- msg = sanitize(msg)
-
- if(mind)
- mind.store_memory(msg)
- else
- to_chat(src, "The game appears to have misplaced your mind datum, so we can't show you your notes.")
-
-/mob/proc/store_memory(msg as message, popup, sane = 1)
- msg = copytext(msg, 1, MAX_MESSAGE_LEN)
-
- if (sane)
- msg = sanitize(msg)
-
- if (length(memory) == 0)
- memory += msg
- else
- memory += "
[msg]"
-
- if (popup)
- memory()
-
-/mob/proc/update_flavor_text()
- set src in usr
- if(usr != src)
- to_chat(usr, "No.")
- var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes
-
- if(msg != null)
- flavor_text = msg
-
-/mob/proc/warn_flavor_changed()
- if(flavor_text && flavor_text != "") // don't spam people that don't use it!
- to_chat(src, "OOC Warning:
")
- to_chat(src, "Your flavor text is likely out of date! Change")
-
-/mob/proc/print_flavor_text()
- if (flavor_text && flavor_text != "")
- var/msg = replacetext(flavor_text, "\n", " ")
- if(length(msg) <= 40)
- return "[msg]"
- else
- return "[copytext_preserve_html(msg, 1, 37)]... More..."
-
-/*
-/mob/verb/help()
- set name = "Help"
- src << browse('html/help.html', "window=help")
- return
-*/
-
-/mob/proc/set_respawn_timer(var/time)
- // Try to figure out what time to use
-
- // Special cases, can never respawn
- if(ticker?.mode?.deny_respawn)
- time = -1
- else if(!config.abandon_allowed)
- time = -1
- else if(!config.respawn)
- time = -1
-
- // Special case for observing before game start
- else if(ticker?.current_state <= GAME_STATE_SETTING_UP)
- time = 1 MINUTE
-
- // Wasn't given a time, use the config time
- else if(!time)
- time = config.respawn_time
-
- var/keytouse = ckey
- // Try harder to find a key to use
- if(!keytouse && key)
- keytouse = ckey(key)
- else if(!keytouse && mind?.key)
- keytouse = ckey(mind.key)
-
- GLOB.respawn_timers[keytouse] = world.time + time
-
-/mob/observer/dead/set_respawn_timer()
- if(config.antag_hud_restricted && has_enabled_antagHUD)
- ..(-1)
- else
- return // Don't set it, no need
-
-/mob/verb/abandon_mob()
- set name = "Return to Menu"
- set category = "OOC"
-
- if(stat != DEAD || !ticker)
- to_chat(usr, "You must be dead to use this!")
- return
-
- // Final chance to abort "respawning"
- if(mind && timeofdeath) // They had spawned before
- var/choice = alert(usr, "Returning to the menu will prevent your character from being revived in-round. Are you sure?", "Confirmation", "No, wait", "Yes, leave")
- if(choice == "No, wait")
- return
-
- // Beyond this point, you're going to respawn
- to_chat(usr, config.respawn_message)
-
- if(!client)
- log_game("[usr.key] AM failed due to disconnect.")
- return
- client.screen.Cut()
- client.screen += client.void
- if(!client)
- log_game("[usr.key] AM failed due to disconnect.")
- return
-
- announce_ghost_joinleave(client, 0)
-
- var/mob/new_player/M = new /mob/new_player()
- if(!client)
- log_game("[usr.key] AM failed due to disconnect.")
- qdel(M)
- return
-
- M.key = key
- if(M.mind)
- M.mind.reset()
- return
-
-/client/verb/changes()
- set name = "Changelog"
- set category = "OOC"
- src << browse('html/changelog.html', "window=changes;size=675x650")
- if(prefs.lastchangelog != changelog_hash)
- prefs.lastchangelog = changelog_hash
- SScharacter_setup.queue_preferences_save(prefs)
- winset(src, "rpane.changelog", "background-color=none;font-style=;")
-
-/mob/verb/observe()
- set name = "Observe"
- set category = "OOC"
- var/is_admin = 0
-
- if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT))
- is_admin = 1
- else if(stat != DEAD || istype(src, /mob/new_player))
- to_chat(usr, "You must be observing to use this!")
- return
-
- if(is_admin && stat == DEAD)
- is_admin = 0
-
- var/list/targets = list()
-
-
- targets += observe_list_format(nuke_disks)
- targets += observe_list_format(all_singularities)
- targets += getmobs()
- targets += observe_list_format(sortAtom(mechas_list))
- targets += observe_list_format(SSshuttles.ships)
-
- client.perspective = EYE_PERSPECTIVE
-
- var/eye_name = null
-
- var/ok = "[is_admin ? "Admin Observe" : "Observe"]"
- eye_name = input("Please, select a player!", ok, null, null) as null|anything in targets
-
- if (!eye_name)
- return
-
- var/mob/mob_eye = targets[eye_name]
-
- if(client && mob_eye)
- client.eye = mob_eye
- if (is_admin)
- client.adminobs = 1
- if(mob_eye == client.mob || client.eye == client.mob)
- client.adminobs = 0
-
-/mob/verb/cancel_camera()
- set name = "Cancel Camera View"
- set category = "OOC"
- unset_machine()
- reset_view(null)
-
-/mob/Topic(href, href_list)
- if(href_list["mach_close"])
- var/t1 = text("window=[href_list["mach_close"]]")
- unset_machine()
- src << browse(null, t1)
-
- if(href_list["flavor_more"])
- usr << browse(text("[] []", name, replacetext(flavor_text, "\n", "
")), text("window=[];size=500x200", name))
- onclose(usr, "[name]")
- if(href_list["flavor_change"])
- update_flavor_text()
-// ..()
- return
-
-
-/mob/proc/pull_damage()
- return 0
-
-/mob/verb/stop_pulling()
-
- set name = "Stop Pulling"
- set category = "IC"
-
- if(pulling)
- if(ishuman(pulling))
- var/mob/living/carbon/human/H = pulling
- visible_message(SPAN_WARNING("\The [src] lets go of \the [H]."), SPAN_NOTICE("You let go of \the [H]."), exclude_mobs = list(H))
- if(!H.stat)
- to_chat(H, SPAN_WARNING("\The [src] lets go of you."))
- pulling.pulledby = null
- pulling = null
- if(pullin)
- pullin.icon_state = "pull0"
-
-/mob/proc/start_pulling(var/atom/movable/AM)
-
- if ( !AM || !usr || src==AM || !isturf(src.loc) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort!
- return
-
- if (AM.anchored)
- to_chat(src, "It won't budge!")
- return
-
- var/mob/M = AM
- if(ismob(AM))
-
- if(!can_pull_mobs || !can_pull_size)
- to_chat(src, "They won't budge!")
- return
-
- if((mob_size < M.mob_size) && (can_pull_mobs != MOB_PULL_LARGER))
- to_chat(src, "[M] is too large for you to move!")
- return
-
- if((mob_size == M.mob_size) && (can_pull_mobs == MOB_PULL_SMALLER))
- to_chat(src, "[M] is too heavy for you to move!")
- return
-
- // If your size is larger than theirs and you have some
- // kind of mob pull value AT ALL, you will be able to pull
- // them, so don't bother checking that explicitly.
-
- if(M.grabbed_by.len)
- // Only start pulling when nobody else has a grab on them
- . = 1
- for(var/obj/item/weapon/grab/G in M.grabbed_by)
- if(G.assailant != usr)
- . = 0
- else
- qdel(G)
- if(!.)
- to_chat(src, "Somebody has a grip on them!")
- return
-
- if(!iscarbon(src))
- M.LAssailant = null
- else
- M.LAssailant = usr
-
- else if(isobj(AM))
- var/obj/I = AM
- if(!can_pull_size || can_pull_size < I.w_class)
- to_chat(src, "It won't budge!")
- return
-
- if(pulling)
- var/pulling_old = pulling
- stop_pulling()
- // Are we pulling the same thing twice? Just stop pulling.
- if(pulling_old == AM)
- return
-
- src.pulling = AM
- AM.pulledby = src
-
- if(pullin)
- pullin.icon_state = "pull1"
-
- if(ishuman(AM))
- var/mob/living/carbon/human/H = AM
- if(H.lying) // If they're on the ground we're probably dragging their arms to move them
- visible_message(SPAN_WARNING("\The [src] leans down and grips \the [H]'s arms."), SPAN_NOTICE("You lean down and grip \the [H]'s arms."), exclude_mobs = list(H))
- if(!H.stat)
- to_chat(H, SPAN_WARNING("\The [src] leans down and grips your arms."))
- else //Otherwise we're probably just holding their arm to lead them somewhere
- visible_message(SPAN_WARNING("\The [src] grips \the [H]'s arm."), SPAN_NOTICE("You grip \the [H]'s arm."), exclude_mobs = list(H))
- if(!H.stat)
- to_chat(H, SPAN_WARNING("\The [src] grips your arm."))
- playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25) //Quieter than hugging/grabbing but we still want some audio feedback
-
- if(H.pull_damage())
- to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.")
-
- //Attempted fix for people flying away through space when cuffed and dragged.
- if(ismob(AM))
- var/mob/pulled = AM
- pulled.inertia_dir = 0
-
-/mob/proc/can_use_hands()
- return
-
-/mob/proc/is_active()
- return (0 >= usr.stat)
-
-/mob/proc/is_dead()
- return stat == DEAD
-
-/mob/proc/is_mechanical()
- if(mind && (mind.assigned_role == "Cyborg" || mind.assigned_role == "AI"))
- return 1
- return istype(src, /mob/living/silicon) || get_species() == "Machine"
-
-/mob/proc/is_ready()
- return client && !!mind
-
-/mob/proc/get_gender()
- return gender
-
-/mob/proc/see(message)
- if(!is_active())
- return 0
- to_chat(src,message)
- return 1
-
-/mob/proc/show_viewers(message)
- for(var/mob/M in viewers())
- M.see(message)
-
-/mob/Stat()
- ..()
- . = (is_client_active(10 MINUTES))
-
- if(.)
- if(statpanel("Status"))
- stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)")
- if(ticker && ticker.current_state != GAME_STATE_PREGAME)
- stat("Station Time", stationtime2text())
- stat("Station Date", stationdate2text())
- stat("Round Duration", roundduration2text())
-
- if(client.holder)
- if(statpanel("Status"))
- stat("Location:", "([x], [y], [z]) [loc]")
- stat("CPU:","[world.cpu]")
- stat("Instances:","[world.contents.len]")
- stat(null, "Time Dilation: [round(SStime_track.time_dilation_current,1)]% AVG:([round(SStime_track.time_dilation_avg_fast,1)]%, [round(SStime_track.time_dilation_avg,1)]%, [round(SStime_track.time_dilation_avg_slow,1)]%)")
-
- if(statpanel("MC"))
- stat("Location:", "([x], [y], [z]) [loc]")
- stat("CPU:","[world.cpu]")
- stat("Instances:","[world.contents.len]")
- stat("World Time:", world.time)
- stat("Real time of day:", REALTIMEOFDAY)
- stat(null)
- if(GLOB)
- GLOB.stat_entry()
- else
- stat("Globals:", "ERROR")
- if(Master)
- Master.stat_entry()
- else
- stat("Master Controller:", "ERROR")
- if(Failsafe)
- Failsafe.stat_entry()
- else
- stat("Failsafe Controller:", "ERROR")
- if(Master)
- stat(null)
- for(var/datum/controller/subsystem/SS in Master.subsystems)
- SS.stat_entry()
-
- if(statpanel("Tickets"))
- GLOB.ahelp_tickets.stat_entry()
-
-
- if(length(GLOB.sdql2_queries))
- if(statpanel("SDQL2"))
- stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj)
- for(var/i in GLOB.sdql2_queries)
- var/datum/SDQL2_query/Q = i
- Q.generate_stat()
-
- if(listed_turf && client)
- if(!TurfAdjacent(listed_turf))
- listed_turf = null
- else
- if(statpanel("Turf"))
- stat(listed_turf)
- for(var/atom/A in listed_turf)
- if(!A.mouse_opacity)
- continue
- if(A.invisibility > see_invisible)
- continue
- if(is_type_in_list(A, shouldnt_see))
- continue
- if(A.plane > plane)
- continue
- stat(A)
-
-
-// facing verbs
-/mob/proc/canface()
-// if(!canmove) return 0 //VOREStation Edit. Redundant check that only affects conscious proning, actual inability to turn and shift around handled by actual inabilities.
- if(stat) return 0
- if(anchored) return 0
- if(transforming) return 0
- return 1
-
-// Not sure what to call this. Used to check if humans are wearing an AI-controlled exosuit and hence don't need to fall over yet.
-/mob/proc/can_stand_overridden()
- return 0
-
-//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
-/mob/proc/update_canmove()
- return canmove
-
-
-/mob/proc/facedir(var/ndir)
- if(!canface() || (client && (client.moving || !checkMoveCooldown())))
- return 0
- set_dir(ndir)
- if(buckled && buckled.buckle_movable)
- buckled.set_dir(ndir)
- setMoveCooldown(movement_delay())
- return 1
-
-
-/mob/verb/eastface()
- set hidden = 1
- return facedir(client.client_dir(EAST))
-
-
-/mob/verb/westface()
- set hidden = 1
- return facedir(client.client_dir(WEST))
-
-
-/mob/verb/northface()
- set hidden = 1
- return facedir(client.client_dir(NORTH))
-
-
-/mob/verb/southface()
- set hidden = 1
- return facedir(client.client_dir(SOUTH))
-
-
-//This might need a rename but it should replace the can this mob use things check
-/mob/proc/IsAdvancedToolUser()
- return 0
-
-/mob/proc/Stun(amount)
- if(status_flags & CANSTUN)
- facing_dir = null
- stunned = max(max(stunned,amount),0) //can't go below 0, getting a low amount of stun doesn't lower your current stun
- update_canmove() //updates lying, canmove and icons
- return
-
-/mob/proc/SetStunned(amount) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
- if(status_flags & CANSTUN)
- stunned = max(amount,0)
- update_canmove() //updates lying, canmove and icons
- return
-
-/mob/proc/AdjustStunned(amount)
- if(status_flags & CANSTUN)
- stunned = max(stunned + amount,0)
- update_canmove() //updates lying, canmove and icons
- return
-
-/mob/proc/Weaken(amount)
- if(status_flags & CANWEAKEN)
- facing_dir = null
- weakened = max(max(weakened,amount),0)
- update_canmove() //updates lying, canmove and icons
- return
-
-/mob/proc/SetWeakened(amount)
- if(status_flags & CANWEAKEN)
- weakened = max(amount,0)
- update_canmove() //can you guess what this does yet?
- return
-
-/mob/proc/AdjustWeakened(amount)
- if(status_flags & CANWEAKEN)
- weakened = max(weakened + amount,0)
- update_canmove() //updates lying, canmove and icons
- return
-
-/mob/proc/Paralyse(amount)
- if(status_flags & CANPARALYSE)
- facing_dir = null
- paralysis = max(max(paralysis,amount),0)
- return
-
-/mob/proc/SetParalysis(amount)
- if(status_flags & CANPARALYSE)
- paralysis = max(amount,0)
- return
-
-/mob/proc/AdjustParalysis(amount)
- if(status_flags & CANPARALYSE)
- paralysis = max(paralysis + amount,0)
- return
-
-/mob/proc/Sleeping(amount)
- facing_dir = null
- sleeping = max(max(sleeping,amount),0)
- return
-
-/mob/proc/SetSleeping(amount)
- sleeping = max(amount,0)
- return
-
-/mob/proc/AdjustSleeping(amount)
- sleeping = max(sleeping + amount,0)
- return
-
-/mob/proc/Confuse(amount)
- confused = max(max(confused,amount),0)
- return
-
-/mob/proc/SetConfused(amount)
- confused = max(amount,0)
- return
-
-/mob/proc/AdjustConfused(amount)
- confused = max(confused + amount,0)
- return
-
-/mob/proc/Blind(amount)
- eye_blind = max(max(eye_blind,amount),0)
- return
-
-/mob/proc/SetBlinded(amount)
- eye_blind = max(amount,0)
- return
-
-/mob/proc/AdjustBlinded(amount)
- eye_blind = max(eye_blind + amount,0)
- return
-
-/mob/proc/Resting(amount)
- facing_dir = null
- resting = max(max(resting,amount),0)
- update_canmove()
- return
-
-/mob/proc/SetResting(amount)
- resting = max(amount,0)
- update_canmove()
- return
-
-/mob/proc/AdjustResting(amount)
- resting = max(resting + amount,0)
- update_canmove()
- return
-
-/mob/proc/AdjustLosebreath(amount)
- losebreath = CLAMP(losebreath + amount, 0, 25)
-
-/mob/proc/SetLosebreath(amount)
- losebreath = CLAMP(amount, 0, 25)
-
-/mob/proc/get_species()
- return ""
-
-/mob/proc/flash_weak_pain()
- flick("weak_pain",pain)
-
-/mob/proc/get_visible_implants(var/class = 0)
- var/list/visible_implants = list()
- for(var/obj/item/O in embedded)
- if(O.w_class > class)
- visible_implants += O
- return visible_implants
-
-/mob/proc/embedded_needs_process()
- return (embedded.len > 0)
-
-mob/proc/yank_out_object()
- set category = "Object"
- set name = "Yank out object"
- set desc = "Remove an embedded item at the cost of bleeding and pain."
- set src in view(1)
-
- if(!isliving(usr) || !usr.checkClickCooldown())
- return
- usr.setClickCooldown(20)
-
- if(usr.stat == 1)
- to_chat(usr, "You are unconcious and cannot do that!")
- return
-
- if(usr.restrained())
- to_chat(usr, "You are restrained and cannot do that!")
- return
-
- var/mob/S = src
- var/mob/U = usr
- var/list/valid_objects = list()
- var/self = null
-
- if(S == U)
- self = 1 // Removing object from yourself.
-
- valid_objects = get_visible_implants(0)
- if(!valid_objects.len)
- if(self)
- to_chat(src, "You have nothing stuck in your body that is large enough to remove.")
- else
- to_chat(U, "[src] has nothing stuck in their wounds that is large enough to remove.")
- return
-
- var/obj/item/weapon/selection = input("What do you want to yank out?", "Embedded objects") in valid_objects
-
- if(self)
- to_chat(src, "You attempt to get a good grip on [selection] in your body.")
- else
- to_chat(U, "You attempt to get a good grip on [selection] in [S]'s body.")
-
- if(!do_after(U, 30))
- return
- if(!selection || !S || !U)
- return
-
- if(self)
- visible_message("[src] rips [selection] out of their body.","You rip [selection] out of your body.")
- else
- visible_message("[usr] rips [selection] out of [src]'s body.","[usr] rips [selection] out of your body.")
- valid_objects = get_visible_implants(0)
- if(valid_objects.len == 1) //Yanking out last object - removing verb.
- src.verbs -= /mob/proc/yank_out_object
- clear_alert("embeddedobject")
-
- if(ishuman(src))
- var/mob/living/carbon/human/H = src
- var/obj/item/organ/external/affected
-
- for(var/obj/item/organ/external/organ in H.organs) //Grab the organ holding the implant.
- for(var/obj/item/O in organ.implants)
- if(O == selection)
- affected = organ
-
- affected.implants -= selection
- H.shock_stage+=20
- affected.take_damage((selection.w_class * 3), 0, 0, 1, "Embedded object extraction")
-
- if(prob(selection.w_class * 5) && (affected.robotic < ORGAN_ROBOT)) //I'M SO ANEMIC I COULD JUST -DIE-.
- var/datum/wound/internal_bleeding/I = new (min(selection.w_class * 5, 15))
- affected.wounds += I
- H.custom_pain("Something tears wetly in your [affected] as [selection] is pulled free!", 50)
-
- if (ishuman(U))
- var/mob/living/carbon/human/human_user = U
- human_user.bloody_hands(H)
-
- else if(issilicon(src))
- var/mob/living/silicon/robot/R = src
- R.embedded -= selection
- R.adjustBruteLoss(5)
- R.adjustFireLoss(10)
-
- selection.forceMove(get_turf(src))
- U.put_in_hands(selection)
-
- for(var/obj/item/weapon/O in pinned)
- if(O == selection)
- pinned -= O
- if(!pinned.len)
- anchored = 0
- return 1
-
-//Check for brain worms in head.
-/mob/proc/has_brain_worms()
-
- for(var/I in contents)
- if(istype(I,/mob/living/simple_mob/animal/borer))
- return I
-
- return 0
-
-/mob/proc/updateicon()
- return
-
-// Please always use this proc, never just set the var directly.
-/mob/proc/set_stat(var/new_stat)
- . = (stat != new_stat)
- stat = new_stat
-
-/mob/verb/face_direction()
-
- set name = "Face Direction"
- set category = "IC"
- set src = usr
-
- set_face_dir()
-
- if(!facing_dir)
- to_chat(usr, "You are now not facing anything.")
- else
- to_chat(usr, "You are now facing [dir2text(facing_dir)].")
-
-/mob/proc/set_face_dir(var/newdir)
- if(newdir == facing_dir)
- facing_dir = null
- else if(newdir)
- set_dir(newdir)
- facing_dir = newdir
- else if(facing_dir)
- facing_dir = null
- else
- set_dir(dir)
- facing_dir = dir
-
-/mob/set_dir()
- if(facing_dir)
- if(!canface() || lying || buckled || restrained())
- facing_dir = null
- else if(dir != facing_dir)
- return ..(facing_dir)
- else
- return ..()
-
-/mob/verb/northfaceperm()
- set hidden = 1
- set_face_dir(client.client_dir(NORTH))
-
-/mob/verb/southfaceperm()
- set hidden = 1
- set_face_dir(client.client_dir(SOUTH))
-
-/mob/verb/eastfaceperm()
- set hidden = 1
- set_face_dir(client.client_dir(EAST))
-
-/mob/verb/westfaceperm()
- set hidden = 1
- set_face_dir(client.client_dir(WEST))
-
-// Begin VOREstation edit
-/mob/verb/shiftnorth()
- set hidden = TRUE
- if(!canface())
- return FALSE
- if(pixel_y <= (default_pixel_y + 16))
- pixel_y++
- is_shifted = TRUE
-
-/mob/verb/shiftsouth()
- set hidden = TRUE
- if(!canface())
- return FALSE
- if(pixel_y >= (default_pixel_y - 16))
- pixel_y--
- is_shifted = TRUE
-
-/mob/verb/shiftwest()
- set hidden = TRUE
- if(!canface())
- return FALSE
- if(pixel_x >= (default_pixel_x - 16))
- pixel_x--
- is_shifted = TRUE
-
-mob/verb/shifteast()
- set hidden = TRUE
- if(!canface())
- return FALSE
- if(pixel_x <= (default_pixel_x + 16))
- pixel_x++
- is_shifted = TRUE
-// End VOREstation edit
-
-/mob/proc/adjustEarDamage()
- return
-
-/mob/proc/setEarDamage()
- return
-
-// Set client view distance (size of client's screen). Returns TRUE if anything changed.
-/mob/proc/set_viewsize(var/new_view = world.view)
- if (client && new_view != client.view)
- client.view = new_view
- return TRUE
- return FALSE
-
-//Throwing stuff
-
-/mob/proc/toggle_throw_mode()
- if (src.in_throw_mode)
- throw_mode_off()
- else
- throw_mode_on()
-
-/mob/proc/throw_mode_off()
- src.in_throw_mode = 0
- if(src.throw_icon) //in case we don't have the HUD and we use the hotkey
- src.throw_icon.icon_state = "act_throw_off"
-
-/mob/proc/throw_mode_on()
- src.in_throw_mode = 1
- if(src.throw_icon)
- src.throw_icon.icon_state = "act_throw_on"
-
-/mob/proc/isSynthetic()
- return 0
-
-/mob/proc/is_muzzled()
- return 0
-
-//Exploitable Info Update
-
-/mob/proc/amend_exploitable(var/obj/item/I)
- if(istype(I))
- exploit_addons |= I
- var/exploitmsg = html_decode("\n" + "Has " + I.name + ".")
- exploit_record += exploitmsg
-
-/client/proc/check_has_body_select()
- return mob && mob.hud_used && istype(mob.zone_sel, /obj/screen/zone_sel)
-
-/client/verb/body_toggle_head()
- set name = "body-toggle-head"
- set hidden = 1
- toggle_zone_sel(list(BP_HEAD, O_EYES, O_MOUTH))
-
-/client/verb/body_r_arm()
- set name = "body-r-arm"
- set hidden = 1
- toggle_zone_sel(list(BP_R_ARM,BP_R_HAND))
-
-/client/verb/body_l_arm()
- set name = "body-l-arm"
- set hidden = 1
- toggle_zone_sel(list(BP_L_ARM,BP_L_HAND))
-
-/client/verb/body_chest()
- set name = "body-chest"
- set hidden = 1
- toggle_zone_sel(list(BP_TORSO))
-
-/client/verb/body_groin()
- set name = "body-groin"
- set hidden = 1
- toggle_zone_sel(list(BP_GROIN))
-
-/client/verb/body_r_leg()
- set name = "body-r-leg"
- set hidden = 1
- toggle_zone_sel(list(BP_R_LEG,BP_R_FOOT))
-
-/client/verb/body_l_leg()
- set name = "body-l-leg"
- set hidden = 1
- toggle_zone_sel(list(BP_L_LEG,BP_L_FOOT))
-
-/client/proc/toggle_zone_sel(list/zones)
- if(!check_has_body_select())
- return
- var/obj/screen/zone_sel/selector = mob.zone_sel
- selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones))
-
-// This handles setting the client's color variable, which makes everything look a specific color.
-// This proc is here so it can be called without needing to check if the client exists, or if the client relogs.
-// This is for inheritence since /mob/living will serve most cases. If you need ghosts to use this you'll have to implement that yourself.
-/mob/proc/update_client_color()
- if(client && client.color)
- animate(client, color = null, time = 10)
- return
-
-/mob/proc/swap_hand()
- return
-
-//Throwing stuff
-/mob/proc/throw_item(atom/target)
- return
-
-/mob/proc/will_show_tooltip()
- if(alpha <= EFFECTIVE_INVIS)
- return FALSE
- return TRUE
-
-/mob/MouseEntered(location, control, params)
- if(usr != src && usr.is_preference_enabled(/datum/client_preference/mob_tooltips) && src.will_show_tooltip())
- openToolTip(user = usr, tip_src = src, params = params, title = get_nametag_name(usr), content = get_nametag_desc(usr))
-
- ..()
-
-/mob/MouseDown()
- closeToolTip(usr) //No reason not to, really
-
- ..()
-
-/mob/MouseExited()
- closeToolTip(usr) //No reason not to, really
-
- ..()
-
-// Manages a global list of mobs with clients attached, indexed by z-level.
-/mob/proc/update_client_z(new_z) // +1 to register, null to unregister.
- if(registered_z != new_z)
- if(registered_z)
- GLOB.players_by_zlevel[registered_z] -= src
- if(client)
- if(new_z)
- GLOB.players_by_zlevel[new_z] += src
- registered_z = new_z
- else
- registered_z = null
-
-GLOBAL_LIST_EMPTY(living_players_by_zlevel)
-/mob/living/update_client_z(new_z)
- var/precall_reg_z = registered_z
- . = ..() // will update registered_z if necessary
- if(precall_reg_z != registered_z) // parent did work, let's do work too
- if(precall_reg_z)
- GLOB.living_players_by_zlevel[precall_reg_z] -= src
- if(registered_z)
- GLOB.living_players_by_zlevel[registered_z] += src
-
-/mob/onTransitZ(old_z, new_z)
- ..()
- update_client_z(new_z)
-
-/mob/cloak()
- . = ..()
- if(client && cloaked_selfimage)
- client.images += cloaked_selfimage
-
-/mob/uncloak()
- if(client && cloaked_selfimage)
- client.images -= cloaked_selfimage
- return ..()
-
-/mob/get_cloaked_selfimage()
- var/icon/selficon = getCompoundIcon(src)
- selficon.MapColors(0,0,0, 0,0,0, 0,0,0, 1,1,1) //White
- var/image/selfimage = image(selficon)
- selfimage.color = "#0000FF"
- selfimage.alpha = 100
- selfimage.layer = initial(layer)
- selfimage.plane = initial(plane)
- selfimage.loc = src
-
- return selfimage
-
-/mob/proc/GetAltName()
- return ""
-
-/mob/proc/get_ghost(even_if_they_cant_reenter = 0)
- if(mind)
- return mind.get_ghost(even_if_they_cant_reenter)
-
-/mob/proc/grab_ghost(force)
- if(mind)
- return mind.grab_ghost(force = force)
-=======
/mob/Destroy()//This makes sure that mobs withGLOB.clients/keys are not just deleted from the game.
mob_list -= src
dead_mob_list -= src
@@ -1267,8 +40,8 @@ GLOBAL_LIST_EMPTY(living_players_by_zlevel)
else
living_mob_list += src
lastarea = get_area(src)
+ hook_vr("mob_new",list(src)) //VOREStation Code
update_transform() // Some mobs may start bigger or smaller than normal.
- update_emotes()
return ..()
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
@@ -1518,7 +291,7 @@ GLOBAL_LIST_EMPTY(living_players_by_zlevel)
set src in usr
if(usr != src)
to_chat(usr, "No.")
- var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0)
+ var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb.","Flavor Text",html_decode(flavor_text)) as message|null, extra = 0) //VOREStation Edit: separating out OOC notes
if(msg != null)
flavor_text = msg
@@ -1867,6 +640,7 @@ GLOBAL_LIST_EMPTY(living_players_by_zlevel)
if(statpanel("Tickets"))
GLOB.ahelp_tickets.stat_entry()
+
if(length(GLOB.sdql2_queries))
if(statpanel("SDQL2"))
stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj)
@@ -1887,12 +661,14 @@ GLOBAL_LIST_EMPTY(living_players_by_zlevel)
continue
if(is_type_in_list(A, shouldnt_see))
continue
+ if(A.plane > plane)
+ continue
stat(A)
// facing verbs
/mob/proc/canface()
- if(!canmove) return 0
+// if(!canmove) return 0 //VOREStation Edit. Redundant check that only affects conscious proning, actual inability to turn and shift around handled by actual inabilities.
if(stat) return 0
if(anchored) return 0
if(transforming) return 0
@@ -2230,6 +1006,40 @@ mob/proc/yank_out_object()
set hidden = 1
set_face_dir(client.client_dir(WEST))
+// Begin VOREstation edit
+/mob/verb/shiftnorth()
+ set hidden = TRUE
+ if(!canface())
+ return FALSE
+ if(pixel_y <= (default_pixel_y + 16))
+ pixel_y++
+ is_shifted = TRUE
+
+/mob/verb/shiftsouth()
+ set hidden = TRUE
+ if(!canface())
+ return FALSE
+ if(pixel_y >= (default_pixel_y - 16))
+ pixel_y--
+ is_shifted = TRUE
+
+/mob/verb/shiftwest()
+ set hidden = TRUE
+ if(!canface())
+ return FALSE
+ if(pixel_x >= (default_pixel_x - 16))
+ pixel_x--
+ is_shifted = TRUE
+
+mob/verb/shifteast()
+ set hidden = TRUE
+ if(!canface())
+ return FALSE
+ if(pixel_x <= (default_pixel_x + 16))
+ pixel_x++
+ is_shifted = TRUE
+// End VOREstation edit
+
/mob/proc/adjustEarDamage()
return
@@ -2367,6 +1177,16 @@ mob/proc/yank_out_object()
else
registered_z = null
+GLOBAL_LIST_EMPTY(living_players_by_zlevel)
+/mob/living/update_client_z(new_z)
+ var/precall_reg_z = registered_z
+ . = ..() // will update registered_z if necessary
+ if(precall_reg_z != registered_z) // parent did work, let's do work too
+ if(precall_reg_z)
+ GLOB.living_players_by_zlevel[precall_reg_z] -= src
+ if(registered_z)
+ GLOB.living_players_by_zlevel[registered_z] += src
+
/mob/onTransitZ(old_z, new_z)
..()
update_client_z(new_z)
@@ -2403,4 +1223,3 @@ mob/proc/yank_out_object()
/mob/proc/grab_ghost(force)
if(mind)
return mind.grab_ghost(force = force)
->>>>>>> fdabe51... Linter Introduction + Cleanup (#8085)
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index e594b6514f..55b88bd8db 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -212,15 +212,9 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins
// Sadly, we can't use a switch statement here due to not using a constant value for the current map's centcom name.
if(destination == using_map.boss_name)
message_admins(sender, "[uppertext(using_map.boss_short)] FAX", rcvdcopy, "CentComFaxReply", "#006100")
-<<<<<<< HEAD
- else if (destination == "Virgo-Prime Governmental Authority") // Vorestation Edit
- message_admins(sender, "VIRGO GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0")
- else if (destination == "Supply")
-=======
- else if(destination == "Sif Governmental Authority")
- message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0")
+ else if(destination == "Virgo-Prime Governmental Authority") // Vorestation Edit
+ message_admins(sender, "VIRGO GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0") // Vorestation Edit
else if(destination == "Supply")
->>>>>>> fdabe51... Linter Introduction + Cleanup (#8085)
message_admins(sender, "[uppertext(using_map.boss_short)] SUPPLY FAX", rcvdcopy, "CentComFaxReply", "#5F4519")
else
message_admins(sender, "[uppertext(destination)] FAX", rcvdcopy, "UNKNOWN")
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 1fdf44119d..08d68d8956 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -359,7 +359,6 @@
/obj/item/device/destTagger/attack_self(mob/user as mob)
tgui_interact(user)
-<<<<<<< HEAD
/obj/item/device/destTagger/tgui_act(action, params)
if(..())
return TRUE
@@ -371,13 +370,6 @@
return FALSE
currTag = new_tag
. = TRUE
-=======
- Topic(href, href_list)
- src.add_fingerprint(usr)
- if(href_list["nextTag"] && (href_list["nextTag"] in GLOB.tagger_locations))
- src.currTag = href_list["nextTag"]
- openwindow(usr)
->>>>>>> fdabe51... Linter Introduction + Cleanup (#8085)
/obj/machinery/disposal/deliveryChute
name = "Delivery chute"
diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm
index ee35dd2657..af9d10d444 100644
--- a/code/modules/shieldgen/shield_gen.dm
+++ b/code/modules/shieldgen/shield_gen.dm
@@ -121,25 +121,6 @@
"max_charge" = C.max_charge,
"failing" = (C.time_since_fail <= 2),
)))
-<<<<<<< HEAD
-
- data["lockedData"]["active"] = active
- data["lockedData"]["failing"] = (time_since_fail <= 2)
- data["lockedData"]["radius"] = field_radius
- data["lockedData"]["max_radius"] = max_field_radius
- data["lockedData"]["z_range"] = z_range
- data["lockedData"]["max_z_range"] = 10
- data["lockedData"]["average_field_strength"] = average_field_strength
- data["lockedData"]["target_field_strength"] = target_field_strength
- data["lockedData"]["max_field_strength"] = max_field_strength
- data["lockedData"]["shields"] = LAZYLEN(field)
- data["lockedData"]["upkeep"] = round(field.len * max(average_field_strength * dissipation_rate, min_dissipation) / energy_conversion_rate)
- data["lockedData"]["strengthen_rate"] = strengthen_rate
- data["lockedData"]["max_strengthen_rate"] = max_strengthen_rate
- data["lockedData"]["gen_power"] = round(field.len * min(strengthen_rate, target_field_strength - average_field_strength) / energy_conversion_rate)
-
- return data
-=======
lockedData["capacitors"] = caps
lockedData["active"] = active
@@ -158,7 +139,6 @@
lockedData["gen_power"] = round(field.len * min(strengthen_rate, target_field_strength - average_field_strength) / energy_conversion_rate)
return list("locked" = locked, "lockedData" = lockedData)
->>>>>>> fdabe51... Linter Introduction + Cleanup (#8085)
/obj/machinery/shield_gen/process()
if (!anchored && active)