Storyteller admin/mod/fun verb smorgasbord (#20831)

As title: grants STs a small selection of admin/mod/fun verbs without
needing them to have an admin_rank configured on the back end.

I've been extra permissive here on the assumption that Those That Be
will veto anything they don't like. The granted verbs:
	/client/proc/toggle_view_range,
	/client/proc/jumptozlevel,
	/client/proc/jumptoshuttle,
	/client/proc/jumptoship,
	/client/proc/jumptosector,
	/client/proc/Getmob,
	/client/proc/Jump,
	/client/proc/jumptomob,
	/client/proc/jumptoturf,
	/client/proc/check_ai_laws,
	/client/proc/manage_silicon_laws,
	/client/proc/odyssey_panel,
	/client/proc/damage_menu,
	/client/proc/change_human_appearance_admin,
	/client/proc/change_security_level,
	/client/proc/cmd_dev_bst,
	/datum/admins/proc/create_admin_fax,
	/client/proc/check_fax_history,
	/client/proc/clear_toxins,
	/datum/admins/proc/call_supply_drop,
	/datum/admins/proc/call_drop_pod,
	/client/proc/event_manager_panel,
	/client/proc/toggle_random_events
	
This PR is full of _gross code_ but it _does_ work.
This commit is contained in:
Batrachophreno
2025-08-06 12:43:42 +00:00
committed by GitHub
parent a231c3a7c2
commit 790aeafbdf
13 changed files with 504 additions and 420 deletions
+3 -5
View File
@@ -343,8 +343,6 @@ SUBSYSTEM_DEF(events)
set name = "Event Manager Panel"
set category = "Admin"
if (!holder)
return
SSevents.Interact(usr)
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if (holder || isstoryteller(usr))
SSevents.Interact(usr)
feedback_add_details("admin_verb","EMP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -1320,7 +1320,7 @@ var/global/enabled_spooking = 0
/datum/admins/proc/paralyze_mob(mob/living/H as mob)
set category = "Admin"
set name = "Toggle Wind"
set name = "Toggle Winded"
set desc = "Paralyzes a player. Or unparalyses them."
toggle_wind_paralysis(H, usr)
+100 -72
View File
@@ -519,6 +519,32 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list(
/client/proc/toggle_aooc
))
GLOBAL_LIST_INIT(admin_verbs_storyteller, list(
/client/proc/toggle_view_range, /*changes how far we can see*/
/client/proc/jumptozlevel,
/client/proc/jumptoshuttle,
/client/proc/jumptoship,
/client/proc/jumptosector,
/client/proc/Getmob, /*teleports a mob to our location*/
/client/proc/Jump,
/client/proc/jumptomob, //allows us to jump to a specific mob,
/client/proc/jumptoturf, /*allows us to jump to a specific turf*/
/client/proc/check_ai_laws, //shows AI and borg laws,
/client/proc/manage_silicon_laws,
/client/proc/odyssey_panel,
/client/proc/damage_menu,
/client/proc/change_human_appearance_admin, // Allows an admin to change the basic appearance of human-based mobs ,
/client/proc/change_security_level,
/client/proc/cmd_dev_bst,
/datum/admins/proc/create_admin_fax,
/client/proc/check_fax_history,
/client/proc/clear_toxins,
/datum/admins/proc/call_supply_drop,
/datum/admins/proc/call_drop_pod,
/client/proc/event_manager_panel,
/client/proc/toggle_random_events
))
/client/proc/add_admin_verbs()
SHOULD_NOT_SLEEP(TRUE)
@@ -561,6 +587,12 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list(
remove_verb(src, GLOB.debug_verbs)
add_aooc_if_necessary()
/client/proc/add_storyteller_verbs()
SHOULD_NOT_SLEEP(TRUE)
if(isstoryteller(src.mob))
add_verb(src, GLOB.admin_verbs_storyteller)
/client/proc/hide_most_verbs()//Allows you to keep some functionality while hiding some verbs
set name = "Adminverbs - Hide Most"
set category = "Admin"
@@ -856,7 +888,7 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list(
/client/proc/check_ai_laws()
set name = "Check AI Laws"
set category = "Admin"
if(holder)
if(holder || isstoryteller(src.mob))
src.holder.output_ai_laws()
/client/proc/rename_silicon()
@@ -878,29 +910,27 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list(
set name = "Manage Silicon Laws"
set category = "Admin"
if(!check_rights(R_ADMIN)) return
if(check_rights(R_ADMIN) || isstoryteller(src.mob))
var/mob/living/silicon/S = input("Select silicon.", "Manage Silicon Laws") as null|anything in GLOB.silicon_mob_list
if(!S) return
var/mob/living/silicon/S = input("Select silicon.", "Manage Silicon Laws") as null|anything in GLOB.silicon_mob_list
if(!S) return
var/datum/tgui_module/admin/law_manager/L = new(S)
L.ui_interact(usr)
log_and_message_admins("has opened [S]'s law manager.")
feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
var/datum/tgui_module/admin/law_manager/L = new(S)
L.ui_interact(usr)
log_and_message_admins("has opened [S]'s law manager.")
feedback_add_details("admin_verb","MSL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/change_human_appearance_admin()
set name = "Change Mob Appearance - Admin"
set desc = "Allows you to change the mob appearance"
set category = "Admin"
if(!check_rights(R_FUN)) return
if(check_rights(R_FUN) || isstoryteller(src.mob))
var/mob/living/carbon/human/H = tgui_input_list(usr, "Select mob.", "Change Mob Appearance - Self", GLOB.human_mob_list)
if(!H) return
var/mob/living/carbon/human/H = tgui_input_list(usr, "Select mob.", "Change Mob Appearance - Self", GLOB.human_mob_list)
if(!H) return
log_and_message_admins("is altering the appearance of [H].")
H.change_appearance(APPEARANCE_ALL, usr, FALSE)
feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
log_and_message_admins("is altering the appearance of [H].")
H.change_appearance(APPEARANCE_ALL, usr, FALSE)
feedback_add_details("admin_verb","CHAA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/change_human_appearance_self()
set name = "Change Mob Appearance - Self"
@@ -930,13 +960,12 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list(
set desc = "Sets the station's security level"
set category = "Admin"
if(!check_rights(R_ADMIN))
return
var/sec_level = tgui_input_list(usr, "It's currently code [get_security_level()].", "Select Security Level", list("green", "blue", "red", "yellow", "delta") - get_security_level())
var/msg = tgui_alert(usr, "Switch from code [get_security_level()] to code [sec_level]?", "Security Level", list("Yes","No"))
if(msg == "Yes")
set_security_level(sec_level)
log_admin("[key_name(usr)] changed the security level to code [sec_level].")
if(check_rights(R_ADMIN) || isstoryteller(src.mob))
var/sec_level = tgui_input_list(usr, "It's currently code [get_security_level()].", "Select Security Level", list("green", "blue", "red", "yellow", "delta") - get_security_level())
var/msg = tgui_alert(usr, "Switch from code [get_security_level()] to code [sec_level]?", "Security Level", list("Yes","No"))
if(msg == "Yes")
set_security_level(sec_level)
log_admin("[key_name(usr)] changed the security level to code [sec_level].")
//---- bs12 verbs ----
@@ -952,65 +981,64 @@ GLOBAL_LIST_INIT(admin_verbs_cciaa, list(
set name = "Edit Appearance"
set category = "Fun"
if(!check_rights(R_FUN)) return
if(check_rights(R_FUN) || isstoryteller(src.mob))
var/mob/living/carbon/human/selected_human = input("Select mob.", "Edit Appearance") as null|anything in GLOB.human_mob_list
var/mob/living/carbon/human/selected_human = input("Select mob.", "Edit Appearance") as null|anything in GLOB.human_mob_list
if(!istype(selected_human, /mob/living/carbon/human))
to_chat(usr, SPAN_WARNING("You can only do this to humans!"))
return
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi and Tajaran can result in unintended consequences.",,"Yes","No"))
if("No")
if(!istype(selected_human, /mob/living/carbon/human))
to_chat(usr, SPAN_WARNING("You can only do this to humans!"))
return
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
if(new_facial)
selected_human.r_facial = hex2num(copytext(new_facial, 2, 4))
selected_human.g_facial = hex2num(copytext(new_facial, 4, 6))
selected_human.b_facial = hex2num(copytext(new_facial, 6, 8))
switch(alert("Are you sure you wish to edit this mob's appearance? Skrell, Unathi and Tajaran can result in unintended consequences.",,"Yes","No"))
if("No")
return
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
if(new_facial)
selected_human.r_facial = hex2num(copytext(new_facial, 2, 4))
selected_human.g_facial = hex2num(copytext(new_facial, 4, 6))
selected_human.b_facial = hex2num(copytext(new_facial, 6, 8))
var/new_hair = input("Please select hair color.", "Character Generation") as color
if(new_facial)
selected_human.r_hair = hex2num(copytext(new_hair, 2, 4))
selected_human.g_hair = hex2num(copytext(new_hair, 4, 6))
selected_human.b_hair = hex2num(copytext(new_hair, 6, 8))
var/new_hair = input("Please select hair color.", "Character Generation") as color
if(new_facial)
selected_human.r_hair = hex2num(copytext(new_hair, 2, 4))
selected_human.g_hair = hex2num(copytext(new_hair, 4, 6))
selected_human.b_hair = hex2num(copytext(new_hair, 6, 8))
var/new_eyes = input("Please select eye color.", "Character Generation") as color
if(new_eyes)
selected_human.r_eyes = hex2num(copytext(new_eyes, 2, 4))
selected_human.g_eyes = hex2num(copytext(new_eyes, 4, 6))
selected_human.b_eyes = hex2num(copytext(new_eyes, 6, 8))
selected_human.update_eyes()
var/new_eyes = input("Please select eye color.", "Character Generation") as color
if(new_eyes)
selected_human.r_eyes = hex2num(copytext(new_eyes, 2, 4))
selected_human.g_eyes = hex2num(copytext(new_eyes, 4, 6))
selected_human.b_eyes = hex2num(copytext(new_eyes, 6, 8))
selected_human.update_eyes()
var/new_skin = input("Please select body color. This is for Tajaran, Unathi, and Skrell only!", "Character Generation") as color
if(new_skin)
selected_human.r_skin = hex2num(copytext(new_skin, 2, 4))
selected_human.g_skin = hex2num(copytext(new_skin, 4, 6))
selected_human.b_skin = hex2num(copytext(new_skin, 6, 8))
var/new_skin = input("Please select body color. This is for Tajaran, Unathi, and Skrell only!", "Character Generation") as color
if(new_skin)
selected_human.r_skin = hex2num(copytext(new_skin, 2, 4))
selected_human.g_skin = hex2num(copytext(new_skin, 4, 6))
selected_human.b_skin = hex2num(copytext(new_skin, 6, 8))
var/new_tone = input("Please select skin tone level: (Light [selected_human.species.lower_skin_tone_bound] - [selected_human.species.upper_skin_tone_bound] Dark). Higher is darker.", "Character Generation") as text
var/new_tone = input("Please select skin tone level: (Light [selected_human.species.lower_skin_tone_bound] - [selected_human.species.upper_skin_tone_bound] Dark). Higher is darker.", "Character Generation") as text
if (new_tone)
selected_human.s_tone = 35 - clamp(round(text2num(new_tone)), selected_human.species.lower_skin_tone_bound, selected_human.species.upper_skin_tone_bound)
if (new_tone)
selected_human.s_tone = 35 - clamp(round(text2num(new_tone)), selected_human.species.lower_skin_tone_bound, selected_human.species.upper_skin_tone_bound)
// hair
var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in GLOB.hair_styles_list
if(new_hstyle)
selected_human.h_style = new_hstyle
// hair
var/new_hstyle = input(usr, "Select a hair style", "Grooming") as null|anything in GLOB.hair_styles_list
if(new_hstyle)
selected_human.h_style = new_hstyle
// facial hair
var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in GLOB.facial_hair_styles_list
if(new_fstyle)
selected_human.f_style = new_fstyle
// facial hair
var/new_fstyle = input(usr, "Select a facial hair style", "Grooming") as null|anything in GLOB.facial_hair_styles_list
if(new_fstyle)
selected_human.f_style = new_fstyle
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
if (new_gender)
if(new_gender == "Male")
selected_human.gender = MALE
else
selected_human.gender = FEMALE
selected_human.update_hair()
selected_human.update_body()
selected_human.check_dna(selected_human)
var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female")
if (new_gender)
if(new_gender == "Male")
selected_human.gender = MALE
else
selected_human.gender = FEMALE
selected_human.update_hair()
selected_human.update_body()
selected_human.check_dna(selected_human)
/client/proc/playernotes()
set name = "Show Player Info"
+121 -136
View File
@@ -9,66 +9,60 @@
set desc = "Area to jump to"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(istype(usr, /mob/abstract/new_player))
return
if(istype(usr, /mob/abstract/new_player))
return
if(GLOB.config.allow_admin_jump)
usr.on_mob_jump()
usr.forceMove(pick(get_area_turfs(A)))
if(GLOB.config.allow_admin_jump)
usr.on_mob_jump()
usr.forceMove(pick(get_area_turfs(A)))
log_admin("[key_name(usr)] jumped to [A]")
message_admins("[key_name_admin(usr)] jumped to [A]", 1)
feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
log_admin("[key_name(usr)] jumped to [A]")
message_admins("[key_name_admin(usr)] jumped to [A]", 1)
feedback_add_details("admin_verb","JA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/jumptoturf(var/turf/T in world)
set name = "Jump to Turf"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(isnewplayer(usr))
return
if(isnewplayer(usr))
if(GLOB.config.allow_admin_jump)
log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]")
message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]", 1)
usr.on_mob_jump()
usr.forceMove(T)
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
return
if(GLOB.config.allow_admin_jump)
log_admin("[key_name(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]")
message_admins("[key_name_admin(usr)] jumped to [T.x],[T.y],[T.z] in [T.loc]", 1)
usr.on_mob_jump()
usr.forceMove(T)
feedback_add_details("admin_verb","JT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
return
/client/proc/jumptomob(var/mob/M in GLOB.mob_list)
set category = "Admin"
set name = "Jump to Mob Admin"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(isnewplayer(usr))
return
if(isnewplayer(usr))
return
if(GLOB.config.allow_admin_jump)
log_admin("[key_name(usr)] jumped to [key_name(M)]")
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
if(src.mob)
var/mob/A = src.mob
var/turf/T = get_turf(M)
if(isturf(T))
feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
A.on_mob_jump()
A.forceMove(T)
else
to_chat(A, "This mob is not located in the game world.")
else
alert("Admin jumping disabled")
if(GLOB.config.allow_admin_jump)
log_admin("[key_name(usr)] jumped to [key_name(M)]")
message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1)
if(src.mob)
var/mob/A = src.mob
var/turf/T = get_turf(M)
if(isturf(T))
feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
A.on_mob_jump()
A.forceMove(T)
else
to_chat(A, "This mob is not located in the game world.")
else
alert("Admin jumping disabled")
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
set category = "Admin"
@@ -94,102 +88,94 @@
set category = "Admin"
set name = "Jump to Z-Level"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(GLOB.config.allow_admin_jump)
var/list/zlevels = list()
for(var/z=0, z<world.maxz, z++)
zlevels += z
var/selection = input("Select z-level to jump to.", "Admin Jumping", null, null) as null|anything in zlevels
if(!selection)
to_chat(src, "No z-level selected.")
return
if(src && src.mob)
var/mob/A = src.mob
A.on_mob_jump()
A.x = world.maxx/2
A.y = world.maxy/2
A.z = selection
message_admins("[key_name_admin(usr)] jumped to z-level [selection]", 1)
feedback_add_details("admin_verb","JZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(GLOB.config.allow_admin_jump)
var/list/zlevels = list()
for(var/z=0, z<world.maxz, z++)
zlevels += z
var/selection = input("Select z-level to jump to.", "Admin Jumping", null, null) as null|anything in zlevels
if(!selection)
to_chat(src, "No z-level selected.")
return
if(src && src.mob)
var/mob/A = src.mob
A.on_mob_jump()
A.x = world.maxx/2
A.y = world.maxy/2
A.z = selection
message_admins("[key_name_admin(usr)] jumped to z-level [selection]", 1)
feedback_add_details("admin_verb","JZ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/jumptoshuttle()
set category = "Admin"
set name = "Jump to Shuttle"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(GLOB.config.allow_admin_jump)
var/list/shuttles = list()
for(var/shuttle_tag in SSshuttle.shuttles)
shuttles += shuttle_tag
var/selection = input("Select shuttle to jump to.", "Admin Jumping", null, null) as null|anything in shuttles
if(!selection)
to_chat(src, "No shuttle selected.")
return
var/datum/shuttle/shuttle = SSshuttle.shuttles[selection]
if(src && src.mob && shuttle && shuttle.current_location && shuttle.current_location.loc)
usr.on_mob_jump()
usr.forceMove(shuttle.current_location.loc)
message_admins("[key_name_admin(usr)] jumped to shuttle [selection]", 1)
feedback_add_details("admin_verb","JSHU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(GLOB.config.allow_admin_jump)
var/list/shuttles = list()
for(var/shuttle_tag in SSshuttle.shuttles)
shuttles += shuttle_tag
var/selection = input("Select shuttle to jump to.", "Admin Jumping", null, null) as null|anything in shuttles
if(!selection)
to_chat(src, "No shuttle selected.")
return
var/datum/shuttle/shuttle = SSshuttle.shuttles[selection]
if(src && src.mob && shuttle && shuttle.current_location && shuttle.current_location.loc)
usr.on_mob_jump()
usr.forceMove(shuttle.current_location.loc)
message_admins("[key_name_admin(usr)] jumped to shuttle [selection]", 1)
feedback_add_details("admin_verb","JSHU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/jumptoship()
set category = "Admin"
set name = "Jump to Ship"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(GLOB.config.allow_admin_jump)
var/list/ships = list()
for(var/ship in SSshuttle.ships)
ships += ship
var/selection = input("Select ship to jump to.", "Admin Jumping", null, null) as null|anything in ships
if(!selection)
to_chat(src, "No ship selected.")
return
var/obj/effect/overmap/visitable/ship/ship = selection
if(src && src.mob && ship && ship.entry_points && ship.entry_points[1])
usr.on_mob_jump()
usr.forceMove(ship.entry_points[1].loc)
message_admins("[key_name_admin(usr)] jumped to ship [selection]", 1)
feedback_add_details("admin_verb","JSHI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(GLOB.config.allow_admin_jump)
var/list/ships = list()
for(var/ship in SSshuttle.ships)
ships += ship
var/selection = input("Select ship to jump to.", "Admin Jumping", null, null) as null|anything in ships
if(!selection)
to_chat(src, "No ship selected.")
return
var/obj/effect/overmap/visitable/ship/ship = selection
if(src && src.mob && ship && ship.entry_points && ship.entry_points[1])
usr.on_mob_jump()
usr.forceMove(ship.entry_points[1].loc)
message_admins("[key_name_admin(usr)] jumped to ship [selection]", 1)
feedback_add_details("admin_verb","JSHI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/jumptosector()
set category = "Admin"
set name = "Jump to Sector"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV))
return
if(GLOB.config.allow_admin_jump)
var/list/sectors = list()
for(var/sector in SSshuttle.initialized_sectors)
sectors += sector
var/selection = input("Select sector to jump to.", "Admin Jumping", null, null) as null|anything in sectors
if(!selection)
to_chat(src, "No sector selected.")
return
var/obj/effect/overmap/visitable/sector/sector = selection
if(src && src.mob && sector && sector.map_z && sector.map_z[1])
var/mob/A = src.mob
A.on_mob_jump()
A.x = world.maxx/2
A.y = world.maxy/2
A.z = sector.map_z[1]
message_admins("[key_name_admin(usr)] jumped to sector [selection]", 1)
feedback_add_details("admin_verb","JSEC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
if(check_rights(R_ADMIN|R_MOD|R_DEBUG|R_DEV) || isstoryteller(src.mob))
if(GLOB.config.allow_admin_jump)
var/list/sectors = list()
for(var/sector in SSshuttle.initialized_sectors)
sectors += sector
var/selection = input("Select sector to jump to.", "Admin Jumping", null, null) as null|anything in sectors
if(!selection)
to_chat(src, "No sector selected.")
return
var/obj/effect/overmap/visitable/sector/sector = selection
if(src && src.mob && sector && sector.map_z && sector.map_z[1])
var/mob/A = src.mob
A.on_mob_jump()
A.x = world.maxx/2
A.y = world.maxy/2
A.z = sector.map_z[1]
message_admins("[key_name_admin(usr)] jumped to sector [selection]", 1)
feedback_add_details("admin_verb","JSEC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/jumptokey()
set category = "Admin"
@@ -219,16 +205,15 @@
set category = "Admin"
set name = "Get Mob"
set desc = "Mob to teleport"
if(!check_rights(R_ADMIN|R_MOD|R_DEBUG))
return
if(GLOB.config.allow_admin_jump)
log_admin("[key_name(usr)] teleported [key_name(M)]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)]", 1)
M.on_mob_jump()
M.forceMove(get_turf(usr))
feedback_add_details("admin_verb","GM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
if(check_rights(R_ADMIN|R_MOD|R_DEBUG) || isstoryteller(src.mob))
if(GLOB.config.allow_admin_jump)
log_admin("[key_name(usr)] teleported [key_name(M)]")
message_admins("[key_name_admin(usr)] teleported [key_name_admin(M)]", 1)
M.on_mob_jump()
M.forceMove(get_turf(usr))
feedback_add_details("admin_verb","GM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else
alert("Admin jumping disabled")
/client/proc/Getkey()
set category = "Admin"
+2 -2
View File
@@ -24,10 +24,10 @@
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))
if(!check_rights(R_DEV|R_ADMIN) || !isstoryteller(src.mob))
return
if(!holder)
if(!holder || !isstoryteller(src.mob))
return //how did they get here?
if(!ROUND_IS_STARTED)
+2 -1
View File
@@ -1,8 +1,9 @@
/client/proc/clear_toxins()
set category = "Special Verbs"
set name = "Clear Toxin/Fire in Zone"
set desc = "Remove fires from your current zone and reset the atmosphere to human-perfect gas mix, pressure, and temp."
if (!check_rights(R_ADMIN))
if (!check_rights(R_ADMIN) && !isstoryteller(usr))
return
if(!usr.loc) return
+10 -11
View File
@@ -1069,17 +1069,16 @@ Traitors and the like can also be revived with the previous role mostly intact.
set name = "Toggle random events on/off"
set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off"
if(!check_rights(R_SERVER)) return
if(!GLOB.config.allow_random_events)
GLOB.config.allow_random_events = 1
to_chat(usr, "Random events enabled")
message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1)
else
GLOB.config.allow_random_events = 0
to_chat(usr, "Random events disabled")
message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1)
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
if(check_rights(R_SERVER) || isstoryteller(usr))
if(!GLOB.config.allow_random_events)
GLOB.config.allow_random_events = 1
to_chat(usr, "Random events enabled")
message_admins("Admin [key_name_admin(usr)] has enabled random events.", 1)
else
GLOB.config.allow_random_events = 0
to_chat(usr, "Random events disabled")
message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1)
feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/fab_tip()
set category = "Admin"
+81 -77
View File
@@ -3,94 +3,98 @@
set desc = "Send a fax from Central Command."
set category = "Special Verbs"
if (!check_rights(R_ADMIN|R_CCIAA|R_FUN))
if (check_rights(R_ADMIN|R_CCIAA|R_FUN) || isstoryteller(usr))
var/list/faxes = list()
for(var/obj/machinery/photocopier/faxmachine/F in GLOB.allfaxes)
faxes[F.department] = F
if(!length(faxes))
to_chat(usr, SPAN_WARNING("No valid fax machines located!"))
return
if (isstoryteller(usr))
to_chat(usr, SPAN_DANGER("CCIA NOTE: Remember that you should only interact via CentComm faxes as they relate to your current odyssey. For any questions, please consult CCIA via Discord."))
var/department = tgui_input_list(usr, "Pick a fax machine.", "Send Admin Fax", faxes)
var/obj/machinery/photocopier/faxmachine/fax = faxes[department]
if (!istype(fax))
to_chat(usr, SPAN_WARNING("Couldn't find a fax machine to send this to!"))
return
//todo: sanitize
var/input = tgui_input_text(usr, "Please enter a message to reply to via secure connection. BBCode and HTML allowed.", \
"Outgoing message from Centcomm", "", MAX_BOOK_MESSAGE_LEN, TRUE)
if (!input)
to_chat(usr, SPAN_WARNING("Cancelled."))
return
var/customname = tgui_input_text(usr, "Pick a title for the report.", "Title")
if (!customname)
to_chat(usr, SPAN_WARNING("Cancelled."))
return
var/announce = alert(usr, "Do you wish to announce the fax being sent?", "Announce Fax", "Yes", "No")
if(announce == "Yes")
announce = TRUE
// Create the reply message
var/obj/item/paper/P = new /obj/item/paper(null) //hopefully the null loc won't cause trouble for us
P.set_content("[SSatlas.current_map.boss_name] - [customname]", input)
// Stamps
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!P.stamped)
P.stamped = new
P.stamped += /obj/item/stamp
P.AddOverlays(stampoverlay)
P.stamps += "<HR><i>This paper has been stamped by the Central Command Quantum Relay.</i>"
if(fax.receivefax(P))
if(announce == 1)
command_announcement.Announce("A fax has been sent to the [department] fax machine.", "Fax Sent")
to_chat(usr, SPAN_NOTICE("Message transmitted successfully."))
log_and_message_admins("sent a fax message to the [department] fax machine. (<A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[fax.x];Y=[fax.y];Z=[fax.z]'>JMP</a>)")
GLOB.sent_faxes += P
else
to_chat(usr, SPAN_WARNING("Message reply failed."))
qdel(P)
return
else
to_chat(usr, SPAN_WARNING("You do not have enough powers to do this."))
return
var/list/faxes = list()
for(var/obj/machinery/photocopier/faxmachine/F in GLOB.allfaxes)
faxes[F.department] = F
if(!length(faxes))
to_chat(usr, SPAN_WARNING("No valid fax machines located!"))
return
var/department = tgui_input_list(usr, "Pick a fax machine.", "Send Admin Fax", faxes)
var/obj/machinery/photocopier/faxmachine/fax = faxes[department]
if (!istype(fax))
to_chat(usr, SPAN_WARNING("Couldn't find a fax machine to send this to!"))
return
//todo: sanitize
var/input = tgui_input_text(usr, "Please enter a message to reply to via secure connection. BBCode and HTML allowed.", \
"Outgoing message from Centcomm", "", MAX_BOOK_MESSAGE_LEN, TRUE)
if (!input)
to_chat(usr, SPAN_WARNING("Cancelled."))
return
var/customname = tgui_input_text(usr, "Pick a title for the report.", "Title")
if (!customname)
to_chat(usr, SPAN_WARNING("Cancelled."))
return
var/announce = alert(usr, "Do you wish to announce the fax being sent?", "Announce Fax", "Yes", "No")
if(announce == "Yes")
announce = TRUE
// Create the reply message
var/obj/item/paper/P = new /obj/item/paper(null) //hopefully the null loc won't cause trouble for us
P.set_content("[SSatlas.current_map.boss_name] - [customname]", input)
// Stamps
var/image/stampoverlay = image('icons/obj/bureaucracy.dmi')
stampoverlay.icon_state = "paper_stamp-cent"
if(!P.stamped)
P.stamped = new
P.stamped += /obj/item/stamp
P.AddOverlays(stampoverlay)
P.stamps += "<HR><i>This paper has been stamped by the Central Command Quantum Relay.</i>"
if(fax.receivefax(P))
if(announce == 1)
command_announcement.Announce("A fax has been sent to the [department] fax machine.", "Fax Sent")
to_chat(usr, SPAN_NOTICE("Message transmitted successfully."))
log_and_message_admins("sent a fax message to the [department] fax machine. (<A href='byond://?_src_=holder;adminplayerobservecoodjump=1;X=[fax.x];Y=[fax.y];Z=[fax.z]'>JMP</a>)")
GLOB.sent_faxes += P
else
to_chat(usr, SPAN_WARNING("Message reply failed."))
qdel(P)
return
/client/proc/check_fax_history()
set name = "Check fax history"
set desc = "Look up the faxes sent this round."
set category = "Special Verbs"
if (!check_rights(R_ADMIN|R_CCIAA|R_FUN))
if (check_rights(R_ADMIN|R_CCIAA|R_FUN) || isstoryteller(usr))
var/data = "<center><a href='byond://?_src_=holder;CentcommFaxReply=1'>Send New Fax</a></center>"
data += "<hr>"
data += "<center><b>Received Faxes:</b></center><br>"
if (GLOB.arrived_faxes && GLOB.arrived_faxes.len)
for (var/obj/item/item in GLOB.arrived_faxes)
data += "[item.name] - <a href='byond://?_src_=holder;AdminFaxView=[REF(item)]'>view message</a><br>"
else
data += "<center>No faxes have been received.</center>"
data += "<hr><center><b>Sent Faxes:</b></center><br>"
if (GLOB.sent_faxes && GLOB.sent_faxes.len)
for (var/obj/item/item in GLOB.sent_faxes)
data += "[item.name] - <a href='byond://?_src_=holder;AdminFaxView=[REF(item)]'>view message</a><br>"
else
data += "<center>No faxes have been sent out.</center>"
usr << browse("<HTML><HEAD><TITLE>Centcomm Fax History</TITLE></HEAD><BODY>[data]</BODY></HTML>", "window=Centcomm Fax History")
return
else
to_chat(usr, SPAN_WARNING("You do not have enough powers to do this."))
return
var/data = "<center><a href='byond://?_src_=holder;CentcommFaxReply=1'>Send New Fax</a></center>"
data += "<hr>"
data += "<center><b>Received Faxes:</b></center><br>"
if (GLOB.arrived_faxes && GLOB.arrived_faxes.len)
for (var/obj/item/item in GLOB.arrived_faxes)
data += "[item.name] - <a href='byond://?_src_=holder;AdminFaxView=[REF(item)]'>view message</a><br>"
else
data += "<center>No faxes have been received.</center>"
data += "<hr><center><b>Sent Faxes:</b></center><br>"
if (GLOB.sent_faxes && GLOB.sent_faxes.len)
for (var/obj/item/item in GLOB.sent_faxes)
data += "[item.name] - <a href='byond://?_src_=holder;AdminFaxView=[REF(item)]'>view message</a><br>"
else
data += "<center>No faxes have been sent out.</center>"
usr << browse("<HTML><HEAD><TITLE>Centcomm Fax History</TITLE></HEAD><BODY>[data]</BODY></HTML>", "window=Centcomm Fax History")
/client/proc/launch_ccia_shuttle()
set name = "Launch CCIA Shuttle"
@@ -39,6 +39,7 @@
name = "Storyteller ([client.ckey])"
SSodyssey.add_storyteller(src)
GLOB.storytellers.add_antagonist(mind)
C.add_storyteller_verbs()
/mob/abstract/ghost/storyteller/ghostize(can_reenter_corpse, should_set_timer)
. = ..()
+12
View File
@@ -131,6 +131,18 @@
if(new_text)
free_space -= length(strip_html_properly(new_text))
/obj/item/paper/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
if (old_name && (icon_state == "paper_plane" || icon_state == "paper_swan"))
. += SPAN_NOTICE("You're going to have to unfold it before you can read it.")
return
if(name != initial(name))
. += "It's titled '[name]'."
if(distance <= 1)
show_content(user)
else
. += SPAN_NOTICE("You have to go closer if you want to read it.")
/obj/item/paper/proc/show_content(mob/user, forceshow)
simple_asset_ensure_is_sent(user, /datum/asset/simple/paper)
var/datum/browser/paper_win = new(user, name, null, 450, 500, null, TRUE)
+63 -64
View File
@@ -153,76 +153,75 @@
set desc = "Call an immediate drop pod on your location."
set name = "Call Drop Pod"
if(!check_rights(R_FUN)) return
if(check_rights(R_FUN) || isstoryteller(usr))
var/client/selected_player
var/mob/living/spawned_mob
var/list/spawned_mobs = list()
var/client/selected_player
var/mob/living/spawned_mob
var/list/spawned_mobs = list()
var/spawn_path = input("Select a mob type.", "Drop Pod Selection", null) as null|anything in typesof(/mob/living)-/mob/living
if(!spawn_path)
return
if(alert("Do you wish the mob to have a player?",,"No","Yes") == "No")
var/spawn_count = input("How many mobs do you wish the pod to contain?", "Drop Pod Selection", null) as num
if(spawn_count <= 0)
return
for(var/i=0;i<spawn_count;i++)
var/mob/living/M = new spawn_path()
M.tag = "awaiting drop"
spawned_mobs |= M
else
var/list/candidates = list()
for(var/client/player in GLOB.clients)
if(player.mob && istype(player.mob, /mob/abstract/ghost/observer))
candidates |= player
if(!candidates.len)
to_chat(usr, "There are no candidates for a drop pod launch.")
var/spawn_path = input("Select a mob type.", "Drop Pod Selection", null) as null|anything in typesof(/mob/living)-/mob/living
if(!spawn_path)
return
// Get a player and a mob type.
selected_player = input("Select a player.", "Drop Pod Selection", null) as null|anything in candidates
if(!selected_player)
if(alert("Do you wish the mob to have a player?",,"No","Yes") == "No")
var/spawn_count = input("How many mobs do you wish the pod to contain?", "Drop Pod Selection", null) as num
if(spawn_count <= 0)
return
for(var/i=0;i<spawn_count;i++)
var/mob/living/M = new spawn_path()
M.tag = "awaiting drop"
spawned_mobs |= M
else
var/list/candidates = list()
for(var/client/player in GLOB.clients)
if(player.mob && istype(player.mob, /mob/abstract/ghost/observer))
candidates |= player
if(!candidates.len)
to_chat(usr, "There are no candidates for a drop pod launch.")
return
// Get a player and a mob type.
selected_player = input("Select a player.", "Drop Pod Selection", null) as null|anything in candidates
if(!selected_player)
return
// Spawn the mob in nullspace for now.
spawned_mob = new spawn_path()
spawned_mob.tag = "awaiting drop"
// Equip them, if they are human and it is desirable.
if(istype(spawned_mob, /mob/living/carbon/human))
var/antag_type = input("Select an equipment template to use or cancel for nude.", null) as null|anything in GLOB.all_antag_types
if(antag_type)
var/datum/antagonist/A = GLOB.all_antag_types[antag_type]
A.equip(spawned_mob)
if(alert("Are you SURE you wish to deploy this drop pod? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") == "No")
if(spawned_mob)
qdel(spawned_mob)
if(spawned_mobs.len)
for(var/mob/living/M in spawned_mobs)
spawned_mobs -= M
M.tag = null
qdel(M)
spawned_mobs.Cut()
return
// Spawn the mob in nullspace for now.
spawned_mob = new spawn_path()
spawned_mob.tag = "awaiting drop"
// Chuck them into the pod.
var/automatic_pod
if(spawned_mob && selected_player)
spawned_mob.ckey = selected_player.mob.ckey
spawned_mobs = list(spawned_mob)
message_admins("[key_name_admin(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])")
else if(spawned_mobs.len)
automatic_pod = 1
message_admins("[key_name_admin(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])")
else
return
// Equip them, if they are human and it is desirable.
if(istype(spawned_mob, /mob/living/carbon/human))
var/antag_type = input("Select an equipment template to use or cancel for nude.", null) as null|anything in GLOB.all_antag_types
if(antag_type)
var/datum/antagonist/A = GLOB.all_antag_types[antag_type]
A.equip(spawned_mob)
if(alert("Are you SURE you wish to deploy this drop pod? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") == "No")
if(spawned_mob)
qdel(spawned_mob)
if(spawned_mobs.len)
for(var/mob/living/M in spawned_mobs)
spawned_mobs -= M
M.tag = null
qdel(M)
spawned_mobs.Cut()
return
// Chuck them into the pod.
var/automatic_pod
if(spawned_mob && selected_player)
spawned_mob.ckey = selected_player.mob.ckey
spawned_mobs = list(spawned_mob)
message_admins("[key_name_admin(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])")
else if(spawned_mobs.len)
automatic_pod = 1
message_admins("[key_name_admin(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])")
else
return
new /datum/random_map/droppod(null, usr.x-1, usr.y-1, usr.z, supplied_drops = spawned_mobs, automated = automatic_pod)
new /datum/random_map/droppod(null, usr.x-1, usr.y-1, usr.z, supplied_drops = spawned_mobs, automated = automatic_pod)
#undef SD_FLOOR_TILE
+50 -51
View File
@@ -37,57 +37,56 @@
set desc = "Call an immediate supply drop on your location."
set name = "Call Supply Drop"
if(!check_rights(R_FUN)) return
if(check_rights(R_FUN) || isstoryteller(usr))
var/chosen_loot_type
var/list/chosen_loot_types
var/choice = alert("Do you wish to supply a custom loot list?",,"No","Yes")
if(choice == "Yes")
chosen_loot_types = list()
var/chosen_loot_type
var/list/chosen_loot_types
var/choice = alert("Do you wish to supply a custom loot list?",,"No","Yes")
if(choice == "Yes")
chosen_loot_types = list()
choice = alert("Do you wish to add mobs?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/mob/living)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add structures or machines?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj) - typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add any non-weapon items?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item) - typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add mobs?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/mob/living)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add structures or machines?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj) - typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add any non-weapon items?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item) - typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add weapons?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add ABSOLUTELY ANYTHING ELSE? (you really shouldn't need to)",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/atom/movable)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
else
choice = alert("Do you wish to specify a loot type?",,"No","Yes")
if(choice == "Yes")
chosen_loot_type = input("Select a loot type.", "Loot Selection", null) as null|anything in supply_drop_random_loot_types()
choice = alert("Do you wish to add weapons?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add ABSOLUTELY ANYTHING ELSE? (you really shouldn't need to)",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/atom/movable)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
else
choice = alert("Do you wish to specify a loot type?",,"No","Yes")
if(choice == "Yes")
chosen_loot_type = input("Select a loot type.", "Loot Selection", null) as null|anything in supply_drop_random_loot_types()
choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes")
if(choice == "No")
return
log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])")
new /datum/random_map/droppod/supply(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_drop = chosen_loot_type)
choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes")
if(choice == "No")
return
log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])")
new /datum/random_map/droppod/supply(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_drop = chosen_loot_type)
@@ -0,0 +1,58 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# - (fixes bugs)
# wip
# - (work in progress)
# qol
# - (quality of life)
# soundadd
# - (adds a sound)
# sounddel
# - (removes a sound)
# rscadd
# - (adds a feature)
# rscdel
# - (removes a feature)
# imageadd
# - (adds an image or sprite)
# imagedel
# - (removes an image or sprite)
# spellcheck
# - (fixes spelling or grammar)
# experiment
# - (experimental change)
# balance
# - (balance changes)
# code_imp
# - (misc internal code change)
# refactor
# - (refactors code)
# config
# - (makes a change to the config files)
# admin
# - (makes changes to administrator tools)
# server
# - (miscellaneous changes to server)
#################################
# Your name.
author: Batrachophrenoboocosmomachia
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
- rscadd: "Grants Odyssey Storytellers access to 22 different moderator/admin/debug commands to make their lives easier."