Adds the Odyssey gamemode. (#18972)

https://forums.aurorastation.org/topic/20198-mission-briefing-auroras-gamemode-revolution

To-do:

- [x] Finish storyteller verbs.
- [x] Storyteller landmarks.
- [x] Proper storyteller spawning. Right now the gamemode system is
happy with just picking one storyteller and no actors.
- [x] Antagonist whitelists code.
- [x] Adding the Storyteller whitelist.
- [x] Mission map loading code.
- [x] Map in a bunch of missions.
- [ ] Storyteller adminhelps.

---------

Co-authored-by: Matt Atlas <liermattia@gmail.com>
Co-authored-by: DreamySkrell <>
This commit is contained in:
Matt Atlas
2024-11-26 21:18:43 +01:00
committed by GitHub
parent e1f5de6298
commit 1da20ad33f
194 changed files with 242505 additions and 1904 deletions
+41 -1
View File
@@ -1243,7 +1243,7 @@ var/global/enabled_spooking = 0
//Returns 1 to let the dragdrop code know we are trapping this event
//Returns 0 if we don't plan to trap the event
/datum/admins/proc/cmd_ghost_drag(var/mob/abstract/observer/frommob, var/mob/living/tomob)
/datum/admins/proc/cmd_ghost_drag(var/mob/abstract/ghost/observer/frommob, var/mob/living/tomob)
if(!istype(frommob))
return //Extra sanity check to make sure only observers are shoved into things
@@ -1386,3 +1386,43 @@ var/global/enabled_spooking = 0
/atom/proc/Admin_Coordinates_Readable(area_name, admin_jump_ref)
var/turf/T = get_turf(src)
return T ? "[area_name ? "[get_area_name(T, TRUE)] " : " "]([T.x],[T.y],[T.z])[admin_jump_ref ? " [ADMIN_JMP(T)]" : ""]" : "nonexistent location"
/**
* Used to manually set an Odyssey for the Odyssey gamemode.
*/
/datum/admins/proc/set_odyssey()
set name = "Set Odyssey Type"
set category = "Special Verbs"
if(!check_rights(R_ADMIN))
return
if(!SSticker.mode || !istype(SSticker.mode, /datum/game_mode/odyssey))
to_chat(usr, SPAN_WARNING("The gamemode either does not exist, or is not Odyssey."))
return
if(SSticker.current_state != GAME_STATE_SETTING_UP)
to_chat(usr, SPAN_WARNING("You need to use this verb while the game is still setting up!"))
return
var/list/singleton/scenario/all_scenarios = GET_SINGLETON_SUBTYPE_LIST(/singleton/scenario)
var/list/possible_scenarios = list()
for(var/singleton/scenario/S in all_scenarios)
possible_scenarios[S.name] = S
var/singleton/scenario/chosen_scenario
var/situation_name = tgui_input_list(usr, "Choose an Odyssey.", "Set Odyssey", possible_scenarios)
chosen_scenario = possible_scenarios[situation_name]
if(!chosen_scenario)
return
if(!(SSatlas.current_sector.name in chosen_scenario.sector_whitelist))
if(tgui_alert(usr, "This Odyssey is not appropriate for the current sector. Continue?", "Set Odyssey", list("Yes", "No")) != "Yes")
return
SSodyssey.scenario = chosen_scenario
log_and_message_admins("has manually set the Odyssey to [chosen_scenario.name]", usr)
feedback_add_details("admin_verb","SEST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+19 -8
View File
@@ -51,6 +51,7 @@ var/list/admin_verbs_admin = list(
/client/proc/rename_silicon, //properly renames silicons,
/client/proc/manage_silicon_laws,
/client/proc/check_antagonists,
/client/proc/odyssey_panel,
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/toggleprayers, /*toggles prayers on/off*/
// /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/
@@ -136,7 +137,8 @@ var/list/admin_verbs_fun = list(
/client/proc/show_tip,
/client/proc/fab_tip,
/client/proc/apply_sunstate,
/datum/admins/proc/ccannoucment
/datum/admins/proc/ccannoucment,
/datum/admins/proc/set_odyssey
)
var/list/admin_verbs_spawn = list(
@@ -392,6 +394,7 @@ var/list/admin_verbs_hideable = list(
/client/proc/cmd_display_del_log,
/client/proc/cmd_display_harddel_log,
/datum/admins/proc/ccannoucment,
/datum/admins/proc/set_odyssey,
/client/proc/cmd_display_init_log,
/client/proc/cmd_generate_lag,
/client/proc/getruntimelog,
@@ -424,6 +427,7 @@ var/list/admin_verbs_mod = list(
/client/proc/dsay,
/datum/admins/proc/show_player_panel,
/client/proc/check_antagonists,
/client/proc/odyssey_panel,
/client/proc/jobbans,
/client/proc/cmd_admin_subtle_message, /*send an message to somebody as a 'voice in their head'*/
/datum/admins/proc/paralyze_mob,
@@ -492,6 +496,7 @@ var/list/admin_verbs_cciaa = list(
/client/proc/check_fax_history,
/client/proc/aooc,
/client/proc/check_antagonists,
/client/proc/odyssey_panel,
/client/proc/toggle_aooc
)
@@ -513,8 +518,8 @@ var/list/admin_verbs_cciaa = list(
if(holder.rights & R_PERMISSIONS) add_verb(src, admin_verbs_permissions)
if(holder.rights & R_STEALTH) add_verb(src, /client/proc/stealth)
if(holder.rights & R_REJUVINATE) add_verb(src, admin_verbs_rejuv)
if(holder.rights & R_SOUNDS) add_verb(src, admin_verbs_sounds)
if(holder.rights & R_SPAWN) add_verb(src, admin_verbs_spawn)
if(holder.rights & R_SOUNDS) add_verb(src, admin_verbs_sounds)
if(holder.rights & R_MOD) add_verb(src, admin_verbs_mod)
if(holder.rights & R_DEV) add_verb(src, admin_verbs_dev)
if(holder.rights & R_CCIAA) add_verb(src, admin_verbs_cciaa)
@@ -572,9 +577,9 @@ var/list/admin_verbs_cciaa = list(
set category = "Admin"
set name = "Aghost"
if(!holder) return
if(istype(mob,/mob/abstract/observer))
if(isobserver(mob))
//re-enter
var/mob/abstract/observer/ghost = mob
var/mob/abstract/ghost/observer/ghost = mob
if(ghost.can_reenter_corpse)
ghost.reenter_corpse()
log_admin("[src] reentered their corpose using aghost.")
@@ -589,7 +594,7 @@ var/list/admin_verbs_cciaa = list(
else
//ghostize
var/mob/body = mob
var/mob/abstract/observer/ghost = body.ghostize(1)
var/mob/abstract/ghost/observer/ghost = body.ghostize(1)
ghost.admin_ghosted = 1
if(body)
body.teleop = ghost
@@ -631,6 +636,13 @@ var/list/admin_verbs_cciaa = list(
feedback_add_details("admin_verb","CHA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/odyssey_panel()
set name = "View Odyssey Panel"
set category = "Admin"
SSodyssey.ui_interact(mob)
feedback_add_details("admin_verb","ODP")
/client/proc/jobbans()
set name = "Display Job bans"
set category = "Admin"
@@ -704,9 +716,8 @@ var/list/admin_verbs_cciaa = list(
set name = "Drop Bomb"
set desc = "Cause an explosion of varying strength at your location."
var/turf/epicenter = mob.loc
var/list/choices = list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb")
var/choice = tgui_input_list(usr, "What size explosion would you like to produce?", "Drop Bomb", choices)
var/turf/epicenter = get_turf(mob)
var/choice = tgui_input_list(usr, "What size explosion would you like to produce?", "Drop Bomb", list("Small Bomb", "Medium Bomb", "Big Bomb", "Custom Bomb"))
switch(choice)
if(null)
return 0
@@ -4,6 +4,8 @@
var/icon_state
var/datum/click_handler/build_mode/host
var/mob/user
/// This variable controls the permissions required to have this build mode added. Mainly used to prevent VV editing from being given to storytellers.
var/permission_requirement
/datum/build_mode/New(var/host)
..()
@@ -13,6 +13,9 @@
build_modes = list()
for(var/mode_type in subtypesof(/datum/build_mode))
var/datum/build_mode/build_mode = new mode_type(src)
if(build_mode.permission_requirement)
if(!check_rights(build_mode.permission_requirement, FALSE, user))
continue
build_modes += build_mode
if(build_mode.the_default)
current_build_mode = build_mode
+1
View File
@@ -1,6 +1,7 @@
/datum/build_mode/edit
name = "Edit"
icon_state = "buildmode3"
permission_requirement = R_ADMIN
var/var_to_edit = "name"
var/value_to_set = "derp"
-4
View File
@@ -8,8 +8,6 @@ var/list/admin_datums = list()
var/aooc_mute = FALSE
var/datum/marked_datum
var/mob/living/original_mob = null
var/admincaster_screen = 0 //See newscaster.dm under machinery for a full description
var/datum/feed_message/admincaster_feed_message = new /datum/feed_message //These two will act as holders.
var/datum/feed_channel/admincaster_feed_channel = new /datum/feed_channel
@@ -23,8 +21,6 @@ var/list/admin_datums = list()
return FALSE
if(var_name == NAMEOF(src, owner))
return FALSE
if(var_name == NAMEOF(src, original_mob))
return FALSE
return ..()
/datum/admins/New(initial_rank = "Temporary Admin", initial_rights = 0, ckey)
+3 -1
View File
@@ -43,7 +43,7 @@
var/mob/M = locate(params["jump_to"])
if(!isobserver(usr))
if(!isghost(usr))
C.admin_ghost()
sleep(2)
C.jumptomob(M)
@@ -264,4 +264,6 @@
return "Monkey"
if(isalien(M))
return "Alien"
if(isstoryteller(M))
return "Storyteller"
return "Unknown"
+5 -5
View File
@@ -161,7 +161,7 @@
switch(href_list["simplemake"])
if("observer")
M.change_mob_type( /mob/abstract/observer , null, null, delmob )
M.change_mob_type( /mob/abstract/ghost/observer , null, null, delmob )
if("nymph")
M.change_mob_type( /mob/living/carbon/alien/diona , null, null, delmob )
if("human")
@@ -731,7 +731,7 @@
var/mob/M = locate(href_list["adminplayerobservejump"])
if(!isobserver(usr))
if(!isghost(usr))
C.admin_ghost()
sleep(2)
C.jumptomob(M)
@@ -751,7 +751,7 @@
var/z = text2num(href_list["Z"])
var/client/C = usr.client
if(!isobserver(usr))
if(!isghost(usr))
C.admin_ghost()
C.jumptocoord(x,y,z)
@@ -1177,7 +1177,7 @@
if(target)
for (var/path in paths)
for (var/i = 0; i < number; i++)
for (var/i in 1 to number)
if(path in typesof(/turf))
var/turf/O = target
var/turf/N = O.ChangeTurf(path)
@@ -1591,7 +1591,7 @@
if(client && eyeobj)
return "|<A HREF='?[source];adminplayerobservejump=[REF(eyeobj)]'>EYE</A>"
/mob/abstract/observer/extra_admin_link(var/source)
/mob/abstract/ghost/observer/extra_admin_link(var/source)
if(mind && mind.current)
return "|<A HREF='?[source];adminplayerobservejump=[REF(mind.current)]'>BDY</A>"
+1 -1
View File
@@ -1,7 +1,7 @@
/mob/proc/on_mob_jump()
return
/mob/abstract/observer/on_mob_jump()
/mob/abstract/ghost/on_mob_jump()
QDEL_NULL(orbiting)
/client/proc/Jump(var/area/A in GLOB.all_areas)
+1 -1
View File
@@ -22,7 +22,7 @@
if(T.mob)
if(istype(T.mob, /mob/abstract/new_player))
targets["(New Player) - [T]"] = T
else if(istype(T.mob, /mob/abstract/observer))
else if(istype(T.mob, /mob/abstract/ghost/observer))
targets["[T.mob.name](Ghost) - [T]"] = T
else
targets["[T.mob.real_name](as [T.mob.name]) - [T]"] = T
+1 -1
View File
@@ -3,7 +3,7 @@
set name = "AOOC"
set desc = "Antagonist OOC"
if (istype(src.mob, /mob/abstract/observer) && !check_rights(R_ADMIN|R_MOD|R_CCIAA, 0))
if (istype(src.mob, /mob/abstract/ghost/observer) && !check_rights(R_ADMIN|R_MOD|R_CCIAA, 0))
to_chat(src, SPAN_WARNING("You cannot use AOOC while ghosting/observing!"))
return
+24 -14
View File
@@ -24,7 +24,8 @@
to_chat(src, "You've used this verb too recently, please wait a moment before trying again.")
return
if(!check_rights(R_DEV|R_ADMIN)) return
if(!check_rights(R_DEV|R_ADMIN))
return
if(!holder)
return //how did they get here?
@@ -35,15 +36,13 @@
bst_cooldown = TRUE
if(istype(mob, /mob/living))
if(!holder.original_mob)
holder.original_mob = mob
//I couldn't get the normal way to work so this works.
//This whole section looks like a hack, I don't like it.
var/T = get_turf(usr)
var/mob/living/carbon/human/bst/bst = new(T)
// bst.original_mob = usr
if(istype(mob, /mob/living))
bst.original_mob = mob
bst.anchored = 1
bst.ckey = usr.ckey
bst.name = "Bluespace Technician"
@@ -138,6 +137,13 @@
universal_understand = 1
status_flags = GODMODE|NOFALL
/// The BST's original mob. Moved here from /datum/holder to support storytellers.
var/mob/original_mob
/mob/living/carbon/human/bst/Destroy(force)
original_mob = null
return ..()
/mob/living/carbon/human/bst/can_inject(var/mob/user, var/error_msg, var/target_zone)
to_chat(user, SPAN_ALERT("The [src] disarms you before you can inject them."))
user.drop_item()
@@ -168,11 +174,11 @@
QDEL_IN(src, 10)
animate(src, alpha = 0, time = 9, easing = QUAD_EASING)
if(key)
if(client.holder && client.holder.original_mob)
client.holder.original_mob.key = key
if(original_mob)
client.key = key
client.init_verbs()
else
var/mob/abstract/observer/ghost = new(src) //Transfer safety to observer spawning proc.
var/mob/abstract/ghost/observer/ghost = new(src, src) //Transfer safety to observer spawning proc.
ghost.key = key
ghost.mind.name = "[ghost.key] BSTech"
ghost.name = "[ghost.key] BSTech"
@@ -320,14 +326,13 @@
set desc = "Jump into bluespace and continue wherever you left off. Deletes the BSTech and returns to your original mob if you have one."
set category = "BST"
var/client/C = src.client
if(C.holder && C.holder.original_mob)
if(C.holder.original_mob.key)//Thanks for kicking Tish off the Server Meow, wouldn't have spotted this otherwise.
if(original_mob)
if(original_mob.key)//Thanks for kicking Tish off the Server Meow, wouldn't have spotted this otherwise.
//suicide()
return
C.holder.original_mob.key = key
C.holder.original_mob = null
original_mob.key = key
original_mob = null
suicide()
/mob/living/carbon/human/bst/verb/tgm()
@@ -519,3 +524,8 @@
/mob/living/carbon/human/bst/restrained()
return 0
/mob/living/carbon/human/bst/vv_edit_var(var_name, var_value)
if(var_name == NAMEOF(src, original_mob))
return FALSE
return ..()
+7 -45
View File
@@ -121,7 +121,7 @@
set name = "Del-All"
// to prevent REALLY stupid deletions
var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/abstract, /mob/abstract/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai)
var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/abstract, /mob/abstract/ghost/observer, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai)
var/hsbitem = input(usr, "Choose an object to delete.", "Delete:") as null|anything in typesof(/obj) + typesof(/mob) - blocked
if(hsbitem)
for(var/atom/O in world)
@@ -177,7 +177,7 @@
if(alert("This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.",,"Yes","No") != "Yes")
return
else
var/mob/abstract/observer/ghost = new/mob/abstract/observer(M,1)
var/mob/abstract/ghost/observer/ghost = new/mob/abstract/ghost/observer(M,1)
ghost.ckey = M.ckey
message_admins(SPAN_NOTICE("[key_name_admin(usr)] assumed direct control of [M]."), 1)
log_admin("[key_name(usr)] assumed direct control of [M].")
@@ -301,7 +301,7 @@
for(var/spawn_observer in chosen_observers)
var/mob/living/carbon/human/H = new /mob/living/carbon/human(get_turf(usr))
do_dressing(H)
var/mob/abstract/observer/O = spawn_observer
var/mob/abstract/ghost/observer/O = spawn_observer
H.ckey = O.ckey
qdel(O)
@@ -313,58 +313,20 @@
return
do_dressing(H)
/client/proc/do_dressing(var/mob/living/carbon/human/M = null)
/proc/do_dressing(var/mob/living/carbon/human/M = null)
if(!M || !istype(M))
M = input("Select a mob you would like to dress.", "Set Human Outfit") as null|anything in GLOB.human_mob_list
M = tgui_input_list(usr, "Select a mob you would like to dress.", "Set Human Outfit", GLOB.human_mob_list)
if(!M)
return
var/list/outfit_catagories = list()
switch(alert("Would you like ERT outfits, or standard admin outfits?", "ERT-or-Admin?", "ERT", "Admin", "Cancel"))
if("Cancel")
return
if("ERT")
outfit_catagories["SCC-ERT"] = typesof(/obj/outfit/admin/ert/scc)
outfit_catagories["NT-ERT"] = typesof(/obj/outfit/admin/ert/nanotrasen)
outfit_catagories["Deathsquad"] = typesof(/obj/outfit/admin/deathsquad)
outfit_catagories["TCFL"] = typesof(/obj/outfit/admin/ert/legion)
outfit_catagories["Syndicate"] = typesof(/obj/outfit/admin/deathsquad/syndicate)
outfit_catagories["Freelance Mercenaries"] = typesof(/obj/outfit/admin/ert/mercenary)
outfit_catagories["Free Solarian Fleets Marines"] = typesof(/obj/outfit/admin/ert/fsf)
outfit_catagories["Kataphracts"] = typesof(/obj/outfit/admin/ert/kataphract)
outfit_catagories["Eridani"] = typesof(/obj/outfit/admin/ert/ap_eridani)
outfit_catagories["IAC"] = typesof(/obj/outfit/admin/ert/iac)
outfit_catagories["Kosmostrelki"] = typesof(/obj/outfit/admin/ert/pra_cosmonaut)
outfit_catagories["Elyran Navy"] = typesof(/obj/outfit/admin/ert/elyran_trooper)
if("Admin")
outfit_catagories["Stellar Corporate Conglomerate"] = typesof(/obj/outfit/admin/scc)
outfit_catagories["NanoTrasen"] = typesof(/obj/outfit/admin/nt)
outfit_catagories["Antagonist"] = typesof(/obj/outfit/admin/syndicate)
outfit_catagories["Event"] = typesof(/obj/outfit/admin/event)
outfit_catagories["TCFL"] = typesof(/obj/outfit/admin/tcfl)
outfit_catagories["Killers"] = typesof(/obj/outfit/admin/killer)
outfit_catagories["Job"] = subtypesof(/obj/outfit/job)
outfit_catagories["Megacorps"] = subtypesof(/obj/outfit/admin/megacorp)
outfit_catagories["Pod Survivors"] = subtypesof(/obj/outfit/admin/pod)
outfit_catagories["Miscellaneous"] = typesof(/obj/outfit/admin/random)
outfit_catagories["Miscellaneous"] += /obj/outfit/admin/random_employee
var/chosen_catagory = input("Select an outfit catagory.", "Robust Quick-dress Shop") as null|anything in outfit_catagories
if(isnull(chosen_catagory))
return
var/list/outfit_types = list()
for(var/outfit in outfit_catagories[chosen_catagory])
var/obj/outfit/admin/A = new outfit
outfit_types[A.name] = A
var/chosen_outfit = input("Select an outfit.", "Robust Quick-dress Shop") as null|anything in outfit_types
var/chosen_outfit = tgui_input_list(usr, "Select an outfit.", "Set Human Outfit", GLOB.outfit_cache)
if(isnull(chosen_outfit))
return
feedback_add_details("admin_verb","SEQ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc
var/obj/outfit/O = outfit_types[chosen_outfit]
var/obj/outfit/O = GLOB.outfit_cache[chosen_outfit]
if(O)
for(var/obj/item/I in M)
if(istype(I, /obj/item/implant))
+17 -17
View File
@@ -239,7 +239,7 @@ Ccomp's first proc.
var/list/ghosts = list()
var/list/sortmob = sortAtom(GLOB.mob_list) // get the mob list.
var/any=0
for(var/mob/abstract/observer/M in sortmob)
for(var/mob/abstract/ghost/observer/M in sortmob)
mobs.Add(M) //filter it where it's only ghosts
any = 1 //if no ghosts show up, any will just be 0
if(!any)
@@ -269,7 +269,7 @@ Ccomp's first proc.
to_chat(src, SPAN_WARNING("You didn't select a ghost!")) // Sanity check, if no ghosts in the list we don't want to edit a null variable and cause a runtime error.)
return
var/mob/abstract/observer/G = ghosts[target]
var/mob/abstract/ghost/observer/G = ghosts[target]
if(G.has_enabled_antagHUD && GLOB.config.antag_hud_restricted)
var/response = alert(src, "Are you sure you wish to allow this individual to play?","Ghost has used AntagHUD","Yes","No")
if(response == "No") return
@@ -330,9 +330,9 @@ Ccomp's first proc.
to_chat(src, "Only administrators may use this command.")
var/action=""
if(GLOB.config.antag_hud_allowed)
for(var/mob/abstract/observer/g in get_ghosts())
for(var/mob/abstract/ghost/observer/g in get_ghosts())
if(!g.client.holder) //Remove the verb from non-admin ghosts
remove_verb(g, /mob/abstract/observer/verb/toggle_antagHUD)
remove_verb(g, /mob/abstract/ghost/observer/verb/toggle_antagHUD)
if(g.antagHUD)
g.antagHUD = 0 // Disable it on those that have it enabled
g.has_enabled_antagHUD = 2 // We'll allow them to respawn
@@ -341,9 +341,9 @@ Ccomp's first proc.
to_chat(src, SPAN_DANGER("AntagHUD usage has been disabled."))
action = "disabled"
else
for(var/mob/abstract/observer/g in get_ghosts())
for(var/mob/abstract/ghost/observer/g in get_ghosts())
if(!g.client.holder) // Add the verb back for all non-admin ghosts
add_verb(g, /mob/abstract/observer/verb/toggle_antagHUD)
add_verb(g, /mob/abstract/ghost/observer/verb/toggle_antagHUD)
to_chat(g, SPAN_NOTICE("<B>The Administrator has enabled AntagHUD.</B>")) // Notify all observers they can now use AntagHUD)
GLOB.config.antag_hud_allowed = 1
action = "enabled"
@@ -363,13 +363,13 @@ Ccomp's first proc.
to_chat(src, "Only administrators may use this command.")
var/action=""
if(GLOB.config.antag_hud_restricted)
for(var/mob/abstract/observer/g in get_ghosts())
for(var/mob/abstract/ghost/observer/g in get_ghosts())
to_chat(g, SPAN_NOTICE("<B>The administrator has lifted restrictions on joining the round if you use AntagHUD</B>"))
action = "lifted restrictions"
GLOB.config.antag_hud_restricted = 0
to_chat(src, SPAN_NOTICE("<B>AntagHUD restrictions have been lifted</B>"))
else
for(var/mob/abstract/observer/g in get_ghosts())
for(var/mob/abstract/ghost/observer/g in get_ghosts())
to_chat(g, SPAN_DANGER("The administrator has placed restrictions on joining the round if you use AntagHUD"))
to_chat(g, SPAN_DANGER("Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions "))
g.antagHUD = 0
@@ -398,8 +398,8 @@ Traitors and the like can also be revived with the previous role mostly intact.
if(!input)
return
var/mob/abstract/observer/G_found
for(var/mob/abstract/observer/G in GLOB.player_list)
var/mob/abstract/ghost/observer/G_found
for(var/mob/abstract/ghost/observer/G in GLOB.player_list)
if(G.ckey == input)
G_found = G
break
@@ -602,7 +602,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
if("No")
to_world(SPAN_WARNING("New [SSatlas.current_map.company_name] Update available at all communication consoles."))
sound_to(world, ('sound/AI/commandreport.ogg'))
sound_to_playing_players('sound/AI/commandreport.ogg')
log_admin("[key_name(src)] has created a command report: [reportbody]")
message_admins("[key_name_admin(src)] has created a command report", 1)
@@ -621,11 +621,11 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/action = alert(src, "Are you sure you want to delete:\n[O]\nat ([O.x], [O.y], [O.z])?", "Confirmation", "Yes", "No", "Hard Delete")
if (action == "No")
if (action == "No" || !action)
return
if (istype(O, /mob/abstract/observer))
var/mob/abstract/observer/M = O
if (istype(O, /mob/abstract/ghost/observer))
var/mob/abstract/ghost/observer/M = O
if (M.client && alert(src, "They are still connected. Are you sure, they will loose connection.", "Confirmation", "Yes", "No") != "Yes")
return
log_admin("[key_name(usr)] deleted [O] at ([O.x],[O.y],[O.z])")
@@ -720,7 +720,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
log_admin("[key_name(usr)] has gibbed [key_name(M)]")
message_admins("[key_name_admin(usr)] has gibbed [key_name_admin(M)]", 1)
if(istype(M, /mob/abstract/observer))
if(isobserver(M))
gibs(M.loc, M.viruses)
return
@@ -733,7 +733,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm == "Yes")
if (istype(mob, /mob/abstract/observer)) // so they don't spam gibs everywhere
if (istype(mob, /mob/abstract/ghost/observer)) // so they don't spam gibs everywhere
return
else
mob.gib()
@@ -751,7 +751,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm != "Yes")
if(istype(mob, /mob/abstract/observer))
if(istype(mob, /mob/abstract/ghost/observer))
return
else
mob.dust()
+1 -1
View File
@@ -170,7 +170,7 @@
return
var/del_action = alert("Are you really sure you want to delete all objects of type [O.type]?",,"Yes","No", "Hard Delete")
if(del_action == "No")
if (del_action == "No" || !del_action)
return
if(alert("Second confirmation required. Delete?",,"Yes","No") != "Yes")