From a0915161813cfc8a7c9767dfabff796523301558 Mon Sep 17 00:00:00 2001
From: meow20 <62257265+meow20@users.noreply.github.com>
Date: Thu, 19 Sep 2024 12:46:53 +0200
Subject: [PATCH] Administration tool: Build mode offer tool to quickly offer
large amount of mobs. (#26712)
* offer buildmode
* stops asking to show special role if already decided in build mode
* Update offer.dm
* minor oopsy
* linter crying
* Update code/modules/buildmode/submodes/offer.dm
Co-authored-by: chuga-git <98280110+chuga-git@users.noreply.github.com>
Signed-off-by: meow20 <62257265+meow20@users.noreply.github.com>
* Update mob_misc_procs.dm
* Update code/modules/mob/mob_misc_procs.dm
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: meow20 <62257265+meow20@users.noreply.github.com>
---------
Signed-off-by: meow20 <62257265+meow20@users.noreply.github.com>
Co-authored-by: chuga-git <98280110+chuga-git@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
---
code/__HELPERS/trait_helpers.dm | 1 +
code/_globalvars/traits.dm | 1 +
code/modules/buildmode/submodes/offer.dm | 29 +++++++++++++++++++++++
code/modules/mob/mob_misc_procs.dm | 20 ++++++++++++----
icons/misc/buildmode.dmi | Bin 1731 -> 2009 bytes
paradise.dme | 1 +
6 files changed, 47 insertions(+), 5 deletions(-)
create mode 100644 code/modules/buildmode/submodes/offer.dm
diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm
index af8040177b8..ecaa149c21e 100644
--- a/code/__HELPERS/trait_helpers.dm
+++ b/code/__HELPERS/trait_helpers.dm
@@ -137,6 +137,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
//***** MOB TRAITS *****//
#define TRAIT_RESPAWNABLE "can_respawn_as_ghost_roles"
+#define TRAIT_BEING_OFFERED "offered"
#define TRAIT_BLIND "blind"
#define TRAIT_MUTE "mute"
#define TRAIT_DEAF "deaf"
diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm
index f276bcc25ab..43bb6404075 100644
--- a/code/_globalvars/traits.dm
+++ b/code/_globalvars/traits.dm
@@ -5,6 +5,7 @@
*/
GLOBAL_LIST_INIT(traits_by_type, list(
/mob = list(
+ "TRAIT_BEING_OFFERED" = TRAIT_BEING_OFFERED,
"TRAIT_BLIND" = TRAIT_BLIND,
"TRAIT_MUTE" = TRAIT_MUTE,
"TRAIT_DEAF" = TRAIT_DEAF,
diff --git a/code/modules/buildmode/submodes/offer.dm b/code/modules/buildmode/submodes/offer.dm
new file mode 100644
index 00000000000..e3a57d02c45
--- /dev/null
+++ b/code/modules/buildmode/submodes/offer.dm
@@ -0,0 +1,29 @@
+// Speeds up the offering process and optionally allows the admin to set up playtime requirement and "Show role" only once.
+// Default setting is 20H like the default recommendation for offering from drop down menu.
+/datum/buildmode_mode/offer
+ key = "offer"
+ var/hours = 20
+ var/hide_role
+
+/datum/buildmode_mode/offer/show_help(mob/user)
+ to_chat(user, "***********************************************************")
+ to_chat(user, "Left click to offer a mob")
+ to_chat(user, "Right click to change amount of playtime a player needs to be able to sign up and whether to display their special role")
+ to_chat(user, "***********************************************************")
+
+/datum/buildmode_mode/offer/change_settings(mob/user)
+ hours = input(user, "Playtime required", "Input", 20) as num|null
+ if(alert("Do you want to show the mob's special role?", null, "Yes", "No") == "Yes")
+ hide_role = FALSE
+ else
+ hide_role = TRUE
+
+/datum/buildmode_mode/offer/handle_click(mob/user, params, atom/A)
+ var/list/modifiers = params2list(params)
+ var/left_click = LAZYACCESS(modifiers, LEFT_CLICK)
+ var/selected_atom
+
+ if(left_click && ismob(A) && !isobserver(A))
+ selected_atom = A
+ offer_control(selected_atom, hours, hide_role)
+
diff --git a/code/modules/mob/mob_misc_procs.dm b/code/modules/mob/mob_misc_procs.dm
index 049a727572a..202515b79af 100644
--- a/code/modules/mob/mob_misc_procs.dm
+++ b/code/modules/mob/mob_misc_procs.dm
@@ -158,16 +158,26 @@
return U.sensor_mode
return SUIT_SENSOR_OFF
-/proc/offer_control(mob/M)
- to_chat(M, "Control of your mob has been offered to dead players.")
+/proc/offer_control(mob/M, hours, hide_role)
+ if(HAS_TRAIT(M, TRAIT_BEING_OFFERED))
+ return
+ var/minhours
+ ADD_TRAIT(M, TRAIT_BEING_OFFERED, "admin_offer")
log_admin("[key_name(usr)] has offered control of ([key_name(M)]) to ghosts.")
- var/minhours = input(usr, "Minimum hours required to play [M]?", "Set Min Hrs", 10) as num
- message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts with [minhours] hrs playtime")
var/question = "Do you want to play as [M.real_name ? M.real_name : M.name][M.job ? " ([M.job])" : ""]"
- if(alert("Do you want to show the antag status?","Show antag status","Yes","No") == "Yes")
+ if(!hours)
+ minhours = input(usr, "Minimum hours required to play [M]?", "Set Min Hrs", 10) as num
+ else
+ minhours = hours
+ if(isnull(hide_role))
+ if(alert("Do you want to show the antag status?","Show antag status","Yes","No") == "Yes")
+ question += ", [M.mind?.special_role || "No special role"]"
+ else if(!hide_role)
question += ", [M.mind?.special_role ? M.mind?.special_role : "No special role"]"
+ message_admins("[key_name_admin(usr)] has offered control of ([key_name_admin(M)]) to ghosts with [minhours] hrs playtime")
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("[question]?", poll_time = 10 SECONDS, min_hours = minhours, source = M)
var/mob/dead/observer/theghost = null
+ REMOVE_TRAIT(M, TRAIT_BEING_OFFERED, "admin_offer")
if(length(candidates))
if(QDELETED(M))
diff --git a/icons/misc/buildmode.dmi b/icons/misc/buildmode.dmi
index 025cf3350a251eb8d5aacfd5af494ba3f29727f2..80c9d404a10b2fc712b918d2901352145548a832 100644
GIT binary patch
delta 1995
zcmV;+2Q>J@4cQNnB!3=IOjJbx000Id4+Sz4163UbI~EIFB>+$v07w^R%m4)_4nB@F
zF#rGn0d!JMQvg8b*k%9#0QGuQSad{Xb7OL8aCB*JZU6vyoSl@xYQr!LhR^m>nD#!l
zu7_QA87-rS^%aT|E47$yWwx8Jw{K{mz0@JjO@i;&?_UV7)qmIi`*2jdpM&f$L}IT#
z)%N98ik@^bL-W3o!XTYZ8k?9P;ZUwtQfLZsDBq-L0yrG&J5XK7>Id~PK{?iVN@UZ#
zp$2W6BZXyda~2gusuw9ici?N(i^QlYn`}~;OyGWz(m{JhKX09Xmxa%(x&5DKG43!R
zOs(RHq#&1U!;-kkaV*Kop+?6=9s#l!d8a-0>edv@<)*=qXh}ptRA_wUMLUO&v@_~m`Ko?buxzO2Wezr7pU`u_PsTL8~`dVP{t{Po??0R8j11~<x@T*70fc`?!6-`wxE92WRVp&CieNedf0^dn*0>kgjBIEAyw)&yVQsNE&$V;wM@#
z6xISci%1~-{D|HW1iEeZ4W7c$cla$6WPW}??+HSHEUW~<5ruz&z{Y2C=I00Wj)1~L
z2!HI85=YC$-djdL12vvgI&+EE2ittFIEOb1NLGI@VGyr~6atNZ002XW!zTzm#
z{k*PmG#R!Il3
z^PKm%qpJkMg<$Kzi)paNK=^rGWA|wwWq$;l6AU>(Up7_xxu4f{H4h{K%mD)2N|5_`
zU03F!k{|>PQ&|$MeqPrq!R*l2Z3MZWAJ7^BUo%vqgsVVA4LO+2{J!V_cXi;
zo*>>+9AG}Q3Engkh8GzDAy6Tme1DXU>)G`@AQrPdgR!^qNTY-Z1Yz)TFbe`+Fi%zH
zZd712>{b_h8*s4OD*;DM#7OS5*>!C``69Fgz=oL#fNyYc(Uo0C?pdx?h$_?U2o^NM;RlTFwn9OWoL};?
z6#~G1ot#ZMiNzf-1;NqTb3ZrvC8qP5*?Aru?Qx+QfDptJP3FNx0!a147Q=Xf1N+Gx
zod6I)p@j#2xMN(y5eQYQrPzXK%uc9>g+dr@>$-mpO6AD
z;Lu%;5+rBZta#W8N&>qaA%G<#0KX?7(_v){0LEib5V%Hr)7#V6Vt=p*0#A1we6{@@
zc>wIZ>*rG*ELZZtD+H7RJvXh#q)$KtNYn!a;}_fPap-IqNLW$CQN$y^NdRR$S3Hg19TC5|lkC2}lE`
zdqJ=a5|lll9@7LRVt)e0tfLI5Ds`s`>O@$$on3wJ^(L2+p3cZZ6owAU|C1Z5W_rM-Ru&EG5S^$Td3sI=EFpk<=cet>{K
zKtOB1wb^jrzI(n#z#o~|)=h6G;Ezn$`hM{p1n4c%8&y}|?|&kYE5HAB42+AW!_b=C
z5CJ`MM@JEVYJxuAVo&CQA=d*90>>X-L1HsTkoA~Wc9&=(S_HtW^|UT}ieQdbv`YY7
zgPkIvf~P|eV_*kI(Mf{%Il2J?G@i861X&E=wow#rW?Zfq$^$_#|20OyQ<1N_=Y9LQ
zzk}Or%g6;dlSH}Le{e23KyYp@GFXN^_&mU^$pxNzqV4kFW`eKYRcQWRX|G@4aqIZB
d`F+~H{{yxcvyXp*0%`yN002ovPDHLkV1m2N$5a3S
delta 1715
zcmV;k22AfFDZ*Bkpc$}S+%?`pK5QNY06h!aFzk?Sq
zMq@naE0}FrWg~PeV2y8YV-vmDru4R(e8Vsk7^}^0e>kb_@gOVofw)j>wVX_)c#@8$
zUKVpH4ARxaW(g4@*5ha-g(e^BaVEvZgTrS20@;JC{!yzA%73xOb0i!49cs{)ZKSZw
zWt&9?f$~90&=nLp>Oo@E)S9eQ7>(!WAf2wheDkzB~y
z1l&?_OTaT`mw*STFePqu98$8f&(U#`hlkb|Iaa&V_VcsfY!oQ^echKp0000UP)t-s
z1|bgs003sp0DlWzB?DC*08kkKNEZb=76mdB1t<q=RIcxxz1`)5^qJ
zGYz=f4fJc#u%4-cKB?uO<*I)9^_qWpl$V!3uIh3&FMltWrPhCRHZLzfr>4GM&gSLi
zr@!pA{{C_quyVukcm>#bdHFFl_4{SOK;?KmC?!GWY+y}&xxCK`aOG&cI`qj12^!!v;wlDDx;)0OQmUGuTX#dCDBL-#`vt*3{R_
z$vi(g&JVxS<9q*)=lbAVtq*FRk9gGiqt0IXJbxeXuyaS9zw~*24{uc&z$+^ot3pjZ
zU3Yo@77q;sMbcR$QF#fnL7(Su^2h*eijCEn)mTlHvq6{VV}5HO@Og3;YzBT$?(%%h
zy}^1=F)--ze8l7X0alho?Hu%Zeg^~jRhpw3H3l$1q42Ay&+`#`YLF!ToPY*>(B=7<
zGk>XR&8Dls`zd4T^L)TV1JIz8`#c};$Uv_;xwJ<9$p&4XkGVJKQ%D|7iIRA->+^iT
zZr~Tvl>t`+Z6$IV$13GK~Wx#-q6)vzc7Xo-QNOb2M5cxaau0m^$%70Z1
zx;*dSsj`6qXN4NWz|5;5^Ob=sfSY|&MXu2^oZ=$&9!%NMYc+7^#t9G5kngT
z1FSK?R&G#E5keTuK`m!LMi`|IN`KhO4OE%SS=!ZAG~Sy~WiYn}V1;eWok2MvLIUmI
z*(FLO^|+v2Wy%`^GX|R)_C9SzXW+^2mH8b5T*0~TgIdQ7
z1P&nQszB!$fE~2XA-wDq1Hne1rZ0eObVjQ9lQ-1g{P?C2q>9HFz;k`DkALUK_x>M`
z@&{NSd=B{XTpt|RZ2=SvD1!CD0d@ltN#whPrx-{=39mw{0c(jAYI_Y>6+Ax9te#{y
z13*9^!A=8DrsLySqhM>Gc8>w<$^iVvp!}M)a{x#>Xh4JUZgA+CeKBs6T*v@l9IzhQuWMYHbz56{?JUxY9)
z3=BB`dCS0CUsbg`J~luC+@NqZa3cYc)II^ZL6Ut2wK{{Ap{l)s?KG&>oG~DvW=KoA)mf7rnLLe+SJ!K3_LrHbeCgGu3cet&$A27G$3mPql@
z4~QoD@ec^{{lgy+b@Ia>5Owky1_t)!fxg}GI>&$#`5kta0UP@r)+QN%sDx|5L<6uJ
zeAGDrv(CDT2K%5wg0l?Xrh+xM@jL@ho;1$@27Dv~HZCU&T+IQ_>tyj0rfGe^?1_I~
zC%XYK%fS8@15BI)V=Ta6KwvQAp8QM|pQ81_2Z)Zd!|(L?{x4!puI<|X%lZHS002ov
JPDHLkV1nR3FY*8Y
diff --git a/paradise.dme b/paradise.dme
index ea8f0ea1306..21dbbac0512 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1665,6 +1665,7 @@
#include "code\modules\buildmode\submodes\forcemove.dm"
#include "code\modules\buildmode\submodes\link.dm"
#include "code\modules\buildmode\submodes\mapgen.dm"
+#include "code\modules\buildmode\submodes\offer.dm"
#include "code\modules\buildmode\submodes\save.dm"
#include "code\modules\buildmode\submodes\throwing.dm"
#include "code\modules\buildmode\submodes\tilt.dm"