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/85] 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 zcmd6O30PCtx^^r_X{$gHCs3fmQB*`kM35=AGFVYjQD%q*nTLqX2_e=Alp(bW2nbOW z5E)X0Fhf*^SQ#P$31gz51V|u;kc5o;U$O1&Irske-1D4!d;dR=A={muz4uz{o8I?( z_l=V$996#5`Vt0%seE_D?lcVc*?qkRHEN_38{ti5(O#H{pI z8{-6<@m=9iJ&waNCW^h?l+%wrFLyBVEggD)#L{EvvB=A;`bbv^9)9oZ2cd(vqn@R= ze3vbCG3#IFVHSGoc$~WB`Ju-nn$zrnb17S1oq4*+>cWTMANT$Q8@F6UZM?T9WsPmE zs`=Ut%IvK~*Ft&l&IjR==k-GISO6XukTihX&3i}Jc zjCxn?_RrTZ{^muY<#z7l-n?p~pD>xNU%&mOc#yA}G^s~&q|A(5?%LO~t$hUF8$uBOY@X}B4;$Wf%^5RSPYO2d zuihG^`%~y3yVaLUdz#$ZuyR1IDPX!hj-e7xH zXL~2Fbjoq%ZdB)lU-sRsuJK}io4=TikH0D7`+`e^_mc$)1!fT9nq2zXohOs0k+M=BWEF!fcQNUxf zDe+ia2^n2zqm<=Yxd8_I@x$XlV;Jm`K=0CLupf`YR>Ho{f_(`)v}?sWi{QhD4|gUA zqR*Q^fGy9BURW=_8-!Vtj)3X)#;~Xkoothc-6&@~0v(x$hv?`ze z_|EnH4Xx+;i{8-s84Sd3uexx&rDP0I;zg~{OnhSm^#u9RTM|zRw8RogTJu7ap}4BS z?>xeR!Kw=%SsNdl{QbPGL=vCvE6FwsyQw`^PhNQU4wHEtf57O(J)7nw-}K}M6Hf!2 z?qQfcvHWfx6_T$Epd#6_3Fd-#f_SzR&RU-AOmk|5z@=~W1x!eKNYKo{tKFN`E3F_a z-G;F9au(F&Iw!Sa_-N0{8V!2GUP;Rf3hKK`t``J3^sqR_HQ{!(3sO!KuWxKl_SmLP zJ|93O=!_+X*|FzEjm*NFgV2Kq4<-vUHcx@KaN~hAE|suM*{huwO7uLxio|?#G%RGJ zlURJy*$6>jYeVsN!eX&euVR~N_IBQj%lwVw3G6pSb@ee@Ys~ioHCW}j82G->12s&U zOx8Ik5w5D@K*#4V573F`U&Z1r2@y=jFfKi>mz}6M4=on0?XQal!mEdc$K>Qp8 zzekH!ioa_Qt$-cb_8;sAcInJ#J7BP~znp}@PG@Nz%9lacBjPYHSl7uwScCw|E+65q zfNi>hd;4Gi{EL6~I=>%y?kCB(Bi&~|T4mmjq{is)^@UwXK%r1KQ&Y1H-CXyD1`LJ- z@RMmoG#sYd`N&Gia{vCpr|{VGmGdGBscME@v4Mh>#~O{L?K6|e&6|^boSmIdsa^Hh z8vNl^R#yLtih})uW_i{KE|x{j@Cd_7aQiEh;Q7^crVFHsgbzIW*_LF%lkEBKTXrM^ zYD3>8`qRMU)&3H}u#I&KrFwRtr1M5i5c#rw+EKLr7A>t^3nL9C;2lM3hXxlv6t}4x z&$6suD-qmV5~9k&66V98pfiz@KKuqIMmoo5byp1LHbig4XZd2uN^0xKC-6GPiN82alHqdhOCdR)ld0isSvE+X z;F5I_NtpKQCM-6%{3Jh`*@a79dKgvt;B@)W_V6Dxn|?J=6P(JLHIJ;hXf&F<<^fv3 zzA;qpmeX{-uaB~hA)VIXj?#2AK5Y!(lN%~+1Uhg;o1;$-1^H*1@(P3_8S{;dk7P!LC$; zNnf#o2y0W2yrtRV5{*tiX!m zvoZ1U8@08yi-iyB>+6SWf}AUSTbn{;2Otb_K>EO^7Z1mNi;wTS^ul8IEX%OZ*UYSM z!rC-5ci*-W--Bj~&+H{WvBUXs@6W(6W@ctmYut_>FQfJM_tz!^KQ&Yw-sek4Pp>A+#7Q@1$A$=oz2 z*)K~5aM5=rO@VeDnnCx}5saU=p0J*Mbee^2tbP}jq%OZ zH0Zloc-E)y-D3syq+?F?dyJ+9EjzR%QL=k1C!h8=l}>40g-CZ%@ExC;$l&0|sj0)Y zJ12V*_Uq~0q}XT^MBNW3y|5o+)~KkgPupm`C&EaPk=es-HgRfdoak_IZAjE4d!$;C zl;_mIK|*WTi#XF6jf*rGNJb+j{XBBt&%pr zva{m{HQdd~=xN2y?p-#M?6WRY3r_i_&?mR^(w}UhBnxV|j@Tu~db3D1Rn@lEiY66) zysE0|!tEttJ?TAheDnghC5I&aP#r$<^fV$(0@A-^q1jk(vQFHV-i9kiE&dXwuXod< zrfBh+amTf2X0~hCSY1T%M4ai_P~vC<)UTNRIEd`_@4QW}2n2)5Z+UpEk4e+CO+17; zhJ9ysR1IHwZkAfy>HY%-dm^NVc=-Q{8#VfvxfYL`C}AphLQh)@Gv@2C&yC z*9!Mjch-Nk5~S6;F!|?S{He|bJN;jHp~l)nNRmw8rx(e*kkyzO*MLiTvYz%ASnZym zLk77b9@8zabrtMVdz9VE*S+PgX6P?qcg_a~2lqI83F>u&eH?MjS3|d*eZ6|})@Kh(l@&7x##6s88KFu6*qRo^b4Deyy`jxa{{7-jju0W8vRe5 zkTL^Yr<-bchn^NbKH8ph#!{*oUv4HXWGUbdEQ6d;UT|)=~Nd) zqJ4~X(zH4xx+6tiORXb78L}M`ZhUv1S*M*K$$Q0qy`sgpSE7dMB34h`aq*K&MOn^q zvFm$p2C~9(yf1`<;Rm_WH<}~(Mb~mDq(_6(1o!Hq2I*q=nBWH;b#=;;_)fy90j91x z7m^KBFp|$x2Go)4@X1}HPNryE3yWm|C^>tqzh}%p68m58*?yH0w2}^XRS;CN<)gK2 zahL!%qUT^J@m6wB3TM9BMo;evac(6sGy=cZGy5rHT&-*75)D-9`vni#VlZU<5HJ1N z!O@al^`JuasJ-(OeZK6t)} zkg5h61+45?Z|J&CT|GkgkYh-eh#|>JyU9S2djoGDp{%etlcIg-!P$Es-xhaPd6egE zNX_#hX^wJjl`br2K8Al=)H)%W$D0w84gXS&CS5!=r|ZAJnF%{~;d-;I@r%MXY{6*cQ}lf%Y|EDKO?7n04dLUB;SY7r%*SO-DA_QNM8(u>ggtxD{n)NXPS-Sz;|l~EOaps{ z`CteBHQUVWFcQf*^7%az|E{X;J>V8)XE8JL^F{*ph(@^^A<~m%a8cfO>9eUfV`E-}h^t!lV`t;k z@I3vg9by(}*4=;7zu~V-8IB3hTR)4et0Pd8x8M&ayp7|22eDgswCtV&HyU75C_c!DF&pHR$w1fxxMRXlPx^T;8P;5lpBRn*ICseaT644>gL}e z>>%xhSf<;p;cTlZ6!0s{3s7?_1BP&^kLg%wl;PQy^v=YkBt5aEM>D+#GDLW6#0ulN zb3gph%Hz!Y2*JkTJg7k_xP$&|Xj8HSBGNI}CODA9Qp6h9^0N+zJvx^p-# z0K=P7Z;f234h>)kyUd$iF^Bu^0HZ9;)q;zWRKkkdyoH5@$zsz$yAeXW07EAl-=)JJ;{OS3_+Mn0KS1Pv>%bv^0iW5;E-dV^w6yd)ckce_zygI~QwnXW zQT(~ntS!MR4~1D6l2?H!AKTo6tp(Pir{@RYUNNDpw6yf) z%~2rT9I%SgA3J6ilM&0Pkwmqtn6DeFN9s0O1E`Y#Nf?Z5Uh47?4^os^Kap`#CUk2* z6jiXIHJ~@ok1Uw4MkgfT{Rc{qr)dOHGJ$PpQB!{-Bk-(UtXEHb;yK#!6_U#Ow%G4G z=*se$DWnCfLIFWR*`lR2>V+I22ns|`5Z8VLzbmR3Rlj{so-e=#7lpUQhu-6QfkJRQ z1?ythGMD?6xJPa4w61#2owFE1uS;o{COoVUL5yC!`zedT{K^G1V9%ivzL`q z7LMeRU|&9a^rnJ=UAaB;6FmoMD_E8PmP7o`^Zjcn?YKK^9{3UpjZVAK)GC_=c?8tN zPK5U5yI8d8C&I8-dT^bib4P|^eu2*^3V(eae5zMcB*0?TAU`Yvq9bdue4cfEbL0+? zU2HEVf?ULv3rVD%VIeE0k#caL2}_9I)k+0p-=!nHEUI7o>%t(BNRz#Le|Dab%`+Pn zHU2k<#NVQ;3C@Q5{tNeGf;tr}pI1AP=Iga3{zKob z?sA5h(vKl?I`r{{nr=R^XUl}L{~L#BwPCmCnNh7CEJunJWlMx3P#6{)I!1wLzWm$n zTxIjD(JS51;^brwBe7b9^OK`t!k(h)8` z#U7~%!ux~4MoGD3GJy1_sVD1!DcsVrv-6IhKzE(Rdaqb&RKQr{0u%jL^0M>aArRcx z?P@u;?CL@6qRg2yrfq!p;5Hr6Qjf*Ls{-zDpTQIZ4sWf*u8k}eK}&b$qh911r%sr+ zT9hE9w}*+d)d}*t5irM!e~6;MKGMP!U2k7IJE;gSJgZfoPb>_a11k)Gs;U0uYt-KF zSJW1aUuak91Xac4lk%!3-spLvqKX)6`&j$1ysGI*YHEXEG)w__eAavPkXm!$$JTr* zq2#8={z;zjPqFA@mP4U@>UNrOo(JjFw5R8X1ryG zn>7Pog%N7z6)b0F@WdLPB#;&N&DC4+;1{(g*ejp?0IK1mQ@2qS2J#;=ou|d~RU--p zDbCy#!Z#*)fx1LB&{o3-yA<0)vYy7i&x;8<1Q%4}GDHKNazLdAC!A)uf}%vM(e}Nh z?i9_iST2u*4v`O9^V>E|GqN4v&{S?Bt}R^dSkg~{UPy7DPuVJo->E^kTledunFWfV zaFM+{g~Ndml4W^m%6Iw2@{9=U2`uG}?96zBmsH4iKxiD5br3)p5@Hb-@Gg5QXQTmny zwgL1*BqPna5g>!&Hy@{6OrW}bb0Wq}-CjtaKEuQ+@$iqjv=0%Q7i_ZBk}rske6G1^ z(~$@i<4tiEys3tenz}rnmg6Q!isA^&oVrzf`J(|eiy!+}AVIVp=5@C|SgwJh6K7e? z;C|fXGZ7d{57wdVhv?mW^9Nl9l9}!;jdRFviJq0G(SdkTJuavas_&}7LYxCUq#D@0 zc4)40JrAyT2Har{4F*&0RJ%XlE5&X3R61;*(A~NMwzu(5F|B`s{eJsnjBB~Q6%Bc( zG269?0ZW;?|5-3I!->qlY))s@qhzk-xfrNzTy*2XJ_2Ko?^PKnkZnf3&7HYaOB(Y+ zC=5_(FE`Wnu3;tVz4)mAj0g4?zNF=&?#%MLU|@Uk@5FGA@lB{b-jG3>BZ7H|Y!EGr zt8a5H-+#U7dUt)SYk8+Txw{H3whW*$M?lCHez6QH_J|1{2uno|A3j{NT>`M;H@?)o zk}*vp#N|PDmNU4wo4=i)Ss}eW2bB=*0-B=_^4lR~JhmQte`-r1>M{D_z(ekbKIb(< zN(hYPm*Y5F7Ajzf!I;;bu}CT1IyiAayvE-qJ+sMoCtnyZQMT;saDPK{t7y6y8s2s> zR8b^(i+Y3#NPwm$f|v%(TfMyMUfyW}xUCSGFF06nUz**+CF+ziF03~hQr4TFHWZ&Rl_PbVcykvX9U@9j-%C6 z46UTvGlFZBizs=^Y;U6s6s{a(|{~Zga=Xb)R6Cd><%VlZ+ zFZZzPxV!beqJR(Ry&om#lMhjtg_%OxyHngm9+t{0+6_jgm2)6OuCA^iCL)uD+L^6v zl2k8H#xNMCHrOa2IhXER>{_0IRxdE$W2DtipXr|8QKQ_uAk49Xn+$Fe{8qHbk*vyx z6y(`;pZZF|P?u~n`mbfst{1ml!*=s==ag5i+VzQeGMrJwa8T$diqX>&1?)^Xm_dCP z-$d8{O9HPqlCG;NsUghszZdZx0?$8tJ}&J}d`uvPC@TKc(9y zZ%^Q{5E~e65VzqzGGc5MuPeDlI7K`y`RJxwzM+>bGRP@(xo6F~##OU%?n1-m=2=eY zC!JAb8y$0Fo6_aid}ufh_d~yIM>G8f66s4pBnzUdV`W8?R)=w21^EnJ-aH zjyb`7(rJ7%2aoZd<*PB5?NCgF)c-^Cm5m$7J-a8JbS+9B3;jJR$D7Q3THkxvVEux& z`Ht{E+#w&Dl42VYom%#sNJDlAr`npG@wGhNc-Z{h+~`3I3k%*kVNO|jIg2V5IMTU; ziEf~YQZ3J@&k~ z6G6HECKCO0X1uBPu~1Br)7ZCUrS~o#Jt}kFGa=EKwrBR-bYe(O+OcgmYhd|rZutka zZKZ}OX2--52C=R{>H#!dLL97u7S47YnG1TRg{BYV_9=ZdAb)P1!SAxP?dR)zhRJ(B zpLmEaG=n4y$$#|)^QHfehpx8tRiB7rP7BH1@$_}V3E7dBr{#dUW;uGhr>}2lvr72> zRGh4uYTBf$9+cx*Q_VDqIc#S)im75SP|MzN{PupRw6xRw0P;o-=bqJ0CZcR8RHLTp z{6i%qlh$YWN)<0DA4>n|6VC>OajrV|mNMOYjyz!KTCqb@*4c0_uAe%~c^Hze~$O*ix-)(AFxgxzI}u!r zV{f`&;D3Ud2YeqGPtk}C{HJMnh|&&;Cm`TXxqh|w5V_8;^XB9)Dw`({U%4Xw45s|u zr``?ee~tJ02SDb@Lp8o`vSM)j`FMFJ+*Pq$Q9V6+(=kMx zA?;+K4-B^50Yp&kMR-+8A7_n?7JR&AoA1U_`=AI+**6z3#F}M?B)D%}*X$>+L2WXs z*$#tgFn_kaOyVp!Do%FmV8E%X}IWdAbrGss(*-&g9T z^mBPzvo5#V3ij-;`?rEH3scSh|6dT3vT&%}DcU>6Sk@A0Ys zz^?xN5I8G z8@vDf_Gjv8#V~8ZN?PpIeXjKH1U3H}(Ec;>Y0A0hmsi@?&_05-0{mzWrhasZSbG@- z-&gxBMVTIr1|1jKYtnvekm-LI)t@o0e+^`YzW8iL zao5}D>Qv7QVv#4xiEt#!mk20fVC;W03DH%Fpn>Y1Ol$s|@dC@g*~OXPQ=Kc$A9gf|4ym(r_5{0 zx)|J#zx%S#4NQ#P1dyd|`SDLt1^vsC1M5;3 zc!C?(n{2$C!AR+iIp*hj%zd*HcW~aIW4H5~>Wi~@S@7?8jk`e4Ih}#5Z=Se zMa6^%)l?A^k2q64G$_IJn$gxZ>oTG#$d+(d6O`4%l3!* z`AXpIjE|*!VQjJMgrjkq<-9#cQw~UHk@g`KQd?tx$+@8nIZF9NECraz|y&x${rCTSu$@A*-&tma45j~ zVsFc#uqm zT?$kt$wJn=&?Ih0DZYi3N!8c>uCx1p6IE3$FSUIbW9(F&MnRGnVQO=z6vOhq=N7|s z7;JAQtm!=i8*`F|{wPF5y-d@@Rah!dokJ_ZE`4(HxYsLUfL22T)q3M+U^hkbSVd>M zpr9bks@%NFsNDBInnri$Muc}vq|Bi|vF8G?&~kZ#Ag483?8c-bA1&Rlc9oU0^B%HD zC8&{?T3YorbGRU^Lcq~lg7O%ZvWR(RP+uiulgHtyxK9mCw9)*slw%#3a9$dH-h_J%Vi9Fr2hSBmXSFRuluE^b!X1X_?kJi-Ro}+A`$d$?f*?FbO&&FHl7z|Uz zI(A1PKLCz=yo~Ryu*ktH7ffk@TJzWvqv-bCc#HcH_AiH6h2;2uGLc!H04CI_Z%TKU z4h#gXR|LfVgo6*|^11VX!2;4|e?cNva`5Tz?FtRnOuLAz;AN=w@$;5bEz4AF+UOL{ zO%>}QakCK&>-q9-S-iX2TR$XJQHYd!@-nD&Nm@f0$w~*qLXdmS8Qvafj`2q#7E?)? zSb4olRR3Ad?y82_=eN3}-Vm~UNf$eFy2i1c$JHD6uU{#EnBw+k;vi{3+eZ?V8;K+;etp z6)%De4l#o0={mbxBg^}s$9F-U!|;RZ!$7%?OwMUH|dF1N4%IwO`Mhg;>B#cDA47Jr+aedChK15EMiCtmn39*(^-9(%$= zvdIZZf;}> zJ76Cn+g3~=MYG=c0U4sO%w-<%$5c);e(`)8H@#}C3i+-7gfNibF6DvlnDcun8MCSu zHT8zbpHCbsF}9X14d7#2*k3h(7RRt>Wz|Fw)ROqAp8*~O*clhj&}mLd5gt5%8LhR5 z60qHW4n9>T#0Ce?c)&40)Uj<(8>}gG-pDc}1! z*g%IZl{_b!%&+z}hlpQ*87j8@T+vZZ<1_)>H9Z)bRXG%@t{yeel6b2%+jVb~uBKW3 z2(Oq-cTWlf{cxdu1;GbV7DsnqXNZk$WQ!G&Hy|I453Jp-cs@hx3W7;3ws%nLdSZ$) z3Mk(*zuV7cTj+NN=+B-+q6e3)Emak|} zL+Lb8IS{Z17whid zOu2f#a77s{v>vC_%aHa$FLOcLd+#s%Swcpz$~1$Xc?Wdt09;yRtoWP9RQ@M(#;*^) z{M{K9UBB1fplluigxzSm>EAzy5c+MhaxKt?092@0dc8=_q2GOHv{e`Awl2D_*l(IZ zt@Lhu`lfGdOofErCj$f(K1%sDX#VXJ%N4nk!3~d5|(G@j`q>ROzJ@Sy_#kL&0fY_ot*8E0sPLNjTXS7M zw)u|<51S*uOL?OPX>NyoJ+`%Ag%41_3gRK{|B-W_b&hd 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 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 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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/85] 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 8c61dd875b7a59f0663958818e4c266f69f97f89 Mon Sep 17 00:00:00 2001 From: kappa-sama <44128284+kappa-sama@users.noreply.github.com> Date: Sat, 8 Aug 2020 21:30:42 -0400 Subject: [PATCH 22/85] poggers --- code/game/objects/items/implants/implant_misc.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index 897cb9b750..08d6a586c8 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -47,7 +47,7 @@ /obj/item/implant/warp/activate() . = ..() uses-- - imp_in.do_adrenaline(150, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "You feel an internal prick as as the bluespace starts ramping up!") + imp_in.do_adrenaline(20, TRUE, 0, 0, TRUE, list(/datum/reagent/fermi/eigenstate = 1.2), "You feel an internal prick as as the bluespace starts ramping up!") to_chat(imp_in, "You feel an internal prick as as the bluespace starts ramping up!") if(!uses) qdel(src) @@ -86,4 +86,4 @@ healthstring = "Oxygen Deprivation Damage => [round(L.getOxyLoss())]
Fire Damage => [round(L.getFireLoss())]
Toxin Damage => [round(L.getToxLoss())]
Brute Force Damage => [round(L.getBruteLoss())]
" if (!healthstring) healthstring = "ERROR" - return healthstring \ No newline at end of file + return healthstring From 197e426432d02965c4e4f475875d3fb91162043c Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Sat, 8 Aug 2020 23:54:31 -0500 Subject: [PATCH 23/85] heho funny uplink thefties --- code/game/objects/items/devices/PDA/PDA.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index d706f5468a..ec68cdb40c 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -1027,6 +1027,7 @@ GLOBAL_LIST_EMPTY(PDAs) else if(is_type_in_list(C, contained_item)) //Checks if there is a pen if(inserted_item) to_chat(user, "There is already \a [inserted_item] in \the [src]!") + return ..() else if(!user.transferItemToLoc(C, src)) return From 50448549fbd0b698fe94fd700f460f436e71a969 Mon Sep 17 00:00:00 2001 From: lolman360 Date: Sun, 9 Aug 2020 15:26:08 +1000 Subject: [PATCH 24/85] 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 25/85] 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 822c17e4448526300921970d93b80c3e6b32b3cf Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Sun, 9 Aug 2020 08:07:40 -0400 Subject: [PATCH 26/85] a --- .../sprite_accessories/hair_head.dm | 4 ++++ icons/mob/human_face.dmi | Bin 148005 -> 148035 bytes 2 files changed, 4 insertions(+) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm index 89f2dd5370..138704067d 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm @@ -791,6 +791,10 @@ name = "Volaju" icon_state = "hair_volaju" +/datum/sprite_accessory/hair/volajupompless + name = "Volaju (Alt)" + icon_state = "hair_volajupompless" + /datum/sprite_accessory/hair/wisp name = "Wisp" icon_state = "hair_wisp" diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index a4e2a9d5b2cdd04bcf6ac1adb21bfaa6e64cf221..2971b5066a5cd433f9036796cf21cf6f1417b591 100644 GIT binary patch delta 34006 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 G{J#LT$lE6X delta 34095 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 From 6ddc30c11985eae68336ae96012df06257d7cd3f Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Sun, 9 Aug 2020 08:07:46 -0400 Subject: [PATCH 27/85] a --- icons/mob/human_face.dmi | Bin 148035 -> 148034 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 2971b5066a5cd433f9036796cf21cf6f1417b591..82fb3ea385ee1d5e095cc52a00452163f146503e 100644 GIT binary patch delta 31043 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 Date: Sun, 9 Aug 2020 05:49:10 -0700 Subject: [PATCH 28/85] Update regalrat.dm (#13076) --- code/modules/mob/living/simple_animal/hostile/regalrat.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index e21514b37e..77b2d4268a 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -184,6 +184,7 @@ /mob/living/simple_animal/hostile/rat/Initialize() . = ..() SSmobs.cheeserats += src + AddComponent(/datum/component/swarming) /mob/living/simple_animal/hostile/rat/Destroy() SSmobs.cheeserats -= src From d33384e7390db2517a34efbce0a6490d40e2d541 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Aug 2020 07:49:13 -0500 Subject: [PATCH 29/85] Automatic changelog generation for PR #13076 [ci skip] --- html/changelogs/AutoChangeLog-pr-13076.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13076.yml diff --git a/html/changelogs/AutoChangeLog-pr-13076.yml b/html/changelogs/AutoChangeLog-pr-13076.yml new file mode 100644 index 0000000000..0618176843 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13076.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - tweak: "rats now swarm instead of stacking on one spot." 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 30/85] 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 31/85] 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 635a42e10202bd9ea3ec500c7e04296ec41b22b1 Mon Sep 17 00:00:00 2001 From: Seris02 <49109742+Seris02@users.noreply.github.com> Date: Sun, 9 Aug 2020 21:14:25 +0800 Subject: [PATCH 32/85] yeet (#11699) --- code/modules/mob/living/silicon/robot/inventory.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index a063d090db..9b964ef188 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -79,15 +79,15 @@ if(activated(O)) to_chat(src, "That module is already activated.") return - if(!held_items[1]) + if(!held_items[1] && health >= -maxHealth*0.5) held_items[1] = O O.screen_loc = inv1.screen_loc . = TRUE - else if(!held_items[2]) + else if(!held_items[2] && health >= 0) held_items[2] = O O.screen_loc = inv2.screen_loc . = TRUE - else if(!held_items[3]) + else if(!held_items[3] && health >= maxHealth*0.5) held_items[3] = O O.screen_loc = inv3.screen_loc . = TRUE From ccfe29302fe7cd21612b37ffef24a8f1aaf531c7 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Aug 2020 08:14:29 -0500 Subject: [PATCH 33/85] Automatic changelog generation for PR #11699 [ci skip] --- html/changelogs/AutoChangeLog-pr-11699.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-11699.yml diff --git a/html/changelogs/AutoChangeLog-pr-11699.yml b/html/changelogs/AutoChangeLog-pr-11699.yml new file mode 100644 index 0000000000..eaa4781a7d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-11699.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - bugfix: "borgs being able to select and use a module when it's too damaged" 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 34/85] 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 35/85] 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 5abab38613859f6d51f395439acc225f938dbf31 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 9 Aug 2020 06:41:58 -0700 Subject: [PATCH 36/85] increases space levels to 4 (#13022) * Update map_config.dm * Update code/modules/mapping/map_config.dm Co-authored-by: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> Co-authored-by: Trilbyspaceclone <30435998+Trilbyspaceclone@users.noreply.github.com> --- code/modules/mapping/map_config.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mapping/map_config.dm b/code/modules/mapping/map_config.dm index efa2655325..c03ef65f43 100644 --- a/code/modules/mapping/map_config.dm +++ b/code/modules/mapping/map_config.dm @@ -20,7 +20,7 @@ var/map_file = "BoxStation.dmm" var/traits = null - var/space_ruin_levels = 2 + var/space_ruin_levels = 4 var/space_empty_levels = 1 var/station_ruin_budget = -1 // can be set to manually override the station ruins budget on maps that don't support station ruins, stopping the error from being unable to place the ruins. From cac062a28d8541ca1db8961d4a8a61e7a96f658d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Aug 2020 08:42:01 -0500 Subject: [PATCH 37/85] Automatic changelog generation for PR #13022 [ci skip] --- html/changelogs/AutoChangeLog-pr-13022.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13022.yml diff --git a/html/changelogs/AutoChangeLog-pr-13022.yml b/html/changelogs/AutoChangeLog-pr-13022.yml new file mode 100644 index 0000000000..2d0b3d16eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13022.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - tweak: "default space levels is 4 again." From 0ff1d152a198197cb99bb6c6fc5af407bdb95441 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 9 Aug 2020 06:47:23 -0700 Subject: [PATCH 38/85] Update traumas.json (#13050) --- strings/traumas.json | 1 - 1 file changed, 1 deletion(-) diff --git a/strings/traumas.json b/strings/traumas.json index 768b854fa5..58170bd55a 100644 --- a/strings/traumas.json +++ b/strings/traumas.json @@ -125,7 +125,6 @@ ";chemist can u @pick(create_verbs) holy @pick(mellens) for @pick(s_roles)???!!", "@pick(semicolon) LIZZARRD SPEAKIGN IN EVIL BULL LANGUAGE SCI!!", "@pick(semicolon)POST REBOOT MESSAGE LOLOL FUCK FUCK FUCK YOU", - "@pick(semicolon)so, i was trying to talk to someone on rp today, and then a mime walks up and pies them in the face along with some other prankster--i thought that mimes and clowns are supposed to be hired to entertain not to be a nuisance, and that if entertainment comes at someone elses expense then it's not supposed to be done. is that enough to like submit a player complaint or some shit or am i just being petty?", "@pick(semicolon)*nya", "@pick(semicolon)*awoo", "@pick(semicolon)*merp", From 07e2423c2271860bf3f6d610afe1c59925511d8a Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 9 Aug 2020 06:57:53 -0700 Subject: [PATCH 39/85] regarding malf ais, apcs, space, and engineering cyborg grippers (#12933) * Update areas.dm * Update apc.dm * Update apc.dm --- code/game/area/areas.dm | 3 +++ code/modules/power/apc.dm | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index f87f7a757c..672d5c096f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -16,6 +16,8 @@ /// If it's valid territory for gangs/cults to summon var/valid_territory = TRUE + /// malf ais can hack this + var/valid_malf_hack = TRUE /// if blobs can spawn there and if it counts towards their score. var/blob_allowed = TRUE /// whether servants can warp into this area from Reebe @@ -572,6 +574,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) power_environ = FALSE always_unpowered = FALSE valid_territory = FALSE + valid_malf_hack = FALSE blob_allowed = FALSE addSorted() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 65b3c0a2e4..a70e508476 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1125,6 +1125,10 @@ if(malf.malfhacking) to_chat(malf, "You are already hacking an APC.") return + var/area/ourarea = get_area(src) + if(!ourarea.valid_malf_hack) + to_chat(malf, "This APC is not well connected enough to the Exonet to provide any useful processing capabilities.") + return to_chat(malf, "Beginning override of APC systems. This takes some time, and you cannot perform other actions during the process.") malf.malfhack = src malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE) From b5f33274b5e4c8ebb10b2b9dc0078e636eedb889 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Aug 2020 08:57:57 -0500 Subject: [PATCH 40/85] Automatic changelog generation for PR #12933 [ci skip] --- html/changelogs/AutoChangeLog-pr-12933.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-12933.yml diff --git a/html/changelogs/AutoChangeLog-pr-12933.yml b/html/changelogs/AutoChangeLog-pr-12933.yml new file mode 100644 index 0000000000..fc0b82455b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-12933.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - balance: "player made areas are no longer valid for malf hacking" From 76293ee0326f3dcbf371dac314d1ba7f3bf34192 Mon Sep 17 00:00:00 2001 From: Winter Flare <7543955+Owai-Seek@users.noreply.github.com> Date: Sun, 9 Aug 2020 10:01:52 -0400 Subject: [PATCH 41/85] My balls are raw. Meatballs, that is. (#13075) * Food Processor produces Raw Meatball * No nutrition loss from slabs. --- code/modules/food_and_drinks/food/snacks_meat.dm | 11 +++++++++++ .../food_and_drinks/recipes/processor_recipes.dm | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 2a4139dbb9..05a0da2793 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -139,11 +139,22 @@ tastes = list("meat" = 1, "salmon" = 1) foodtype = MEAT | ALCOHOL +/obj/item/reagent_containers/food/snacks/rawmeatball + name = "raw meatball" + desc = "Raw mushy meat. Better cook this!" + icon_state = "rawmeatball" + cooked_type = /obj/item/reagent_containers/food/snacks/meatball + list_reagents = list(/datum/reagent/consumable/nutriment = 3) + filling_color = "#bd2020" + tastes = list("meat" = 1, "slime" = 1) + foodtype = MEAT | RAW + /obj/item/reagent_containers/food/snacks/meatball name = "meatball" desc = "MAMA MIA DAS A SPICY" icon_state = "meatball" list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 1) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) filling_color = "#800000" tastes = list("meat" = 1) foodtype = MEAT diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index 1e3afd1cf5..f75cf6ef3a 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -6,7 +6,7 @@ /datum/food_processor_process/meat input = /obj/item/reagent_containers/food/snacks/meat/slab - output = /obj/item/reagent_containers/food/snacks/meatball + output = /obj/item/reagent_containers/food/snacks/rawmeatball /datum/food_processor_process/bacon input = /obj/item/reagent_containers/food/snacks/meat/rawcutlet From 56e88c10b2074ea9bc32cb06f56cf6db27661bbb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Aug 2020 09:01:55 -0500 Subject: [PATCH 42/85] Automatic changelog generation for PR #13075 [ci skip] --- html/changelogs/AutoChangeLog-pr-13075.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13075.yml diff --git a/html/changelogs/AutoChangeLog-pr-13075.yml b/html/changelogs/AutoChangeLog-pr-13075.yml new file mode 100644 index 0000000000..21d5775315 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13075.yml @@ -0,0 +1,4 @@ +author: "Owai-Seek" +delete-after: True +changes: + - tweak: "Meatballs now spawn raw from food processors." From 4da1d0b73ca014e0ac35d798c8f772ccceca8a93 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 9 Aug 2020 07:06:53 -0700 Subject: [PATCH 43/85] Update human_defense.dm (#13002) --- code/modules/mob/living/carbon/human/human_defense.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1673c57a80..de4b7a659f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -336,7 +336,8 @@ if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(30, 120) Unconscious(20) //short amount of time for follow up attacks against elusive enemies like wizards - Knockdown(200 - (bomb_armor * 1.6)) //between ~4 and ~20 seconds of knockdown depending on bomb armor + Knockdown((200 - (bomb_armor * 1.6)) / 4) //between ~1 and ~5 seconds of knockdown depending on bomb armor + adjustStaminaLoss(brute_loss) if(EXPLODE_LIGHT) brute_loss = 30 @@ -345,7 +346,8 @@ damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb") if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) - Knockdown(160 - (bomb_armor * 1.6)) //100 bomb armor will prevent knockdown altogether + Knockdown((160 - (bomb_armor * 1.6)) / 4) //100 bomb armor will prevent knockdown altogether + adjustStaminaLoss(brute_loss) take_overall_damage(brute_loss,burn_loss) From 8c0a63482acc010c714cc72c9b0901355fc4ecbc Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 9 Aug 2020 09:06:56 -0500 Subject: [PATCH 44/85] Automatic changelog generation for PR #13002 [ci skip] --- html/changelogs/AutoChangeLog-pr-13002.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13002.yml diff --git a/html/changelogs/AutoChangeLog-pr-13002.yml b/html/changelogs/AutoChangeLog-pr-13002.yml new file mode 100644 index 0000000000..f41534eeec --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13002.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - balance: "getting hit by an explosion will now barely hard knockdown, but will leave you somewhat winded." From 448809d25ffb009286a2dc205ea07e1cd513d298 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Sun, 9 Aug 2020 07:11:28 -0700 Subject: [PATCH 45/85] Update github_webhook_processor.php (#13034) --- tools/WebhookProcessor/github_webhook_processor.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/WebhookProcessor/github_webhook_processor.php b/tools/WebhookProcessor/github_webhook_processor.php index 0739c7182c..b2bcaeb884 100644 --- a/tools/WebhookProcessor/github_webhook_processor.php +++ b/tools/WebhookProcessor/github_webhook_processor.php @@ -392,12 +392,14 @@ function handle_pr($payload) { set_labels($payload, $labels, $remove); if($no_changelog) check_dismiss_changelog_review($payload); + /* if(get_pr_code_friendliness($payload) <= 0){ $balances = pr_balances(); $author = $payload['pull_request']['user']['login']; if(isset($balances[$author]) && $balances[$author] < 0 && !is_maintainer($payload, $author)) create_comment($payload, 'You currently have a negative Fix/Feature pull request delta of ' . $balances[$author] . '. Maintainers may close this PR at will. Fixing issues or improving the codebase will improve this score.'); } + */ break; case 'edited': check_dismiss_changelog_review($payload); From e8ac70696f89eb69dd98d6851e987ddb06b82261 Mon Sep 17 00:00:00 2001 From: chrisbbbbbbb Date: Sun, 9 Aug 2020 18:58:32 +0200 Subject: [PATCH 46/85] 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 47/85] 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 48/85] 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 49/85] 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 828f701c9b019f33bcbd216bfc32c5f28872013a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Mon, 10 Aug 2020 00:11:45 +0000 Subject: [PATCH 50/85] Automatic changelog compile [ci skip] --- html/changelog.html | 87 ++++++++++++++++------ html/changelogs/.all_changelog.yml | 46 ++++++++++++ html/changelogs/AutoChangeLog-pr-11699.yml | 4 - html/changelogs/AutoChangeLog-pr-12853.yml | 5 -- html/changelogs/AutoChangeLog-pr-12933.yml | 4 - html/changelogs/AutoChangeLog-pr-13002.yml | 4 - html/changelogs/AutoChangeLog-pr-13022.yml | 4 - html/changelogs/AutoChangeLog-pr-13040.yml | 4 - html/changelogs/AutoChangeLog-pr-13047.yml | 4 - html/changelogs/AutoChangeLog-pr-13051.yml | 4 - html/changelogs/AutoChangeLog-pr-13053.yml | 4 - html/changelogs/AutoChangeLog-pr-13054.yml | 5 -- html/changelogs/AutoChangeLog-pr-13060.yml | 5 -- html/changelogs/AutoChangeLog-pr-13066.yml | 4 - html/changelogs/AutoChangeLog-pr-13068.yml | 6 -- html/changelogs/AutoChangeLog-pr-13069.yml | 4 - html/changelogs/AutoChangeLog-pr-13075.yml | 4 - html/changelogs/AutoChangeLog-pr-13076.yml | 4 - html/changelogs/AutoChangeLog-pr-13078.yml | 4 - html/changelogs/AutoChangeLog-pr-13079.yml | 4 - html/changelogs/AutoChangeLog-pr-13081.yml | 4 - html/changelogs/AutoChangeLog-pr-13082.yml | 5 -- html/changelogs/AutoChangeLog-pr-13084.yml | 4 - html/changelogs/AutoChangeLog-pr-13085.yml | 4 - 24 files changed, 109 insertions(+), 118 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-11699.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12853.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-12933.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13002.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13022.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13040.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13047.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13051.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13053.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13054.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13060.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13066.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13068.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13069.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13075.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13076.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13078.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13079.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13081.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13082.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13084.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-13085.yml diff --git a/html/changelog.html b/html/changelog.html index 58a5dcd1b7..da32c25786 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,69 @@ -->

+

10 August 2020

+

Hatterhat updated:

+
    +
  • Parry counterattack text now shows up.
  • +
  • Sterilized gauze is now better at stopping bleeding, and applies slightly faster. Very slightly faster.
  • +
  • Ointment and sutures now hold more in a stack (12 and 15, respectively).
  • +
  • Sterilized gauze can now be made by just pouring 10u sterilizine onto standard medical gauze, instead of having to craft it. Why you had to craft it, I will honestly never know.
  • +
  • Proto-kinetic glaives are more expensive, stagger/cooldown on failed parries increased slightly, perfect parries required for counterattack.
  • +
  • New item: Temporal Katana. 2 points for wizards, timestops upon successful parry, bokken quickparry stats (100 force on melee counter!).
  • +
  • Also you can *smirk. This has no mechanical effect, other than being smug.
  • +
+

KeRSedChaplain updated:

+
    +
  • Added a guide for romerol usage
  • +
  • made infectious zombies not enter softcrit and take no stamina damage
  • +
+

LetterN updated:

+
    +
  • clocktheme color
  • +
  • Ports TGUI-4
  • +
+

Lynxless updated:

+
    +
  • Ports TG #51879
  • +
+

Owai-Seek updated:

+
    +
  • Meatballs now spawn raw from food processors.
  • +
+

Putnam3145 updated:

+
    +
  • Ethereals
  • +
  • (Hexa)crocin
  • +
  • (Hexa)camphor
  • +
  • Tweaked wording for marking tickets IC issue.
  • +
  • Rerolling your traitor goals will ONLY give you "proper" objectives.
  • +
+

Seris02 updated:

+
    +
  • borgs being able to select and use a module when it's too damaged
  • +
+

Sishen1542 updated:

+
    +
  • gave chairs active block/parry in exchange for removal of block_chance
  • +
  • replaces box whiteship tbaton with truncheon
  • +
+

kappa-sama updated:

+
    +
  • made the Dirty Magazines crate cost 4000 instead of 12000 credits
  • +
  • MODS I SPILLED MU JUICE HEJPPHRLP HELPJ JLEP HELP
  • +
+

silicons updated:

+
    +
  • player made areas are no longer valid for malf hacking
  • +
  • default space levels is 4 again.
  • +
  • rats now swarm instead of stacking on one spot.
  • +
  • getting hit by an explosion will now barely hard knockdown, but will leave you somewhat winded.
  • +
+

timothyteakettle updated:

+
    +
  • speech verbs copy through dna copying now
  • +
+

09 August 2020

Hatterhat updated:

    @@ -1360,30 +1423,6 @@
  • plantpeople should stop dying in the halls now
  • Modifier-independent hotkey bindings have been added.
- -

08 June 2020

-

DeltaFire15 updated:

-
    -
  • Delinging now properly removes their special role
  • -
  • Keycard auth devices now require two seperate IDs with sufficient access to auth.
  • -
-

Linzolle updated:

-
    -
  • shotguns no longer delete chambered shells while firing
  • -
-

kevinz000 updated:

-
    -
  • test
  • -
-

shellspeed1 updated:

-
    -
  • Internal tanks are now printable at the engineering lathe.
  • -
-

timothyteakettle updated:

-
    -
  • newly created areas using blueprints now maintain the previous areas noteleport value
  • -
  • kudzu seeds now actually spawn vines
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 55bb782766..492f779d45 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -26818,3 +26818,49 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: 'fun removal: squeaking objects now have an 1 second cooldown between squeaks, and will have a 33% chance of interrupting any other squeaking object when Cross()ing, meaning no more ear-fuck conveyor belts.' +2020-08-10: + Hatterhat: + - bugfix: Parry counterattack text now shows up. + - balance: Sterilized gauze is now better at stopping bleeding, and applies slightly + faster. Very slightly faster. + - balance: Ointment and sutures now hold more in a stack (12 and 15, respectively). + - tweak: Sterilized gauze can now be made by just pouring 10u sterilizine onto standard + medical gauze, instead of having to craft it. Why you had to craft it, I will + honestly never know. + - balance: Proto-kinetic glaives are more expensive, stagger/cooldown on failed + parries increased slightly, perfect parries required for counterattack. + - rscadd: 'New item: Temporal Katana. 2 points for wizards, timestops upon successful + parry, bokken quickparry stats (100 force on melee counter!).' + - rscadd: Also you can *smirk. This has no mechanical effect, other than being smug. + KeRSedChaplain: + - rscadd: Added a guide for romerol usage + - balance: made infectious zombies not enter softcrit and take no stamina damage + LetterN: + - tweak: clocktheme color + - code_imp: Ports TGUI-4 + Lynxless: + - rscadd: 'Ports TG #51879' + Owai-Seek: + - tweak: Meatballs now spawn raw from food processors. + Putnam3145: + - rscadd: Ethereals + - rscdel: (Hexa)crocin + - rscdel: (Hexa)camphor + - tweak: Tweaked wording for marking tickets IC issue. + - tweak: Rerolling your traitor goals will ONLY give you "proper" objectives. + Seris02: + - bugfix: borgs being able to select and use a module when it's too damaged + Sishen1542: + - balance: gave chairs active block/parry in exchange for removal of block_chance + - tweak: replaces box whiteship tbaton with truncheon + kappa-sama: + - balance: made the Dirty Magazines crate cost 4000 instead of 12000 credits + - rscadd: MODS I SPILLED MU JUICE HEJPPHRLP HELPJ JLEP HELP + silicons: + - balance: player made areas are no longer valid for malf hacking + - tweak: default space levels is 4 again. + - tweak: rats now swarm instead of stacking on one spot. + - balance: getting hit by an explosion will now barely hard knockdown, but will + leave you somewhat winded. + timothyteakettle: + - tweak: speech verbs copy through dna copying now diff --git a/html/changelogs/AutoChangeLog-pr-11699.yml b/html/changelogs/AutoChangeLog-pr-11699.yml deleted file mode 100644 index eaa4781a7d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-11699.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Seris02" -delete-after: True -changes: - - bugfix: "borgs being able to select and use a module when it's too damaged" diff --git a/html/changelogs/AutoChangeLog-pr-12853.yml b/html/changelogs/AutoChangeLog-pr-12853.yml deleted file mode 100644 index deea36f640..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12853.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "LetterN" -delete-after: True -changes: - - tweak: "clocktheme color" - - code_imp: "Ports TGUI-4" diff --git a/html/changelogs/AutoChangeLog-pr-12933.yml b/html/changelogs/AutoChangeLog-pr-12933.yml deleted file mode 100644 index fc0b82455b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-12933.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - balance: "player made areas are no longer valid for malf hacking" diff --git a/html/changelogs/AutoChangeLog-pr-13002.yml b/html/changelogs/AutoChangeLog-pr-13002.yml deleted file mode 100644 index f41534eeec..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13002.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - balance: "getting hit by an explosion will now barely hard knockdown, but will leave you somewhat winded." diff --git a/html/changelogs/AutoChangeLog-pr-13022.yml b/html/changelogs/AutoChangeLog-pr-13022.yml deleted file mode 100644 index 2d0b3d16eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13022.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - tweak: "default space levels is 4 again." diff --git a/html/changelogs/AutoChangeLog-pr-13040.yml b/html/changelogs/AutoChangeLog-pr-13040.yml deleted file mode 100644 index 4fb40fbc5a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13040.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Sishen1542" -delete-after: True -changes: - - balance: "gave chairs active block/parry in exchange for removal of block_chance" diff --git a/html/changelogs/AutoChangeLog-pr-13047.yml b/html/changelogs/AutoChangeLog-pr-13047.yml deleted file mode 100644 index 94d54c3597..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13047.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Sishen1542" -delete-after: True -changes: - - tweak: "replaces box whiteship tbaton with truncheon" diff --git a/html/changelogs/AutoChangeLog-pr-13051.yml b/html/changelogs/AutoChangeLog-pr-13051.yml deleted file mode 100644 index a3063edbbd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13051.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - rscadd: "MODS I SPILLED MU JUICE HEJPPHRLP HELPJ JLEP HELP" diff --git a/html/changelogs/AutoChangeLog-pr-13053.yml b/html/changelogs/AutoChangeLog-pr-13053.yml deleted file mode 100644 index 163e08dd36..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13053.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "made the Dirty Magazines crate cost 4000 instead of 12000 credits" diff --git a/html/changelogs/AutoChangeLog-pr-13054.yml b/html/changelogs/AutoChangeLog-pr-13054.yml deleted file mode 100644 index 969b4b34c7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13054.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "KeRSedChaplain" -delete-after: True -changes: - - rscadd: "Added a guide for romerol usage" - - balance: "made infectious zombies not enter softcrit and take no stamina damage" diff --git a/html/changelogs/AutoChangeLog-pr-13060.yml b/html/changelogs/AutoChangeLog-pr-13060.yml deleted file mode 100644 index 69ac724104..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13060.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - rscadd: "New item: Temporal Katana. 2 points for wizards, timestops upon successful parry, bokken quickparry stats (100 force on melee counter!)." - - rscadd: "Also you can *smirk. This has no mechanical effect, other than being smug." diff --git a/html/changelogs/AutoChangeLog-pr-13066.yml b/html/changelogs/AutoChangeLog-pr-13066.yml deleted file mode 100644 index 43e7831700..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13066.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "timothyteakettle" -delete-after: True -changes: - - tweak: "speech verbs copy through dna copying now" diff --git a/html/changelogs/AutoChangeLog-pr-13068.yml b/html/changelogs/AutoChangeLog-pr-13068.yml deleted file mode 100644 index 5ae41fe394..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13068.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - balance: "Sterilized gauze is now better at stopping bleeding, and applies slightly faster. Very slightly faster." - - balance: "Ointment and sutures now hold more in a stack (12 and 15, respectively)." - - tweak: "Sterilized gauze can now be made by just pouring 10u sterilizine onto standard medical gauze, instead of having to craft it. Why you had to craft it, I will honestly never know." diff --git a/html/changelogs/AutoChangeLog-pr-13069.yml b/html/changelogs/AutoChangeLog-pr-13069.yml deleted file mode 100644 index 77ca95e410..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13069.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Lynxless" -delete-after: True -changes: - - rscadd: "Ports TG #51879" diff --git a/html/changelogs/AutoChangeLog-pr-13075.yml b/html/changelogs/AutoChangeLog-pr-13075.yml deleted file mode 100644 index 21d5775315..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13075.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Owai-Seek" -delete-after: True -changes: - - tweak: "Meatballs now spawn raw from food processors." diff --git a/html/changelogs/AutoChangeLog-pr-13076.yml b/html/changelogs/AutoChangeLog-pr-13076.yml deleted file mode 100644 index 0618176843..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13076.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - tweak: "rats now swarm instead of stacking on one spot." diff --git a/html/changelogs/AutoChangeLog-pr-13078.yml b/html/changelogs/AutoChangeLog-pr-13078.yml deleted file mode 100644 index f9bcb9f35b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13078.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - tweak: "Rerolling your traitor goals will ONLY give you \"proper\" objectives." diff --git a/html/changelogs/AutoChangeLog-pr-13079.yml b/html/changelogs/AutoChangeLog-pr-13079.yml deleted file mode 100644 index d6951b3f75..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13079.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - bugfix: "Parry counterattack text now shows up." diff --git a/html/changelogs/AutoChangeLog-pr-13081.yml b/html/changelogs/AutoChangeLog-pr-13081.yml deleted file mode 100644 index 7fdc1662f3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13081.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - rscadd: "Ethereals" diff --git a/html/changelogs/AutoChangeLog-pr-13082.yml b/html/changelogs/AutoChangeLog-pr-13082.yml deleted file mode 100644 index 6d29840a38..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13082.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - rscdel: "(Hexa)crocin" - - rscdel: "(Hexa)camphor" diff --git a/html/changelogs/AutoChangeLog-pr-13084.yml b/html/changelogs/AutoChangeLog-pr-13084.yml deleted file mode 100644 index 0ca0b2d111..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13084.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - tweak: "Tweaked wording for marking tickets IC issue." diff --git a/html/changelogs/AutoChangeLog-pr-13085.yml b/html/changelogs/AutoChangeLog-pr-13085.yml deleted file mode 100644 index 4f88c783de..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13085.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - balance: "Proto-kinetic glaives are more expensive, stagger/cooldown on failed parries increased slightly, perfect parries required for counterattack." From ff49790ac911f12f024db7589ff6b3e622b5e8eb Mon Sep 17 00:00:00 2001 From: Hatterhat Date: Sun, 9 Aug 2020 21:27:57 -0500 Subject: [PATCH 51/85] 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 52/85] 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} | ]{' '} +