diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm
index 4723577fad..90864cf359 100644
--- a/code/__HELPERS/icons.dm
+++ b/code/__HELPERS/icons.dm
@@ -1186,6 +1186,8 @@ GLOBAL_DATUM_INIT(dummySave, /savefile, new("tmp/dummySave.sav")) //Cache of ico
SSassets.transport.register_asset(key, I)
for (var/thing2 in targets)
SSassets.transport.send_assets(thing2, key)
+ if(sourceonly)
+ return SSassets.transport.get_asset_url(key)
return ""
diff --git a/code/controllers/subsystem/dcs.dm b/code/controllers/subsystem/dcs.dm
index 3243a8d8c8..6be5a4bdfa 100644
--- a/code/controllers/subsystem/dcs.dm
+++ b/code/controllers/subsystem/dcs.dm
@@ -1,6 +1,7 @@
PROCESSING_SUBSYSTEM_DEF(dcs)
name = "Datum Component System"
flags = SS_NO_INIT
+ wait = 1 SECONDS
var/list/elements_by_type = list()
diff --git a/code/controllers/subsystem/economy.dm b/code/controllers/subsystem/economy.dm
index 078d122aa6..47b00d1125 100644
--- a/code/controllers/subsystem/economy.dm
+++ b/code/controllers/subsystem/economy.dm
@@ -60,9 +60,9 @@ SUBSYSTEM_DEF(economy)
secmedsrv_payout() // Payout based on crew safety, health, and mood.
civ_payout() // Payout based on ??? Profit
car_payout() // Cargo's natural gain in the cash moneys.
- for(var/A in bank_accounts)
- var/datum/bank_account/B = A
- B.payday(1)
+ for(var/account in bank_accounts)
+ var/datum/bank_account/bank_account = account
+ bank_account.payday(1)
/datum/controller/subsystem/economy/proc/get_dep_account(dep_id)
diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm
index 2e4e728191..9bc8a631c1 100644
--- a/code/controllers/subsystem/events.dm
+++ b/code/controllers/subsystem/events.dm
@@ -100,7 +100,7 @@ SUBSYSTEM_DEF(events)
// REEEEEEEEE
/client/proc/forceEvent()
set name = "Trigger Event"
- set category = "Fun"
+ set category = "Admin.Events"
if(!holder ||!check_rights(R_FUN))
return
diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm
index 617004646a..2ea3b29c91 100644
--- a/code/controllers/subsystem/mapping.dm
+++ b/code/controllers/subsystem/mapping.dm
@@ -447,7 +447,7 @@ GLOBAL_LIST_EMPTY(the_station_areas)
//Manual loading of away missions.
/client/proc/admin_away()
set name = "Load Away Mission / Virtual Reality"
- set category = "Fun"
+ set category = "Admin.Events"
if(!holder ||!check_rights(R_FUN))
return
diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm
index cf7d4ba533..161fd92f77 100644
--- a/code/controllers/subsystem/statpanel.dm
+++ b/code/controllers/subsystem/statpanel.dm
@@ -27,28 +27,6 @@ SUBSYSTEM_DEF(statpanels)
var/ETA = SSshuttle.emergency.getModeStr()
if(ETA)
global_data += "[ETA] [SSshuttle.emergency.getTimerStr()]"
-/* Please fix
- if(SSvote.mode)
- var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING)
- global_data += "Vote active!, There is currently a vote running. Question: [SSvote.question]"
- if(!(SSvote.vote_system in supported))
- global_data += ", The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link."
- return
- global_data += "Time Left:, [round(SSvote.end_time - world.time)] seconds"
-
- global_data += "Choices:"
- for(var/i in 1 to SSvote.choice_statclicks.len)
- var/choice = SSvote.choice_statclicks[i]
- var/ivotedforthis = FALSE
- if(usr.ckey)
- switch(SSvote.vote_system)
- if(APPROVAL_VOTING)
- ivotedforthis = SSvote.voted[usr.ckey] && (i in SSvote.voted[usr.ckey])
- if(PLURALITY_VOTING)
- ivotedforthis = SSvote.voted[usr.ckey] == i
-
- global_data += (ivotedforthis? "\[X\]" : "\[ \]", SSvote.choice_statclicks[choice])
-*/
encoded_global_data = url_encode(json_encode(global_data))
src.currentrun = GLOB.clients.Copy()
@@ -63,6 +41,31 @@ SUBSYSTEM_DEF(statpanels)
var/ping_str = url_encode("Ping: [round(target.lastping, 1)]ms (Average: [round(target.avgping, 1)]ms)")
var/other_str = url_encode(json_encode(target.mob.get_status_tab_items()))
target << output("[encoded_global_data];[ping_str];[other_str]", "statbrowser:update")
+ if(SSvote.mode)
+ var/list/vote_arry = list(
+ list("Vote active!", "There is currently a vote running. Question: [SSvote.question]")
+ ) //see the MC on how this works.
+ if(!(SSvote.vote_system in list(PLURALITY_VOTING, APPROVAL_VOTING)))
+ vote_arry[++vote_arry.len] += list("STATPANEL VOTING DISABLED!", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.", "disabled")
+ //does not return.
+ else
+ vote_arry[++vote_arry.len] += list("Time Left:", " [round(SSvote.end_time - world.time)] seconds")
+ vote_arry[++vote_arry.len] += list("Choices:", "")
+ for(var/choice in SSvote.choice_statclicks)
+ var/choice_id = SSvote.choice_statclicks[choice]
+ var/ivotedforthis = FALSE
+ if(target.ckey)
+ switch(SSvote.vote_system)
+ if(APPROVAL_VOTING)
+ ivotedforthis = SSvote.voted[target.ckey] && (text2num(choice_id) in SSvote.voted[usr.ckey])
+ if(PLURALITY_VOTING)
+ ivotedforthis = (SSvote.voted[target.ckey] == text2num(choice_id))
+ vote_arry[++vote_arry.len] += list(ivotedforthis ? "\[X\]" : "\[ \]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1")
+ var/vote_str = url_encode(json_encode(vote_arry))
+ target << output("[vote_str]", "statbrowser:update_voting")
+ else
+ var/null_bullet = url_encode(json_encode(list(list(null))))
+ target << output("[null_bullet]", "statbrowser:update_voting")
if(!target.holder)
target << output("", "statbrowser:remove_admin_tabs")
else
diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm
index a93aff7d2b..06b76718c1 100644
--- a/code/controllers/subsystem/vote.dm
+++ b/code/controllers/subsystem/vote.dm
@@ -16,6 +16,7 @@ SUBSYSTEM_DEF(vote)
var/question = null
var/list/choices = list()
/// List of choice = object for statclick objects for statpanel voting
+ /// statclick rework? 2: list("name"="id")
var/list/choice_statclicks = list()
var/list/scores = list()
var/list/choice_descs = list() // optional descriptions
@@ -49,34 +50,6 @@ SUBSYSTEM_DEF(vote)
client_popup.open(0)
next_pop = world.time+VOTE_COOLDOWN
-/**
- * Renders a statpanel. Directly uses statpanel/stat calls since this is called from base of mob/Stat().
- */
-/datum/controller/subsystem/vote/proc/render_statpanel(mob/M)
- if(!mode) // check if vote is running
- return
- if(!statpanel("Status")) // don't bother if they're not focused on this panel
- return
- var/static/list/supported = list(PLURALITY_VOTING, APPROVAL_VOTING)
- stat("Vote active!", "There is currently a vote running. Question: [question]")
- if(!(vote_system in supported))
- stat("", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.")
- return
- stat("Time Left:", "[round(end_time - world.time)] seconds")
- stat(null, null)
- stat("Choices:", null)
- stat(null, null)
- for(var/i in 1 to choice_statclicks.len)
- var/choice = choice_statclicks[i]
- var/ivotedforthis = FALSE
- switch(vote_system)
- if(APPROVAL_VOTING)
- ivotedforthis = voted[usr.ckey] && (i in voted[usr.ckey])
- if(PLURALITY_VOTING)
- ivotedforthis = voted[usr.ckey] == i
- stat(ivotedforthis? "\[X\]" : "\[ \]", choice_statclicks[choice])
- stat(null, null)
-
/datum/controller/subsystem/vote/proc/reset()
initiator = null
end_time = 0
@@ -87,26 +60,10 @@ SUBSYSTEM_DEF(vote)
voted.Cut()
voting.Cut()
scores.Cut()
- cleanup_statclicks()
+ choice_statclicks = list()
display_votes = initial(display_votes) //CIT CHANGE - obfuscated votes
remove_action_buttons()
-/datum/controller/subsystem/vote/proc/cleanup_statclicks()
- for(var/choice in choice_statclicks)
- qdel(choice_statclicks[choice])
- choice_statclicks = list()
-
-/obj/effect/statclick/vote
- name = "ERROR"
- var/choice
-
-/obj/effect/statclick/vote/Click()
- SSvote.submit_vote(choice)
-
-/obj/effect/statclick/vote/New(loc, choice, name)
- src.choice = choice
- src.name = name
-
/datum/controller/subsystem/vote/proc/get_result()
//get the highest number of votes
var/greatest_votes = 0
@@ -582,10 +539,10 @@ SUBSYSTEM_DEF(vote)
to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.")
end_time = started_time+vp
// generate statclick list
- cleanup_statclicks()
+ choice_statclicks = list()
for(var/i in 1 to choices.len)
var/choice = choices[i]
- choice_statclicks[choice] = new /obj/effect/statclick/vote(null, i, choice)
+ choice_statclicks[choice] = "[i]"
//
for(var/c in GLOB.clients)
SEND_SOUND(c, sound('sound/misc/server-ready.ogg'))
@@ -785,7 +742,8 @@ SUBSYSTEM_DEF(vote)
submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"])))
else
submit_vote(round(text2num(href_list["vote"])))
- usr.vote()
+ if(!href_list["statpannel"])
+ usr.vote()
/datum/controller/subsystem/vote/proc/remove_action_buttons()
for(var/v in generated_actions)
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 8421d9955d..4fb5a89891 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -12,7 +12,7 @@
///////////////////////////////////////////////////////////////////////////////////////////////Panels
/datum/admins/proc/show_player_panel(mob/M in GLOB.mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Show Player Panel"
set desc="Edit player (respawn, ban, heal, etc)"
@@ -211,7 +211,7 @@
/datum/admins/proc/access_news_network() //MARKER
- set category = "Fun"
+ set category = "Admin.Events"
set name = "Access Newscaster Network"
set desc = "Allows you to view, add and edit news feeds."
diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm
index 7e5c104d90..52be445120 100644
--- a/code/modules/admin/admin_investigate.dm
+++ b/code/modules/admin/admin_investigate.dm
@@ -6,7 +6,7 @@
/client/proc/investigate_show()
set name = "Investigate"
- set category = "Admin"
+ set category = "Admin.Game"
if(!holder)
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 2c4e7b4f6e..52b4fa05b1 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -348,7 +348,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
/client/proc/admin_ghost()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Aghost"
if(!holder)
return FALSE
@@ -379,7 +379,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
/client/proc/invisimin()
set name = "Invisimin"
- set category = "Admin"
+ set category = "Admin.Game"
set desc = "Toggles ghost-like invisibility (Don't abuse this)"
if(holder && mob)
if(mob.invisibility == INVISIBILITY_OBSERVER)
@@ -391,7 +391,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
/client/proc/check_antagonists()
set name = "Check Antagonists"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
holder.check_antagonists()
log_admin("[key_name(usr)] checked antagonists.") //for tsar~
@@ -411,14 +411,14 @@ GLOBAL_PROTECT(admin_verbs_hideable)
/client/proc/game_panel()
set name = "Game Panel"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
holder.Game()
SSblackbox.record_feedback("tally", "admin_verb", 1, "Game Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/secrets()
set name = "Secrets"
- set category = "Admin"
+ set category = "Admin.Game"
if (holder)
holder.Secrets()
SSblackbox.record_feedback("tally", "admin_verb", 1, "Secrets Panel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -472,7 +472,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/drop_bomb()
- set category = "Special Verbs"
+ set category = "Admin.Fun"
set name = "Drop Bomb"
set desc = "Cause an explosion of varying strength at your location."
@@ -514,7 +514,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/drop_dynex_bomb()
- set category = "Special Verbs"
+ set category = "Admin.Fun"
set name = "Drop DynEx Bomb"
set desc = "Cause an explosion of varying strength at your location."
@@ -561,7 +561,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
message_admins("[key_name_admin(usr)] has modified Dynamic Explosion Scale: [ex_scale]")
/client/proc/give_spell(mob/T in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Give Spell"
set desc = "Gives a spell to a mob."
@@ -585,7 +585,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!")
/client/proc/remove_spell(mob/T in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Remove Spell"
set desc = "Remove a spell from the selected mob."
@@ -598,7 +598,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/give_disease(mob/living/T in GLOB.mob_living_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Give Disease"
set desc = "Gives a Disease to a mob."
if(!istype(T))
@@ -613,7 +613,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
message_admins("[key_name_admin(usr)] gave [key_name(T)] the disease [D].")
/client/proc/object_say(obj/O in world)
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "OSay"
set desc = "Makes an object say something."
var/message = input(usr, "What do you want the message to be?", "Make Sound") as text | null
@@ -625,7 +625,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/togglebuildmodeself()
set name = "Toggle Build Mode Self"
- set category = "Special Verbs"
+ set category = "Admin.Events"
if (!(holder.rank.rights & R_BUILDMODE))
return
if(src.mob)
@@ -634,7 +634,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
/client/proc/check_ai_laws()
set name = "Check AI Laws"
- set category = "Admin"
+ set category = "Admin.Game"
if(holder)
src.holder.output_ai_laws()
@@ -717,7 +717,7 @@ GLOBAL_PROTECT(admin_verbs_hideable)
/client/proc/toggle_AI_interact()
set name = "Toggle Admin AI Interact"
- set category = "Admin"
+ set category = "Admin.Game"
set desc = "Allows you to interact with most machines as an AI would as a ghost"
AI_Interact = !AI_Interact
diff --git a/code/modules/admin/adminmenu.dm b/code/modules/admin/adminmenu.dm
index 64ce5987cf..b7d85ccff5 100644
--- a/code/modules/admin/adminmenu.dm
+++ b/code/modules/admin/adminmenu.dm
@@ -5,7 +5,7 @@
/datum/verbs/menu/Admin/verb/playerpanel()
set name = "Player Panel"
set desc = "Player Panel"
- set category = "Admin"
+ set category = "Admin.Game"
if(usr.client.holder)
usr.client.holder.player_panel_new()
SSblackbox.record_feedback("tally", "admin_verb", 1, "Player Panel New") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm
index 257c1d275a..ef56b4cd2a 100644
--- a/code/modules/admin/verbs/adminjump.dm
+++ b/code/modules/admin/verbs/adminjump.dm
@@ -1,7 +1,7 @@
/client/proc/jumptoarea(area/A in GLOB.sortedAreas)
set name = "Jump to Area"
set desc = "Area to jump to"
- set category = "Admin"
+ set category = "Admin.Game"
if(!src.holder)
to_chat(src, "Only administrators may use this command.", confidential = TRUE)
return
@@ -28,7 +28,7 @@
/client/proc/jumptoturf(turf/T in world)
set name = "Jump to Turf"
- set category = "Admin"
+ set category = "Admin.Game"
if(!src.holder)
to_chat(src, "Only administrators may use this command.", confidential = TRUE)
return
@@ -40,7 +40,7 @@
return
/client/proc/jumptomob(mob/M in GLOB.mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Jump to Mob"
if(!src.holder)
@@ -59,7 +59,7 @@
to_chat(A, "This mob is not located in the game world.", confidential = TRUE)
/client/proc/jumptocoord(tx as num, ty as num, tz as num)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Jump to Coordinate"
if (!holder)
@@ -74,7 +74,7 @@
message_admins("[key_name_admin(usr)] jumped to coordinates [tx], [ty], [tz]")
/client/proc/jumptokey()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Jump to Key"
if(!src.holder)
@@ -97,7 +97,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Jump To Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/Getmob(mob/M in GLOB.mob_list - GLOB.dummy_mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Get Mob"
set desc = "Mob to teleport"
if(!src.holder)
@@ -113,7 +113,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Mob") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/Getkey()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Get Key"
set desc = "Key to teleport"
@@ -141,7 +141,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Get Key") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/sendmob(mob/M in sortmobs())
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Send Mob"
if(!src.holder)
to_chat(src, "Only administrators may use this command.", confidential = TRUE)
diff --git a/code/modules/admin/verbs/borgpanel.dm b/code/modules/admin/verbs/borgpanel.dm
index be22c889f0..4b60ecc0ff 100644
--- a/code/modules/admin/verbs/borgpanel.dm
+++ b/code/modules/admin/verbs/borgpanel.dm
@@ -1,5 +1,5 @@
/datum/admins/proc/open_borgopanel(borgo in GLOB.silicon_mobs)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Show Borg Panel"
set desc = "Show borg panel"
diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm
index 9b27a8d8e9..123e9877f7 100644
--- a/code/modules/admin/verbs/cinematic.dm
+++ b/code/modules/admin/verbs/cinematic.dm
@@ -1,6 +1,6 @@
/client/proc/cinematic()
set name = "cinematic"
- set category = "Fun"
+ set category = "Admin.Fun"
set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted.
set hidden = 1
if(!SSticker)
diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm
index 66acc0f667..e3937e19b6 100644
--- a/code/modules/admin/verbs/deadsay.dm
+++ b/code/modules/admin/verbs/deadsay.dm
@@ -1,5 +1,5 @@
/client/proc/dsay(msg as text)
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Dsay"
set hidden = 1
if(!holder)
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index f068f05a4a..5704448053 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -27,7 +27,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make Robot"
if(!SSticker.HasRoundStarted())
@@ -43,7 +43,7 @@
alert("Invalid mob")
/client/proc/cmd_admin_blobize(mob/M in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make Blob"
if(!SSticker.HasRoundStarted())
@@ -58,7 +58,7 @@
/client/proc/cmd_admin_animalize(mob/M in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make Simple Animal"
if(!SSticker.HasRoundStarted())
@@ -79,7 +79,7 @@
/client/proc/makepAI(turf/T in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make pAI"
set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI"
@@ -106,7 +106,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make Alien"
if(!SSticker.HasRoundStarted())
@@ -121,7 +121,7 @@
alert("Invalid mob")
/client/proc/cmd_admin_slimeize(mob/M in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make slime"
if(!SSticker.HasRoundStarted())
@@ -211,7 +211,7 @@
message_admins("[key_name_admin(usr)] has granted [M.key] full access.")
/client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list)
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Assume direct control"
set desc = "Direct intervention"
@@ -229,6 +229,33 @@
qdel(adminmob)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list)
+ set category = "Admin.Game"
+ set name = "Give direct control"
+
+ if(!M)
+ return
+ if(M.ckey)
+ if(alert("This mob is being controlled by [M.key]. Are you sure you wish to give someone else control of it? [M.key] will be made a ghost.",,"Yes","No") != "Yes")
+ return
+ var/client/newkey = input(src, "Pick the player to put in control.", "New player") as null|anything in sortList(GLOB.clients)
+ var/mob/oldmob = newkey.mob
+ var/delmob = FALSE
+ if((isobserver(oldmob) || alert("Do you want to delete [newkey]'s old mob?","Delete?","Yes","No") != "No"))
+ delmob = TRUE
+ if(!M || QDELETED(M))
+ to_chat(usr, "The target mob no longer exists, aborting.")
+ return
+ if(M.ckey)
+ M.ghostize(FALSE)
+ M.ckey = newkey.key
+ M.client?.init_verbs()
+ if(delmob)
+ qdel(oldmob)
+ message_admins("[key_name_admin(usr)] gave away direct control of [M] to [newkey].")
+ log_admin("[key_name(usr)] gave away direct control of [M] to [newkey].")
+ SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/client/proc/cmd_admin_test_atmos_controllers()
set category = "Mapping"
set name = "Test Atmos Monitoring Consoles"
@@ -455,7 +482,7 @@
cmd_admin_areatest(FALSE)
/client/proc/cmd_admin_dress(mob/M in GLOB.mob_list)
- set category = "Fun"
+ set category = "Admin.Events"
set name = "Select equipment"
if(!(ishuman(M) || isobserver(M)))
alert("Invalid mob")
diff --git a/code/modules/admin/verbs/dice.dm b/code/modules/admin/verbs/dice.dm
index 5b0a15257e..f033351f96 100644
--- a/code/modules/admin/verbs/dice.dm
+++ b/code/modules/admin/verbs/dice.dm
@@ -1,5 +1,5 @@
/client/proc/roll_dices()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Roll Dice"
if(!check_rights(R_FUN))
return
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index 7675f858ee..2379ee22bc 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -1,7 +1,7 @@
/client/proc/one_click_antag()
set name = "Create Antagonist"
set desc = "Auto-create an antagonist of your choice"
- set category = "Admin"
+ set category = "Admin.Events"
if(holder)
holder.one_click_antag()
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index fc2ba55f54..6e188a6c7a 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -1,5 +1,5 @@
/client/proc/play_sound(S as sound)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Play Global Sound"
if(!check_rights(R_SOUNDS))
return
@@ -42,7 +42,7 @@
/client/proc/play_local_sound(S as sound)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Play Local Sound"
if(!check_rights(R_SOUNDS))
return
@@ -53,7 +53,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/play_web_sound()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Play Internet Sound"
if(!check_rights(R_SOUNDS))
return
@@ -136,7 +136,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound")
/client/proc/manual_play_web_sound()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Manual Play Internet Sound"
if(!check_rights(R_SOUNDS))
return
@@ -182,7 +182,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Manual Play Internet Sound")
/client/proc/set_round_end_sound(S as sound)
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Set Round End Sound"
if(!check_rights(R_SOUNDS))
return
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 13f91ff79f..a657d37693 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -20,7 +20,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Subtle Message"
if(!ismob(M))
@@ -46,7 +46,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_headset_message(mob/M in GLOB.mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Headset Message"
admin_headset_message(M)
@@ -128,7 +128,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Modify Antagonist Reputation") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_world_narrate()
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Global Narrate"
if(!check_rights(R_ADMIN))
@@ -144,7 +144,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_direct_narrate(mob/M)
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Direct Narrate"
if(!check_rights(R_ADMIN))
@@ -169,7 +169,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_local_narrate(atom/A)
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Local Narrate"
if(!check_rights(R_ADMIN))
@@ -190,7 +190,7 @@
SSblackbox.record_feedback("tally", "admin_verb", 1, "Local Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_godmode(mob/M in GLOB.mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Godmode"
if(!check_rights(R_ADMIN))
return
@@ -335,7 +335,7 @@ Works kind of like entering the game with a new character. Character receives a
Traitors and the like can also be revived with the previous role mostly intact.
/N */
/client/proc/respawn_character()
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Respawn Character"
set desc = "Respawn a person that has been gibbed/dusted/killed. They must be a ghost for this to work and preferably should not have a body to go back into."
if(!check_rights(R_ADMIN))
@@ -503,7 +503,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return new_character
/client/proc/cmd_admin_add_freeform_ai_law()
- set category = "Fun"
+ set category = "Admin.Events"
set name = "Add Custom AI law"
if(!check_rights(R_ADMIN))
@@ -546,7 +546,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
SSblackbox.record_feedback("tally", "admin_verb", 1, "Rejuvinate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_create_centcom_report()
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Create Command Report"
if(!check_rights(R_ADMIN))
@@ -572,7 +572,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_change_command_name()
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Change Command Name"
if(!check_rights(R_ADMIN))
@@ -595,7 +595,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
admin_delete(A)
/client/proc/cmd_admin_list_open_jobs()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Manage Job Slots"
if(!check_rights(R_ADMIN))
@@ -604,7 +604,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
SSblackbox.record_feedback("tally", "admin_verb", 1, "Manage Job Slots") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
- set category = "Special Verbs"
+ set category = "Admin.Fun"
set name = "Explosion"
if(!check_rights(R_ADMIN))
@@ -640,7 +640,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world)
- set category = "Special Verbs"
+ set category = "Admin.Fun"
set name = "EM Pulse"
if(!check_rights(R_ADMIN))
@@ -656,7 +656,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
SSblackbox.record_feedback("tally", "admin_verb", 1, "EM Pulse") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_gib(mob/M in GLOB.mob_list)
- set category = "Special Verbs"
+ set category = "Admin.Fun"
set name = "Gib"
if(!check_rights(R_ADMIN))
@@ -683,7 +683,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/cmd_admin_gib_self()
set name = "Gibself"
- set category = "Fun"
+ set category = "Admin.Fun"
var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No")
if(confirm == "Yes")
@@ -702,7 +702,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
SSblackbox.record_feedback("tally", "admin_verb", 1, "Check Contents") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_view_range()
- set category = "Special Verbs"
+ set category = "Admin.Game"
set name = "Change View Range"
set desc = "switches between 1x and custom views"
@@ -717,8 +717,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Change View Range", "[view]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/admin_call_shuttle()
-
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Call Shuttle"
if(EMERGENCY_AT_LEAST_DOCKED)
@@ -738,7 +737,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
return
/client/proc/admin_cancel_shuttle()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Cancel Shuttle"
if(!check_rights(0))
return
@@ -754,9 +753,51 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.")
return
+/*
+/client/proc/admin_disable_shuttle()
+ set category = "Admin.Events"
+ set name = "Disable Shuttle"
+ if(!check_rights(R_ADMIN))
+ return
+ if(SSshuttle.emergency.mode == SHUTTLE_DISABLED)
+ to_chat(usr, "Error, shuttle is already disabled.")
+ return
+ if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes")
+ return
+ message_admins("[key_name_admin(usr)] disabled the shuttle.")
+ SSshuttle.lastMode = SSshuttle.emergency.mode
+ SSshuttle.lastCallTime = SSshuttle.emergency.timeLeft(1)
+ SSshuttle.adminEmergencyNoRecall = TRUE
+ SSshuttle.emergency.setTimer(0)
+ SSshuttle.emergency.mode = SHUTTLE_DISABLED
+ priority_announce("Warning: Emergency Shuttle uplink failure, shuttle disabled until further notice.", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg')
+
+/client/proc/admin_enable_shuttle()
+ set category = "Admin - Events"
+ set category = "Admin.Events"
+ set name = "Enable Shuttle"
+
+ if(!check_rights(R_ADMIN))
+ return
+ if(SSshuttle.emergency.mode != SHUTTLE_DISABLED)
+ to_chat(usr, "Error, shuttle not disabled.")
+ return
+ if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes")
+ return
+ message_admins("[key_name_admin(usr)] enabled the emergency shuttle.")
+ SSshuttle.adminEmergencyNoRecall = FALSE
+ SSshuttle.emergencyNoRecall = FALSE
+ if(SSshuttle.lastMode == SHUTTLE_DISABLED) //If everything goes to shit, fix it.
+ SSshuttle.lastMode = SHUTTLE_IDLE
+ SSshuttle.emergency.mode = SSshuttle.lastMode
+ if(SSshuttle.lastCallTime < 10 SECONDS && SSshuttle.lastMode != SHUTTLE_IDLE)
+ SSshuttle.lastCallTime = 10 SECONDS //Make sure no insta departures.
+ SSshuttle.emergency.setTimer(SSshuttle.lastCallTime)
+ priority_announce("Warning: Emergency Shuttle uplink reestablished, shuttle enabled.", "Emergency Shuttle Uplink Alert", 'sound/misc/announce_dig.ogg')
+*/
/client/proc/everyone_random()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Make Everyone Random"
set desc = "Make everyone have a random appearance. You can only use this before rounds!"
@@ -804,7 +845,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/admin_change_sec_level()
- set category = "Special Verbs"
+ set category = "Admin.Events"
set name = "Set Security Level"
set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke"
@@ -821,7 +862,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
/client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list)
set name = "Toggle Nuke"
- set category = "Fun"
+ set category = "Admin.Events"
set popup_menu = 0
if(!check_rights(R_DEBUG))
return
@@ -1016,7 +1057,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
usr << browse(dat, "window=dressup;size=550x600")
/client/proc/toggle_combo_hud()
- set category = "Admin"
+ set category = "Admin.Game"
set name = "Toggle Combo HUD"
set desc = "Toggles the Admin Combo HUD (antag, sci, med, eng)"
@@ -1051,7 +1092,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/client/proc/run_weather()
- set category = "Fun"
+ set category = "Admin.Events"
set name = "Run Weather"
set desc = "Triggers a weather on the z-level you choose."
@@ -1075,7 +1116,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
SSblackbox.record_feedback("tally", "admin_verb", 1, "Run Weather")
/client/proc/mass_zombie_infection()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Mass Zombie Infection"
set desc = "Infects all humans with a latent organ that will zombify \
them on death."
@@ -1095,7 +1136,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Infection")
/client/proc/mass_zombie_cure()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Mass Zombie Cure"
set desc = "Removes the zombie infection from all humans, returning them to normal."
if(!check_rights(R_ADMIN))
@@ -1113,7 +1154,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Cure")
/client/proc/polymorph_all()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Polymorph All"
set desc = "Applies the effects of the bolt of change to every single mob."
@@ -1203,7 +1244,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Toggled Hub Visibility", "[GLOB.hub_visibility ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_toggle_fov()
- set category = "Fun"
+ set category = "Admin.Fun"
set name = "Enable/Disable Field of Vision"
var/static/busy_toggling_fov = FALSE
@@ -1256,7 +1297,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
/client/proc/smite(mob/living/carbon/human/target as mob)
set name = "Smite"
- set category = "Fun"
+ set category = "Admin.Fun"
if(!check_rights(R_ADMIN) || !check_rights(R_FUN))
return
diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm
index a80eafae02..7552936136 100644
--- a/code/modules/admin/verbs/shuttlepanel.dm
+++ b/code/modules/admin/verbs/shuttlepanel.dm
@@ -1,5 +1,5 @@
/datum/admins/proc/open_shuttlepanel()
- set category = "Admin"
+ set category = "Admin.Events"
set name = "Shuttle Manipulator"
set desc = "Opens the shuttle manipulator UI."
diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm
index 7742d6ea66..fc4270dd1b 100644
--- a/code/modules/admin/verbs/tripAI.dm
+++ b/code/modules/admin/verbs/tripAI.dm
@@ -1,5 +1,5 @@
/client/proc/triple_ai()
- set category = "Fun"
+ set category = "Admin.Events"
set name = "Create AI Triumvirate"
if(SSticker.current_state > GAME_STATE_PREGAME)
diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm
index b7eac1e591..354df5f592 100644
--- a/code/modules/cargo/centcom_podlauncher.dm
+++ b/code/modules/cargo/centcom_podlauncher.dm
@@ -12,7 +12,7 @@
/client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui
set name = "Config/Launch Supplypod"
set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!"
- set category = "Admin"
+ set category = "Admin.Events"
var/datum/centcom_podlauncher/plaunch = new(usr)//create the datum
plaunch.ui_interact(usr)//datum has a tgui component, here we open the window
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index e16a491c61..a019ade471 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -386,7 +386,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
//Admin Preferences
/client/proc/toggleadminhelpsound()
set name = "Hear/Silence Adminhelps"
- set category = "Preferences"
+ set category = "Preferences.Admin"
set desc = "Toggle hearing a notification when admin PMs are received"
if(!holder)
return
@@ -397,7 +397,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggleannouncelogin()
set name = "Do/Don't Announce Login"
- set category = "Preferences"
+ set category = "Preferences.Admin"
set desc = "Toggle if you want an announcement to admins when you login during a round"
if(!holder)
return
@@ -408,7 +408,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggle_hear_radio()
set name = "Show/Hide Radio Chatter"
- set category = "Preferences"
+ set category = "Preferences.Admin"
set desc = "Toggle seeing radiochatter from nearby radios and speakers"
if(!holder)
return
@@ -419,7 +419,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/deadchat()
set name = "Show/Hide Deadchat"
- set category = "Preferences"
+ set category = "Preferences.Admin"
set desc ="Toggles seeing deadchat"
prefs.chat_toggles ^= CHAT_DEAD
prefs.save_preferences()
@@ -428,7 +428,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS
/client/proc/toggleprayers()
set name = "Show/Hide Prayers"
- set category = "Preferences"
+ set category = "Preferences.Admin"
set desc = "Toggles seeing prayers"
prefs.chat_toggles ^= CHAT_PRAYER
prefs.save_preferences()
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index dd1ebd74f9..5a8325fd64 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -111,16 +111,16 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
/client/proc/set_ooc(newColor as color)
set name = "Set Player OOC Color"
set desc = "Modifies player OOC Color"
- set category = "Fun"
+ set category = "Admin.Fun"
GLOB.OOC_COLOR = sanitize_ooccolor(newColor)
/client/proc/reset_ooc()
set name = "Reset Player OOC Color"
set desc = "Returns player OOC Color to default"
- set category = "Fun"
+ set category = "Admin.Fun"
GLOB.OOC_COLOR = null
-/client/verb/colorooc()
+/client/verb/colorooc() //this is admin and people who bought byond.
set name = "Set Your OOC Color"
set category = "Preferences"
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index e6fd991169..51e94afb3c 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -50,7 +50,7 @@
plantname = "Fairygrass"
product = /obj/item/reagent_containers/food/snacks/grown/grass/fairy
icon_grow = "fairygrass-grow"
- icon_dead = "fairygrass-dead"
+ icon_dead = "grass-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/glow/blue)
mutatelist = list (/obj/item/seeds/grass/carpet)
reagents_add = list(/datum/reagent/consumable/nutriment = 0.02, /datum/reagent/hydrogen = 0.05, /datum/reagent/drug/space_drugs = 0.15)
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 80ba6b7375..e6d2484632 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -193,6 +193,8 @@
growthstages = 3
genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism)
growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi'
+ icon_grow = "chanter-grow"
+ icon_dead = "chanter-dead"
reagents_add = list(/datum/reagent/consumable/nutriment = 0.1)
mutatelist = list(/obj/item/seeds/chanterelle/jupitercup)
diff --git a/html/changelogs/AutoChangeLog-pr-13518.yml b/html/changelogs/AutoChangeLog-pr-13518.yml
new file mode 100644
index 0000000000..565754f48b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-13518.yml
@@ -0,0 +1,4 @@
+author: "TheObserver-sys"
+delete-after: True
+changes:
+ - bugfix: "Drake? Where's the dead fairygrass sprite?"
diff --git a/html/statbrowser.html b/html/statbrowser.html
index fbdbb61449..0920081fd2 100644
--- a/html/statbrowser.html
+++ b/html/statbrowser.html
@@ -7,149 +7,172 @@
@@ -267,9 +290,10 @@ if (window.location) {
}); */
// Status panel implementation ------------------------------------------------
-var status_tab_parts = ["loading..."];
+var status_tab_parts = ["Loading..."];
var current_tab = null;
-var mc_tab_parts = [["loading...", ""]];
+var mc_tab_parts = [["Loading...", ""]];
+var vote_parts = [[null]];
var href_token = null;
var spells = [];
var spell_tabs = [];
@@ -288,6 +312,8 @@ var statcontentdiv = document.querySelector('#statcontent');
var storedimages = [];
function createStatusTab(name) {
+ if (name.indexOf(".") != -1)
+ name = name.split(".")[0];
if(document.getElementById(name) || name.trim() == "")
return;
if(!verb_tabs.includes(name) && !permanent_tabs.includes(name))
@@ -302,12 +328,8 @@ function createStatusTab(name) {
B.className = "button";
//ORDERING ALPHABETICALLY
B.style.order = name.charCodeAt(0);
- if(name == "Status" || name == "MC") {
- if(name == "Status")
- B.style.order = 1;
- else
- B.style.order = 2;
- }
+ if(name == "Status" || name == "MC")
+ B.style.order = name == "Status" ? 1 : 2;
//END ORDERING
menu.appendChild(B);
SendTabToByond(name);
@@ -327,6 +349,19 @@ function removeStatusTab(name) {
under_menu.style.height = menu.clientHeight + 'px';
}
+function sortVerbs() {
+ verbs.sort(function (a, b) {
+ var selector = a[0] == b[0] ? 1 : 0;
+ if (a[selector].toUpperCase() < b[selector].toUpperCase()) {
+ return 1;
+ }
+ else if (a[selector].toUpperCase() > b[selector].toUpperCase()) {
+ return -1;
+ }
+ return 0;
+ })
+}
+
window.onresize = function () {
under_menu.style.height = menu.clientHeight + 'px';
}
@@ -365,19 +400,19 @@ function check_verbs() {
for(var v = verb_tabs.length - 1; v >= 0; v--){
verbs_cat_check(verb_tabs[v]);
}
- //checkStatusTab(); // removes any empty status tabs
}
function verbs_cat_check(cat) {
+ var tabCat = cat.indexOf(".") != -1 ? cat.split(".")[0] : cat;
var verbs_in_cat = 0;
var verbcat = "";
- if(!verb_tabs.includes(cat)){
- removeStatusTab(cat);
+ if(!verb_tabs.includes(tabCat)){
+ removeStatusTab(tabCat);
return;
}
for(var v = 0; v < verbs.length; v++){
var part = verbs[v];
- verbcat = part[0];
+ verbcat = part[0].indexOf(".") != -1 ? part[0].split(".") : part[0];
if(verbcat != cat || verbcat.trim() == ""){
continue;
}
@@ -387,8 +422,8 @@ function verbs_cat_check(cat) {
}
}
if(verbs_in_cat != 1) {
- removeStatusTab(cat);
- if(current_tab == cat)
+ removeStatusTab(tabCat);
+ if(current_tab == tabCat)
tab_change("Status");
}
}
@@ -411,17 +446,20 @@ function add_verb_list(v) {
to_add.sort(); // sort what we're adding
for(var i = 0; i < to_add.length; i++) {
var part = to_add[i];
+ if (!part[0])
+ continue;
+ var category = part[0].indexOf(".") == -1 ? part[0] : part[0].split(".")[0]
if(findVerbindex(part[1], verbs))
continue;
- if(verb_tabs.includes(part[0])){
+ if(verb_tabs.includes(category)){
verbs.push(part);
- if(current_tab == part[0]) {
- draw_verbs(part[0]); // redraw if we added a verb to the tab we're currently in
+ if(current_tab == category) {
+ draw_verbs(category); // redraw if we added a verb to the tab we're currently in
}
- } else if(part[0]) {
- verb_tabs.push(part[0]);
+ } else if(category) {
+ verb_tabs.push(category);
verbs.push(part);
- createStatusTab(part[0]);
+ createStatusTab(category);
}
}
}
@@ -432,7 +470,7 @@ function remove_verb_list(v) {
remove_verb(to_remove[i]);
}
check_verbs();
- verbs.sort();
+ sortVerbs();
if(verb_tabs.includes(current_tab))
draw_verbs(current_tab);
}
@@ -455,7 +493,7 @@ function init_verbs(c, v) {
}
if(v) {
add_verb_list(v);
- verbs.sort(); // sort them
+ sortVerbs(); // sort them
if(do_update) {
draw_verbs(current_tab);
}
@@ -491,6 +529,12 @@ function update(global_data, ping_entry, other_entries) {
else if(current_tab == "Debug Stat Panel")
draw_debug();
}
+/// citadel statvoting
+function update_voting(vote_data) {
+ vote_parts = JSON.parse(vote_data);
+ if(current_tab == "Status")
+ draw_status();
+}
function update_mc(global_mc_data, coords_entry) {
mc_tab_parts = JSON.parse(global_mc_data);
@@ -586,7 +630,7 @@ function tab_change(tab) {
}else if(tab == turfname) {
draw_listedturf();
} else {
- statcontentdiv[textContentKey] = "loading...";
+ statcontentdiv[textContentKey] = "Loading...";
}
window.location.href = "byond://winset?statbrowser.is-visible=true";
}
@@ -667,6 +711,33 @@ function draw_status() {
document.getElementById("statcontent").appendChild(div);
}
}
+ //voting shitcode. See mc for more info.
+ if(vote_parts && vote_parts[0][0]) { //null verification.
+ var table = document.createElement("table");
+ for(var i = 0; i < vote_parts.length; i++) {
+ var part = vote_parts[i];
+ var tr = document.createElement("tr");
+ var td1 = document.createElement("td");
+ td1[textContentKey] = part[0];
+ var td2 = document.createElement("td");
+ if(part[2]) {
+ var a = document.createElement("a");
+ if(part[2] === "disabled") {
+ a.href = "byond://winset?command=Vote";
+ } else {
+ a.href = "?src=" + part[2];
+ }
+ a[textContentKey] = part[1];
+ td2.appendChild(a);
+ } else {
+ td2[textContentKey] = part[1];
+ }
+ tr.appendChild(td1);
+ tr.appendChild(td2);
+ table.appendChild(tr);
+ }
+ document.getElementById("statcontent").appendChild(table);
+ }
if(verb_tabs.length == 0 || !verbs)
{
window.location.href = "byond://winset?command=Fix-Stat-Panel";
@@ -912,29 +983,46 @@ function draw_spells(cat) {
function draw_verbs(cat){
statcontentdiv[textContentKey] = "";
- var table = document.createElement("newdiv");
+ var table = document.createElement("div");
+ var additions = {}; // additional sub-categories to be rendered
table.className = "grid-container";
- var command = ""; // typecast name to string
- verbs.sort();
+ sortVerbs();
verbs.reverse(); // sort verbs backwards before we draw
- for(var i = verbs.length - 1; i >= 0; i--) {
- var part = verbs[i]; // should be a list containing category and command
- if(!part[1]) continue;
- if(part[0] != cat){
- continue;
+ for (var i = 0; i < verbs.length; ++i) {
+ var part = verbs[i];
+ var name = part[0];
+ var command = part[1];
+
+ if (command && name.lastIndexOf(cat, 0) != -1 && (name.length == cat.length || name.charAt(cat.length) == ".")) {
+ var subCat = name.lastIndexOf(".") != -1 ? name.split(".")[1] : null;
+ if (subCat && !additions[subCat]) {
+ var newTable = document.createElement("div");
+ newTable.className = "grid-container";
+ additions[subCat] = newTable;
+ }
+
+ var a = document.createElement("a");
+ a.href = "byond://winset?command=" + command.replace(/\s/g, "-");
+ a[textContentKey] = command;
+ a.className = "grid-item";
+ (subCat ? additions[subCat] : table).appendChild(a);
+ }
+ }
+
+ // Append base table to view
+ var content = document.getElementById("statcontent");
+ content.appendChild(table);
+
+ // Append additional sub-categories if relevant
+ for (var cat in additions) {
+ if (additions.hasOwnProperty(cat)) {
+ // do addition here
+ var header = document.createElement("h3");
+ header[textContentKey] = cat;
+ content.appendChild(header);
+ content.appendChild(additions[cat]);
}
- if(part[0].trim() == ""){
- verbs.splice(i, 1);
- continue;
- }
- command = part[1];
- var a = document.createElement("a");
- a.href = "byond://winset?command=" + command.replace(/\s/g, "-");
- a[textContentKey] = command;
- a.className = "grid-item";
- table.appendChild(a);
}
- document.getElementById("statcontent").appendChild(table);
}
function set_theme(which) {
diff --git a/icons/obj/hydroponics/growing_mushrooms.dmi b/icons/obj/hydroponics/growing_mushrooms.dmi
index 20633cf85b..899fa63856 100644
Binary files a/icons/obj/hydroponics/growing_mushrooms.dmi and b/icons/obj/hydroponics/growing_mushrooms.dmi differ