VV refactor: dropdown actions. (#29673)

* VV refactor: dropdown actions.

* helps if it builds

* append to list cuz we have multiple separators

* fix datumrefresh

* tiny cleanup

* fix jump to turf

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: warriorstar-orion <orion@snowfrost.garden>

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: warriorstar-orion <orion@snowfrost.garden>

* fix typo

---------

Signed-off-by: warriorstar-orion <orion@snowfrost.garden>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
warriorstar-orion
2025-07-09 10:33:47 -04:00
committed by GitHub
parent ce0a9924ea
commit 6c2aa06eb3
15 changed files with 896 additions and 950 deletions
@@ -1454,3 +1454,78 @@ so that different stomachs can handle things in different ways VB*/
/mob/living/carbon/proc/get_thermal_protection() // Xenos got nothin
return 0
/mob/living/carbon/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION(VV_HK_GIVEMARTIALART, "Give Martial Art")
VV_DROPDOWN_OPTION(VV_HK_ADDORGAN, "Add Organ")
VV_DROPDOWN_OPTION(VV_HK_REMORGAN, "Remove Organ")
/mob/living/carbon/vv_do_topic(list/href_list)
. = ..()
if(!.)
return
if(href_list[VV_HK_GIVEMARTIALART])
if(!check_rights(R_SERVER|R_EVENT))
return
var/list/artpaths = subtypesof(/datum/martial_art)
var/list/artnames = list()
for(var/i in artpaths)
var/datum/martial_art/M = i
artnames[initial(M.name)] = M
var/result = tgui_input_list(usr, "Choose the martial art to teach", "JUDO CHOP", artnames)
if(!usr)
return
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(result)
var/chosenart = artnames[result]
var/datum/martial_art/MA = new chosenart
MA.teach(src)
href_list["datumrefresh"] = UID()
else if(href_list[VV_HK_ADDORGAN])
if(!check_rights(R_SPAWN))
return
var/new_organ = tgui_input_list(usr, "Please choose an organ to add.", "Organ", subtypesof(/obj/item/organ))
if(!new_organ)
return
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(locateUID(new_organ) in internal_organs)
to_chat(usr, "<span class='notice'>Mob already has that organ.</span>")
return
var/obj/item/organ/internal/organ = new new_organ
organ.insert(src)
message_admins("[key_name_admin(usr)] has given [key_name_admin(src)] the organ [new_organ]")
log_admin("[key_name(usr)] has given [key_name(src)] the organ [new_organ]")
else if(href_list[VV_HK_REMORGAN])
if(!check_rights(R_SPAWN)) return
var/obj/item/organ/internal/rem_organ = tgui_input_list(usr, "Please choose an organ to remove.", "Organ", internal_organs)
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(!(rem_organ in internal_organs))
to_chat(usr, "<span class='notice'>Mob does not have that organ.</span>")
return
to_chat(usr, "<span class='notice'>Removed [rem_organ] from [src].</span>")
rem_organ.remove(src)
message_admins("[key_name_admin(usr)] has removed the organ [rem_organ] from [key_name_admin(src)]")
log_admin("[key_name(usr)] has removed the organ [rem_organ] from [key_name(src)]")
qdel(rem_organ)
@@ -0,0 +1,35 @@
/mob/living/carbon/human/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION(VV_HK_MAKE_SKELETON, "Make 2spooky")
VV_DROPDOWN_OPTION(VV_HK_HALLUCINATE, "Hallucinate")
/mob/living/carbon/human/vv_do_topic(list/href_list)
. = ..()
if(!.)
return
if(href_list[VV_HK_MAKE_SKELETON])
if(!check_rights(R_SERVER|R_EVENT))
return
if(tgui_alert(usr, "Are you sure you want to turn this mob into a skeleton?", "Confirm Skeleton Transformation", list("Yes", "No")) != "Yes")
return
makeSkeleton()
message_admins("[key_name(usr)] has turned [key_name(src)] into a skeleton")
log_admin("[key_name_admin(usr)] has turned [key_name_admin(src)] into a skeleton")
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_HALLUCINATE])
if(!check_rights(R_SERVER | R_EVENT))
return
var/haltype = tgui_input_list(usr, "Select Hallucination Type", "Hallucinate", (subtypesof(/obj/effect/hallucination) + subtypesof(/datum/hallucination_manager)))
if(!haltype)
return
invoke_hallucination(haltype)
message_admins("[key_name(usr)] has given [key_name(src)] the [haltype] hallucination")
log_admin("[key_name_admin(usr)] has given [key_name_admin(src)] the [haltype] hallucination")
href_list["datumrefresh"] = UID()
+62
View File
@@ -1152,6 +1152,68 @@
if(A.light_range > 0)
A.extinguish_light(force)
/mob/living/vv_get_header()
. = ..()
. += {"
<br><font size='1'>
BRUTE:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=brute'>[getBruteLoss()]</a>
FIRE:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=fire'>[getFireLoss()]</a>
TOXIN:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=toxin'>[getToxLoss()]</a>
OXY:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=oxygen'>[getOxyLoss()]</a>
CLONE:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=clone'>[getCloneLoss()]</a>
BRAIN:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=brain'>[getBrainLoss()]</a>
STAMINA:<font size='1'><a href='byond://?_src_=vars;[VV_HK_TARGET]=[UID()];adjustDamage=stamina'>[getStaminaLoss()]</a>
</font>
"}
/mob/living/vv_do_topic(list/href_list)
. = ..()
if(!.)
return
if(href_list["adjustDamage"])
if(!check_rights(R_DEBUG|R_ADMIN|R_EVENT)) return
var/Text = href_list["adjustDamage"]
var/amount = tgui_input_number(usr, "Deal how much damage to mob? (Negative values here heal)", "Adjust [Text]loss")
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
switch(Text)
if("brute")
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.adjustBruteLoss(amount, robotic = TRUE)
else
adjustBruteLoss(amount)
if("fire")
if(ishuman(src))
var/mob/living/carbon/human/H = src
H.adjustFireLoss(amount, robotic = TRUE)
else
adjustFireLoss(amount)
if("toxin")
adjustToxLoss(amount)
if("oxygen")
adjustOxyLoss(amount)
if("brain")
adjustBrainLoss(amount)
if("clone")
adjustCloneLoss(amount)
if("stamina")
adjustStaminaLoss(amount)
else
to_chat(usr, "<span class='notice'>You caused an error. DEBUG: Text:[Text] Mob:[src]</span>")
return
if(amount != 0)
log_admin("[key_name(usr)] dealt [amount] amount of [Text] damage to [src]")
message_admins("[key_name_admin(usr)] dealt [amount] amount of [Text] damage to [src]")
href_list["datumrefresh"] = UID()
/mob/living/vv_edit_var(var_name, var_value)
switch(var_name)
if("stat")
-28
View File
@@ -1294,34 +1294,6 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
target += new_log
/mob/vv_get_dropdown()
. = ..()
.["Show player panel"] = "byond://?_src_=vars;mob_player_panel=[UID()]"
.["Give Spell"] = "byond://?_src_=vars;give_spell=[UID()]"
.["Give Martial Art"] = "byond://?_src_=vars;givemartialart=[UID()]"
.["Give Disease"] = "byond://?_src_=vars;give_disease=[UID()]"
.["Toggle Godmode"] = "byond://?_src_=vars;godmode=[UID()]"
.["Toggle Build Mode"] = "byond://?_src_=vars;build_mode=[UID()]"
.["Make 2spooky"] = "byond://?_src_=vars;make_skeleton=[UID()]"
.["Hallucinate"] = "byond://?_src_=vars;hallucinate=[UID()]"
.["Assume Direct Control"] = "byond://?_src_=vars;direct_control=[UID()]"
.["Offer Control to Ghosts"] = "byond://?_src_=vars;offer_control=[UID()]"
.["Drop Everything"] = "byond://?_src_=vars;drop_everything=[UID()]"
.["Regenerate Icons"] = "byond://?_src_=vars;regenerateicons=[UID()]"
.["Add Language"] = "byond://?_src_=vars;addlanguage=[UID()]"
.["Remove Language"] = "byond://?_src_=vars;remlanguage=[UID()]"
.["Add Organ"] = "byond://?_src_=vars;addorgan=[UID()]"
.["Remove Organ"] = "byond://?_src_=vars;remorgan=[UID()]"
.["Add Verb"] = "byond://?_src_=vars;addverb=[UID()]"
.["Remove Verb"] = "byond://?_src_=vars;remverb=[UID()]"
.["Gib"] = "byond://?_src_=vars;gib=[UID()]"
///Can this mob resist (default FALSE)
/mob/proc/can_resist()
return FALSE //overridden in living.dm
+180
View File
@@ -0,0 +1,180 @@
/mob/vv_get_header()
. = ..()
. += "<br><font size='1'><a href='byond://?_src_=vars;datumedit=[UID()];varnameedit=ckey'>[ckey ? ckey : "No ckey"]</a> / <a href='byond://?_src_=vars;rename=TRUE;[VV_HK_TARGET]=[UID()]'>[real_name ? real_name : "No real name"]</a></font>"
/mob/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION(VV_HK_MOB_PLAYER_PANEL, "Show player panel")
VV_DROPDOWN_OPTION(VV_HK_GIVE_SPELL, "Give Spell")
VV_DROPDOWN_OPTION(VV_HK_GIVE_DISEASE, "Give Disease")
VV_DROPDOWN_OPTION(VV_HK_GODMODE, "Toggle Godmode")
VV_DROPDOWN_OPTION(VV_HK_BUILD_MODE, "Toggle Build Mode")
VV_DROPDOWN_OPTION(VV_HK_DIRECT_CONTROL, "Assume Direct Control")
VV_DROPDOWN_OPTION(VV_HK_OFFER_CONTROL, "Offer Control to Ghosts")
VV_DROPDOWN_OPTION(VV_HK_DROP_EVERYTHING, "Drop Everything")
VV_DROPDOWN_OPTION(VV_HK_REGENERATEICONS, "Regenerate Icons")
VV_DROPDOWN_OPTION(VV_HK_ADDLANGUAGE, "Add Language")
VV_DROPDOWN_OPTION(VV_HK_REMLANGUAGE, "Remove Language")
VV_DROPDOWN_OPTION(VV_HK_ADDVERB, "Add Verb")
VV_DROPDOWN_OPTION(VV_HK_REMVERB, "Remove Verb")
VV_DROPDOWN_OPTION(VV_HK_GIB, "Gib")
/mob/vv_do_topic(list/href_list)
. = ..()
if(!.)
return
//~CARN: for renaming mobs (updates their name, real_name, mind.name, their ID/PDA and datacore records).
if(href_list["rename"])
if(!check_rights(R_ADMIN))
return
var/new_name = reject_bad_name(sanitize(copytext_char(input(usr, "What would you like to name this mob?", "Input a name", real_name) as text|null, 1, MAX_NAME_LEN)), allow_numbers = TRUE)
if(!new_name || QDELETED(src))
return
message_admins("Admin [key_name_admin(usr)] renamed [key_name_admin(src)] to [new_name].")
rename_character(real_name, new_name)
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_MOB_PLAYER_PANEL])
if(!check_rights(R_ADMIN|R_MOD))
return
usr.client.holder.show_player_panel(src)
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_GIVE_SPELL])
if(!check_rights(R_SERVER|R_EVENT))
return
usr.client.give_spell(src)
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_GIVE_DISEASE])
if(!check_rights(R_SERVER|R_EVENT))
return
usr.client.give_disease(src)
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_GODMODE])
if(!check_rights(R_EVENT))
return
usr.client.cmd_admin_godmode(src)
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_GIB])
if(!check_rights(R_ADMIN|R_EVENT))
return
usr.client.cmd_admin_gib(src)
if(href_list[VV_HK_BUILD_MODE])
if(!check_rights(R_BUILDMODE))
return
togglebuildmode(src)
href_list["datumrefresh"] = UID()
if(href_list[VV_HK_DROP_EVERYTHING])
if(!check_rights(R_DEBUG|R_ADMIN))
return
if(usr.client)
usr.client.cmd_admin_drop_everything(src)
if(href_list[VV_HK_DIRECT_CONTROL])
if(!check_rights(R_DEBUG|R_ADMIN))
return
if(usr.client)
usr.client.cmd_assume_direct_control(src)
if(href_list[VV_HK_OFFER_CONTROL])
if(!check_rights(R_ADMIN))
return
offer_control(src)
if(href_list[VV_HK_REGENERATEICONS])
if(!check_rights(0))
return
regenerate_icons()
if(href_list[VV_HK_ADDLANGUAGE])
if(!check_rights(R_SPAWN))
return
var/new_language = tgui_input_list(usr, "Please choose a language to add.", "Language", GLOB.all_languages)
if(!new_language)
return
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(add_language(new_language, TRUE))
to_chat(usr, "<span class='notice'>Added [new_language] to [src].</span>")
message_admins("[key_name_admin(usr)] has given [key_name_admin(src)] the language [new_language]")
log_admin("[key_name(usr)] has given [key_name(src)] the language [new_language]")
else
to_chat(usr, "<span class='notice'>Mob already knows that language.</span>")
if(href_list[VV_HK_REMLANGUAGE])
if(!check_rights(R_SPAWN))
return
if(!length(languages))
to_chat(usr, "<span class='notice'>This mob knows no languages.</span>")
return
var/datum/language/rem_language = tgui_input_list(usr, "Please choose a language to remove.", "Language", src.languages)
if(!rem_language)
return
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(remove_language(rem_language.name, TRUE))
to_chat(usr, "<span class='notice'>Removed [rem_language] from [src].</span>")
message_admins("[key_name_admin(usr)] has removed language [rem_language] from [key_name_admin(src)]")
log_admin("[key_name(usr)] has removed language [rem_language] from [key_name(src)]")
else
to_chat(usr, "<span class='notice'>Mob doesn't know that language.</span>")
if(href_list[VV_HK_ADDVERB])
if(!check_rights(R_DEBUG))
return
var/list/possibleverbs = list()
possibleverbs += "Cancel" // One for the top...
possibleverbs += typesof(/mob/proc, /mob/verb, /mob/living/proc, /mob/living/verb)
switch(type) // Horrid
if(/mob/living/carbon/human)
possibleverbs += typesof(/mob/living/carbon/proc, /mob/living/carbon/verb, /mob/living/carbon/human/verb, /mob/living/carbon/human/proc)
if(/mob/living/silicon/robot)
possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/robot/proc, /mob/living/silicon/robot/verb)
if(/mob/living/silicon/ai)
possibleverbs += typesof(/mob/living/silicon/proc, /mob/living/silicon/ai/proc, /mob/living/silicon/ai/verb)
possibleverbs -= verbs
possibleverbs += "Cancel" // ...And one for the bottom
var/verb = input("Select a verb!", "Verbs",null) as anything in possibleverbs
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(!verb || verb == "Cancel")
return
else
add_verb(src, verb)
message_admins("[key_name_admin(usr)] has given [key_name_admin(src)] the verb [verb]")
log_admin("[key_name(usr)] has given [key_name(src)] the verb [verb]")
if(href_list[VV_HK_REMVERB])
if(!check_rights(R_DEBUG))
return
var/verb = tgui_input_list(usr, "Please choose a verb to remove.", "Verbs", src.verbs)
if(QDELETED(src))
to_chat(usr, "<span class='notice'>Mob doesn't exist anymore.</span>")
return
if(!verb)
return
else
remove_verb(src, verb)
message_admins("[key_name_admin(usr)] has removed verb [verb] from [key_name_admin(src)]")
log_admin("[key_name(usr)] has removed verb [verb] from [key_name(src)]")