From 1e7cbec2e378eb4e2c5e7b254f32c9fa13a2faff Mon Sep 17 00:00:00 2001 From: Novacat <35587478+Novacat@users.noreply.github.com> Date: Thu, 15 Dec 2022 15:24:36 -0500 Subject: [PATCH 1/8] Missing href token adds --- code/ZAS/Variable Settings.dm | 2 +- code/controllers/subsystems/inactivity.dm | 2 +- code/controllers/subsystems/vote.dm | 8 +- code/datums/datumvars.dm | 2 +- code/datums/mind.dm | 12 +- code/game/antagonist/alien/borer.dm | 4 +- code/game/antagonist/antagonist_panel.dm | 14 +- code/game/antagonist/station/traitor.dm | 2 +- code/game/atoms.dm | 19 +- code/game/machinery/cryopod.dm | 2 +- code/game/magic/archived_book.dm | 25 + code/game/objects/effects/chem/chemsmoke.dm | 4 +- .../objects/effects/decals/Cleanable/fuel.dm | 2 +- code/game/objects/explosion.dm | 2 +- code/game/objects/items/blueprints_vr.dm | 6 +- .../objects/items/devices/transfer_valve.dm | 10 +- code/game/objects/items/weapons/explosives.dm | 4 +- .../objects/items/weapons/implants/implant.dm | 2 +- code/modules/admin/DB ban/functions.dm | 6 +- code/modules/admin/NewBan.dm | 2 +- code/modules/admin/admin.dm | 300 ++--- code/modules/admin/admin_report.dm | 4 +- code/modules/admin/admin_verbs_vr.dm | 53 +- code/modules/admin/create_mob.dm | 2 +- code/modules/admin/create_object.dm | 12 +- code/modules/admin/create_turf.dm | 2 +- code/modules/admin/newbanjob.dm | 2 +- .../admin/permissionverbs/permissionedit.dm | 8 +- code/modules/admin/player_panel.dm | 36 +- code/modules/admin/topic.dm | 94 +- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 10 +- .../admin/verbs/check_customitem_activity.dm | 2 +- code/modules/admin/verbs/lightning_strike.dm | 2 +- code/modules/admin/verbs/pray.dm | 8 +- .../admin/view_variables/debug_variables.dm | 12 +- code/modules/admin/view_variables/helpers.dm | 96 +- code/modules/admin/view_variables/topic.dm | 3 +- .../admin/view_variables/view_variables.dm | 12 +- .../view_variables/view_variables_global.dm | 6 +- code/modules/client/verbs/advanced_who.dm | 2 +- code/modules/client/verbs/who.dm | 2 +- code/modules/economy/trader.dm | 2 +- code/modules/error_handler/error_viewer.dm | 22 +- code/modules/events/viral_infection.dm | 2 +- .../food/kitchen/cooking_machines/fryer.dm | 272 +++++ code/modules/mentor/mentorhelp.dm | 14 +- code/modules/mob/dead/observer/observer.dm | 1047 +++++++++++++++++ code/modules/mob/living/living.dm | 16 +- .../silicon/robot/dogborg/dog_sleeper_vr.dm | 8 +- code/modules/paperwork/adminpaper.dm | 12 +- code/modules/paperwork/faxmachine.dm | 4 +- .../persistence/datum/persistence_datum.dm | 2 +- code/modules/persistence/effects/graffiti.dm | 4 +- code/modules/persistence/effects/paper.dm | 4 +- code/modules/power/singularity/emitter.dm | 8 +- .../particle_accelerator/particle_control.dm | 6 +- code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/smes_construction.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 12 +- .../machinery/dispenser/reagent_tank.dm | 493 ++++++++ code/modules/scripting/IDE.dm | 2 +- .../tgui/modules/admin/player_notes.dm | 10 +- code/modules/virus2/admin.dm | 28 +- code/modules/vore/eating/living_vr.dm | 6 +- html/create_object.html | 51 +- 66 files changed, 2368 insertions(+), 461 deletions(-) diff --git a/code/ZAS/Variable Settings.dm b/code/ZAS/Variable Settings.dm index c4643632dc..d55bcc64de 100644 --- a/code/ZAS/Variable Settings.dm +++ b/code/ZAS/Variable Settings.dm @@ -110,7 +110,7 @@ var/global/vs_control/vsc = new vw = vars[ch] if("[ch]_DESC" in vars) vw_desc = vars["[ch]_DESC"] if("[ch]_NAME" in vars) vw_name = vars["[ch]_NAME"] - dat += "[vw_name] = [vw] \[Change\]
" + dat += "[vw_name] = [vw] \[Change\]
" dat += "[vw_desc]

" user << browse(dat,"window=settings") diff --git a/code/controllers/subsystems/inactivity.dm b/code/controllers/subsystems/inactivity.dm index e4ab73fcab..ab1b7209ca 100644 --- a/code/controllers/subsystems/inactivity.dm +++ b/code/controllers/subsystems/inactivity.dm @@ -46,7 +46,7 @@ SUBSYSTEM_DEF(inactivity) information = " while an AI." var/adminlinks - adminlinks = " (JMP|CRYO)" + adminlinks = " (JMP|CRYO)" log_and_message_admins("being kicked for AFK[information][adminlinks]", C.mob) diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 44076a407b..24f7e33d37 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -315,7 +315,7 @@ SUBSYSTEM_DEF(vote) . += "
" if(admin) - . += "(Cancel Vote) " + . += "(Cancel Vote) " else . += "

Start a vote:



" . += "Close" diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index fef1bcd25d..aa92979d5a 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -45,7 +45,7 @@ var/prompt = tgui_alert(usr, "Do you want to grant [C] access to view this VV window? (they will not be able to edit or change anysrc nor open nested vv windows unless they themselves are an admin)", "Confirm", list("Yes", "No")) if (prompt != "Yes" || !usr.client) return - message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") + message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [src]") to_chat(C, "[usr.client.holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") C.debug_variables(src) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index eaeb54b152..ab2532614b 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -119,7 +119,7 @@ var/out = "[name][(current&&(current.real_name!=name))?" (as [current.real_name])":""]
" out += "Mind currently owned by key: [key] [active?"(synced)":"(not synced)"]
" - out += "Assigned role: [assigned_role]. Edit
" + out += "Assigned role: [assigned_role]. Edit
" out += "
" out += "Factions and special roles:
" for(var/antag_type in all_antag_types) @@ -136,15 +136,15 @@ out += "(complete)" else out += "(incomplete)" - out += " \[toggle\]" - out += " \[remove\]
" + out += " \[toggle\]" + out += " \[remove\]
" num++ - out += "
\[announce objectives\]" + out += "
\[announce objectives\]" else out += "None." - out += "
\[add\]

" - out += "Ambitions: [ambitions ? ambitions : "None"] \[edit\]
" + out += "
\[add\]

" + out += "Ambitions: [ambitions ? ambitions : "None"] \[edit\]
" usr << browse(out, "window=edit_memory[src]") /datum/mind/Topic(href, href_list) diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm index 2673774d1c..f3465f5c66 100644 --- a/code/game/antagonist/alien/borer.dm +++ b/code/game/antagonist/alien/borer.dm @@ -30,7 +30,7 @@ var/datum/antagonist/borer/borers borers = src /datum/antagonist/xenos/borer/get_extra_panel_options(var/datum/mind/player) - return "\[put in host\]" + return "\[put in host\]" /datum/antagonist/borer/create_objectives(var/datum/mind/player) if(!..()) @@ -71,4 +71,4 @@ var/datum/antagonist/borer/borers if(!temp_vent.welded && temp_vent.network && (temp_vent.loc.z in using_map.station_levels)) if(temp_vent.network.normal_members.len > 50) vents += temp_vent - return vents \ No newline at end of file + return vents diff --git a/code/game/antagonist/antagonist_panel.dm b/code/game/antagonist/antagonist_panel.dm index c8c754113f..0a165ce8ee 100644 --- a/code/game/antagonist/antagonist_panel.dm +++ b/code/game/antagonist/antagonist_panel.dm @@ -3,13 +3,13 @@ var/dat = "" return dat @@ -27,11 +27,11 @@ var/mob/M = player.current dat += "" if(M) - dat += "" - dat += "" + dat += "" else dat += "" dat += "" @@ -45,7 +45,7 @@ while(!istype(disk_loc, /turf)) if(istype(disk_loc, /mob)) var/mob/M = disk_loc - dat += "carried by [M.real_name] " + dat += "carried by [M.real_name] " if(istype(disk_loc, /obj)) var/obj/O = disk_loc dat += "in \a [O.name] " diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index f01784c048..41b9793330 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -19,7 +19,7 @@ var/datum/antagonist/traitor/traitors traitors = src /datum/antagonist/traitor/get_extra_panel_options(var/datum/mind/player) - return "\[set crystals\]\[spawn uplink\]" + return "\[set crystals\]\[spawn uplink\]" /datum/antagonist/traitor/Topic(href, href_list) if (..()) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d1640d64cd..7cd2480684 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -636,13 +636,13 @@ . = ..() var/custom_edit_name if(!isliving(src)) - custom_edit_name = "[src]" + custom_edit_name = "[src]" . += {" [custom_edit_name]
- << - [dir2text(dir)] - >> + << + [dir2text(dir)] + >> "} var/turf/T = get_turf(src) @@ -721,3 +721,14 @@ /atom/proc/interact(mob/user) return +<<<<<<< HEAD +======= + +// Purpose: Determines if the object can pass this atom. +// Called by: Movement. +// Inputs: The moving atom, target turf. +// Outputs: Boolean if can pass. +// Airflow and ZAS zones now uses CanZASPass() instead of this proc. +/atom/proc/CanPass(atom/movable/mover, turf/target) + return !density +>>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 3ae04b718b..91abfffe51 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -734,7 +734,7 @@ // Book keeping! var/turf/location = get_turf(src) - log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)") + log_admin("[key_name_admin(M)] has entered a stasis pod. (JMP)") message_admins("[key_name_admin(M)] has entered a stasis pod.") //Despawning occurs when process() is called with an occupant without a client. diff --git a/code/game/magic/archived_book.dm b/code/game/magic/archived_book.dm index 1aab354815..9c97bad2f2 100644 --- a/code/game/magic/archived_book.dm +++ b/code/game/magic/archived_book.dm @@ -51,6 +51,7 @@ var/global/datum/book_manager/book_mgr = new() tgui_alert_async(usr, "Connection to Archive has been severed. Aborting.") return else +<<<<<<< HEAD var/DBQuery/query = dbcon.NewQuery("DELETE FROM library WHERE id=[isbn]") if(!query.Execute()) to_chat(usr,query.ErrorMsg()) @@ -58,6 +59,30 @@ var/global/datum/book_manager/book_mgr = new() else book_mgr.remove(isbn) log_admin("[usr.key] has deleted the book [isbn]") +======= + dat += {"(Order book by SS13BN)

+
[role_text]:" var/extra = get_extra_panel_options(player) if(is_antagonist(player)) - dat += "\[-\]" - dat += "\[equip\]" + dat += "\[-\]" + dat += "\[equip\]" if(starting_locations && starting_locations.len) - dat += "\[move to spawn\]" + dat += "\[move to spawn\]" if(extra) dat += "[extra]" else - dat += "\[+\]" + dat += "\[+\]" dat += "
[M.real_name]/([player.key])" + dat += "[M.real_name]/([player.key])" if(!M.client) dat += " (logged out)" if(M.stat == DEAD) dat += " (DEAD)" dat += "\[PP]\[PM\]\[TP\]\[PP]\[PM\]\[TP\][player.key] Mob not found!
+ " output += "" output += "" - output += "" + output += "" output += "" output += "" output += "" output += "" output += "" output += "" - output += "" + output += "" output += "" if(edits) output += "" diff --git a/code/modules/admin/NewBan.dm b/code/modules/admin/NewBan.dm index 22e8d9a4b2..38639e917f 100644 --- a/code/modules/admin/NewBan.dm +++ b/code/modules/admin/NewBan.dm @@ -186,7 +186,7 @@ var/savefile/Banlist if(!expiry) expiry = "Removal Pending" else expiry = "Permaban" - dat += text("") + dat += text("") dat += "
TITLE>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds // delete a book /datum/book_manager/proc/remove(var/id) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 5538755d24..4ba0770ce3 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -83,14 +83,14 @@ var/area/A = get_area(location) var/where = "[A.name] | [location.x], [location.y]" - var/whereLink = "[where]" + var/whereLink = "[where]" if(show_log) if(carry.my_atom.fingerprintslast) var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast) var/more = "" if(M) - more = "(?)" + more = "(?)" message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1) log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].") else diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm index ff9a68fd34..78f58e4225 100644 --- a/code/game/objects/effects/decals/Cleanable/fuel.dm +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -11,7 +11,7 @@ /obj/effect/decal/cleanable/liquid_fuel/New(turf/newLoc,amt=1,nologs=1) if(!nologs) - message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)") + message_admins("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z]) (JMP)") log_game("Liquid fuel has spilled in [newLoc.loc.name] ([newLoc.x],[newLoc.y],[newLoc.z])") src.amount = amt diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 7aaf73bedb..fd439dd222 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -54,7 +54,7 @@ M << 'sound/effects/explosionfar.ogg' if(adminlog) - message_admins("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)") + message_admins("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z]) (JMP)") log_game("Explosion with [shaped ? "shaped" : "non-shaped"] size ([devastation_range], [heavy_impact_range], [light_impact_range]) in area [epicenter.loc.name] ") var/approximate_intensity = (devastation_range * 3) + (heavy_impact_range * 2) + light_impact_range diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm index accae37f6b..92231894d9 100644 --- a/code/game/objects/items/blueprints_vr.dm +++ b/code/game/objects/items/blueprints_vr.dm @@ -534,7 +534,7 @@ oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it. to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")) if(annoy_admins) - message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1) + message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1) log_game("[key_name(creator, creator.client)] just made a new area called [newA.name]") if(AO && istype(AO,/obj/item/areaeditor)) if(AO.uses_charges) @@ -654,7 +654,7 @@ set_area_machinery(newA, newA.name, oldA.name) oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it. to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")) - message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1) + message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1) log_game("[key_name(creator, creator.client)] just made a new area called [newA.name]") charges -= 5 @@ -931,7 +931,7 @@ set_area_machinery(newA, newA.name, oldA.name) oldA.power_check() //Simply makes the area turn the power off if you nicked an APC from it. to_chat(creator, span_notice("You have created a new area, named [newA.name]. It is now weather proof, and constructing an APC will allow it to be powered.")) - message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1) + message_admins("[key_name(creator, creator.client)] just made a new area called [newA.name] ](?) at ([creator.x],[creator.y],[creator.z] - JMP)",0,1) log_game("[key_name(creator, creator.client)] just made a new area called [newA.name]") return diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index dc27b39fce..ace1cbc2cd 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -27,7 +27,7 @@ user.drop_item() item.forceMove(src) to_chat(user, "You attach the tank to the transfer valve.") - message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (JMP)") + message_admins("[key_name_admin(user)] attached both tanks to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached both tanks to a transfer valve.") update_icon() @@ -49,7 +49,7 @@ A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). bombers += "[key_name(user)] attached a [item] to a transfer valve." - message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") + message_admins("[key_name_admin(user)] attached a [item] to a transfer valve. (JMP)") log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") attacher = user SStgui.update_uis(src) // update all UIs attached to src @@ -190,16 +190,16 @@ else attacher_name = "[attacher.name]([attacher.ckey])" - var/log_str = "Bomb valve opened in [A.name] " + var/log_str = "Bomb valve opened in [A.name] " log_str += "with [attached_device ? attached_device : "no device"] attacher: [attacher_name]" if(attacher) - log_str += "(?)" + log_str += "(?)" var/mob/mob = get_mob_by_key(src.fingerprintslast) var/last_touch_info = "" if(mob) - last_touch_info = "(?)" + last_touch_info = "(?)" log_str += " Last touched by: [src.fingerprintslast][last_touch_info]" bombers += log_str diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index 5e1d700602..0e9250611e 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -62,7 +62,7 @@ add_attack_logs(user, target, "planted [name] on with [timer] second fuse") user.visible_message("[user.name] finished planting an explosive on [target.name]!") else - message_admins("[key_name(user, user.client)](?) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) + message_admins("[key_name(user, user.client)](?) planted [src.name] on [target.name] at ([target.x],[target.y],[target.z] - JMP) with [timer] second fuse",0,1) log_game("[key_name(user)] planted [src.name] on [target.name] at ([target.x],[target.y],[target.z]) with [timer] second fuse") target.add_overlay(image_overlay, TRUE) @@ -116,4 +116,4 @@ blast_flash = blast_light + round(new_blast_power * 0.75) else to_chat(user, "The [I] is not any better than the component already installed into this charge!") - return . \ No newline at end of file + return . diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 52ebd29e7c..a710df388b 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -252,7 +252,7 @@ Implant Specifics:
"} if(istype(imp_in, /mob/)) var/mob/T = imp_in - message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") + message_admins("Explosive implant triggered in [T] ([T.key]). (JMP) ") log_game("Explosive implant triggered in [T] ([T.key]).") if(ishuman(imp_in)) diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index fe05157bc4..19e1bc5093 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -444,7 +444,7 @@ if("PERMABAN") typedesc = "PERMABAN" if("TEMPBAN") - typedesc = "TEMPBAN
([duration] minutes) [(unbanned || auto) ? "" : "(Edit)"]
Expires [expiration]
" + typedesc = "TEMPBAN
([duration] minutes) [(unbanned || auto) ? "" : "(Edit)"]
Expires [expiration]
" if("JOB_PERMABAN") typedesc = "JOBBAN
([job])" if("JOB_TEMPBAN") @@ -455,14 +455,14 @@ output += "
[ckey][bantime][ackey][(unbanned || auto) ? "" : "Unban"][(unbanned || auto) ? "" : "Unban"]
IP: [ip]CIP: [cid]
Reason: [(unbanned || auto) ? "" : "(Edit)"] \"[reason]\"Reason: [(unbanned || auto) ? "" : "(Edit)"] \"[reason]\"
(U)(E) Key: [key]ComputerID: [id]IP: [ip] [expiry](By: [by])(Reason: [reason])
(U)(E) Key: [key]ComputerID: [id]IP: [ip] [expiry](By: [by])(Reason: [reason])
" dat = "
Bans: (U) = Unban , (E) = Edit Ban - ([count] Bans)
[dat]" diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index f2f746323f..d78897e85c 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -43,12 +43,12 @@ var/global/floorIsLava = 0 body += "Options panel for [M]" if(M.client) body += " played by [M.client] " - body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" + body += "\[[M.client.holder ? M.client.holder.rank : "Player"]\]" if(istype(M, /mob/new_player)) body += " Hasn't Entered Game " else - body += " \[Heal\] " + body += " \[Heal\] " if(M.client) body += "
First connection: [M.client.player_age] days ago" @@ -57,41 +57,41 @@ var/global/floorIsLava = 0 body += {"

\[ - VV - - TP - - PM - - SM - + VV - + TP - + PM - + SM - [admin_jump_link(M, src)]\]
Mob type: [M.type]
Inactivity time: [M.client ? "[M.client.inactivity/600] minutes" : "Logged out"]

- Kick | - Warn | - Ban | - Jobban | - Notes + Kick | + Warn | + Ban | + Jobban | + Notes "} if(M.client) - body += "| Prison | " - body += "\ Send back to Lobby | " + body += "| Prison | " + body += "\ Send back to Lobby | " var/muted = M.client.prefs.muted body += {"
Mute: - \[IC | - OOC | - PRAY | - ADMINHELP | - DEADCHAT\] - (toggle all) + \[IC | + OOC | + PRAY | + ADMINHELP | + DEADCHAT\] + (toggle all) "} body += {"

- Jump to | - Get | - Send To + Jump to | + Get | + Send To

- [check_rights(R_ADMIN|R_MOD|R_EVENT,0) ? "Traitor panel | " : "" ] - Narrate to | - Subtle message + [check_rights(R_ADMIN|R_MOD|R_EVENT,0) ? "Traitor panel | " : "" ] + Narrate to | + Subtle message "} if (M.client) @@ -104,30 +104,30 @@ var/global/floorIsLava = 0 if(issmall(M)) body += "Monkeyized | " else - body += "Monkeyize | " + body += "Monkeyize | " //Corgi if(iscorgi(M)) body += "Corgized | " else - body += "Corgize | " + body += "Corgize | " //AI / Cyborg if(isAI(M)) body += "Is an AI " else if(ishuman(M)) - body += {"Make AI | - Make Robot | - Make Alien + body += {"Make AI | + Make Robot | + Make Alien "} //Simple Animals if(isanimal(M)) - body += "Re-Animalize | " + body += "Re-Animalize | " else - body += "Animalize | " + body += "Animalize | " - body += "Respawn | " + body += "Respawn | " // DNA2 - Admin Hax if(M.dna && iscarbon(M)) @@ -142,7 +142,7 @@ var/global/floorIsLava = 0 if(bname) var/bstate=M.dna.GetSEState(block) var/bcolor="[(bstate)?"#006600":"#ff0000"]" - body += "[bname][block]" + body += "[bname][block]" else body += "[block]" body+="" @@ -150,45 +150,45 @@ var/global/floorIsLava = 0 body += {"

Rudimentary transformation:
These transformations only create a new mob type and copy stuff over. They do not take into account MMIs and similar mob-specific things. The buttons in 'Transformations' are preferred, when possible.

- Observer | - \[ Xenos: Larva - Drone - Hunter - Sentinel - Queen \] | - \[ Crew: Human - Unathi - Tajaran - Skrell \] | \[ - Nymph - Diona \] | - \[ slime: Baby, - Adult \] - Monkey | - Cyborg | - Cat | - Runtime | - Corgi | - Ian | - Crab | - Coffee | - \[ Construct: Armoured , - Builder , - Wraith \] - Shade + Observer | + \[ Xenos: Larva + Drone + Hunter + Sentinel + Queen \] | + \[ Crew: Human + Unathi + Tajaran + Skrell \] | \[ + Nymph + Diona \] | + \[ slime: Baby, + Adult \] + Monkey | + Cyborg | + Cat | + Runtime | + Corgi | + Ian | + Crab | + Coffee | + \[ Construct: Armoured , + Builder , + Wraith \] + Shade
"} body += {"

Other actions:
- Forcesay + Forcesay "} if (M.client) body += {" | - Thunderdome 1 | - Thunderdome 2 | - Thunderdome Admin | - Thunderdome Observer | + Thunderdome 1 | + Thunderdome 2 | + Thunderdome Admin | + Thunderdome Observer | "} // language toggles body += "

Languages:
" @@ -199,9 +199,9 @@ var/global/floorIsLava = 0 if(!f) body += " | " else f = 0 if(L in M.languages) - body += "[k]" + body += "[k]" else - body += "[k]" + body += "[k]" body += {"
@@ -290,12 +290,12 @@ var/global/floorIsLava = 0
Note that this panel allows full freedom over the news network, there are no constrictions except the few basic ones. Don't break things! "} if(news_network.wanted_issue) - dat+= "
Read Wanted Issue" + dat+= "
Read Wanted Issue" - dat+= {"

Create Feed Channel -
View Feed Channels -
Submit new Feed story -

Exit + dat+= {"

Create Feed Channel +
View Feed Channels +
Submit new Feed story +

Exit "} var/wanted_already = 0 @@ -303,10 +303,10 @@ var/global/floorIsLava = 0 wanted_already = 1 dat+={"
Feed Security functions:
-
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue -
Censor Feed Stories -
Mark Feed Channel with [using_map.company_name] D-Notice (disables and locks the channel. -

The newscaster recognises you as:
[src.admincaster_signature]
+
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue +
Censor Feed Stories +
Mark Feed Channel with [using_map.company_name] D-Notice (disables and locks the channel. +

The newscaster recognises you as:
[src.admincaster_signature]
"} if(1) dat+= "Station Feed Channels
" @@ -315,38 +315,38 @@ var/global/floorIsLava = 0 else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) if(CHANNEL.is_admin_channel) - dat+="[CHANNEL.channel_name]
" + dat+="[CHANNEL.channel_name]
" else - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null]
" - dat+={"

Refresh -
Back + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null]
" + dat+={"

Refresh +
Back "} if(2) dat+={" Creating new Feed Channel... -
Channel Name: [src.admincaster_feed_channel.channel_name]
- Channel Author:[src.admincaster_signature]
- Will Accept Public Feeds: [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]

-
Submit

Cancel
+
Channel Name: [src.admincaster_feed_channel.channel_name]
+ Channel Author:[src.admincaster_signature]
+ Will Accept Public Feeds: [(src.admincaster_feed_channel.locked) ? ("NO") : ("YES")]

+
Submit

Cancel
"} if(3) dat+={" Creating new Feed Message... -
Receiving Channel: [src.admincaster_feed_channel.channel_name]
+
Receiving Channel: [src.admincaster_feed_channel.channel_name]
Message Author:[src.admincaster_signature]
- Message Body: [src.admincaster_feed_message.body]
-
Submit

Cancel
+ Message Body: [src.admincaster_feed_message.body]
+
Submit

Cancel
"} if(4) dat+={" Feed story successfully submitted to [src.admincaster_feed_channel.channel_name].

-
Return
+
Return
"} if(5) dat+={" Feed Channel [src.admincaster_feed_channel.channel_name] created successfully.

-
Return
+
Return
"} if(6) dat+="ERROR: Could not submit Feed story to Network.

" @@ -354,7 +354,7 @@ var/global/floorIsLava = 0 dat+="•Invalid receiving channel name.
" if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]" || admincaster_feed_message.title == "") dat+="•Invalid message body.
" - dat+="
Return
" + dat+="
Return
" if(7) dat+="ERROR: Could not submit Feed Channel to Network.

" if(src.admincaster_feed_channel.channel_name =="" || src.admincaster_feed_channel.channel_name == "\[REDACTED\]") @@ -366,7 +366,7 @@ var/global/floorIsLava = 0 break if(check) dat+="•Channel name already in use.
" - dat+="
Return
" + dat+="
Return
" if(9) dat+="[src.admincaster_feed_channel.channel_name]: \[created by: [src.admincaster_feed_channel.author]\]
" if(src.admincaster_feed_channel.censored) @@ -390,8 +390,8 @@ var/global/floorIsLava = 0 dat+="
" dat+="\[Story by [MESSAGE.author] - [MESSAGE.time_stamp]\]
" dat+={" -

Refresh -
Back +

Refresh +
Back "} if(10) dat+={" @@ -404,8 +404,8 @@ var/global/floorIsLava = 0 dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null]
" - dat+="
Cancel" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null]
" + dat+="
Cancel" if(11) dat+={" [using_map.company_name] D-Notice Handler
@@ -417,13 +417,13 @@ var/global/floorIsLava = 0 dat+="No feed channels found active...
" else for(var/datum/feed_channel/CHANNEL in news_network.network_channels) - dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null]
" + dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : null]
" - dat+="
Back" + dat+="
Back" if(12) dat+={" [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
- [(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
+ [(src.admincaster_feed_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
"} if( isemptylist(src.admincaster_feed_channel.messages) ) dat+="No feed messages found in channel...
" @@ -431,13 +431,13 @@ var/global/floorIsLava = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+={" -[MESSAGE.body]
\[Story by [MESSAGE.author]\]
- [(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
+ [(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
"} - dat+="
Back" + dat+="
Back" if(13) dat+={" [src.admincaster_feed_channel.channel_name]: \[ created by: [src.admincaster_feed_channel.author] \]
- Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
+ Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
"} if(src.admincaster_feed_channel.censored) dat+={" @@ -451,7 +451,7 @@ var/global/floorIsLava = 0 for(var/datum/feed_message/MESSAGE in src.admincaster_feed_channel.messages) dat+="-[MESSAGE.body]
\[Story by [MESSAGE.author]\]
" - dat+="
Back" + dat+="
Back" if(14) dat+="Wanted Issue Handler:" var/wanted_already = 0 @@ -463,21 +463,21 @@ var/global/floorIsLava = 0 dat+="
A wanted issue is already in Feed Circulation. You can edit or cancel it below.
" dat+={"
- Criminal Name: [src.admincaster_feed_message.author]
- Description: [src.admincaster_feed_message.body]
+ Criminal Name: [src.admincaster_feed_message.author]
+ Description: [src.admincaster_feed_message.body]
"} if(wanted_already) dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
" else dat+="Wanted Issue will be created under prosecutor: [src.admincaster_signature]
" - dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" + dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]" if(wanted_already) - dat+="
Take down Issue" - dat+="
Cancel" + dat+="
Take down Issue" + dat+="
Cancel" if(15) dat+={" Wanted issue for [src.admincaster_feed_message.author] is now in Network Circulation.

-
Return
+
Return
"} if(16) dat+="ERROR: Wanted Issue rejected by Network.

" @@ -485,11 +485,11 @@ var/global/floorIsLava = 0 dat+="•Invalid name for person wanted.
" if(src.admincaster_feed_message.body == "" || src.admincaster_feed_message.body == "\[REDACTED\]") dat+="•Invalid description.
" - dat+="
Return
" + dat+="
Return
" if(17) dat+={" Wanted Issue successfully deleted from Circulation
-
Return
+
Return
"} if(18) dat+={" @@ -503,11 +503,11 @@ var/global/floorIsLava = 0 dat+="
" else dat+="None" - dat+="
Back
" + dat+="
Back
" if(19) dat+={" Wanted issue for [src.admincaster_feed_message.author] successfully edited.

-
Return
+
Return
"} else dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com" @@ -527,7 +527,7 @@ var/global/floorIsLava = 0 var/r = t if( findtext(r,"##") ) r = copytext( r, 1, findtext(r,"##") )//removes the description - dat += text("") + dat += text("") dat += "
[t] (unban)
[t] (unban)
" usr << browse(dat, "window=ban;size=400x400") @@ -536,20 +536,20 @@ var/global/floorIsLava = 0 var/dat = {"
Game Panel

\n - Change Game Mode
+ Change Game Mode
"} if(master_mode == "secret") - dat += "(Force Secret Mode)
" + dat += "(Force Secret Mode)
" dat += {"
- Create Object
- Quick Create Object
- Create Turf
- Create Mob
-
Edit Airflow Settings
- Edit Phoron Settings
- Choose a default ZAS setting
+ Create Object
+ Quick Create Object
+ Create Turf
+ Create Mob
+
Edit Airflow Settings
+ Edit Phoron Settings
+ Choose a default ZAS setting
"} usr << browse(dat, "window=admin2;size=210x280") @@ -563,7 +563,7 @@ var/global/floorIsLava = 0 for(var/datum/admin_secret_category/category in admin_secrets.categories) if(!category.can_view(usr)) continue - dat += "[category.name] " + dat += "[category.name] " dat += "
" // If a category is selected, print its description and then options @@ -574,7 +574,7 @@ var/global/floorIsLava = 0 for(var/datum/admin_secret_item/item in active_category.items) if(!item.can_view(usr)) continue - dat += "[item.name()]
" + dat += "[item.name()]
" dat += "
" var/datum/browser/popup = new(usr, "secrets", "Secrets", 500, 500) @@ -1164,66 +1164,66 @@ var/datum/announcement/minor/admin_min_announcer = new tgui_alert_async(usr, "Not before roundstart!", "Alert") return - var/out = "Current mode: [ticker.mode.name] ([ticker.mode.config_tag])
" + var/out = "Current mode: [ticker.mode.name] ([ticker.mode.config_tag])
" out += "
" if(ticker.mode.ert_disabled) - out += "Emergency Response Teams: disabled" + out += "Emergency Response Teams: disabled" else - out += "Emergency Response Teams: enabled" + out += "Emergency Response Teams: enabled" out += "
" if(ticker.mode.deny_respawn) - out += "Respawning: disallowed" + out += "Respawning: disallowed" else - out += "Respawning: allowed" + out += "Respawning: allowed" out += "
" - out += "Shuttle delay multiplier: [ticker.mode.shuttle_delay]
" + out += "Shuttle delay multiplier: [ticker.mode.shuttle_delay]
" if(ticker.mode.auto_recall_shuttle) - out += "Shuttle auto-recall: enabled" + out += "Shuttle auto-recall: enabled" else - out += "Shuttle auto-recall: disabled" + out += "Shuttle auto-recall: disabled" out += "

" if(ticker.mode.event_delay_mod_moderate) - out += "Moderate event time modifier: [ticker.mode.event_delay_mod_moderate]
" + out += "Moderate event time modifier: [ticker.mode.event_delay_mod_moderate]
" else - out += "Moderate event time modifier: unset
" + out += "Moderate event time modifier: unset
" if(ticker.mode.event_delay_mod_major) - out += "Major event time modifier: [ticker.mode.event_delay_mod_major]
" + out += "Major event time modifier: [ticker.mode.event_delay_mod_major]
" else - out += "Major event time modifier: unset
" + out += "Major event time modifier: unset
" out += "
" if(ticker.mode.antag_tags && ticker.mode.antag_tags.len) out += "Core antag templates:
" for(var/antag_tag in ticker.mode.antag_tags) - out += "[antag_tag].
" + out += "[antag_tag].
" if(ticker.mode.round_autoantag) - out += "Autotraitor enabled." + out += "Autotraitor enabled." if(ticker.mode.antag_scaling_coeff > 0) - out += " (scaling with [ticker.mode.antag_scaling_coeff])" + out += " (scaling with [ticker.mode.antag_scaling_coeff])" else - out += " (not currently scaling, set a coefficient)" + out += " (not currently scaling, set a coefficient)" out += "
" else - out += "Autotraitor disabled.
" + out += "Autotraitor disabled.
" out += "All antag ids:" if(ticker.mode.antag_templates && ticker.mode.antag_templates.len) for(var/datum/antagonist/antag in ticker.mode.antag_templates) antag.update_current_antag_max() - out += " [antag.id]" + out += " [antag.id]" out += " ([antag.get_antag_count()]/[antag.cur_max]) " - out += " \[-\]
" + out += " \[-\]
" else out += " None." - out += " \[+\]
" + out += " \[+\]
" usr << browse(out, "window=edit_mode[src]") feedback_add_details("admin_verb","SGM") @@ -1323,19 +1323,19 @@ var/datum/announcement/minor/admin_min_announcer = new return "[key_name(C, link, name, highlight_special)]" if(1) //Private Messages - return "[key_name(C, link, name, highlight_special)](?)" + return "[key_name(C, link, name, highlight_special)](?)" if(2) //Admins var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) ([admin_jump_link(M)]) (CA) (TAKE)" + return "[key_name(C, link, name, highlight_special)](?) (PP) (VV) (SM) ([admin_jump_link(M)]) (CA) (TAKE)" if(3) //Devs var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)](VV)([admin_jump_link(M)]) (TAKE)" + return "[key_name(C, link, name, highlight_special)](VV)([admin_jump_link(M)]) (TAKE)" if(4) //Event Managers var/ref_mob = "\ref[M]" - return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) ([admin_jump_link(M)]) (TAKE)" + return "[key_name(C, link, name, highlight_special)] (?) (PP) (VV) (SM) ([admin_jump_link(M)]) (TAKE)" /proc/ishost(whom) @@ -1559,12 +1559,12 @@ var/datum/announcement/minor/admin_min_announcer = new log_admin("[key_name(src.owner)] replied to a fax message from [key_name(P.sender)]") for(var/client/C in GLOB.admins) if((R_ADMIN | R_MOD | R_EVENT) & C.holder.rights) - to_chat(C, "FAX LOG:[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (VIEW)") + to_chat(C, "FAX LOG:[key_name_admin(src.owner)] replied to a fax message from [key_name_admin(P.sender)] (VIEW)") else log_admin("[key_name(src.owner)] has sent a fax message to [destination.department]") for(var/client/C in GLOB.admins) if((R_ADMIN | R_MOD | R_EVENT) & C.holder.rights) - to_chat(C, "FAX LOG:[key_name_admin(src.owner)] has sent a fax message to [destination.department] (VIEW)") + to_chat(C, "FAX LOG:[key_name_admin(src.owner)] has sent a fax message to [destination.department] (VIEW)") var/plaintext_title = P.sender ? "replied to [key_name(P.sender)]'s fax" : "sent a fax message to [destination.department]" var/fax_text = paper_html_to_plaintext(P.info) diff --git a/code/modules/admin/admin_report.dm b/code/modules/admin/admin_report.dm index e0af36c9c8..33339429cf 100644 --- a/code/modules/admin/admin_report.dm +++ b/code/modules/admin/admin_report.dm @@ -107,9 +107,9 @@ world/New() output += "Offense:[N.body]
" output += "Occured at [time2text(N.date,"MM/DD hh:mm:ss")]
" output += "authored by [N.author]
" - output += " Flag as Handled" + output += " Flag as Handled" if(src.key == N.author) - output += " Edit" + output += " Edit" output += "
" output += "
" else diff --git a/code/modules/admin/admin_verbs_vr.dm b/code/modules/admin/admin_verbs_vr.dm index a96217fb72..66fd277f94 100644 --- a/code/modules/admin/admin_verbs_vr.dm +++ b/code/modules/admin/admin_verbs_vr.dm @@ -73,4 +73,55 @@ log_and_message_admins("removed a security ticket from the global list: \"[input]\"", usr) else - tgui_alert_async(usr, "The ticket list is empty.","Empty") \ No newline at end of file +<<<<<<< HEAD + tgui_alert_async(usr, "The ticket list is empty.","Empty") +======= + tgui_alert_async(usr, "The ticket list is empty.","Empty") + +/client/proc/delbook() + set name = "Delete Book" + set desc = "Permamently deletes a book from the database." + set category = "Admin" + if(!src.holder) + to_chat(src, "Only administrators may use this command.") + return + + var/obj/machinery/librarycomp/our_comp + for(var/obj/machinery/librarycomp/l in world) + if(istype(l, /obj/machinery/librarycomp)) + our_comp = l + break + + if(!our_comp) + to_chat(usr, "Unable to locate a library computer to use for book deleting.") + return + + var/dat = "Book Inventory Management\n" + dat += "

ADMINISTRATIVE MANAGEMENT

" + establish_old_db_connection() + + if(!dbcon_old.IsConnected()) + dat += "ERROR: Unable to contact External Archive. Please contact your system administrator for assistance." + else + dat += {"(Order book by SS13BN)

+ + ") + dat += text("") dat += "
TITLE>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm index fc04317ef2..a15a465984 100644 --- a/code/modules/admin/create_mob.dm +++ b/code/modules/admin/create_mob.dm @@ -6,4 +6,4 @@ create_mob_html = file2text('html/create_object.html') create_mob_html = replacetext(create_mob_html, "null /* object types */", "\"[mobjs]\"") - user << browse(replacetext(create_mob_html, "/* ref src */", "\ref[src]"), "window=create_mob;size=680x600") + user << browse(create_panel_helper(create_mob_html), "window=create_mob;size=680x600") diff --git a/code/modules/admin/create_object.dm b/code/modules/admin/create_object.dm index 9bb1172727..5520e52bf3 100644 --- a/code/modules/admin/create_object.dm +++ b/code/modules/admin/create_object.dm @@ -1,13 +1,17 @@ -/var/create_object_html = null +/datum/admins/proc/create_panel_helper(template) + var/final_html = replacetext(template, "/* ref src */", "\ref[src];[HrefToken()]") + final_html = replacetext(final_html,"/* hreftokenfield */","[HrefTokenFormField()]") + return final_html /datum/admins/proc/create_object(var/mob/user) + var/static/create_object_html = null if (!create_object_html) var/objectjs = null objectjs = jointext(typesof(/obj), ";") create_object_html = file2text('html/create_object.html') create_object_html = replacetext(create_object_html, "null /* object types */", "\"[objectjs]\"") - user << browse(replacetext(create_object_html, "/* ref src */", "\ref[src]"), "window=create_object;size=680x600") + user << browse(create_panel_helper(create_object_html), "window=create_object;size=680x600") /datum/admins/proc/quick_create_object(var/mob/user) @@ -28,7 +32,7 @@ "/obj/mecha", "/obj/item/mecha_parts", "/obj/item/mecha_parts/mecha_equipment") - + pathtext = tgui_input_list(usr, "Select the path of the object you wish to create.", "Path", choices, "/obj") if(!pathtext) @@ -41,4 +45,4 @@ quick_create_object_html = file2text('html/create_object.html') quick_create_object_html = replacetext(quick_create_object_html, "null /* object types */", "\"[objectjs]\"") - user << browse(replacetext(quick_create_object_html, "/* ref src */", "\ref[src]"), "window=quick_create_object;size=680x600") + user << browse(create_panel_helper(quick_create_object_html), "window=quick_create_object;size=680x600") diff --git a/code/modules/admin/create_turf.dm b/code/modules/admin/create_turf.dm index f3de693055..ec7e595584 100644 --- a/code/modules/admin/create_turf.dm +++ b/code/modules/admin/create_turf.dm @@ -6,4 +6,4 @@ create_turf_html = file2text('html/create_object.html') create_turf_html = replacetext(create_turf_html, "null /* object types */", "\"[turfjs]\"") - user << browse(replacetext(create_turf_html, "/* ref src */", "\ref[src]"), "window=create_turf;size=680x600") + user << browse(create_panel_helper(create_turf_html), "window=create_turf;size=680x600") diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index e743bb6bc2..4915c00594 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -211,7 +211,7 @@ var/savefile/Banlistjob for (var/A in Banlistjob.dir) count++ Banlistjob.cd = "/base/[A]" - dat += text("
(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetBanExpjob(Banlistjob["minutes"]) ? GetBanExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlistjob["bannedby"]])(Reason: [Banlistjob["reason"]])
(U) Key: [Banlistjob["key"]] Rank: [Banlistjob["rank"]] ([Banlistjob["temp"] ? "[GetBanExpjob(Banlistjob["minutes"]) ? GetBanExpjob(Banlistjob["minutes"]) : "Removal pending" ]" : "Permaban"])(By: [Banlistjob["bannedby"]])(Reason: [Banlistjob["reason"]])
" dat = "
Bans: (U) = Unban , - ([count] Bans)
[dat]" diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index a9b7f6110e..e688bc666d 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -18,7 +18,7 @@
- + "} @@ -31,9 +31,9 @@ if(!rights) rights = "*none*" output += "" - output += "" - output += "" - output += "" + output += "" + output += "" + output += "" output += "" output += {" diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 3f335058e4..56916c8d80 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -75,15 +75,15 @@ body += "
CKEY \[+\]CKEY \[+\] RANKPERMISSIONS
[adm_ckey] \[-\][rank][rights][adm_ckey] \[-\][rank][rights]
"; - body += "PP - " - body += "N - " + body += "PP - " + body += "N - " body += "VV - " - body += "TP - " - body += "PM - " - body += "SM - " - body += "JMP
" + body += "TP - " + body += "PM - " + body += "SM - " + body += "JMP
" if(antagonist > 0) - body += "Antagonist"; + body += "Antagonist"; body += "
"; @@ -194,7 +194,7 @@ Player panel
- Hover over a line to see more information - Check antagonists + Hover over a line to see more information - Check antagonists

@@ -359,18 +359,18 @@ dat += {"[M.key ? (M.client ? M.key : "[M.key] (DC)") : "No key"] - X - PM + X + PM "} if(usr.client) switch(is_special_character(M)) if(0) - dat += {"Traitor?"} + dat += {"Traitor?"} if(1) - dat += {"Traitor?"} + dat += {"Traitor?"} if(2) - dat += {"Traitor?"} + dat += {"Traitor?"} else dat += {" N/A "} @@ -389,21 +389,21 @@ dat += "Round Duration: [roundduration2text()]
" dat += "Emergency shuttle
" if (!emergency_shuttle.online()) - dat += "Call Shuttle
" + dat += "Call Shuttle
" else if (emergency_shuttle.wait_for_launch) var/timeleft = emergency_shuttle.estimate_launch_time() - dat += "ETL: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" + dat += "ETL: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" else if (emergency_shuttle.shuttle.has_arrive_time()) var/timeleft = emergency_shuttle.estimate_arrival_time() - dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" - dat += "Send Back
" + dat += "ETA: [(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]
" + dat += "Send Back
" if (emergency_shuttle.shuttle.moving_status == SHUTTLE_WARMUP) dat += "Launching now..." - dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
" + dat += "[ticker.delay_end ? "End Round Normally" : "Delay Round End"]
" dat += "


" for(var/antag_type in all_antag_types) var/datum/antagonist/A = all_antag_types[antag_type] diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 2ba771a67a..f01d474560 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -417,16 +417,16 @@ //Regular jobs //Command (Blue) jobs += "" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_COMMAND)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 6) //So things dont get squiiiiished! jobs += "" @@ -437,16 +437,16 @@ //Security (Red) counter = 0 jobs += "
Command Positions
Command Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_SECURITY)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -457,16 +457,16 @@ //Engineering (Yellow) counter = 0 jobs += "
Security Positions
Security Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_ENGINEERING)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -477,16 +477,16 @@ //Cargo (Yellow) counter = 0 jobs += "
Engineering Positions
Engineering Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_CARGO)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -497,16 +497,16 @@ //Medical (White) counter = 0 jobs += "
Cargo Positions
Cargo Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_MEDICAL)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -517,16 +517,16 @@ //Science (Purple) counter = 0 jobs += "
Medical Positions
Medical Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_RESEARCH)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -538,16 +538,16 @@ //Exploration (Purple) counter = 0 jobs += "
Science Positions
Science Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_PLANET)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -562,16 +562,16 @@ for(var/dept in offmap_departments) offmap_jobs += SSjob.get_job_titles_in_department(dept) jobs += "
Exploration Positions
Exploration Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in offmap_jobs) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -583,41 +583,41 @@ //Civilian (Grey) counter = 0 jobs += "
Offmap Positions
Offmap Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_CIVILIAN)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" counter = 0 if(jobban_isbanned(M, "Internal Affairs Agent")) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" jobs += "
Civilian Positions
Civilian Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
Internal Affairs AgentInternal Affairs AgentInternal Affairs AgentInternal Affairs Agent
" //Synthetic (Green) counter = 0 jobs += "" - jobs += "" + jobs += "" for(var/jobPos in SSjob.get_job_titles_in_department(DEPARTMENT_SYNTHETIC)) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) if(!job) continue if(jobban_isbanned(M, job.title)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -629,7 +629,7 @@ counter = 0 var/isbanned_dept = jobban_isbanned(M, "Syndicate") jobs += "
Synthetic Positions
Synthetic Positions
[replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
" - jobs += "" + jobs += "" // Antagonists. for(var/antag_type in all_antag_types) @@ -638,9 +638,9 @@ continue if(jobban_isbanned(M, "[antag.bantype]") || isbanned_dept) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -655,9 +655,9 @@ jobs += "" for(var/entry in misc_roles) if(jobban_isbanned(M, entry)) - jobs += "" + jobs += "" else - jobs += "" + jobs += "" if(++counter >= 5) //So things dont get squiiiiished! jobs += "" @@ -991,9 +991,9 @@ return tgui_alert_async(usr, "The game has already started.") var/dat = {"What mode do you wish to play?
"} for(var/mode in config.modes) - dat += {"[config.mode_names[mode]]
"} - dat += {"Secret
"} - dat += {"Random
"} + dat += {"[config.mode_names[mode]]
"} + dat += {"Secret
"} + dat += {"Random
"} dat += {"Now: [master_mode]"} usr << browse(dat, "window=c_mode") @@ -1006,8 +1006,8 @@ return tgui_alert_async(usr, "The game mode has to be secret!") var/dat = {"What game mode do you want to force secret to be? Use this if you want to change the game mode, but want the players to believe it's secret. This will only work if the current game mode is secret.
"} for(var/mode in config.modes) - dat += {"[config.mode_names[mode]]
"} - dat += {"Random (default)
"} + dat += {"[config.mode_names[mode]]
"} + dat += {"Random (default)
"} dat += {"Now: [secret_force_mode]"} usr << browse(dat, "window=f_secret") @@ -1429,8 +1429,8 @@ Name = [M.name]; Real_name = [M.real_name]; Mind_name = [M.mind?"[M.mind.name]":""]; Key = [M.key];
\ Location = [location_description];
\ [special_role_description]
\ - (PM) (PP) (VV) \ - (SM) ([admin_jump_link(M, src)]) (CA)") + (PM) (PP) (VV) \ + (SM) ([admin_jump_link(M, src)]) (CA)") else if(href_list["adminspawncookie"]) if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return @@ -2077,11 +2077,11 @@ /mob/extra_admin_link(var/source) if(client && eyeobj) - return "|EYE" + return "|EYE" /mob/observer/dead/extra_admin_link(var/source) if(mind && mind.current) - return "|BDY" + return "|BDY" /proc/admin_jump_link(var/atom/target, var/source) if(!target) return @@ -2091,5 +2091,5 @@ else source = "_src_=holder" - . = "JMP" + . = "JMP" . += target.extra_admin_link(source) diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 60542d5a05..baba14563c 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -670,7 +670,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null /datum/SDQL2_query/proc/SDQL_print(object, list/text_list, print_nulls = TRUE) if(is_proper_datum(object)) - text_list += "\ref[object] : [object]" + text_list += "\ref[object] : [object]" if(istype(object, /atom)) var/atom/A = object var/turf/T = A.loc diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 661eec22c1..9463026769 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -81,9 +81,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(!l2b) return var/list/dat = list("[title]") - dat += "Refresh

" + dat += "Refresh

" for(var/datum/admin_help/AH as anything in l2b) - dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
" + dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
" usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") @@ -261,13 +261,13 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help/proc/LinkedReplyName(ref_src) if(!ref_src) ref_src = "\ref[src]" - return "[initiator_key_name]" + return "[initiator_key_name]" //private /datum/admin_help/proc/TicketHref(msg, ref_src, action = "ticket") if(!ref_src) ref_src = "\ref[src]" - return "[msg]" + return "[msg]" //message from the initiator without a target, all admins will see this //won't bug irc @@ -803,7 +803,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(found.mind && found.mind.special_role) is_antag = 1 founds += "Name: [found.name]([found.real_name]) Ckey: [found.ckey] [is_antag ? "(Antag)" : null] " - msg += "[original_word](?|F) " + msg += "[original_word](?|F) " continue msg += "[original_word] " if(irc) diff --git a/code/modules/admin/verbs/check_customitem_activity.dm b/code/modules/admin/verbs/check_customitem_activity.dm index 086b6c410c..521a49301d 100644 --- a/code/modules/admin/verbs/check_customitem_activity.dm +++ b/code/modules/admin/verbs/check_customitem_activity.dm @@ -19,7 +19,7 @@ var/inactive_keys = "None
" dat += "
" dat += "This system was implemented on March 1 2013, and the database a few days before that. Root server access is required to add or disable access to specific custom items.
" else - dat += "Populate list (requires an active database connection)
" + dat += "Populate list (requires an active database connection)
" usr << browse(dat, "window=inactive_customitems;size=600x480") diff --git a/code/modules/admin/verbs/lightning_strike.dm b/code/modules/admin/verbs/lightning_strike.dm index 6ebcca804d..d977c39b22 100644 --- a/code/modules/admin/verbs/lightning_strike.dm +++ b/code/modules/admin/verbs/lightning_strike.dm @@ -14,7 +14,7 @@ lightning_strike(get_turf(usr), fake_lightning) log_and_message_admins("[key_name(src)] has caused [fake_lightning ? "cosmetic":"harmful"] lightning to strike at their position ([src.mob.x], [src.mob.y], [src.mob.z]). \ - (JMP)") + (JMP)") #define LIGHTNING_REDIRECT_RANGE 28 // How far in tiles certain things draw lightning from. #define LIGHTNING_ZAP_RANGE 1 // How far the tesla effect zaps, as well as the bad effects from a direct strike. diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 9fa878ad72..5acd85f8c3 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -17,7 +17,7 @@ return var/icon/cross = icon('icons/obj/storage.dmi',"bible") - msg = "\icon[cross][bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" + msg = "\icon[cross][bicon(cross)] PRAY: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src, src)]) (CA) (SC) (SMITE): [msg]" for(var/client/C in GLOB.admins) if(R_ADMIN|R_EVENT & C.holder.rights) @@ -30,15 +30,15 @@ //log_admin("HELP: [key_name(src)]: [msg]") /proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage) - msg = "[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (RPLY): [msg]" + 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 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) - msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (RPLY): [msg]" + msg = "ILLEGAL:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender)]) (CA) (BSA) (RPLY): [msg]" 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 + C << 'sound/machines/signal.ogg' diff --git a/code/modules/admin/view_variables/debug_variables.dm b/code/modules/admin/view_variables/debug_variables.dm index 6f401f0185..73bed3848e 100644 --- a/code/modules/admin/view_variables/debug_variables.dm +++ b/code/modules/admin/view_variables/debug_variables.dm @@ -8,9 +8,9 @@ name = DA[name] //name is really the index until this line else value = DA[name] - header = "
  • (E) (C) (-) " + header = "
  • (E) (C) (-) " else - header = "
  • (E) (C) (M) " + header = "
  • (E) (C) (M) " else header = "
  • " @@ -38,9 +38,9 @@ else if (istype(value, /datum)) var/datum/D = value if ("[D]" != "[D.type]") //if the thing as a name var, lets use it. - item = "[VV_HTML_ENCODE(name)] \ref[value] = [D] [D.type]" + item = "[VV_HTML_ENCODE(name)] \ref[value] = [D] [D.type]" else - item = "[VV_HTML_ENCODE(name)] \ref[value] = [D.type]" + item = "[VV_HTML_ENCODE(name)] \ref[value] = [D.type]" else if (islist(value)) var/list/L = value @@ -58,9 +58,9 @@ items += debug_variable(key, val, level + 1, sanitize = sanitize) - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" + item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" else - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" + item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" else if (name in GLOB.bitfields) var/list/flags = list() diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index caf44a2d30..bad05eb138 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -6,26 +6,26 @@ /atom/get_view_variables_header() return {" - [src] + [src]
    - << - [dir2text(dir)] - >> + << + [dir2text(dir)] + >> "} /mob/living/get_view_variables_header() return {" - [src] -
    << [dir2text(dir)] >> -
    [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"] + [src] +
    << [dir2text(dir)] >> +
    [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"]
    - BRUTE:[getBruteLoss()] - FIRE:[getFireLoss()] - TOXIN:[getToxLoss()] - OXY:[getOxyLoss()] - CLONE:[getCloneLoss()] - BRAIN:[getBrainLoss()] + BRUTE:[getBruteLoss()] + FIRE:[getFireLoss()] + TOXIN:[getToxLoss()] + OXY:[getOxyLoss()] + CLONE:[getCloneLoss()] + BRAIN:[getBrainLoss()]
    "} @@ -35,53 +35,53 @@ /mob/get_view_variables_options() return ..() + {" - + - - - - - - + + + + + + - - + + - - + + - - - - - + + + + + - + - - + + - + "} /mob/living/carbon/human/get_view_variables_options() return ..() + {" - - - - - + + + + + "} /obj/get_view_variables_options() return ..() + {" - + "} /turf/get_view_variables_options() return ..() + {" - - + + "} /datum/proc/get_variables() @@ -100,18 +100,18 @@ /datum/proc/make_view_variables_variable_entry(var/varname, var/value, var/hide_watch = 0) return {" - (E) - (C) - (M) - [hide_watch ? "" : "(W)"] + (E) + (C) + (M) + [hide_watch ? "" : "(W)"] "} // No mass editing of clients /client/make_view_variables_variable_entry(var/varname, var/value, var/hide_watch = 0) return {" - (E) - (C) - [hide_watch ? "" : "(W)"] + (E) + (C) + [hide_watch ? "" : "(W)"] "} // These methods are all procs and don't use stored lists to avoid VV exploits diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index 5080b5cdd4..6554626777 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -514,7 +514,7 @@ if(!thing) to_chat(usr, "The object you tried to expose to [C] no longer exists (GC'd)") return - message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") + message_admins("[key_name_admin(usr)] Showed [key_name_admin(C)] a VV window") log_admin("Admin [key_name(usr)] Showed [key_name(C)] a VV window of a [src]") to_chat(C, "[holder.fakekey ? "an Administrator" : "[usr.client.key]"] has granted you access to view a View Variables window") C.debug_variables(thing) @@ -523,4 +523,3 @@ var/datum/DAT = locate(href_list["datumrefresh"]) if(istype(DAT, /datum) || istype(DAT, /client) || islist(DAT)) debug_variables(DAT) - diff --git a/code/modules/admin/view_variables/view_variables.dm b/code/modules/admin/view_variables/view_variables.dm index 1d52941f47..cd05296959 100644 --- a/code/modules/admin/view_variables/view_variables.dm +++ b/code/modules/admin/view_variables/view_variables.dm @@ -55,12 +55,12 @@ if (islist) dropdownoptions = list( "---", - "Add Item" = "?_src_=vars;[VV_HK_LIST_ADD]=TRUE;target=[refid]", - "Remove Nulls" = "?_src_=vars;[VV_HK_LIST_ERASE_NULLS]=TRUE;target=[refid]", - "Remove Dupes" = "?_src_=vars;[VV_HK_LIST_ERASE_DUPES]=TRUE;target=[refid]", - "Set len" = "?_src_=vars;[VV_HK_LIST_SET_LENGTH]=TRUE;target=[refid]", - "Shuffle" = "?_src_=vars;[VV_HK_LIST_SHUFFLE]=TRUE;target=[refid]", - // "Show VV To Player" = "?_src_=vars;[VV_HK_EXPOSE]=TRUE;target=[refid]" // TODO - Not yet implemented for lists + "Add Item" = "?_src_=vars;[HrefToken()];[VV_HK_LIST_ADD]=TRUE;target=[refid]", + "Remove Nulls" = "?_src_=vars;[HrefToken()];[VV_HK_LIST_ERASE_NULLS]=TRUE;target=[refid]", + "Remove Dupes" = "?_src_=vars;[HrefToken()];[VV_HK_LIST_ERASE_DUPES]=TRUE;target=[refid]", + "Set len" = "?_src_=vars;[HrefToken()];[VV_HK_LIST_SET_LENGTH]=TRUE;target=[refid]", + "Shuffle" = "?_src_=vars;[HrefToken()];[VV_HK_LIST_SHUFFLE]=TRUE;target=[refid]", + // "Show VV To Player" = "?_src_=vars;[HrefToken()];[VV_HK_EXPOSE]=TRUE;target=[refid]" // TODO - Not yet implemented for lists ) autoconvert_dropdown = TRUE else diff --git a/code/modules/admin/view_variables/view_variables_global.dm b/code/modules/admin/view_variables/view_variables_global.dm index 1f6f2d52d6..8e7c1be76d 100644 --- a/code/modules/admin/view_variables/view_variables_global.dm +++ b/code/modules/admin/view_variables/view_variables_global.dm @@ -1,6 +1,6 @@ /proc/readglobal(which) . = global.vars[which] - + /proc/writeglobal(which, newval) global.vars[which] = newval @@ -29,7 +29,7 @@ writeglobal(varname, value) /decl/global_vars/make_view_variables_variable_entry(varname, value) - return "(E) " + return "(E) " /decl/global_vars/VV_locked() return vars @@ -88,4 +88,4 @@ if(!global_vars_) global_vars_ = new() - debug_variables(global_vars_) \ No newline at end of file + debug_variables(global_vars_) diff --git a/code/modules/client/verbs/advanced_who.dm b/code/modules/client/verbs/advanced_who.dm index 4762280a73..151f4a90f3 100644 --- a/code/modules/client/verbs/advanced_who.dm +++ b/code/modules/client/verbs/advanced_who.dm @@ -68,7 +68,7 @@ entry += "[seconds % 60] seconds)" entry += "
  • " Lines += entry diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index 17c257828a..96bcc5e2f6 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -44,7 +44,7 @@ var/seconds = C.last_activity_seconds() entry += " (AFK - [round(seconds / 60)] minutes, [seconds % 60] seconds)" - entry += " (?)" + entry += " (?)" Lines += entry for(var/line in sortList(Lines)) diff --git a/code/modules/economy/trader.dm b/code/modules/economy/trader.dm index b6a8d2732f..0491c17eea 100644 --- a/code/modules/economy/trader.dm +++ b/code/modules/economy/trader.dm @@ -258,7 +258,7 @@ dir = dt.dir log_admin("[src] has been placed at [loc], [x],[y],[z]") else - log_and_message_admins("[src] tried to move itself but its target pick list was empty, so it was not moved. (JMP)") + log_and_message_admins("[src] tried to move itself but its target pick list was empty, so it was not moved. (JMP)") /obj/move_trader_landmark //You need to place the trader somewhere in the world and enable the 'move_trader' var. When the trader initializes, it will make a list of these landmarks and then move itself. name = "trader mover" diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index c342a408f0..91bb51eb95 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -71,7 +71,7 @@ var/global/datum/ErrorViewer/ErrorCache/error_cache = null back_to_param = ";viewruntime_backto=\ref[back_to]" if(linear) back_to_param += ";viewruntime_linear=1" - return "[html_encode(linktext)]" + return "[html_encode(linktext)]" /datum/ErrorViewer/Topic(href, href_list) if(..()) @@ -183,20 +183,20 @@ var/global/datum/ErrorViewer/ErrorCache/error_cache = null var/html = buildHeader(back_to, linear) html += "
    [html_encode(name)]
    [desc]
    " if(srcRef) - html += "
    src: VV" + html += "
    src: VV" if(ispath(srcType, /mob)) - html += " PP" - html += " Follow" + html += " PP" + html += " Follow" if(istype(srcLoc)) - html += "
    src.loc: VV" - html += " JMP" + html += "
    src.loc: VV" + html += " JMP" if(usrRef) - html += "
    usr: VV" - html += " PP" - html += " Follow" + html += "
    usr: VV" + html += " PP" + html += " Follow" if(istype(usrLoc)) - html += "
    usr.loc: VV" - html += " JMP" + html += "
    usr.loc: VV" + html += " JMP" browseTo(user, html) /datum/ErrorViewer/ErrorEntry/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear) diff --git a/code/modules/events/viral_infection.dm b/code/modules/events/viral_infection.dm index 5ee99ed5db..d596466585 100644 --- a/code/modules/events/viral_infection.dm +++ b/code/modules/events/viral_infection.dm @@ -61,7 +61,7 @@ var/global/list/event_viruses = list() // so that event viruses are kept around var/list/used_viruses_links = list() var/list/used_viruses_text = list() for(var/datum/disease2/disease/D in used_viruses) - used_viruses_links += "[D.name()]" + used_viruses_links += "[D.name()]" used_viruses_text += D.name() var/list/used_candidates_links = list() diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm index d9b86ae063..960de269ef 100644 --- a/code/modules/food/kitchen/cooking_machines/fryer.dm +++ b/code/modules/food/kitchen/cooking_machines/fryer.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/machinery/appliance/cooker/fryer name = "deep fryer" desc = "Deep fried everything." @@ -273,3 +274,274 @@ return 1 //If neither of the above returned, then call parent as normal ..() +======= +/obj/machinery/appliance/cooker/fryer + name = "deep fryer" + desc = "Deep fried everything." + icon_state = "fryer_off" + can_cook_mobs = 1 + cook_type = "deep fried" + on_icon = "fryer_on" + off_icon = "fryer_off" + food_color = "#FFAD33" + cooked_sound = 'sound/machines/ding.ogg' + var/datum/looping_sound/deep_fryer/fry_loop + circuit = /obj/item/weapon/circuitboard/fryer + appliancetype = FRYER + active_power_usage = 12 KILOWATTS + heating_power = 12 KILOWATTS + + light_y = 15 + + min_temp = 140 + T0C // Same as above, increasing this to just under 2x to make the % increase on efficiency not quite so painful as it would be at 80. + optimal_temp = 400 + T0C // Increasing this to be 2x Oven to allow for a much higher/realistic frying temperatures. Doesn't really do anything but make heating the fryer take a bit longer. + optimal_power = 0.95 // .35 higher than the default to give fryers faster cooking speed. + + idle_power_usage = 3.6 KILOWATTS + // Power used to maintain temperature once it's heated. + // Going with 25% of the active power. This is a somewhat arbitrary value. + + resistance = 10 KILOWATTS // Approx. 10 minutes to heat up. + + max_contents = 2 + container_type = /obj/item/weapon/reagent_containers/cooking_container/fryer + + stat = POWEROFF // Starts turned off + + var/datum/reagents/oil + var/optimal_oil = 9000 //90 litres of cooking oil + +/obj/machinery/appliance/cooker/fryer/Initialize() + . = ..() + fry_loop = new(list(src), FALSE) + + oil = new/datum/reagents(optimal_oil * 1.25, src) + var/variance = rand()*0.15 + // Fryer is always a little below full, but its usually negligible + + if(prob(20)) + // Sometimes the fryer will start with much less than full oil, significantly impacting efficiency until filled + variance = rand()*0.5 + oil.add_reagent("cookingoil", optimal_oil*(1 - variance)) + +/obj/machinery/appliance/cooker/fryer/Destroy() + QDEL_NULL(fry_loop) + QDEL_NULL(oil) + return ..() + +/obj/machinery/appliance/cooker/fryer/examine(var/mob/user) + . = ..() + if(Adjacent(user)) + to_chat(user, "Oil Level: [oil.total_volume]/[optimal_oil]") + +/obj/machinery/appliance/cooker/fryer/update_icon() // We add our own version of the proc to use the special fryer double-lights. + cut_overlays() + var/image/light + if(use_power == 1 && !stat) + light = image(icon, "fryer_light_idle") + else if(use_power == 2 && !stat) + light = image(icon, "fryer_light_preheating") + else + light = image(icon, "fryer_light_off") + light.pixel_x = light_x + light.pixel_y = light_y + add_overlay(light) + +/obj/machinery/appliance/cooker/fryer/heat_up() + if (..()) + //Set temperature of oil reagent + var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() + if (OL && istype(OL)) + OL.data["temperature"] = temperature + +/obj/machinery/appliance/cooker/fryer/equalize_temperature() + if (..()) + //Set temperature of oil reagent + var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() + if (OL && istype(OL)) + OL.data["temperature"] = temperature + +/obj/machinery/appliance/cooker/fryer/update_cooking_power() + ..()//In addition to parent temperature calculation + //Fryer efficiency also drops when oil levels arent optimal + var/oil_level = 0 + var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() + if(OL && istype(OL)) + oil_level = OL.volume + + var/oil_efficiency = 0 + if(oil_level) + oil_efficiency = oil_level / optimal_oil + + if(oil_efficiency > 1) + //We're above optimal, efficiency goes down as we pass too much over it + oil_efficiency = 1 - (oil_efficiency - 1) + + + cooking_power *= oil_efficiency + +/obj/machinery/appliance/cooker/fryer/update_icon() + if(!stat) + ..() + if(cooking == TRUE) + icon_state = on_icon + if(fry_loop) + fry_loop.start(src) + else + icon_state = off_icon + if(fry_loop) + fry_loop.stop(src) + else + icon_state = off_icon + if(fry_loop) + fry_loop.stop(src) + ..() + +//Fryer gradually infuses any cooked food with oil. Moar calories +//This causes a slow drop in oil levels, encouraging refill after extended use +/obj/machinery/appliance/cooker/fryer/do_cooking_tick(var/datum/cooking_item/CI) + if(..() && (CI.oil < CI.max_oil) && prob(20)) + var/datum/reagents/buffer = new /datum/reagents(2) + oil.trans_to_holder(buffer, min(0.5, CI.max_oil - CI.oil)) + CI.oil += buffer.total_volume + CI.container.soak_reagent(buffer) + + +//To solve any odd logic problems with results having oil as part of their compiletime ingredients. +//Upon finishing a recipe the fryer will analyse any oils in the result, and replace them with our oil +//As well as capping the total to the max oil +/obj/machinery/appliance/cooker/fryer/finish_cooking(var/datum/cooking_item/CI) + ..() + var/total_oil = 0 + var/total_our_oil = 0 + var/total_removed = 0 + var/datum/reagent/our_oil = oil.get_master_reagent() + + for (var/obj/item/I in CI.container) + if (I.reagents && I.reagents.total_volume) + for (var/datum/reagent/R in I.reagents.reagent_list) + if (istype(R, /datum/reagent/nutriment/triglyceride/oil)) + total_oil += R.volume + if (R.id != our_oil.id) + total_removed += R.volume + I.reagents.remove_reagent(R.id, R.volume) + else + total_our_oil += R.volume + + + if (total_removed > 0 || total_oil != CI.max_oil) + total_oil = min(total_oil, CI.max_oil) + + if (total_our_oil < total_oil) + //If we have less than the combined total, then top up from our reservoir + var/datum/reagents/buffer = new /datum/reagents(INFINITY) + oil.trans_to_holder(buffer, total_oil - total_our_oil) + CI.container.soak_reagent(buffer) + else if (total_our_oil > total_oil) + + //If we have more than the maximum allowed then we delete some. + //This could only happen if one of the objects spawns with the same type of oil as ours + var/portion = 1 - (total_oil / total_our_oil) //find the percentage to remove + for (var/obj/item/I in CI.container) + if (I.reagents && I.reagents.total_volume) + for (var/datum/reagent/R in I.reagents.reagent_list) + if (R.id == our_oil.id) + I.reagents.remove_reagent(R.id, R.volume*portion) + +/obj/machinery/appliance/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user) + + if(!istype(victim)) + return + + // user.visible_message("\The [user] starts pushing \the [victim] into \the [src]!") + + //Removed delay on this action in favour of a cooldown after it + //If you can lure someone close to the fryer and grab them then you deserve success. + //And a delay on this kind of niche action just ensures it never happens + //Cooldown ensures it can't be spammed to instakill someone + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN*3) + + fry_loop.start(src) + + if(!do_mob(user, victim, 20)) + cooking = FALSE + icon_state = off_icon + fry_loop.stop(src) + return + + if(!victim || !victim.Adjacent(user)) + to_chat(user, "Your victim slipped free!") + cooking = FALSE + icon_state = off_icon + fry_loop.stop(src) + return + + var/damage = rand(7,13) // Though this damage seems reduced, some hot oil is transferred to the victim and will burn them for a while after + + var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() + damage *= OL.heatdamage(victim) + + var/obj/item/organ/external/E + var/nopain + if(ishuman(victim) && user.zone_sel.selecting != BP_GROIN && user.zone_sel.selecting != BP_TORSO) + var/mob/living/carbon/human/H = victim + E = H.get_organ(user.zone_sel.selecting) + if(!E || E.species.flags & NO_PAIN) + nopain = 2 + else if(E.robotic >= ORGAN_ROBOT) + nopain = 1 + + user.visible_message("\The [user] shoves \the [victim][E ? "'s [E.name]" : ""] into \the [src]!") + if (damage > 0) + if(E) + if(E.children && E.children.len) + for(var/obj/item/organ/external/child in E.children) + if(nopain && nopain < 2 && !(child.robotic >= ORGAN_ROBOT)) + nopain = 0 + child.take_damage(0, damage) + damage -= (damage*0.5)//IF someone's arm is plunged in, the hand should take most of it + E.take_damage(0, damage) + else + victim.apply_damage(damage, BURN, user.zone_sel.selecting) + + if(!nopain) + to_chat(victim, "Agony consumes you as searing hot oil scorches your [E ? E.name : "flesh"] horribly!") + victim.emote("scream") + else + to_chat(victim, "Searing hot oil scorches your [E ? E.name : "flesh"]!") + + user.attack_log += text("\[[time_stamp()]\] Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]") + victim.attack_log += text("\[[time_stamp()]\] Has been [cook_type] in \a [src] by [user.name] ([user.ckey])") + msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") + + //Coat the victim in some oil + oil.trans_to(victim, 40) + + fry_loop.stop() + +/obj/machinery/appliance/cooker/fryer/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/weapon/reagent_containers/glass) && I.reagents) + if (I.reagents.total_volume <= 0 && oil) + //Its empty, handle scooping some hot oil out of the fryer + oil.trans_to(I, I.reagents.maximum_volume) + user.visible_message("[user] scoops some oil out of \the [src].", span("notice","You scoop some oil out of \the [src].")) + return 1 + else + //It contains stuff, handle pouring any oil into the fryer + //Possibly in future allow pouring non-oil reagents in, in order to sabotage it and poison food. + //That would really require coding some sort of filter or better replacement mechanism first + //So for now, restrict to oil only + var/amount = 0 + for (var/datum/reagent/R in I.reagents.reagent_list) + if (istype(R, /datum/reagent/nutriment/triglyceride/oil)) + var/delta = oil.get_free_space() + delta = min(delta, R.volume) + oil.add_reagent(R.id, delta) + I.reagents.remove_reagent(R.id, delta) + amount += delta + if (amount > 0) + user.visible_message("[user] pours some oil into \the [src].", span("notice","You pour [amount]u of oil into \the [src]."), "You hear something viscous being poured into a metal container.") + return 1 + //If neither of the above returned, then call parent as normal + ..() +>>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index 2c1bb493e8..41a760f475 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -53,9 +53,9 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new) if(!l2b) return var/list/dat = list("[title]") - dat += "Refresh

    " + dat += "Refresh

    " for(var/datum/mentor_help/MH as anything in l2b) - dat += "Ticket #[MH.id]: [MH.initiator_ckey]: [MH.name]
    " + dat += "Ticket #[MH.id]: [MH.initiator_ckey]: [MH.name]
    " usr << browse(dat.Join(), "window=mhelp_list[state];size=600x480") @@ -174,24 +174,24 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new) /datum/mentor_help/proc/ClosureLinks(ref_src) if(!ref_src) ref_src = "\ref[src]" - . = " (RSLVE)" + . = " (RSLVE)" //private /datum/mentor_help/proc/LinkedReplyName(ref_src) if(!ref_src) ref_src = "\ref[src]" - return "[initiator_ckey]" + return "[initiator_ckey]" //private /datum/mentor_help/proc/TicketHref(msg, ref_src, action = "ticket") if(!ref_src) ref_src = "\ref[src]" - return "[msg]" + return "[msg]" //message from the initiator without a target, all people with mentor powers will see this /datum/mentor_help/proc/MessageNoRecipient(msg) var/ref_src = "\ref[src]" - var/chat_msg = "(ESCALATE) Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)]: [msg]" + var/chat_msg = "(ESCALATE) Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)]: [msg]" AddInteraction("[LinkedReplyName(ref_src)]: [msg]") for (var/client/C in GLOB.mentors) if (C.is_preference_enabled(/datum/client_preference/play_mentorhelp_ping)) @@ -370,7 +370,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new) if(state == AHELP_ACTIVE) . += ClosureLinks(ref_src) if(state != AHELP_RESOLVED) - . += " (ESCALATE)" + . += " (ESCALATE)" //Forwarded action from admin/Topic OR mentor/Topic depending on which rank the caller has /datum/mentor_help/proc/Action(action) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index cd6dfd962d..5c32ecf8ef 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /mob/observer name = "observer" desc = "This shouldn't appear" @@ -1042,3 +1043,1049 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() +======= +/mob/observer + name = "observer" + desc = "This shouldn't appear" + density = FALSE + vis_flags = NONE + +/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 = TRUE // 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? + var/lighting_alpha = 255 + 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... + + 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) + default_pixel_x = body.default_pixel_x + default_pixel_y = body.default_pixel_y + if(!T && length(latejoin)) + T = pick(latejoin) //Safety in case we cannot find the body's position + if(T) + forceMove(T) + else + moveToNullspace() + to_chat(src, "Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.") + + 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) + animate(pixel_y = default_pixel_y, time = 10, loop = -1) + observer_mob_list += src + ..() + +/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 = tgui_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?", list("Admin Ghost", "Ghost", "Stay in body")) + if(response == "Admin Ghost") + if(!src.client) + return + src.client.admin_ghost() + else + response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Stay in body", "Ghost")) + 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 + //VOREStation Add + if(prevent_respawns.Find(mind.name)) + to_chat(usr, "You already quit this round as this character, sorry!") + return + //VOREStation Add End + 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 = tgui_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?",list("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/jumpable_areas() + var/list/areas = return_sorted_areas() + if(client?.holder) + return areas + + for(var/key in areas) + var/area/A = areas[key] + if(A.z in using_map?.secret_levels) + areas -= key + if(A.z in using_map?.hidden_levels) + areas -= key + + return areas + +/mob/observer/dead/proc/jumpable_mobs() + var/list/mobs = getmobs() + if(client?.holder) + return mobs + + for(var/key in mobs) + var/mobz = get_z(mobs[key]) + if(mobz in using_map?.secret_levels) + mobs -= key + if(mobz in using_map?.hidden_levels) + mobs -= key + + return mobs + +/mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas()) + set name = "Teleport" + set category = "Ghost" + set desc = "Teleport to a location." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/area/A + + if(!areaname) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) + return + A = areas[input] + if(!A) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) + usr.on_mob_jump() + +/mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs()) + set name = "Follow" + set category = "Ghost" + set desc = "Follow and haunt a mob." + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + var/mob/M + + if(!mobname) + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) + if(!input) + return + M = possible_mobs[input] + if(!M) + return + + if(!istype(usr, /mob/observer/dead)) + to_chat(usr, "Not when you're not dead!") + return + + ManualFollow(M || jumpable_mobs()[mobname]) + +/mob/observer/dead/forceMove(atom/destination) + if(client?.holder) + return ..() + + if(get_z(destination) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) + if(client?.holder) + return ..() + + if(get_z(newloc) in using_map?.secret_levels) + to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) + if(following) + stop_following() + return + + return ..() + +// 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(get_z(target) in using_map?.secret_levels) + to_chat(src, "Sorry, that target is in an area that ghosts aren't allowed to go.") + return + if(target != src) + if(following && following == target) + return + following = target + to_chat(src, "Now following [target]") + if(ismob(target)) + var/target_turf = get_turf(target) + if(!target_turf) + to_chat(usr, "This mob does not seem to exist in the tangible world.") + return + forceMove(target_turf) + 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 = default_pixel_y + pixel_x = default_pixel_x + transform = null + animate(src, pixel_y = 2, time = 10, loop = -1) + animate(pixel_y = default_pixel_y, 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.stop_following() + + 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() + observer_mob_list -= src + 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() //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 + + var/list/possible_mobs = jumpable_mobs() + var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) + if(!input) + return + + var/target = possible_mobs[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 + + //VOREStation Add Start + if(jobban_isbanned(src, "GhostRoles")) + to_chat(src, "You cannot become a mouse because you are banned from playing ghost roles.") + return + //VOREStation Add End + + 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 = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("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 += "

    Crew Manifest

    " + dat += data_core.get_manifest() + + src << browse(dat, "window=manifest;size=370x420;can_close=1") + +//This is called when a ghost is drag clicked to something. +/mob/observer/dead/MouseDrop(atom/over) + if(!usr || !over) return + if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) + if (usr.client.holder.cmd_ghost_drag(src,over)) + return + + return ..() + +//Used for drawing on walls with blood puddles as a spooky ghost. +/mob/observer/dead/verb/bloody_doodle() + + set category = "Ghost" + set name = "Write in blood" + set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." + + if(!(config.cult_ghostwriter)) + to_chat(src, "That verb is not currently permitted.") + return + + if (!src.stat) + return + + if (usr != src) + return 0 //something is terribly wrong + + var/ghosts_can_write + if(ticker.mode.name == "cult") + if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) + ghosts_can_write = 1 + + if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. + to_chat(src, "The veil is not thin enough for you to do that.") + return + + var/list/choices = list() + for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) + if(B.amount > 0) + choices += B + + if(!choices.len) + to_chat(src, "There is no blood to use nearby.") + return + + var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) + + var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) + var/turf/simulated/T = src.loc + if (direction != "Here") + T = get_step(T,text2dir(direction)) + + if (!istype(T)) + to_chat(src, "You cannot doodle there.") + return + + if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) + return + + var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" + + var/num_doodles = 0 + for (var/obj/effect/decal/cleanable/blood/writing/W in T) + num_doodles++ + if (num_doodles > 4) + to_chat(src, "There is no space to write on!") + return + + var/max_length = 50 + + var/message = sanitize(tgui_input_text(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "", max_length)) + + if (message) + + if (length(message) > max_length) + message += "-" + to_chat(src, "You ran out of blood to write with!") + + var/obj/effect/decal/cleanable/blood/writing/W = new(T) + W.basecolor = doodle_color + W.update_icon() + W.message = message + W.add_hiddenprint(src) + W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + +/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) + if(!..()) + return 0 + usr.visible_message("[src] points to [A]") + return 1 + +/mob/observer/dead/proc/manifest(mob/user) + is_manifest = TRUE + verbs |= /mob/observer/dead/proc/toggle_visibility + verbs |= /mob/observer/dead/proc/ghost_whisper + to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + if(plane != PLANE_WORLD) + user.visible_message( \ + "\The [user] drags ghost, [src], to our plane of reality!", \ + "You drag [src] to our plane of reality!" \ + ) + toggle_visibility(TRUE) + else + var/datum/gender/T = gender_datums[user.get_visible_gender()] + user.visible_message ( \ + "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ + "You get the feeling that the ghost can't become any more visible." \ + ) + +/mob/observer/dead/proc/toggle_icon(var/icon) + if(!client) + return + + var/iconRemoved = 0 + for(var/image/I in client.images) + if(I.icon_state == icon) + iconRemoved = 1 + qdel(I) + + if(!iconRemoved) + var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) + client.images += J + +/mob/observer/dead/proc/toggle_visibility(var/forced = 0) + set category = "Ghost" + set name = "Toggle Visibility" + set desc = "Allows you to turn (in)visible (almost) at will." + + var/toggled_invisible + if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) + to_chat(src, "You must gather strength before you can turn visible again...") + return + + if(plane == PLANE_WORLD) + toggled_invisible = world.time + visible_message("It fades from sight...", "You are now invisible.") + else + to_chat(src, "You are now visible!") + + plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS + invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER + + // Give the ghost a cult icon which should be visible only to itself + toggle_icon("cult") + +/mob/observer/dead/verb/toggle_anonsay() + set category = "Ghost" + set name = "Toggle Anonymous Chat" + set desc = "Toggles showing your key in dead chat." + + src.anonsay = !src.anonsay + if(anonsay) + to_chat(src, "Your key won't be shown when you speak in dead chat.") + else + to_chat(src, "Your key will be publicly visible again.") + +/mob/observer/dead/canface() + return 1 + +/mob/observer/dead/proc/can_admin_interact() + return check_rights(R_ADMIN|R_EVENT, 0, src) + +/mob/observer/dead/verb/toggle_ghostsee() + set name = "Toggle Ghost Vision" + set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" + set category = "Ghost" + ghostvision = !ghostvision + updateghostsight() + to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") + +/mob/observer/dead/verb/toggle_darkness() + set name = "Toggle Darkness" + set desc = "Toggles your ability to see lighting overlays, and the darkness they create." + set category = "Ghost" + + var/static/list/darkness_names = list("normal darkness levels", "30% darkness removed", "70% darkness removed", "no darkness") + var/static/list/darkness_levels = list(255, 178, 76, 0) + + var/index = darkness_levels.Find(lighting_alpha) + if(!index || index >= darkness_levels.len) + index = 1 + else + index++ + + lighting_alpha = darkness_levels[index] + updateghostsight() + to_chat(src, "Your vision now has [darkness_names[index]].") + +/mob/observer/dead/proc/updateghostsight() + plane_holder.set_desired_alpha(VIS_LIGHTING, lighting_alpha) + plane_holder.set_vis(VIS_LIGHTING, lighting_alpha) + plane_holder.set_vis(VIS_GHOSTS, ghostvision) + +/mob/observer/dead/MayRespawn(var/feedback = 0) + if(!client) + return 0 + if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) + if(feedback) + to_chat(src, "Your non-dead body prevent you from respawning.") + return 0 + if(config.antag_hud_restricted && has_enabled_antagHUD == 1) + if(feedback) + to_chat(src, "antagHUD restrictions prevent you from respawning.") + return 0 + return 1 + +/atom/proc/extra_ghost_link() + return + +/mob/extra_ghost_link(var/atom/ghost) + if(client && eyeobj) + return "|eye" + +/mob/observer/dead/extra_ghost_link(var/atom/ghost) + if(mind && mind.current) + return "|body" + +/proc/ghost_follow_link(var/atom/target, var/atom/ghost) + if((!target) || (!ghost)) return + . = "follow" + . += target.extra_ghost_link(ghost) + +//Culted Ghosts + +/mob/observer/dead/proc/ghost_whisper() + set name = "Spectral Whisper" + set category = "IC" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) + if(!M) + return 0 + var/msg = sanitize(tgui_input_text(src, "Message:", "Spectral Whisper")) + if(msg) + log_say("(SPECWHISP to [key_name(M)]): [msg]", src) + to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(src, " You said: '[msg]' to [M].") + else + return + return 1 + else + to_chat(src, "You have not been pulled past the veil!") + +/mob/observer/dead/verb/choose_ghost_sprite() + set category = "Ghost" + set name = "Choose Sprite" + + var/choice + var/previous_state + var/finalized = "No" + + while(finalized == "No" && src.client) + choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) + if(!choice) + return + + if(choice) + icon = 'icons/mob/ghost.dmi' + cut_overlays() + + if(icon_state && icon) + previous_state = icon_state + + icon_state = possible_ghost_sprites[choice] + finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) + + ghost_sprite = possible_ghost_sprites[choice] + + if(finalized == "No") + icon_state = previous_state + +/mob/observer/dead/is_blind() + return FALSE + +/mob/observer/dead/is_deaf() + return FALSE + +/mob/observer/dead/verb/paialert() + set category = "Ghost" + set name = "Blank pAI alert" + set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." + + var/time_till_respawn = time_till_respawn() + if(time_till_respawn == -1) // Special case, never allowed to respawn + to_chat(usr, "Respawning is not allowed!") + else if(time_till_respawn) // Nonzero time to respawn + to_chat(usr, "You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes.") + return + + if(jobban_isbanned(usr, "pAI")) + to_chat(usr,"You cannot alert pAI cards when you are banned from playing as a pAI.") + return + + if(usr.client.prefs?.be_special & BE_PAI) + var/choice = tgui_alert(usr, "Would you like to submit yourself to the recruitment list too?", "Confirmation", list("No", "Yes")) + if(choice == "Yes") + paiController.recruitWindow(usr) + var/count = 0 + for(var/obj/item/device/paicard/p in all_pai_cards) + var/obj/item/device/paicard/PP = p + if(PP.pai == null) + count++ + PP.add_overlay("pai-ghostalert") + PP.alertUpdate() + spawn(54) + PP.cut_overlays() + to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") + else + to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") + +/mob/observer/dead/speech_bubble_appearance() + return "ghost" + +// Lets a ghost know someone's trying to bring them back, and for them to get into their body. +// Mostly the same as TG's sans the hud element, since we don't have TG huds. +/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) + if((last_revive_notification + 2 MINUTES) > world.time) + return + last_revive_notification = world.time + + if(flashwindow) + window_flash(client) + if(message) + to_chat(src, "[message]") + if(source) + throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) + to_chat(src, "(Click to re-enter)") + if(sound) + SEND_SOUND(src, sound(sound)) + +/mob/observer/dead/verb/respawn() + set name = "Respawn" + set category = "Ghost" + src.abandon_mob() +>>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 7c8100c874..8df2a4c789 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1212,15 +1212,15 @@ /mob/living/vv_get_header() . = ..() . += {" - [src] -
    [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"] + [src] +
    [ckey ? ckey : "No ckey"] / [real_name ? real_name : "No real name"]
    - BRUTE:[getBruteLoss()] - FIRE:[getFireLoss()] - TOXIN:[getToxLoss()] - OXY:[getOxyLoss()] - CLONE:[getCloneLoss()] - BRAIN:[getBrainLoss()] + BRUTE:[getBruteLoss()] + FIRE:[getFireLoss()] + TOXIN:[getToxLoss()] + OXY:[getOxyLoss()] + CLONE:[getCloneLoss()] + BRAIN:[getBrainLoss()]
    "} diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 26ab8389a4..79fae449af 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -130,7 +130,11 @@ trashman.reset_view(src) START_PROCESSING(SSobj, src) user.visible_message("[hound.name]'s [src.name] groans lightly as [trashman] slips inside.", "Your [src.name] groans lightly as [trashman] slips inside.") +<<<<<<< HEAD log_attack("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])")//CHOMPEdit from message_admins +======= + message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") +>>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds playsound(src, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(delivery) if(islist(deliverylists[delivery_tag])) @@ -161,7 +165,7 @@ update_patient() START_PROCESSING(SSobj, src) user.visible_message("[hound.name]'s [src.name] lights up as [H.name] slips inside.", "Your [src] lights up as [H] slips inside. Life support functions engaged.") - message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") + message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") playsound(src, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) /obj/item/device/dogborg/sleeper/proc/go_out(var/target) @@ -558,7 +562,7 @@ water.add_charge(damage_gain) if(T.stat == DEAD) if(ishuman(T)) - message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])") + message_admins("[key_name(hound)] has digested [key_name(T)] as a dogborg. ([hound ? "JMP" : "null"])") to_chat(hound, "You feel your belly slowly churn around [T], breaking them down into a soft slurry to be used as power for your systems.") to_chat(T, "You feel [hound]'s belly slowly churn around your form, breaking you down into a soft slurry to be used as power for [hound]'s systems.") var/deathsound = pick( diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index ec906ca3ad..229bcf0869 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -27,13 +27,13 @@ //Snapshot is crazy and likes putting each topic hyperlink on a seperate line from any other tags so it's nice and clean. interactions += "
    The fax will transmit everything above this line
    " - interactions += "Send fax " - interactions += "Pen mode: [isCrayon ? "Crayon" : "Pen"] " - interactions += "Cancel fax " + interactions += "Send fax " + interactions += "Pen mode: [isCrayon ? "Crayon" : "Pen"] " + interactions += "Cancel fax " interactions += "
    " - interactions += "Toggle Header " - interactions += "Toggle Footer " - interactions += "Clear page " + interactions += "Toggle Header " + interactions += "Toggle Footer " + interactions += "Clear page " interactions += "
    " /obj/item/weapon/paper/admin/proc/generateHeader() diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index 1b8da0c4c1..290d2d18aa 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -249,8 +249,8 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins /obj/machinery/photocopier/faxmachine/proc/message_admins(var/mob/sender, var/faxname, var/obj/item/sent, var/reply_type, font_colour="#006100") var/msg = "[faxname]: [get_options_bar(sender, 2,1,1)]" - msg += "(REPLY): " - msg += "Receiving '[sent.name]' via secure connection ... view message" + msg += "(REPLY): " + msg += "Receiving '[sent.name]' via secure connection ... view message" for(var/client/C in GLOB.admins) if(check_rights((R_ADMIN|R_MOD|R_EVENT),0,C)) diff --git a/code/modules/persistence/datum/persistence_datum.dm b/code/modules/persistence/datum/persistence_datum.dm index 955a35377f..fb1cb166b9 100644 --- a/code/modules/persistence/datum/persistence_datum.dm +++ b/code/modules/persistence/datum/persistence_datum.dm @@ -132,7 +132,7 @@ /datum/persistent/proc/GetAdminDataStringFor(var/thing, var/can_modify, var/mob/user) if(can_modify) - . = "
    " + . = "" else . = "" diff --git a/code/modules/persistence/effects/graffiti.dm b/code/modules/persistence/effects/graffiti.dm index 369f9156b4..0a17787a65 100644 --- a/code/modules/persistence/effects/graffiti.dm +++ b/code/modules/persistence/effects/graffiti.dm @@ -41,6 +41,6 @@ /datum/persistent/graffiti/GetAdminDataStringFor(var/thing, var/can_modify, var/mob/user) var/obj/effect/decal/writing/save_graffiti = thing if(can_modify) - . = "" + . = "" else - . = "" \ No newline at end of file + . = "" diff --git a/code/modules/persistence/effects/paper.dm b/code/modules/persistence/effects/paper.dm index 95968274eb..26cbd83f95 100644 --- a/code/modules/persistence/effects/paper.dm +++ b/code/modules/persistence/effects/paper.dm @@ -39,7 +39,7 @@ /datum/persistent/paper/GetAdminDataStringFor(var/thing, var/can_modify, var/mob/user) var/obj/item/weapon/paper/paper = thing if(can_modify) - . = "" + . = "" else . = "" @@ -47,4 +47,4 @@ var/obj/structure/noticeboard/board = value.loc if(istype(board)) board.remove_paper(value) - qdel(value) \ No newline at end of file + qdel(value) diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 3dd58f6d7d..bdb05918c9 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -48,7 +48,7 @@ connect_to_network() /obj/machinery/power/emitter/Destroy() - message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) + message_admins("Emitter deleted at ([x],[y],[z] - JMP)",0,1) log_game("EMITTER([x],[y],[z]) Destroyed/deleted.") investigate_log("deleted at ([x],[y],[z])","singulo") ..() @@ -72,7 +72,7 @@ if(src.active==1) src.active = 0 to_chat(user, "You turn off [src].") - message_admins("Emitter turned off by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("Emitter turned off by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("EMITTER([x],[y],[z]) OFF by [key_name(user)]") investigate_log("turned off by [user.key]","singulo") else @@ -80,7 +80,7 @@ to_chat(user, "You turn on [src].") src.shot_number = 0 src.fire_delay = get_initial_fire_delay() - message_admins("Emitter turned on by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("Emitter turned on by [key_name(user, user.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("EMITTER([x],[y],[z]) ON by [key_name(user)]") investigate_log("turned on by [user.key]","singulo") update_icon() @@ -292,4 +292,4 @@ return burst_delay /obj/machinery/power/emitter/proc/get_emitter_beam() - return new /obj/item/projectile/beam/emitter(get_turf(src)) \ No newline at end of file + return new /obj/item/projectile/beam/emitter(get_turf(src)) diff --git a/code/modules/power/singularity/particle_accelerator/particle_control.dm b/code/modules/power/singularity/particle_accelerator/particle_control.dm index 9ccf421b57..0ede5d7e7d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_control.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_control.dm @@ -88,7 +88,7 @@ if(strength > strength_upper_limit) strength = strength_upper_limit else - message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer increased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PACCEL([x],[y],[z]) [key_name(usr)] increased to [strength]") investigate_log("increased to [strength] by [usr.key]","singulo") strength_change() @@ -99,7 +99,7 @@ if(strength < 0) strength = 0 else - message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer decreased to [strength] by [key_name(usr, usr.client)](?) in ([x],[y],[z] - JMP)",0,1) log_game("PACCEL([x],[y],[z]) [key_name(usr)] decreased to [strength]") investigate_log("decreased to [strength] by [usr.key]","singulo") strength_change() @@ -184,7 +184,7 @@ /obj/machinery/particle_accelerator/control_box/proc/toggle_power() active = !active investigate_log("turned [active?"ON":"OFF"] by [usr ? usr.key : "outside forces"]","singulo") - message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name(usr, usr.client) : "outside forces"](?) in ([x],[y],[z] - JMP)",0,1) + message_admins("PA Control Computer turned [active ?"ON":"OFF"] by [usr ? key_name(usr, usr.client) : "outside forces"](?) in ([x],[y],[z] - JMP)",0,1) log_game("PACCEL([x],[y],[z]) [usr ? key_name(usr, usr.client) : "outside forces"] turned [active?"ON":"OFF"].") if(active) update_use_power(USE_POWER_ACTIVE) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 8af3bbae52..851b8fc30f 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -95,7 +95,7 @@ GLOBAL_LIST_BOILERPLATE(all_singularities, /obj/singularity) var/count = locate(/obj/machinery/containment_field) in orange(30, src) if (!count) - message_admins("A singulo has been created without containment fields active ([x], [y], [z] - JMP).") + message_admins("A singulo has been created without containment fields active ([x], [y], [z] - JMP).") investigate_log("was created. [count ? "" : "No containment fields were active."]", I_SINGULO) diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 15c2f61f0d..44d3a748b5 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -192,7 +192,7 @@ if(G.siemens_coefficient == 0) user_protected = 1 log_game("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100") - message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") + message_admins("SMES FAILURE: [src.x]X [src.y]Y [src.z]Z User: [usr.ckey], Intensity: [intensity]/100 - JMP") var/used_hand = h_user.hand?"l_hand":"r_hand" diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 37568d77b1..4687f79b94 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -108,8 +108,8 @@ var/config_hallucination_power = 0.1 var/debug = 0 - - /// Cooldown tracker for accent sounds, + + /// Cooldown tracker for accent sounds, var/last_accent_sound = 0 var/datum/looping_sound/supermatter/soundloop @@ -169,7 +169,7 @@ set waitfor = 0 - message_admins("Supermatter exploded at ([x],[y],[z] - JMP)",0,1) + message_admins("Supermatter exploded at ([x],[y],[z] - JMP)",0,1) log_game("SUPERMATTER([x],[y],[z]) Exploded. Power:[power], Oxygen:[oxygen], Damage:[damage], Integrity:[get_integrity()]") anchored = TRUE grav_pulling = 1 @@ -305,7 +305,7 @@ shift_light(4,initial(light_color)) if(grav_pulling) supermatter_pull(src) - + // Vary volume by power produced. if(power) // Volume will be 1 at no power, ~12.5 at ENERGY_NITROGEN, and 20+ at ENERGY_PHORON. @@ -318,7 +318,7 @@ soundloop.mid_sounds = list('sound/machines/sm/loops/delamming.ogg' = 1) else soundloop.mid_sounds = list('sound/machines/sm/loops/calm.ogg' = 1) - + // Play Delam/Neutral sounds at rate determined by power and damage. if(last_accent_sound < world.time && prob(20)) var/aggression = min(((damage / 800) * (power / 2500)), 1.0) * 100 @@ -578,7 +578,7 @@ icon_state = "darkmatter_broken" /obj/item/broken_sm/New() - message_admins("Broken SM shard created at ([x],[y],[z] - JMP)",0,1) + message_admins("Broken SM shard created at ([x],[y],[z] - JMP)",0,1) START_PROCESSING(SSobj, src) return ..() diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm index 13dc59c027..010b89e19d 100644 --- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm +++ b/code/modules/reagents/machinery/dispenser/reagent_tank.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." @@ -488,3 +489,495 @@ reagents.splash_area(get_turf(src), 3) visible_message(span("danger", "The [src] bursts open, spreading oil all over the area.")) qdel(src) +======= +/obj/structure/reagent_dispensers + name = "Dispenser" + desc = "..." + icon = 'icons/obj/chemical_tanks.dmi' + icon_state = "tank" + layer = TABLE_LAYER + density = TRUE + anchored = FALSE + pressure_resistance = 2*ONE_ATMOSPHERE + + var/obj/item/hose_connector/input/active/InputSocket + var/obj/item/hose_connector/output/active/OutputSocket + + var/amount_per_transfer_from_this = 10 + var/possible_transfer_amounts = list(10,25,50,100) + +/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob) + return + +/obj/structure/reagent_dispensers/Destroy() + QDEL_NULL(InputSocket) + QDEL_NULL(OutputSocket) + + ..() + +/obj/structure/reagent_dispensers/Initialize() + var/datum/reagents/R = new/datum/reagents(5000) + reagents = R + R.my_atom = src + if (!possible_transfer_amounts) + src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT + + InputSocket = new(src) + InputSocket.carrier = src + OutputSocket = new(src) + OutputSocket.carrier = src + + . = ..() + +/obj/structure/reagent_dispensers/examine(mob/user) + . = ..() + if(get_dist(user, src) <= 2) + . += "It contains:" + if(reagents && reagents.reagent_list.len) + for(var/datum/reagent/R in reagents.reagent_list) + . += "[R.volume] units of [R.name]" + else + . += "Nothing." + +/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this + set name = "Set transfer amount" + set category = "Object" + set src in view(1) + var/N = tgui_input_list(usr, "Amount per transfer from this:","[src]", possible_transfer_amounts) + if (N) + amount_per_transfer_from_this = N + +/obj/structure/reagent_dispensers/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(50)) + new /obj/effect/effect/water(src.loc) + qdel(src) + return + if(3.0) + if (prob(5)) + new /obj/effect/effect/water(src.loc) + qdel(src) + return + else + return + +/obj/structure/reagent_dispensers/blob_act() + qdel(src) + +/* + * Tanks + */ + +//Water +/obj/structure/reagent_dispensers/watertank + name = "water tank" + desc = "A water tank." + icon_state = "water" + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispensers/watertank/Initialize() + . = ..() + reagents.add_reagent("water", 1000) + +/obj/structure/reagent_dispensers/watertank/high + name = "high-capacity water tank" + desc = "A highly-pressurized water tank made to hold vast amounts of water.." + icon_state = "water_high" + +/obj/structure/reagent_dispensers/watertank/high/Initialize() + . = ..() + reagents.add_reagent("water", 4000) + +//Fuel +/obj/structure/reagent_dispensers/fueltank + name = "fuel tank" + desc = "A fuel tank." + icon_state = "fuel" + amount_per_transfer_from_this = 10 + var/modded = 0 + var/obj/item/device/assembly_holder/rig = null + +/obj/structure/reagent_dispensers/fueltank/Initialize() + . = ..() + reagents.add_reagent("fuel",1000) + +/obj/structure/reagent_dispensers/fueltank/high + name = "high-capacity fuel tank" + desc = "A highly-pressurized fuel tank made to hold vast amounts of fuel." + icon_state = "fuel_high" + +/obj/structure/reagent_dispensers/fueltank/high/Initialize() + . = ..() + reagents.add_reagent("fuel",4000) + +//Foam +/obj/structure/reagent_dispensers/foam + name = "foam tank" + desc = "A foam tank." + icon_state = "foam" + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispensers/foam/Initialize() + . = ..() + reagents.add_reagent("firefoam",1000) + +//Helium3 +/obj/structure/reagent_dispensers/he3 + name = "/improper He3 tank" + desc = "A Helium3 tank." + icon_state = "he3" + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispenser/he3/Initialize() + ..() + reagents.add_reagent("helium3",1000) + +/* + * Misc + */ + +/obj/structure/reagent_dispensers/fueltank/barrel + name = "hazardous barrel" + desc = "An open-topped barrel full of nasty-looking liquid." + icon = 'icons/obj/objects_vr.dmi' + icon_state = "barrel" + modded = TRUE + +/obj/structure/reagent_dispensers/fueltank/barrel/two + name = "explosive barrel" + desc = "A barrel with warning labels painted all over it." + icon = 'icons/obj/objects_vr.dmi' + icon_state = "barrel2" + modded = FALSE + +/obj/structure/reagent_dispensers/fueltank/barrel/three + name = "fuel barrel" + desc = "An open-topped barrel full of nasty-looking liquid." + icon = 'icons/obj/objects_vr.dmi' + icon_state = "barrel3" + modded = FALSE + +/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob) + if (W.is_wrench()) //can't wrench it shut, it's always open + return + return ..() +//VOREStation Add End + +/obj/structure/reagent_dispensers/fueltank/examine(mob/user) + . = ..() + if(get_dist(user, src) <= 2) + if(modded) + . += "Fuel faucet is wrenched open, leaking the fuel!" + if(rig) + . += "There is some kind of device rigged to the tank." + +/obj/structure/reagent_dispensers/fueltank/attack_hand() + if (rig) + usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]") + if(do_after(usr, 20)) + usr.visible_message("[usr] detaches [rig] from \the [src].", "You detach [rig] from \the [src]") + rig.loc = get_turf(usr) + rig = null + overlays = new/list() + +/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob) + src.add_fingerprint(user) + if (W.is_wrench()) + user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \ + "You wrench [src]'s faucet [modded ? "closed" : "open"]") + modded = modded ? 0 : 1 + playsound(src, W.usesound, 75, 1) + if (modded) + message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)") + log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.") + leak_fuel(amount_per_transfer_from_this) + if (istype(W,/obj/item/device/assembly_holder)) + if (rig) + to_chat(user, "There is another device in the way.") + return ..() + user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]") + if(do_after(user, 20)) + user.visible_message("[user] rigs [W] to \the [src].", "You rig [W] to \the [src]") + + var/obj/item/device/assembly_holder/H = W + if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter)) + message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)") + log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.") + + rig = W + user.drop_item() + W.loc = src + + var/icon/test = getFlatIcon(W) + test.Shift(NORTH,1) + test.Shift(EAST,6) + add_overlay(test) + + return ..() + + +/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) + if(Proj.get_structure_damage()) + if(istype(Proj.firer)) + message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") + log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") + + if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) + explode() + +/obj/structure/reagent_dispensers/fueltank/ex_act() + explode() + +/obj/structure/reagent_dispensers/fueltank/blob_act() + explode() + +/obj/structure/reagent_dispensers/fueltank/proc/explode() + if (reagents.total_volume > 500) + explosion(src.loc,1,2,4) + else if (reagents.total_volume > 100) + explosion(src.loc,0,1,3) + else if (reagents.total_volume > 50) + explosion(src.loc,-1,1,2) + if(src) + qdel(src) + +/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) + if (modded) + explode() + else if (temperature > T0C+500) + explode() + return ..() + +/obj/structure/reagent_dispensers/fueltank/Move() + if (..() && modded) + leak_fuel(amount_per_transfer_from_this/10.0) + +/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount) + if (reagents.total_volume == 0) + return + + amount = min(amount, reagents.total_volume) + reagents.remove_reagent("fuel",amount) + new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount,1) + +/obj/structure/reagent_dispensers/peppertank + name = "Pepper Spray Refiller" + desc = "Refills pepper spray canisters." + icon = 'icons/obj/objects.dmi' + icon_state = "peppertank" + anchored = TRUE + density = FALSE + amount_per_transfer_from_this = 45 + +/obj/structure/reagent_dispensers/peppertank/Initialize() + . = ..() + reagents.add_reagent("condensedcapsaicin",1000) + +/obj/structure/reagent_dispensers/virusfood + name = "Virus Food Dispenser" + desc = "A dispenser of virus food. Yum." + icon = 'icons/obj/virology_vr.dmi' + icon_state = "virusfoodtank" + anchored = TRUE + density = FALSE + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispensers/virusfood/Initialize() + . = ..() + reagents.add_reagent("virusfood", 1000) + +/obj/structure/reagent_dispensers/acid + name = "Sulphuric Acid Dispenser" + desc = "A dispenser of acid for industrial processes." + icon = 'icons/obj/objects.dmi' + icon_state = "acidtank" + anchored = TRUE + density = FALSE + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispensers/acid/Initialize() + . = ..() + reagents.add_reagent("sacid", 1000) + +/obj/structure/reagent_dispensers/water_cooler + name = "Water-Cooler" + desc = "A machine that dispenses water to drink." + amount_per_transfer_from_this = 5 + icon = 'icons/obj/vending.dmi' + icon_state = "water_cooler" + possible_transfer_amounts = null + anchored = TRUE + var/bottle = 0 + var/cups = 0 + var/cupholder = 0 + +/obj/structure/reagent_dispensers/water_cooler/full + bottle = 1 + cupholder = 1 + cups = 10 + +/obj/structure/reagent_dispensers/water_cooler/Initialize() + . = ..() + if(bottle) + reagents.add_reagent("water",120) + update_icon() + +/obj/structure/reagent_dispensers/water_cooler/examine(mob/user) + . = ..() + if(cupholder) + . += "There are [cups] cups in the cup dispenser." + +/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise() + set name = "Rotate Cooler Clockwise" + set category = "Object" + set src in oview(1) + + if (src.anchored || usr:stat) + to_chat(usr, "It is fastened to the floor!") + return 0 + src.set_dir(turn(src.dir, 270)) + return 1 + +/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob) + if(I.is_wrench()) + src.add_fingerprint(user) + if(bottle) + playsound(src, I.usesound, 50, 1) + if(do_after(user, 20) && bottle) + to_chat(user, "You unfasten the jug.") + var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc ) + for(var/datum/reagent/R in reagents.reagent_list) + var/total_reagent = reagents.get_reagent_amount(R.id) + G.reagents.add_reagent(R.id, total_reagent) + reagents.clear_reagents() + bottle = 0 + update_icon() + else + if(anchored) + user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + if(do_after(user, 20 * I.toolspeed, src)) + if(!src) return + to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") + anchored = !anchored + playsound(src, I.usesound, 50, 1) + return + + if(I.is_screwdriver()) + if(cupholder) + playsound(src, I.usesound, 50, 1) + to_chat(user, "You take the cup dispenser off.") + new /obj/item/stack/material/plastic( src.loc ) + if(cups) + for(var/i = 0 to cups) + new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc) + cups = 0 + cupholder = 0 + update_icon() + return + if(!bottle && !cupholder) + playsound(src, I.usesound, 50, 1) + to_chat(user, "You start taking the water-cooler apart.") + if(do_after(user, 20 * I.toolspeed) && !bottle && !cupholder) + to_chat(user, "You take the water-cooler apart.") + new /obj/item/stack/material/plastic( src.loc, 4 ) + qdel(src) + return + + if(istype(I, /obj/item/weapon/reagent_containers/glass/cooler_bottle)) + src.add_fingerprint(user) + if(!bottle) + if(anchored) + var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I + to_chat(user, "You start to screw the bottle onto the water-cooler.") + if(do_after(user, 20) && !bottle && anchored) + bottle = 1 + update_icon() + to_chat(user, "You screw the bottle onto the water-cooler!") + for(var/datum/reagent/R in G.reagents.reagent_list) + var/total_reagent = G.reagents.get_reagent_amount(R.id) + reagents.add_reagent(R.id, total_reagent) + qdel(G) + else + to_chat(user, "You need to wrench down the cooler first.") + else + to_chat(user, "There is already a bottle there!") + return 1 + + if(istype(I, /obj/item/stack/material/plastic)) + if(!cupholder) + if(anchored) + var/obj/item/stack/material/plastic/P = I + src.add_fingerprint(user) + to_chat(user, "You start to attach a cup dispenser onto the water-cooler.") + playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) + if(do_after(user, 20) && !cupholder && anchored) + if (P.use(1)) + to_chat(user, "You attach a cup dispenser onto the water-cooler.") + cupholder = 1 + update_icon() + else + to_chat(user, "You need to wrench down the cooler first.") + else + to_chat(user, "There is already a cup dispenser there!") + return + +/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user) + if(cups) + new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc) + cups-- + flick("[icon_state]-vend", src) + return + +/obj/structure/reagent_dispensers/water_cooler/update_icon() + icon_state = "water_cooler" + cut_overlays() + if(bottle) + add_overlay("water_cooler_bottle") + +/obj/structure/reagent_dispensers/beerkeg + name = "beer keg" + desc = "A beer keg." + icon = 'icons/obj/objects.dmi' + icon_state = "beertankTEMP" + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispensers/beerkeg/Initialize() + . = ..() + reagents.add_reagent("beer",1000) + +/obj/structure/reagent_dispensers/beerkeg/fakenuke + name = "nuclear beer keg" + desc = "A beer keg in the form of a nuclear bomb! An absolute blast at parties!" + icon = 'icons/obj/stationobjs.dmi' + icon_state = "nuclearbomb0" + +//Cooking oil refill tank +/obj/structure/reagent_dispensers/cookingoil + name = "cooking oil tank" + desc = "A fifty-litre tank of commercial-grade corn oil, intended for use in large scale deep fryers. Store in a cool, dark place" + icon = 'icons/obj/objects.dmi' + icon_state = "oiltank" + amount_per_transfer_from_this = 120 + +/obj/structure/reagent_dispensers/cookingoil/Initialize() + . = ..() + reagents.add_reagent("cookingoil",5000) + +/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj) + if(Proj.get_structure_damage()) + explode() + +/obj/structure/reagent_dispensers/cookingoil/ex_act() + explode() + +/obj/structure/reagent_dispensers/cookingoil/proc/explode() + reagents.splash_area(get_turf(src), 3) + visible_message(span("danger", "The [src] bursts open, spreading oil all over the area.")) + qdel(src) +>>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds diff --git a/code/modules/scripting/IDE.dm b/code/modules/scripting/IDE.dm index 5b6ea4daf0..f1eb26c458 100644 --- a/code/modules/scripting/IDE.dm +++ b/code/modules/scripting/IDE.dm @@ -11,7 +11,7 @@ var/tcscode=winget(src, "tcscode", "text") var/msg="[mob.name] is adding script to server [Server]: [tcscode]" log_misc(msg) - message_admins("[mob.name] has uploaded a NTLS script to [Machine.SelectedServer] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) + message_admins("[mob.name] has uploaded a NTLS script to [Machine.SelectedServer] ([mob.x],[mob.y],[mob.z] - JMP)",0,1) Server.setcode( tcscode ) // this actually saves the code from input to the server src << output(null, "tcserror") // clear the errors else diff --git a/code/modules/tgui/modules/admin/player_notes.dm b/code/modules/tgui/modules/admin/player_notes.dm index 678758d7d3..6f20bdc11d 100644 --- a/code/modules/tgui/modules/admin/player_notes.dm +++ b/code/modules/tgui/modules/admin/player_notes.dm @@ -195,7 +195,7 @@ PlayerNotesPageLegacy(1, filter) /datum/admins/proc/PlayerNotesPageLegacy(page, filter) - var/dat = "Player notes - Apply Filter
    " + var/dat = "Player notes - Apply Filter
    " var/savefile/S=new("data/player_notes.sav") var/list/note_keys S >> note_keys @@ -228,7 +228,7 @@ upper_bound = min(upper_bound, note_keys.len) for(var/index = lower_bound, index <= upper_bound, index++) var/t = note_keys[index] - dat += "
    " + dat += "" dat += "
    Antagonist Positions
    Antagonist Positions
    [replacetext("[antag.role_text]", " ", " ")][replacetext("[antag.role_text]", " ", " ")][replacetext("[antag.role_text]", " ", " ")][replacetext("[antag.role_text]", " ", " ")]
    Other Roles
    [entry][entry][entry][entry]
    " - entry += " (?)" + entry += " (?)" entry += "
    [thing]Destroy[thing]Destroy[thing][save_graffiti.message][save_graffiti.author]Destroy[save_graffiti.message][save_graffiti.author]Destroy[save_graffiti.message][save_graffiti.author][save_graffiti.message][save_graffiti.author][paper.info][paper.name][paper.last_modified_ckey]Destroy[paper.info][paper.name][paper.last_modified_ckey]Destroy[paper.info][paper.name][paper.last_modified_ckey]
    [t]
    [t]

    " @@ -236,7 +236,7 @@ for(var/index = 1, index <= number_pages, index++) if(index == page) dat += "" - dat += "[index] " + dat += "[index] " if(index == page) dat += "" @@ -283,12 +283,12 @@ update_file = 1 dat += "[I.content] by [I.author] ([I.rank]) on [I.timestamp] " if(I.author == usr.key || I.author == "Adminbot" || ishost(usr)) - dat += "Remove" + dat += "Remove" dat += "

    " if(update_file) info << infos dat += "
    " - dat += "Add Comment
    " + dat += "Add Comment
    " dat += "" usr << browse(dat, "window=adminplayerinfo;size=480x480") diff --git a/code/modules/virus2/admin.dm b/code/modules/virus2/admin.dm index 5ca289bd2a..30e673960c 100644 --- a/code/modules/virus2/admin.dm +++ b/code/modules/virus2/admin.dm @@ -75,9 +75,9 @@ for(var/i = 1 to 4) var/datum/disease2/effect/Eff = s[i] H += {" - [initial(Eff.name)] - Chance: [s_chance[i]] - Multiplier: [s_multiplier[i]] + [initial(Eff.name)] + Chance: [s_chance[i]] + Multiplier: [s_multiplier[i]]
    "} H += {" @@ -91,27 +91,27 @@ continue if(!f) H += " | " else f = 0 - H += "[k]" + H += "[k]" H += {" - Reset + Reset
    - Infection Chance: [infectionchance]
    - Spread Type: [spreadtype]
    - Speed: [speed]
    - Resistance: [resistance]
    + Infection Chance: [infectionchance]
    + Spread Type: [spreadtype]
    + Speed: [speed]
    + Resistance: [resistance]

    "} f = 1 for(var/k in ALL_ANTIGENS) if(!f) H += " | " else f = 0 - H += "[k]" + H += "[k]" H += {" - Reset + Reset

    - Initial infectee: [infectee ? infectee : "(choose)"] - RELEASE + Initial infectee: [infectee ? infectee : "(choose)"] + RELEASE "} user << browse(H, "window=virus2edit") @@ -215,7 +215,7 @@ spawned_viruses += D - message_admins("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)") + message_admins("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus (Info)") log_admin("[key_name_admin(usr)] infected [key_name_admin(infectee)] with a virus!") infect_virus2(infectee, D, forced=1) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 1be038d66d..3d9ae887fc 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -515,7 +515,7 @@ forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave. for(var/mob/living/simple_mob/SA in range(10)) LAZYSET(SA.prey_excludes, src, world.time) - log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "JMP" : "null"])") + log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "JMP" : "null"])") B.owner.update_fullness() //CHOMPEdit - This is run whenever a belly's contents are changed. if(!ishuman(B.owner)) @@ -530,14 +530,14 @@ if(confirm != "Okay" || loc != belly) return //Actual escaping - log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(pred)] (BORG) ([pred ? "JMP" : "null"])") + log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(pred)] (BORG) ([pred ? "JMP" : "null"])") belly.go_out(src) //Just force-ejects from the borg as if they'd clicked the eject button. //You're in an AI hologram! else if(istype(loc, /obj/effect/overlay/aiholo)) var/obj/effect/overlay/aiholo/holo = loc holo.drop_prey() //Easiest way - log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(holo.master)] (AI HOLO) ([holo ? "JMP" : "null"])") + log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(holo.master)] (AI HOLO) ([holo ? "JMP" : "null"])") //You're in a capture crystal! ((It's not vore but close enough!)) else if(iscapturecrystal(loc)) diff --git a/html/create_object.html b/html/create_object.html index 7ed93d9818..47d7faf5ab 100644 --- a/html/create_object.html +++ b/html/create_object.html @@ -14,8 +14,8 @@ color: #00f; font-family: Georgia, Arial, sans-serif; } - img { - border: 0px; + img { + border: 0px; } p.lic { font-size: 6pt; @@ -26,18 +26,19 @@
    + /* hreftokenfield */ - + Type
    Offset: - + A R
    - + Number: Dir: - Name:
    - Where: + Name:
    + Where:


    - -
    + +
    - +
    - + - \ No newline at end of file + From ce917585eacd5176ee2ffe84616c24f04c6f8568 Mon Sep 17 00:00:00 2001 From: Razgriz Date: Thu, 15 Dec 2022 14:20:40 -0700 Subject: [PATCH 2/8] powder that makes you say yes --- code/game/atoms.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7cd2480684..d3207d0293 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -721,8 +721,6 @@ /atom/proc/interact(mob/user) return -<<<<<<< HEAD -======= // Purpose: Determines if the object can pass this atom. // Called by: Movement. @@ -731,4 +729,3 @@ // Airflow and ZAS zones now uses CanZASPass() instead of this proc. /atom/proc/CanPass(atom/movable/mover, turf/target) return !density ->>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds From a0e22e6d307c4c35cb63b2cfccb25b50241bea2d Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Thu, 15 Dec 2022 21:51:20 -0500 Subject: [PATCH 3/8] powder that makes you say yes --- .../food/kitchen/cooking_machines/fryer.dm | 274 +----------------- 1 file changed, 1 insertion(+), 273 deletions(-) diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm index 960de269ef..edf1df8882 100644 --- a/code/modules/food/kitchen/cooking_machines/fryer.dm +++ b/code/modules/food/kitchen/cooking_machines/fryer.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /obj/machinery/appliance/cooker/fryer name = "deep fryer" desc = "Deep fried everything." @@ -236,7 +235,7 @@ user.attack_log += text("\[[time_stamp()]\] Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]") victim.attack_log += text("\[[time_stamp()]\] Has been [cook_type] in \a [src] by [user.name] ([user.ckey])") - msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") + msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") //Coat the victim in some oil oil.trans_to(victim, 40) @@ -274,274 +273,3 @@ return 1 //If neither of the above returned, then call parent as normal ..() -======= -/obj/machinery/appliance/cooker/fryer - name = "deep fryer" - desc = "Deep fried everything." - icon_state = "fryer_off" - can_cook_mobs = 1 - cook_type = "deep fried" - on_icon = "fryer_on" - off_icon = "fryer_off" - food_color = "#FFAD33" - cooked_sound = 'sound/machines/ding.ogg' - var/datum/looping_sound/deep_fryer/fry_loop - circuit = /obj/item/weapon/circuitboard/fryer - appliancetype = FRYER - active_power_usage = 12 KILOWATTS - heating_power = 12 KILOWATTS - - light_y = 15 - - min_temp = 140 + T0C // Same as above, increasing this to just under 2x to make the % increase on efficiency not quite so painful as it would be at 80. - optimal_temp = 400 + T0C // Increasing this to be 2x Oven to allow for a much higher/realistic frying temperatures. Doesn't really do anything but make heating the fryer take a bit longer. - optimal_power = 0.95 // .35 higher than the default to give fryers faster cooking speed. - - idle_power_usage = 3.6 KILOWATTS - // Power used to maintain temperature once it's heated. - // Going with 25% of the active power. This is a somewhat arbitrary value. - - resistance = 10 KILOWATTS // Approx. 10 minutes to heat up. - - max_contents = 2 - container_type = /obj/item/weapon/reagent_containers/cooking_container/fryer - - stat = POWEROFF // Starts turned off - - var/datum/reagents/oil - var/optimal_oil = 9000 //90 litres of cooking oil - -/obj/machinery/appliance/cooker/fryer/Initialize() - . = ..() - fry_loop = new(list(src), FALSE) - - oil = new/datum/reagents(optimal_oil * 1.25, src) - var/variance = rand()*0.15 - // Fryer is always a little below full, but its usually negligible - - if(prob(20)) - // Sometimes the fryer will start with much less than full oil, significantly impacting efficiency until filled - variance = rand()*0.5 - oil.add_reagent("cookingoil", optimal_oil*(1 - variance)) - -/obj/machinery/appliance/cooker/fryer/Destroy() - QDEL_NULL(fry_loop) - QDEL_NULL(oil) - return ..() - -/obj/machinery/appliance/cooker/fryer/examine(var/mob/user) - . = ..() - if(Adjacent(user)) - to_chat(user, "Oil Level: [oil.total_volume]/[optimal_oil]") - -/obj/machinery/appliance/cooker/fryer/update_icon() // We add our own version of the proc to use the special fryer double-lights. - cut_overlays() - var/image/light - if(use_power == 1 && !stat) - light = image(icon, "fryer_light_idle") - else if(use_power == 2 && !stat) - light = image(icon, "fryer_light_preheating") - else - light = image(icon, "fryer_light_off") - light.pixel_x = light_x - light.pixel_y = light_y - add_overlay(light) - -/obj/machinery/appliance/cooker/fryer/heat_up() - if (..()) - //Set temperature of oil reagent - var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() - if (OL && istype(OL)) - OL.data["temperature"] = temperature - -/obj/machinery/appliance/cooker/fryer/equalize_temperature() - if (..()) - //Set temperature of oil reagent - var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() - if (OL && istype(OL)) - OL.data["temperature"] = temperature - -/obj/machinery/appliance/cooker/fryer/update_cooking_power() - ..()//In addition to parent temperature calculation - //Fryer efficiency also drops when oil levels arent optimal - var/oil_level = 0 - var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() - if(OL && istype(OL)) - oil_level = OL.volume - - var/oil_efficiency = 0 - if(oil_level) - oil_efficiency = oil_level / optimal_oil - - if(oil_efficiency > 1) - //We're above optimal, efficiency goes down as we pass too much over it - oil_efficiency = 1 - (oil_efficiency - 1) - - - cooking_power *= oil_efficiency - -/obj/machinery/appliance/cooker/fryer/update_icon() - if(!stat) - ..() - if(cooking == TRUE) - icon_state = on_icon - if(fry_loop) - fry_loop.start(src) - else - icon_state = off_icon - if(fry_loop) - fry_loop.stop(src) - else - icon_state = off_icon - if(fry_loop) - fry_loop.stop(src) - ..() - -//Fryer gradually infuses any cooked food with oil. Moar calories -//This causes a slow drop in oil levels, encouraging refill after extended use -/obj/machinery/appliance/cooker/fryer/do_cooking_tick(var/datum/cooking_item/CI) - if(..() && (CI.oil < CI.max_oil) && prob(20)) - var/datum/reagents/buffer = new /datum/reagents(2) - oil.trans_to_holder(buffer, min(0.5, CI.max_oil - CI.oil)) - CI.oil += buffer.total_volume - CI.container.soak_reagent(buffer) - - -//To solve any odd logic problems with results having oil as part of their compiletime ingredients. -//Upon finishing a recipe the fryer will analyse any oils in the result, and replace them with our oil -//As well as capping the total to the max oil -/obj/machinery/appliance/cooker/fryer/finish_cooking(var/datum/cooking_item/CI) - ..() - var/total_oil = 0 - var/total_our_oil = 0 - var/total_removed = 0 - var/datum/reagent/our_oil = oil.get_master_reagent() - - for (var/obj/item/I in CI.container) - if (I.reagents && I.reagents.total_volume) - for (var/datum/reagent/R in I.reagents.reagent_list) - if (istype(R, /datum/reagent/nutriment/triglyceride/oil)) - total_oil += R.volume - if (R.id != our_oil.id) - total_removed += R.volume - I.reagents.remove_reagent(R.id, R.volume) - else - total_our_oil += R.volume - - - if (total_removed > 0 || total_oil != CI.max_oil) - total_oil = min(total_oil, CI.max_oil) - - if (total_our_oil < total_oil) - //If we have less than the combined total, then top up from our reservoir - var/datum/reagents/buffer = new /datum/reagents(INFINITY) - oil.trans_to_holder(buffer, total_oil - total_our_oil) - CI.container.soak_reagent(buffer) - else if (total_our_oil > total_oil) - - //If we have more than the maximum allowed then we delete some. - //This could only happen if one of the objects spawns with the same type of oil as ours - var/portion = 1 - (total_oil / total_our_oil) //find the percentage to remove - for (var/obj/item/I in CI.container) - if (I.reagents && I.reagents.total_volume) - for (var/datum/reagent/R in I.reagents.reagent_list) - if (R.id == our_oil.id) - I.reagents.remove_reagent(R.id, R.volume*portion) - -/obj/machinery/appliance/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user) - - if(!istype(victim)) - return - - // user.visible_message("\The [user] starts pushing \the [victim] into \the [src]!") - - //Removed delay on this action in favour of a cooldown after it - //If you can lure someone close to the fryer and grab them then you deserve success. - //And a delay on this kind of niche action just ensures it never happens - //Cooldown ensures it can't be spammed to instakill someone - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN*3) - - fry_loop.start(src) - - if(!do_mob(user, victim, 20)) - cooking = FALSE - icon_state = off_icon - fry_loop.stop(src) - return - - if(!victim || !victim.Adjacent(user)) - to_chat(user, "Your victim slipped free!") - cooking = FALSE - icon_state = off_icon - fry_loop.stop(src) - return - - var/damage = rand(7,13) // Though this damage seems reduced, some hot oil is transferred to the victim and will burn them for a while after - - var/datum/reagent/nutriment/triglyceride/oil/OL = oil.get_master_reagent() - damage *= OL.heatdamage(victim) - - var/obj/item/organ/external/E - var/nopain - if(ishuman(victim) && user.zone_sel.selecting != BP_GROIN && user.zone_sel.selecting != BP_TORSO) - var/mob/living/carbon/human/H = victim - E = H.get_organ(user.zone_sel.selecting) - if(!E || E.species.flags & NO_PAIN) - nopain = 2 - else if(E.robotic >= ORGAN_ROBOT) - nopain = 1 - - user.visible_message("\The [user] shoves \the [victim][E ? "'s [E.name]" : ""] into \the [src]!") - if (damage > 0) - if(E) - if(E.children && E.children.len) - for(var/obj/item/organ/external/child in E.children) - if(nopain && nopain < 2 && !(child.robotic >= ORGAN_ROBOT)) - nopain = 0 - child.take_damage(0, damage) - damage -= (damage*0.5)//IF someone's arm is plunged in, the hand should take most of it - E.take_damage(0, damage) - else - victim.apply_damage(damage, BURN, user.zone_sel.selecting) - - if(!nopain) - to_chat(victim, "Agony consumes you as searing hot oil scorches your [E ? E.name : "flesh"] horribly!") - victim.emote("scream") - else - to_chat(victim, "Searing hot oil scorches your [E ? E.name : "flesh"]!") - - user.attack_log += text("\[[time_stamp()]\] Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]") - victim.attack_log += text("\[[time_stamp()]\] Has been [cook_type] in \a [src] by [user.name] ([user.ckey])") - msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") - - //Coat the victim in some oil - oil.trans_to(victim, 40) - - fry_loop.stop() - -/obj/machinery/appliance/cooker/fryer/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/reagent_containers/glass) && I.reagents) - if (I.reagents.total_volume <= 0 && oil) - //Its empty, handle scooping some hot oil out of the fryer - oil.trans_to(I, I.reagents.maximum_volume) - user.visible_message("[user] scoops some oil out of \the [src].", span("notice","You scoop some oil out of \the [src].")) - return 1 - else - //It contains stuff, handle pouring any oil into the fryer - //Possibly in future allow pouring non-oil reagents in, in order to sabotage it and poison food. - //That would really require coding some sort of filter or better replacement mechanism first - //So for now, restrict to oil only - var/amount = 0 - for (var/datum/reagent/R in I.reagents.reagent_list) - if (istype(R, /datum/reagent/nutriment/triglyceride/oil)) - var/delta = oil.get_free_space() - delta = min(delta, R.volume) - oil.add_reagent(R.id, delta) - I.reagents.remove_reagent(R.id, delta) - amount += delta - if (amount > 0) - user.visible_message("[user] pours some oil into \the [src].", span("notice","You pour [amount]u of oil into \the [src]."), "You hear something viscous being poured into a metal container.") - return 1 - //If neither of the above returned, then call parent as normal - ..() ->>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds From 8a01a66ac8c2cd1d7c038873456bb4e0193c5cad Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Thu, 15 Dec 2022 21:56:10 -0500 Subject: [PATCH 4/8] powder that makes you say yes --- code/modules/mob/dead/observer/observer.dm | 1051 +------------------- 1 file changed, 2 insertions(+), 1049 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 5c32ecf8ef..19fa408643 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" @@ -238,9 +237,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp 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) + 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) + 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. @@ -1043,1049 +1042,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set name = "Respawn" set category = "Ghost" src.abandon_mob() -======= -/mob/observer - name = "observer" - desc = "This shouldn't appear" - density = FALSE - vis_flags = NONE - -/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 = TRUE // 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? - var/lighting_alpha = 255 - 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... - - 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) - default_pixel_x = body.default_pixel_x - default_pixel_y = body.default_pixel_y - if(!T && length(latejoin)) - T = pick(latejoin) //Safety in case we cannot find the body's position - if(T) - forceMove(T) - else - moveToNullspace() - to_chat(src, "Could not locate an observer spawn point. Use the Teleport verb to jump to the station map.") - - 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) - animate(pixel_y = default_pixel_y, time = 10, loop = -1) - observer_mob_list += src - ..() - -/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 = tgui_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?", list("Admin Ghost", "Ghost", "Stay in body")) - if(response == "Admin Ghost") - if(!src.client) - return - src.client.admin_ghost() - else - response = tgui_alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. Don't abuse ghost unless you are inside a cryopod or equivalent! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", list("Stay in body", "Ghost")) - 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 - //VOREStation Add - if(prevent_respawns.Find(mind.name)) - to_chat(usr, "You already quit this round as this character, sorry!") - return - //VOREStation Add End - 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 = tgui_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?",list("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/jumpable_areas() - var/list/areas = return_sorted_areas() - if(client?.holder) - return areas - - for(var/key in areas) - var/area/A = areas[key] - if(A.z in using_map?.secret_levels) - areas -= key - if(A.z in using_map?.hidden_levels) - areas -= key - - return areas - -/mob/observer/dead/proc/jumpable_mobs() - var/list/mobs = getmobs() - if(client?.holder) - return mobs - - for(var/key in mobs) - var/mobz = get_z(mobs[key]) - if(mobz in using_map?.secret_levels) - mobs -= key - if(mobz in using_map?.hidden_levels) - mobs -= key - - return mobs - -/mob/observer/dead/verb/dead_tele(areaname as anything in jumpable_areas()) - set name = "Teleport" - set category = "Ghost" - set desc = "Teleport to a location." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/area/A - - if(!areaname) - var/list/areas = jumpable_areas() - var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) - if(!input) - return - A = areas[input] - if(!A) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - usr.forceMove(pick(get_area_turfs(A || jumpable_areas()[areaname]))) - usr.on_mob_jump() - -/mob/observer/dead/verb/follow(mobname as anything in jumpable_mobs()) - set name = "Follow" - set category = "Ghost" - set desc = "Follow and haunt a mob." - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - var/mob/M - - if(!mobname) - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Follow", possible_mobs) - if(!input) - return - M = possible_mobs[input] - if(!M) - return - - if(!istype(usr, /mob/observer/dead)) - to_chat(usr, "Not when you're not dead!") - return - - ManualFollow(M || jumpable_mobs()[mobname]) - -/mob/observer/dead/forceMove(atom/destination) - if(client?.holder) - return ..() - - if(get_z(destination) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -/mob/observer/dead/Move(atom/newloc, direct = 0, movetime) - if(client?.holder) - return ..() - - if(get_z(newloc) in using_map?.secret_levels) - to_chat(src,SPAN_WARNING("Sorry, that z-level does not allow ghosts.")) - if(following) - stop_following() - return - - return ..() - -// 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(get_z(target) in using_map?.secret_levels) - to_chat(src, "Sorry, that target is in an area that ghosts aren't allowed to go.") - return - if(target != src) - if(following && following == target) - return - following = target - to_chat(src, "Now following [target]") - if(ismob(target)) - var/target_turf = get_turf(target) - if(!target_turf) - to_chat(usr, "This mob does not seem to exist in the tangible world.") - return - forceMove(target_turf) - 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 = default_pixel_y - pixel_x = default_pixel_x - transform = null - animate(src, pixel_y = 2, time = 10, loop = -1) - animate(pixel_y = default_pixel_y, 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.stop_following() - - 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() - observer_mob_list -= src - 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() //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 - - var/list/possible_mobs = jumpable_mobs() - var/input = tgui_input_list(usr, "Select a mob:", "Ghost Jump", possible_mobs) - if(!input) - return - - var/target = possible_mobs[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 - - //VOREStation Add Start - if(jobban_isbanned(src, "GhostRoles")) - to_chat(src, "You cannot become a mouse because you are banned from playing ghost roles.") - return - //VOREStation Add End - - 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 = tgui_alert(src, "Are you -sure- you want to become a mouse?","Are you sure you want to squeek?",list("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 += "

    Crew Manifest

    " - dat += data_core.get_manifest() - - src << browse(dat, "window=manifest;size=370x420;can_close=1") - -//This is called when a ghost is drag clicked to something. -/mob/observer/dead/MouseDrop(atom/over) - if(!usr || !over) return - if (isobserver(usr) && usr.client && usr.client.holder && isliving(over)) - if (usr.client.holder.cmd_ghost_drag(src,over)) - return - - return ..() - -//Used for drawing on walls with blood puddles as a spooky ghost. -/mob/observer/dead/verb/bloody_doodle() - - set category = "Ghost" - set name = "Write in blood" - set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." - - if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") - return - - if (!src.stat) - return - - if (usr != src) - return 0 //something is terribly wrong - - var/ghosts_can_write - if(ticker.mode.name == "cult") - if(cult.current_antagonists.len > config.cult_ghostwriter_req_cultists) - ghosts_can_write = 1 - - if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") - return - - var/list/choices = list() - for(var/obj/effect/decal/cleanable/blood/B in view(1,src)) - if(B.amount > 0) - choices += B - - if(!choices.len) - to_chat(src, "There is no blood to use nearby.") - return - - var/obj/effect/decal/cleanable/blood/choice = tgui_input_list(src, "What blood would you like to use?", "Blood Choice", choices) - - var/direction = tgui_input_list(src,"Which way?","Tile selection", list("Here","North","South","East","West")) - var/turf/simulated/T = src.loc - if (direction != "Here") - T = get_step(T,text2dir(direction)) - - if (!istype(T)) - to_chat(src, "You cannot doodle there.") - return - - if(!choice || choice.amount == 0 || !(src.Adjacent(choice))) - return - - var/doodle_color = (choice.basecolor) ? choice.basecolor : "#A10808" - - var/num_doodles = 0 - for (var/obj/effect/decal/cleanable/blood/writing/W in T) - num_doodles++ - if (num_doodles > 4) - to_chat(src, "There is no space to write on!") - return - - var/max_length = 50 - - var/message = sanitize(tgui_input_text(usr, "Write a message. It cannot be longer than [max_length] characters.","Blood writing", "", max_length)) - - if (message) - - if (length(message) > max_length) - message += "-" - to_chat(src, "You ran out of blood to write with!") - - var/obj/effect/decal/cleanable/blood/writing/W = new(T) - W.basecolor = doodle_color - W.update_icon() - W.message = message - W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") - -/mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) - if(!..()) - return 0 - usr.visible_message("[src] points to [A]") - return 1 - -/mob/observer/dead/proc/manifest(mob/user) - is_manifest = TRUE - verbs |= /mob/observer/dead/proc/toggle_visibility - verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") - if(plane != PLANE_WORLD) - user.visible_message( \ - "\The [user] drags ghost, [src], to our plane of reality!", \ - "You drag [src] to our plane of reality!" \ - ) - toggle_visibility(TRUE) - else - var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message ( \ - "\The [user] just tried to smash [T.his] book into that ghost! It's not very effective.", \ - "You get the feeling that the ghost can't become any more visible." \ - ) - -/mob/observer/dead/proc/toggle_icon(var/icon) - if(!client) - return - - var/iconRemoved = 0 - for(var/image/I in client.images) - if(I.icon_state == icon) - iconRemoved = 1 - qdel(I) - - if(!iconRemoved) - var/image/J = image('icons/mob/mob.dmi', loc = src, icon_state = icon) - client.images += J - -/mob/observer/dead/proc/toggle_visibility(var/forced = 0) - set category = "Ghost" - set name = "Toggle Visibility" - set desc = "Allows you to turn (in)visible (almost) at will." - - var/toggled_invisible - if(!forced && plane == PLANE_GHOSTS && world.time < toggled_invisible + 600) - to_chat(src, "You must gather strength before you can turn visible again...") - return - - if(plane == PLANE_WORLD) - toggled_invisible = world.time - visible_message("It fades from sight...", "You are now invisible.") - else - to_chat(src, "You are now visible!") - - plane = (plane == PLANE_GHOSTS) ? PLANE_WORLD : PLANE_GHOSTS - invisibility = (plane == PLANE_WORLD) ? 0 : INVISIBILITY_OBSERVER - - // Give the ghost a cult icon which should be visible only to itself - toggle_icon("cult") - -/mob/observer/dead/verb/toggle_anonsay() - set category = "Ghost" - set name = "Toggle Anonymous Chat" - set desc = "Toggles showing your key in dead chat." - - src.anonsay = !src.anonsay - if(anonsay) - to_chat(src, "Your key won't be shown when you speak in dead chat.") - else - to_chat(src, "Your key will be publicly visible again.") - -/mob/observer/dead/canface() - return 1 - -/mob/observer/dead/proc/can_admin_interact() - return check_rights(R_ADMIN|R_EVENT, 0, src) - -/mob/observer/dead/verb/toggle_ghostsee() - set name = "Toggle Ghost Vision" - set desc = "Toggles your ability to see things only ghosts can see, like other ghosts" - set category = "Ghost" - ghostvision = !ghostvision - updateghostsight() - to_chat(src, "You [ghostvision ? "now" : "no longer"] have ghost vision.") - -/mob/observer/dead/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "Toggles your ability to see lighting overlays, and the darkness they create." - set category = "Ghost" - - var/static/list/darkness_names = list("normal darkness levels", "30% darkness removed", "70% darkness removed", "no darkness") - var/static/list/darkness_levels = list(255, 178, 76, 0) - - var/index = darkness_levels.Find(lighting_alpha) - if(!index || index >= darkness_levels.len) - index = 1 - else - index++ - - lighting_alpha = darkness_levels[index] - updateghostsight() - to_chat(src, "Your vision now has [darkness_names[index]].") - -/mob/observer/dead/proc/updateghostsight() - plane_holder.set_desired_alpha(VIS_LIGHTING, lighting_alpha) - plane_holder.set_vis(VIS_LIGHTING, lighting_alpha) - plane_holder.set_vis(VIS_GHOSTS, ghostvision) - -/mob/observer/dead/MayRespawn(var/feedback = 0) - if(!client) - return 0 - if(mind && mind.current && mind.current.stat != DEAD && can_reenter_corpse) - if(feedback) - to_chat(src, "Your non-dead body prevent you from respawning.") - return 0 - if(config.antag_hud_restricted && has_enabled_antagHUD == 1) - if(feedback) - to_chat(src, "antagHUD restrictions prevent you from respawning.") - return 0 - return 1 - -/atom/proc/extra_ghost_link() - return - -/mob/extra_ghost_link(var/atom/ghost) - if(client && eyeobj) - return "|eye" - -/mob/observer/dead/extra_ghost_link(var/atom/ghost) - if(mind && mind.current) - return "|body" - -/proc/ghost_follow_link(var/atom/target, var/atom/ghost) - if((!target) || (!ghost)) return - . = "follow" - . += target.extra_ghost_link(ghost) - -//Culted Ghosts - -/mob/observer/dead/proc/ghost_whisper() - set name = "Spectral Whisper" - set category = "IC" - - if(is_manifest) //Only able to whisper if it's hit with a tome. - var/list/options = list() - for(var/mob/living/Ms in view(src)) - options += Ms - var/mob/living/M = tgui_input_list(src, "Select who to whisper to:", "Whisper to?", options) - if(!M) - return 0 - var/msg = sanitize(tgui_input_text(src, "Message:", "Spectral Whisper")) - if(msg) - log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") - to_chat(src, " You said: '[msg]' to [M].") - else - return - return 1 - else - to_chat(src, "You have not been pulled past the veil!") - -/mob/observer/dead/verb/choose_ghost_sprite() - set category = "Ghost" - set name = "Choose Sprite" - - var/choice - var/previous_state - var/finalized = "No" - - while(finalized == "No" && src.client) - choice = tgui_input_list(usr, "What would you like to use for your ghost sprite?", "Ghost Sprite", possible_ghost_sprites) - if(!choice) - return - - if(choice) - icon = 'icons/mob/ghost.dmi' - cut_overlays() - - if(icon_state && icon) - previous_state = icon_state - - icon_state = possible_ghost_sprites[choice] - finalized = tgui_alert(src, "Look at your sprite. Is this what you wish to use?","Ghost Sprite",list("No","Yes")) - - ghost_sprite = possible_ghost_sprites[choice] - - if(finalized == "No") - icon_state = previous_state - -/mob/observer/dead/is_blind() - return FALSE - -/mob/observer/dead/is_deaf() - return FALSE - -/mob/observer/dead/verb/paialert() - set category = "Ghost" - set name = "Blank pAI alert" - set desc = "Flash an indicator light on available blank pAI devices for a smidgen of hope." - - var/time_till_respawn = time_till_respawn() - if(time_till_respawn == -1) // Special case, never allowed to respawn - to_chat(usr, "Respawning is not allowed!") - else if(time_till_respawn) // Nonzero time to respawn - to_chat(usr, "You can't do that yet! You died too recently. You need to wait another [round(time_till_respawn/10/60, 0.1)] minutes.") - return - - if(jobban_isbanned(usr, "pAI")) - to_chat(usr,"You cannot alert pAI cards when you are banned from playing as a pAI.") - return - - if(usr.client.prefs?.be_special & BE_PAI) - var/choice = tgui_alert(usr, "Would you like to submit yourself to the recruitment list too?", "Confirmation", list("No", "Yes")) - if(choice == "Yes") - paiController.recruitWindow(usr) - var/count = 0 - for(var/obj/item/device/paicard/p in all_pai_cards) - var/obj/item/device/paicard/PP = p - if(PP.pai == null) - count++ - PP.add_overlay("pai-ghostalert") - PP.alertUpdate() - spawn(54) - PP.cut_overlays() - to_chat(usr,"Flashing the displays of [count] unoccupied PAIs.") - else - to_chat(usr,"You have 'Be pAI' disabled in your character prefs, so we can't help you.") - -/mob/observer/dead/speech_bubble_appearance() - return "ghost" - -// Lets a ghost know someone's trying to bring them back, and for them to get into their body. -// Mostly the same as TG's sans the hud element, since we don't have TG huds. -/mob/observer/dead/proc/notify_revive(var/message, var/sound, flashwindow = TRUE, var/atom/source) - if((last_revive_notification + 2 MINUTES) > world.time) - return - last_revive_notification = world.time - - if(flashwindow) - window_flash(client) - if(message) - to_chat(src, "[message]") - if(source) - throw_alert("\ref[source]_notify_revive", /obj/screen/alert/notify_cloning, new_master = source) - to_chat(src, "(Click to re-enter)") - if(sound) - SEND_SOUND(src, sound(sound)) - -/mob/observer/dead/verb/respawn() - set name = "Respawn" - set category = "Ghost" - src.abandon_mob() ->>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds From 1a8a466a645ee2e73cfb457045d769f1ada3f705 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Thu, 15 Dec 2022 22:04:12 -0500 Subject: [PATCH 5/8] powder that makes you say yes --- .../mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 79fae449af..1af857fe40 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -130,11 +130,7 @@ trashman.reset_view(src) START_PROCESSING(SSobj, src) user.visible_message("[hound.name]'s [src.name] groans lightly as [trashman] slips inside.", "Your [src.name] groans lightly as [trashman] slips inside.") -<<<<<<< HEAD log_attack("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])")//CHOMPEdit from message_admins -======= - message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") ->>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds playsound(src, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(delivery) if(islist(deliverylists[delivery_tag])) From 5de996bec1795f3bb90edac377655827942a02ed Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Thu, 15 Dec 2022 22:08:38 -0500 Subject: [PATCH 6/8] powder that makes you say yes --- .../machinery/dispenser/reagent_tank.dm | 502 +----------------- 1 file changed, 3 insertions(+), 499 deletions(-) diff --git a/code/modules/reagents/machinery/dispenser/reagent_tank.dm b/code/modules/reagents/machinery/dispenser/reagent_tank.dm index 010b89e19d..7839c7e98e 100644 --- a/code/modules/reagents/machinery/dispenser/reagent_tank.dm +++ b/code/modules/reagents/machinery/dispenser/reagent_tank.dm @@ -1,4 +1,3 @@ -<<<<<<< HEAD /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." @@ -201,9 +200,7 @@ modded = modded ? 0 : 1 playsound(src, W.usesound, 75, 1) if (modded) - message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)") - log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.") - leak_fuel(amount_per_transfer_from_this) + message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)") if (istype(W,/obj/item/device/assembly_holder)) if (rig) to_chat(user, "There is another device in the way.") @@ -214,8 +211,7 @@ var/obj/item/device/assembly_holder/H = W if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter)) - message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)") - log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.") + message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)") rig = W user.drop_item() @@ -232,7 +228,7 @@ /obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) if(istype(Proj.firer)) - message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") + message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) @@ -489,495 +485,3 @@ reagents.splash_area(get_turf(src), 3) visible_message(span("danger", "The [src] bursts open, spreading oil all over the area.")) qdel(src) -======= -/obj/structure/reagent_dispensers - name = "Dispenser" - desc = "..." - icon = 'icons/obj/chemical_tanks.dmi' - icon_state = "tank" - layer = TABLE_LAYER - density = TRUE - anchored = FALSE - pressure_resistance = 2*ONE_ATMOSPHERE - - var/obj/item/hose_connector/input/active/InputSocket - var/obj/item/hose_connector/output/active/OutputSocket - - var/amount_per_transfer_from_this = 10 - var/possible_transfer_amounts = list(10,25,50,100) - -/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W as obj, mob/user as mob) - return - -/obj/structure/reagent_dispensers/Destroy() - QDEL_NULL(InputSocket) - QDEL_NULL(OutputSocket) - - ..() - -/obj/structure/reagent_dispensers/Initialize() - var/datum/reagents/R = new/datum/reagents(5000) - reagents = R - R.my_atom = src - if (!possible_transfer_amounts) - src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT - - InputSocket = new(src) - InputSocket.carrier = src - OutputSocket = new(src) - OutputSocket.carrier = src - - . = ..() - -/obj/structure/reagent_dispensers/examine(mob/user) - . = ..() - if(get_dist(user, src) <= 2) - . += "It contains:" - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - . += "[R.volume] units of [R.name]" - else - . += "Nothing." - -/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this - set name = "Set transfer amount" - set category = "Object" - set src in view(1) - var/N = tgui_input_list(usr, "Amount per transfer from this:","[src]", possible_transfer_amounts) - if (N) - amount_per_transfer_from_this = N - -/obj/structure/reagent_dispensers/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if (prob(50)) - new /obj/effect/effect/water(src.loc) - qdel(src) - return - if(3.0) - if (prob(5)) - new /obj/effect/effect/water(src.loc) - qdel(src) - return - else - return - -/obj/structure/reagent_dispensers/blob_act() - qdel(src) - -/* - * Tanks - */ - -//Water -/obj/structure/reagent_dispensers/watertank - name = "water tank" - desc = "A water tank." - icon_state = "water" - amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/watertank/Initialize() - . = ..() - reagents.add_reagent("water", 1000) - -/obj/structure/reagent_dispensers/watertank/high - name = "high-capacity water tank" - desc = "A highly-pressurized water tank made to hold vast amounts of water.." - icon_state = "water_high" - -/obj/structure/reagent_dispensers/watertank/high/Initialize() - . = ..() - reagents.add_reagent("water", 4000) - -//Fuel -/obj/structure/reagent_dispensers/fueltank - name = "fuel tank" - desc = "A fuel tank." - icon_state = "fuel" - amount_per_transfer_from_this = 10 - var/modded = 0 - var/obj/item/device/assembly_holder/rig = null - -/obj/structure/reagent_dispensers/fueltank/Initialize() - . = ..() - reagents.add_reagent("fuel",1000) - -/obj/structure/reagent_dispensers/fueltank/high - name = "high-capacity fuel tank" - desc = "A highly-pressurized fuel tank made to hold vast amounts of fuel." - icon_state = "fuel_high" - -/obj/structure/reagent_dispensers/fueltank/high/Initialize() - . = ..() - reagents.add_reagent("fuel",4000) - -//Foam -/obj/structure/reagent_dispensers/foam - name = "foam tank" - desc = "A foam tank." - icon_state = "foam" - amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/foam/Initialize() - . = ..() - reagents.add_reagent("firefoam",1000) - -//Helium3 -/obj/structure/reagent_dispensers/he3 - name = "/improper He3 tank" - desc = "A Helium3 tank." - icon_state = "he3" - amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispenser/he3/Initialize() - ..() - reagents.add_reagent("helium3",1000) - -/* - * Misc - */ - -/obj/structure/reagent_dispensers/fueltank/barrel - name = "hazardous barrel" - desc = "An open-topped barrel full of nasty-looking liquid." - icon = 'icons/obj/objects_vr.dmi' - icon_state = "barrel" - modded = TRUE - -/obj/structure/reagent_dispensers/fueltank/barrel/two - name = "explosive barrel" - desc = "A barrel with warning labels painted all over it." - icon = 'icons/obj/objects_vr.dmi' - icon_state = "barrel2" - modded = FALSE - -/obj/structure/reagent_dispensers/fueltank/barrel/three - name = "fuel barrel" - desc = "An open-topped barrel full of nasty-looking liquid." - icon = 'icons/obj/objects_vr.dmi' - icon_state = "barrel3" - modded = FALSE - -/obj/structure/reagent_dispensers/fueltank/barrel/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (W.is_wrench()) //can't wrench it shut, it's always open - return - return ..() -//VOREStation Add End - -/obj/structure/reagent_dispensers/fueltank/examine(mob/user) - . = ..() - if(get_dist(user, src) <= 2) - if(modded) - . += "Fuel faucet is wrenched open, leaking the fuel!" - if(rig) - . += "There is some kind of device rigged to the tank." - -/obj/structure/reagent_dispensers/fueltank/attack_hand() - if (rig) - usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]") - if(do_after(usr, 20)) - usr.visible_message("[usr] detaches [rig] from \the [src].", "You detach [rig] from \the [src]") - rig.loc = get_turf(usr) - rig = null - overlays = new/list() - -/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob) - src.add_fingerprint(user) - if (W.is_wrench()) - user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \ - "You wrench [src]'s faucet [modded ? "closed" : "open"]") - modded = modded ? 0 : 1 - playsound(src, W.usesound, 75, 1) - if (modded) - message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)") - log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.") - leak_fuel(amount_per_transfer_from_this) - if (istype(W,/obj/item/device/assembly_holder)) - if (rig) - to_chat(user, "There is another device in the way.") - return ..() - user.visible_message("[user] begins rigging [W] to \the [src].", "You begin rigging [W] to \the [src]") - if(do_after(user, 20)) - user.visible_message("[user] rigs [W] to \the [src].", "You rig [W] to \the [src]") - - var/obj/item/device/assembly_holder/H = W - if (istype(H.a_left,/obj/item/device/assembly/igniter) || istype(H.a_right,/obj/item/device/assembly/igniter)) - message_admins("[key_name_admin(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion. (JMP)") - log_game("[key_name(user)] rigged fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) for explosion.") - - rig = W - user.drop_item() - W.loc = src - - var/icon/test = getFlatIcon(W) - test.Shift(NORTH,1) - test.Shift(EAST,6) - add_overlay(test) - - return ..() - - -/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) - if(Proj.get_structure_damage()) - if(istype(Proj.firer)) - message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") - log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") - - if(!istype(Proj ,/obj/item/projectile/beam/lasertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) - explode() - -/obj/structure/reagent_dispensers/fueltank/ex_act() - explode() - -/obj/structure/reagent_dispensers/fueltank/blob_act() - explode() - -/obj/structure/reagent_dispensers/fueltank/proc/explode() - if (reagents.total_volume > 500) - explosion(src.loc,1,2,4) - else if (reagents.total_volume > 100) - explosion(src.loc,0,1,3) - else if (reagents.total_volume > 50) - explosion(src.loc,-1,1,2) - if(src) - qdel(src) - -/obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) - if (modded) - explode() - else if (temperature > T0C+500) - explode() - return ..() - -/obj/structure/reagent_dispensers/fueltank/Move() - if (..() && modded) - leak_fuel(amount_per_transfer_from_this/10.0) - -/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount) - if (reagents.total_volume == 0) - return - - amount = min(amount, reagents.total_volume) - reagents.remove_reagent("fuel",amount) - new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount,1) - -/obj/structure/reagent_dispensers/peppertank - name = "Pepper Spray Refiller" - desc = "Refills pepper spray canisters." - icon = 'icons/obj/objects.dmi' - icon_state = "peppertank" - anchored = TRUE - density = FALSE - amount_per_transfer_from_this = 45 - -/obj/structure/reagent_dispensers/peppertank/Initialize() - . = ..() - reagents.add_reagent("condensedcapsaicin",1000) - -/obj/structure/reagent_dispensers/virusfood - name = "Virus Food Dispenser" - desc = "A dispenser of virus food. Yum." - icon = 'icons/obj/virology_vr.dmi' - icon_state = "virusfoodtank" - anchored = TRUE - density = FALSE - amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/virusfood/Initialize() - . = ..() - reagents.add_reagent("virusfood", 1000) - -/obj/structure/reagent_dispensers/acid - name = "Sulphuric Acid Dispenser" - desc = "A dispenser of acid for industrial processes." - icon = 'icons/obj/objects.dmi' - icon_state = "acidtank" - anchored = TRUE - density = FALSE - amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/acid/Initialize() - . = ..() - reagents.add_reagent("sacid", 1000) - -/obj/structure/reagent_dispensers/water_cooler - name = "Water-Cooler" - desc = "A machine that dispenses water to drink." - amount_per_transfer_from_this = 5 - icon = 'icons/obj/vending.dmi' - icon_state = "water_cooler" - possible_transfer_amounts = null - anchored = TRUE - var/bottle = 0 - var/cups = 0 - var/cupholder = 0 - -/obj/structure/reagent_dispensers/water_cooler/full - bottle = 1 - cupholder = 1 - cups = 10 - -/obj/structure/reagent_dispensers/water_cooler/Initialize() - . = ..() - if(bottle) - reagents.add_reagent("water",120) - update_icon() - -/obj/structure/reagent_dispensers/water_cooler/examine(mob/user) - . = ..() - if(cupholder) - . += "There are [cups] cups in the cup dispenser." - -/obj/structure/reagent_dispensers/water_cooler/verb/rotate_clockwise() - set name = "Rotate Cooler Clockwise" - set category = "Object" - set src in oview(1) - - if (src.anchored || usr:stat) - to_chat(usr, "It is fastened to the floor!") - return 0 - src.set_dir(turn(src.dir, 270)) - return 1 - -/obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/I as obj, mob/user as mob) - if(I.is_wrench()) - src.add_fingerprint(user) - if(bottle) - playsound(src, I.usesound, 50, 1) - if(do_after(user, 20) && bottle) - to_chat(user, "You unfasten the jug.") - var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = new /obj/item/weapon/reagent_containers/glass/cooler_bottle( src.loc ) - for(var/datum/reagent/R in reagents.reagent_list) - var/total_reagent = reagents.get_reagent_amount(R.id) - G.reagents.add_reagent(R.id, total_reagent) - reagents.clear_reagents() - bottle = 0 - update_icon() - else - if(anchored) - user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") - else - user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") - if(do_after(user, 20 * I.toolspeed, src)) - if(!src) return - to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") - anchored = !anchored - playsound(src, I.usesound, 50, 1) - return - - if(I.is_screwdriver()) - if(cupholder) - playsound(src, I.usesound, 50, 1) - to_chat(user, "You take the cup dispenser off.") - new /obj/item/stack/material/plastic( src.loc ) - if(cups) - for(var/i = 0 to cups) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc) - cups = 0 - cupholder = 0 - update_icon() - return - if(!bottle && !cupholder) - playsound(src, I.usesound, 50, 1) - to_chat(user, "You start taking the water-cooler apart.") - if(do_after(user, 20 * I.toolspeed) && !bottle && !cupholder) - to_chat(user, "You take the water-cooler apart.") - new /obj/item/stack/material/plastic( src.loc, 4 ) - qdel(src) - return - - if(istype(I, /obj/item/weapon/reagent_containers/glass/cooler_bottle)) - src.add_fingerprint(user) - if(!bottle) - if(anchored) - var/obj/item/weapon/reagent_containers/glass/cooler_bottle/G = I - to_chat(user, "You start to screw the bottle onto the water-cooler.") - if(do_after(user, 20) && !bottle && anchored) - bottle = 1 - update_icon() - to_chat(user, "You screw the bottle onto the water-cooler!") - for(var/datum/reagent/R in G.reagents.reagent_list) - var/total_reagent = G.reagents.get_reagent_amount(R.id) - reagents.add_reagent(R.id, total_reagent) - qdel(G) - else - to_chat(user, "You need to wrench down the cooler first.") - else - to_chat(user, "There is already a bottle there!") - return 1 - - if(istype(I, /obj/item/stack/material/plastic)) - if(!cupholder) - if(anchored) - var/obj/item/stack/material/plastic/P = I - src.add_fingerprint(user) - to_chat(user, "You start to attach a cup dispenser onto the water-cooler.") - playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20) && !cupholder && anchored) - if (P.use(1)) - to_chat(user, "You attach a cup dispenser onto the water-cooler.") - cupholder = 1 - update_icon() - else - to_chat(user, "You need to wrench down the cooler first.") - else - to_chat(user, "There is already a cup dispenser there!") - return - -/obj/structure/reagent_dispensers/water_cooler/attack_hand(mob/user) - if(cups) - new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src.loc) - cups-- - flick("[icon_state]-vend", src) - return - -/obj/structure/reagent_dispensers/water_cooler/update_icon() - icon_state = "water_cooler" - cut_overlays() - if(bottle) - add_overlay("water_cooler_bottle") - -/obj/structure/reagent_dispensers/beerkeg - name = "beer keg" - desc = "A beer keg." - icon = 'icons/obj/objects.dmi' - icon_state = "beertankTEMP" - amount_per_transfer_from_this = 10 - -/obj/structure/reagent_dispensers/beerkeg/Initialize() - . = ..() - reagents.add_reagent("beer",1000) - -/obj/structure/reagent_dispensers/beerkeg/fakenuke - name = "nuclear beer keg" - desc = "A beer keg in the form of a nuclear bomb! An absolute blast at parties!" - icon = 'icons/obj/stationobjs.dmi' - icon_state = "nuclearbomb0" - -//Cooking oil refill tank -/obj/structure/reagent_dispensers/cookingoil - name = "cooking oil tank" - desc = "A fifty-litre tank of commercial-grade corn oil, intended for use in large scale deep fryers. Store in a cool, dark place" - icon = 'icons/obj/objects.dmi' - icon_state = "oiltank" - amount_per_transfer_from_this = 120 - -/obj/structure/reagent_dispensers/cookingoil/Initialize() - . = ..() - reagents.add_reagent("cookingoil",5000) - -/obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj) - if(Proj.get_structure_damage()) - explode() - -/obj/structure/reagent_dispensers/cookingoil/ex_act() - explode() - -/obj/structure/reagent_dispensers/cookingoil/proc/explode() - reagents.splash_area(get_turf(src), 3) - visible_message(span("danger", "The [src] bursts open, spreading oil all over the area.")) - qdel(src) ->>>>>>> fe91b1a43b... Merge pull request #14206 from ItsSelis/selis-href-adds From ef602a8fea242ac6cbac5d795e47113df0698cab Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Thu, 15 Dec 2022 22:18:45 -0500 Subject: [PATCH 7/8] powder that makes you say yes --- code/ZAS/Atom.dm | 8 -------- 1 file changed, 8 deletions(-) diff --git a/code/ZAS/Atom.dm b/code/ZAS/Atom.dm index 0057d18ca0..bfe6fa2ad4 100644 --- a/code/ZAS/Atom.dm +++ b/code/ZAS/Atom.dm @@ -3,14 +3,6 @@ /atom/var/pressure_resistance = ONE_ATMOSPHERE /atom/var/can_atmos_pass = ATMOS_PASS_YES -// Purpose: Determines if the object can pass this atom. -// Called by: Movement. -// Inputs: The moving atom, target turf. -// Outputs: Boolean if can pass. -// Airflow and ZAS zones now uses CanZASPass() instead of this proc. -/atom/proc/CanPass(atom/movable/mover, turf/target) - return !density - // Purpose: Determines if airflow is allowed between T and loc. // Called by: Airflow. // Inputs: The turf the airflow is from, which may not be the same as loc. is_zone is for conditionally disallowing merging. From e60f66ed4b827971545396fb68c762b7c7c8be22 Mon Sep 17 00:00:00 2001 From: Nadyr <41974248+Darlantanis@users.noreply.github.com> Date: Thu, 15 Dec 2022 22:26:24 -0500 Subject: [PATCH 8/8] powder that makes you say yes --- code/modules/admin/admin_verbs_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/admin_verbs_vr.dm b/code/modules/admin/admin_verbs_vr.dm index 1d6c1cf890..0cd74ca1b5 100644 --- a/code/modules/admin/admin_verbs_vr.dm +++ b/code/modules/admin/admin_verbs_vr.dm @@ -103,7 +103,7 @@ dat += {"(Order book by SS13BN)

    TITLE