b-v@A|4~X%164yrKb!dC{Sj3p2iMs5DL`XO=ML5>k6-KxrbVG4|7s&w4Nq7S=iK<*UV;
z4Tca(OM!90XG1*|72^jAxBksH3#FX>=u_*aI|BRtra@Y&1DppN>rm3}hN(7fGq3p>
zE7waVquQM5Ee!}a|BL0ko)otnDI%sZE7sUOP&9x2w$%FICL`!R&aAF`>r;KnYflU9
z#6SPMRu;YT*f>xBDeR7dQ}lG&d%@^B>##CM7jx{}H<4uhOVSN-flBB9V*y$rb>ic0
z6s*v1W-bGs)MYKRk6tFWH~vfK@d-h?qYz9zfRB%h>+PKF@!&clyWDC~lm2p;JmNwA
zs(tUT#*N(V``CG?CevwFMtHX)vlkn`VtoOEJVjpPkE9uFR%wt!`paxEWGC2_-DMl%Mslf
z3p1OaM`|IQ4~+*e$-b!DpRdL&R>MeJm5q|&+>
zfjh}7Hj8{w@9gY|lD;p+t?h?#9ccff)crjUAdeij7W?sO6*wLnXs{B;xG4XrxZ&i)
zRPr{y+hf`~4kvT$v2hX(XZMm6gFs_ri%G~+QDv(QLCNX$C_0bSnZW5iP&|0Voll-+
zQ_8@6{Nf$1c&^i^0=BIvZn}Wn1rSmPh*Am9w({8auE&2V)bB^XY2bXTJ5Ge>xnGVK
zHlmDzB1rm=ommg6LGoZT#^!c^mOIFm`Lix{SO_2ab)L;Yl(JZ|sDZW{3yqna~FKXRMp
zQN8(w!(&bu%3>W~?O<(FWAj#bdoC8t(ydF($A_;i#8S;eFmT2&5byantf=T)gQea!
zJgw$qri7!jlz@InW4Q|4I1>{S9L#+D=ZIjtP3Esx3Mg!p64iW?73J(fdh_q7Su6Bc
z?ssf2^N=k|`=~{jxt7l_FQp1oF&=&qN#sP7aqwu7Pw5Fw5x1QZuHl*}N7#wrfgVky
zlR}mq%KxF5tdnm&JPUigxq<4niH2X`hQCI`Ws89sPz)7p|hvxX>W
zP5>@2=k&=lx5uxu$BIMDSs^4W$h}8>@xovm!%EZk5c1=6vqhZ&4@SkEVZ+1bwdD{)
zwC-gmRpZ4F9-HFMNkS#fGj{d>0oCZ$H#EDgVmvOe?%C}c)W-$D9#^jUf6|dcbfXV1Nq
zlt%Z_7MS#VbvXfqLplE#$@CCn>3|fOu7LqOI{Iiv?BF0ye8Dz4%=2k@^lw#995HPS
z4Q)-!RzLGS7*5EAMsq{T$|^`P?Ie)`f*iKCHs`A(xZtfEX|AxX-~Xw_)Ofnu|C3KI
zf8UNqewBhuFJgc*o*$l+)!)Ix7%xxEMc$6VGL-Ct7ux(2BNCQH^ETpmxt2<*I9*C@
z#&k{-gPS9H5gf%I4da35+d-RrF$7cdIhCqfp1}w|B)3YOub-^C*Dg?6D6-j4!RZ0H
zQCdd5R&b^p>l3cC(%s=4F~nbC@Lx*&K$NJv5YLb6uac7Z6}yvC1lL1glkkO#!QI{6
z6HPDDjZH1G)}qnVVQ0?GEyB4MOr!DF4M`uO@Yf5nXc91D8LABEe$)hi%409r?C`0K8;91{ZRY~;#mG*2p&gbR97+Kb`ReJI#K8pm1`RYY`
zd{v%eQcfbzPF-hg5;HN$J2^O<$9d$q3_!D29v&JeHuDA+Yw8srCRCB;_z>n!r@4Qh
z056R@9_#pc{65m~m*Lr`P53quurh
zw*Lv{@~?{lXDluU%DPLqJ@E(9u#L<87FUCpj}3huo&){I%Mbn}x;L4}+f$R-2WjR$
zAhB`QQ{y~4uZ^A9L-d$|6a6tgJ
z&d(>-haWL4L52<4%FD>lCvoe@+SCKsftxHgxBm>VL~a`?idsy!96Et1nDyZjNFBUL
z3Wy8QHS=`&0UCrB=GM_MGOL@r8+Of@j)4c~SLS~2fS=`ISEAJKef%u4S@@
z+m>b1DIu22p0RQQHnyUVmo~DT&PFV;CV{l@D23fmO;NW@vI;%2F1u%TA+U$j8_Fv<
zU@B7fGx7($RUNvWN|YG8?9+uxs3&JkPr@c^@)eb>A_Vmpq{_K)6z-9
z!+l8Od27Y{HYL+c($hD;JR012OR6*O{qS0T7Zcs$!vtK+KYwmZ%SHz`H%Cfzm(i=l
zyYsE|_B{>+-!WC&C^9}I=Jatq0isDT#0K|quVn`JllwjxNB$U!b69uCs
zm(`MKDx+};a_FDA?<2UmmMvz3vk`+Tdvn6k>Gi7jFEA>L0ou1v?JQ&~X>Pig^43(4&A3F&bXmaNe&UDUR)aKjN
zr|HO9N%bTL+m^_PU9Bh4zj}9&Wed2Yz@Uc5SYKqKfP}Xkhu`SwH=&M(#(07KI%B1U
zvhp0x`gJEzc7Gi0K;5CBs7SWP`khKqG1~d1z2gELY}{j%aJqTDwsE|j9u&e=tXQOv{v4NehMnT74y?8AAP&NJp}oD~QSsuxU%cZl
z7F-s56MHY1jq+A3XpGYNLU3
z9@%8fnq>2l`GNY)=y2^c0PW=xRpvaxrh7~s%9D1r%vk`KYgAN}=%auXR%V<3v^8Wd
z9P1`v+r(x&3nWJTx;2|auQi|Z#@^R#YgG7lyygtyBiUX+YV)v}Os80X3z%AAG^?Ms
zMa%D8{v#0WieE*y`H8yaN9+CaMb|T}9XxfHQ25{EIBlJytq&!||NAdtV||r4cX4sC
z%)Rfv9{`XPKX%awk||>fS?0a4E-joMK?vnJe%o1@U7!pW*EJ5(?3CCwUtWQ{4ZiA(
zTwbiw8fQ840@+S=aJz!etQzpT4z8
zjmxk4&l1c?d?4fF`{49&aV$1MAkc}7mi4Z!?fkhyvPue55_1tue;0qqa2E5ZHuVjp
zH2`Y^DT_YngSXGYLNKO^rtgo5Q;!8amo_#!I`-)%QqT!k<_Siq&Hz+<)Y&oJcy!#>
z_r8HIzK{DkUBm1nuFp3{O)wx0Svp6et*u>JUJj0CVCx)?s!Jm-DH*4okuksb8WdFi
zdd}bU>TZu{j4T(!Kuqk%4f{QWii(JZ&}SnzcmMG4Q#OW?ib_I8TwD*x4H_C5fnKke
zWarM9R*lw$zk&wAVfT*2Q-D^veFQmzpT5;JH8pK&*cllaHMh3LrKd|tNWgqyA`1dd
zOG^vzOv97oybJzj%Er=CX$14f4`~Af5_%aKQZh1i4Dhh8he-+@{fwX_?nw%IOKKVToYUBh5@LZ*27R
z_^zK@5^G={H~#EDO#x`?-?9ZqKp5RG00?>DeYbtC(fE8|-(-AQHKrkI$=_Ut)AODR
z#ud?ki{U(toItKDXit(?Q25WTckRb4IIHZ=?jOe_xUmT~tHIPlIqi*^iIEsv{=xUs
zp(VC(A4f;WXOEBm<*;-N3+5go^5t@-yI+amK2uAw5tZ?z8LN&m)nxNaxD2Rll?SMe
ztK-MaTeHIxQ(_LEXSl0Dom^6N-})cCIXqHA#6?y=@8_`dnS~}v!M)jE08iKUVzoh`
z9A%b$_goVZ#1;RbIJN8Pl(#q{MXW`o?Um3GDm#@AF)UKez(I<58=ut#l+l-wu(Gk$r=M
zp@yU+$6FgEB!}N$?hZKZ4~Ib}Cnv`(P4%?Odzq>#B2wYuIk>sO8BHefTtDAmR4yW(
z05b5frjxy(5;-U@qALUGG#kY|@y=W3mxTdl@%8luFq5{We?$2Y9xYdD2gjoX&<8r_M3I}KTXwN@99CmLol7xiBe|=pG
zgzx=YD7*_vkj-Z|F5J9TKdpiEf1nGYtsmr#-ap0WqRLPDf)Ee1L^1Ncc}FRKW)>3F
zYh}t5f9|XiXy!wjS8Kn$yvSEp4$RE>=Iw?@;IM|-V~1e?Iid6<_P+74kz4>wd%o30
zz|PKYsBR3T1FfyC&!3*el8g?XK0ofSwz6G0ISHKhcxv$Ly^kforfM*xX6
zF;n~x=%USw#TF%Pn=dFXYD_yWQ3F11w^T@8Hv&bDbbWg;){c%H>h$F9lNVC|)G>GV
za2gT<+yYNW4#tvnndgyem%3^2HBo>BR|e1C_ESJ`u%f)YFF=)`Z_jwy5;7WA1aO0n
zjt=y&056f-|8{6s+xe?tZ_nO1eFs%3{<~7zh~T2&-`BzRpK0ZJ+ZO@f~%+D+R1HU@i!#1t1sYe93AMwy_ncIjt)$KxS$;k--
zYYHTP*4Zzd00cKQJiPJ>72Rvjo)4c&zCV9>v=lt^z>1{I?7~n
z6n-*hT7~uw5&}dW
z_inswnd41#faC{8ij$eQ#?{npNNr3)vs~xE3NEDr0ueimtbv1(Kavs8=pH9sHFPeo
z#=t#aAAThp3>hf!5jobd7e_&1=o4c33!
zo}R_p$ytjw`Ac>7M>3*Ocq0cz1&28jF;e80@Hq@$~eJsz$CPZmw8%
z@90R(xChb_?vm=iY6^Z?d9N@j`dNTeGcsryv|H<+q#R*L{s;?00Mb1mh%&bm3=AwJ
zBm_im1QQuKH|%6O1_=xte1SRXr|3WRaQ*@n=zxHLaDTC;x)Bf@bVNW+%SF62~;@Q~XTobA+;pXsgBtXw^+FlJED6B&8
zK-e(3;i4HGn>k4=r1WZcfGKY00nC;g&UlG|94tWUh=)Uy3~v4#B7=@cP-h+ysmP{i
zeJ!%Lw=u>NP@T^ziwc(!%BQ;Zrm+xV+H%64Xio{Mg+?j)BtTJ6it7apH4%Z=b1oVN
zMvx4!)cn~%fk_&@c3w+MsxuUg#!;I;6wMA3y*4pWZ}R@`;o!y#zzQ&uy?*!Sv)p1A
zLBXZyAyYLwoG3^XFXhjjskb_mqM@Pnhh%^iH7?6J-;=t!@j8mhGB*qa?W~NxnR!Q%
zojp}nkoAnkyBldPAhpZY9_g$kK`_XA&{)uEc)J4>qolcm+I>u~!;-qVGWQIm!q88i
z@}}EM$7|o3OlDAp8?)Z6bMnCbu2-^XDBECQXJ0Zm==Spo8a#TmeU^;%Av1Z>@c7T=
z<^ypAMknjO?r&~(CA>E^ok>eqwR!QJl9_sA%bQ3VopKlB6ZFKrf0!fyVY?KhWRI1J
zI_+pzRUA5pKcnMEGYJ_Tm87Pj0bF5L$)}qK<-3Zo!S8!Q;1^Afq}OG=C>ljA(@JJ1
zCKf_Y_TlD5z=c5pohIrS+n3_#9L*xAbYc=BHMRSHe2o4+aimOV&vxb(7NwPyg*7!X
zK&^l#H7%{uobeC-s$uD&tXu;hb4_wAJY77@v
zk>XrqLvLlDM7=+Lr~_j2kN4IktS+dr7z)lxN^nO9udlCUNmzHc!1=`m_Daf9IW7}+
zB>J=IYJ~+LJG5F0c!J(krz0SZh@i9f*4Dyj+nNtAp28lI{lam@1?b!&DPi3mI`k!vd~zlJ!aeCI7dsPI0ap
z1Mia;^m18B`^Wu>LB2RYje&^~jLTEtG
zsYjTw{5vZ0t7J~zM*e_nEtaa2aSl}+qI=%nn+3tKIeB0)H%Fo^4tlqJJ~}=&>cqo5
zKkr440o6#o0|StVh=`7l>GAQX`1tsMQD=KHONQ_LZdX1rhD4g+P^h%-7IJ#J_^>)U
zW|rXrEum`8dMlmEEaF+^2Rpdq1Ro7Qrk?*f2{_M^77I4eva+)ICXID(Wk7T
zK2y9;8F&~NqPDh-J3C=(u~=A`Z`aqhe*XS2u&{eAN3>^fR7gljgliKO0^VB^3&$Qk
z+ad|FT%jA|-vKd3tMQdUrMM52c6|e29s&YD;lj;1OQnhwa0w2DKuS(NxJ#PCY!t@h
z_3i@p{y_zRMTIgf1w%l*y$7QSyp_c%vs~Ak?IH;Hvo^B5C!?&^#;cYJ_;P5+l$4c0
z0r2x25w)4Rdg_AEJ{Vvbi~G>Frd1A|S~b#`F#TJOo8M~?l)xGRh~LPl2e%H5!GT|U
zH9-#qoPYW$rJuh51D|kgH2(}2m-Ekl$iSHmVx>ws-yM@bH1a_u9uw5k9{6W65g7bO
z_3kNFO%-y5ZkMu7mzPEH#CYOuRldbNr9dIsUf&0b-4(ADQx5;fc`|m)`w>`O`gTzf
zIVTra+LDgDv^479-71xc)~|1?QcZqZBB;EchqR&bML3C>yzXfuSKDr=mfwWW*^yyo
zw)aQkfBfDLP5HCvrxto_E?U6Az@UFJdjv{JM)=6exXB
zj*FL$j&%NEj8fx?*NmJxrrf*n(>y^ws{ufUj6jY4@&)oIbzCs;g_^FeFm3!>li7>!
z@st#*w|7&{8kbzH!RpdAC~uYU%Bx(C;(laEjm<8r-5kx_d>UYi(!pPp?kq-W=_N
z4zA}F!=Kl-baqwqvx_J%K-!#b_QMnKvfRvPl-q(WV2mZY0HI!3H0^T
zQMWI6#d>3M9n~6k3`gK<7_*j^);x^nl0MhCx!*shi}f`9`u1Lb`8t<_i)$BPzVdQd
z@NaPc4EBNo(iIe<-u~ZH2Z5Loi@M>FAr!P8mcevv#Q2Qlx~ftIk4o-U<>m3Wu-{$w
zW5tH~?IX6+2V=Ysu~xP&b8~YAf1tD>%;`Uh50@?2NIGkq?*h)&jQrpEc@_IoiE8>8
zJuIoJCgJn2fEQONwU%42Mk~$!(Zr{6nv`_OP9TQ#aO{Pj!KeLrf4{#M&0j>V2qUMS
z=$Zi_3|QPBEm?i$98(bLV4DAVCRKco&(F_tN*;olILkwu$bch?(3F8RQ
znK8!OLl=6-MGKvhm^BDoaU{EgX$#3T?V|>;LLtgz(~CV_MORkRZElXX!?6>PnNEQt
z^7y2u<2pGx{g=*m(TepG+!)nXmB1ZfBTDK{0WB>&_cKS@r8B@|_-CKv#7?86a64D6
zv-hS8`hSa!kMC=BtP8>C$iRh)9vmYJ0UC0*ZQI4lbP*XD1pjaFc{Ty;_D7Sf#D2N^
zsIXG$Zit|(5S*>v-U}qAK&63}x#@Q77VVCL5O_mF!*UY!M;9P_be{yD?a%7|Wko)T8D>mho`vp8t+lD+`LJEp>2X4yu)U=M9PLT6I-IHW=Oz_
zii&W6(FHAP(>1XaDrpyq{m>uKdf`aKfy!G0Bzwl{Dl7ezj10U)7e5amttVQZoQ#Rn
zHtQUW&0;+K_wQdo-pXsPsU+JDHqh}3Qu&G=%`YwjfL#$w%X3Gn|IJ`|S}Zrl7Kzpo}B&w-b5OJj<43
zuAW;g;lTm6plXssE3gFx=~yZE7TBBwfhx4nYYkn_d4=Ox2+Qdc!1Ns!iu$oPGoTkP
zQ%nK~9>6@lSA)1*u9KjqAMOF>Vt?TT$jUx;(v)34yoN4{an6hM0~#VWwxr_{O6!nl
zld;Arkir$#^E*({4L`ayzP+Glm%RMEkcK}wj~1ZDhyxq6O@A6cQE)o&)17XPM>{su
z)?jyGpyL7pqYuVUGC|A%Mt=d-G(1bK1L6_sh_bRWqyCm5a&mGgD=TBrpg~6G8I}>v
zusPbWA&I=aya3eZ7a%w=kl?^T;^X7h{H05mO4rF}8hSM?Q^bd}c2p=aqES{>#>|;B
znLBqbIXOAxiVZfQAs#FM8l`#XMt1SM`b4cS;XG{IKlRdR$Rj3c$Xv
zx2eb1N!T-3gn*GwjvW?su{2^M;t{S^M^0)woVyMk1&rlQgbPMd#TgDU!
z1M~P>r($Pk&*jTa?E88fRaI4L6MP+}qsIhPV$~_;hN}@8Ob{qAG?I}+Zbw_&W=ipN
z3&hdWse_xAAfC{A1%Z2lmZl~uN=s>xBqlhxlA5}Un{S@P!Gn7k@8HVbOZAkMm0@$;
zDb+0Wst+jQ!?llBXHB@ewvC1uN->cx49$XY?MFs>D*Zm*v`MO|uO~D#lP7cit(35)aWZIzK4U
z`bC^XQSLfSgV_?WysC&*gYybcN
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 1ea03dfe..caa7c319 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -39,7 +39,6 @@
desc = "A vending machine for all your unmentionable desires."
icon = 'icons/obj/citvending.dmi'
icon_state = "kink"
- circuit = /obj/item/circuitboard/machine/kinkmate
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(
diff --git a/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm b/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm
index e70028f5..e98b31fb 100644
--- a/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm
+++ b/modular_citadel/code/game/objects/items/circuitboards/machine_circuitboards.dm
@@ -1,8 +1,3 @@
-/obj/item/circuitboard/machine/kinkmate
- name = "Kinkmate Vendor (Machine Board)"
- build_path = /obj/machinery/vending/kink
- req_components = list(/obj/item/vending_refill/kink = 3)
-
/obj/item/circuitboard/machine/autoylathe
name = "Autoylathe (Machine Board)"
build_path = /obj/machinery/autoylathe
diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
index a038476e..468e458f 100644
--- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -27,6 +27,19 @@
var/moduleselect_alternate_icon
var/dogborg = FALSE
+/**
+ * check_menu: Checks if we are allowed to interact with a radial menu
+ *
+ * Arguments:
+ * * user The mob interacting with a menu
+ */
+/obj/item/robot_module/proc/check_menu(mob/user)
+ if(!istype(user))
+ return FALSE
+ if(user.incapacitated() || !user.Adjacent(src))
+ return FALSE
+ return TRUE
+
/obj/item/robot_module/k9
name = "Security K-9 Unit"
basic_modules = list(
@@ -62,13 +75,23 @@
/obj/item/robot_module/k9/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/sechoundmodels = list("Default")
- if(R.client && R.client.ckey in list("nezuli"))
- sechoundmodels += "Alina"
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in sechoundmodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/k9_models
+ if(!k9_models)
+ k9_models = list()
+ var/list/L = list("Default" = "k9")
+ for(var/a in L)
+ var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a])
+ wide.pixel_x = -16
+ k9_models[a] = wide
+ if(R.client?.ckey == "nezuli")
+ var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-sec")
+ bad_snowflake.pixel_x = -16
+ k9_models["Alina"] = bad_snowflake
+ k9_models = sortList(k9_models)
+ var/k9_borg_icon = show_radial_menu(R, R , k9_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!k9_borg_icon)
+ return
+ switch(k9_borg_icon)
if("Default")
cyborg_base_icon = "k9"
moduleselect_icon = "k9"
@@ -113,13 +136,23 @@
/obj/item/robot_module/medihound/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/medhoundmodels = list("Default", "Dark")
- if(R.client && R.client.ckey in list("nezuli"))
- medhoundmodels += "Alina"
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in medhoundmodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/medihound_models
+ if(!medihound_models)
+ medihound_models = list()
+ var/list/L = list("Default" = "medihound", "Dark" = "medihounddark")
+ for(var/a in L)
+ var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a])
+ wide.pixel_x = -16
+ medihound_models[a] = wide
+ if(R.client?.ckey == "nezuli")
+ var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-med")
+ bad_snowflake.pixel_x = -16
+ medihound_models["Alina"] = bad_snowflake
+ medihound_models = sortList(medihound_models)
+ var/medihound_borg_icon = show_radial_menu(R, R , medihound_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!medihound_borg_icon)
+ return
+ switch(medihound_borg_icon)
if("Default")
cyborg_base_icon = "medihound"
if("Dark")
@@ -234,10 +267,25 @@
/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Heavy", "Sleek", "Marina", "Droid", "Eyebot", "BootyF", "BootyM", "BootyS", "Haydee")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/med_models
+ if(!med_models)
+ med_models = list(
+ "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "medical"),
+ "Droid" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "medical"),
+ "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmed"),
+ "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamed"),
+ "Eyebot" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "eyebotmed"),
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymed"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootymedical"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootymedicalM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootymedicalS"),
+ "Haydee" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "haydeemedical")
+ )
+ med_models = sortList(med_models)
+ var/medi_borg_icon = show_radial_menu(R, R , med_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!medi_borg_icon)
+ return
+ switch(medi_borg_icon)
if("Default")
cyborg_base_icon = "medical"
if("Droid")
@@ -276,11 +324,23 @@
/obj/item/robot_module/janitor/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/janimodels = list("Default", "Sleek", "Marina", "Can", "Heavy", "BootyF", "BootyM", "BootyS")
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in janimodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/jani_models
+ if(!jani_models)
+ jani_models = list(
+ "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "janitor"),
+ "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekjan"),
+ "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinajan"),
+ "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canjan"),
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyres"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyjanitor"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyjanitorM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyjanitorS")
+ )
+ jani_models = sortList(jani_models)
+ var/jani_borg_icon = show_radial_menu(R, R , jani_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!jani_borg_icon)
+ return
+ switch(jani_borg_icon)
if("Default")
cyborg_base_icon = "janitor"
if("Marina")
@@ -311,10 +371,20 @@
/obj/item/robot_module/peacekeeper/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Spider", "BootyF", "BootyM", "BootyS")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/peace_models
+ if(!peace_models)
+ peace_models = list(
+ "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "peace"),
+ "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "whitespider"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootypeace"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootypeaceM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootypeaceS")
+ )
+ peace_models = sortList(peace_models)
+ var/peace_borg_icon = show_radial_menu(R, R , peace_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!peace_borg_icon)
+ return
+ switch(peace_borg_icon)
if("Default")
cyborg_base_icon = "peace"
if("Spider")
@@ -336,10 +406,25 @@
/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Heavy", "Sleek", "Can", "Marina", "Spider", "BootyF", "BootyM", "BootyS")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/sec_models
+ if(!sec_models)
+ sec_models = list(
+ "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "sec"),
+ "Default - Treads" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sec-tread"),
+ "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleeksec"),
+ "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinasec"),
+ "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "cansec"),
+ "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidersec"),
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavysec"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootysecurity"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootysecurityM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootysecurityS")
+ )
+ sec_models = sortList(sec_models)
+ var/sec_borg_icon = show_radial_menu(R, R , sec_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!sec_borg_icon)
+ return
+ switch(sec_borg_icon)
if("Default")
cyborg_base_icon = "sec"
if("Default - Treads")
@@ -377,10 +462,25 @@
/obj/item/robot_module/butler/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Waitress", "Heavy", "Sleek", "Butler", "Tophat", "Kent", "Bro", "BootyF", "BootyM", "BootyS")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/butler_models
+ if(!butler_models)
+ butler_models = list(
+ "Waitress" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_f"),
+ "Butler" = image(icon = 'icons/mob/robots.dmi', icon_state = "service_m"),
+ "Bro" = image(icon = 'icons/mob/robots.dmi', icon_state = "brobot"),
+ "Kent" = image(icon = 'icons/mob/robots.dmi', icon_state = "kent"),
+ "Tophat" = image(icon = 'icons/mob/robots.dmi', icon_state = "tophat"),
+ "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekserv"),
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyserv"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyservice"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyserviceM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyserviceS")
+ )
+ butler_models = sortList(butler_models)
+ var/butler_borg_icon = show_radial_menu(R, R , butler_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!butler_borg_icon)
+ return
+ switch(butler_borg_icon)
if("Waitress")
cyborg_base_icon = "service_f"
if("Butler")
@@ -419,13 +519,36 @@
/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/list/engymodels = list("Default", "Default - Treads", "Heavy", "Sleek", "Marina", "Can", "Spider", "Loader","Handy", "Pup Dozer", "BootyF", "BootyM", "BootyS")
- if(R.client && R.client.ckey in list("nezuli"))
- engymodels += "Alina"
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in engymodels
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/eng_models
+ if(!eng_models)
+ eng_models = list(
+ "Default" = image(icon = 'icons/mob/robots.dmi', icon_state = "engineer"),
+ "Default - Treads" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "engi-tread"),
+ "Loader" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "loaderborg"),
+ "Handy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "handyeng"),
+ "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekeng"),
+ "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "caneng"),
+ "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinaeng"),
+ "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidereng"),
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavyeng"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyengineer"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyengineerM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyengineerS")
+ )
+ var/list/L = list("Pupdozer" = "pupdozer")
+ for(var/a in L)
+ var/image/wide = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = L[a])
+ wide.pixel_x = -16
+ eng_models[a] = wide
+ if(R.client?.ckey == "nezuli")
+ var/image/bad_snowflake = image(icon = 'modular_citadel/icons/mob/widerobot.dmi', icon_state = "alina-sec")
+ bad_snowflake.pixel_x = -16
+ eng_models["Alina"] = bad_snowflake
+ eng_models = sortList(eng_models)
+ var/eng_borg_icon = show_radial_menu(R, R , eng_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!eng_borg_icon)
+ return
+ switch(eng_borg_icon)
if("Default")
cyborg_base_icon = "engineer"
if("Default - Treads")
@@ -487,10 +610,26 @@
/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Heavy", "Sleek", "Marina", "Can", "Spider", "Asteroid", "Droid", "BootyF", "BootyM", "BootyS")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/miner_models
+ if(!miner_models)
+ miner_models = list(
+ "Lavaland" = image(icon = 'icons/mob/robots.dmi', icon_state = "miner"),
+ "Asteroid" = image(icon = 'icons/mob/robots.dmi', icon_state = "minerOLD"),
+ "Droid" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "miner"),
+ "Sleek" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "sleekmin"),
+ "Can" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "canmin"),
+ "Marina" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "marinamin"),
+ "Spider" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "spidermin"),
+ "Heavy" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "heavymin"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyminer"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyminerM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootyminerS")
+ )
+ miner_models = sortList(miner_models)
+ var/miner_borg_icon = show_radial_menu(R, R , miner_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!miner_borg_icon)
+ return
+ switch(miner_borg_icon)
if("Lavaland")
cyborg_base_icon = "miner"
if("Asteroid")
@@ -531,12 +670,21 @@
/obj/item/robot_module/standard/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Standard", "BootyF", "BootyM", "BootyS")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/stand_models
+ if(!stand_models)
+ stand_models = list(
+ "Standard" = image(icon = 'icons/mob/robots.dmi', icon_state = "robot"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootystandard"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootystandardM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootystandardS")
+ )
+ stand_models = sortList(stand_models)
+ var/stand_borg_icon = show_radial_menu(R, R , stand_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!stand_borg_icon)
+ return
+ switch(stand_borg_icon)
if("Standard")
- cyborg_base_icon = "standard"
+ cyborg_base_icon = "robot"
if("BootyF")
cyborg_base_icon = "bootystandard"
cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi'
@@ -553,10 +701,19 @@
/obj/item/robot_module/clown/be_transformed_to(obj/item/robot_module/old_module)
var/mob/living/silicon/robot/R = loc
- var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Standard", "BootyF", "BootyM", "BootyS")
- if(!borg_icon)
- return FALSE
- switch(borg_icon)
+ var/static/list/clown_models
+ if(!clown_models)
+ clown_models = list(
+ "Standard" = image(icon = 'icons/mob/robots.dmi', icon_state = "clown"),
+ "BootyF" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootystandard"),
+ "BootyM" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootystandardM"),
+ "BootyS" = image(icon = 'modular_citadel/icons/mob/robots.dmi', icon_state = "bootystandardS")
+ )
+ clown_models = sortList(clown_models)
+ var/clown_borg_icon = show_radial_menu(R, R , clown_models, custom_check = CALLBACK(src, .proc/check_menu, R), radius = 42, require_near = TRUE, tooltips = TRUE)
+ if(!clown_borg_icon)
+ return
+ switch(clown_borg_icon)
if("Standard")
cyborg_base_icon = "clown"
if("BootyF")
diff --git a/tgstation.dme b/tgstation.dme
index 4cbf1000..707d6240 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -168,6 +168,7 @@
#include "code\_globalvars\lists\objects.dm"
#include "code\_globalvars\lists\poll_ignore.dm"
#include "code\_globalvars\lists\typecache.dm"
+#include "code\_globalvars\lists\vending.dm"
#include "code\_js\byjax.dm"
#include "code\_js\menus.dm"
#include "code\_onclick\adjacent.dm"