From 0bf9553eca3e60932de32b20b6be8803f823c335 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Sun, 2 Aug 2020 19:13:39 +0100 Subject: [PATCH 01/63] hmm --- code/__DEFINES/traits.dm | 3 ++- code/modules/clothing/glasses/_glasses.dm | 18 ++++++++++++++++++ .../modules/projectiles/ammunition/_firing.dm | 5 +++++ icons/mob/clothing/eyes.dmi | Bin 13828 -> 14231 bytes icons/obj/clothing/glasses.dmi | Bin 14889 -> 14930 bytes 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3e5b27d376..e8f584cf75 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -178,6 +178,7 @@ #define TRAIT_FREERUNNING "freerunning" #define TRAIT_SKITTISH "skittish" #define TRAIT_POOR_AIM "poor_aim" +#define TRAIT_INSANE_AIM "insane_aim" //they don't miss. they never miss. it was all part of their immaculate plan. #define TRAIT_PROSOPAGNOSIA "prosopagnosia" #define TRAIT_DRUNK_HEALING "drunk_healing" #define TRAIT_TAGGER "tagger" @@ -202,7 +203,7 @@ #define TRAIT_NO_ALCOHOL "alcohol_intolerance" #define TRAIT_MUTATION_STASIS "mutation_stasis" //Prevents processed genetics mutations from processing. #define TRAIT_FAST_PUMP "fast_pump" -#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good.... +#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good... // mobility flag traits // IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 01effea6f2..c749ac53ed 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -149,6 +149,24 @@ icon_state = "eyepatch" item_state = "eyepatch" +/obj/item/clothing/glasses/eyepatch/syndicate + name = "cybernetic eyepatch" + desc = "An eyepatch used to enhance one's aim with guns." + icon_state = "syndicatepatch" + item_state = "syndicatepatch" + +/obj/item/clothing/glasses/eyepatch/syndicate/Initialize() + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") + +/obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) + . = ..() + user.visible_message("The cybernetic eyepatch beeps as you place it over your eye. You shall never miss again.") + ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") + +/obj/item/clothing/glasses/eyepatch/syndicate/dropped(mob/living/carbon/human/user) + REMOVE_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") + /obj/item/clothing/glasses/monocle name = "monocle" desc = "Such a dapper eyepiece!" diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 0ef4c680aa..4f886c12c0 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -36,6 +36,11 @@ if(isgun(fired_from)) var/obj/item/gun/G = fired_from BB.damage *= G.projectile_damage_multiplier + if(HAS_TRAIT(user, TRAIT_INSANE_AIM)) + BB.ricochets_max = max(BB.ricochets_max, 20) //bouncy! + BB.ricochet_chance = max(BB.ricochet_chance, 200) //it decays + BB.ricochet_auto_aim_range = max(BB.ricochet_auto_aim_range, 3) + BB.ricochet_incidence_leeway = 0 if(reagents && BB.reagents) reagents.trans_to(BB, reagents.total_volume) //For chemical darts/bullets diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index cd2b84a143686f3bfa15ead89f2cc156b6e01323..9a52ce14819e4aefce0315efc6e907e130270fb6 100644 GIT binary patch literal 14231 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 literal 13828 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 Ai~s-t diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi index e8ba88a12f28af2912d0aed95862172a6d4c713c..4fce479a9d2eb5360d9964a6318a9b5d61c96772 100644 GIT binary patch delta 14180 zcmY+r2Q(dF7dAQv38EamM~@yNdUR0}ogktlL`k&h-5`4Jy_4uf@15wKAUe^B9Np3W z@qOR@@4eQV#hf!{-m=T{JbO=}!-PW=BdoFFNj?nZ*VH=W{p#g)ZrGHcSUN9u_>*Qt zWfE>5;jjh(w19%Nq^3*SLAtvK(e%x^IHezL0|B8$D62m})##uShzIC7JTpjmu=s_AkPTBx21b{xW!-ZY{xFAoh(5>FQI;|VSv8n+!? zEJBDLEDl?O`OK$2B+p zy49Vmm@%zi%gC>ogyDWnLD@a^wrwBmDKl>4KieKg2k(K7tDU3Q5q_1Gl|)Qhnwozq zl^h>Co0qanJ(R|K8Fb=+#Y3D}j`mC~_X4XH-0t`73e>)|lv>cKw+&jhx3l{=SuuZb zlM?FoPFI!C5+l0Ksb;N=kc6O&rB1i><#YHmo&Mor6DupL*#`UknYNjY!NjV6|Gro* zHuB+tvGQDr?*8Uv3odqcb~=iRVJh?Zxld}yqhYS?x6Vr+!na0qYig!*k@)!dI;|cJ zpfz*G^k)+wDn?}9gr=y79iM~%w`z`K#=ayswROB#JPO&+&|tautCZ;$Q{L3B_pviA zJA3i66$vqMMctCyYyPLU!fT^m6WFxBhV2$t@FNotXz1t+%*=trL_{t}!nWM>%56$N z_*`8>;xh(E1sd2j689ucO}|SSk7kH6fzBqocA|J(pH+e)A|7Tf%Ouq~@x4w;2+GN! z2ikG2Y6M*Ee5zC5zI_XL|NJSduh_S}P9yL6^ccpd!OF_oF}t$jRcBjRj71VE^Fa$5 zDz>-vcoYNriC|opxm$#y-ko2Y5Upb@yPzOhbaa_d{Gzp-wl?X$Qe8mM`YGGr!#kp_}_I(VPw-PKG4 z8sh9d_@0b=)XyLF$ytd}wJ_w~HT+dbG+FTAmk|p>1j%6S;<*=4JCYB4;j=mTyg4e< zK8y}XX*}s77k<3W5<8&6`Cgur@58=Be;Q{FwziqDQlFtGP+!)5dSPLtSFe)ZYzACiW1vIl~;SErA1OTe^9vt*_`|10~e{bhYp8J){N56tHT>; zxz_RVxYqS}Dl|BkD^0N8HQ0U2Y1j{-#j9i0v z#)CT>o!&-Uu;bn;fg5m4l z@}7}*Gt8jRzrhxl{Z3ZEd!r!`2B5?8L~BS_6VrcIj~n1%olKKr<~6uT>HgMko!>>ZJof%5w!1FQ+i38d`b`6M@8}HI+bT@x!_PO>`DaGCEx*6%aou!) z-S^ScjjsyHz|I~Td`VG(MLpK*0l<4<8=ISzw%UfJb75 zR9y2vX~)l8N`(2N^m((vm>{h$E%sOX*e_hfv0=2>U{?NWu%yE8ljAUbYnjmv(;tJS z+XuC|b;X#OC)X~05w3K41N}Doa?EyGk6ADrnL;JxSCA-q(DaG*YT7?umIuS;U z57`~^DM;304A+Q}@(;dc596*67(Ea&`5CE?_xS5h zU0OVi{z~}P0Y<*>*p}r1`%H}mAE6|U7LP*W}B8)R&V0oywRrT zU|cZKQqCRfgUr5a4jcF}XNlTMbGw@=cH35Rc1vqi2uvGm-`lT%1g*(0SQ>`qXiGytQF+?Jj4*uD&@Gy{D5n zDt+8=BhS_9)Q6io91s+QA=5IxQ5bUgW;)*d(9-@>B@QG1v>5Ia@P@n4CP}Plzf*j0 zWVLI3Q9Mb9e+7 zb*Pat%C+%wiTk)Fe}%K`b8Y z=KZ9Ik1$|m;+p{Rvd>Kf>+3V2R(r+~LrV+0hB0J7!P z{lwZ5oow?Zol>n|OLLo{Veh1#+WgQ2&JxUEK=e9I^x$(2Gn686=bg+JWcs2Q=@|20 zt!TEJI!(V$>pE0CdK$U8%G&a*+FC6GnbE%O2+tiCi}gWZ0PsL*CwG-M353n^4$62$ zgbjdscP4c^^k%Z+DwL z-M)QBoGV_6KDIX3@qlb;|FgCAnT2rfpvHK*IyBeFrZ@yfut3j%b}ii#*IN3!)kw@w z$?%BRS9G#ECe9qPPD(htA))w>fEO|nx|^WJ<^|EI{VOGw;f&IzR^}-pT^(1_sF>~6 z>$3)L6{Tv;_rC(Qf!Pfi_p^O&6I0XYX2~Bt(<4$(GDO`K|9=Rhj(_uo7gE}w)^Sfu z!`hnDo+8$wL04QrAo0>jYHKimEv1qouamXsbTm=rfv>m4SU_<2I_OhLQhqA>N@@_( zT+Tl97!J(Xq=poi9rna)NMfXm!xLKty~Y2A^(u{L8lAN`uXOFwAQzZQ3yX}h@$vuh zq5pY3A}4L>OZV=#rp^blAyb|K6{?py@`5?Jxx^c@BTynQ3%%6&J)iCz^R_B)biLOE zRrhFIZq{>Bsjn>h7UXp7>DiWlC1o!2;04tsDR`us-T7W>sV~mjZ6f*NZw%T(ZPTM~ zbF8rOL%20ZWGfS2SM~0F7?m?bHC0B>@rBvMPD6m2gN^MG9UYyZ`&r3rToyLAS7q}H z3neTwU4C}<_H%_AF+Wdd1e*T5cS+WQut{8M>L9N8La+t+%Hm5`Tbc8?_+^_iO#Z>Z zz?ZI`y_R3+jieJ3B6;2+^K=}%6NCTbIN#|TL9Je`An#@N->7T%kLePY#hP4CnF zWEwXbOaxPWf@{$5(-y)ps-?W~d-#&;jN(Rn(vp&pUv4XLSaOA%iswv>n~{)$?QGf& z0|L5SXdR!wwPIVVPn1|f^sE9#iERaxeV*K)Ze}h&iSy9dHhC`RRfqrIW8d_pQq&i(~wUx@;28z&#q)H z0<6o|SE5JP!J+Q8`9o9a(I0-Qx6~@*5o9>jolmp>GOP+G(-DdARz7r#3%|WOpB)A# z4UBaM54}DHP+i_KRh}p7w+eA)#YCWuj3|r{&I{&huK@TJyvc;oH+{7 zmyF3uPzbZzJSuy@Kwmy=F z{qC3YC=ONWZ~)%1%qjze7kd8yJOTog(id(+S_91PiV7JAb~qtCXAeKC_et!Y zTS%_guNQhvb?DB&MuZq~u+GX)aKs|WKJPLTPT`g2Mxb@Z3DmU%n+$xU` z4(B!W&xK8;Q0rLSRUW?UueF&sI{MjMtrMHr%c}*(mjB-QVJ6&j!F^DIC_tw+V+=>dd4APeCZtl&) zg>Cu;kBiX-KhDp3EVnVq$^EZhz4~D>!wE?Im-~OHo5v?7#{_~xLtmCM%zUhyhXH1z z88W7(Ovk-`2_A>I&DTeRK^T~w;4teX;Ya?O^3R^yStw=L3Hw+o%*XK_wgy~#6(+T3g^>l$O_N_mVxD^7W6<| znzOfrUu1C?bT~*}Kc$r+*)8a_MGS6)hlks)A#YRg1?a2=(;%H>4&1I!XjC>c%QsX@ zbwMN^xN7Lu8~LwEp#xOnWjf_Wjp_!=nR_Zz;weTbV-aCI{Mt9q0g~kt(a*koOni+T z>znp=*9y`M6yfIGYcV~u7IS-ccy38}0-1HU7c9G@ua{+BKKidJ^6g~s&nBt_KV1!k zN&fW5nh+AyZGho)2e*^&jz%*zJ%WEf+=*PAnkX#D=ciG2aG(NK;KEK_F&UeMC0PBe ztb%9bwt9}!Z^+zFbsU_XQ331v)rTHhZ~P-7aI2m50YGo3)fd7C3vv9EG}J=A_gd0A z$SJ;DZ0{{cz1v6s;zeVE07$h_Q)I`>&p)uY2NMA4PM;&LewDtvDqY9Ax00)ka>m$X zKCCCMu6EV2&z|DDSa5Ypb&fC1G0Cye-x`3>MS{OAVicK(1*iUoIT3t+VuZ_fGjTZM zZ9sWP@%{ZH*!UIX*`oDoA-sNJ%p5GsO7l`QM{4I5<`4$mW3eb zGKI>b6p&jJ#^d}~ujE~w^0?m7l;6F*yPa&QRJ@v(0~*I%v$5#beaBt1U#mq@!VQ<^ zHmGKoW?2r-eIH6Kri$UM*lcbs{LA$HquipUPjfl$ovDznI)b)Kzp%R>n>ZM+vvzES3_m+_zillLrX*Xc8Hcw~mgL_O$M>6S%^qT{q8DL#17?S z_hDe!mmfZ3u{jYz4O@m6M$Ot`wUX z+(25!wQ1loVo@J9jeq>CxvmhJ%D>RxP*j69M(D7!>8C68ujN!Q>lA&X`Tc^oa^{P0 z&@5wVd;CRYnITqd1ocC-`V>3?8tP$b8JUKX+{DW-B0B~&*82bGGyc3miFPMfEa+V> z;M$dNY=isVX7SUu3z1cDy?DVXQ9?sW8c5iyvVFv%W7z+(lqo)A^Cezax}*?+?(iR0 zjVlgu&s|<%Mam2v*ftfDSPqafeTjF=O~JxID-q)Bp+B?yom3JJwJVDc5;FqCPh_QI zZMldbIfFjdnt&DzqI-QGJRQ$|uV!UhSNw1Y?Rn-YN{dR5(fN#b88baT{@a&nNDEHX zPAl50e`%rLDXMGVz9;GC_5#(rD-eF(pwDoM`t4vxjI4AtH@WM{6Q6PLWlG|~Klp+Q z-j2fK%xZBR4y*HGcj9?R*C*@(B-T{dSAPl-A#P?CBd4GR=dKlg#_DMGi0=HS&!17o z+AgsldaBesJ`H(nNP4OrnV>cBW*_P=hp#7 zjcSIAr9?NU`>}lzW;=#0kVXA|hD=Q>5$`tdr{tMPIl=vselarX*7|SOII_X=YDD-@ z(*ryn7SIQOxgYg2-(rTjNhjNezX)m(rZ_-gURzH%kBh zohk9)stTS#)nqQ=wkNE({-AdT9nfY_CsS44rLR%IkUjJ5@}U0rQ=V!w`-0M?vGx7? z9^B)%c_w1s=nuPxdmG&aNV;FEjosRB{a_WIXD6Hhf7c3oIh-$I1HQfCU3m(}000#h z>|EvK3UkED8Gh|;v&hW&V*%cYcmL4KhwmlQlG<7l(cbjZsaon!FE$Z{*?o%F%)on< zjhV$?!BAebwk|WQs*4_q>N#D3>RnR)4F(k1^)%j+ zfzQ-oR3@BArQzY8_Z+myM}&4{7?1Rr%($H5o}vImKquPY5J%5oBO<0a)f$X9n7{&M zG@IS-45SdIymz(GuKE%6W!93PF-;g9CNQfm%31l z>w3H0OCm6}=xB4NA-Y2g={N`xq@<+eHB}s=X)nZ2PEIE0hAmfkh#~k+^MyI3dmBn4 z9-(~Wq847UyI%14V?xNJ$U;K8ZPb1}3+q7$@ClF#hq1m#?vP-;RNlopLdgeVqCoy- zACiT|T~co)^0M#hpDguDsW;r-yqZt`3AfSHzq)(RZJ$Iae#^_K8J|OQ4C9R%laZ16 zUQ)urwCQyrGD`n}ZWWR#u*|*Wc!?yQ6XV(#++4I?=@_0~F9lL>)i#zn^otudUbL>~ zr!M}&cipe(P2ytuQ{UI~h3pGx;4z}AEx~mheL6WwzL}J^*~uj)r_QH}T&pO~#fra_ zXuj}&-gYKwyD#;Rjt2BTg(t=(QK|J{6>SF!6n__N1kfjSIQhOPtVU8k5=o`Nfmi%TTxYZes?ii+Wh+volVWgQ|9&evp6nu~{eWSn;4l~4-A`hl zJ!NA3?BgEj8O9SH{kd>lMDM9U&7f*4Ll&jsX-30|HuG{XS$)VCsBc|*jKch(LP<5cS$ z>bxz@yfj&v81m_1B!j3{Vt)J)6^uQ2oDLPm0;-$2W0}TmKS4GA6=Y`xYEfSGdqo(} zibDl!(W_VRpjMtomsGoX4$4Iu;=m@u;n%7Cm=W>7@u08F1u4wh6J%C3$&jK1?zl$vC$oT*`-N=O_1 z%W|}X$6b<@ii00I(S}3kD=gL8PsKx@E4O7~v#?C^lJ-`5(}-t@W{p8&3euHCk(aK* zER6PH3ML`b`%XVhYdI=ZA3mS|oSCTw>E#rx_%G^DtBuukj7 zj~V_;rA{ZQZZz;)TXZkV9QGs@B$h+6wn48Xo?q;-00TtVNI(}w6%{z)UFKX}D)C6> z;ql8|NEnxNkycTOwB!{g;Y0%%Is2q{yM+Et`|+B|KEd$CgJ%8#`leg|>dXhUBOv{V z0xaoQ`oY?*nw;IQiNs`}8=M3uT>itrh|0E4zepc;IC&=lTn<}95kfUPhx|(RL^YJZD%+rogSXd z2_#nh;3M%cjl%Re8#b{#C{+m9rS!aJcnkiBG618urV$q8-QWGOHcXZq&*wubA7haY z;729FQM`X0*-7W+^(lNB51Ohc8!NI+sC=`|VWJy<^Fip!dd}`lf3c4J=**`93joOE z?#t}qj`MRTZNw?Sd*t#XrDdHu&vup0Ceu+34_roBnmhR!8pV%90j@0(=28nDWlC(^ z;G0=*hVt{3zCF=`AFzteuRxj-S1C(DO*2)vlkokr+A>UZ_IUFfvM4-All>D(4v`zg zKJSfCO`GHOhu(^>o?bK<_1~j^|80#GTgBy;Voejz6m7Q2+*$R!QuO{PNX(zr$rNvK z>Iak9xD{oY*90U!2gu~*WsO@WhRcJmwRtdGE~ON9?`H=|kSIV2TfAaWss{LFGNggt z(?)h>nE8x`92*qQ!#MtaS2{*?6^X5N9{v)QU%35gTR~Su8}n*{;Z(MDmh^{fL?oK$ z>3%yD8bj=gr(dv`X8+JF6_fMQRjN?Sl}$DpM&BsAXgcdK;fOL9bIg?kQ8zY1tiBMc zN8<0=YhjQ3MKps{r?^daX3`5Tt?B$&a!ca4fZ!ruht2Wa|A%aAwn6l9Cf4Ufu2!rq z3&M_rVw(REsZ3v53x1@)NMu3E3LfUG`*GnYdey4z0ZrakYw---e6c^ABaEY%u4xTg(1 zPC;22Zbe0f0j28d^`&CiN5D$s2(1PaCSmDZN8fo=KSTp zS(W>zgmaT&E%*`ujLQVT*N#n#q-$+Q)q~Hi#f<5xeS>>oz|sp%8oV3B)FICM0(CVv zRjlke3a~5i_)$6WPLb|Zdqb(60FH|}~s6<*?n)ZV( z{i9kQB9egYmMSHKvP3U)8S2;Nea8L${TxC<$=`%q^R@qQgN`4~Yjl&%n_CGUlLtdf z-|gf)_&wWN9Tt;qsaqeF4#h?2c!%(7{^jJVo|;P8yBGIK z%W8Hc-mREs;Ya1WRjNPi(Lxv=(oBqv!1yEt2m1Q{FwYt_ zI~Gu5g9y9D9|;veR`G4=baW66YFeTQE`BmOu4Dg~wO+x!i1bH`r!rp=9~+jCIUO#Q zdN!T_3u@Hv#nglyf6s5k`av($LGmsdM93}weTI}@Js&=Q$y=9LspL}O!2e$josHqd zKabMJF989lGsYsnL|k9^vk7#|hEteKfFUVHO-*WopxC-v)QkoXm)Y{uRQ!d!AUl_% zh6au0KJ=)xmLA(WN^vg{NUesNSA2f`(t^z2H?eT=vfm6^J8>)9;^_h0gXrI<mHa`=DXL>f&oBw?M<5Cu`|3@14d-N6aQs&LWd|1nsHHvjp>7#Gopu&CQ znvnzJlm1JZ_PUQ3O|KJv$TlsSxGrvwuQX7NdjKZoWOuGp1!|A1DguYiP*E5O)hUOe zF!x-gX{SYI-(QuPqz6>hTqIm&nR$x;3dx{i$d0M+wU(4NU!hwXmWsEspRzSf2ii+y z7vT@@vXoTwKKS%$gT>*`G9=;OuWgfgG^C2s=U~d@$v^CMuUtqTjqt}plm~wA8?1Zk zqV_>b3 z_;UQ|4Jc{=W62EJQtZzNSU9IXkqMhg7CK=0?HDj*_>7a;jCR*M1-2FyHUY`rYW&kwwJH&-6=mbR$Y3M5)KvjKV3 zMWf8^wcMJoVxCyqy3_6(Q94iKQ%orv5ig>y#W*T&dmVn7CxsbTa&Y-&9Zz2jG^kjo z%iMN>whwJZbUiJh#@~La+{Lo1#iWz)Y33k_RW&psUK{GaFre40Jk{-58PuyS%vx3$ zY5uU39oqg|e4Vd%OP@jUuJz^|6|U6LMwN+Ls)FZ}V~A=*f)%Rvv^Y}$?)+GUW!b+b z!)@abjyRY4(LCSrOiZi7aw+=-6;Y1&Y6*DQdPN5IJlTToVmuG*5K7Y`1Tpn*M#L5b zKgAg(^Qu%|#e#D_s7we@%?osLSjNG@7-)0t-nD5tbv`QQ3?GBWN=q5_3zKaG^Q6?h zt(1ju+3&j-gRX_E5WTwkpS%JWy85s8bHZRym6lkOX;<;mPzWxhZf7<;TZ!dzSA}Pt zuSfzTV}^U23%UjovQ3Wa-(BA?Xxr;MowE;Yl)!PIj)=+Cd@+L2^8+9cLI z5A+{(#_fMfiV?+;O!WO>)e#C6mauYrX`*lcO(o*UH@_qq$sE1VEP~+0DR9xjp`s4235WZ#%+@eG*>m++j>D*RIH*=|7Sh`}-PrPc}J4%Nz zjCbRBu9|=w?*-$@wRq;+@kwFs9m?WSZntav9XRMIBXC`bimtfZzYSxhLHuj=Wa^b^ z2UrhP|8KU9AT-pA1edG7(1pIS(L|j91+)yqp&{*B9{+e>bv*glXM$#DeYtV7XZ4Cj zZboF~iUnP@xT$rJ5+7@8)NFSS`|`oc0W4?_fyG|i)HIsT09mDw?s}vPik`(aeq`s= zvD~E_-Ty_ilz0}usKM`bt(zAD@|R;iV>1-sPhp9NQg^;4^r_y#V2Fv5xx~K?UHw!2 zl=tJ&(Lo1)WuY|cF(C#)mBDn^$xeSu=-3}>UA#X+up1KaREmy52Or}AjRx#A}3C?#W-jy4!J;ZI|son8w8_!`3`DP4YD~VvK zrdaH<2fHEe*}hb|6_~Lpvl7g3l}mH)nmfBvW6jZp%Y0n8%ZF@oGtGjTr$Vxk;vsxA z(*8;VH)Pr3cKKMyr$2w#d(IO^g=8Pej>6?<9!5DiB_I8TrNCk zeORX$(vg}QdozI^Mh;3N8RV9&(DGVe-}?*X7w>EH8q$*tc(dACkNBA)3|QnOm#FKx zkU22$`ZT_d`{2yqj_5hTi3}=okKM+&^T2+CrSF|5pOL*X_btXNdkyECW8oZe=MNJ! ztw>M)j_$lCheneF;=q?rUbY^5w1y`=oA6$3RI(7H(Q#;QBFy!x`2BW%+&RCLdXD(Z zj?1}LUyB3J>Eu^Y>(xF+DBP_`PK|2pUV&~1xYCWMx%vRS{<1(VGbm35Nl)DprMN%J zHLpn<_+EG4kT^`|Sn^T>-aHQS36iy-!v``Mli;}y`+N><(w8~* z`$FtSOsJ}OJ^$w^mc_%?do$%aIgJzFiL~@AXJ+~%%Cjq6F-wK z<4s55p(7fjIs`~2DH5NnGK)igy-af(CQg47oqd=H!}lZ6RXGVY@o5F*!R_r>C@*~= zGuVQ7CGClCtPcSRXsko7+PH!9GQ*h;qf;Ot9%iC5Le_!>k=l+Q_Y63Ir0b_QRC?xX z!!Qcs=8%0PpIudpoU;u0 zFOH9jV@!NUK=@X{WaG!BF+M{qbak!e-18pi+hb5wAeYWc;zl|th^Z!F>!wNDiEuggGw-XLOPf9^l{ z%MV3D+ON6HKw;%>M&vzanbKc!98W;f<`Wdej|OePRhEoA>^!`a#c4*c8v{mv)+ zklUJV>DM{w683sD+^j1ArxF3xX>b8m4UMl~BRr3vpb+5X78LZw{jVb#YLW5t_xrl_ zPINJX>}lb!xhkb9oA>k8rU?&qRc$?N;D4WudOANUM%QPG_7c7HAFKWtZ+K?*)X3Pl=5%rDR94(-gi56L_$9BC z{LE13Irs+Tk7sMbG>nYdoqGor!3-S;E|7|b5euSxe0+}x36$<9d}P;R_j19*>9Cew z%nPV>P~8Pixh0hvnBdu@nP>R_PPI}0sTg)m^&AW!BW@fT zU@l*-RYVbJ?q3F%|NS{iwY>|a0aPjaQ!Q+I(kYi?b12Xw53a{@kvubPkxe<^((ycY z_hx)wqvIa5qo@*}Q!Xt;cA0dReou37Fj7HHXImpr0AOvs7>|%y>CT~cGfjK`oDD^{ z<}mV7k>}Bs?^^iC8mF%noE|KNE;Sp0EaHRb|%-kckCejURouy;Ng!F(4z4W-VfTSd{Z{tN=oPszr zJyCBQYr^I%ZhXUE+3&nIe4`EbtZ6v=R$f*d=ml8|@#aKgYhxKRQp6X=$g}#8K~^02 zr{~rBNy&ivxcatNW!aa{yHf<}tUvE(WKxdfL>_u<2_GRTL4HfsKc3CQmj$eBY|jx3 zIDldXMR~HthS2Qok;Kia6K#$#)F?&xn!N(D!CIj^fy1Zzjd2Y;nK6s$E@ImZCAu{s zt`=hSP!IOU|B=F>G0BqS7laL% zylVxwu>xYq?E7U5@$n18Uco)bRguD8HEKKATokV?ElY}9@$d`7i^M&b(onpApBXGP zAVftPu1$yZ?piGw)1Xr3Bc7e|+o97#V>c<3`!@${*VSygG$6MLbU$n%1uq8;$?n8$ z*QEda`I7{_?4bBJW^yTqKi=M>CdVYJ^obQ)? z53AV8kK0aLX7`C-@4E6RS&8jhQNK{#KMgjon)?B%8$kO-1g=>JVjalCi{@g3S_~>J zKJ&&-wC1#?20%u9VbZ#mw**c3)6T@VA$@)D-o5<_S{WXuAphs$P>&4p$(;*r@;LG zn$?5lR4tBCHR5HIpsB6ki~Z(iob+@mh+=v84y98^$z?>Sb$xBGRq>Sfad@EjEOo z0z5I6Xny;kK4lc$m8L~=_U5y-zWrWzpt0BIo6omO;!b8dkgedUI@xC)GnAApvjdOCKzh$JUt2=;R2BKDydMw9chVD1-s$WhCcjU{PiKo? z|GoP(Gw|TjLhSQYq+!8;qS0epa!Ho~RJaIjrg#QfaNX%ClWL@?dGeSy`Pe{nX5{af zyFF@00gu6+rSWo`s~cj+o2TU@`ZY%xCG5M%8NJkJHLcmJp-(T{{*GJZV=DTRkyZcv zi>-rp^40w>kAHxFs_wzl+0)(;^`T`UFjj4gab$d7p%b?B!1oz8ByGojAm9dvqsMkh z)ht^4boWfAbuW%k_M*#F@E9H>I!hJjuiM>?biZi5Hr#CC84^cc6uG3$i~mEK8IP>?U$}^n(?nKr`#{V*+IMrPV0VeK zl+hA;k)Ut+V%~ebOP$ehbf|xFKSpK~XJ?;2c_GhrW=c zWRVSlDi7V9@;|Kvntzcc_3=|a1_QYp iMMkU_?K9G@i#tYVR)d49@C*R@QIJuVE|Yri`+oqxvEyd| delta 14139 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 From 2bbe4631d6eb1e65d0227f6f7e201abda7939210 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 14:46:24 +0100 Subject: [PATCH 02/63] working ricochets --- code/__DEFINES/projectiles.dm | 9 ---- code/game/atoms.dm | 7 --- .../turfs/simulated/wall/mineral_walls.dm | 3 +- code/game/turfs/simulated/walls.dm | 2 +- .../antagonists/blob/blob/blobs/shield.dm | 5 +- .../modules/projectiles/ammunition/_firing.dm | 4 +- code/modules/projectiles/projectile.dm | 46 ++++++++----------- 7 files changed, 25 insertions(+), 51 deletions(-) diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 1bd67fbe02..0ed0d01889 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -1,12 +1,3 @@ -/// This atom should be ricocheted off of from its inherent properties using standard % chance handling. -#define PROJECTILE_RICOCHET_YES 1 -/// This atom should not be ricocheted off of from its inherent properties. -#define PROJECTILE_RICOCHET_NO 2 -/// This atom should prevent any kind of projectile ricochet from its inherent properties. -#define PROJECTILE_RICOCHET_PREVENT 3 -/// This atom should force a projectile ricochet from its inherent properties. -#define PROJECTILE_RICOCHET_FORCE 4 - //bullet_act() return values #define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. #define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. diff --git a/code/game/atoms.dm b/code/game/atoms.dm index de9df3a23e..852391112c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -156,13 +156,6 @@ return ..() -/** - * Checks if a projectile should ricochet off of us. Projectiles get final say. - * [__DEFINES/projectiles.dm] for return values. - */ -/atom/proc/check_projectile_ricochet(obj/item/projectile/P) - return (flags_1 & DEFAULT_RICOCHET_1)? PROJECTILE_RICOCHET_YES : PROJECTILE_RICOCHET_NO - /atom/proc/handle_ricochet(obj/item/projectile/P) var/turf/p_turf = get_turf(P) var/face_direction = get_dir(src, p_turf) diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 4466511acd..096f0a0b89 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -191,7 +191,8 @@ icon = 'icons/turf/walls/shuttle_wall.dmi' icon_state = "map-shuttle" explosion_block = 3 - flags_1 = CAN_BE_DIRTY_1 | DEFAULT_RICOCHET_1 + flags_1 = CAN_BE_DIRTY_1 + flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD sheet_type = /obj/item/stack/sheet/mineral/titanium smooth = SMOOTH_MORE|SMOOTH_DIAGONAL canSmoothWith = list(/turf/closed/wall/mineral/titanium, /obj/machinery/door/airlock/shuttle, /obj/machinery/door/airlock, /obj/structure/window/shuttle, /obj/structure/shuttle/engine/heater, /obj/structure/falsewall/titanium) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 37248f814c..ba88baea08 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -6,7 +6,7 @@ icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" explosion_block = 1 - + flags_ricochet = RICOCHET_HARD thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall attack_hand_speed = 8 diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm index a2a6ce94d3..a3a1403e58 100644 --- a/code/modules/antagonists/blob/blob/blobs/shield.dm +++ b/code/modules/antagonists/blob/blob/blobs/shield.dm @@ -45,11 +45,8 @@ desc = "A solid wall of slightly twitching tendrils with a reflective glow." damaged_desc = "A wall of twitching tendrils with a reflective glow." icon_state = "blob_glow" + flags_ricochet = RICOCHET_SHINY point_return = 8 max_integrity = 100 brute_resist = 1 explosion_block = 2 - -/obj/structure/blob/shield/reflective/check_projectile_ricochet(obj/item/projectile/P) - return PROJECTILE_RICOCHET_FORCE - diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 4f886c12c0..71434ece58 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -37,9 +37,11 @@ var/obj/item/gun/G = fired_from BB.damage *= G.projectile_damage_multiplier if(HAS_TRAIT(user, TRAIT_INSANE_AIM)) - BB.ricochets_max = max(BB.ricochets_max, 20) //bouncy! + BB.ricochets_max = max(BB.ricochets_max, 10) //bouncy! BB.ricochet_chance = max(BB.ricochet_chance, 200) //it decays BB.ricochet_auto_aim_range = max(BB.ricochet_auto_aim_range, 3) + BB.ricochet_auto_aim_angle = max(BB.ricochet_auto_aim_angle, 30) + BB.ricochet_decay_chance = min(BB.ricochet_decay_chance, 1) BB.ricochet_incidence_leeway = 0 if(reagents && BB.reagents) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f3d78af59b..faa96b3e61 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -316,16 +316,18 @@ if(!trajectory) return var/turf/T = get_turf(A) - if(check_ricochet(A) && A.handle_ricochet(src)) //if you can ricochet, attempt to ricochet off the object - on_ricochet(A) //if allowed, use autoaim to ricochet into someone, otherwise default to ricocheting off the object from above - var/datum/point/pcache = trajectory.copy_to() - if(hitscan) - store_hitscan_collision(pcache) - decayedRange = max(0, decayedRange - reflect_range_decrease) - ricochet_chance *= ricochet_decay_chance - damage *= ricochet_decay_damage - range = decayedRange - return TRUE + if(check_ricochet(A) && check_ricochet_flag(A)) //if you can ricochet, attempt to ricochet off the object + ricochets++ + if(A.handle_ricochet(src)) + on_ricochet(A) //if allowed, use autoaim to ricochet into someone, otherwise default to ricocheting off the object from above + var/datum/point/pcache = trajectory.copy_to() + if(hitscan) + store_hitscan_collision(pcache) + decayedRange = max(0, decayedRange - reflect_range_decrease) + ricochet_chance *= ricochet_decay_chance + damage *= ricochet_decay_damage + range = decayedRange + return TRUE var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations. if(def_zone && check_zone(def_zone) != BODY_ZONE_CHEST) @@ -401,24 +403,12 @@ //Returns null if nothing at all was found. /obj/item/projectile/proc/check_ricochet(atom/A) - if(ricochets > ricochets_max) //safety thing, we don't care about what the other thing says about this. - return FALSE - var/them = A.check_projectile_ricochet(src) - switch(them) - if(PROJECTILE_RICOCHET_PREVENT) - return FALSE - if(PROJECTILE_RICOCHET_FORCE) - return TRUE - if(PROJECTILE_RICOCHET_NO) - return FALSE - if(PROJECTILE_RICOCHET_YES) - var/chance = ricochet_chance * A.ricochet_chance_mod - if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) - chance += NICE_SHOT_RICOCHET_BONUS - if(prob(chance)) - return TRUE - else - CRASH("Invalid return value for projectile ricochet check from [A].") + var/chance = ricochet_chance * A.ricochet_chance_mod + if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) + chance += NICE_SHOT_RICOCHET_BONUS + if(prob(chance)) + return TRUE + return FALSE /obj/item/projectile/proc/check_ricochet_flag(atom/A) if((flag in list("energy", "laser")) && (A.flags_ricochet & RICOCHET_SHINY)) From 34e2bd626fed990b4189a51ad47042727afcba84 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 14:50:19 +0100 Subject: [PATCH 03/63] woops --- code/modules/clothing/glasses/_glasses.dm | 10 ++++------ icons/mob/clothing/eyes.dmi | Bin 14231 -> 14229 bytes 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index c749ac53ed..5673c2b66c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -155,14 +155,12 @@ icon_state = "syndicatepatch" item_state = "syndicatepatch" -/obj/item/clothing/glasses/eyepatch/syndicate/Initialize() - . = ..() - ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") - /obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) . = ..() - user.visible_message("The cybernetic eyepatch beeps as you place it over your eye. You shall never miss again.") - ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") + if(slot == SLOT_GLASSES) + user.visible_message("The cybernetic eyepatch beeps as you connect it to your eye, its circuitry embedding into your eye.") + ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") + ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") /obj/item/clothing/glasses/eyepatch/syndicate/dropped(mob/living/carbon/human/user) REMOVE_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi index 9a52ce14819e4aefce0315efc6e907e130270fb6..876159c25882f38b29f035341c2395cabdc61b22 100644 GIT binary patch delta 8576 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 delta 8531 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®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 From 9b34407c9f4764af1c6ad0bbbfb480e842be3020 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 15:27:17 +0100 Subject: [PATCH 04/63] uplink --- code/modules/projectiles/ammunition/_firing.dm | 6 +++--- code/modules/uplink/uplink_items/uplink_clothing.dm | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 71434ece58..3c38f4d783 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -38,10 +38,10 @@ BB.damage *= G.projectile_damage_multiplier if(HAS_TRAIT(user, TRAIT_INSANE_AIM)) BB.ricochets_max = max(BB.ricochets_max, 10) //bouncy! - BB.ricochet_chance = max(BB.ricochet_chance, 200) //it decays + BB.ricochet_chance = max(BB.ricochet_chance, 100) //it wont decay so we can leave it at 100 for always bouncing BB.ricochet_auto_aim_range = max(BB.ricochet_auto_aim_range, 3) - BB.ricochet_auto_aim_angle = max(BB.ricochet_auto_aim_angle, 30) - BB.ricochet_decay_chance = min(BB.ricochet_decay_chance, 1) + BB.ricochet_auto_aim_angle = max(BB.ricochet_auto_aim_angle, 360) //it can turn full circle and shoot you in the face because our aim? is insane. + BB.ricochet_decay_chance = 0 BB.ricochet_incidence_leeway = 0 if(reagents && BB.reagents) diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 014e0452b5..2d5d6c3d8e 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -97,3 +97,9 @@ item = /obj/item/clothing/gloves/tackler/combat/insulated include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) cost = 2 + +/datum/uplink_item/device_tools/syndicate_eyepatch + name = "Mechanical Eyepatch" + desc = "An eyepatch that connects itself to your eye socket, enhancing your shooting to an impossible degree, allowing your bullets to ricochet far more often than usual." + item = /obj/item/clothing/glasses/eyepatch/syndicate + cost = 12 From 2153f9ea35be974b71983f9c5ec13437aa1359c0 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 17:36:40 +0100 Subject: [PATCH 05/63] i too, want people to be hit their ricochets --- code/modules/clothing/glasses/_glasses.dm | 7 +++++-- code/modules/projectiles/ammunition/_firing.dm | 1 + code/modules/projectiles/projectile.dm | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 5673c2b66c..39c9bcdadb 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -158,12 +158,15 @@ /obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) . = ..() if(slot == SLOT_GLASSES) - user.visible_message("The cybernetic eyepatch beeps as you connect it to your eye, its circuitry embedding into your eye.") + user.visible_message("The cybernetic eyepatch's circuitry begins connecting to your eye as you put it on, making it immremovable.") ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") - /obj/item/clothing/glasses/eyepatch/syndicate/dropped(mob/living/carbon/human/user) REMOVE_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") + var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) + if(eyes) + eyes.applyOrganDamage(30) + user.visible_message("Your eye stings as the circuitry is removed from your eye!") /obj/item/clothing/glasses/monocle name = "monocle" diff --git a/code/modules/projectiles/ammunition/_firing.dm b/code/modules/projectiles/ammunition/_firing.dm index 3c38f4d783..437b7dcc5a 100644 --- a/code/modules/projectiles/ammunition/_firing.dm +++ b/code/modules/projectiles/ammunition/_firing.dm @@ -42,6 +42,7 @@ BB.ricochet_auto_aim_range = max(BB.ricochet_auto_aim_range, 3) BB.ricochet_auto_aim_angle = max(BB.ricochet_auto_aim_angle, 360) //it can turn full circle and shoot you in the face because our aim? is insane. BB.ricochet_decay_chance = 0 + BB.ricochet_decay_damage = max(BB.ricochet_decay_damage, 0.1) BB.ricochet_incidence_leeway = 0 if(reagents && BB.reagents) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index faa96b3e61..75ae93a83f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -659,7 +659,8 @@ if(!ignore_source_check && firer) var/mob/M = firer if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target))) - return FALSE + if(!ricochets) //if it has ricocheted, it can hit the firer. + return FALSE if(!ignore_loc && (loc != target.loc)) return FALSE if(target in passthrough) From da05108dd00815aa86977b16ad62940fb9eb0471 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 17:37:58 +0100 Subject: [PATCH 06/63] woops --- code/modules/clothing/glasses/_glasses.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 39c9bcdadb..42b0a7e608 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -161,7 +161,9 @@ user.visible_message("The cybernetic eyepatch's circuitry begins connecting to your eye as you put it on, making it immremovable.") ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") + /obj/item/clothing/glasses/eyepatch/syndicate/dropped(mob/living/carbon/human/user) + . = ..() REMOVE_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES) if(eyes) From 6fdfc19ea0466244ba9320ca1d730e40ef9951ef Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 17:39:45 +0100 Subject: [PATCH 07/63] why can i not spell --- code/modules/clothing/glasses/_glasses.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 42b0a7e608..707f4de26e 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -158,7 +158,7 @@ /obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) . = ..() if(slot == SLOT_GLASSES) - user.visible_message("The cybernetic eyepatch's circuitry begins connecting to your eye as you put it on, making it immremovable.") + user.visible_message("Circuitry from the eyepatch links itself to your brain as you put on the eyepatch.") ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") From 93c2924a00a7102d548a6a8d5fd8eb96c74a92b7 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 17:41:30 +0100 Subject: [PATCH 08/63] lower cost --- code/modules/uplink/uplink_items/uplink_clothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_clothing.dm b/code/modules/uplink/uplink_items/uplink_clothing.dm index 2d5d6c3d8e..c26a9ae1f0 100644 --- a/code/modules/uplink/uplink_items/uplink_clothing.dm +++ b/code/modules/uplink/uplink_items/uplink_clothing.dm @@ -102,4 +102,4 @@ name = "Mechanical Eyepatch" desc = "An eyepatch that connects itself to your eye socket, enhancing your shooting to an impossible degree, allowing your bullets to ricochet far more often than usual." item = /obj/item/clothing/glasses/eyepatch/syndicate - cost = 12 + cost = 8 From 8a3e69d32f8736d6a8edb4d6f624737d62c6dd41 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 21:40:10 +0100 Subject: [PATCH 09/63] no more inaccuracy --- code/modules/projectiles/gun.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4126c81367..a457e81251 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -29,7 +29,7 @@ trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers var/sawn_desc = null //description change if weapon is sawn-off var/sawn_off = FALSE - + /// can we be put into a turret var/can_turret = TRUE /// can we be put in a circuit @@ -602,7 +602,7 @@ var/penalty = (last_fire + GUN_AIMING_TIME + fire_delay) - world.time if(penalty > 0) //Yet we only penalize users firing it multiple times in a haste. fire_delay isn't necessarily cumbersomeness. aiming_delay = penalty - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) //To be removed in favor of something less tactless later. + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) || HAS_TRAIT(user, TRAIT_INSANE_AIM) //To be removed in favor of something less tactless later. base_inaccuracy /= 1.5 if(stamloss > STAMINA_NEAR_SOFTCRIT) //This can null out the above bonus. base_inaccuracy *= 1 + (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*0.5 From 3a0b34fb1ba67f46e3c17ad46ccd3a11276accb5 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 21:58:58 +0100 Subject: [PATCH 10/63] funny aim go brr --- code/modules/clothing/glasses/_glasses.dm | 2 ++ code/modules/projectiles/gun.dm | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 707f4de26e..a716b9f6c0 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -159,6 +159,8 @@ . = ..() if(slot == SLOT_GLASSES) user.visible_message("Circuitry from the eyepatch links itself to your brain as you put on the eyepatch.") + if(HAS_TRAIT(user, TRAIT_POOR_AIM)) + user.visible_message("You hear a fizzing noise from the circuit. That can't be good.") ADD_TRAIT(user, TRAIT_INSANE_AIM, "SYNDICATE_EYEPATCH_AIM") ADD_TRAIT(src, TRAIT_NODROP, "SYNDICATE_EYEPATCH_NODROP") diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a457e81251..b42cb56f09 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -309,8 +309,6 @@ randomized_gun_spread = rand(0, spread) else if(burst_size > 1 && burst_spread) randomized_gun_spread = rand(0, burst_spread) - if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex - bonus_spread += 25 var/randomized_bonus_spread = rand(0, bonus_spread) if(burst_size > 1) @@ -606,6 +604,12 @@ base_inaccuracy /= 1.5 if(stamloss > STAMINA_NEAR_SOFTCRIT) //This can null out the above bonus. base_inaccuracy *= 1 + (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*0.5 + if(HAS_TRAIT(user, TRAIT_POOR_AIM)) //nice shootin' tex + if(!HAS_TRAIT(user, TRAIT_INSANE_AIM)) + bonus_spread += 25 + else + //you have both poor aim and insane aim, why? + bonus_spread += rand(0,50) var/mult = max((GUN_AIMING_TIME + aiming_delay + user.last_click_move - world.time)/GUN_AIMING_TIME, -0.5) //Yes, there is a bonus for taking time aiming. if(mult < 0) //accurate weapons should provide a proper bonus with negative inaccuracy. the opposite is true too. mult *= 1/inaccuracy_modifier From 5f8ed3ee3a030384542f9dbe54ba0af8a7b798fa Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 22:14:42 +0100 Subject: [PATCH 11/63] acidproof --- code/modules/clothing/glasses/_glasses.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index a716b9f6c0..eb16a3436c 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -154,6 +154,7 @@ desc = "An eyepatch used to enhance one's aim with guns." icon_state = "syndicatepatch" item_state = "syndicatepatch" + resistance_flags = ACID_PROOF /obj/item/clothing/glasses/eyepatch/syndicate/equipped(mob/living/carbon/human/user, slot) . = ..() From 91664f5064a00aa219c2375526de03b422c4bba3 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Mon, 3 Aug 2020 22:17:35 +0100 Subject: [PATCH 12/63] bracket --- code/modules/projectiles/gun.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index b42cb56f09..c31c96e9f2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -600,7 +600,7 @@ var/penalty = (last_fire + GUN_AIMING_TIME + fire_delay) - world.time if(penalty > 0) //Yet we only penalize users firing it multiple times in a haste. fire_delay isn't necessarily cumbersomeness. aiming_delay = penalty - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) || HAS_TRAIT(user, TRAIT_INSANE_AIM) //To be removed in favor of something less tactless later. + if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) || HAS_TRAIT(user, TRAIT_INSANE_AIM)) //To be removed in favor of something less tactless later. base_inaccuracy /= 1.5 if(stamloss > STAMINA_NEAR_SOFTCRIT) //This can null out the above bonus. base_inaccuracy *= 1 + (stamloss - STAMINA_NEAR_SOFTCRIT)/(STAMINA_NEAR_CRIT - STAMINA_NEAR_SOFTCRIT)*0.5 From ef53f3faeaba14b91a9e744f9eac0ee8994a58bb Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 4 Aug 2020 11:43:15 +0100 Subject: [PATCH 13/63] the old system isnt needed really but sure i guess --- code/__DEFINES/projectiles.dm | 9 +++++++++ code/game/atoms.dm | 7 +++++++ code/game/objects/structures.dm | 6 ++++-- code/game/objects/structures/window.dm | 4 ++-- code/game/turfs/simulated/wall/mineral_walls.dm | 2 +- code/game/turfs/simulated/walls.dm | 1 + code/modules/projectiles/projectile.dm | 2 +- 7 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/__DEFINES/projectiles.dm b/code/__DEFINES/projectiles.dm index 0ed0d01889..1bd67fbe02 100644 --- a/code/__DEFINES/projectiles.dm +++ b/code/__DEFINES/projectiles.dm @@ -1,3 +1,12 @@ +/// This atom should be ricocheted off of from its inherent properties using standard % chance handling. +#define PROJECTILE_RICOCHET_YES 1 +/// This atom should not be ricocheted off of from its inherent properties. +#define PROJECTILE_RICOCHET_NO 2 +/// This atom should prevent any kind of projectile ricochet from its inherent properties. +#define PROJECTILE_RICOCHET_PREVENT 3 +/// This atom should force a projectile ricochet from its inherent properties. +#define PROJECTILE_RICOCHET_FORCE 4 + //bullet_act() return values #define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting. #define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting. diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 852391112c..de9df3a23e 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -156,6 +156,13 @@ return ..() +/** + * Checks if a projectile should ricochet off of us. Projectiles get final say. + * [__DEFINES/projectiles.dm] for return values. + */ +/atom/proc/check_projectile_ricochet(obj/item/projectile/P) + return (flags_1 & DEFAULT_RICOCHET_1)? PROJECTILE_RICOCHET_YES : PROJECTILE_RICOCHET_NO + /atom/proc/handle_ricochet(obj/item/projectile/P) var/turf/p_turf = get_turf(P) var/face_direction = get_dir(src, p_turf) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 39f2d276a1..b758317fe2 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -9,8 +9,10 @@ var/mob/living/structureclimber var/broken = 0 //similar to machinery's stat BROKEN layer = BELOW_OBJ_LAYER - flags_ricochet = RICOCHET_HARD - ricochet_chance_mod = 0.5 + //ricochets on structures commented out for now because there's a lot of structures that /shouldnt/ be ricocheting and those need to be reviewed first + //flags_1 = DEFAULT_RICOCHET_1 + //flags_ricochet = RICOCHET_HARD + //ricochet_chance_mod = 0.5 /obj/structure/Initialize() if (!armor) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6aae4955f1..3373278c0c 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) layer = ABOVE_OBJ_LAYER //Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = TRUE //initially is 0 for tile smoothing - flags_1 = ON_BORDER_1 max_integrity = 25 var/ini_dir = null var/state = WINDOW_OUT_OF_FRAME @@ -38,7 +37,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) var/hitsound = 'sound/effects/Glasshit.ogg' rad_insulation = RAD_VERY_LIGHT_INSULATION rad_flags = RAD_PROTECT_CONTENTS - flags_ricochet = RICOCHET_HARD + flags_1 = ON_BORDER_1|DEFAULT_RICOCHET_1 + flags_ricochet = RICOCHET_HARD ricochet_chance_mod = 0.4 attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 096f0a0b89..ed48c24462 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -191,7 +191,7 @@ icon = 'icons/turf/walls/shuttle_wall.dmi' icon_state = "map-shuttle" explosion_block = 3 - flags_1 = CAN_BE_DIRTY_1 + flags_1 = CAN_BE_DIRTY_1 | DEFAULT_RICOCHET_1 flags_ricochet = RICOCHET_SHINY | RICOCHET_HARD sheet_type = /obj/item/stack/sheet/mineral/titanium smooth = SMOOTH_MORE|SMOOTH_DIAGONAL diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index ba88baea08..31f8d1cef0 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -6,6 +6,7 @@ icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" explosion_block = 1 + flags_1 = DEFAULT_RICOCHET_1 flags_ricochet = RICOCHET_HARD thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 75ae93a83f..db72307176 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -316,7 +316,7 @@ if(!trajectory) return var/turf/T = get_turf(A) - if(check_ricochet(A) && check_ricochet_flag(A)) //if you can ricochet, attempt to ricochet off the object + if(A.check_projectile_ricochet(src) && check_ricochet_flag(A) && check_ricochet(A)) //if you can ricochet, attempt to ricochet off the object ricochets++ if(A.handle_ricochet(src)) on_ricochet(A) //if allowed, use autoaim to ricochet into someone, otherwise default to ricocheting off the object from above From a3b3e23bac57f2807ede646fe8b04264a01f77cb Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Tue, 4 Aug 2020 23:41:55 +0100 Subject: [PATCH 14/63] fix ricochets --- code/modules/projectiles/projectile.dm | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index db72307176..e539752ff1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -316,7 +316,7 @@ if(!trajectory) return var/turf/T = get_turf(A) - if(A.check_projectile_ricochet(src) && check_ricochet_flag(A) && check_ricochet(A)) //if you can ricochet, attempt to ricochet off the object + if(check_ricochet_flag(A) && check_ricochet(A)) //if you can ricochet, attempt to ricochet off the object ricochets++ if(A.handle_ricochet(src)) on_ricochet(A) //if allowed, use autoaim to ricochet into someone, otherwise default to ricocheting off the object from above @@ -403,12 +403,24 @@ //Returns null if nothing at all was found. /obj/item/projectile/proc/check_ricochet(atom/A) - var/chance = ricochet_chance * A.ricochet_chance_mod - if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) - chance += NICE_SHOT_RICOCHET_BONUS - if(prob(chance)) - return TRUE - return FALSE + if(ricochets > ricochets_max) //safety thing, we don't care about what the other thing says about this. + return FALSE + var/them = A.check_projectile_ricochet(src) + switch(them) + if(PROJECTILE_RICOCHET_PREVENT) + return FALSE + if(PROJECTILE_RICOCHET_FORCE) + return TRUE + if(PROJECTILE_RICOCHET_NO) + return FALSE + if(PROJECTILE_RICOCHET_YES) + var/chance = ricochet_chance * A.ricochet_chance_mod + if(firer && HAS_TRAIT(firer, TRAIT_NICE_SHOT)) + chance += NICE_SHOT_RICOCHET_BONUS + if(prob(chance)) + return TRUE + else + CRASH("Invalid return value for projectile ricochet check from [A].") /obj/item/projectile/proc/check_ricochet_flag(atom/A) if((flag in list("energy", "laser")) && (A.flags_ricochet & RICOCHET_SHINY)) From 3fc554d482511fcc1da69152bd01055b40324268 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 5 Aug 2020 02:29:19 +0100 Subject: [PATCH 15/63] haha machinery go brr --- code/game/machinery/_machinery.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 3faf6d5727..50c08a5dcd 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -92,6 +92,7 @@ Class Procs: pressure_resistance = 15 max_integrity = 200 layer = BELOW_OBJ_LAYER //keeps shit coming out of the machine from ending up underneath it. + flags_1 = DEFAULT_RICOCHET_1 flags_ricochet = RICOCHET_HARD ricochet_chance_mod = 0.3 From 9d521893648d97a9eded5053a1bb3bc174d7dfa0 Mon Sep 17 00:00:00 2001 From: timothyteakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Wed, 5 Aug 2020 02:41:37 +0100 Subject: [PATCH 16/63] add ricochets to way more things --- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 4 ++-- code/game/machinery/doors/windowdoor.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index f3886d0036..6b6132901c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -11,7 +11,7 @@ max_integrity = 350 armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70) CanAtmosPass = ATMOS_PASS_DENSITY - flags_1 = PREVENT_CLICK_UNDER_1 + flags_1 = PREVENT_CLICK_UNDER_1|DEFAULT_RICOCHET_1 ricochet_chance_mod = 0.8 interaction_flags_atom = INTERACT_ATOM_UI_INTERACT diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 2d41575e70..228c2e1f52 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -298,7 +298,7 @@ /obj/machinery/door/firedoor/border_only icon = 'icons/obj/doors/edge_Doorfire.dmi' - flags_1 = ON_BORDER_1 + flags_1 = ON_BORDER_1|DEFAULT_RICOCHET_1 CanAtmosPass = ATMOS_PASS_PROC /obj/machinery/door/firedoor/border_only/closed @@ -320,7 +320,7 @@ to_chat(M, "You pull [M.pulling] through [src] right as it closes") M.pulling.forceMove(T1) M.start_pulling(M2) - + for(var/mob/living/M in T2) if(M.stat == CONSCIOUS && M.pulling && M.pulling.loc == T1 && !M.pulling.anchored && M.pulling.move_resist <= M.move_force) var/mob/living/M2 = M.pulling diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index c9c577231e..22bacf6aa1 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -11,7 +11,7 @@ integrity_failure = 0 armor = list("melee" = 20, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 70, "acid" = 100) visible = FALSE - flags_1 = ON_BORDER_1 + flags_1 = ON_BORDER_1|DEFAULT_RICOCHET_1 opacity = 0 CanAtmosPass = ATMOS_PASS_PROC interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN From 5f86cc887910a88ec750078f984fed31cb0cd700 Mon Sep 17 00:00:00 2001 From: ancientpower Date: Fri, 7 Aug 2020 18:46:12 -0500 Subject: [PATCH 17/63] adds doors to the west of box medbay --- _maps/map_files/BoxStation/BoxStation.dmm | 219 +++++++++++++--------- 1 file changed, 130 insertions(+), 89 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index f9ff2a594c..02a6b7de94 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -6467,6 +6467,12 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"alX" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/medical/chemistry) "alY" = ( /obj/structure/cable{ icon_state = "1-2" @@ -8069,6 +8075,13 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) +"apI" = ( +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/structure/closet/secure_closet/medical1, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "apJ" = ( /turf/closed/wall, /area/construction/mining/aux_base) @@ -9381,6 +9394,13 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/construction/mining/aux_base) +"asG" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) "asH" = ( /obj/structure/closet/toolcloset, /obj/effect/turf_decal/tile/yellow{ @@ -9424,6 +9444,41 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"asL" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/item/reagent_containers/spray/cleaner, +/obj/item/crowbar, +/obj/item/clothing/neck/stethoscope, +/obj/item/storage/box/gloves{ + pixel_x = 3; + pixel_y = 4 + }, +/obj/item/storage/box/masks, +/obj/structure/table, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"asM" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/item/clothing/neck/stethoscope, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 30 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/janitor) "asN" = ( /obj/machinery/airalarm{ dir = 4; @@ -9453,12 +9508,76 @@ /obj/structure/closet/firecloset, /turf/open/floor/plating, /area/maintenance/fore) +"asT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) +"asU" = ( +/obj/structure/sign/warning/nosmoking{ + pixel_y = 30 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"asV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/medical/medbay/central) "asW" = ( /obj/machinery/light/small{ dir = 8 }, /turf/open/floor/plasteel/grimy, /area/security/detectives_office) +"asX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/medical/glass{ + id_tag = "MedbayFoyer"; + name = "Medbay"; + req_access_txt = "5" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"asY" = ( +/obj/structure/table, +/obj/item/crowbar, +/obj/item/clothing/neck/stethoscope, +/obj/item/reagent_containers/spray/cleaner, +/obj/structure/sign/warning/nosmoking{ + pixel_y = 30 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/hallway/primary/central) "ata" = ( /turf/open/floor/wood, /area/lawoffice) @@ -24467,12 +24586,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/engine/gravity_generator) -"bgP" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/chemistry) "bgQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -28210,12 +28323,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bpy" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bpz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 @@ -28704,13 +28811,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/hallway/primary/central) -"bqM" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/medbay/central) "bqN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -28743,22 +28843,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bqR" = ( -/obj/structure/table, -/obj/item/crowbar, -/obj/item/clothing/neck/stethoscope, -/obj/item/reagent_containers/spray/cleaner, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 30 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bqS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -29261,13 +29345,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/crew_quarters/heads/hop) -"brV" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/medical/medbay/central) "brW" = ( /obj/structure/cable{ icon_state = "4-8" @@ -29275,18 +29352,6 @@ /obj/machinery/vending/cart, /turf/open/floor/plasteel, /area/crew_quarters/heads/hop) -"brX" = ( -/obj/structure/table, -/obj/item/storage/box/masks, -/obj/item/storage/box/gloves{ - pixel_x = 3; - pixel_y = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "brY" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -31211,23 +31276,10 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/medical/medbay/central) -"bwy" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bwz" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"bwA" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) "bwB" = ( /obj/structure/chair, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -32967,17 +33019,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bAp" = ( -/obj/structure/closet/secure_closet/medical1, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) "bAq" = ( /obj/machinery/sleeper{ dir = 8 @@ -91187,7 +91228,7 @@ bqH aJq aJq gnf -bCv +asM bDJ bCt bGD @@ -92212,7 +92253,7 @@ btJ buV bws bqH -aJq +asY aJq byW bCv @@ -94263,8 +94304,8 @@ bfF bfF bfF bfF -bqM -brV +asT +asV bof bwv bvj @@ -94520,8 +94561,8 @@ bmF bob bnB bfF -bqR -brX +asU +asX bof bwx bvj @@ -95028,7 +95069,7 @@ aYV bfF bhc bip -bgP +alX bjL bkL bmT @@ -95294,7 +95335,7 @@ bpF bqS brY bwz -bwy +asG bvj bza bxb @@ -95550,8 +95591,8 @@ bpt bfF bqV bEe +bhh bBL -bwA bvj bAl bAl @@ -96068,7 +96109,7 @@ bvh ajv bxN bze -bAp +asL bvh bCG bBd @@ -98116,7 +98157,7 @@ bjX blp bmO bhi -bpy +apI bwz brg btZ From a60c8e550ff90d0bb1ed8c0686dd5a16d87f558f Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Fri, 7 Aug 2020 19:50:46 -0400 Subject: [PATCH 18/63] poggers --- code/modules/uplink/uplink_items/uplink_stealthdevices.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/uplink/uplink_items/uplink_stealthdevices.dm b/code/modules/uplink/uplink_items/uplink_stealthdevices.dm index f1c27c640b..28d02cf79b 100644 --- a/code/modules/uplink/uplink_items/uplink_stealthdevices.dm +++ b/code/modules/uplink/uplink_items/uplink_stealthdevices.dm @@ -112,13 +112,13 @@ name = "Radio Jammer" desc = "This device will disrupt any nearby outgoing radio communication when activated. Does not affect binary chat." item = /obj/item/jammer - cost = 5 + cost = 2 /datum/uplink_item/stealthy_tools/smugglersatchel name = "Smuggler's Satchel" desc = "This satchel is thin enough to be hidden in the gap between plating and tiling; great for stashing \ your stolen goods. Comes with a crowbar and a floor tile inside. Properly hidden satchels have been \ - known to survive intact even beyond the current shift. " + known to survive intact even beyond the current shift, but this is just a myth. " item = /obj/item/storage/backpack/satchel/flat - cost = 2 + cost = 1 surplus = 30 From ab2de2e55c20786db7148b9b1ddb07c58ac6d899 Mon Sep 17 00:00:00 2001 From: Dip Date: Sat, 8 Aug 2020 16:01:37 -0300 Subject: [PATCH 19/63] Added Skulldoggo Snout --- .../new_player/sprite_accessories/snouts.dm | 6 ++++++ modular_citadel/icons/mob/mam_snouts.dmi | Bin 12089 -> 13107 bytes 2 files changed, 6 insertions(+) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm index 60e8ed1007..2c0db56ce4 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/snouts.dm @@ -184,6 +184,12 @@ extra = TRUE extra_color_src = MUTCOLORS3 +/datum/sprite_accessory/mam_snouts/skulldog + name = "Skulldog" + icon_state = "skulldog" + extra = TRUE + extra_color_src = MATRIXED + /datum/sprite_accessory/mam_snouts/lcanid name = "Mammal, Long" icon_state = "lcanid" diff --git a/modular_citadel/icons/mob/mam_snouts.dmi b/modular_citadel/icons/mob/mam_snouts.dmi index ab1a4654b40c811a408912521c64c981dcbf2cfd..4f6682f789c903d972bee535b62996e19c8e48e5 100644 GIT binary patch literal 13107 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 KPO+xli~j{wT$=X) literal 12089 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 S;|iPv1k*9PR<3nB>OTN@BIWo1 From 8f77a2b16d5e583bd95b80164d5a758a971e0549 Mon Sep 17 00:00:00 2001 From: Putnam Date: Sat, 8 Aug 2020 13:38:33 -0700 Subject: [PATCH 20/63] Demodularized a bit. --- code/modules/arousal/genitals.dm | 17 ----------------- .../mob/living/carbon/human/inventory.dm | 3 ++- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 4d2e5e6fef..8f88076af9 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -232,23 +232,6 @@ /obj/item/organ/genital/proc/get_features(mob/living/carbon/human/H) return - -//procs to handle sprite overlays being applied to humans - -/mob/living/carbon/human/equip_to_slot(obj/item/I, slot) - . = ..() - if(!. && I && slot && !(slot in GLOB.no_genitals_update_slots)) //the item was successfully equipped, and the chosen slot wasn't merely storage, hands or cuffs. - update_genitals() - -/mob/living/carbon/human/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE) - var/no_update = FALSE - if(!I || I == l_store || I == r_store || I == s_store || I == handcuffed || I == legcuffed || get_held_index_of_item(I)) //stops storages, cuffs and held items from triggering it. - no_update = TRUE - . = ..() - if(!. || no_update) - return - update_genitals() - /mob/living/carbon/human/proc/update_genitals() if(QDELETED(src)) return diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index a7593ca0cb..1c776427cf 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -169,7 +169,7 @@ //Item is handled and in slot, valid to call callback, for this proc should always be true if(!not_handled) I.equipped(src, slot) - + update_genitals() return not_handled //For future deeper overrides /mob/living/carbon/human/equipped_speed_mods() @@ -257,6 +257,7 @@ s_store = null if(!QDELETED(src)) update_inv_s_store() + update_genitals() /mob/living/carbon/human/wear_mask_update(obj/item/clothing/C, toggle_off = 1) if((C.flags_inv & (HIDEHAIR|HIDEFACIALHAIR)) || (initial(C.flags_inv) & (HIDEHAIR|HIDEFACIALHAIR))) From 885013a8b880825ce89ae66594d6cdfb0e079dde Mon Sep 17 00:00:00 2001 From: chrisbbbbbbb Date: Sat, 8 Aug 2020 23:13:03 +0200 Subject: [PATCH 21/63] suture crafting stuff --- code/datums/components/crafting/recipes/recipes_misc.dm | 4 ++-- code/game/objects/items/stacks/medical.dm | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 214c1b1427..0cb0547978 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -126,7 +126,7 @@ /datum/crafting_recipe/brute_pack name = "Suture Pack" - result = /obj/item/stack/medical/suture/one + result = /obj/item/stack/medical/suture/five time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/medicine/styptic_powder = 10) @@ -135,7 +135,7 @@ /datum/crafting_recipe/burn_pack name = "Regenerative Mesh" - result = /obj/item/stack/medical/mesh/one + result = /obj/item/stack/medical/mesh/five time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/medicine/silver_sulfadiazine = 10) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 1ceb525b8a..21a621cb41 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -204,6 +204,9 @@ /obj/item/stack/medical/suture/one amount = 1 +/obj/item/stack/medical/suture/five + amount = 5 + /obj/item/stack/medical/suture/medicated name = "medicated suture" icon_state = "suture_purp" @@ -284,6 +287,9 @@ /obj/item/stack/medical/mesh/one amount = 1 +/obj/item/stack/medical/mesh/five + amount = 5 + /obj/item/stack/medical/mesh/advanced name = "advanced regenerative mesh" desc = "An advanced mesh made with aloe extracts and sterilizing chemicals, used to treat burns." From 50448549fbd0b698fe94fd700f460f436e71a969 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 9 Aug 2020 15:26:08 +1000 Subject: [PATCH 22/63] ee --- code/modules/clothing/gloves/ring.dm | 11 ++++++++++- code/modules/clothing/under/accessories.dm | 9 +++++++++ code/modules/paperwork/pen.dm | 2 +- icons/obj/clothing/accessories.dmi | Bin 9764 -> 10015 bytes .../code/modules/client/loadout/backpack.dm | 4 ++++ .../code/modules/client/loadout/gloves.dm | 4 ++++ 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/gloves/ring.dm b/code/modules/clothing/gloves/ring.dm index 8354f13bd2..70c131e298 100644 --- a/code/modules/clothing/gloves/ring.dm +++ b/code/modules/clothing/gloves/ring.dm @@ -21,7 +21,7 @@ desc = "An expensive ring, studded with a diamond. Cultures have used these rings in courtship for a millenia." icon_state = "ringdiamond" item_state = "dring" - + /obj/item/clothing/gloves/ring/diamond/attack_self(mob/user) user.visible_message("\The [user] gets down on one knee, presenting \the [src].","You get down on one knee, presenting \the [src].") @@ -30,3 +30,12 @@ desc = "A tiny silver ring, sized to wrap around a finger." icon_state = "ringsilver" item_state = "sring" + +/obj/item/clothing/gloves/ring/custom + name = " ring" + desc = "A ring." + gender = NEUTER + w_class = WEIGHT_CLASS_TINY + obj_flags = UNIQUE_RENAME + icon_state = "ringsilver" + item_state = "sring" diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index cb173f3bde..ee7e4c48e1 100644 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -369,3 +369,12 @@ icon_state = "plastics" armor = list("melee" = 0, "bullet" = 0, "laser" = 20, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = -40) flags_inv = HIDEACCESSORY + +//necklace +/obj/item/clothing/accessory/necklace + name = "necklace" + desc = "A necklace." + icon_state = "locket" + obj_flags = UNIQUE_RENAME + custom_materials = list(/datum/material/iron=100) + resistance_flags = FIRE_PROOF diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 997ada6b21..91b8a6719b 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -147,7 +147,7 @@ log_game("[user] [key_name(user)] has renamed [O] to [input]") if(penchoice == "Change description") - var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 100) + var/input = stripped_input(user,"Describe \the [O.name] here", ,"", 2048) if(QDELETED(O) || !user.canUseTopic(O, BE_CLOSE)) return O.desc = input diff --git a/icons/obj/clothing/accessories.dmi b/icons/obj/clothing/accessories.dmi index c62a88c829482d49e53f2e07978276a1234fa84d..7d13e3f802e71e0d06087eec0b15a220e158d414 100644 GIT binary patch literal 10015 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 diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm index fbc498df64..0b700b11e2 100644 --- a/modular_citadel/code/modules/client/loadout/backpack.dm +++ b/modular_citadel/code/modules/client/loadout/backpack.dm @@ -98,3 +98,7 @@ name = "A diamond ring box" path = /obj/item/storage/fancy/ringbox/diamond cost = 5 + +/datum/gear/backpack/necklace//this is here because loadout doesn't support proper accessories + name = "A renameable necklace" + path = /obj/item/clothing/accessory/necklace diff --git a/modular_citadel/code/modules/client/loadout/gloves.dm b/modular_citadel/code/modules/client/loadout/gloves.dm index 85be8bd487..ffa4724f63 100644 --- a/modular_citadel/code/modules/client/loadout/gloves.dm +++ b/modular_citadel/code/modules/client/loadout/gloves.dm @@ -24,3 +24,7 @@ name = "A diamond ring" path = /obj/item/clothing/gloves/ring/diamond cost = 4 + +/datum/gear/gloves/customring + name = "A ring, renameable" + path = /obj/item/clothing/gloves/ring/custom From c9de596fde23bd37bde6366d57bc68edad47d797 Mon Sep 17 00:00:00 2001 From: lolman360 <22850904+lolman360@users.noreply.github.com> Date: Sun, 9 Aug 2020 15:31:49 +1000 Subject: [PATCH 23/63] Verified! --- code/modules/clothing/gloves/ring.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/gloves/ring.dm b/code/modules/clothing/gloves/ring.dm index 70c131e298..daca843c45 100644 --- a/code/modules/clothing/gloves/ring.dm +++ b/code/modules/clothing/gloves/ring.dm @@ -32,7 +32,7 @@ item_state = "sring" /obj/item/clothing/gloves/ring/custom - name = " ring" + name = "ring" desc = "A ring." gender = NEUTER w_class = WEIGHT_CLASS_TINY From f86fb54aabeb5569e04491e42d7c13033239e9eb Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Fri, 17 Jul 2020 12:03:57 +0800 Subject: [PATCH 24/63] https://github.com/tgstation/tgstation/tree/master/code/modules/mafia --- code/modules/mafia/_defines.dm | 149 ++++++ code/modules/mafia/controller.dm | 763 +++++++++++++++++++++++++++++++ code/modules/mafia/map_pieces.dm | 71 +++ code/modules/mafia/outfits.dm | 96 ++++ code/modules/mafia/roles.dm | 487 ++++++++++++++++++++ tgstation.dme | 5 + 6 files changed, 1571 insertions(+) create mode 100644 code/modules/mafia/_defines.dm create mode 100644 code/modules/mafia/controller.dm create mode 100644 code/modules/mafia/map_pieces.dm create mode 100644 code/modules/mafia/outfits.dm create mode 100644 code/modules/mafia/roles.dm diff --git a/code/modules/mafia/_defines.dm b/code/modules/mafia/_defines.dm new file mode 100644 index 0000000000..b862ce63c5 --- /dev/null +++ b/code/modules/mafia/_defines.dm @@ -0,0 +1,149 @@ +#define MAFIA_TEAM_TOWN "town" +#define MAFIA_TEAM_MAFIA "mafia" +#define MAFIA_TEAM_SOLO "solo" + +#define MAFIA_PHASE_SETUP 1 +#define MAFIA_PHASE_DAY 2 +#define MAFIA_PHASE_VOTING 3 +#define MAFIA_PHASE_JUDGEMENT 4 +#define MAFIA_PHASE_NIGHT 5 +#define MAFIA_PHASE_VICTORY_LAP 6 + +#define MAFIA_ALIVE 1 +#define MAFIA_DEAD 2 + +#define COMSIG_MAFIA_ON_KILL "mafia_onkill" +#define MAFIA_PREVENT_KILL 1 + +#define COMSIG_MAFIA_CAN_PERFORM_ACTION "mafia_can_perform_action" +#define MAFIA_PREVENT_ACTION 1 + +//in order of events + game end + +#define COMSIG_MAFIA_SUNDOWN "sundown" //the rest of these phases are at the end of the night when shutters raise, in a different order of resolution +#define COMSIG_MAFIA_NIGHT_START "night_start" +#define COMSIG_MAFIA_NIGHT_ACTION_PHASE "night_actions" +#define COMSIG_MAFIA_NIGHT_KILL_PHASE "night_kill" +#define COMSIG_MAFIA_NIGHT_END "night_end" + +#define COMSIG_MAFIA_GAME_END "game_end" + +//list of ghosts who want to play mafia, every time someone enters the list it checks to see if enough are in +GLOBAL_LIST_EMPTY(mafia_signup) +//the current global mafia game running. +GLOBAL_VAR(mafia_game) + +GLOBAL_LIST_INIT(mafia_setups,generate_mafia_setups()) + +/proc/generate_mafia_setups() + . = list() + for(var/T in subtypesof(/datum/mafia_setup)) + var/datum/mafia_setup/N = new T + . += list(N.roles) + +/datum/mafia_setup + var/name = "Make subtypes with the list and a name, more readable than list(list(),list()) etc" + var/list/roles + +// 12 Player + +/datum/mafia_setup/twelve_basic + name = "12 Player Setup Basic" + roles = list( + /datum/mafia_role=6, + /datum/mafia_role/md=1, + /datum/mafia_role/detective=1, + /datum/mafia_role/clown=1, + /datum/mafia_role/mafia=3 + ) + +/datum/mafia_setup/twelve_md + name = "12 Player Setup MD" + roles = list( + /datum/mafia_role=6, + /datum/mafia_role/md=3, + /datum/mafia_role/mafia=3 + ) + +/datum/mafia_setup/twelve_all + name = "12 Player Setup All" + roles = list( + /datum/mafia_role=1, + /datum/mafia_role/psychologist=1, + /datum/mafia_role/md=1, + /datum/mafia_role/detective=1, + /datum/mafia_role/clown=1, + /datum/mafia_role/chaplain=1, + /datum/mafia_role/lawyer=1, + /datum/mafia_role/traitor=1, + /datum/mafia_role/mafia=3, + /datum/mafia_role/fugitive=1, + /datum/mafia_role/obsessed=1 + ) + +/datum/mafia_setup/twelve_joke + name = "12 Player Setup Funny" + roles = list( + /datum/mafia_role=5, + /datum/mafia_role/detective=2, + /datum/mafia_role/clown=2, + /datum/mafia_role/mafia=3 + ) + +/datum/mafia_setup/twelve_lockdown + name = "12 Player Setup Lockdown" + roles = list( + /datum/mafia_role=5, + /datum/mafia_role/md=1, + /datum/mafia_role/detective=1, + /datum/mafia_role/lawyer=2, + /datum/mafia_role/mafia=3 + ) + +/datum/mafia_setup/twelve_rip + name = "12 Player Setup RIP" + roles = list( + /datum/mafia_role=6, + /datum/mafia_role/md=1, + /datum/mafia_role/detective=1, + /datum/mafia_role/mafia=3, + /datum/mafia_role/traitor=1 + ) + +/datum/mafia_setup/twelve_double_treason + name = "12 Player Setup Double Treason" + roles = list( + /datum/mafia_role=8, + /datum/mafia_role/detective=1, + /datum/mafia_role/traitor=1, + /datum/mafia_role/obsessed=2 + ) + +/datum/mafia_setup/twelve_fugitives + name = "12 Player Fugitives" + roles = list( + /datum/mafia_role=6, + /datum/mafia_role/psychologist=1, + /datum/mafia_role/mafia=3, + /datum/mafia_role/fugitive=2 + ) + +/datum/mafia_setup/twelve_traitor_mafia + name = "12 Player Traitor Mafia" + roles = list( + /datum/mafia_role=3, + /datum/mafia_role/psychologist=2, + /datum/mafia_role/md=2, + /datum/mafia_role/detective=2, + /datum/mafia_role/traitor=3 + ) + +/* +/datum/mafia_setup/three_test + name = "3 Player Test" + roles = list( + /datum/mafia_role/chaplain=1, + /datum/mafia_role/psychologist=1, + /datum/mafia_role/mafia=1 + ) +*/ diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm new file mode 100644 index 0000000000..f4897a5fe5 --- /dev/null +++ b/code/modules/mafia/controller.dm @@ -0,0 +1,763 @@ +/* DO NOT MERGE, REQUIRES TGUI3 MINIMUM, though the code only supports tgui4 */ + + +/** + * The mafia controller handles the mafia minigame in progress. + * It is first created when the first ghost signs up to play. + */ +/datum/mafia_controller + ///all roles in the game, dead or alive. check their game status if you only want living or dead. + var/list/all_roles = list() + ///exists to speed up role retrieval, it's a dict. player_role_lookup[player ckey] will give you the role they play + var/list/player_role_lookup = list() + ///what part of the game you're playing in. day phases, night phases, judgement phases, etc. + var/phase = MAFIA_PHASE_SETUP + ///how long the game has gone on for, changes with every sunrise. day one, night one, day two, etc. + var/turn = 0 + + ///first day has no voting, and thus is shorter + var/first_day_phase_period = 20 SECONDS + ///talk with others about the last night + var/day_phase_period = 1 MINUTES + ///vote someone to get put on trial + var/voting_phase_period = 30 SECONDS + ///defend yourself! don't get lynched! sometimes skipped if nobody votes. + var/judgement_phase_period = 30 SECONDS + ///guilty or innocent, we want a bit of time for players to process the outcome of the vote + var/judgement_lynch_period = 5 SECONDS + ///mafia talk at night and pick someone to kill, some town roles use their actions, etc etc. + var/night_phase_period = 45 SECONDS + ///like the lynch period, players need to see what the other players in the game's roles were + var/victory_lap_period = 20 SECONDS + + ///template picked when the game starts. used for the name and desc reading + var/datum/map_template/mafia/current_map + ///map generation tool that deletes the current map after the game finishes + var/datum/map_generator/massdelete/map_deleter + + ///Readable list of roles in current game, sent to the tgui panel for roles list > list("Psychologist x1", "Clown x2") + var/list/current_setup_text + + ///starting outfit for all mafia players. it's just a grey jumpsuit. + var/player_outfit = /datum/outfit/mafia + + ///spawn points for players, each one has a house + var/list/landmarks = list() + ///town center for when people get put on trial + var/town_center_landmark + + ///group voting on one person, like putting people to trial or choosing who to kill as mafia + var/list/votes = list() + ///and these (judgement_innocent_votes and judgement_guilty_votes) are the judgement phase votes, aka people sorting themselves into guilty and innocent lists. whichever has more wins! + var/list/judgement_innocent_votes = list() + var/list/judgement_guilty_votes = list() + ///current role on trial for the judgement phase, will die if guilty is greater than innocent + var/datum/mafia_role/on_trial + + ///current timer for phase + var/next_phase_timer + + ///used for debugging in testing (doesn't put people out of the game, some other shit i forgot, who knows just don't set this in live) honestly kinda deprecated + var/debug = FALSE + +/datum/mafia_controller/New() + . = ..() + GLOB.mafia_game = src + map_deleter = new + +/datum/mafia_controller/Destroy(force, ...) + . = ..() + GLOB.mafia_game = null + end_game() + qdel(map_deleter) + +/** + * Triggers at beginning of the game when there is a confirmed list of valid, ready players. + * Creates a 100% ready game that has NOT started (no players in bodies) + * Followed by start game + * + * Does the following: + * * Picks map, and loads it + * * Grabs landmarks if it is the first time it's loading + * * Sets up the role list + * * Puts players in each role randomly + * Arguments: + * * setup_list: list of all the datum setups (fancy list of roles) that would work for the game + * * ready_players: list of filtered, sane players (so not playing or disconnected) for the game to put into roles + */ +/datum/mafia_controller/proc/prepare_game(setup_list,ready_players) + + var/list/possible_maps = subtypesof(/datum/map_template/mafia) + var/turf/spawn_area = get_turf(locate(/obj/effect/landmark/mafia_game_area) in GLOB.landmarks_list) + + current_map = pick(possible_maps) + current_map = new current_map + + if(!spawn_area) + CRASH("No spawn area detected for Mafia!") + var/list/bounds = current_map.load(spawn_area) + if(!bounds) + CRASH("Loading mafia map failed!") + map_deleter.defineRegion(spawn_area, locate(spawn_area.x + 23,spawn_area.y + 23,spawn_area.z), replace = TRUE) //so we're ready to mass delete when round ends + + if(!landmarks.len)//we grab town center when we grab landmarks, if there is none (the first game signed up for let's grab them post load) + for(var/obj/effect/landmark/mafia/possible_spawn in GLOB.landmarks_list) + if(istype(possible_spawn, /obj/effect/landmark/mafia/town_center)) + town_center_landmark = possible_spawn + else + landmarks += possible_spawn + + current_setup_text = list() + for(var/rtype in setup_list) + for(var/i in 1 to setup_list[rtype]) + all_roles += new rtype(src) + var/datum/mafia_role/rp = rtype + current_setup_text += "[initial(rp.name)] x[setup_list[rtype]]" + var/list/spawnpoints = landmarks.Copy() + for(var/datum/mafia_role/role in all_roles) + role.assigned_landmark = pick_n_take(spawnpoints) + if(!debug) + role.player_key = pick_n_take(ready_players) + else + role.player_key = pop(ready_players) + +/datum/mafia_controller/proc/send_message(msg,team) + for(var/datum/mafia_role/R in all_roles) + if(team && R.team != team) + continue + to_chat(R.body,msg) + var/team_suffix = team ? "([uppertext(team)] CHAT)" : "" + for(var/M in GLOB.dead_mob_list) + var/mob/spectator = M + if(spectator.ckey in GLOB.mafia_signup || player_role_lookup[spectator.mind.current] != null) //was in current game, or is signed up + var/link = FOLLOW_LINK(M, town_center_landmark) + to_chat(M, "[link] MAFIA: [msg] [team_suffix]") + +/** + * The game by this point is now all set up, and so we can put people in their bodies and start the first phase. + * + * Does the following: + * * Creates bodies for all of the roles with the first proc + * * Starts the first day manually (so no timer) with the second proc + */ +/datum/mafia_controller/proc/start_game() + create_bodies() + start_day() + +/** + * How every day starts. + * + * What players do in this phase: + * * If day one, just a small starting period to see who is in the game and check role, leading to the night phase. + * * Otherwise, it's a longer period used to discuss events that happened during the night, leading to the voting phase. + */ +/datum/mafia_controller/proc/start_day() + turn += 1 + phase = MAFIA_PHASE_DAY + if(!check_victory()) + if(turn == 1) + send_message("The selected map is [current_map.name]!
[current_map.description]
") + send_message("Day [turn] started! There is no voting on the first day. Say hello to everybody!") + next_phase_timer = addtimer(CALLBACK(src,.proc/check_trial, FALSE),first_day_phase_period,TIMER_STOPPABLE) //no voting period = no votes = instant night + else + send_message("Day [turn] started! Voting will start in 1 minute.") + next_phase_timer = addtimer(CALLBACK(src,.proc/start_voting_phase),day_phase_period,TIMER_STOPPABLE) + + SStgui.update_uis(src) + +/** + * Players have finished the discussion period, and now must put up someone to the chopping block. + * + * What players do in this phase: + * * Vote on which player to put up for lynching, leading to the judgement phase. + * * If no votes are case, the judgement phase is skipped, leading to the night phase. + */ +/datum/mafia_controller/proc/start_voting_phase() + phase = MAFIA_PHASE_VOTING + next_phase_timer = addtimer(CALLBACK(src, .proc/check_trial, TRUE),voting_phase_period,TIMER_STOPPABLE) //be verbose! + send_message("Voting started! Vote for who you want to see on trial today.") + SStgui.update_uis(src) + +/** + * Players have voted someone up, and now the person must defend themselves while the town votes innocent or guilty. + * + * What players do in this phase: + * * Vote innocent or guilty, if they are not on trial. + * * Defend themselves and wait for judgement, if they are. + * * Leads to the lynch phase. + * Arguments: + * * verbose: boolean, announces whether there were votes or not. after judgement it goes back here with no voting period to end the day. + */ +/datum/mafia_controller/proc/check_trial(verbose = TRUE) + var/datum/mafia_role/loser = get_vote_winner("Day")//, majority_of_town = TRUE) + if(loser) + send_message("[loser.body.real_name] wins the day vote, Listen to their defense and vote \"INNOCENT\" or \"GUILTY\"!") + on_trial = loser + on_trial.body.forceMove(get_turf(town_center_landmark)) + phase = MAFIA_PHASE_JUDGEMENT + next_phase_timer = addtimer(CALLBACK(src, .proc/lynch),judgement_phase_period,TIMER_STOPPABLE) + reset_votes("Day") + else + if(verbose) + send_message("Not enough people have voted to put someone on trial, nobody will be lynched today.") + if(!check_victory()) + lockdown() + SStgui.update_uis(src) + +/** + * Players have voted innocent or guilty on the person on trial, and that person is now killed or returned home. + * + * What players do in this phase: + * * r/watchpeopledie + * * If the accused is killed, their true role is revealed to the rest of the players. + */ +/datum/mafia_controller/proc/lynch() + for(var/i in judgement_innocent_votes) + var/datum/mafia_role/role = i + send_message("[role.body.real_name] voted innocent.") + for(var/ii in judgement_guilty_votes) + var/datum/mafia_role/role = ii + send_message("[role.body.real_name] voted guilty.") + if(judgement_guilty_votes.len > judgement_innocent_votes.len) //strictly need majority guilty to lynch + send_message("Guilty wins majority, [on_trial.body.real_name] has been lynched.") + on_trial.kill(src, lynch = TRUE) + addtimer(CALLBACK(src, .proc/send_home, on_trial),judgement_lynch_period) + else + send_message("Innocent wins majority, [on_trial.body.real_name] has been spared.") + on_trial.body.forceMove(get_turf(on_trial.assigned_landmark)) + //by now clowns should have killed someone in guilty list, clear this out + judgement_innocent_votes = list() + judgement_guilty_votes = list() + on_trial = null + //day votes are already cleared, so this will skip the trial and check victory/lockdown/whatever else + next_phase_timer = addtimer(CALLBACK(src, .proc/check_trial, FALSE),judgement_lynch_period,TIMER_STOPPABLE)// small pause to see the guy dead, no verbosity since we already did this + +/** + * Teenie helper proc to move players back to their home. + * Used in the above, but also used in the debug button "send all players home" + * Arguments: + * * role: mafia role that is getting sent back to the game. + */ +/datum/mafia_controller/proc/send_home(datum/mafia_role/role) + role.body.forceMove(get_turf(role.assigned_landmark)) + +/** + * Checks to see if a faction (or solo antagonist) has won. + * + * Calculates in this order: + * * counts up town, mafia, and solo + * * solos can count as town members for the purposes of mafia winning + * * sends the amount of living people to the solo antagonists, and see if they won OR block the victory of the teams + * * checks if solos won from above, then if town, then if mafia + * * starts the end of the game if a faction won + * * returns TRUE if someone won the game, halting other procs from continuing in the case of a victory + */ +/datum/mafia_controller/proc/check_victory() + var/alive_town = 0 + var/alive_mafia = 0 + var/list/solos_to_ask = list() //need to ask after because first round is counting team sizes + var/list/total_victors = list() //if this list gets filled with anyone, they win. list because side antags can with with people + var/blocked_victory = FALSE //if a solo antagonist is stopping the town or mafia from finishing the game. + + ///PHASE ONE: TALLY UP ALL NUMBERS OF PEOPLE STILL ALIVE + + for(var/datum/mafia_role/R in all_roles) + if(R.game_status == MAFIA_ALIVE) + switch(R.team) + if(MAFIA_TEAM_MAFIA) + alive_mafia++ + if(MAFIA_TEAM_TOWN) + alive_town++ + if(MAFIA_TEAM_SOLO) + if(R.solo_counts_as_town) + alive_town++ + solos_to_ask += R + + ///PHASE TWO: SEND STATS TO SOLO ANTAGS, SEE IF THEY WON OR TEAMS CANNOT WIN + + for(var/datum/mafia_role/solo in solos_to_ask) + if(solo.check_total_victory(alive_town, alive_mafia)) + total_victors += solo + if(solo.block_team_victory(alive_town, alive_mafia)) + blocked_victory = TRUE + + //solo victories! + var/solo_end = FALSE + for(var/datum/mafia_role/winner in total_victors) + send_message("!! [uppertext(winner.name)] VICTORY !!") + solo_end = TRUE + if(solo_end) + start_the_end() + return TRUE + if(blocked_victory) + return FALSE + if(alive_mafia == 0) + start_the_end("!! TOWN VICTORY !!") + return TRUE + else if(alive_mafia >= alive_town) //guess could change if town nightkill is added + start_the_end("!! MAFIA VICTORY !!") + return TRUE + +/** + * The end of the game is in two procs, because we want a bit of time for players to see eachothers roles. + * Because of how check_victory works, the game is halted in other places by this point. + * + * What players do in this phase: + * * See everyone's role postgame + * * See who won the game + * Arguments: + * * message: string, if non-null it sends it to all players. used to announce team victories while solos are handled in check victory + */ +/datum/mafia_controller/proc/start_the_end(message) + SEND_SIGNAL(src,COMSIG_MAFIA_GAME_END) + if(message) + send_message(message) + for(var/datum/mafia_role/R in all_roles) + R.reveal_role(src) + phase = MAFIA_PHASE_VICTORY_LAP + next_phase_timer = addtimer(CALLBACK(src,.proc/end_game),victory_lap_period,TIMER_STOPPABLE) + +/** + * Cleans up the game, resetting variables back to the beginning and removing the map with the generator. + */ +/datum/mafia_controller/proc/end_game() + + map_deleter.generate() //remove the map, it will be loaded at the start of the next one + + QDEL_LIST(all_roles) + turn = 0 + votes = list() + phase = MAFIA_PHASE_SETUP + +/** + * After the voting and judgement phases, the game goes to night shutting the windows and beginning night with a proc. + */ +/datum/mafia_controller/proc/lockdown() + toggle_night_curtains(close=TRUE) + start_night() + +/** + * Shuts poddoors attached to mafia. + * Arguments: + * * close: boolean, the state you want the curtains in. + */ +/datum/mafia_controller/proc/toggle_night_curtains(close) + for(var/obj/machinery/door/poddoor/D in GLOB.machines) //I really dislike pathing of these + if(D.id != "mafia") //so as to not trigger shutters on station, lol + continue + if(close) + INVOKE_ASYNC(D, /obj/machinery/door/poddoor.proc/close) + else + INVOKE_ASYNC(D, /obj/machinery/door/poddoor.proc/open) + +/** + * The actual start of night for players. Mostly info is given at the start of the night as the end of the night is when votes and actions are submitted and tried. + * + * What players do in this phase: + * * Mafia are told to begin voting on who to kill + * * Powers that are picked during the day announce themselves right now + */ +/datum/mafia_controller/proc/start_night() + phase = MAFIA_PHASE_NIGHT + send_message("Night [turn] started! Lockdown will end in 45 seconds.") + SEND_SIGNAL(src,COMSIG_MAFIA_SUNDOWN) + next_phase_timer = addtimer(CALLBACK(src, .proc/resolve_night),night_phase_period,TIMER_STOPPABLE) + SStgui.update_uis(src) + +/** + * The end of the night, and a series of signals for the order of events on a night. + * + * Order of events, and what they mean: + * * Start of resolve (NIGHT_START) is for activating night abilities that MUST go first + * * Action phase (NIGHT_ACTION_PHASE) is for non-lethal day abilities + * * Mafia then tallies votes and kills the highest voted person (note: one random voter visits that person for the purposes of roleblocking) + * * Killing phase (NIGHT_KILL_PHASE) is for lethal night abilities + * * End of resolve (NIGHT_END) is for cleaning up abilities that went off and i guess doing some that must go last + * * Finally opens the curtains and calls the start of day phase, completing the cycle until check victory returns TRUE + */ +/datum/mafia_controller/proc/resolve_night() + SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_START) + SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_ACTION_PHASE) + //resolve mafia kill, todo unsnowflake this + var/datum/mafia_role/R = get_vote_winner("Mafia") + if(R) + var/datum/mafia_role/killer = get_random_voter("Mafia") + if(SEND_SIGNAL(killer,COMSIG_MAFIA_CAN_PERFORM_ACTION,src,"mafia killing",R) & MAFIA_PREVENT_ACTION) + send_message("[killer.body.real_name] was unable to attack [R.body.real_name] tonight!",MAFIA_TEAM_MAFIA) + else + send_message("[killer.body.real_name] has attacked [R.body.real_name]!",MAFIA_TEAM_MAFIA) + R.kill(src) + reset_votes("Mafia") + SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_KILL_PHASE) + SEND_SIGNAL(src,COMSIG_MAFIA_NIGHT_END) + toggle_night_curtains(close=FALSE) + start_day() + SStgui.update_uis(src) + +/** + * Proc that goes off when players vote for something with their mafia panel. + * + * If teams, it hides the tally overlay and only sends the vote messages to the team that is voting + * Arguments: + * * voter: the mafia role that is trying to vote for... + * * target: the mafia role that is getting voted for + * * vt: type of vote submitted (is this the day vote? is this the mafia night vote?) + * * teams: see mafia team defines for what to put in, makes the messages only send to a specific team (so mafia night votes only sending messages to mafia at night) + */ +/datum/mafia_controller/proc/vote_for(datum/mafia_role/voter,datum/mafia_role/target,vt, teams) + if(!votes[vt]) + votes[vt] = list() + var/old_vote = votes[vt][voter] + if(old_vote && old_vote == target) + votes[vt] -= voter + else + votes[vt][voter] = target + if(old_vote && old_vote == target) + send_message("[voter.body.real_name] retracts their vote for [target.body.real_name]!", team = teams) + else + send_message("[voter.body.real_name] voted for [target.body.real_name]!",team = teams) + if(!teams) + target.body.update_icon() //Update the vote display if it's a public vote + var/datum/mafia_role/old = old_vote + if(old) + old.body.update_icon() + +/** + * Clears out the votes of a certain type (day votes, mafia kill votes) while leaving others untouched + */ +/datum/mafia_controller/proc/reset_votes(vt) + var/list/bodies_to_update = list() + for(var/vote in votes[vt]) + var/datum/mafia_role/R = votes[vt][vote] + bodies_to_update += R.body + votes[vt] = list() + for(var/mob/M in bodies_to_update) + M.update_icon() + +/** + * Returns how many people voted for the role, in whatever vote (day vote, night kill vote) + * Arguments: + * * role: the mafia role the proc tries to get the amount of votes for + * * vt: the vote type (getting how many day votes were for the role, or mafia night votes for the role) + */ +/datum/mafia_controller/proc/get_vote_count(role,vt) + . = 0 + for(var/votee in votes[vt]) + if(votes[vt][votee] == role) + . += 1 + +/** + * Returns whichever role got the most votes, in whatever vote (day vote, night kill vote) + * returns null if no votes + * Arguments: + * * vt: the vote type (getting the role that got the most day votes, or the role that got the most mafia votes) + */ +/datum/mafia_controller/proc/get_vote_winner(vt) + var/list/tally = list() + for(var/votee in votes[vt]) + if(!tally[votes[vt][votee]]) + tally[votes[vt][votee]] = 1 + else + tally[votes[vt][votee]] += 1 + sortTim(tally,/proc/cmp_numeric_dsc,associative=TRUE) + return length(tally) ? tally[1] : null + +/** + * Returns a random person who voted for whatever vote (day vote, night kill vote) + * Arguments: + * * vt: vote type (getting a random day voter, or mafia night voter) + */ +/datum/mafia_controller/proc/get_random_voter(vt) + if(length(votes[vt])) + return pick(votes[vt]) + +/** + * Adds mutable appearances to people who get publicly voted on (so not night votes) showing how many people are picking them + * Arguments: + * * source: the body of the role getting the overlays + * * overlay_list: signal var passing the overlay list of the mob + */ +/datum/mafia_controller/proc/display_votes(atom/source, list/overlay_list) + if(phase != MAFIA_PHASE_VOTING) + return + var/v = get_vote_count(player_role_lookup[source],"Day") + var/mutable_appearance/MA = mutable_appearance('icons/obj/mafia.dmi',"vote_[v]") + overlay_list += MA + +/** + * Called when the game is setting up, AFTER map is loaded but BEFORE the phase timers start. Creates and places each role's body and gives the correct player key + * + * Notably: + * * Toggles godmode so the mafia players cannot kill themselves + * * Adds signals for voting overlays, see display_votes proc + * * gives mafia panel + * * sends the greeting text (goals, role name, etc) + */ +/datum/mafia_controller/proc/create_bodies() + for(var/datum/mafia_role/role in all_roles) + var/mob/living/carbon/human/H = new(get_turf(role.assigned_landmark)) + H.equipOutfit(player_outfit) + H.status_flags |= GODMODE + RegisterSignal(H,COMSIG_ATOM_UPDATE_OVERLAYS,.proc/display_votes) + var/datum/action/innate/mafia_panel/mafia_panel = new(null,src) + mafia_panel.Grant(H) + var/client/player_client = GLOB.directory[role.player_key] + if(player_client) + player_client.prefs.copy_to(H) + if(H.dna.species.outfit_important_for_life) //plasmamen + H.set_species(/datum/species/human) + role.body = H + player_role_lookup[H] = role + H.key = role.player_key + role.greet() + +/datum/mafia_controller/ui_data(mob/user) + . = ..() + switch(phase) + if(MAFIA_PHASE_DAY,MAFIA_PHASE_VOTING,MAFIA_PHASE_JUDGEMENT) + .["phase"] = "Day [turn]" + if(MAFIA_PHASE_NIGHT) + .["phase"] = "Night [turn]" + else + .["phase"] = "No Game" + if(user.client?.holder) + .["admin_controls"] = TRUE //show admin buttons to start/setup/stop + if(phase == MAFIA_PHASE_JUDGEMENT) + .["judgement_phase"] = TRUE //show judgement section + else + .["judgement_phase"] = FALSE + var/datum/mafia_role/user_role = player_role_lookup[user] + if(user_role) + .["roleinfo"] = list("role" = user_role.name,"desc" = user_role.desc, "action_log" = user_role.role_notes) + var/actions = list() + for(var/action in user_role.actions) + if(user_role.validate_action_target(src,action,null)) + actions += action + .["actions"] = actions + .["role_theme"] = user_role.special_theme + var/list/player_data = list() + for(var/datum/mafia_role/R in all_roles) + var/list/player_info = list() + var/list/actions = list() + if(user_role) //not observer + for(var/action in user_role.targeted_actions) + if(user_role.validate_action_target(src,action,R)) + actions += action + //Awful snowflake, could use generalizing + if(phase == MAFIA_PHASE_VOTING) + player_info["votes"] = get_vote_count(R,"Day") + if(R.game_status == MAFIA_ALIVE && R != user_role) + actions += "Vote" + if(phase == MAFIA_PHASE_NIGHT && user_role.team == MAFIA_TEAM_MAFIA && R.game_status == MAFIA_ALIVE && R.team != MAFIA_TEAM_MAFIA) + actions += "Kill Vote" + player_info["name"] = R.body.real_name + player_info["ref"] = REF(R) + player_info["actions"] = actions + player_info["alive"] = R.game_status == MAFIA_ALIVE + player_data += list(player_info) + .["players"] = player_data + .["timeleft"] = next_phase_timer ? timeleft(next_phase_timer) : 0 + + //Not sure on this, should this info be visible + .["all_roles"] = current_setup_text + +/datum/mafia_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + var/datum/mafia_role/user_role = player_role_lookup[usr] + //Admin actions + if(usr.client?.holder) + switch(action) + if("new_game") + end_game() + basic_setup() + if("nuke") + end_game() + for(var/i in landmarks) + qdel(i) + qdel(town_center_landmark) + qdel(src) + if("next_phase") + var/datum/timedevent/timer = SStimer.timer_id_dict[next_phase_timer] + if(!timer.spent) + var/datum/callback/tc = timer.callBack + deltimer(next_phase_timer) + tc.InvokeAsync() + return TRUE + if("players_home") + var/list/failed = list() + for(var/datum/mafia_role/player in all_roles) + if(!player.body) + failed += player + continue + player.body.forceMove(get_turf(player.assigned_landmark)) + if(failed.len) + to_chat(usr, "List of players who no longer had a body (if you see this, the game is runtiming anyway so just hit \"New Game\" to end it") + for(var/i in failed) + var/datum/mafia_role/fail = i + to_chat(usr, fail.player_key) + switch(action) + if("mf_lookup") + var/role_lookup = params["atype"] + var/datum/mafia_role/helper + for(var/datum/mafia_role/role in all_roles) + if(role_lookup == role.name) + helper = role + break + helper.show_help(usr) + if(!user_role || user_role.game_status == MAFIA_DEAD)//ghosts, dead people? + return + var/self_voting = user_role == on_trial ? TRUE : FALSE //used to block people from voting themselves innocent or guilty + //User actions + switch(action) + if("mf_action") + if(!user_role.actions.Find(params["atype"])) + return + user_role.handle_action(src,params["atype"],null) + return TRUE //vals for self-ui update + if("mf_targ_action") + var/datum/mafia_role/target = locate(params["target"]) in all_roles + if(!istype(target)) + return + switch(params["atype"]) + if("Vote") + if(phase != MAFIA_PHASE_VOTING) + return + vote_for(user_role,target,vt="Day") + if("Kill Vote") + if(phase != MAFIA_PHASE_NIGHT || user_role.team != MAFIA_TEAM_MAFIA) + return + vote_for(user_role,target,"Mafia", MAFIA_TEAM_MAFIA) + to_chat(user_role.body,"You will vote for [target.body.real_name] for tonights killing.") + else + if(!user_role.targeted_actions.Find(params["atype"])) + return + if(!user_role.validate_action_target(src,params["atype"],target)) + return + user_role.handle_action(src,params["atype"],target) + return TRUE + if("vote_innocent") + if(phase != MAFIA_PHASE_JUDGEMENT && !self_voting) + return + to_chat(user_role.body,"Your vote on [on_trial.body.real_name] submitted as INNOCENT!") + judgement_innocent_votes -= user_role//no double voting + judgement_guilty_votes -= user_role//no radical centrism + judgement_innocent_votes += user_role + if("vote_guilty") + if(phase != MAFIA_PHASE_JUDGEMENT && !self_voting) + return + to_chat(user_role.body,"Your vote on [on_trial.body.real_name] submitted as GUILTY!") + judgement_innocent_votes -= user_role//no radical centrism + judgement_guilty_votes -= user_role//no double voting + judgement_guilty_votes += user_role + +/datum/mafia_controller/ui_state(mob/user) + return GLOB.always_state + +/datum/mafia_controller/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, null) + if(!ui) + ui = new(user, src, "MafiaPanel") + ui.set_autoupdate(FALSE) + ui.open() + +/proc/assoc_value_sum(list/L) + . = 0 + for(var/key in L) + . += L[key] + +/** + * Returns all setups that the amount of players signed up could support (so fill each role) + * Arguments: + * * ready_count: the amount of players signed up (not sane, so some players may have disconnected or rejoined ss13). + */ +/datum/mafia_controller/proc/find_best_setup(ready_count) + var/list/all_setups = GLOB.mafia_setups + var/valid_setups = list() + for(var/S in all_setups) + var/req_players = assoc_value_sum(S) + if(req_players <= ready_count) + valid_setups += list(S) + return length(valid_setups) > 0 ? pick(valid_setups) : null + +/** + * Called when enough players have signed up to fill a setup. DOESN'T NECESSARILY MEAN THE GAME WILL START. + * + * Checks if everyone signed up is an observer, and is still connected. If people aren't, they're removed from the list. + * If there aren't enough players post sanity, it aborts. otherwise, it selects enough people for the game and starts preparing the game for real. + */ +/datum/mafia_controller/proc/basic_setup() + var/ready_count = length(GLOB.mafia_signup) + var/list/setup = find_best_setup(ready_count) + if(!setup) + return + var/req_players = assoc_value_sum(setup) //12 + + //final list for all the players who will be in this game + var/list/filtered_keys = list() + //cuts invalid players from signups (disconnected/not a ghost) + var/list/possible_keys = list() + for(var/key in GLOB.mafia_signup) + if(GLOB.directory[key] && GLOB.directory[key] == GLOB.mafia_signup[key]) + var/client/C = GLOB.directory[key] + if(isobserver(C.mob)) + possible_keys += key + continue + GLOB.mafia_signup -= key //not valid to play when we checked so remove them from signups + + //if there were not enough players, don't start. we already trimmed the list to now hold only valid signups + if(length(possible_keys) < req_players) + return + + //if there were too many players, still start but only make filtered keys as big as it needs to be (cut excess) + //also removes people who do get into final player list from the signup so they have to sign up again when game ends + for(var/i in 1 to req_players) + var/chosen_key = pick_n_take(possible_keys) + filtered_keys += chosen_key + GLOB.mafia_signup -= chosen_key + //small message about not getting into this game for clarity on why they didn't get in + for(var/unpicked in possible_keys) + var/client/unpicked_client = GLOB.directory[unpicked] + to_chat(unpicked_client, "Sorry, the starting mafia game has too many players and you were not picked.") + to_chat(unpicked_client, "You're still signed up, and have another chance to join when the one starting now finishes.") + + prepare_game(setup,filtered_keys) + start_game() + +/** + * Called when someone signs up, and sees if there are enough people in the signup list to begin. + * + * Only checks if everyone is actually valid to start (still connected and an observer) if there are enough players (basic_setup) + */ +/datum/mafia_controller/proc/try_autostart() + if(phase != MAFIA_PHASE_SETUP) + return + var/min_players = INFINITY // fairly sure mmo mafia is not a thing and i'm lazy + for(var/setup in GLOB.mafia_setups) + min_players = min(min_players,assoc_value_sum(setup)) + if(GLOB.mafia_signup.len >= min_players)//enough people to try and make something + basic_setup() + +/datum/action/innate/mafia_panel + name = "Mafia Panel" + desc = "Use this to play." + icon_icon = 'icons/obj/mafia.dmi' + button_icon_state = "board" + var/datum/mafia_controller/parent + +/datum/action/innate/mafia_panel/New(Target,mf) + . = ..() + parent = mf + +/datum/action/innate/mafia_panel/Activate() + parent.ui_interact(owner) + +/** + * Creates the global datum for playing mafia games, destroys the last if that's required and returns the new. + */ +/proc/create_mafia_game() + if(GLOB.mafia_game) + QDEL_NULL(GLOB.mafia_game) + var/datum/mafia_controller/MF = new() + return MF diff --git a/code/modules/mafia/map_pieces.dm b/code/modules/mafia/map_pieces.dm new file mode 100644 index 0000000000..f0472c7e9f --- /dev/null +++ b/code/modules/mafia/map_pieces.dm @@ -0,0 +1,71 @@ +/obj/effect/landmark/mafia_game_area //locations where mafia will be loaded by the datum + name = "Mafia Area Spawn" + var/game_id = "mafia" + +/obj/effect/landmark/mafia + name = "Mafia Player Spawn" + var/game_id = "mafia" + +/obj/effect/landmark/mafia/town_center + name = "Mafia Town Center" + +//for ghosts/admins +/obj/mafia_game_board + name = "Mafia Game Board" + icon = 'icons/obj/mafia.dmi' + icon_state = "board" + var/game_id = "mafia" + +/obj/mafia_game_board/attack_ghost(mob/user) + . = ..() + var/datum/mafia_controller/MF = GLOB.mafia_game + if(!MF) + MF = create_mafia_game() + MF.ui_interact(user) + +/area/mafia + name = "Mafia Minigame" + icon_state = "mafia" + dynamic_lighting = DYNAMIC_LIGHTING_DISABLED + requires_power = FALSE + has_gravity = STANDARD_GRAVITY + flags_1 = NONE + block_suicide = TRUE + +/datum/map_template/mafia + var/description = "" + +/datum/map_template/mafia/summerball + name = "Summerball 2020" + description = "The original, the OG. The 2020 Summer ball was where mafia came from, with this map." + mappath = "_maps/map_files/Mafia/mafia_ball.dmm" + +/datum/map_template/mafia/syndicate + name = "Syndicate Megastation" + description = "Yes, it's a very confusing day at the Megastation. Will the syndicate conflict resolution operatives succeed?" + mappath = "_maps/map_files/Mafia/mafia_syndie.dmm" + +/datum/map_template/mafia/lavaland + name = "Lavaland Excursion" + description = "The station has no idea what's going down on lavaland right now, we got changelings... traitors, and worst of all... lawyers roleblocking you every night." + mappath = "_maps/map_files/Mafia/mafia_lavaland.dmm" + +/datum/map_template/mafia/ufo + name = "Alien Mothership" + description = "The haunted ghost UFO tour has gone south and now it's up to our fine townies and scare seekers to kill the actual real alien changelings..." + mappath = "_maps/map_files/Mafia/mafia_ayylmao.dmm" + +/datum/map_template/mafia/spider_clan + name = "Spider Clan Kidnapping" + description = "New and improved spider clan kidnappings are a lot less boring and have a lot more lynching. Damn westaboos!" + mappath = "_maps/map_files/Mafia/mafia_spiderclan.dmm" + +/datum/map_template/mafia/snowy + name = "Snowdin" + description = "Based off of the icey moon map of the same name, the guy who reworked it pretty much did it for nothing since away missions are disabled but at least he'll get this...?" + mappath = "_maps/map_files/Mafia/mafia_snow.dmm" + +/datum/map_template/mafia/gothic + name = "Vampire's Castle" + description = "Vampires and changelings clash to find out who's the superior bloodsucking monster in this creepy castle map." + mappath = "_maps/map_files/Mafia/mafia_gothic.dmm" diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm new file mode 100644 index 0000000000..65c6b9e980 --- /dev/null +++ b/code/modules/mafia/outfits.dm @@ -0,0 +1,96 @@ + +//what people wear unrevealed + +/datum/outfit/mafia + name = "Mafia Game Outfit" + uniform = /obj/item/clothing/under/color/grey + shoes = /obj/item/clothing/shoes/sneakers/black + +//town + +/datum/outfit/mafia/assistant + name = "Mafia Assistant" + + uniform = /obj/item/clothing/under/color/rainbow + +/datum/outfit/mafia/detective + name = "Mafia Detective" + + uniform = /obj/item/clothing/under/rank/security/detective + neck = /obj/item/clothing/neck/tie/detective + shoes = /obj/item/clothing/shoes/sneakers/brown + suit = /obj/item/clothing/suit/det_suit + gloves = /obj/item/clothing/gloves/color/black + head = /obj/item/clothing/head/fedora/det_hat + mask = /obj/item/clothing/mask/cigarette + +/datum/outfit/mafia/psychologist + name = "Mafia Psychologist" + + uniform = /obj/item/clothing/under/suit/black + shoes = /obj/item/clothing/shoes/laceup + +/datum/outfit/mafia/md + name = "Mafia Medical Doctor" + + uniform = /obj/item/clothing/under/rank/medical/doctor + shoes = /obj/item/clothing/shoes/sneakers/white + suit = /obj/item/clothing/suit/toggle/labcoat + +/datum/outfit/mafia/chaplain + name = "Mafia Chaplain" + + uniform = /obj/item/clothing/under/rank/civilian/chaplain + +/datum/outfit/mafia/clown + name = "Mafia Clown" + + uniform = /obj/item/clothing/under/rank/civilian/clown + shoes = /obj/item/clothing/shoes/clown_shoes + mask = /obj/item/clothing/mask/gas/clown_hat + +/datum/outfit/mafia/lawyer + name = "Mafia Lawyer" + + uniform = /obj/item/clothing/under/rank/civilian/lawyer/bluesuit + suit = /obj/item/clothing/suit/toggle/lawyer + shoes = /obj/item/clothing/shoes/laceup + + + + +//mafia + +/datum/outfit/mafia/changeling + name = "Mafia Changeling" + + head = /obj/item/clothing/head/helmet/changeling + suit = /obj/item/clothing/suit/armor/changeling + +//solo + +/datum/outfit/mafia/fugitive + name = "Mafia Fugitive" + + uniform = /obj/item/clothing/under/rank/prisoner + shoes = /obj/item/clothing/shoes/sneakers/orange + +/datum/outfit/mafia/obsessed + name = "Mafia Obsessed" + uniform = /obj/item/clothing/under/misc/overalls + shoes = /obj/item/clothing/shoes/sneakers/white + gloves = /obj/item/clothing/gloves/color/latex + mask = /obj/item/clothing/mask/surgical + suit = /obj/item/clothing/suit/apron + +/datum/outfit/mafia/obsessed/post_equip(mob/living/carbon/human/H) + for(var/obj/item/carried_item in H.get_equipped_items(TRUE)) + carried_item.add_mob_blood(H)//Oh yes, there will be blood... + H.regenerate_icons() + +/datum/outfit/mafia/traitor + name = "Mafia Traitor" + + mask = /obj/item/clothing/mask/gas/syndicate + uniform = /obj/item/clothing/under/syndicate/tacticool + shoes = /obj/item/clothing/shoes/jackboots diff --git a/code/modules/mafia/roles.dm b/code/modules/mafia/roles.dm new file mode 100644 index 0000000000..394d121005 --- /dev/null +++ b/code/modules/mafia/roles.dm @@ -0,0 +1,487 @@ +/datum/mafia_role + var/name = "Assistant" + var/desc = "You are a crewmember without any special abilities." + var/win_condition = "kill all mafia and solo killing roles." + var/team = MAFIA_TEAM_TOWN + + var/player_key + var/mob/living/carbon/human/body + var/obj/effect/landmark/mafia/assigned_landmark + + var/revealed = FALSE + var/datum/outfit/revealed_outfit = /datum/outfit/mafia/assistant //the assistants need a special path to call out they were in fact assistant, everything else can just use job equipment + //action = uses + var/list/actions = list() + var/list/targeted_actions = list() + + //so mafia have to also kill them to have a majority + var/solo_counts_as_town = FALSE //(don't set this for town) + + var/game_status = MAFIA_ALIVE + + var/special_theme //set this to something cool for antagonists and their window will look different + + var/list/role_notes = list() + + +/datum/mafia_role/New(datum/mafia_controller/game) + . = ..() + +/datum/mafia_role/proc/kill(datum/mafia_controller/game,lynch=FALSE) + if(SEND_SIGNAL(src,COMSIG_MAFIA_ON_KILL,game,lynch) & MAFIA_PREVENT_KILL) + return FALSE + game_status = MAFIA_DEAD + body.death() + if(lynch) + reveal_role(game, verbose = TRUE) + return TRUE + +/datum/mafia_role/Destroy(force, ...) + QDEL_NULL(body) + . = ..() + +/datum/mafia_role/proc/greet() + SEND_SOUND(body, 'sound/ambience/ambifailure.ogg') + to_chat(body,"You are the [name].") + to_chat(body,"[desc]") + switch(team) + if(MAFIA_TEAM_MAFIA) + to_chat(body,"You and your co-conspirators win if you outnumber crewmembers.") + if(MAFIA_TEAM_TOWN) + to_chat(body,"You are a crewmember. Find out and lynch the changelings!") + if(MAFIA_TEAM_SOLO) + to_chat(body,"You are not aligned to town or mafia. Accomplish your own objectives!") + to_chat(body, "Be sure to read the wiki page to learn more, if you have no idea what's going on.") + +//please take care with this, they can break shit with their equipment unless you specifically disallow them (aka stun at the end of the game) +/datum/mafia_role/proc/reveal_role(datum/mafia_controller/game, verbose = FALSE) + if(revealed) + return + if(verbose) + game.send_message("It is revealed that the true role of [body] [game_status == MAFIA_ALIVE ? "is" : "was"] [name]!") + var/list/oldoutfit = body.get_equipped_items() + for(var/thing in oldoutfit) + qdel(thing) + body.equipOutfit(revealed_outfit) + revealed = TRUE + +/datum/mafia_role/proc/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) + return + +/datum/mafia_role/proc/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,action,target) & MAFIA_PREVENT_ACTION) + return FALSE + return TRUE + +/datum/mafia_role/proc/add_note(note) + role_notes += note + +/datum/mafia_role/proc/check_total_victory(alive_town, alive_mafia) //solo antags can win... solo. + return FALSE + +/datum/mafia_role/proc/block_team_victory(alive_town, alive_mafia) //solo antags can also block team wins. + return FALSE + +/datum/mafia_role/proc/show_help(clueless) + var/list/result = list() + var/team_desc = "" + var/team_span = "" + var/the = TRUE + switch(team) + if(MAFIA_TEAM_TOWN) + team_desc = "Town" + team_span = "nicegreen" + if(MAFIA_TEAM_MAFIA) + team_desc = "Mafia" + team_span = "red" + if(MAFIA_TEAM_SOLO) + team_desc = "Nobody" + team_span = "comradio" + the = FALSE + result += "The [name] is aligned with [the ? "the " : ""][team_desc]" + result += "\"[desc]\"" + result += "[name] wins when they [win_condition]" + to_chat(clueless, result.Join("
")) + +/datum/mafia_role/detective + name = "Detective" + desc = "You can investigate a single person each night to learn their team." + revealed_outfit = /datum/outfit/mafia/detective + + targeted_actions = list("Investigate") + + var/datum/mafia_role/current_investigation + +/datum/mafia_role/detective/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/investigate) + +/datum/mafia_role/detective/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) + . = ..() + if(!.) + return + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src + +/datum/mafia_role/detective/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) + if(!target || target.game_status != MAFIA_ALIVE) + to_chat(body,"You can only investigate alive people.") + return + to_chat(body,"You will investigate [target.body.real_name] tonight.") + current_investigation = target + +/datum/mafia_role/detective/proc/investigate(datum/mafia_controller/game) + var/datum/mafia_role/R = current_investigation + if(R) + var/team_text + var/fluff + switch(R.team) + if(MAFIA_TEAM_TOWN) + team_text = "Town" + fluff = "a true member of the station." + if(MAFIA_TEAM_MAFIA) + team_text = "Mafia" + fluff = "an unfeeling, hideous changeling!" + if(MAFIA_TEAM_SOLO) + team_text = "Solo" + fluff = "a rogue, with their own objectives..." + to_chat(body,"Your investigations reveal that [R.body.real_name] is [fluff]") + add_note("N[game.turn] - [R.body.real_name] - [team_text]") + current_investigation = null + +/datum/mafia_role/md + name = "Medical Doctor" + desc = "You can protect a single person each night from killing." + revealed_outfit = /datum/outfit/mafia/md // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) + + targeted_actions = list("Protect") + + var/datum/mafia_role/current_protected + +/datum/mafia_role/md/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/protect) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/end_protection) + +/datum/mafia_role/md/validate_action_target(datum/mafia_controller/game,action,datum/mafia_role/target) + . = ..() + if(!.) + return + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_ALIVE && target != src + +/datum/mafia_role/md/handle_action(datum/mafia_controller/game,action,datum/mafia_role/target) + if(!target || target.game_status != MAFIA_ALIVE) + to_chat(body,"You can only protect alive people.") + return + to_chat(body,"You will protect [target.body.real_name] tonight.") + current_protected = target + +/datum/mafia_role/md/proc/protect(datum/mafia_controller/game) + if(current_protected) + RegisterSignal(current_protected,COMSIG_MAFIA_ON_KILL,.proc/prevent_kill) + add_note("N[game.turn] - Protected [current_protected.body.real_name]") + +/datum/mafia_role/md/proc/prevent_kill(datum/source) + to_chat(body,"The person you protected tonight was attacked!") + to_chat(current_protected.body,"You were attacked last night, but someone nursed you back to life!") + return MAFIA_PREVENT_KILL + +/datum/mafia_role/md/proc/end_protection(datum/mafia_controller/game) + if(current_protected) + UnregisterSignal(current_protected,COMSIG_MAFIA_ON_KILL) + current_protected = null + +/datum/mafia_role/chaplain + name = "Chaplain" + desc = "You can communicate with spirits of the dead each night to discover dead crewmember roles." + revealed_outfit = /datum/outfit/mafia/chaplain + + targeted_actions = list("Pray") + var/current_target + +/datum/mafia_role/chaplain/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_ACTION_PHASE,.proc/commune) + +/datum/mafia_role/chaplain/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!.) + return + return game.phase == MAFIA_PHASE_NIGHT && target.game_status == MAFIA_DEAD && target != src && !target.revealed + +/datum/mafia_role/chaplain/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + to_chat(body,"You will commune with the spirit of [target.body.real_name] tonight.") + current_target = target + +/datum/mafia_role/chaplain/proc/commune(datum/mafia_controller/game) + var/datum/mafia_role/R = current_target + if(R) + to_chat(body,"You invoke spirit of [R.body.real_name] and learn their role was [R.name].") + add_note("N[game.turn] - [R.body.real_name] - [R.name]") + current_target = null + +/datum/mafia_role/lawyer + name = "Lawyer" + desc = "You can choose a person during the day to provide extensive legal advice to during the night, preventing night actions." + + revealed_outfit = /datum/outfit/mafia/lawyer + targeted_actions = list("Advise") + + var/datum/mafia_role/current_target + +/datum/mafia_role/lawyer/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/roleblock_text) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_START,.proc/try_to_roleblock) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/release) + +/datum/mafia_role/lawyer/proc/roleblock_text(datum/mafia_controller/game) + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"roleblock",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by another lawyer. + current_target = null + if(current_target) + to_chat(current_target.body,"YOU HAVE BEEN BLOCKED! YOU CANNOT PERFORM ANY ACTIONS TONIGHT.") + add_note("N[game.turn] - [current_target.body.real_name] - Blocked") + +/datum/mafia_role/lawyer/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!.) + return FALSE + if(game.phase == MAFIA_PHASE_NIGHT) + return FALSE + if(target.game_status != MAFIA_ALIVE) + return FALSE + +/datum/mafia_role/lawyer/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(target == current_target) + current_target = null + to_chat(body,"You have decided against blocking anyone tonight.") + else + current_target = target + to_chat(body,"You will block [target.body.real_name] tonight.") + +/datum/mafia_role/lawyer/proc/try_to_roleblock(datum/mafia_controller/game) + if(current_target) + RegisterSignal(current_target,COMSIG_MAFIA_CAN_PERFORM_ACTION, .proc/prevent_action) + +/datum/mafia_role/lawyer/proc/release(datum/mafia_controller/game) + . = ..() + if(current_target) + UnregisterSignal(current_target, COMSIG_MAFIA_CAN_PERFORM_ACTION) + current_target = null + +/datum/mafia_role/lawyer/proc/prevent_action(datum/source) + if(game_status == MAFIA_ALIVE) //in case we got killed while imprisoning sk - bad luck edge + return MAFIA_PREVENT_ACTION + +/datum/mafia_role/psychologist + name = "Psychologist" + desc = "You can visit someone ONCE PER GAME to reveal their true role in the morning!" + revealed_outfit = /datum/outfit/mafia/psychologist + + targeted_actions = list("Reveal") + var/datum/mafia_role/current_target + var/can_use = TRUE + +/datum/mafia_role/psychologist/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/therapy_reveal) + +/datum/mafia_role/psychologist/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!. || !can_use || game.phase == MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || target.revealed || target == src) + return FALSE + +/datum/mafia_role/psychologist/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + to_chat(body,"You will reveal [target.body.real_name] tonight.") + current_target = target + +/datum/mafia_role/psychologist/proc/therapy_reveal(datum/mafia_controller/game) + if(SEND_SIGNAL(src,COMSIG_MAFIA_CAN_PERFORM_ACTION,game,"reveal",current_target) & MAFIA_PREVENT_ACTION || game_status != MAFIA_ALIVE) //Got lynched or roleblocked by a lawyer. + current_target = null + if(current_target) + add_note("N[game.turn] - [current_target.body.real_name] - Revealed true identity") + to_chat(body,"You have revealed the true nature of the [current_target]!") + current_target.reveal_role(game, verbose = TRUE) + current_target = null + can_use = FALSE + +///MAFIA ROLES/// only one until i rework this to allow more, they're the "anti-town" working to kill off townies to win + +/datum/mafia_role/mafia + name = "Changeling" + desc = "You're a member of the changeling hive. Use ':j' talk prefix to talk to your fellow lings." + team = MAFIA_TEAM_MAFIA + revealed_outfit = /datum/outfit/mafia/changeling + special_theme = "syndicate" + win_condition = "become majority over the town and no solo killing role can stop them." + +/datum/mafia_role/mafia/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/mafia_text) + +/datum/mafia_role/mafia/proc/mafia_text(datum/mafia_controller/source) + to_chat(body,"Vote for who to kill tonight. The killer will be chosen randomly from voters.") + +///SOLO ROLES/// they range from anomalous factors to deranged killers that try to win alone. + +/datum/mafia_role/traitor + name = "Traitor" + desc = "You're a solo traitor. You are immune to night kills, can kill every night and you win by outnumbering everyone else." + win_condition = "kill everyone." + team = MAFIA_TEAM_SOLO + targeted_actions = list("Night Kill") + revealed_outfit = /datum/outfit/mafia/traitor + special_theme = "syndicate" + + var/datum/mafia_role/current_victim + +/datum/mafia_role/traitor/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/nightkill_immunity) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_KILL_PHASE,.proc/try_to_kill) + +/datum/mafia_role/traitor/check_total_victory(alive_town, alive_mafia) //serial killers just want teams dead + return alive_town + alive_mafia <= 1 + +/datum/mafia_role/traitor/block_team_victory(alive_town, alive_mafia) //no team can win until they're dead + return TRUE //while alive, town AND mafia cannot win (though since mafia know who is who it's pretty easy to win from that point) + +/datum/mafia_role/traitor/proc/nightkill_immunity(datum/source,datum/mafia_controller/game,lynch) + if(game.phase == MAFIA_PHASE_NIGHT && !lynch) + to_chat(body,"You were attacked, but they'll have to try harder than that to put you down.") + return MAFIA_PREVENT_KILL + +/datum/mafia_role/traitor/validate_action_target(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!.) + return FALSE + if(game.phase != MAFIA_PHASE_NIGHT || target.game_status != MAFIA_ALIVE || target == src) + return FALSE + +/datum/mafia_role/traitor/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + current_victim = target + to_chat(body,"You will attempt to kill [target.body.real_name] tonight.") + +/datum/mafia_role/traitor/proc/try_to_kill(datum/mafia_controller/source) + if(game_status == MAFIA_ALIVE && current_victim && current_victim.game_status == MAFIA_ALIVE) + if(!current_victim.kill(source)) + to_chat(body,"Your attempt at killing [current_victim.body] was prevented!") + current_victim = null + +//just helps read better +#define FUGITIVE_NOT_PRESERVING 0//will not become night immune tonight +#define FUGITIVE_WILL_PRESERVE 1 //will become night immune tonight + +/datum/mafia_role/fugitive + name = "Fugitive" + desc = "You're on the run. You can become immune to night kills exactly twice, and you win by surviving to the end of the game with anyone." + win_condition = "survive to the end of the game, with anyone" + team = MAFIA_TEAM_SOLO + actions = list("Self Preservation") + var/charges = 2 + var/protection_status = FUGITIVE_NOT_PRESERVING + solo_counts_as_town = TRUE //should not count towards mafia victory, they should have the option to work with town + revealed_outfit = /datum/outfit/mafia/fugitive + +/datum/mafia_role/fugitive/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/night_start) + RegisterSignal(game,COMSIG_MAFIA_NIGHT_END,.proc/night_end) + RegisterSignal(game,COMSIG_MAFIA_GAME_END,.proc/survived) + +/datum/mafia_role/fugitive/handle_action(datum/mafia_controller/game, action, datum/mafia_role/target) + . = ..() + if(!charges) + to_chat(body,"You're out of supplies and cannot protect yourself anymore.") + return + if(game.phase == MAFIA_PHASE_NIGHT) + to_chat(body,"You don't have time to prepare, night has already arrived.") + return + if(protection_status == FUGITIVE_WILL_PRESERVE) + to_chat(body,"You decide to not prepare tonight.") + else + to_chat(body,"You decide to prepare for a horrible night.") + protection_status = !protection_status + +/datum/mafia_role/fugitive/proc/night_start(datum/mafia_controller/game) + if(protection_status == FUGITIVE_WILL_PRESERVE) + to_chat(body,"Your preparations are complete. Nothing could kill you tonight!") + RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/prevent_death) + +/datum/mafia_role/fugitive/proc/night_end(datum/mafia_controller/game) + if(protection_status == FUGITIVE_WILL_PRESERVE) + charges-- + UnregisterSignal(src,COMSIG_MAFIA_ON_KILL) + to_chat(body,"You are no longer protected. You have [charges] use[charges == 1 ? "" : "s"] left of your power.") + protection_status = FUGITIVE_NOT_PRESERVING + +/datum/mafia_role/fugitive/proc/prevent_death(datum/mafia_controller/game) + to_chat(body,"You were attacked! Luckily, you were ready for this!") + return MAFIA_PREVENT_KILL + +/datum/mafia_role/fugitive/proc/survived(datum/mafia_controller/game) + if(game_status == MAFIA_ALIVE) + game.send_message("!! FUGITIVE VICTORY !!") + +#undef FUGITIVE_NOT_PRESERVING +#undef FUGITIVE_WILL_PRESERVE + +/datum/mafia_role/obsessed + name = "Obsessed" + desc = "You're completely lost in your own mind. You win by lynching your obsession before you get killed in this mess. Obsession assigned on the first night!" + win_condition = "lynch their obsession." + team = MAFIA_TEAM_SOLO + revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) + + solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective! + var/datum/mafia_role/obsession + var/lynched_target = FALSE + +/datum/mafia_role/obsessed/New(datum/mafia_controller/game) //note: obsession is always a townie + . = ..() + RegisterSignal(game,COMSIG_MAFIA_SUNDOWN,.proc/find_obsession) + +/datum/mafia_role/obsessed/proc/find_obsession(datum/mafia_controller/game) + var/list/all_roles_shuffle = shuffle(game.all_roles) + for(var/role in all_roles_shuffle) + var/datum/mafia_role/possible = role + if(possible.team == MAFIA_TEAM_TOWN && possible.game_status != MAFIA_DEAD) + obsession = possible + break + if(!obsession) + obsession = pick(all_roles_shuffle) //okay no town just pick anyone here + //if you still don't have an obsession you're playing a single player game like i can't help your dumb ass + to_chat(body, "Your obsession is [obsession.body.real_name]! Get them lynched to win!") + add_note("N[game.turn] - I vowed to watch my obsession, [obsession.body.real_name], hang!") //it'll always be N1 but whatever + RegisterSignal(obsession,COMSIG_MAFIA_ON_KILL,.proc/check_victory) + UnregisterSignal(game,COMSIG_MAFIA_SUNDOWN) + +/datum/mafia_role/obsessed/proc/check_victory(datum/source,datum/mafia_controller/game,lynch) + UnregisterSignal(source,COMSIG_MAFIA_ON_KILL) + if(game_status == MAFIA_DEAD) + return + if(lynch) + game.send_message("!! OBSESSED VICTORY !!") + reveal_role(game, FALSE) + else + to_chat(body, "You have failed your objective to lynch [obsession.body]!") + +/datum/mafia_role/clown + name = "Clown" + desc = "If you are lynched you take down one of your voters with you and win. HONK!" + win_condition = "get themselves lynched!" + revealed_outfit = /datum/outfit/mafia/clown + team = MAFIA_TEAM_SOLO + +/datum/mafia_role/clown/New(datum/mafia_controller/game) + . = ..() + RegisterSignal(src,COMSIG_MAFIA_ON_KILL,.proc/prank) + +/datum/mafia_role/clown/proc/prank(datum/source,datum/mafia_controller/game,lynch) + if(lynch) + var/datum/mafia_role/victim = pick(game.judgement_guilty_votes) + game.send_message("[body.real_name] WAS A CLOWN! HONK! They take down [victim.body.real_name] with their last prank.") + game.send_message("!! CLOWN VICTORY !!") + victim.kill(game,FALSE) diff --git a/tgstation.dme b/tgstation.dme index 9306ae0ef1..be9c297548 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2289,6 +2289,11 @@ #include "code\modules\lighting\lighting_setup.dm" #include "code\modules\lighting\lighting_source.dm" #include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\mafia\_defines.dm" +#include "code\modules\mafia\controller.dm" +#include "code\modules\mafia\map_pieces.dm" +#include "code\modules\mafia\outfits.dm" +#include "code\modules\mafia\roles.dm" #include "code\modules\mapping\map_config.dm" #include "code\modules\mapping\map_orientation_pattern.dm" #include "code\modules\mapping\map_template.dm" From 3a4dca33fa41c91b7094b8796e92b713413c5dc4 Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Fri, 17 Jul 2020 14:16:30 +0800 Subject: [PATCH 25/63] maps, will deal with tgui later --- _maps/map_files/Mafia/mafia_ayylmao.dmm | 768 ++++++++++++++++ _maps/map_files/Mafia/mafia_ball.dmm | 678 ++++++++++++++ _maps/map_files/Mafia/mafia_gothic.dmm | 723 +++++++++++++++ _maps/map_files/Mafia/mafia_lavaland.dmm | 976 +++++++++++++++++++++ _maps/map_files/Mafia/mafia_snow.dmm | 758 ++++++++++++++++ _maps/map_files/Mafia/mafia_spiderclan.dmm | 690 +++++++++++++++ _maps/map_files/Mafia/mafia_syndie.dmm | 868 ++++++++++++++++++ 7 files changed, 5461 insertions(+) create mode 100644 _maps/map_files/Mafia/mafia_ayylmao.dmm create mode 100644 _maps/map_files/Mafia/mafia_ball.dmm create mode 100644 _maps/map_files/Mafia/mafia_gothic.dmm create mode 100644 _maps/map_files/Mafia/mafia_lavaland.dmm create mode 100644 _maps/map_files/Mafia/mafia_snow.dmm create mode 100644 _maps/map_files/Mafia/mafia_spiderclan.dmm create mode 100644 _maps/map_files/Mafia/mafia_syndie.dmm diff --git a/_maps/map_files/Mafia/mafia_ayylmao.dmm b/_maps/map_files/Mafia/mafia_ayylmao.dmm new file mode 100644 index 0000000000..9c4fcdf326 --- /dev/null +++ b/_maps/map_files/Mafia/mafia_ayylmao.dmm @@ -0,0 +1,768 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"b" = ( +/turf/closed/indestructible{ + desc = "A wall with alien alloy plating."; + icon = 'icons/turf/walls/abductor_wall.dmi'; + icon_state = "abductor"; + name = "alien wall"; + smooth = 5 + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/fakespace, +/area/mafia) +"j" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien22" + }, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"l" = ( +/obj/structure/closet/abductor, +/turf/open/floor/plating/abductor, +/area/mafia) +"m" = ( +/obj/effect/landmark/mafia, +/obj/structure/bed/abductor, +/turf/open/floor/plating/abductor, +/area/mafia) +"n" = ( +/obj/effect/landmark/mafia, +/obj/structure/bed/abductor, +/turf/open/floor/plating/abductor2, +/area/mafia) +"o" = ( +/obj/structure/closet/abductor, +/turf/open/floor/plating/abductor2, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/fakeglass, +/area/mafia) +"q" = ( +/turf/open/floor/plating/abductor, +/area/mafia) +"r" = ( +/turf/open/floor/plating/abductor2, +/area/mafia) +"t" = ( +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/mafia) +"u" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/mafia) +"v" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"x" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/obj/structure/window/plasma/reinforced/plastitanium, +/turf/open/floor/plating/abductor2, +/area/mafia) +"z" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/fakespace, +/area/mafia) +"B" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien2" + }, +/area/mafia) +"D" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien15" + }, +/area/mafia) +"E" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien7" + }, +/area/mafia) +"F" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien12" + }, +/area/mafia) +"G" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien17" + }, +/area/mafia) +"H" = ( +/turf/open/space/basic, +/area/mafia) +"I" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien24" + }, +/area/mafia) +"J" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien18" + }, +/area/mafia) +"K" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien11" + }, +/area/mafia) +"L" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien14" + }, +/area/mafia) +"M" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien4" + }, +/area/mafia) +"N" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien21" + }, +/area/mafia) +"P" = ( +/turf/closed/indestructible/abductor, +/area/mafia) +"Q" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien5" + }, +/area/mafia) +"S" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien3" + }, +/area/mafia) +"U" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien23" + }, +/area/mafia) +"V" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien13" + }, +/area/mafia) +"W" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien20" + }, +/area/mafia) +"Y" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien8" + }, +/area/mafia) +"Z" = ( +/turf/closed/indestructible/abductor{ + icon_state = "alien10" + }, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +b +a +"} +(4,1,1) = {" +a +b +i +i +g +z +i +i +i +i +i +i +i +i +i +H +i +z +k +i +i +b +a +"} +(5,1,1) = {" +a +b +i +i +z +i +i +i +W +L +F +F +F +Z +P +i +i +i +h +i +i +b +a +"} +(6,1,1) = {" +a +b +i +i +i +W +L +Z +G +l +q +b +r +o +E +L +Z +P +i +i +i +b +a +"} +(7,1,1) = {" +a +b +i +i +i +N +o +r +p +m +q +x +r +n +x +q +l +B +i +i +i +b +a +"} +(8,1,1) = {" +a +b +i +i +i +U +n +r +b +b +q +b +r +b +b +q +m +M +i +i +i +b +a +"} +(9,1,1) = {" +a +b +i +i +W +G +x +r +r +x +q +x +r +x +q +q +x +E +P +i +i +b +a +"} +(10,1,1) = {" +a +b +i +i +N +l +x +b +x +x +x +x +x +x +x +b +x +o +B +i +i +b +a +"} +(11,1,1) = {" +a +b +i +i +j +m +q +q +q +x +t +t +t +x +r +r +r +n +S +i +i +b +a +"} +(12,1,1) = {" +a +b +i +i +j +b +x +b +x +x +t +u +t +x +x +b +x +b +S +i +i +b +a +"} +(13,1,1) = {" +a +b +i +i +j +n +r +r +r +x +t +t +t +x +q +q +q +m +S +i +i +b +a +"} +(14,1,1) = {" +a +b +i +i +U +o +x +b +x +x +x +x +x +x +x +b +x +l +M +i +i +b +a +"} +(15,1,1) = {" +a +b +i +i +I +J +x +q +q +x +r +x +q +x +r +r +x +Y +Q +i +i +b +a +"} +(16,1,1) = {" +a +b +i +i +i +N +m +q +b +b +r +b +q +b +b +r +n +B +i +i +i +b +a +"} +(17,1,1) = {" +a +b +i +i +i +U +l +q +x +n +r +x +q +m +x +r +o +M +i +i +i +b +a +"} +(18,1,1) = {" +a +b +i +i +i +I +D +K +J +o +r +b +q +l +Y +D +K +Q +i +i +i +b +a +"} +(19,1,1) = {" +a +b +i +i +z +i +i +i +I +D +V +V +V +K +Q +i +i +i +z +i +i +b +a +"} +(20,1,1) = {" +a +b +i +i +k +z +i +i +i +i +i +i +i +i +i +i +i +z +v +i +i +b +a +"} +(21,1,1) = {" +a +b +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +b +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Mafia/mafia_ball.dmm b/_maps/map_files/Mafia/mafia_ball.dmm new file mode 100644 index 0000000000..9888821abf --- /dev/null +++ b/_maps/map_files/Mafia/mafia_ball.dmm @@ -0,0 +1,678 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"b" = ( +/turf/closed/indestructible/riveted/plastinum, +/area/mafia) +"c" = ( +/turf/closed/wall/rust, +/area/mafia) +"d" = ( +/turf/open/floor/plating, +/area/mafia) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"f" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/mafia) +"j" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + max_integrity = 99999; + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"l" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"m" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel/dark, +/area/mafia) +"n" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel, +/area/mafia) +"o" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/floor/plasteel, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/fakeglass, +/area/mafia) +"q" = ( +/turf/open/floor/plasteel/dark, +/area/mafia) +"r" = ( +/turf/open/floor/plasteel, +/area/mafia) +"s" = ( +/turf/open/floor/fakespace, +/area/mafia) +"t" = ( +/turf/open/floor/plasteel/solarpanel, +/area/mafia) +"u" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/turf/open/floor/plasteel/solarpanel, +/area/mafia) +"v" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +b +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +b +b +a +"} +(4,1,1) = {" +a +b +b +c +g +h +d +d +d +d +d +e +d +d +d +d +d +h +k +c +b +b +a +"} +(5,1,1) = {" +a +b +b +c +h +d +d +e +b +b +j +b +j +b +b +d +d +i +h +c +b +b +a +"} +(6,1,1) = {" +a +b +b +c +i +b +b +j +b +l +q +b +r +o +b +j +b +b +d +c +b +b +a +"} +(7,1,1) = {" +a +b +c +c +d +b +o +r +p +m +q +p +r +n +p +q +l +b +d +c +c +b +a +"} +(8,1,1) = {" +a +b +c +d +d +b +n +r +b +b +q +b +r +b +b +q +m +b +d +d +c +b +a +"} +(9,1,1) = {" +a +b +c +d +b +b +p +r +r +p +q +p +r +p +q +q +p +b +b +d +c +b +a +"} +(10,1,1) = {" +a +b +c +d +b +l +p +b +p +p +p +p +p +p +p +b +p +o +b +d +c +b +a +"} +(11,1,1) = {" +a +b +c +d +j +m +q +q +q +p +s +t +s +p +r +r +r +n +j +e +c +b +a +"} +(12,1,1) = {" +a +b +c +e +b +b +p +b +p +p +t +u +t +p +p +b +p +b +b +d +c +b +a +"} +(13,1,1) = {" +a +b +c +d +j +n +r +r +r +p +s +t +s +p +q +q +q +m +j +d +c +b +a +"} +(14,1,1) = {" +a +b +c +d +b +o +p +b +p +p +p +p +p +p +p +b +p +l +b +i +c +b +a +"} +(15,1,1) = {" +a +b +c +d +b +b +p +q +q +p +r +p +q +p +r +r +p +b +b +d +c +b +a +"} +(16,1,1) = {" +a +b +c +f +d +b +m +q +b +b +r +b +q +b +b +r +n +b +d +d +c +b +a +"} +(17,1,1) = {" +a +b +c +c +d +b +l +q +p +n +r +p +q +m +p +r +o +b +d +c +c +b +a +"} +(18,1,1) = {" +a +b +b +c +d +b +b +j +b +o +r +b +q +l +b +j +b +b +d +c +b +b +a +"} +(19,1,1) = {" +a +b +b +c +h +i +d +d +b +b +j +b +j +b +b +d +e +d +h +c +b +b +a +"} +(20,1,1) = {" +a +b +b +c +k +h +d +d +e +d +d +d +d +d +d +d +d +h +v +c +b +b +a +"} +(21,1,1) = {" +a +b +b +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +b +b +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Mafia/mafia_gothic.dmm b/_maps/map_files/Mafia/mafia_gothic.dmm new file mode 100644 index 0000000000..3d41f9b16c --- /dev/null +++ b/_maps/map_files/Mafia/mafia_gothic.dmm @@ -0,0 +1,723 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"b" = ( +/turf/closed/wall/mineral/iron, +/area/mafia) +"c" = ( +/turf/closed/wall/rust, +/area/mafia) +"d" = ( +/turf/open/floor/plating, +/area/mafia) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"f" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/mafia) +"j" = ( +/turf/closed/indestructible/fakedoor, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"l" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/carpet/red, +/area/mafia) +"m" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/carpet/red, +/area/mafia) +"n" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/mafia) +"o" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/opsglass, +/area/mafia) +"q" = ( +/turf/open/floor/carpet/red, +/area/mafia) +"r" = ( +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/mafia) +"t" = ( +/turf/open/floor/carpet/royalblack, +/area/mafia) +"u" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/turf/open/floor/carpet/royalblack, +/area/mafia) +"v" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"D" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/mafia) +"E" = ( +/turf/open/floor/plasteel/chapel{ + dir = 4 + }, +/area/mafia) +"H" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/turf/open/floor/carpet/red, +/area/mafia) +"J" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/mafia) +"M" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/mafia) +"N" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel/chapel, +/area/mafia) +"O" = ( +/turf/open/floor/plasteel/chapel, +/area/mafia) +"P" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plasteel/chapel, +/area/mafia) +"Q" = ( +/obj/structure/closet/crate/coffin, +/turf/open/floor/plasteel/chapel{ + dir = 8 + }, +/area/mafia) +"X" = ( +/turf/open/floor/plasteel/chapel{ + dir = 1 + }, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(3,1,1) = {" +a +b +b +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +b +b +a +"} +(4,1,1) = {" +a +b +b +c +g +h +d +d +d +d +d +e +d +d +d +d +d +h +k +c +b +b +a +"} +(5,1,1) = {" +a +b +b +c +h +d +d +e +b +b +j +b +j +b +b +d +d +i +h +c +b +b +a +"} +(6,1,1) = {" +a +b +b +c +i +b +b +j +b +l +q +b +X +Q +b +j +b +b +d +c +b +b +a +"} +(7,1,1) = {" +a +b +c +c +d +b +J +r +p +m +q +p +E +N +p +q +l +b +d +c +c +b +a +"} +(8,1,1) = {" +a +b +c +d +d +b +D +O +b +b +q +b +r +b +b +q +m +b +d +d +c +b +a +"} +(9,1,1) = {" +a +b +c +d +b +b +p +X +r +p +q +p +O +p +q +q +p +b +b +d +c +b +a +"} +(10,1,1) = {" +a +b +c +d +b +l +p +b +p +p +p +p +p +p +p +b +p +Q +b +d +c +b +a +"} +(11,1,1) = {" +a +b +c +d +j +m +q +q +q +p +t +t +t +p +X +r +E +N +j +e +c +b +a +"} +(12,1,1) = {" +a +b +c +e +b +b +p +b +p +p +t +u +t +p +p +b +p +b +b +d +c +b +a +"} +(13,1,1) = {" +a +b +c +d +j +n +r +E +O +p +t +t +t +p +q +q +q +m +j +d +c +b +a +"} +(14,1,1) = {" +a +b +c +d +b +o +p +b +p +p +p +p +p +p +p +b +p +l +b +i +c +b +a +"} +(15,1,1) = {" +a +b +c +d +b +b +p +q +q +p +X +p +q +p +E +O +p +b +b +d +c +b +a +"} +(16,1,1) = {" +a +b +c +f +d +b +m +q +b +b +E +b +q +b +b +X +M +b +d +d +c +b +a +"} +(17,1,1) = {" +a +b +c +c +d +b +l +q +p +n +r +p +q +m +p +E +P +b +d +c +c +b +a +"} +(18,1,1) = {" +a +b +b +c +d +b +b +j +b +o +O +b +q +H +b +j +b +b +d +c +b +b +a +"} +(19,1,1) = {" +a +b +b +c +h +i +d +d +b +b +j +b +j +b +b +d +e +d +h +c +b +b +a +"} +(20,1,1) = {" +a +b +b +c +k +h +d +d +e +d +d +d +d +d +d +d +d +h +v +c +b +b +a +"} +(21,1,1) = {" +a +b +b +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +b +b +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Mafia/mafia_lavaland.dmm b/_maps/map_files/Mafia/mafia_lavaland.dmm new file mode 100644 index 0000000000..8c58fb9054 --- /dev/null +++ b/_maps/map_files/Mafia/mafia_lavaland.dmm @@ -0,0 +1,976 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"c" = ( +/turf/closed/wall/rust, +/area/mafia) +"d" = ( +/turf/open/floor/plating, +/area/mafia) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"f" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/mafia) +"j" = ( +/obj/machinery/door/airlock/external{ + max_integrity = 99999; + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"l" = ( +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/grass/fakebasalt, +/area/mafia) +"m" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/grass/fakebasalt, +/area/mafia) +"n" = ( +/obj/effect/landmark/mafia, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 9 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/plasteel, +/area/mafia) +"o" = ( +/obj/effect/turf_decal/trimline/brown/filled/end{ + icon_state = "trimline_end_fill"; + dir = 4 + }, +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/plasteel, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/fakeglass, +/area/mafia) +"q" = ( +/turf/open/floor/grass/fakebasalt, +/area/mafia) +"r" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 9 + }, +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/plasteel, +/area/mafia) +"s" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 9 + }, +/turf/open/floor/plasteel, +/area/mafia) +"t" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"u" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/dark, +/area/mafia) +"v" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"w" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner, +/turf/open/floor/plasteel, +/area/mafia) +"x" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/line, +/turf/open/floor/plasteel, +/area/mafia) +"y" = ( +/obj/effect/turf_decal/trimline/brown/filled/end{ + icon_state = "trimline_end_fill"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mafia) +"z" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 5 + }, +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/plasteel, +/area/mafia) +"A" = ( +/obj/effect/landmark/mafia, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mafia) +"B" = ( +/obj/effect/turf_decal/trimline/brown/filled/end{ + icon_state = "trimline_end_fill"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mafia) +"C" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 4 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mafia) +"D" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 10 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + icon_state = "trimline_corner_fill"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mafia) +"E" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 1 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + icon_state = "trimline_corner_fill"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mafia) +"F" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mafia) +"G" = ( +/obj/effect/landmark/mafia, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 10 + }, +/turf/open/floor/plasteel, +/area/mafia) +"H" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 10 + }, +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/plasteel, +/area/mafia) +"I" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 6 + }, +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/plasteel, +/area/mafia) +"J" = ( +/obj/effect/landmark/mafia, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 6 + }, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + icon_state = "trimline_corner_fill"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mafia) +"K" = ( +/obj/effect/turf_decal/trimline/brown/filled/end{ + icon_state = "trimline_end_fill"; + dir = 8 + }, +/obj/structure/closet{ + desc = "It's a storage unit. For mining stuff. Y'know."; + icon_state = "mining"; + name = "miner equipment locker" + }, +/obj/item/clothing/under/rank/cargo/miner/lavaland, +/turf/open/floor/plasteel, +/area/mafia) +"L" = ( +/obj/effect/landmark/mafia, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mafia) +"M" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 10 + }, +/turf/open/floor/plasteel, +/area/mafia) +"N" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + icon_state = "trimline_corner_fill"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/mafia) +"O" = ( +/obj/effect/turf_decal/trimline/brown/filled/corner{ + icon_state = "trimline_corner_fill"; + dir = 8 + }, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 5 + }, +/turf/open/floor/plasteel, +/area/mafia) +"P" = ( +/obj/effect/turf_decal/trimline/brown/filled/end, +/turf/open/floor/plasteel, +/area/mafia) +"Q" = ( +/obj/effect/landmark/mafia, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 9 + }, +/turf/open/floor/plasteel, +/area/mafia) +"R" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"S" = ( +/obj/effect/turf_decal/trimline/brown/filled/end{ + icon_state = "trimline_end_fill"; + dir = 8 + }, +/turf/open/floor/plasteel, +/area/mafia) +"T" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mafia) +"U" = ( +/obj/effect/turf_decal/trimline/brown/filled/line, +/obj/effect/turf_decal/trimline/brown/filled/corner{ + icon_state = "trimline_corner_fill"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/mafia) +"V" = ( +/obj/effect/turf_decal/trimline/brown/filled/line{ + icon_state = "trimline_fill"; + dir = 6 + }, +/turf/open/floor/plasteel, +/area/mafia) +"W" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"X" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"Y" = ( +/turf/closed/indestructible{ + icon = 'icons/turf/walls/reinforced_wall.dmi'; + icon_state = "r_wall"; + name = "reinforced wall" + }, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +a +"} +(3,1,1) = {" +a +Y +Y +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +Y +Y +a +"} +(4,1,1) = {" +a +Y +Y +c +g +h +d +d +d +d +d +e +d +d +d +d +d +h +k +c +Y +Y +a +"} +(5,1,1) = {" +a +Y +Y +c +h +d +d +e +Y +Y +j +Y +j +Y +Y +d +d +i +h +c +Y +Y +a +"} +(6,1,1) = {" +a +Y +Y +c +i +Y +Y +j +Y +l +q +Y +s +H +Y +j +Y +Y +d +c +Y +Y +a +"} +(7,1,1) = {" +a +Y +c +c +d +Y +r +M +p +m +q +p +w +A +p +q +l +Y +d +c +c +Y +a +"} +(8,1,1) = {" +a +Y +c +d +d +Y +L +N +Y +Y +q +Y +x +Y +Y +q +m +Y +d +d +c +Y +a +"} +(9,1,1) = {" +a +Y +c +d +Y +Y +p +O +P +p +q +p +y +p +q +q +p +Y +Y +d +c +Y +a +"} +(10,1,1) = {" +a +Y +c +d +Y +l +p +Y +p +p +p +p +p +p +p +Y +p +K +Y +d +c +Y +a +"} +(11,1,1) = {" +a +Y +c +d +j +m +q +q +q +p +q +u +q +p +B +C +C +J +j +e +c +Y +a +"} +(12,1,1) = {" +a +Y +c +e +Y +Y +p +Y +p +p +t +R +X +p +p +Y +p +Y +Y +d +c +Y +a +"} +(13,1,1) = {" +a +Y +c +d +j +n +C +C +P +p +q +W +q +p +q +q +q +m +j +d +c +Y +a +"} +(14,1,1) = {" +a +Y +c +d +Y +o +p +Y +p +p +p +p +p +p +p +Y +p +l +Y +i +c +Y +a +"} +(15,1,1) = {" +a +Y +c +d +Y +Y +p +q +q +p +S +p +q +p +B +D +p +Y +Y +d +c +Y +a +"} +(16,1,1) = {" +a +Y +c +f +d +Y +m +q +Y +Y +T +Y +q +Y +Y +E +G +Y +d +d +c +Y +a +"} +(17,1,1) = {" +a +Y +c +c +d +Y +l +q +p +Q +U +p +q +m +p +F +I +Y +d +c +c +Y +a +"} +(18,1,1) = {" +a +Y +Y +c +d +Y +Y +j +Y +z +V +Y +q +l +Y +j +Y +Y +d +c +Y +Y +a +"} +(19,1,1) = {" +a +Y +Y +c +h +i +d +d +Y +Y +j +Y +j +Y +Y +d +e +d +h +c +Y +Y +a +"} +(20,1,1) = {" +a +Y +Y +c +k +h +d +d +e +d +d +d +d +d +d +d +d +h +v +c +Y +Y +a +"} +(21,1,1) = {" +a +Y +Y +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +Y +Y +a +"} +(22,1,1) = {" +a +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +Y +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Mafia/mafia_snow.dmm b/_maps/map_files/Mafia/mafia_snow.dmm new file mode 100644 index 0000000000..079f985380 --- /dev/null +++ b/_maps/map_files/Mafia/mafia_snow.dmm @@ -0,0 +1,758 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"b" = ( +/turf/closed/indestructible/riveted/plastinum, +/area/mafia) +"d" = ( +/turf/open/floor/plating, +/area/mafia) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"f" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/mafia) +"j" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + max_integrity = 99999; + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"l" = ( +/obj/item/bedsheet/brown, +/obj/structure/bed, +/turf/open/floor/holofloor/wood, +/area/mafia) +"m" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/holofloor/wood, +/area/mafia) +"n" = ( +/obj/item/bedsheet/green, +/obj/structure/bed, +/turf/open/floor/holofloor/wood, +/area/mafia) +"o" = ( +/obj/item/bedsheet/blue, +/obj/structure/bed, +/turf/open/floor/holofloor/wood, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/fakeglass, +/area/mafia) +"q" = ( +/turf/open/floor/plasteel/dark, +/area/mafia) +"r" = ( +/turf/open/floor/plasteel, +/area/mafia) +"s" = ( +/turf/closed/wall/ice, +/area/mafia) +"t" = ( +/turf/open/floor/holofloor/snow, +/area/mafia) +"u" = ( +/obj/structure/statue/plasma/scientist{ + anchored = 1 + }, +/turf/open/floor/holofloor/snow, +/area/mafia) +"v" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/turf/open/floor/holofloor/snow, +/area/mafia) +"w" = ( +/turf/open/lava/plasma/mafia, +/area/mafia) +"x" = ( +/obj/machinery/door/airlock/external{ + max_integrity = 9999; + opacity = 0 + }, +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/dark, +/area/mafia) +"y" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/holofloor/snow, +/area/mafia) +"z" = ( +/obj/structure/lattice/catwalk, +/turf/open/lava/plasma/mafia, +/area/mafia) +"A" = ( +/obj/machinery/door/airlock/external{ + max_integrity = 9999 + }, +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel, +/area/mafia) +"B" = ( +/obj/effect/landmark/mafia, +/obj/structure/lattice/catwalk, +/turf/open/lava/plasma/mafia, +/area/mafia) +"C" = ( +/obj/mafia_game_board, +/turf/open/floor/holofloor/snow, +/area/mafia) +"D" = ( +/obj/structure/closet/crate/science, +/obj/item/clothing/suit/hooded/wintercoat, +/obj/item/clothing/shoes/winterboots, +/turf/open/floor/holofloor/snow, +/area/mafia) +"E" = ( +/obj/structure/lattice/catwalk, +/obj/structure/closet/crate/critter, +/obj/item/clothing/suit/hooded/wintercoat/miner, +/obj/item/clothing/shoes/winterboots, +/turf/open/lava/plasma/mafia, +/area/mafia) +"F" = ( +/turf/open/floor/holofloor/wood, +/area/mafia) +"G" = ( +/obj/item/bedsheet/orange, +/obj/structure/bed, +/turf/open/floor/holofloor/wood, +/area/mafia) +"H" = ( +/obj/item/bedsheet/black, +/obj/structure/bed, +/turf/open/floor/holofloor/wood, +/area/mafia) +"I" = ( +/obj/item/bedsheet/red, +/obj/structure/bed, +/turf/open/floor/holofloor/wood, +/area/mafia) +"J" = ( +/turf/open/floor/plating/snowed/smoothed, +/area/mafia) +"K" = ( +/turf/closed/indestructible/rock/snow, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +s +K +K +K +K +K +K +K +K +K +K +a +"} +(3,1,1) = {" +a +b +b +s +s +s +s +s +s +s +s +s +w +w +t +w +w +w +w +w +w +K +a +"} +(4,1,1) = {" +a +b +b +s +g +h +d +d +d +d +d +s +t +w +w +w +w +w +C +w +w +K +a +"} +(5,1,1) = {" +a +b +b +s +h +d +d +e +s +s +j +s +p +p +p +w +w +w +w +w +w +K +a +"} +(6,1,1) = {" +a +b +b +s +i +s +s +j +s +H +F +s +t +D +p +p +p +p +w +w +w +K +a +"} +(7,1,1) = {" +a +b +s +s +d +s +o +F +p +m +q +p +t +y +p +z +E +p +w +t +w +K +a +"} +(8,1,1) = {" +a +b +s +d +d +s +m +r +s +s +q +s +t +p +p +z +B +p +w +w +w +K +a +"} +(9,1,1) = {" +a +b +s +d +s +s +p +r +r +p +q +p +t +p +z +z +p +p +p +w +w +K +a +"} +(10,1,1) = {" +a +b +s +d +s +l +p +s +p +p +p +p +p +p +p +p +p +D +p +w +w +K +a +"} +(11,1,1) = {" +a +b +s +d +j +m +F +q +q +x +J +t +t +p +t +t +t +y +p +w +t +K +a +"} +(12,1,1) = {" +a +b +s +e +s +b +p +s +p +p +u +v +t +p +p +p +p +p +p +w +w +K +a +"} +(13,1,1) = {" +a +b +s +d +j +m +F +r +r +A +J +t +t +p +t +t +t +y +p +w +w +K +a +"} +(14,1,1) = {" +a +b +s +d +s +n +p +s +p +p +p +p +p +p +p +p +p +D +p +w +w +K +a +"} +(15,1,1) = {" +a +b +s +d +s +s +p +q +q +p +r +p +t +p +z +z +p +p +p +w +w +K +a +"} +(16,1,1) = {" +a +b +s +f +d +s +m +q +s +s +r +s +t +p +p +z +B +p +w +w +w +K +a +"} +(17,1,1) = {" +a +b +s +s +d +s +G +F +p +m +r +p +t +y +p +z +E +p +w +w +w +K +a +"} +(18,1,1) = {" +a +b +b +s +d +s +s +j +s +I +F +s +t +D +p +p +p +p +w +t +w +K +a +"} +(19,1,1) = {" +a +b +b +s +h +i +d +d +s +s +j +s +p +p +p +t +w +w +w +w +w +K +a +"} +(20,1,1) = {" +a +b +b +s +k +h +d +d +e +d +d +s +t +w +w +w +w +w +C +w +w +K +a +"} +(21,1,1) = {" +a +b +b +s +s +s +s +s +s +s +s +s +w +w +w +w +w +w +w +w +w +K +a +"} +(22,1,1) = {" +a +b +b +b +b +b +b +b +b +b +b +s +K +K +K +K +K +K +K +K +K +K +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Mafia/mafia_spiderclan.dmm b/_maps/map_files/Mafia/mafia_spiderclan.dmm new file mode 100644 index 0000000000..89771212b8 --- /dev/null +++ b/_maps/map_files/Mafia/mafia_spiderclan.dmm @@ -0,0 +1,690 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"b" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/obj/item/reagent_containers/food/snacks/sashimi, +/turf/open/floor/carpet/black, +/area/mafia) +"c" = ( +/turf/closed/wall/rust, +/area/mafia) +"d" = ( +/turf/open/floor/plating, +/area/mafia) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"f" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/mafia) +"j" = ( +/turf/closed/wall/mineral/wood{ + desc = "A door that goes nowhere. How kafkaesque."; + icon = 'icons/obj/doors/mineral_doors.dmi'; + icon_state = "paperframe"; + name = "Door" + }, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"m" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/wood, +/area/mafia) +"n" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/carpet/black, +/area/mafia) +"o" = ( +/obj/structure/closet/cabinet{ + anchored = 1 + }, +/obj/item/reagent_containers/food/snacks/sashimi, +/turf/open/floor/wood, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/fakeglass{ + icon = 'icons/obj/smooth_structures/paperframes.dmi'; + icon_state = "paper" + }, +/area/mafia) +"q" = ( +/turf/open/floor/wood, +/area/mafia) +"r" = ( +/turf/open/floor/carpet/black, +/area/mafia) +"t" = ( +/turf/open/floor/plating/beach/sand, +/area/mafia) +"u" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/turf/open/floor/plating/beach/sand, +/area/mafia) +"v" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"B" = ( +/obj/structure/showcase{ + density = 0; + desc = "Welp, only one way to recover your honour."; + icon = 'icons/obj/items_and_weapons.dmi'; + icon_state = "katana"; + name = "seppuku katana" + }, +/turf/open/floor/plating/beach/sand, +/area/mafia) +"S" = ( +/turf/closed/wall/mineral/wood, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +a +"} +(3,1,1) = {" +a +S +S +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +S +S +a +"} +(4,1,1) = {" +a +S +S +c +g +h +d +d +d +d +d +e +d +d +d +d +d +h +k +c +S +S +a +"} +(5,1,1) = {" +a +S +S +c +h +d +d +e +S +S +j +S +j +S +S +d +d +i +h +c +S +S +a +"} +(6,1,1) = {" +a +S +S +c +i +S +S +j +S +o +q +S +r +b +S +j +S +S +d +c +S +S +a +"} +(7,1,1) = {" +a +S +c +c +d +S +b +r +p +m +q +p +r +n +p +q +o +S +d +c +c +S +a +"} +(8,1,1) = {" +a +S +c +d +d +S +n +r +S +S +q +S +r +S +S +q +m +S +d +d +c +S +a +"} +(9,1,1) = {" +a +S +c +d +S +S +p +r +r +p +q +p +r +p +q +q +p +S +S +d +c +S +a +"} +(10,1,1) = {" +a +S +c +d +S +o +p +S +p +p +p +p +p +p +p +S +p +b +S +d +c +S +a +"} +(11,1,1) = {" +a +S +c +d +j +m +q +q +q +p +t +t +t +p +r +r +r +n +j +e +c +S +a +"} +(12,1,1) = {" +a +S +c +e +S +S +p +S +p +p +t +u +B +p +p +S +p +S +S +d +c +S +a +"} +(13,1,1) = {" +a +S +c +d +j +n +r +r +r +p +t +t +t +p +q +q +q +m +j +d +c +S +a +"} +(14,1,1) = {" +a +S +c +d +S +b +p +S +p +p +p +p +p +p +p +S +p +o +S +i +c +S +a +"} +(15,1,1) = {" +a +S +c +d +S +S +p +q +q +p +r +p +q +p +r +r +p +S +S +d +c +S +a +"} +(16,1,1) = {" +a +S +c +f +d +S +m +q +S +S +r +S +q +S +S +r +n +S +d +d +c +S +a +"} +(17,1,1) = {" +a +S +c +c +d +S +o +q +p +n +r +p +q +m +p +r +b +S +d +c +c +S +a +"} +(18,1,1) = {" +a +S +S +c +d +S +S +j +S +b +r +S +q +o +S +j +S +S +d +c +S +S +a +"} +(19,1,1) = {" +a +S +S +c +h +i +d +d +S +S +j +S +j +S +S +d +e +d +h +c +S +S +a +"} +(20,1,1) = {" +a +S +S +c +k +h +d +d +e +d +d +d +d +d +d +d +d +h +v +c +S +S +a +"} +(21,1,1) = {" +a +S +S +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +S +S +a +"} +(22,1,1) = {" +a +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +S +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/map_files/Mafia/mafia_syndie.dmm b/_maps/map_files/Mafia/mafia_syndie.dmm new file mode 100644 index 0000000000..111df10b67 --- /dev/null +++ b/_maps/map_files/Mafia/mafia_syndie.dmm @@ -0,0 +1,868 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/riveted, +/area/mafia) +"b" = ( +/obj/structure/closet/syndicate{ + desc = "A storage closet for syndicate conflict resolution operatives."; + name = "red closet" + }, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"c" = ( +/turf/closed/wall/rust, +/area/mafia) +"d" = ( +/turf/open/floor/plating, +/area/mafia) +"e" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"f" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"g" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/mafia) +"h" = ( +/obj/structure/grille/indestructable, +/turf/open/floor/plating, +/area/mafia) +"i" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/mafia) +"j" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + max_integrity = 99999; + name = "Maintenance" + }, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plating, +/area/mafia) +"k" = ( +/obj/mafia_game_board, +/turf/open/floor/plating, +/area/mafia) +"l" = ( +/obj/structure/closet/syndicate{ + desc = "A storage closet for syndicate conflict resolution operatives."; + name = "red closet" + }, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"m" = ( +/obj/structure/closet/syndicate{ + desc = "A storage closet for syndicate conflict resolution operatives."; + name = "red closet" + }, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"n" = ( +/obj/effect/landmark/mafia, +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"o" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"p" = ( +/obj/machinery/door/poddoor/preopen{ + desc = "When it's time to sleep, the lights will go out. Remember - no one in space can hear you scream."; + id = "mafia"; + max_integrity = 99999; + name = "Station Night Shutters" + }, +/turf/closed/indestructible/opsglass, +/area/mafia) +"q" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 1; + name = "tactical swivel chair" + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"r" = ( +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"s" = ( +/turf/open/floor/mineral/plastitanium/red, +/area/mafia) +"t" = ( +/turf/open/floor/circuit/red, +/area/mafia) +"u" = ( +/obj/effect/baseturf_helper/asteroid, +/obj/effect/landmark/mafia/town_center, +/obj/structure/chair, +/turf/open/floor/circuit/red, +/area/mafia) +"v" = ( +/obj/mafia_game_board, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/mafia) +"w" = ( +/turf/closed/indestructible/syndicate, +/area/mafia) +"x" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 4; + name = "tactical swivel chair" + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"y" = ( +/obj/structure/chair/office{ + dir = 2; + name = "tactical swivel chair" + }, +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"z" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 2; + name = "tactical swivel chair" + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"A" = ( +/obj/structure/chair/office{ + dir = 8; + name = "tactical swivel chair" + }, +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"B" = ( +/obj/structure/chair/office{ + dir = 4; + name = "tactical swivel chair" + }, +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"C" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/chair/office{ + dir = 8; + name = "tactical swivel chair" + }, +/turf/open/floor/plasteel/dark, +/area/mafia) +"E" = ( +/obj/structure/chair/office{ + dir = 1; + name = "tactical swivel chair" + }, +/turf/open/floor/mineral/plastitanium, +/area/mafia) +"F" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/structure/closet/syndicate{ + desc = "A storage closet for syndicate conflict resolution operatives."; + name = "red closet" + }, +/obj/item/clothing/under/syndicate/tacticool, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/turf/open/floor/plasteel/dark, +/area/mafia) +"G" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/item/clothing/under/syndicate/tacticool, +/obj/structure/closet/syndicate{ + desc = "A storage closet for syndicate conflict resolution operatives."; + name = "red closet" + }, +/obj/item/clothing/under/syndicate/tacticool/skirt, +/turf/open/floor/plasteel/dark, +/area/mafia) +"H" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/landmark/mafia, +/turf/open/floor/plasteel/dark, +/area/mafia) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +a +"} +(3,1,1) = {" +a +w +w +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +w +w +a +"} +(4,1,1) = {" +a +w +w +c +g +h +d +d +d +d +d +e +d +d +d +d +d +h +k +c +w +w +a +"} +(5,1,1) = {" +a +w +w +c +h +d +d +e +w +w +j +w +j +w +w +d +d +i +h +c +w +w +a +"} +(6,1,1) = {" +a +w +w +c +i +w +w +j +w +b +r +w +o +F +w +j +w +w +d +c +w +w +a +"} +(7,1,1) = {" +a +w +c +c +d +w +l +o +p +n +r +p +o +H +p +r +b +w +d +c +c +w +a +"} +(8,1,1) = {" +a +w +c +d +d +w +H +o +w +w +r +w +o +w +w +r +n +w +d +d +c +w +a +"} +(9,1,1) = {" +a +w +c +d +w +w +p +o +x +p +B +p +x +p +B +r +p +w +w +d +c +w +a +"} +(10,1,1) = {" +a +w +c +d +w +b +p +w +p +p +p +p +p +p +p +w +p +m +w +d +c +w +a +"} +(11,1,1) = {" +a +w +c +d +j +n +r +r +y +p +s +t +s +p +q +o +o +H +j +e +c +w +a +"} +(12,1,1) = {" +a +w +c +e +w +w +p +w +p +p +t +u +t +p +p +w +p +w +w +d +c +w +a +"} +(13,1,1) = {" +a +w +c +d +j +H +o +o +z +p +s +t +s +p +E +r +r +n +j +d +c +w +a +"} +(14,1,1) = {" +a +w +c +d +w +l +p +w +p +p +p +p +p +p +p +w +p +b +w +i +c +w +a +"} +(15,1,1) = {" +a +w +c +d +w +w +p +r +A +p +C +p +A +p +C +o +p +w +w +d +c +w +a +"} +(16,1,1) = {" +a +w +c +f +d +w +n +r +w +w +o +w +r +w +w +o +H +w +d +d +c +w +a +"} +(17,1,1) = {" +a +w +c +c +d +w +b +r +p +H +o +p +r +n +p +o +G +w +d +c +c +w +a +"} +(18,1,1) = {" +a +w +w +c +d +w +w +j +w +F +o +w +r +b +w +j +w +w +d +c +w +w +a +"} +(19,1,1) = {" +a +w +w +c +h +i +d +d +w +w +j +w +j +w +w +d +e +d +h +c +w +w +a +"} +(20,1,1) = {" +a +w +w +c +k +h +d +d +e +d +d +d +d +d +d +d +d +h +v +c +w +w +a +"} +(21,1,1) = {" +a +w +w +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +c +w +w +a +"} +(22,1,1) = {" +a +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +w +a +"} +(23,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +a +"} From bfba7307ecd6cd89c340aff3d7e3ef71cd62068b Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Sun, 9 Aug 2020 21:29:08 +0800 Subject: [PATCH 26/63] fix --- code/modules/mafia/controller.dm | 2 +- code/modules/mafia/map_pieces.dm | 2 +- code/modules/procedural_mapping/mapGenerator.dm | 12 ++++++++++-- icons/obj/mafia.dmi | Bin 0 -> 668 bytes 4 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 icons/obj/mafia.dmi diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index f4897a5fe5..172f9dca50 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -33,7 +33,7 @@ ///template picked when the game starts. used for the name and desc reading var/datum/map_template/mafia/current_map ///map generation tool that deletes the current map after the game finishes - var/datum/map_generator/massdelete/map_deleter + var/datum/mapGenerator/massdelete/map_deleter ///Readable list of roles in current game, sent to the tgui panel for roles list > list("Psychologist x1", "Clown x2") var/list/current_setup_text diff --git a/code/modules/mafia/map_pieces.dm b/code/modules/mafia/map_pieces.dm index f0472c7e9f..1bca4467a1 100644 --- a/code/modules/mafia/map_pieces.dm +++ b/code/modules/mafia/map_pieces.dm @@ -30,7 +30,7 @@ requires_power = FALSE has_gravity = STANDARD_GRAVITY flags_1 = NONE - block_suicide = TRUE + //block_suicide = TRUE /datum/map_template/mafia var/description = "" diff --git a/code/modules/procedural_mapping/mapGenerator.dm b/code/modules/procedural_mapping/mapGenerator.dm index f509c409ce..323f74d0ef 100644 --- a/code/modules/procedural_mapping/mapGenerator.dm +++ b/code/modules/procedural_mapping/mapGenerator.dm @@ -147,8 +147,16 @@ set category = "Debug" var/datum/mapGenerator/nature/N = new() - var/startInput = input(usr,"Start turf of Map, (X;Y;Z)", "Map Gen Settings", "1;1;1") as text - var/endInput = input(usr,"End turf of Map (X;Y;Z)", "Map Gen Settings", "[world.maxx];[world.maxy];[mob ? mob.z : 1]") as text + var/startInput = input(usr,"Start turf of Map, (X;Y;Z)", "Map Gen Settings", "1;1;1") as text|null + + if (isnull(startInput)) + return + + var/endInput = input(usr,"End turf of Map (X;Y;Z)", "Map Gen Settings", "[world.maxx];[world.maxy];[mob ? mob.z : 1]") as text|null + + if (isnull(endInput)) + return + //maxx maxy and current z so that if you fuck up, you only fuck up one entire z level instead of the entire universe if(!startInput || !endInput) to_chat(src, "Missing Input") diff --git a/icons/obj/mafia.dmi b/icons/obj/mafia.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fc0426a19fe6f4871c275acf461ebe6ff3a304bb GIT binary patch literal 668 zcmV;N0%QG&P)iS! zBsJbpiHkEOv#1y-V93RpR+N~V3SpxvGa^ozF>%UFh*M@toH8@wl$jH!%z`*&mc%JD zG$5$1I5R!3w1A+pr2NF96kMv56rloXjZiY`T3N}cUaHEtEYq&1DHOrq7UYgNB(u<4r#B^(I&r1OmGf>P9TjU#*aWk zOrzT%2?0YVf`}dIZj$#NwnB4OT?KMhwD6AG{(Nh6EyAO7j=fs>&CJ z9U&F^9U&H`PNSxK6t^w za&A<8@VVp$K-nCJM2babTp?}O8 z*{OpJhAL1GP!YUl4zw}}!rTL%1!f+cEAyL5EHDSYxnpJS0sN`$Tc(+398Hbf10)Dp znWr0453t}$`5elBO9(c1N})MSrlZQ!)br=U-^&;8W$>EcASp-y0000 Date: Sun, 9 Aug 2020 21:38:42 +0800 Subject: [PATCH 27/63] lazyfix --- code/modules/mafia/outfits.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mafia/outfits.dm b/code/modules/mafia/outfits.dm index 65c6b9e980..5bdc66a219 100644 --- a/code/modules/mafia/outfits.dm +++ b/code/modules/mafia/outfits.dm @@ -17,7 +17,7 @@ name = "Mafia Detective" uniform = /obj/item/clothing/under/rank/security/detective - neck = /obj/item/clothing/neck/tie/detective + //neck = /obj/item/clothing/neck/tie/detective shoes = /obj/item/clothing/shoes/sneakers/brown suit = /obj/item/clothing/suit/det_suit gloves = /obj/item/clothing/gloves/color/black From e8ac70696f89eb69dd98d6851e987ddb06b82261 Mon Sep 17 00:00:00 2001 From: chrisbbbbbbb Date: Sun, 9 Aug 2020 18:58:32 +0200 Subject: [PATCH 28/63] new food idk? --- .../food_and_drinks/food/snacks_pie.dm | 21 ++++++++++++++++++ .../recipes/tablecraft/recipes_pies_sweets.dm | 14 +++++++++++- icons/obj/food/piecake.dmi | Bin 31920 -> 34218 bytes 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks_pie.dm b/code/modules/food_and_drinks/food/snacks_pie.dm index 03f4640718..81805f5529 100644 --- a/code/modules/food_and_drinks/food/snacks_pie.dm +++ b/code/modules/food_and_drinks/food/snacks_pie.dm @@ -113,6 +113,27 @@ tastes = list("pie" = 1, "meat" = 1) foodtype = GRAIN | MEAT +/obj/item/reagent_containers/food/snacks/pie/burek + name = "Burek" + icon = 'icons/obj/food/piecake.dmi' + icon_state = "burek" + desc = "If you know, you know." + slice_path = /obj/item/reagent_containers/food/snacks/pie/burekslice + slices_num = 4 + bonus_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 6) + list_reagents = list(/datum/reagent/consumable/nutriment= 20, /datum/reagent/consumable/nutriment/vitamin = 6) + bitesize = 12 + tastes = list("meat" = 1, "oil" = 1) + foodtype = GRAIN | MEAT + +/obj/item/reagent_containers/food/snacks/pie/burekslice + name = "Burek Slice" + icon = 'icons/obj/food/piecake.dmi' + icon_state = "burekslice" + desc = "A slice of Burek, watch out for oil stains!" + tastes = list("meat" = 1, "oil" = 1) + foodtype = GRAIN | MEAT + /obj/item/reagent_containers/food/snacks/pie/tofupie name = "tofu-pie" diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm index 52becf81df..289c698b9a 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pies_sweets.dm @@ -130,6 +130,18 @@ result = /obj/item/reagent_containers/food/snacks/pie/dulcedebatata subcategory = CAT_PIE +/datum/crafting_recipe/food/burek + name = "Burek" + reqs = list( + /datum/reagent/consumable/blackpepper = 3, + /datum/reagent/consumable/sodiumchloride = 3, + /obj/item/reagent_containers/food/snacks/pizzabread = 2, + /obj/item/reagent_containers/food/snacks/meat/cutlet/plain = 6, + /obj/item/reagent_containers/food/snacks/butter = 1, + ) + result = /obj/item/reagent_containers/food/snacks/pie/burek + subcategory = CAT_PIE + /datum/crafting_recipe/food/meatpie name = "Meat pie" reqs = list( @@ -302,4 +314,4 @@ /obj/item/reagent_containers/food/snacks/spiderling = 1 ) result = /obj/item/reagent_containers/food/snacks/spiderlollipop - subcategory = CAT_PIE \ No newline at end of file + subcategory = CAT_PIE diff --git a/icons/obj/food/piecake.dmi b/icons/obj/food/piecake.dmi index 5638235217b043bc00ae3f5819003cfb3eede1e7..935f7e8ad58fa103d2a89f891fd11b699484d2a2 100644 GIT binary patch delta 16427 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 Date: Sun, 9 Aug 2020 20:17:59 +0200 Subject: [PATCH 29/63] Revert "suture crafting stuff" This reverts commit 885013a8b880825ce89ae66594d6cdfb0e079dde. --- code/datums/components/crafting/recipes/recipes_misc.dm | 4 ++-- code/game/objects/items/stacks/medical.dm | 6 ------ 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 0cb0547978..214c1b1427 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -126,7 +126,7 @@ /datum/crafting_recipe/brute_pack name = "Suture Pack" - result = /obj/item/stack/medical/suture/five + result = /obj/item/stack/medical/suture/one time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/medicine/styptic_powder = 10) @@ -135,7 +135,7 @@ /datum/crafting_recipe/burn_pack name = "Regenerative Mesh" - result = /obj/item/stack/medical/mesh/five + result = /obj/item/stack/medical/mesh/one time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/medicine/silver_sulfadiazine = 10) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 21a621cb41..1ceb525b8a 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -204,9 +204,6 @@ /obj/item/stack/medical/suture/one amount = 1 -/obj/item/stack/medical/suture/five - amount = 5 - /obj/item/stack/medical/suture/medicated name = "medicated suture" icon_state = "suture_purp" @@ -287,9 +284,6 @@ /obj/item/stack/medical/mesh/one amount = 1 -/obj/item/stack/medical/mesh/five - amount = 5 - /obj/item/stack/medical/mesh/advanced name = "advanced regenerative mesh" desc = "An advanced mesh made with aloe extracts and sterilizing chemicals, used to treat burns." From 758d540c9e56a0519785344355db08f3fc7da44e Mon Sep 17 00:00:00 2001 From: chrisbbbbbbb Date: Sun, 9 Aug 2020 20:33:40 +0200 Subject: [PATCH 30/63] Suture/Mesh Crafting --- code/datums/components/crafting/recipes/recipes_misc.dm | 4 ++-- code/game/objects/items/stacks/medical.dm | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 214c1b1427..0cb0547978 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -126,7 +126,7 @@ /datum/crafting_recipe/brute_pack name = "Suture Pack" - result = /obj/item/stack/medical/suture/one + result = /obj/item/stack/medical/suture/five time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/medicine/styptic_powder = 10) @@ -135,7 +135,7 @@ /datum/crafting_recipe/burn_pack name = "Regenerative Mesh" - result = /obj/item/stack/medical/mesh/one + result = /obj/item/stack/medical/mesh/five time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/medicine/silver_sulfadiazine = 10) diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 11df83230c..9ea8c9c689 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -239,6 +239,9 @@ /obj/item/stack/medical/suture/one amount = 1 +/obj/item/stack/medical/suture/five + amount = 5 + /obj/item/stack/medical/suture/medicated name = "medicated suture" icon_state = "suture_purp" @@ -319,6 +322,9 @@ /obj/item/stack/medical/mesh/one amount = 1 +/obj/item/stack/medical/mesh/five + amount = 5 + /obj/item/stack/medical/mesh/advanced name = "advanced regenerative mesh" desc = "An advanced mesh made with aloe extracts and sterilizing chemicals, used to treat burns." From bbe32ab4121d0250f22744c5a957d3914d830359 Mon Sep 17 00:00:00 2001 From: Detective Google <48196179+Detective-Google@users.noreply.github.com> Date: Sun, 9 Aug 2020 16:36:58 -0500 Subject: [PATCH 31/63] lmao --- code/modules/newscaster/ghostread.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/newscaster/ghostread.dm b/code/modules/newscaster/ghostread.dm index 77cb1a03c8..ff51f5268c 100644 --- a/code/modules/newscaster/ghostread.dm +++ b/code/modules/newscaster/ghostread.dm @@ -3,7 +3,7 @@ set desc = "Open a list of available news channels" set category = "Ghost" - var/datum/browser/B = new(src, "ghost_news_list", "Chanenl List", 450, 600) + var/datum/browser/B = new(src, "ghost_news_list", "Channel List", 450, 600) B.set_content(render_news_channel_list()) B.open() From ff49790ac911f12f024db7589ff6b3e622b5e8eb Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Sun, 9 Aug 2020 21:27:57 -0500 Subject: [PATCH 32/63] radius/force/blockchance nerf --- code/game/objects/items/weaponry.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index b1f8eac1da..e7dc636cf3 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -252,6 +252,8 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 /obj/item/katana/timestop name = "temporal katana" desc = "Delicately balanced, this finely-crafted blade hums with barely-restrained potential." + block_chance = 0 // oops + force = 27.5 // oops item_flags = ITEM_CAN_PARRY block_parry_data = /datum/block_parry_data/bokken/quick_parry/proj @@ -259,7 +261,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(ishuman(owner)) var/mob/living/carbon/human/flynn = owner flynn.emote("smirk") - new /obj/effect/timestop(get_turf(owner), 2, 50, list(owner)) + new /obj/effect/timestop/magic(get_turf(owner), 1, 50, list(owner)) // null roddies counter /obj/item/melee/bokken // parrying stick name = "bokken" From a4040ace26ef5f333e206e68e45c092e8d5c02fa Mon Sep 17 00:00:00 2001 From: Letter N <24603524+LetterN@users.noreply.github.com> Date: Mon, 10 Aug 2020 10:50:07 +0800 Subject: [PATCH 33/63] hewwo have you tried to work? --- code/modules/asset_cache/asset_list_items.dm | 6 + code/modules/mafia/_defines.dm | 2 + code/modules/mafia/controller.dm | 136 ++++- code/modules/mafia/roles.dm | 46 +- code/modules/mob/dead/observer/observer.dm | 16 + icons/obj/mafia.dmi | Bin 668 -> 13272 bytes tgui/packages/tgui/assets/bg-neutral.svg | 3 + tgui/packages/tgui/index.js | 1 + tgui/packages/tgui/interfaces/MafiaPanel.js | 527 ++++++++++++++---- tgui/packages/tgui/styles/themes/neutral.scss | 43 ++ 10 files changed, 634 insertions(+), 146 deletions(-) create mode 100644 tgui/packages/tgui/assets/bg-neutral.svg create mode 100644 tgui/packages/tgui/styles/themes/neutral.scss diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index d4ab7b5648..a8b4c93764 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -388,3 +388,9 @@ Insert("polycrystal", 'icons/obj/telescience.dmi', "polycrystal") ..() +/datum/asset/spritesheet/mafia + name = "mafia" + +/datum/asset/spritesheet/mafia/register() + InsertAll("", 'icons/obj/mafia.dmi') + ..() diff --git a/code/modules/mafia/_defines.dm b/code/modules/mafia/_defines.dm index b862ce63c5..3833d5aefe 100644 --- a/code/modules/mafia/_defines.dm +++ b/code/modules/mafia/_defines.dm @@ -32,6 +32,8 @@ GLOBAL_LIST_EMPTY(mafia_signup) //the current global mafia game running. GLOBAL_VAR(mafia_game) +/// list of ghosts who want to play mafia that have since disconnected. They are kept in the lobby, but not counted for starting a game. +GLOBAL_LIST_EMPTY(mafia_bad_signup) GLOBAL_LIST_INIT(mafia_setups,generate_mafia_setups()) diff --git a/code/modules/mafia/controller.dm b/code/modules/mafia/controller.dm index 172f9dca50..8c4006ef90 100644 --- a/code/modules/mafia/controller.dm +++ b/code/modules/mafia/controller.dm @@ -6,6 +6,8 @@ * It is first created when the first ghost signs up to play. */ /datum/mafia_controller + ///list of observers that should get game updates. + var/list/spectators = list() ///all roles in the game, dead or alive. check their game status if you only want living or dead. var/list/all_roles = list() ///exists to speed up role retrieval, it's a dict. player_role_lookup[player ckey] will give you the role they play @@ -48,7 +50,8 @@ ///group voting on one person, like putting people to trial or choosing who to kill as mafia var/list/votes = list() - ///and these (judgement_innocent_votes and judgement_guilty_votes) are the judgement phase votes, aka people sorting themselves into guilty and innocent lists. whichever has more wins! + ///and these (judgement_innocent_votes, judgement_abstain_votes and judgement_guilty_votes) are the judgement phase votes, aka people sorting themselves into guilty and innocent, and "eh, i don't really care" lists. whichever has more inno or guilty wins! + var/list/judgement_abstain_votes = list() var/list/judgement_innocent_votes = list() var/list/judgement_guilty_votes = list() ///current role on trial for the judgement phase, will die if guilty is greater than innocent @@ -129,7 +132,7 @@ var/team_suffix = team ? "([uppertext(team)] CHAT)" : "" for(var/M in GLOB.dead_mob_list) var/mob/spectator = M - if(spectator.ckey in GLOB.mafia_signup || player_role_lookup[spectator.mind.current] != null) //was in current game, or is signed up + if(spectator.ckey in spectators) //was in current game, or spectatin' (won't send to living) var/link = FOLLOW_LINK(M, town_center_landmark) to_chat(M, "[link] MAFIA: [msg] [team_suffix]") @@ -190,8 +193,19 @@ */ /datum/mafia_controller/proc/check_trial(verbose = TRUE) var/datum/mafia_role/loser = get_vote_winner("Day")//, majority_of_town = TRUE) + var/loser_votes = get_vote_count(loser,"Day") if(loser) + // if(loser_votes > 12) + // loser.body.client?.give_award(/datum/award/achievement/mafia/universally_hated, loser.body) send_message("[loser.body.real_name] wins the day vote, Listen to their defense and vote \"INNOCENT\" or \"GUILTY\"!") + //refresh the lists + judgement_abstain_votes = list() + judgement_innocent_votes = list() + judgement_guilty_votes = list() + for(var/i in all_roles) + var/datum/mafia_role/abstainee = i + if(abstainee.game_status == MAFIA_ALIVE && abstainee != loser) + judgement_abstain_votes += abstainee on_trial = loser on_trial.body.forceMove(get_turf(town_center_landmark)) phase = MAFIA_PHASE_JUDGEMENT @@ -215,8 +229,11 @@ for(var/i in judgement_innocent_votes) var/datum/mafia_role/role = i send_message("[role.body.real_name] voted innocent.") - for(var/ii in judgement_guilty_votes) + for(var/ii in judgement_abstain_votes) var/datum/mafia_role/role = ii + send_message("[role.body.real_name] abstained.") + for(var/iii in judgement_guilty_votes) + var/datum/mafia_role/role = iii send_message("[role.body.real_name] voted guilty.") if(judgement_guilty_votes.len > judgement_innocent_votes.len) //strictly need majority guilty to lynch send_message("Guilty wins majority, [on_trial.body.real_name] has been lynched.") @@ -225,9 +242,6 @@ else send_message("Innocent wins majority, [on_trial.body.real_name] has been spared.") on_trial.body.forceMove(get_turf(on_trial.assigned_landmark)) - //by now clowns should have killed someone in guilty list, clear this out - judgement_innocent_votes = list() - judgement_guilty_votes = list() on_trial = null //day votes are already cleared, so this will skip the trial and check victory/lockdown/whatever else next_phase_timer = addtimer(CALLBACK(src, .proc/check_trial, FALSE),judgement_lynch_period,TIMER_STOPPABLE)// small pause to see the guy dead, no verbosity since we already did this @@ -320,10 +334,8 @@ /** * Cleans up the game, resetting variables back to the beginning and removing the map with the generator. */ -/datum/mafia_controller/proc/end_game() - +/datum/mafia_controller/proc/end_game( map_deleter.generate() //remove the map, it will be loaded at the start of the next one - QDEL_LIST(all_roles) turn = 0 votes = list() @@ -481,7 +493,7 @@ if(phase != MAFIA_PHASE_VOTING) return var/v = get_vote_count(player_role_lookup[source],"Day") - var/mutable_appearance/MA = mutable_appearance('icons/obj/mafia.dmi',"vote_[v]") + var/mutable_appearance/MA = mutable_appearance('icons/obj/mafia.dmi',"vote_[v > 12 ? "over_12" : v]") overlay_list += MA /** @@ -528,13 +540,26 @@ .["judgement_phase"] = FALSE var/datum/mafia_role/user_role = player_role_lookup[user] if(user_role) - .["roleinfo"] = list("role" = user_role.name,"desc" = user_role.desc, "action_log" = user_role.role_notes) + .["roleinfo"] = list("role" = user_role.name,"desc" = user_role.desc, "action_log" = user_role.role_notes, "hud_icon" = user_role.hud_icon, "revealed_icon" = user_role.revealed_icon) var/actions = list() for(var/action in user_role.actions) if(user_role.validate_action_target(src,action,null)) actions += action .["actions"] = actions .["role_theme"] = user_role.special_theme + else + var/list/lobby_data = list() + for(var/key in GLOB.mafia_signup + GLOB.mafia_bad_signup) + var/list/lobby_member = list() + lobby_member["name"] = key + lobby_member["status"] = "Ready" + if(key in GLOB.mafia_bad_signup) + lobby_member["status"] = "Disconnected" + lobby_member["spectating"] = "Ghost" + if(key in spectators) + lobby_member["spectating"] = "Spectator" + lobby_data += list(lobby_member) + .["lobbydata"] = lobby_data var/list/player_data = list() for(var/datum/mafia_role/R in all_roles) var/list/player_info = list() @@ -561,6 +586,11 @@ //Not sure on this, should this info be visible .["all_roles"] = current_setup_text +/datum/mafia_controller/ui_assets(mob/user) + return list( + get_asset_datum(/datum/asset/spritesheet/mafia), + ) + /datum/mafia_controller/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) @@ -606,7 +636,31 @@ helper = role break helper.show_help(usr) - if(!user_role || user_role.game_status == MAFIA_DEAD)//ghosts, dead people? + if(!user_role)//just the dead + var/client/C = ui.user.client + switch(action) + if("mf_signup") + if(!SSticker.HasRoundStarted()) + to_chat(usr, "Wait for the round to start.") + return + if(GLOB.mafia_signup[C.ckey]) + GLOB.mafia_signup -= C.ckey + to_chat(usr, "You unregister from Mafia.") + return + else + GLOB.mafia_signup[C.ckey] = C + to_chat(usr, "You sign up for Mafia.") + if(phase == MAFIA_PHASE_SETUP) + check_signups() + try_autostart() + if("mf_spectate") + if(C.ckey in spectators) + to_chat(usr, "You will no longer get messages from the game.") + spectators -= C.ckey + else + to_chat(usr, "You will now get messages from the game.") + spectators += C.ckey + if(user_role.game_status == MAFIA_DEAD) return var/self_voting = user_role == on_trial ? TRUE : FALSE //used to block people from voting themselves innocent or guilty //User actions @@ -637,20 +691,29 @@ return user_role.handle_action(src,params["atype"],target) return TRUE - if("vote_innocent") - if(phase != MAFIA_PHASE_JUDGEMENT && !self_voting) - return - to_chat(user_role.body,"Your vote on [on_trial.body.real_name] submitted as INNOCENT!") - judgement_innocent_votes -= user_role//no double voting - judgement_guilty_votes -= user_role//no radical centrism - judgement_innocent_votes += user_role - if("vote_guilty") - if(phase != MAFIA_PHASE_JUDGEMENT && !self_voting) - return - to_chat(user_role.body,"Your vote on [on_trial.body.real_name] submitted as GUILTY!") - judgement_innocent_votes -= user_role//no radical centrism - judgement_guilty_votes -= user_role//no double voting - judgement_guilty_votes += user_role + if(user_role != on_trial) + switch(action) + if("vote_abstain") + if(phase != MAFIA_PHASE_JUDGEMENT || (user_role in judgement_abstain_votes)) + return + to_chat(user_role.body,"You have decided to abstain.") + judgement_innocent_votes -= user_role + judgement_guilty_votes -= user_role + judgement_abstain_votes += user_role + if("vote_innocent") + if(phase != MAFIA_PHASE_JUDGEMENT || (user_role in judgement_innocent_votes)) + return + to_chat(user_role.body,"Your vote on [on_trial.body.real_name] submitted as INNOCENT!") + judgement_abstain_votes -= user_role//no fakers, and... + judgement_guilty_votes -= user_role//no radical centrism + judgement_innocent_votes += user_role + if("vote_guilty") + if(phase != MAFIA_PHASE_JUDGEMENT || (user_role in judgement_guilty_votes)) + return + to_chat(user_role.body,"Your vote on [on_trial.body.real_name] submitted as GUILTY!") + judgement_abstain_votes -= user_role//no fakers, and... + judgement_innocent_votes -= user_role//no radical centrism + judgement_guilty_votes += user_role /datum/mafia_controller/ui_state(mob/user) return GLOB.always_state @@ -699,7 +762,7 @@ //cuts invalid players from signups (disconnected/not a ghost) var/list/possible_keys = list() for(var/key in GLOB.mafia_signup) - if(GLOB.directory[key] && GLOB.directory[key] == GLOB.mafia_signup[key]) + if(GLOB.directory[key]) var/client/C = GLOB.directory[key] if(isobserver(C.mob)) possible_keys += key @@ -739,6 +802,25 @@ if(GLOB.mafia_signup.len >= min_players)//enough people to try and make something basic_setup() +/** + * Filters inactive player into a different list until they reconnect, and removes players who are no longer ghosts. + * + * If a disconnected player gets a non-ghost mob and reconnects, they will be first put back into mafia_signup then filtered by that. + */ +/datum/mafia_controller/proc/check_signups() + for(var/bad_key in GLOB.mafia_bad_signup) + if(GLOB.directory[bad_key])//they have reconnected if we can search their key and get a client + GLOB.mafia_bad_signup -= bad_key + GLOB.mafia_signup += bad_key + for(var/key in GLOB.mafia_signup) + var/client/C = GLOB.directory[key] + if(!C)//vice versa but in a variable we use later + GLOB.mafia_signup -= key + GLOB.mafia_bad_signup += key + if(!isobserver(C.mob)) + //they are back to playing the game, remove them from the signups + GLOB.mafia_signup -= key + /datum/action/innate/mafia_panel name = "Mafia Panel" desc = "Use this to play." diff --git a/code/modules/mafia/roles.dm b/code/modules/mafia/roles.dm index 394d121005..914cbb0bd3 100644 --- a/code/modules/mafia/roles.dm +++ b/code/modules/mafia/roles.dm @@ -19,7 +19,12 @@ var/game_status = MAFIA_ALIVE - var/special_theme //set this to something cool for antagonists and their window will look different + ///icon state in the mafia dmi of the hud of the role, used in the mafia ui + var/hud_icon = "hudassistant" + ///icon state in the mafia dmi of the hud of the role, used in the mafia ui + var/revealed_icon = "assistant" + ///set this to something cool for antagonists and their window will look different + var/special_theme var/list/role_notes = list() @@ -34,6 +39,8 @@ body.death() if(lynch) reveal_role(game, verbose = TRUE) + if(!(player_key in game.spectators)) //people who played will want to see the end of the game more often than not + game.spectators += player_key return TRUE /datum/mafia_role/Destroy(force, ...) @@ -108,6 +115,9 @@ desc = "You can investigate a single person each night to learn their team." revealed_outfit = /datum/outfit/mafia/detective + hud_icon = "huddetective" + revealed_icon = "detective" + targeted_actions = list("Investigate") var/datum/mafia_role/current_investigation @@ -152,7 +162,8 @@ name = "Medical Doctor" desc = "You can protect a single person each night from killing." revealed_outfit = /datum/outfit/mafia/md // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) - + hud_icon = "hudmedicaldoctor" + revealed_icon = "medicaldoctor" targeted_actions = list("Protect") var/datum/mafia_role/current_protected @@ -194,7 +205,8 @@ name = "Chaplain" desc = "You can communicate with spirits of the dead each night to discover dead crewmember roles." revealed_outfit = /datum/outfit/mafia/chaplain - + hud_icon = "hudchaplain" + revealed_icon = "chaplain" targeted_actions = list("Pray") var/current_target @@ -222,8 +234,9 @@ /datum/mafia_role/lawyer name = "Lawyer" desc = "You can choose a person during the day to provide extensive legal advice to during the night, preventing night actions." - revealed_outfit = /datum/outfit/mafia/lawyer + hud_icon = "hudlawyer" + revealed_icon = "lawyer" targeted_actions = list("Advise") var/datum/mafia_role/current_target @@ -278,6 +291,9 @@ desc = "You can visit someone ONCE PER GAME to reveal their true role in the morning!" revealed_outfit = /datum/outfit/mafia/psychologist + hud_icon = "hudpsychologist" + revealed_icon = "psychologist" + targeted_actions = list("Reveal") var/datum/mafia_role/current_target var/can_use = TRUE @@ -313,6 +329,8 @@ desc = "You're a member of the changeling hive. Use ':j' talk prefix to talk to your fellow lings." team = MAFIA_TEAM_MAFIA revealed_outfit = /datum/outfit/mafia/changeling + hud_icon = "hudchangeling" + revealed_icon = "changeling" special_theme = "syndicate" win_condition = "become majority over the town and no solo killing role can stop them." @@ -332,7 +350,10 @@ team = MAFIA_TEAM_SOLO targeted_actions = list("Night Kill") revealed_outfit = /datum/outfit/mafia/traitor - special_theme = "syndicate" + + hud_icon = "hudtraitor" + revealed_icon = "traitor" + special_theme = "neutral" var/datum/mafia_role/current_victim @@ -384,6 +405,9 @@ var/protection_status = FUGITIVE_NOT_PRESERVING solo_counts_as_town = TRUE //should not count towards mafia victory, they should have the option to work with town revealed_outfit = /datum/outfit/mafia/fugitive + special_theme = "neutral" + hud_icon = "hudfugitive" + revealed_icon = "fugitive" /datum/mafia_role/fugitive/New(datum/mafia_controller/game) . = ..() @@ -434,7 +458,9 @@ win_condition = "lynch their obsession." team = MAFIA_TEAM_SOLO revealed_outfit = /datum/outfit/mafia/obsessed // /mafia <- outfit must be readded (just make a new mafia outfits file for all of these) - + special_theme = "neutral" + hud_icon = "hudobsessed" + revealed_icon = "obsessed" solo_counts_as_town = TRUE //after winning or whatever, can side with whoever. they've already done their objective! var/datum/mafia_role/obsession var/lynched_target = FALSE @@ -470,10 +496,14 @@ /datum/mafia_role/clown name = "Clown" - desc = "If you are lynched you take down one of your voters with you and win. HONK!" + desc = "If you are lynched you take down one of your voters (guilty or abstain) with you and win. HONK!" win_condition = "get themselves lynched!" revealed_outfit = /datum/outfit/mafia/clown + solo_counts_as_town = TRUE team = MAFIA_TEAM_SOLO + special_theme = "neutral" + hud_icon = "hudclown" + revealed_icon = "clown" /datum/mafia_role/clown/New(datum/mafia_controller/game) . = ..() @@ -481,7 +511,7 @@ /datum/mafia_role/clown/proc/prank(datum/source,datum/mafia_controller/game,lynch) if(lynch) - var/datum/mafia_role/victim = pick(game.judgement_guilty_votes) + var/datum/mafia_role/victim = pick(game.judgement_guilty_votes + game.judgement_abstain_votes) game.send_message("[body.real_name] WAS A CLOWN! HONK! They take down [victim.body.real_name] with their last prank.") game.send_message("!! CLOWN VICTORY !!") victim.kill(game,FALSE) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index bb39639ec1..a0df1ee938 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -905,6 +905,22 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp else to_chat(usr, "Can't become a pAI candidate while not dead!") +/mob/dead/observer/verb/mafia_game_signup() + set category = "Ghost" + set name = "Signup for Mafia" + set desc = "Sign up for a game of Mafia to pass the time while dead." + mafia_signup() +/mob/dead/observer/proc/mafia_signup() + if(!client) + return + if(!isobserver(src)) + to_chat(usr, "You must be a ghost to join mafia!") + return + var/datum/mafia_controller/game = GLOB.mafia_game //this needs to change if you want multiple mafia games up at once. + if(!game) + game = create_mafia_game("mafia") + game.ui_interact(usr) + /mob/dead/observer/CtrlShiftClick(mob/user) if(isobserver(user) && check_rights(R_SPAWN)) change_mob_type( /mob/living/carbon/human , null, null, TRUE) //always delmob, ghosts shouldn't be left lingering diff --git a/icons/obj/mafia.dmi b/icons/obj/mafia.dmi index fc0426a19fe6f4871c275acf461ebe6ff3a304bb..c44b80aba1118215bbb382cf89e3963ac5de5dfd 100644 GIT binary patch literal 13272 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

gh`%?3aKT~J5cq^avQ{IA~nNq}WI$s(d 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 LRFbF^`{MsU$GWQs literal 668 zcmV;N0%QG&P)iS! zBsJbpiHkEOv#1y-V93RpR+N~V3SpxvGa^ozF>%UFh*M@toH8@wl$jH!%z`*&mc%JD zG$5$1I5R!3w1A+pr2NF96kMv56rloXjZiY`T3N}cUaHEtEYq&1DHOrq7UYgNB(u<4r#B^(I&r1OmGf>P9TjU#*aWk zOrzT%2?0YVf`}dIZj$#NwnB4OT?KMhwD6AG{(Nh6EyAO7j=fs>&CJ z9U&F^9U&H`PNSxK6t^w za&A<8@VVp$K-nCJM2babTp?}O8 z*{OpJhAL1GP!YUl4zw}}!rTL%1!f+cEAyL5EHDSYxnpJS0sN`$Tc(+398Hbf10)Dp znWr0453t}$`5elBO9(c1N})MSrlZQ!)br=U-^&;8W$>EcASp-y0000

- {!!roleinfo && ( - - - + width={650} // 414 or 415 / 444 or 445 + height={293 + playerAddedHeight}> + + {!roleinfo && ( + +
+ }> + + + The lobby currently has {readyGhosts.length} + /12 valid players signed up. + + + {!!lobbydata && lobbydata.map(lobbyist => ( + + + + {lobbyist.name} + + + STATUS: + + +
+ + {lobbyist.status} {lobbyist.spectating} + +
+
+
+
+ ))} +
+
+
+ )} + {!!roleinfo && ( +
- You are a {roleinfo.role} + {!!admin_controls && ( +
+ + + + + + +
+ )} {!!actions && actions.map(action => ( @@ -49,116 +147,323 @@ export const MafiaPanel = (props, context) => { ))} - {!!admin_controls && ( + {!!roleinfo && (
- THESE ARE DEBUG, THEY WILL BREAK THE GAME, DO NOT TOUCH
- Also because an admin did it: do not gib/delete/etc - anyone! It will runtime the game to death!
- - - -
- -
- )} -
- - {!!players && players.map(player => ( - - {!player.alive && (DEAD)} - {player.votes !== undefined && !!player.alive - && (Votes : {player.votes} )} - { - !!player.actions && player.actions.map(action => { - return ( - ); }) - } - ) - )} - -
- {!!judgement_phase && ( -
+ title="Judgement" + buttons={ + - Use these buttons to vote the accused innocent or guilty! + disabled={!judgement_phase} + onClick={() => act("vote_innocent")} /> + {!judgement_phase && ( + + There is nobody on trial at the moment. + + )} + {!!judgement_phase && ( + + It is now time to vote, vote the accused innocent or guilty! + + )} + disabled={!judgement_phase} + onClick={() => act("vote_guilty")} /> + + +
)} - - -
- {!!all_roles && all_roles.map(r => ( - - - {r} - ); }) + } + + + ) + )} + +
+
+ + +
+
-
- -
- {roleinfo !== undefined && !!roleinfo.action_log - && roleinfo.action_log.map(log_line => ( - - {log_line} - - ))} -
+ + {!!roleinfo && ( + +
+ {roleinfo !== undefined && !!roleinfo.action_log + && roleinfo.action_log.map(log_line => ( + + {log_line} + + ))} +
+
+ )} +
+ + + )} + + + {!!admin_controls && ( +
+ +
+ )}
); }; + +const LobbyDisplay = (props, context) => { + const { act, data } = useBackend(context); + const { + phase, + timeleft, + admin_controls, + } = data; + return ( + + [Phase = {phase} | ]{' '} +