From 65bd7d1f4d75e3a1d9cec96c8ea09c58b7b2fb98 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 12 Sep 2016 19:17:40 +0200 Subject: [PATCH 01/46] First draft of the talk wheel concept. --- code/_onclick/hud/human.dm | 4 +++ code/_onclick/hud/screen_objects.dm | 39 ++++++++++++++++++++++++++++ icons/mob/screen_midnight.dmi | Bin 26422 -> 26511 bytes 3 files changed, 43 insertions(+) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 53b7ce8a0c9..5364d4a8ddc 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -95,6 +95,10 @@ using.icon = ui_style static_inventory += using + using = new/obj/screen/talk_wheel + using.icon = ui_style + static_inventory += using + using = new /obj/screen/inventory/area_creator using.icon = ui_style static_inventory += using diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index cb9c698efaf..6a7c5f4f133 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -46,6 +46,45 @@ M.swap_hand() return 1 +/obj/screen/talk_wheel + name = "talk wheel" + layer = HUD_LAYER + screen_loc = "CENTER-7,CENTER-7" + var/obj/screen/talk/talk_boxes + var/toggled = 0 + +/obj/screen/talk_wheel/New() + ..() + talk_boxes = new () + talk_boxes.name = "talk option" + talk_boxes.icon_state = "block" + talk_boxes.screen_loc = "11:4,2:-12" + talk_boxes.layer = HUD_LAYER + +/obj/screen/talk_wheel/Click() + if(world.time <= usr.next_move) + return + if(usr.incapacitated()) + return + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + if(toggled) + H.client.screen -= talk_boxes + else + H.client.screen |= talk_boxes + toggled = !toggled + +/obj/screen/talk + name = "talk option" + icon_state = "block" + screen_loc = "7:0,7:0" + layer = HUD_LAYER + +/obj/screen/talk/Click() + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + H.say("Hello world") + /obj/screen/inventory/craft name = "crafting menu" icon = 'icons/mob/screen_midnight.dmi' diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi index 4de01c73cc8af18567be7f85afdf4de327735249..62ece5668fd650fa1785289eb98a40de8542b380 100644 GIT binary patch delta 9630 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 S`7osCM_%TWbhV^u(Ek9tYXsT= delta 9540 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 From 76f6ef21c33c145c2d2964a74a556127c9a7bc5d Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 13 Sep 2016 01:07:52 +0200 Subject: [PATCH 02/46] Males the talk wheel more fleshed out. --- code/_onclick/hud/hud.dm | 2 + code/_onclick/hud/human.dm | 13 +++- code/_onclick/hud/screen_objects.dm | 105 +++++++++++++++++++++++++--- icons/mob/screen_gen.dmi | Bin 113350 -> 116520 bytes icons/mob/screen_midnight.dmi | Bin 26511 -> 26638 bytes icons/mob/screen_operative.dmi | Bin 29047 -> 29271 bytes icons/mob/screen_plasmafire.dmi | Bin 28332 -> 28555 bytes icons/mob/screen_retro.dmi | Bin 11300 -> 11371 bytes icons/mob/screen_slimecore.dmi | Bin 26915 -> 27117 bytes 9 files changed, 108 insertions(+), 12 deletions(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index a7930dc8c2c..8b48baa27ee 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -33,6 +33,8 @@ var/obj/screen/throw_icon var/obj/screen/module_store_icon + var/obj/screen/talk_wheel/talk_wheel_icon + var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 5364d4a8ddc..0fba3a1ea99 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -95,9 +95,9 @@ using.icon = ui_style static_inventory += using - using = new/obj/screen/talk_wheel - using.icon = ui_style - static_inventory += using + talk_wheel_icon = new/obj/screen/talk_wheel //phil235 make it a reference var of hud_used. + talk_wheel_icon.icon = ui_style + static_inventory += talk_wheel_icon using = new /obj/screen/inventory/area_creator using.icon = ui_style @@ -356,6 +356,8 @@ if(H.wear_mask) screenmob.client.screen -= H.wear_mask if(H.head) screenmob.client.screen -= H.head + + /datum/hud/human/persistant_inventory_update(mob/viewer) if(!mymob) return @@ -405,6 +407,11 @@ I.screen_loc = null H.client.screen -= I + if(talk_wheel_icon.toggled) + H.client.screen |= talk_wheel_icon.talk_boxes + else + H.client.screen -= talk_wheel_icon.talk_boxes + /mob/living/carbon/human/verb/toggle_hotkey_verbs() set category = "OOC" set name = "Toggle hotkey buttons" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6a7c5f4f133..a23877c0d71 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -49,17 +49,20 @@ /obj/screen/talk_wheel name = "talk wheel" layer = HUD_LAYER - screen_loc = "CENTER-7,CENTER-7" + icon_state = "talk_wheel" + screen_loc = "11:6,2:-11" var/obj/screen/talk/talk_boxes var/toggled = 0 /obj/screen/talk_wheel/New() ..() talk_boxes = new () - talk_boxes.name = "talk option" - talk_boxes.icon_state = "block" - talk_boxes.screen_loc = "11:4,2:-12" - talk_boxes.layer = HUD_LAYER + talk_boxes.wheel = src + +/obj/screen/talk_wheel/Destroy() + qdel(talk_boxes) + talk_boxes = null + return ..() /obj/screen/talk_wheel/Click() if(world.time <= usr.next_move) @@ -76,14 +79,98 @@ /obj/screen/talk name = "talk option" - icon_state = "block" - screen_loc = "7:0,7:0" + icon_state = "x3" + screen_loc = "8,8" layer = HUD_LAYER + mouse_opacity = 2 + var/talk_cooldown = 0 + var/obj/screen/talk_wheel/wheel -/obj/screen/talk/Click() +/obj/screen/talk/New() + ..() + var/image/I = image("icon" = icon, "icon_state" = "talk_help") + I.pixel_x = -32 + I.pixel_y = 32 + add_overlay(I) + var/image/J = image("icon" = icon, "icon_state" = "talk_hello") + J.pixel_x = 0 + J.pixel_y = 32 + add_overlay(J) + var/image/K = image("icon" = icon, "icon_state" = "talk_bye") + K.pixel_x = 32 + K.pixel_y = 32 + add_overlay(K) + var/image/L = image("icon" = icon, "icon_state" = "talk_come") + L.pixel_x = -32 + L.pixel_y = 0 + add_overlay(L) + var/image/N = image("icon" = icon, "icon_state" = "talk_thx") + N.pixel_x = 32 + N.pixel_y = 0 + add_overlay(N) + var/image/O = image("icon" = icon, "icon_state" = "talk_out") + O.pixel_x = -32 + O.pixel_y = -32 + add_overlay(O) + var/image/P = image("icon" = icon, "icon_state" = "talk_stop") + P.pixel_x = 0 + P.pixel_y = -32 + add_overlay(P) + var/image/Q = image("icon" = icon, "icon_state" = "talk_yes_no") + Q.pixel_x = 32 + Q.pixel_y = -32 + add_overlay(Q) + + + +/obj/screen/talk/Destroy() + wheel = null + return ..() + +/obj/screen/talk/Click(location, control,params) if(ishuman(usr)) var/mob/living/carbon/human/H = usr - H.say("Hello world") + var/word_spoken = "" + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + + switch(icon_y) + if(1 to 32) + switch(icon_x) + if(1 to 32) + usr.client.screen -= src + wheel.toggled = !wheel.toggled + return + if(33 to 64) + word_spoken = pick("Thanks.", "Thanks!", "Thank you.") + else + word_spoken = pick("Come.", "Follow me.") + if(33 to 64) + switch(icon_x) + if(1 to 32) + word_spoken = pick("Hi.", "Hello.") + if(33 to 64) + word_spoken = pick("Bye.", "Goodbye.") + else + word_spoken = pick("Help!", "Help me!") + else + switch(icon_x) + if(1 to 32) + word_spoken = pick("Stop!", "Halt!") + if(33 to 64) + if(icon_y < -16) + word_spoken = "No." + else + word_spoken = "Yes." + else + word_spoken = pick("Go away!", "Out!", "Get out!") + + if(word_spoken && talk_cooldown < world.time) + talk_cooldown = world.time + 10 + H.say(word_spoken) + + /obj/screen/inventory/craft name = "crafting menu" diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index b0a1dbcb16859976153781d4f6181bbc8d895450..28c61a1e7c3f99170e9efe0b576f0b6b22a054c8 100644 GIT binary patch delta 12651 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 delta 9457 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 diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi index 62ece5668fd650fa1785289eb98a40de8542b380..c25813197fea052a3db4f2bd9c7be19cd6110cb3 100644 GIT binary patch delta 9419 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

diD0a&sr?l6`vm9=-u!u=+@>2dqwr z->vl@W_~(Zm7HH(G+sH|kDm)X6?XhS6foSe)0YA3>yvr{;(oV6m*x$vxf^~PI>1Xy z1@G@WM_gQCA*72MG^f%W~aJL6Cz(ar73iHNZ$;wGo{8vNKF$LVdQ{CFQh$W40wWji7fLjqr&rpzKc`Qw5f{*XzRZ_Ct{}<;7Tfha zY|c01m?+8)A5U8XnaV;1$k?=}{&JA61_`f;A6D4&x%9TSE@HJ?r@fB)rJ8{)ZEMM% z>E;Qyy@(BDTTU1uQAg4@tPQQOl>a-*=_-OhXC8evV%hsj1GYT;gt4eJW1z71${OkU NQIb=CTPtH3`hVjke|i7_ delta 9291 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 diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi index e1728959e6a29411e937c5268e3f6698d0a9ed54..e6a65052c14520ba18a8f0fa0dff2276a12fe39d 100644 GIT binary patch delta 12417 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 delta 12191 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 diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi index c40a531d8a65991f64c3c7c198f9b6145094dc6a..3d1846b300932bc014c324bd4bbca1dca55156c6 100644 GIT binary patch delta 10110 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 QH?PkJSyh=zDWjnO0huMaeEA^v=SSMSxk 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ℑdY_@| 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 diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi index 9c99dba486be633ac6b4085f4d7d46256b194ad0..db87b5921696484a21cb5af667b02639350d8b87 100644 GIT binary patch delta 11203 zcmaKSWmpt%)c!6ZOSgp59nvMj(%ncSB`P4&owIZciULY^H-hBS9a7SbbjPyfzWm+~ z@Ad!mpAU1*dFGrm*F4W$=f2PVOrFucQ35kq_6v&u@PPyWVApGBmgkwS6ShD5bx(Z# z*5%>7JAdDKajR9nQO)k~+HRx6-yN}((UyY+R?CZ^W8Us|Tk%?B*XOF~A`TmGStfs& zE#Q%}wn(AGOc-N!aPE;Y1VHYNylW3L@Cl7tVUv`IA&MY-keyy^I)~e(cvYv{ZCB}? z3mx=3kjjV=mZJ@>snzfM>iRP*V?$%qkM1VHz=UU+t*0}Y*(Nx{K_QwsnaH=kBFPx@ z0sIy?Ji9wj%4%z57NkIV9W ztL26u5IsmmUPjM5?J(Uh;dxK`Hr!ZJkXncY{l$pUM1QAm7@zfkGE-^LtK1H2^zi9w zhAyjGg1dGuv(Pn12kRgdpRyRwC-8?W*|tcz2qU^`+#wkvnSO~_L%y1T$lhVRf-iC0 z05+8|(}1rK^+?EgY}468(coU$UYVhnf&P_yAftFwb5m2`5B=+M3xl>mjM9ddAn}5$ zwO@wJ>EXTww?|7+N$|W%038HdPFCp__n|i>N01Nb_RYXM5HBh)8q-hm4!OSO6I22^ zFz)mHUO6^TAvbO!jBdxcy||NX7Ap8wC2fg+9M<_@j$XiUBCsFZZ($ z#cy&tt}$mEs;F_A_(~A?nr4J;xs~XfGukH=8v~wkKIa59roxyXX&Iw$+G1A^1IQ>7 zGkr|h&HVy`aayyWGBme?TPimS-osz9?LI-v@@n*Rpico677Ch~Av6NwfAlevnR$^lc$K3) zS^oKbyiZff02881{$*f|3IkV>ee~eT2lEWqB`2iA$HU5lnTq?PH=+tk3K8rtGg2WT z*xF1W_KWN%L%5y+F*(P8OV)mB&(aQ&vFx^q0#DhUY0`;~dlqm`i+Q-;T4NS3y2e@%h^tlAYN}lxn-q&t z-Hj%a?0d{qQAv+7M99&5f5x?jPi(idoCk#zMqYAmqXIF`U;qY2K)@79&Mz}jiChI$ zr4>^?$%5x~tic6Bt9rNXwF=+Q^({fRs-$G$|MG%_L7*z0GX=x%M_yYVvp5}{GWZeV zoN!W(+kts3SWj)S2FzU<-ELZDBo%%x2#===lE{L3ipPxmClLj^MZ}4FuUK;sXv z^6c#gKSegOpT_Wm8v`&Gigu@|OHV=t910R#w|_WXuxiQ4+8&|(NnIm#lIhcmG`62E zPu}r*5E~5i*4-y{f9{;KEJcff@_{xrL7REQUKQQ>+fCi6i)XiKx z{MNuXO|}$R(?KxROHn_-u|8AEl0@4<0g$$3{T1pS!rd+#9c+tfD=18)dTOxZvw^M4 zn`QrNjlo3`eR^}{UY9~Q?G}{c8Fl3?9iZIRNEmz1MfLTy?F%x~amB$*zPB`N?=rvD zWR?YF&@+~VuF8!op3MbG1^x3;t}Ph+8LQMh{)lT?g3x0pd%JJCIUshcHbOjl z$@u$x`RkG{{OArUHcYf^sT(;XVM}`7|{kSn)7Xp#(Nhx3zC)-*nryqS|>Np(A33M z)&IBn_swKpAP}tS;qt{-NOzTO_;PWhW2AD?2GSk$bqt_cFhtud?n1hYd>sX7<_*!_ zP1*U2$K;(`6e7NZeD?UD>2Z%n1j3$CT(@k>*uRP7(J_6_kXAdJJwmZ>c52`(e2@do zNoK_t1}HsUi0GXNDWI3b(b1P7kIoV*5PZj9-R)&ndy0l9^R*{$O7JF2B8ySzop(}I z!uXFIZ_KvPD%lj_(xzx$p+; z`Q&(O#azAC@u&-4iUv-pgG2f$UECU;_FCW9>+j^9 zz71of1qMX(8(5aBMd77}qTeC$9rYHiO><<~p=^-KHj!~AS-f9(6YA1^96Ka9u8}Zv z`Et&pDI4hw_KjSQTLm6@j#}o4FY!vz|UdfA{A%{8{^odItCo>NY&4 zHr#SzE}cdmi2Gz4)12lD&s!&uGyO9ieLx^H9}9CVhy=ncU5T_Eb#Pqa$~HgXb+JRd zbjA=_Ydq?sXeEf>bNi87&Kgh3MZ2=;a{IE{DVc&Ml)@-srS8idi;YsIi)s`53*cC^ zVd{1~M5sy>L7rv$D<(ducjYpDfis`>5OwXaN}5a|WeS#7Cq9#PBhB3rJ8)}k5mc@Y zj%oaITYlPhC-oHbdepLRebOdv@FP>LpkwFM3r42Qe+H6N z@2}7YqvHz>k~?w#ktVy1eW3w80a_KdJrlGM1Q@kJ+& z9a(EX!{k%=0|lgC70tx)Tke2ALRuu<$|nHze&p=kP3-HrD~pVDWA}hlf4csh9gl~! zhNy%ngK$W>fi{Se>+lwL;~oY>ixqfW@ndVHI*az9ecu-MDik^_a8(aTvNZVcxQyS= z-Q7LF_hZ!S`#?vLV@1;slLb)95;@sT5DxC$JLpixZQ8mOW1Wat&*irNzyo=H*tQ(V zy7#hD-X9hZ+K7C7FE^xc6-c%^0%`yOqiyvk&DgwuQXwD@AyZ(zQO7E(8|O3cj9Q=5 zjI3n}R2QOr)q;e909w91r0rlJG5qfU^DWq}nV~a~D4`Uxvp-c5JTb%3udk?2p1{`j zF;pn=D-`b9gY_H2H;S~KwxvtF=6+J@#BTD2p?0w% z<66a}#^Fq|HD`Z+51iOGtFln}FWXwj8r$JRCw5fKfWPM%(CS`rs(X9Ts@j89G)IJ^ zz^6_u-k|Sm#3CKW$WA;JJr(O6#wha*lrB$2U5c|Y`8~n?VSl)-B=~H~%3u81V|5}p zSkSrrBe~RK!spwieh#MH%c0DqkLBW}zK>FFa`Iw7zg((q{g- zfL*s#7gL-9C+2jaqi!qc*sGnc4$FZDkeXtm$auwEN1Kd_1GltR{o!+UgSZ&);{%W zun&h?B#uH)U7q0l8~lU!q`4S_XRysT;&QJ!63{SN#39q5xL}dNOyYps^UOj)-a-(L z?GeCjiFCMP7WJZ5n-(4seYon@KvhU&=lH9iR(m*uEJ4&4)&&q2?=EMww3KuPvfq0* zcD7Aon5rNRED(O8-1cc|@+6fs`cLM{4kLDPq5tFKoQE8o()3VJ@0CyQc3azE80BxA z5{==(vYn}FL_KTT+U={9W=%et*~JO$0&-WYoi>?y~H<;(V?j@oIVOWkNF0Mx%0z z!v8%^row28iF(1`l3WML7e022K+bO)^JzV~SVj>}Vykw}qR(1p1bCUxLo{KEIApe9 zOf*|P^e{(=4ic{v5qv1bk8vuWYmpKyDBib83D5d7U(3kYuou)B&c!v&pd-T85@o{J@7c2jF+4ekeak{!;Tz4B=Q`KG zyp}bX6v2L~LtNR=- zW-ac4S2l{?%WTrOA%4LBDWGiAIUApIQ%pBG?uBPro@-`S6kB4(NJPZs;W^qrYqaPTxKxz{rn|B z?JAio3!Gy0HGsuEf=2%}tE{=V!5!XTn;nKuUGV3zL3)KC#Urf|4C;L3$SAhIr;B z$iLc@lysTN;!jo>?XigABMWs(QqQO-v1y}EL3i-uC&=`GC}n; zaw_Z2k>3!!r?KAl)ObhUIk9Xa(UOGBwm2zC#dY$FaxoT}zL_KNaPHpg%9IOG;w7yO znFz&h3iZ>*9-89El-%SWJVWZsF@3zRTkS5S6YLE=yARSVyO$O2>{hJWzj!Pqnkf)o z`|;uGjQk(d5khIV?a1e0$h2;sK0`!l;v&g&U>gc5Fw+$ue!+9F~=)NtMX9r7fivJNY5`J0>{-XPk^_o5(?A!6C zhL(NbDz1z2$`~Xq9r+|(+x8ptpUdo`k9#6edLMfGC>c4sT=g*7wXojcM)p$%#zV2eXyv5l-9A(>Y3)LZ)2+=}chM5sS-; z{Cya0lu8m`5f!}@7K%lhGTY4XNUlwV=i-OZo3ME}Zq@x=<}Fh93R)nEky8t|C-Yp< zXzJ{bJj3ay&GL>NT$qA0WO4qsQ+wwWj>3B$f?j|4^)-FM_{ z^?wPkY&2Ng7LKAhv7cx;))6c8@&k3HS*P6K?))^3bplY61^3 zg;@`erXFM9aI;twe1`e!FRlaC?l$hn5pol(Um1ZQvD#<9ZOgs%cplr&A4>>_0wlK+ zJIPxQ96r1p77%kNK?QmL=!7DAlVhr-mcq;D88TItq3gqrmRtXhbQ;1}3jRLenfp6V zRe&_sUM8c{O$4E%uWi(YRogK!R12;}ooRV4lSe^-eVv0x8HZJiRA@9Oseds=LZb>q z7GV-X2S;GoMrZvdOKUaxQvy~qP^9lna{n+e_*Mc9R*t3XlXk+#M~wVuQ4bjyZKfZT zQXBh5nv?aUy;qz*QZMq|wwW>`it!YTxYJT#;CasdAtmZKr&RUo)p?Uynxb6n z#$D~Gmt(iaahH81q=kMhCtp#U3?Yk!XXQEDz-vN%5y@~$OlPf}bL1T>d#Gt>_`bUH z{)Ci{Y4t@I@M!kmn2tc3TU-|)l8~=prD-x{l#lT0A#gRfAr8hin#J~M zLCNXa?Msv?|KiuxPaMv~{YKNGnsakeNKzIZ)kb@{Qj4F35Jcd1a zSgE?i1e|k;yzcDt3sdeE{W-SR=Wcl1B{4bZBR(4_AZaywH^hTY9;A3AaemJI7TY+4eB+|hc(f^8#Ag&7{~j93KYU0#3}u)+@DHR zc2YkzKqih#sbMiy+_8a=?>Qwkv!_kJt#j_Y+8X)~L6vQ|`F&3ZK(|PGd&xkmlX0DE zqc!wDStD`1q%mh&GY)FqlNbZQ3j-P4^02pDTgt$-DDl1+G$8mbI8Z>o1H0C#QQ17+ z!n4V!%-H~9-2c{COkoR=M&b2f+>|ql(kt*Bow9}6mo@Vixi&h)!@ib$U%lqTIaZo+ zKsRg9F#6}dK#Mtg7n4C~KYiOs>`w3b=id9H6SMm4C6cA9#9Y(QapC=jLDdH533ukB z0W8>m9>3ek{=CkfG9Ezog1+75$|b8Fe$0iyr``LbwuL2LED2^+>0H9KofEFv5Sn)q_B`-fSc(*1GE^sPsYw<#xM zmU-UVOFeMMxf;uk(HMp1u`w0tHkZBp2vAs}osNIIXWaZNV(lL`>D3w7N*+dOzr)0#EkiPz}1oHy3w~} zx=4JnN1;VVb#F0nLPqy%4ZQh}+TVgEyEH_4hjChGWXv8!D~aAv_+H@rrrSfs6JTQI zyea(|7&XIIp*9@Y8o|cY+S;m8D3e`eTE=O6wQ<^Ovw#1=quZwR=~pNUbk00M~qcebIJK3>?zTbKa$-jXU6$C)($Hoga1BT*T7p z%Z5}=Nmu&PrMTLG)0!zuJNlhqouq1DxfOAoo_;!?iG##-eqDWo4QkZTW>lwUmH4tc z>qO|l?wIJ`nsOo^Yz@EPE?2nq%hdkY6ZgkjCVAzwh{Q@aEfiigPc)|ixE-4VRvw;c z=?x2qUdt8oJK&`M-n(75v>%|@j3r*yATp9j9HV6 zkjQwY&db$9EMmHN5;H!3%#>HvJ#9hFRgD^;t;NXC8@!-~7=!&60?1G|ew{GhvVT+% zwl>Him(@UzA#7;jSXAEDS1RMtZ*`EXvO8m={kx(0u5YZQ9|F)z8uXRZzK?(HKdMOf z!6Hfv8YG$Jfo0Gg?J-JPvMzY5>OZbcwi;7K7f#?r+XjQPO7SS$%VlwrRORqLOT8n>s=Pj|-?!4lP^z_lph` z^P6hxcstIaOh>Vth#sple=X5mI9+L-1Tp{!NMTtXrz32Eo?A;Vh&q)i6!X z5WDhTy5+FrP=Tc%F@uf;1dgym3OYo-apsrH#G zD*Gg|VgkbCjj|scn|2Oq2W(sx%p#fJ88zxLLY0;uof&7-oi&L5^V5S32p3qd?ZFA^ zNnfz8jepf(%D6dsp{sRzOQFHvHf4<(MzPLsdEg;<27&c$I7w%(=jK+3L4cH{ZdGtM zMNzVE_sX?{BkIMoHj6I-A7o6C$D^ndc*JT=kO5+xawh~^Q)CnR8&37 z=T%>JuDocsb~Yd<5y^@~;pV}D1?`SQKpdJD?MlG@P?AG2g5Yyq-UnOkXmeay>t zW7{+@ATaejSdDx$WI>I$%+@qzMXrG3_iqs;2y^MW8KCjn_H44b6UJ!T{5~wOOL)9 zW9C{Cs>Az>l9dJqbUpZkhCm1C&fV7VqDh@msLNX7Q;3?*AGFTo<`J!9c(qBmwoK} z9H%=IRqXwv$Caq3bfr7rrcW_zY?+)yh5V0?;M?t_{EhCX3(%-EE?S$H+GDWq)}+rv zq^dv5z9s(yxXSOm`RcN*V~?$9)e)V&#?WA$>p-Q9ki;^IF;p>27M7+4-ClDrM1|D^ zm+jc(VC;mAHRV;@M*n5Oe@!G$;k+bax>iemP()3OaZRxl%4n86{e=K7q}*V}z%A)G zVp%SlMuEyil5jN2=brez}PrsHKv#@Po)`P~w6w4R@CrMfsK z(&eNh!J?)byiS(_V&Hn8J&W-SaZfUlmmIuB(y9H zTb^M=+Di-t*G7s(g=dg-|8x^6;gi70&1i*vus?+~3>{=8Pm~xJLxxn8CK%=Inqd^wZK)z9 zS)*Qw&dd}5_;}H=h2WXRi{pO%E~8)5dm(3BDLR|*U`}U!Gc2h=^;$nJcCM^9GU@lZ z55>eHdtdzP%d+TXj>~F}+ZRvEN=DGgY!X%mE_;?5mwrliz|jafAt?lgX=7FgQU@Pg zexJSbF32@u<7v(ts-<&A#NW8=MU<8u7Y6?R_))$TaEWPg+xFZH{1CWRs&1~&fjH<{ zxqi3!OQG*XoCjV~?-q852@z4tPP+?P$ZP;oZl5P*?ecvIJQ@me`aq&PA({4U1j7kTFGP5rLpYZu{pp={H@h|?+8H<+JU|W;<2}_+Vb-H+-kE+_pL^9ularb09D}eW4l)*sV^78po+>(sZpkiHB<2yQu8-6 z6ZlG!)&}iD?4k7L*{CR@@FcYLNXc=l7Lm69Ato2M5N{h5$c;SBuJEXlKWE$cT)1~E`3gp4@8Mukmk2CF1Nx`^~W~RPFp3Frm3TES?{IRGE&m-j4P{eTGxdUANJ1Jc7fi3b)A!=*j3n!*4D(LvHgUAK_~@5$(OA|2CVSe3RyFc$Sz^*No9?0KILs%(8(n>15Zz%@2V%6I zi|kkE9cPhsM@~)SR-Y#?@`nVE|DJ~W5kU3mmK~o4dZ;74>Bo*Gr0d&!NM6cBPhZx{ zE+W|!?i9o75|?Cv-!r#ZWoWH}c^|{l?gy!bcv@*U1n0BC3a5=UfKqmm?nfJap^E)% zm)*;7EFrr$zO9$0MLgJHj8-`mS+OjWnB|!pi(?~#+gWpWBfr#Svx{VN$p5=x)NY*|9YQWFx49o|P$yj?=O6eY{lIIQCA)|`$0DU+F@OE}I@J-X@p93t9)+3> zv|hRVLQ45KunoA7MSo;$;(VQ&Q;P5DJGFWGIVCgNGJ>bDU<0Y1Lfmax{mH(Q}!Cxytz!kbvKLvdQlo4+5o<%LcaI2z5 zL+Wh(!0<1Vhopm@CefYForf#wnfv2g@x@oc}inZ`9Db83g?i@ zh+E(@Zl*8kOvZflV~b^ZbFrHQc_l8+7jWZ#FjtH9IR5dz&%?Q%(WGTdLQ#zFtRN%R zWv`0?bng6kE;DxF0IkjrNH{hf+5g^cs-(I#yAqZ_sP_wFps%w*L1HfJMI&;Gzycv9 zJ@hAA0pz+Ol=lUa%kyyl{er_xg&A@p7;dssj$%KZ#>_NpeGWR= z9OU1CeFIPx^w|Gkw|iobxvgXNUp-8K*o9_K)cnp*{b(_|tM<4f|9+)6POTD)ukb=D z`dx}r>~=@4ko7GsNAE}=q9+sR{x2gc+6TG1V{v-N8z)2Ue|hmZTPJ`8Nq5*cWxwV% z{PbhZO`NJ&r0sX-^LpO31H-8sPMpQUZ09y*C54IhP8M`_ zzA3Y5$C`|%Fst=k4l)5-HH&vq1R%|=u~pNCGIWpxd|&kUKe!|ei1Gs72P8R4wV%^z z&qJ6z^y_}c>=vZxe)Db)S3n%%$2d=VSjbK0$5?Cr2zu==oi+yhB|!4Q-?wgvMAM^X z)I$CmHDda*%%~m`FL^0d=HRd!HzFR$dez7@By7M4Sdd7oR@%K;1`eM_W)oU86htjfK3(1Tn%n2SeFNQXwzV${tq|pH&uY6`o`ESZI%O zJV@zc{*XmTm)Np@6Y5NZL(Wix$G|$2?C`8o(NU`Gg!1EKL7za{f?_H0xuK!b^fsu# ztapknwktpGYRFK2`Ce#gE)1|@j>p~Un>!ZU|3ZX`GY$?=B=Ho#PvAQl@ayc(M19SP m$)KU1cU-zt>9};a(p}QsNSsTmG?LOGAt^20pn!CDh=Ak;$qU?%_qV?D z$62$_%$_x8)-yYv*+)iSjFOp=BvM#j0<2b4NvgAzA?^b+*wdn_g=+?xeHW7!kXmatgZvcpT@fob)_-(k*Xa* zwu)E{Kz@vv-DZ^-H+GOHLh%Lx2ybS$j!n}{mS5wj3{S_POiD?EK=dG01zEko+>^Xu zPn!9z{ho5=Ptk9gUbfJzzGMwc$BLzO70d5+KWA2h_Fj39F{t-zreF*{F?|b`{}3*X zEc~@*Fxm5rY+3r;#$DKt&x|aVb96i9HAmUsdCgOc+Gc+K<%H`~Dbg9B3gy0}K8;`4nO(&-orp_r z3RP?nJa}vkmdUtVsCTRe60}8JCA%~qf@l7l0eWM}wMwM_Co*5c2_9?b^bKyw+e`Jf zuP<>tB9b~eE-VEbP=R^BD<NBF3Em=B$dH zl``Szc8F{L6+7VG;6Hk#rV+~cgd_;jNMw+lE6&(jpWlZSVSo({_$8OOjBb&g*KrtSN7QYaIFHp;} zSqveG++v>x;%F&Z`D@ITM`AAa(Gk9qm&NupY$>lgfN-3JzDtg3d?(RH(=z?H(j4&R z&Mz34&<)bl=5QulhUi`E3m$IAmFAc z5^bc;3UV6t>)95mXzppS?742d<5qOgFK3r1$ia-n(qRIz|0`l0!|~sgo4#S6dd!<~ z_r;_KPN21_!GUwAILhp-+QfpB#S5DLwikkZaym55hS%j0kEJ-A($~F&h*0D%6r%MX z|EMwIuE8{m#XwJx_{SH{&(P4gtiFglt-iT@)_&d2sBk8bTK@6KGI=-skpOdJw|}Yb zTFUbfd25Tq=273f6C5r{k0fgeZjN$vTLkbX9aCneZ^Si{I529W3t8|)=OO2Ms(T@% z6d;os)FEpzCo4P85!!?rCPgiGRdfFM86+fNJ z?X!pRvt4C+{EDQ!3G1e0rl_rB>yj56H!9euB%u=HWR*9VI#JVj0z~U@u=dTbJzys; zqGfMSq&tYW`HA807*7y5v?fhXXjrNl;(ZQOI*UHUb@5%8@U>2;`Cou0;8q<)H{hFqTe%bP^cRtcG$~k3$i;gx%i^?J#$^C{9F!<>qyC&F4svv78M4>ksYR5iR-XWL9cy z-?yl+zp$(5Vqo^Q;fLcqX(3B)8`{} zqBfYS>}6;mnegR}5jdd{039Mhn~t5bccxFArv74~a6>g9zY~vM`4hM=ohTQD z)A64$p248^$uW&*lyJjW%;ifK+|9)adJyYDaqS-vjpm}_!0&n^{QAzj(;YI9WD+~ zApiwJS}lVK}y7^vPe4Rl9I&t`&+a>BGeulPv-qzTz%bmex+{jtEwN9Od+#e-R9e6 zo9GzQK}C3kwDB^48SngO@OdmN73-kd@nXX{g&&KIOzn?|E$$E2iMrP;TLd;)wtvID zkrK6&{EffU!t}fMb23;yC zi22N&hwtB7YDOX|Q3x&c_vL2qbvh`BiXW1f@a1w7`Ycf5Q58%u9zKXvgtExwqsMDI zFg*)}kL@24Nx1OH3Toq@2U=aHW9YGS7A*@1`!zHad8i-pT`~Z^W z^z?P28QFgw;u_0w!}2zrACO|`e-gbur3}@f(;=jKDXDJs<6u0H%uWmSO^A%DuY7O< zrOAo;@HPI(vYOMOhK_axY6T`P@y1`5p*JY-0->;i897vb-x!lIB4mGtFj2Zwvs&bM z7u{@=W^fDVwrVurK{G04e!6u(wJ1<2D{XICpqNu`ebqeN@>FjB_8^yoS#APu?2GKX z_ML9wzL3?rvrq@>HLP5v2zS(Suv;0iI_Fg7=^qsFoQp^C)=>5jt#T{a$lImh&ml3e ztSdn*8-MX#@D!&lHx6-1rE@-;72Yy4@WFVmTTsN4* zHX`Ki>SKk*BFS$iWbruS-A|(vyBsoP;Dl{lo$Zksw0Y8grPfK}G6RB@T@0(OiWshi zrZlXiz81^+vU!rCC=txMZsBPzIoxL488w*^j)T|O-XEYAGBunPa{)5>?7Jl#a2DjC z@3IA(5|5LlO1ahd%Ztk9LnFYe5MP>mfkL>6o*|x_mIJS`2e-VaSHF?p^*Xt|X>rFb zE8GL*Nl&h;4>Tl~V4$6a6JavT)ZIExxVdju73m)H`8i#Sd7=t$x1ElVcWEX4^@%R2 zVND|DqTBrK1sAIK$RwwYA~#CjY)V;vYp7h{rPj{Qb0$)^2A_@;{04|zlNOpb$0dai zOJC)!R+bW;Ag=JXh%+-Frbsdxgcou?#3cuk$3CT`VySKq4 zfrR@mZsJHXUB-YA_$Q6yn`2H88frfaXNZ_zq~KnFy@bq2@T zeS|`h<6lCu8_sN%n=E@*kKT3re%nQok@nDzC_8SW<*tEBn~Y@(OYq(;M-P!xw8!}6H2pE#nW1Z$bj%E z{zGC-LLmb#1ZS?EA4k#{HCYzsU0~yR(5GcR2$?7!}I|*oyobgyOCG!6qy+&$fVY zE_N46&ic0 z5*|L)$qNE(WEF`2W6NPoG@xC zp&$^g14D92^^jbaN7}ONX&;;SLtj=d!qlV|!LiXhg&wz4;JllCW%*_Qmv&KT4Q$!1 z;JUdt=n{C7K|mT?>7?$^6hyUDpczk8@dM>k;~}nQsZ1DiXiq1H=y)Sb221l zqB9Mdy|}sR!?ws;>e|X%ZvDlEUeQy-#mDy-QL&=}Ln8})NKholsie=0X-N4kLKs?Dv%HzFnwV736pp(E0oeb5P7F9DykQ;h|7bRcRc{(<#e(B`fPt083f?U8M!0|cVsljKhCdr zjf~=kG>%Uf5;&cH{B`6zWQJD2gbXJj7)Dh%D5k&$q)eL4l^rNuy5@0pd{`N|le(a$3?E698`E zgA@TfmdAVuZD^>{t_BMuE_3hP2zxBa?WHNn5M$qHy380&EaP;cE-lAFR$u`=A_HA5 z?)$%8j^rkE@nbJ7n29J&R{4MaLs9 zn*;wRXYqB+{RHe6%6IdbcpwnZ6}$Z)Jz4&2TdVy3xT;${s@6zS`xkp z)N3n!-az+)x_8I~-QbsJBWJD7-KSjr-bgJ}CB{D##N|z~#Wcnz3itGCMUkzBbH`6D zwJC`GKcdIyPLLu!^yD?ZQp8iy#m*y`N_ivJL{ZMxIW+=%%%oSd^3m78(<=N>bGd@r_ zPp+Q64b*ypOFdu6u-?tXoA!u$lC#5Am0_UbJ)5G^hC!ll?*8siobNC;Q;7#Y`q(*( z8hj#Rw!n=wQ{nE za@a&EGuMNR^YFrg(C`zO%AOPV*3QCJ4_%vj`F5wNhc~^n6EpS0-0FWk5DylA z(XHcXw^M#l3ERVhS;Y%)d5j-7tr;H+Q%+2G;u={MPRHJ!Ej?DQqp%YE7yMY0c3);F z+agLr3$=4m+hjWdPqmt*&BxXwrmu9h9p@Z>ouyCxF&kIqzcDKg!loa@#Y{(_Ku6U- z=KJ>rqaF0JCu6@iPe+Y{Fl`W>d-O+_3x@4J(Vb1Xtu(ie1qcWc!_j4_Br3Z zUh*wLcTlW?WLdhG?(~*3T6|5nN|bR*9u~VZaY{fN-qb(`G#! zk|YK248JG+`X3VO8`49K&9UfQm8fQ}-mg&?e?Whya#~AQ$?%+eU(1`x8VOcx>o}-J zts8z>&7B9d@>fXcEp?8%rVNt9x(gS~i~MxX4l$swI-WV1AmzQ8XB;oPZQ939Uc@jm zER=x;=uMDiCQh4c*2Z`t20)$9RtDGj(b?7FooO zPVo8VVgX2#FfAjZ(GX`v$m*~XQ(-A%g4_@={1X=H;b4s!az;IPC4$xQ~hnp4C&2Bd}SY0j4Z`{1vB>yx(jo#sE?a<{NQB< zEZj{bd_R0f@+7)NvM1~%6FW9so(H1@@vIhl{cCM`UQcKbX z|FsXDsnFV|Emsat!V{CbH{$Na1PsKMUB7!a6tlz^r!%M;M84++mHsn!S*($sK6?ln z753gi>8vaq@9>i4t&#a$4C09FE%ZeAmR0_(u$2nCrmP5&da8KdPG*De)Sb8ez;Ee~ zmGlLO3aW@=R=?Vkn*XO)F5PD{GDi^EEu9~d_%J3;8*zk%(jvU_6I*Oj;kfv)%h&V} zoL5Q(c;vdg=Fr#r&DaV@u*>MA8|;)19!<%!Nr$x??}N(pFa5qf+P&-lc9&^>et7?0 zNA>Awo%m%L4-SLqsdp+LoQ9V+Z&V#kF=n%{6 zJnqYX+ke0vXb~;MU471$2V}fZGP~18-hk@|=i79&vJdG`iTsk5X2lVs&#NCi7-B;? z-i@rjx_#TLth{F%jV}`^%txioJt}RE&|%DHRe3t9$2M{0%P(FST=+G7;@3gqfPw-LUbkwCn*s}8wcnc zb={#c;5bYuQ8DN)d!b-{zWHN|N&M@+(-8+aFHZgthKuPEo4^Bz@=s3yb+f|K0V)`)@sj;w33bh~^ybZvfwmc0Gi2fAj>V_0DlQB78zcb9omXEP ziN1$YElPDDij9Z{eiEKg>h|f3oH$>_^SBk!USkKG)#(L!G5s@|A{CLYR>&e@+vcl& zp>PdMt#vF~8kw8RENc40%|$o}+qb1ABRW#+?qT15VBsFZic2e3(=cF!)i7yce(0LV?ajtyo~Qm)o-$JJA1oY% zEfTtjhaO`*$aKty00vX}4(@!U-`UkI#)+u|U9z>ThK&tkJL!M6cAjg z{KCLb_;p65zxzyd`X_u^#Hp z))2h!&F8_RpN;I?cFv|VJds|z^v(3aBe$@AMlsTu-3@X9|pHKFk z#+Hew2cPxH{fDrMyJYOt6~aRDM6VQ6e>aSG8if7-Vmd}|Qr81oYyhtn(Hr&G z+EtELf6EBVTvc+vgrYPa;QZ*hMZMsIAaUPEJX~^7eY!t~Lfy=EGU#eoux5#`De|X< zab(DHM34&*uMgqs0o1E=pnsJ=H|iz+HDsyQZ2zoa{^dT`4MN*xJUe-{fzs-ma~2%B z>ct1;`2#PQbFR2M9jPn;L4hHBCWJeZ&TRc}f_JjN*QdWQu@jMd)`lW^fAjkIWtF#y z=MT6iA+%O4s(O2`v?F|I4fiqtXIOZFy~F@BIdXC4T(vHHg2@XDzCu=LtJE#TJI{T5 z_v;%g#^vt-SLB6BzF(zPF`1`i9vwjNPZZ9|_oU7aj{Km&d4oDIaKzREsTr{-4LIgMOs2H1kQQPJ zv!!@|yke~`m29Oc8Gm=0Jq@uv+!*4$x(M{de*gIA!r*e9;Q1hpwUdUBN533mE0yRc znTzFH1BL9U4;NtmshfzGo?y>x3Bc2=*J9su)f_$bTPvnGgh$e7yW-*?p6A@5-#n>Z<^tFE&6Yn z_X!~9H%lyqL5gMn?U_m#hk`8umImw!vDwr{`az z;OeM3u!vq55H~WA#445AOIpqRv)|3b&pPoNSAOWTg-s|w+$CHS{KDFoc7p5YRYkOY zsU9wsq*oIG#(D;AJ;quS5Y+@mI~_u0yz!P4Jk1(W22TM)wqfc?u!245!y`*P(jouf zeDX2>L?hrus0ZOW4#aM8|5)Rqez*RMv4gddI<{7puZCHBR!xXc z?)zEVu>8;&grA@Y>5HsCo61Z#?*V>Wkg1!|<^z&v!Z3Wb0ZN!-S#> z4T>eLfUcc?P+77PY-o=1K2GQynrY0BT{SL{)d0@$6+-x?V0)KTUj#MY{#?{_+jGe= zy3tR5a2fj@MK7Q5N;|`+abV`Uis2arG45zmSX*Kx)N=Z=EQC(Y)%|3@jEq2qBM)_$ z36&A(L*=m}mExxFptw-JfU&PcN?mg{S-v3P1sn&&jqwe?moVwESWB4&J{YZSk_L(- z&_UG*5&L0IF-le`j-_xHKxp{|KaPICE*-<5x2b~DQ6?%ixb4N+esFw|nOK^EOKJ<` za6*sYl@SEO&ie1-z6AEZ+}~;phZqc6`(9stPx-UGnqiXmEmi+k=8HX~$o?Aj(Mo{y zAzR229n|7{W3QUxMtiiwe6O&7382R8cTB5TJ}DWk)1_38{mpn0Q;|Kwvyskj?`bNM z26{X2XoVmL}F7n zIJ0+6VD6qw7m7iWrYG)Gzc}_seHnm@u*gSsI8V8Tg(4b_D<cyuEAj= zW!@bPgnOG!v@TpcRnh0sdCQ6SRH#vg_VVn51q04XsDw&y?+vR{8YKJ==55c znF4rQxB-jvQOKiA@}MYp}r<#J;W36%suH? zUr&Fjy3p6>hkj0-F34Twnx2l5V-bxXL_fyl6Afnj2v_n;V(06FI`ccNaiW4|Z`pNf z`@IDrdMwY;J$Y%4grU&(c1Tz7luLnN?IZMe_a|mXz|wN>`?T}LnM$J@ZJP7FY~&ZF zN*8bpJw7gmX2VV{T1?W_@GdEs_w@#edrhT2pAF$kWnM1NA1v3%R<7g1%$Z8#8cZ%# zoa_9tTaf)7e2%Q$-vjOQ24c?y6cbPvF`prE8K0ekx~^? z?_4zxVC)(4m;3-o^|!Ly@x%18>~9Qo3}o6O#Ni{4ZUj01RP_EH3^HFyFgz3BOW3S>6x@O3+ z++nmzdm#94#JFW=tr;Iz43Re(X?IpAkx8B-$(&n|1|Cdor%|9KWYsM1GavuMtoX4% zepJ;G+_D+^5Mc``KEE-o-N8Dy`587Czj_2f-b63+73qrm7d42t9!!<*#M}Y1e2l?vhLFvny2)={e|pkxREHHA zQShIOXy%ct1tBKa)7;Jda+faJ+cXb64z9tmba zz)lP{hF6^Q=n-;~2rvLjK<9Xo3^Jc6B!mWZK3(hLidgoKF3wN3MDyb|(i12^d|bx~ zD}!Ew0lZYWW$*2|*8vk7wC6Yq;*GpJFe1=~K)bn-DHqXacSa3L;GgLGrltMELmJB? zYo9o<_dhjoSSU|+rg;L4(x(uK1=g0QTvVa^*Fj&f_NXXm8JLg35OlKeZ@x0E;Khn& zv@RwujAxlet0~xBo2+@YUp)Wtt65#Hs6w`w^uG@Cb~+P>3DQ%D&sA$0CaItN@1qEV zW|>O)kT9OS1k2ihj&=x%<)9Tqf`)%9Z;F4ZF~}ry#8qJ#A~-}+IP;md zp$uSg>%snwlWYo3v8-yyE}eOEX|P%b4uWkj0*j179?ghE>^oGRDP7GWwUsb5g+E9^ zgex}t`cPrp7yKSVu_O0h_P?Z-Bt$>F9m}wGb;X@6*B*I#gip8qITP^N-((W<5Ne|I zslHKC)IiPCrkoD>!6h9^4r#TIKF{p|q|TPS$;05~1*3wN0x4Mhjv<25!|#(y{Qj8X z0%rhHPhKb+FUr*N^2bN`jqP&7+n8H%2_(>epKB#s@KzeCihgB97LVg{JXr5=#m5e% zyN@XffG1xU2mHR*?t8nex_ETkhFY|R)NfUEoUe+Mt7|H=C@kO+3PQ5E*0zqe zpDcGCMl1)?%Ui4`^QE#Nq3taF6BB@zMgfF2`1-i-xx;wm`-=$!g}BAs5zKvgi$xzP ztx$ecE6DTvnJVN%2hm6v_xc%z5-*xxY1;Nwb$?XO$8C$Tic(m`r=W*qvz1}q)kf8E zhk!f$PZ~~ITo!pl-fqJe0*)wHx?{F{Tns=UI`~zb=v7|$NBJP-Pl0WMLAxf=`wORBwU zIZLsTJazz%Q~x*PCO`O$HWWPhFii2K&rrMWsEr136C`W)12vhe7kj5ff8Yu~6b&3^ zUQ<^Lq6@kZTf5K)Y`w3KlbUxwo7ZjGZO7|h`FihZQtxQwbEO3K^24S{uql1N@O@Lj z0I}gXc#at^qJZ+3uYyCadN$vGYz=b=ttI_Z8*30Cuuk$O_NB*S(^7YrlR$09-yFxb zK-F;$AGYp*-glH(uOLz@Z?Ve7Ef)ET9}rJhk_Nn%@yc`vpkSdT@gJI~?;s@D{t{(X z0Jd=EiNJ5&Zd?C|AAv+4q#CQXQ(_$N`f}ljM5r(-@3}arDOi3SJi8+#i&O$Q59Cc_ zzvZmM`r8@iL{S>DR-a@SuXWY21|a5VOZhb8U`ZmISRwa(Ak}V8PGzY6pmJlM0z3V< zPSdk-_+<_>x$oE#X73QF;NeAoQp!3amwf`Bq1ukG*zu1#WwkD?63xghL=dDDk4^@b zqff@~kQf2s4gFbd5?NO?)Si(Ol1JXFfd2YcnRDGluDcPQI!NW0naA^A75_wMce<9v0e%elQHajM02?)B-p zZMHN>be(%SwoSwoqC7S%Am}=`TT2=%&AYZ460z&tp>0Nj86WF^U&m__72TkpRFnq2 z4raaC46HW`8JLk(hd?@t2>RK1P2yQ9K|mERwVzOr8gjiGLU61G6`>5CY%JRt^pfs+ zTB#vq!=z7wJcDJp3BluF z_;CgD&cxi=k^=&TEchWo6sh+UI9)(e^Z1_U<9ECL)b2|0<+J(d4xH zXwk!6f227%t6DX%ut+2lNJrs#!$dAP$fwJKz;P^;<7QUH2L>1(*TJLH7RWKMMCa<; z-Dc^XotQwG4o^Sw z7?*Fjo~u896Wf2V8Sm?(NZoCwzVOtOXkN)kf8Q`dPhr)VD?FhL*xzT-dbX^ok2bNZ z8GsxoZ(Yj<78Y%-ZEoI_9mev;D}q2Nn`|>|4NXg(*ldJBykzJdfz>y9D zFtP@L)(}c5?7YpA!EW}4-$nb#C{6KIWDnH0ugnOR96%|>%g^q{Qh6NP#>v`r^~TV2 zf1Mpae3Yy1xDnl_)3vMEzd1 z_+x$?+vNGDw_)ZC296#j=;)+YD~1zEf1nj=Od$*>hp`QVR>xI1KL3)7d2#nntdxmT zig({mVQ2Xs51soh@lNy+CRd)5oOsq0c%AS&KQ;yb_R@xS~VOf?tdjIrJ z06zKI>+uGBtURlk*3J%8Q#YN5qdd9s$6UT)J(u5nJyK~r_v8+QBk%;gtXb1abN6yO zV=>xV+la+trGMp^R|Z_OJW5iZe^h=c*GKE>)-W9l+oQ-;bpda?^Nu-{MqKD}hI94z zWJU2lF68wry(D-k016U`B&MgCMd3b#$9*(yZ1SU79K*!So4ox_5?c?jN1s6U1kv-7 zcr1?d5y_Re-N*~iJPAlLgK4b1h52kV{lOu4BaG+FF~n_lm}uI= z4!MayM+kGwKnTGVx2$K!4<9A>wx5*WAYm&yk`6oc&3FPHG_S-LZbk^nRU2+(`;RtZ z>lUOKtFV+K2r;j$!Z{y|yiHbhpZFk<0YF{$DipVDm-f#ZaLox6c_If4@7In0D z;IUgso!84XH?Ifana3W-f5;dZrcLzim8g!fQXZ%f0>=rGUpvS(zi|`KKe>b4NCwk% zn~c~H?TjF08X*O0D1c}eq*9NX4Jcv3voS5mluj4nH~m*l0+^|vF`IXdUNn@%k zLB~QF8b=THp!a!sf71RjSKfXDT0ldILDEM(WIi^AbOfQd{N(g3-mt}s&+X!(ORhjE zg&y)C?Lmfy1)7#Ay*T{7$=f_{0a&h&Hu7YM5nR1&Z$Tfe9s?E;@9pz9H#g^6+hdrX zNlkT+IYKg?Al}>OKbeBC+~3(kNF76)RL1ez6Bt^!<`$Upf4TS@RY&}EHmG+mPJ7JtG5lyV=!t?lxntUTDDYQ#T~E-V+mKi zN|}miFhZn1L~mytTQ6-@*x21BOH1qHBGfRxIBfPlUN!?x%?YVq_VkMpTpKg*Nm zqsZ}590!&Se|2+oWrCnLz$MpS$1Bh5;-%fYxZsjY@dkVt7bu!@2AzjH8P568?KG*> zWQ%{^m5B2BJj+gtkjZBY`e+uqt|Kq#r=xcXdCRCf3aWWMq()P$ymwh?-+}vj(7Y$7 zCb;JHxbj)m5L%^xX=0?qb$ECe^PS`O!*9O=z&pe$<*`D!RLCY zc`e6+Ib46B)BQT6`{?UF#5K2VVArN6@cati97!T92VcxVYJ%Z`F{F3Alv1V(0cM`4 zDl{o=#gYA4Y}-b*J1C_XN)F>unW{Ot`njM=DJ&TxaGLv&##g?L@j^4EnMQSc3iE;v z&TA&=e^C$nf(Hq8N4V^>*C7O?N5}Cs1yNFQ>GjtZrcfN7+PIlq$|Us*Kb~k53PRiS z7J$|IXyUb{fP%qptP9+VRQ+9t5U(w*I}aF%L`v+}`+waxzps5M9&?0|#PEE%I&UcI zDON*BeF{qz-~O66RB>&ZH&k=m{W}uP8)ErAf2Yy^po8WOap1l^rN2Gq^ipTjq29f$ zcRh2(T&^G90>E}0w8F%>l{X1Gi)raH5lGVZL68#f$HxixEJYJpw~wa)D~jP9#c^yb z!y??$Me?+Fz>+wQLu+R{UNcoOA6L$R#d7gN2x74qN+}Fa6KU&R5DFZD{^1ckeJhzr ze;r}V_a4T{JA^w{6Kzc~p0%)E8etoo+}!6kEVAch+3~|opiL%gf9m#|*!tZ^=xS*v zX=O{c=XX6|xjtH1jZlB@WSiU7N2~q&v9U2Ul>*kXYsLKGO z*v4rr`C_=h0EdCK2kzU$f69B;l1cm;IG5%3oW`LC4j&f-9@F*A6?3@$ zK+G*X-MM-n1249*#d#P<*`$}egZ+k^)M52E;s21^Y#Z%3jPqt;wYdWAoFVkA&X(^! zgz0>%WWVa&lMf20Wr zg`*4lwPCbZdtJvg1Y{>t;0@#3sSrxx0N&9ImZl*!uuO+YG|bkCM{q2Mcsz-> z`2_RWZ>yD(1b?bHZWxl1qfTmdd`DH zU<;e9ZGvutrQv(Yi>`Swl}*OUW2YU^6xae&Z$SyCkdEg1Fl6FBrei@79a)MF0m4iH$?yP^3>Ve{Lw`FF>L2 z1r=+4BUd<&X3a|g{^5uIxA;H5{2yvA<>qVYLR2##z=8YrkU2?N@K_jd`8}tV`at=3 z4~HJ0#B9YafNf0f%g1}L4R@P4LF_l}^~@D>xchGD3uf)>3mtG}M z>3L(o`4C#M4UXz>1WnNGTxwe#K_pWG2Yc9oc@cocb~WDM9P!dIKqPuiH1qu5~%bT?`FjLpIa%s zLCwDq`fT^#^>0~NIDNRH{SP{ByYr3($<8gxbuUyV&O&EY0f-NOepQpS)Wr*-&*lwk zKL=PSeK>DW`*|@4e{a6^miP1_-2Ct(6)lE^vVYs1cc_KRgo*d|0i+kw{z3<#Zd=ZZ z6&H4H)4dY&=YoB^uOd$hBUTuzO?E)5JJIP)xbt&H><9#bOx3=^F+Q56oWt>_khvxl zaKYWLvHZf0ZHHbQItyU=g&o`8Ykjyf`+JKIfA`8&rQ@V>e-NT_RdaDjx!Bkdvhw?y z$5N~lIhps~e_%g1-+GHG20<sjfL$ZnL-!uH0rhs_hq12#6DodI9%d zW#XJn2_3qWG5|2LJxA+xA5dAI;6p#5y}_KPgqnu9)nn z2M&g(IkFOo!6D+keN%$4kXb~mvt!2KD6X(6Ldw}M>PZX^`A?>-Djg7xrLYb6qKcX!m(gPTb=ZW?{K3KXkyX$l(m8~f?}i!*^1 zLdvG+zCJReA_E{!_77SGb$@X zPeM~5%`j(uV-Z5QVjz8Af1BjH9Opk@=lb8dqxAO^4{jv)>ePXuwfCLRo_k*fCWFM|_rZ8g z^LYHe+}POIlmMGANGb97eL2QCX>xcgMnR>3@q-_CKYRAk+0_oXYp68cq3!BsQrjJV z{jJ5EekOSQlJ;xe|4bnSon7q+p$J{zf5Z5>MkE|XdL-ds6daRqFpBgzB?Xyk#9}eV z`@30r=h1@F4QRT+%nCPCy@noK)4KY)amuz?@td8D|6_MueYk4-(yYMmAX(DhN!Du;@t6pq(Y~}BkaWa4K+BW@Fq1dxf7-8x z%f>oQevhj=_v19`#)#{O(1>++O!_4>?2QvF`JZRud0+&zK*?q~>e-J(A~=pyVW)az zG`}ic5qtpG|IQse!A5-hLp9G?aXnHpJQSbS{)xnN_7?(ErXkAT!ijj2MMOAys2_1y zpnEmCJ{zTZ@RuYKim2Je(amnsfA!*&n=rSWDpPZoe@(}UI#)#5N&w)PPeX^a? zPw(T5Pj=OHCXq;BBwCOj=_=ja97T9EyaIYQjnOJ%Q}p0k{M~hR<3wTKT=e0D5D3d5 z5*nd}a~MgF(fMa982rbBbkR<7EJ+6~I5#&VfRPcmMr9XmWbC7i^m+;!e{tPtcZ3=E zhkeB37DCS+69Wn%kha2#254dl+|&ZfA(>3lPMDGO80|zE9v!BGu)7sujNDPi(iTdW zQ>t^-vtMMN#poqF<#U7O%=g5D8{NPwY>S`EnQ$>v=N6}HE}lsCn~nX2Kt%vL3O@Fk zF&tCjm<}y1Er3J!;x0TFf0>vsc#yx;SoXOX*7G`2s1jo?75j*_w<3j2b1;hZ*d+!v zhc9KtnfoyMF9r71btV>zF>d;COoxu{c8nJw*y4u|XX)%}uc-%Tna&j5IHepYFramA zo~D?e=Gg4iae%@y7q^Mr+S-N?8f|Scl(LBin^9QsUm5sZuyBuDf3$aX(Gs21h_g3N z(D`R8;DM2OVL*iiO2^tbLZr#;8jNjGciR$*pp;G6zZ`F9tY$xOCI+mqQ^sI< z(!Bo8E1Y-61uVN{H9%?m`a7?b&QX2NitA}GUceH*0|i&ZoIJw0@*RSfp^A%tKFtyLOvt;Bo!f9d3Oh7!l$2TWLD)~a>} z{&63jf3||52lmsYB51d{164!){dB1yiT)wFXrebhh|p6to1il>V7IbMcE-L^HgW$d z94UK&KJnm2mR+)%*WY=CBhT(5_o_vXNyh6|dAh&krq%8J${X&zZ7^U3#D{KQb>ZnB ziM{arKXeiefBP#(4}po1R`hNg<$ydIK?w(zOc2P8F+S2lbIVBSI2pB2Nk4?MsI&(e zwXjDu_n6{{a&&f))J(RFneBliM1d9IL7dVdt4TDJB^)mAKXN;{56~a|MUz5fG1J%ML7zQ zbX7}p@j?mks`D3p)rP_HPL>I`r)a~$ObiH=f9Bj|jT-;OIk~*ngtQbA2iv3LF~+Cr z#?{b@n=1plCjzNd#rz@)?BM{KrK3a&%j4iBTPlB0Yp!rQ`!g|+|9tmxX<5}yxT~_b z@(6CTuGVO1IT{RDiHbhpZ1mZh-d>3#-MSosa1+mL*~%5yeTLjb8qwN8>dYPxitt-2 zf3UUj3SG7$X6l1gVCoa1hE^|NE8x1Y_ z-sl5XpdtWgrO)>LO^m(Zr75WR#Y@j~f9}UVM$f@RSfYu@MdMui+l3O{|GtUwmpwI0 zbkBx?X6uLMxaA6j5ZE$Ia*?QqARaN_v)Osf8=zY ze|9sTkOymZnk6IWVT`89=)DLbdH%`mXkJNYb2~y0Oc{xr3j@{jL+X-6&F$m@?O<6* zOVQSB5f6+brN(nRb|9ssvo(saJQXj2<6*$!JfUMYV|x0^#2W=2Ev*RQn^8M%J{a(L ze3%OZmNQ>*1hgKC-%mF$*kHg)f7E5bsrqaN&;E1^npell9pSQzKF09MELYyXo~{4B z3E!X~xYx(7A3uhs>*ziYN)6IKs^c-M6-DR3KxKaDK5xkn>5B6B#5 z$LmEn0xM+@I^d-*F^pzcXM`LZ0~VRb@w4 zZGM8@-Mw7)-#$TKS3h3e$0x759wik!%*`zSRX2w8&03?o93?-T0Qs}yTzlJ1B|mmO z@fh|6HWH0b-+VpK?bwbPe{=ZM`s)!waQO|_vm?8S#jkZ@Nk0f@&i1QO%*pgQ?M$3^ zm~|U&1YqZ;pRlN}1KFkFF?=%y;PEiveE2Y11}w5)agNWJ$TRS(BMkiN2m6*bS_4L_<5bWNzg^Sl+%@rHgqm<&=pKjxde+}yqLJ(&JuP4MO zulo#AYAEG!)g3po&Dg}~i&_;6&CEbk{0O+r_Ux0}xajJuxb*t#C@xEQdDkw4Qe3fq zeQAUe95k=a$m(~QcrA!-rDvrPJ{_c^P%1>^(iGR;zM*2ZL_8iRk@3`E`>8k{2AmHc zX3Ky@_AAcu`Onu0e|0ub>Hn>}bpy}s-hnX@C-@`I2GbFAwbANs+@rYQ_q zPoM3j-Mf%}!84CNj%8V3O4EDKgTk$me7(X}5(l^_&HD5s=l_}>ap9h?a{i5H+donv8iqj{v zw?BmeNmqQACp~5Qp@?u-l#%`M(sAX#E61tEfX7qW{kA*rNKIkDdirb@CXQ{BPv;4| zsbl6$q^7aMf7r}bciiX(-eW&QDI0IZU(#n2LXb!%5VBk;W@ZMe_M;f=j^iM7NiLbD zX}=%iT#L(Yx`AgNdmN<{zG$Fi+c9kXZ%D?{?^fkRPM-@Z9d}8QoMT6OIBB8z)Xkys&pwmt$5CIoQe!s#BA3ymM?{>2*8>2 z*)qc^9LFZL+M?@7D`ROd;n%}#%|C+l2$l^m;&6K(dXopKf#bMEOk=H`2;E-_z?m4R z*!-;Je~05(qz5Kg+~3KOWqn+G!!11Zqeoeq=;l!DD7I}AY-@6TwiI6PGTK8Ev#N~T z(c0pUE^0xVb%W3!wKMp&Q7BAq3%eQ1JA`lqpSWfnySM$6i`QMtbKADC`|+P5J(A9r z7=l2d862SV?kMShi8F3_k#+{9Y*J?JqDs@+f5&~9DXR(F8=uyPj^++*e=C~d(0xzK ztnE+7fXgmf&5>s-gK+!9n=1N(#pBL9|$q|B7{OQvVQ;^0fQAEuMT ze>N=4oJC(x4_1?6%YzTow9m(&-j8S(_@ei< zcha-&0~Y7GrueaQ8`+^W-F>Yj!+t_X1wKQgrQN1)Y21~k+O-3v1QP?Jm>GkX#Y^y* z<8><|SKD`Fh(%v&L7>z1C#z7(rW=R8ucq({oh)tzfD10UjOTW5!_1jH{o|kD33)Md z7A;-f2+Lv7-$elF_S4W=^jBxXe>X;uj+c~a&fWe$jiH$tlpVohpso*A-ez%oJHFp@ zSGLc^{uBnWHhC!M8tD@f%-Nte>h32$TLBr17j=TJfEEpoefc zJjMQG0M0?5&GHAy=MRFQB)MdI400cuAlx27DMdD(L0Jm_9-Vl8q$&uef2qx19Q~}} zM|M1oX<8h3H;vE+F}=++8v$}3N^#ZaZYpTQL3%KSZ8%sjMj7|M>#hixWhRX2G2p91 zEG{xo#$q(Ck=Gr9wwI>Dh%kVe&SU3oEXyLB%#eLPL|#9H;ca5%OCz+l+sL3BNPS;@ zo52|wFoEsO!ToU-|J7LxfBnlr?6gTTE>W6Wc|fyln(O&6oF)5gh_^kXc>g>@w9`Th zdFc3~74+Tz4)KgcGg7l=KmgnY?c^9M^$DRyDq7h&%70UhQ<(va{s-!e$&8JSO|f6P zqjT41^OeT>G{7N9Mq~hoY&?gu6t?YPu5swv--^_IB~gt`of@Xae^FQ|^qPK{Sp#fn z>uNmj;=HVJ*awhwPD$Ft1BYosuJVZt&;=np$FzMVkRV{}Eb zDCM1XAFvwbeZrCbWh`=8~jub{A6C@Q__fDW2Zr=+hjD3a0HMeZQ5e`ppdW?KN zhhsW8=G1#59fg#VfqRp)9)*mLjJnrvHGzUoS{NBgkTiX+A9fBklMfT_fRX7j5Z){y zI!Pvz#D_rWf9_mtps98dr5RU4R25Jt&J9+LPgaQl00>M;L_t)aV>)~g7_f-uOWkJZ z*xs_y{b~j*2GU&h*@|;Y#Q?PJ0BMc_63bSE)gtu0FnZJyxoY}hOn^{yw6>zj0LqMD3%5TsTWvU)%RC@}e;+9%(IyYW-l9*B(tR|BX`1xJ z21>uJzBke-uGH`|n|ZkQmMBu_G>3cye!m0j`=hikT0|(Rk;A4nVw3caPwRse8Mk@r z1ZioFV*kekUH65scY2S4CKrmnds%(Ef`+6}V z=c3PMe+w$sy=e+;D@bsaI|3>kLI3aoj#m(Pp$&Cm5|HjFtCglM0}YR$WQgn;6ZQR& zlF@;248MsdZykd+9ChtiXQH@k3fI9x#bg zAv*rvE&QbaRuoOy_<*DL?O~u>W8G~x*Y#m^e_)(^$U)25ocDFNAXIS>#{YY5?ECUQ zghP$&M_U_~H-f2pr||={i^k|au$*W#&ydQ`NgEF4 zf0hd>9W~V_wV22v6R8v_D~0CKYTlcAsGkYbis_Az{Z@kDA9P}VZv-cAF){4H=UIy3 zOz(sC@i96NFNFvU-k+i+W+8n#p1WGeek(zAaR(k_Y+43{sdYDtDDMLnkFT|_9*Pg& zbPPD1{o}<<_Kz3U{@eR|3j4e2+Sip*f5)WHR_xCdGdJYf14vT?(;>54V?yph;b7@O zq|nLH@9L?^0RB|0sL$p)rVBi&81doPk!l!v@-zC8JnbMOLZGF!S!=_=6n(e~)UQf5 zj5-{t?bAT*dsA;UI@D)Cw+}c%k^pUgGsu#!oW&b|u^-c~<7k4=v;LWV=sJwreo3=2om&&*I#Kc6+ebXT^I8?c+ztX)AhEO!0prRCqg0-jizkx>70wbJJ(blgAQPsbaLQbUZKn@d+IZ8%G!@ z-Obh15um`tMmY-q_@q7?N|m_qf8+o22(SL#N5}@_XtoFKXTiHxrqe|8iVDYWnv$akZKj|vr4*waN{!B(w(-78m> z%FtVQIC6gvp%%U1ze4!L?0kqQf&c-@k^6ga^dQa63Z-$v(>Z0| z@KBs?D))OoEa~4iSohk65H(BF7izTlhlk=Pv}kU@{=8Sko~{4Y_I0U=gU77TR>T~1 z+RF9Wyg}_SxSy9_*s<;WzufOute%S=+$?O)WPkI+kBFOZy+ze}Fv}qdZ+kbW)r|Y6 zL%A+PP5Vkru5_4%t(yDmf1IP*ei8MOiuJSYQi|EsHSO$KroId9q{GVVjjs+Z^P{rt_m5b5a&M9(l5zmygO%?TSum57pa$BCzxFQSqr= z(J9wlZ~sh~NuI10`vLTC8=UsLnQ*GelO4};B(ZDPuKDnxfn&twf0tjr&@MEvfH=9< z=Qq&62MiTy4DVG_V4;hlHqgMyf>Hn;&&uAp;IX4H0_ip&y=@;v@~c zZ}7fnz~j|tJKi9??Y7UW)6S}0OJ+9qfySzk4=_#%1}x%O^x2LZUX@NH5;fIu8fai9 zyzd#Xh{bEK4E@G$om=y}pa0_5)w@DR_dGST)XywYT~GATp88^zf6LcSidUw`M(4|g z2HvMQB^Yq=+ABkU@cA3K;mV6k`(A#1Z|U=SXRes?n}7Wwp?L3q9Cr{3Q-sRviKd1| z7#ixUdwfU7BAPl{j@N7hrwC3N2E5_QTS$zI5oF3S|Yss`d<3uNp862E&zVA z?R(sC&0Vbj!sq7Ae{NAT16<~tF8Bb3hWhB}Sj6(Rs~Zg1z^TE2mwxnIwm%3PpV&!a z5_ggp5i)|r9&5GJH;aGmtz^R8*h5;!k*A^M@k6Faw zzCnJn?Rx+f&C?sMyqJf!JTos=%NZ~=G*a5%(Xpt+cIDe5e`2v%g8>^jH5d@!I}iVi zFWmYW0Aei>e)81w#FL|?=4UldGy@ict$JHTg8>_WX&4aZPo?HWtI`0pw?<1r2M|w= z@`YPnb={vl^>c3hlfT7yV@K)pe4)sIv+4f6M)C6QnOI1G(}8dJAFmv zetiWuTyq!Re>E%T&E{PCfW;Be2KzNo#FPL$Q7SbjN|grOdA{?`T)}sK^v|Vz?X6MX z?H#B%?#o~MH;gxS@b`B=z|Wp}X8Svm6Z&vK@=$M+FQ$7a>4F+tW4guWGy1Jx)6;6p#y*z|rb zO@DOHQ|WrCXdPXZf6wO&rpSQBz^i7t>Cj-n1}Yfv{a!A9VVK)xz#`){SgwJ&;FORj ldtWX`D%fwxlYOx9{{gR=(=WH`Kz0BC002ovPDHLkV1icR5TO77 delta 10453 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 Date: Tue, 13 Sep 2016 01:18:50 +0200 Subject: [PATCH 03/46] derp --- code/_onclick/hud/human.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 0fba3a1ea99..5ef4633da63 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -95,7 +95,7 @@ using.icon = ui_style static_inventory += using - talk_wheel_icon = new/obj/screen/talk_wheel //phil235 make it a reference var of hud_used. + talk_wheel_icon = new/obj/screen/talk_wheel talk_wheel_icon.icon = ui_style static_inventory += talk_wheel_icon From 37d1ea6108dc04b05246c54fe0a794cd4baf1adf Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 13 Sep 2016 15:22:41 +0200 Subject: [PATCH 04/46] Make sure talk_wheel_icon var is properly deleted when hud is deleted. Add a hotkey for the talk wheel: H (hotkey mode) and Ctrl+H. Fixes not being able to use the wheel and talk button while stunned. --- code/_onclick/hud/hud.dm | 3 +++ code/_onclick/hud/screen_objects.dm | 4 +++- code/modules/mob/mob_helpers.dm | 11 +++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 8b48baa27ee..b2e89db6d36 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -66,6 +66,9 @@ qdel(module_store_icon) module_store_icon = null + qdel(talk_wheel_icon) + talk_wheel_icon = null + if(static_inventory.len) for(var/thing in static_inventory) qdel(thing) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index a23877c0d71..93c6bbec76f 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -67,7 +67,7 @@ /obj/screen/talk_wheel/Click() if(world.time <= usr.next_move) return - if(usr.incapacitated()) + if(usr.stat) return if(ishuman(usr)) var/mob/living/carbon/human/H = usr @@ -129,6 +129,8 @@ /obj/screen/talk/Click(location, control,params) if(ishuman(usr)) + if(usr.stat) + return var/mob/living/carbon/human/H = usr var/word_spoken = "" var/list/PL = params2list(params) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 37e60e3b93c..089b9565b13 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -464,3 +464,14 @@ It's fairly easy to fix if dealing with single letters but not so much with comp M << "There were no ghosts willing to take control." message_admins("No ghosts were willing to take control of [key_name_admin(M)])") return FALSE + +//toggles the talk wheel +/mob/verb/toggle_talk_wheel() + set name = "talk-wheel" + set hidden = 1 + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + if(H.hud_used && H.hud_used.talk_wheel_icon) + H.hud_used.talk_wheel_icon.Click() + From 15bda310d422124f24b466d14229bf64aba24065 Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 13 Sep 2016 15:26:47 +0200 Subject: [PATCH 05/46] Adding hotkey H and ctrl+H , don't know why there's some many lines changed... --- interface/skin.dmf | 1306 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 1006 insertions(+), 300 deletions(-) diff --git a/interface/skin.dmf b/interface/skin.dmf index 335caf26118..bb1f1be53f7 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,762 +1,1188 @@ macro "default" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=hotkeys mapwindow.map.focus=true input.background-color=#e0e0e0\"" - elem + is-disabled = false + elem name = "CENTER+REP" command = ".center" - elem + is-disabled = false + elem name = "NORTHEAST" command = ".northeast" - elem + is-disabled = false + elem name = "SOUTHEAST" command = ".southeast" - elem + is-disabled = false + elem name = "SOUTHWEST" command = ".southwest" - elem + is-disabled = false + elem name = "NORTHWEST" command = ".northwest" - elem + is-disabled = false + elem name = "CTRL+WEST" command = "westface" - elem + is-disabled = false + elem name = "WEST+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+NORTH" command = "northface" - elem + is-disabled = false + elem name = "NORTH+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+EAST" command = "eastface" - elem + is-disabled = false + elem name = "EAST+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+SOUTH" command = "southface" - elem + is-disabled = false + elem name = "SOUTH+REP" command = ".movedown" - elem + is-disabled = false + elem name = "INSERT" command = "a-intent right" - elem + is-disabled = false + elem name = "DELETE" command = "delete-key-pressed" - elem + is-disabled = false + elem name = "CTRL+1" command = "a-intent help" - elem + is-disabled = false + elem name = "CTRL+2" command = "a-intent disarm" - elem + is-disabled = false + elem name = "CTRL+3" command = "a-intent grab" - elem + is-disabled = false + elem name = "CTRL+4" command = "a-intent harm" - elem + is-disabled = false + elem name = "CTRL+A+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+B" command = "resist" - elem + is-disabled = false + elem name = "CTRL+D+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+E" command = "quick-equip" - elem + is-disabled = false + elem name = "CTRL+F" command = "a-intent left" - elem + is-disabled = false + elem name = "CTRL+G" command = "a-intent right" - elem - name = "CTRL+Q" - command = ".northwest" - elem - name = "CTRL+R" - command = ".southwest" - elem - name = "CTRL+S+REP" - command = ".movedown" - elem - name = "CTRL+W+REP" - command = ".moveup" - elem - name = "CTRL+X" - command = ".northeast" - elem - name = "CTRL+Y" - command = "Activate-Held-Object" - elem - name = "CTRL+Z" - command = "Activate-Held-Object" - elem - name = "F1" - command = "adminhelp" - elem - name = "CTRL+SHIFT+F1+REP" - command = ".options" - elem - name = "F2+REP" - command = ".screenshot auto" - elem - name = "SHIFT+F2+REP" - command = ".screenshot" - elem - name = "F5" - command = "Aghost" - elem + is-disabled = false + elem + name = "CTRL+H" + command = "talk-wheel" + is-disabled = false + elem name = "CTRL+O" command = "ooc" - elem + is-disabled = false + elem + name = "CTRL+Q" + command = ".northwest" + is-disabled = false + elem + name = "CTRL+R" + command = ".southwest" + is-disabled = false + elem + name = "CTRL+S+REP" + command = ".movedown" + is-disabled = false + elem + name = "CTRL+W+REP" + command = ".moveup" + is-disabled = false + elem + name = "CTRL+X" + command = ".northeast" + is-disabled = false + elem + name = "CTRL+Y" + command = "Activate-Held-Object" + is-disabled = false + elem + name = "CTRL+Z" + command = "Activate-Held-Object" + is-disabled = false + elem + name = "F1" + command = "adminhelp" + is-disabled = false + elem + name = "CTRL+SHIFT+F1+REP" + command = ".options" + is-disabled = false + elem + name = "F2+REP" + command = ".screenshot auto" + is-disabled = false + elem + name = "SHIFT+F2+REP" + command = ".screenshot" + is-disabled = false + elem + name = "F5" + command = "Aghost" + is-disabled = false + elem name = "F6" command = "Player-Panel" - elem + is-disabled = false + elem name = "F7" command = "Admin-PM" - elem + is-disabled = false + elem name = "F8" command = "Invisimin" - elem + is-disabled = false + elem name = "F12" command = "F12" + is-disabled = false macro "hotkeys" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=default input.focus=true input.background-color=#d3b5b5\"" - elem + is-disabled = false + elem name = "CENTER+REP" command = ".center" - elem + is-disabled = false + elem name = "NORTHEAST" command = ".northeast" - elem + is-disabled = false + elem name = "SOUTHEAST" command = ".southeast" - elem + is-disabled = false + elem name = "SOUTHWEST" command = ".southwest" - elem + is-disabled = false + elem name = "NORTHWEST" command = ".northwest" - elem + is-disabled = false + elem name = "CTRL+WEST" command = "westface" - elem + is-disabled = false + elem name = "WEST+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+NORTH" command = "northface" - elem + is-disabled = false + elem name = "NORTH+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+EAST" command = "eastface" - elem + is-disabled = false + elem name = "EAST+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+SOUTH" command = "southface" - elem + is-disabled = false + elem name = "SOUTH+REP" command = ".movedown" - elem + is-disabled = false + elem name = "INSERT" command = "a-intent right" - elem + is-disabled = false + elem name = "DELETE" command = "delete-key-pressed" - elem + is-disabled = false + elem name = "1" command = "a-intent help" - elem + is-disabled = false + elem name = "CTRL+1" command = "a-intent help" - elem + is-disabled = false + elem name = "2" command = "a-intent disarm" - elem + is-disabled = false + elem name = "CTRL+2" command = "a-intent disarm" - elem + is-disabled = false + elem name = "3" command = "a-intent grab" - elem + is-disabled = false + elem name = "CTRL+3" command = "a-intent grab" - elem + is-disabled = false + elem name = "4" command = "a-intent harm" - elem + is-disabled = false + elem name = "CTRL+4" command = "a-intent harm" - elem + is-disabled = false + elem name = "A+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+A+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "B" command = "resist" - elem + is-disabled = false + elem name = "CTRL+B" command = "resist" - elem + is-disabled = false + elem name = "D+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+D+REP" command = ".moveright" - elem + is-disabled = false + elem name = "E" command = "quick-equip" - elem + is-disabled = false + elem name = "CTRL+E" command = "quick-equip" - elem + is-disabled = false + elem name = "F" command = "a-intent left" - elem + is-disabled = false + elem name = "CTRL+F" command = "a-intent left" - elem + is-disabled = false + elem name = "G" command = "a-intent right" - elem + is-disabled = false + elem name = "CTRL+G" command = "a-intent right" - elem + is-disabled = false + elem + name = "H" + command = "talk-wheel" + is-disabled = false + elem + name = "CTRL+H" + command = "talk-wheel" + is-disabled = false + elem name = "M" command = "me" - elem + is-disabled = false + elem name = "O" command = "ooc" - elem + is-disabled = false + elem name = "CTRL+O" command = "ooc" - elem + is-disabled = false + elem name = "Q" command = ".northwest" - elem + is-disabled = false + elem name = "CTRL+Q" command = ".northwest" - elem + is-disabled = false + elem name = "R" command = ".southwest" - elem + is-disabled = false + elem name = "CTRL+R" command = ".southwest" + is-disabled = false elem "s_key" name = "S+REP" command = ".movedown" - elem + is-disabled = false + elem name = "CTRL+S+REP" command = ".movedown" - elem + is-disabled = false + elem name = "T" command = "say" + is-disabled = false elem "w_key" name = "W+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+W+REP" command = ".moveup" - elem + is-disabled = false + elem name = "X" command = ".northeast" - elem + is-disabled = false + elem name = "CTRL+X" command = ".northeast" - elem + is-disabled = false + elem name = "Y" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "CTRL+Y" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "Z" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "CTRL+Z" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "F1" command = "adminhelp" - elem + is-disabled = false + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - elem + is-disabled = false + elem name = "F2+REP" command = ".screenshot auto" - elem + is-disabled = false + elem name = "SHIFT+F2+REP" command = ".screenshot" - elem + is-disabled = false + elem name = "F5" command = "Aghost" - elem + is-disabled = false + elem name = "F6" command = "Player-Panel" - elem + is-disabled = false + elem name = "F7" command = "Admin-PM" - elem + is-disabled = false + elem name = "F8" command = "Invisimin" - elem + is-disabled = false + elem name = "F12" command = "F12" - + is-disabled = false macro "robot-default" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=robot-hotkeys mapwindow.map.focus=true input.background-color=#e0e0e0\"" - elem + is-disabled = false + elem name = "CENTER+REP" command = ".center" - elem + is-disabled = false + elem name = "NORTHEAST" command = ".northeast" - elem + is-disabled = false + elem name = "SOUTHEAST" command = ".southeast" - elem + is-disabled = false + elem name = "NORTHWEST" command = "unequip-module" - elem + is-disabled = false + elem name = "CTRL+WEST" command = "westface" - elem + is-disabled = false + elem name = "WEST+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+NORTH" command = "northface" - elem + is-disabled = false + elem name = "NORTH+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+EAST" command = "eastface" - elem + is-disabled = false + elem name = "EAST+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+SOUTH" command = "southface" - elem + is-disabled = false + elem name = "SOUTH+REP" command = ".movedown" - elem + is-disabled = false + elem name = "INSERT" command = "a-intent right" - elem + is-disabled = false + elem name = "DELETE" command = "delete-key-pressed" - elem + is-disabled = false + elem name = "CTRL+1" command = "toggle-module 1" - elem + is-disabled = false + elem name = "CTRL+2" command = "toggle-module 2" - elem + is-disabled = false + elem name = "CTRL+3" command = "toggle-module 3" - elem + is-disabled = false + elem name = "CTRL+4" command = "a-intent left" - elem + is-disabled = false + elem name = "CTRL+A+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+B" command = "resist" - elem + is-disabled = false + elem name = "CTRL+O" command = "ooc" - elem + is-disabled = false + elem name = "CTRL+D+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+F" command = "a-intent left" - elem + is-disabled = false + elem name = "CTRL+G" command = "a-intent right" - elem + is-disabled = false + elem name = "CTRL+Q" command = "unequip-module" - elem + is-disabled = false + elem name = "CTRL+S+REP" command = ".movedown" - elem + is-disabled = false + elem name = "CTRL+W+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+X" command = ".northeast" - elem + is-disabled = false + elem name = "CTRL+Y" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "CTRL+Z" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "F1" command = "adminhelp" - elem + is-disabled = false + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - elem + is-disabled = false + elem name = "F2+REP" command = ".screenshot auto" - elem + is-disabled = false + elem name = "SHIFT+F2+REP" command = ".screenshot" - elem + is-disabled = false + elem name = "F5" command = "Aghost" - elem + is-disabled = false + elem name = "F6" command = "Player-Panel" - elem + is-disabled = false + elem name = "F7" command = "Admin-PM" - elem + is-disabled = false + elem name = "F8" command = "Invisimin" - elem + is-disabled = false + elem name = "F12" command = "F12" + is-disabled = false macro "robot-hotkeys" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=robot-default input.focus=true input.background-color=#d3b5b5\"" - elem + is-disabled = false + elem name = "CENTER+REP" command = ".center" - elem + is-disabled = false + elem name = "NORTHEAST" command = ".northeast" - elem + is-disabled = false + elem name = "SOUTHEAST" command = ".southeast" - elem + is-disabled = false + elem name = "NORTHWEST" command = "unequip-module" - elem + is-disabled = false + elem name = "CTRL+WEST" command = "westface" - elem + is-disabled = false + elem name = "WEST+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+NORTH" command = "northface" - elem + is-disabled = false + elem name = "NORTH+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+EAST" command = "eastface" - elem + is-disabled = false + elem name = "EAST+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+SOUTH" command = "southface" - elem + is-disabled = false + elem name = "SOUTH+REP" command = ".movedown" - elem + is-disabled = false + elem name = "INSERT" command = "a-intent right" - elem + is-disabled = false + elem name = "DELETE" command = "delete-key-pressed" - elem + is-disabled = false + elem name = "1" command = "toggle-module 1" - elem + is-disabled = false + elem name = "CTRL+1" command = "toggle-module 1" - elem + is-disabled = false + elem name = "2" command = "toggle-module 2" - elem + is-disabled = false + elem name = "CTRL+2" command = "toggle-module 2" - elem + is-disabled = false + elem name = "3" command = "toggle-module 3" - elem + is-disabled = false + elem name = "CTRL+3" command = "toggle-module 3" - elem + is-disabled = false + elem name = "4" command = "a-intent left" - elem + is-disabled = false + elem name = "CTRL+4" command = "a-intent left" - elem + is-disabled = false + elem name = "A+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "CTRL+A+REP" command = ".moveleft" - elem + is-disabled = false + elem name = "B" command = "resist" - elem + is-disabled = false + elem name = "CTRL+B" command = "resist" - elem + is-disabled = false + elem name = "O" command = "ooc" - elem + is-disabled = false + elem name = "CTRL+O" command = "ooc" - elem + is-disabled = false + elem name = "D+REP" command = ".moveright" - elem + is-disabled = false + elem name = "CTRL+D+REP" command = ".moveright" - elem + is-disabled = false + elem name = "F" command = "a-intent left" - elem + is-disabled = false + elem name = "CTRL+F" command = "a-intent left" - elem + is-disabled = false + elem name = "G" command = "a-intent right" - elem + is-disabled = false + elem name = "CTRL+G" command = "a-intent right" - elem + is-disabled = false + elem name = "Q" command = "unequip-module" - elem + is-disabled = false + elem name = "CTRL+Q" command = "unequip-module" + is-disabled = false elem "s_key" name = "S+REP" command = ".movedown" - elem + is-disabled = false + elem name = "CTRL+S+REP" command = ".movedown" - elem + is-disabled = false + elem name = "T" command = "say" + is-disabled = false elem "w_key" name = "W+REP" command = ".moveup" - elem + is-disabled = false + elem name = "CTRL+W+REP" command = ".moveup" - elem + is-disabled = false + elem name = "X" command = ".northeast" - elem + is-disabled = false + elem name = "CTRL+X" command = ".northeast" - elem + is-disabled = false + elem name = "Y" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "CTRL+Y" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "Z" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "CTRL+Z" command = "Activate-Held-Object" - elem + is-disabled = false + elem name = "F1" command = "adminhelp" - elem + is-disabled = false + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - elem + is-disabled = false + elem name = "F2+REP" command = ".screenshot auto" - elem + is-disabled = false + elem name = "SHIFT+F2+REP" command = ".screenshot" - elem + is-disabled = false + elem name = "F5" command = "Aghost" - elem + is-disabled = false + elem name = "F6" command = "Player-Panel" - elem + is-disabled = false + elem name = "F7" command = "Admin-PM" - elem + is-disabled = false + elem name = "F8" command = "Invisimin" - elem + is-disabled = false + elem name = "F12" command = "F12" + is-disabled = false menu "menu" - elem + elem name = "&File" - elem + command = "" + category = "" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem name = "&Quick screenshot\tF2" - category = "&File" command = ".screenshot auto" - elem + category = "&File" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem name = "&Save screenshot as...\tShift+F2" - category = "&File" command = ".screenshot" - elem - name = "" category = "&File" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem + name = "" + command = "" + category = "&File" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" elem "reconnectbutton" name = "&Reconnect" - category = "&File" command = ".reconnect" - elem - name = "&Quit\tAlt-F4" category = "&File" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem + name = "&Quit\tAlt-F4" command = ".quit" - elem + category = "&File" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem name = "&Icons" + command = "" + category = "" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" elem "auto" name = "&Auto (stretch-to-fit)" - category = "&Icons" - group = "size" command = ".winset \"mapwindow.map.icon-size=0\"" - can-check = true - is-checked = true - saved-params = "is-checked" - elem "icon96" - name = "&96x96 (3x)" category = "&Icons" - group = "size" - command = ".winset \"mapwindow.map.icon-size=96\"" + is-checked = true can-check = true + group = "size" + is-disabled = false + saved-params = "is-checked" + elem "icon96" + name = "&96x96 (3x)" + command = ".winset \"mapwindow.map.icon-size=96\"" + category = "&Icons" is-checked = false + can-check = true + group = "size" + is-disabled = false saved-params = "is-checked" elem "icon64" name = "&64x64 (2x)" - category = "&Icons" - group = "size" command = ".winset \"mapwindow.map.icon-size=64\"" - can-check = true + category = "&Icons" is-checked = false + can-check = true + group = "size" + is-disabled = false saved-params = "is-checked" elem "icon48" name = "&48x48 (1.5x)" - category = "&Icons" - group = "size" command = ".winset \"mapwindow.map.icon-size=48\"" - can-check = true + category = "&Icons" is-checked = false + can-check = true + group = "size" + is-disabled = false saved-params = "is-checked" elem "icon32" name = "&32x32" - category = "&Icons" - group = "size" command = ".winset \"mapwindow.map.icon-size=32\"" - can-check = true + category = "&Icons" is-checked = false + can-check = true + group = "size" + is-disabled = false saved-params = "is-checked" - elem + elem name = "&Help" - elem + command = "" + category = "" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem name = "&Admin Help\tF1" - category = "&Help" command = "adminhelp" - elem - name = "&Hotkeys" category = "&Help" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" + elem + name = "&Hotkeys" command = "hotkeys-help" + category = "&Help" + is-checked = false + can-check = false + group = "" + is-disabled = false + saved-params = "is-checked" window "mainwindow" elem "mainwindow" type = MAIN + pos = 0,0 size = 640x440 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false is-default = true - icon = 'icons\\ss13_64.png' - menu = "menu" - macro = "macro" + border = none + drop-zone = false + right-click = false saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "" + titlebar = true + statusbar = true + can-close = true + can-minimize = true + can-resize = true + is-pane = false + is-minimized = false + is-maximized = false + can-scroll = none + icon = 'icons\\ss13_64.png' + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "macro" + menu = "menu" + on-close = "" elem "split" type = CHILD pos = 3,0 size = 634x417 anchor1 = 0,0 anchor2 = 100,100 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "splitter" + on-size = "" + left = "mapwindow" + right = "infowindow" is-vert = true splitter = 50 show-splitter = true - left = "mapwindow" - right = "infowindow" - saved-params = "splitter" + lock = none elem "input" type = INPUT pos = 5,420 size = 595x20 anchor1 = 0,100 anchor2 = 100,100 - is-default = true font-family = "" font-size = 10 font-style = "" text-color = #000000 background-color = #d3b5b5 + is-visible = true + is-disabled = false + is-transparent = false + is-default = true + border = none + drop-zone = false + right-click = false saved-params = "command" + on-size = "" + command = "" + multi-line = false + is-password = false + no-command = false elem "say" type = BUTTON - button-type = pushbox pos = 600,420 size = 37x20 anchor1 = 100,100 anchor2 = none - is-flat = true - text = "Chat" - command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" - is-checked = false + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false saved-params = "is-checked" + on-size = "" + text = "Chat" + image = "" + command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" + is-flat = true + stretch = false + is-checked = false + group = "" + button-type = pushbox elem "asset_cache_browser" type = BROWSER + pos = 0,0 + size = 200x200 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none is-visible = false + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "" + on-size = "" + show-history = false + show-url = false + auto-format = true + use-title = false + on-show = "" + on-hide = "" elem "tooltip" type = BROWSER pos = 0,0 size = 999x999 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none is-visible = false - + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "" + on-size = "" + show-history = false + show-url = false + auto-format = true + use-title = false + on-show = "" + on-hide = "" window "mapwindow" elem "mapwindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "" + titlebar = true + statusbar = true + can-close = true + can-minimize = true + can-resize = true + is-pane = true + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "" + on-close = "" elem "map" type = MAP - is-default = true + pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 @@ -765,91 +1191,301 @@ window "mapwindow" font-style = "" text-color = none background-color = none - icon-size = 0 + is-visible = true + is-disabled = false + is-transparent = false + is-default = true + border = none + drop-zone = true + right-click = false saved-params = "icon-size" - + on-size = "" + icon-size = 0 + text-mode = false + letterbox = true + zoom = 0 + on-show = "" + on-hide = "" + style = "" window "infowindow" elem "infowindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "" + titlebar = true + statusbar = true + can-close = true + can-minimize = true + can-resize = true + is-pane = true + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "" + on-close = "" elem "info" type = CHILD pos = 0,30 size = 640x445 anchor1 = 0,0 anchor2 = 100,100 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "splitter" + on-size = "" + left = "statwindow" + right = "outputwindow" is-vert = false splitter = 50 show-splitter = true - left = "statwindow" - right = "outputwindow" - saved-params = "splitter" - elem "changelog" + lock = none + elem "changelog" type = BUTTON - button-type = pushbutton pos = 16,5 size = 104x20 anchor1 = 3,0 anchor2 = 19,0 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" text = "Changelog" + image = "" command = "changelog" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton elem "rules" type = BUTTON - button-type = pushbutton pos = 120,5 size = 100x20 anchor1 = 19,0 anchor2 = 34,0 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" text = "Rules" + image = "" command = "rules" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton elem "wiki" type = BUTTON - button-type = pushbutton pos = 220,5 size = 100x20 anchor1 = 34,0 anchor2 = 50,0 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" text = "Wiki" + image = "" command = "wiki" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton elem "forum" type = BUTTON - button-type = pushbutton pos = 320,5 size = 100x20 anchor1 = 50,0 anchor2 = 66,0 + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" text = "Forum" + image = "" command = "forum" - elem "github" - type = BUTTON - button-type = pushbutton + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "github" + type = BUTTON pos = 420,5 size = 100x20 anchor1 = 66,0 anchor2 = 81,0 - text = "Github" - command = "github" - elem "report-issue" - type = BUTTON - button-type = pushbutton + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Github" + image = "" + command = "github" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton + elem "report-issue" + type = BUTTON pos = 520,5 size = 100x20 anchor1 = 81,0 anchor2 = 97,0 - text = "Report Issue" - command = "report-issue" - + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false + saved-params = "is-checked" + on-size = "" + text = "Report Issue" + image = "" + command = "report-issue" + is-flat = false + stretch = false + is-checked = false + group = "" + button-type = pushbutton window "outputwindow" elem "outputwindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "" + titlebar = true + statusbar = true + can-close = true + can-minimize = true + can-resize = true + is-pane = true + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "" + on-close = "" elem "output" type = OUTPUT - is-default = true + pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 @@ -858,16 +1494,65 @@ window "outputwindow" font-style = "" text-color = #000000 background-color = #ffffff - + is-visible = true + is-disabled = false + is-transparent = false + is-default = true + border = none + drop-zone = false + right-click = false + saved-params = "max-lines" + on-size = "" + link-color = #0000ff + visited-color = #ff00ff + style = "" + enable-http-images = false + max-lines = 1000 + image = "" window "statwindow" elem "statwindow" type = MAIN - is-pane = true + pos = 0,0 + size = 640x480 + anchor1 = none + anchor2 = none + font-family = "" + font-size = 0 + font-style = "" + text-color = #000000 + background-color = none + is-visible = true + is-disabled = false + is-transparent = false + is-default = false + border = none + drop-zone = false + right-click = false saved-params = "pos;size;is-minimized;is-maximized" + on-size = "" + title = "" + titlebar = true + statusbar = true + can-close = true + can-minimize = true + can-resize = true + is-pane = true + is-minimized = false + is-maximized = false + can-scroll = none + icon = "" + image = "" + image-mode = stretch + keep-aspect = false + transparent-color = none + alpha = 255 + macro = "" + menu = "" + on-close = "" elem "stat" type = INFO - is-default = true + pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 @@ -876,5 +1561,26 @@ window "statwindow" font-style = "" text-color = #000000 background-color = #ffffff + is-visible = true + is-disabled = false + is-transparent = false + is-default = true + border = none + drop-zone = true + right-click = false + saved-params = "" + on-size = "" + highlight-color = #00ff00 + tab-text-color = #000000 + tab-background-color = none + tab-font-family = "" + tab-font-size = 0 + tab-font-style = "" allow-html = true multi-line = true + on-show = "" + on-hide = "" + on-tab = "" + prefix-color = none + suffix-color = none + From 1cadec44bf5aac8b1986c6ffd6544e1f6b80578c Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 13 Sep 2016 19:30:14 +0200 Subject: [PATCH 06/46] Trying to fix skin.dmf back to normal. --- interface/skin.dmf | 1249 ++++++++++---------------------------------- 1 file changed, 276 insertions(+), 973 deletions(-) diff --git a/interface/skin.dmf b/interface/skin.dmf index bb1f1be53f7..27dca90bcc8 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,1188 +1,771 @@ macro "default" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=hotkeys mapwindow.map.focus=true input.background-color=#e0e0e0\"" - is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" - is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" - is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" - is-disabled = false - elem + elem name = "SOUTHWEST" command = ".southwest" - is-disabled = false - elem + elem name = "NORTHWEST" command = ".northwest" - is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" - is-disabled = false - elem + elem name = "WEST+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" - is-disabled = false - elem + elem name = "NORTH+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" - is-disabled = false - elem + elem name = "EAST+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" - is-disabled = false - elem + elem name = "SOUTH+REP" command = ".movedown" - is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" - is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" - is-disabled = false - elem + elem name = "CTRL+1" command = "a-intent help" - is-disabled = false - elem + elem name = "CTRL+2" command = "a-intent disarm" - is-disabled = false - elem + elem name = "CTRL+3" command = "a-intent grab" - is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent harm" - is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+B" command = "resist" - is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+E" command = "quick-equip" - is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" - is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" - is-disabled = false - elem + elem name = "CTRL+H" command = "talk-wheel" - is-disabled = false - elem - name = "CTRL+O" - command = "ooc" - is-disabled = false - elem + elem name = "CTRL+Q" command = ".northwest" - is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" - is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".movedown" - is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" - is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "F1" command = "adminhelp" - is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" - is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" - is-disabled = false - elem + elem name = "F5" command = "Aghost" - is-disabled = false - elem + elem + name = "CTRL+O" + command = "ooc" + elem name = "F6" command = "Player-Panel" - is-disabled = false - elem + elem name = "F7" command = "Admin-PM" - is-disabled = false - elem + elem name = "F8" command = "Invisimin" - is-disabled = false - elem + elem name = "F12" command = "F12" - is-disabled = false macro "hotkeys" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=default input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" - is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" - is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" - is-disabled = false - elem + elem name = "SOUTHWEST" command = ".southwest" - is-disabled = false - elem + elem name = "NORTHWEST" command = ".northwest" - is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" - is-disabled = false - elem + elem name = "WEST+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" - is-disabled = false - elem + elem name = "NORTH+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" - is-disabled = false - elem + elem name = "EAST+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" - is-disabled = false - elem + elem name = "SOUTH+REP" command = ".movedown" - is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" - is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" - is-disabled = false - elem + elem name = "1" command = "a-intent help" - is-disabled = false - elem + elem name = "CTRL+1" command = "a-intent help" - is-disabled = false - elem + elem name = "2" command = "a-intent disarm" - is-disabled = false - elem + elem name = "CTRL+2" command = "a-intent disarm" - is-disabled = false - elem + elem name = "3" command = "a-intent grab" - is-disabled = false - elem + elem name = "CTRL+3" command = "a-intent grab" - is-disabled = false - elem + elem name = "4" command = "a-intent harm" - is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent harm" - is-disabled = false - elem + elem name = "A+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "B" command = "resist" - is-disabled = false - elem + elem name = "CTRL+B" command = "resist" - is-disabled = false - elem + elem name = "D+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".moveright" - is-disabled = false - elem + elem name = "E" command = "quick-equip" - is-disabled = false - elem + elem name = "CTRL+E" command = "quick-equip" - is-disabled = false - elem + elem name = "F" command = "a-intent left" - is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" - is-disabled = false - elem + elem name = "G" command = "a-intent right" - is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" - is-disabled = false - elem + elem name = "H" command = "talk-wheel" - is-disabled = false - elem + elem name = "CTRL+H" command = "talk-wheel" - is-disabled = false - elem + elem name = "M" command = "me" - is-disabled = false - elem + elem name = "O" command = "ooc" - is-disabled = false - elem + elem name = "CTRL+O" command = "ooc" - is-disabled = false - elem + elem name = "Q" command = ".northwest" - is-disabled = false - elem + elem name = "CTRL+Q" command = ".northwest" - is-disabled = false - elem + elem name = "R" command = ".southwest" - is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" - is-disabled = false elem "s_key" name = "S+REP" command = ".movedown" - is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".movedown" - is-disabled = false - elem + elem name = "T" command = "say" - is-disabled = false elem "w_key" name = "W+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".moveup" - is-disabled = false - elem + elem name = "X" command = ".northeast" - is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" - is-disabled = false - elem + elem name = "Y" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "Z" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "F1" command = "adminhelp" - is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" - is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" - is-disabled = false - elem + elem name = "F5" command = "Aghost" - is-disabled = false - elem + elem name = "F6" command = "Player-Panel" - is-disabled = false - elem + elem name = "F7" command = "Admin-PM" - is-disabled = false - elem + elem name = "F8" command = "Invisimin" - is-disabled = false - elem + elem name = "F12" command = "F12" - is-disabled = false + macro "robot-default" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=robot-hotkeys mapwindow.map.focus=true input.background-color=#e0e0e0\"" - is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" - is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" - is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" - is-disabled = false - elem + elem name = "NORTHWEST" command = "unequip-module" - is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" - is-disabled = false - elem + elem name = "WEST+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" - is-disabled = false - elem + elem name = "NORTH+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" - is-disabled = false - elem + elem name = "EAST+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" - is-disabled = false - elem + elem name = "SOUTH+REP" command = ".movedown" - is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" - is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" - is-disabled = false - elem + elem name = "CTRL+1" command = "toggle-module 1" - is-disabled = false - elem + elem name = "CTRL+2" command = "toggle-module 2" - is-disabled = false - elem + elem name = "CTRL+3" command = "toggle-module 3" - is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent left" - is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+B" command = "resist" - is-disabled = false - elem + elem name = "CTRL+O" command = "ooc" - is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" - is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" - is-disabled = false - elem + elem name = "CTRL+Q" command = "unequip-module" - is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".movedown" - is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" - is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "F1" command = "adminhelp" - is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" - is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" - is-disabled = false - elem + elem name = "F5" command = "Aghost" - is-disabled = false - elem + elem name = "F6" command = "Player-Panel" - is-disabled = false - elem + elem name = "F7" command = "Admin-PM" - is-disabled = false - elem + elem name = "F8" command = "Invisimin" - is-disabled = false - elem + elem name = "F12" command = "F12" - is-disabled = false macro "robot-hotkeys" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=robot-default input.focus=true input.background-color=#d3b5b5\"" - is-disabled = false - elem + elem name = "CENTER+REP" command = ".center" - is-disabled = false - elem + elem name = "NORTHEAST" command = ".northeast" - is-disabled = false - elem + elem name = "SOUTHEAST" command = ".southeast" - is-disabled = false - elem + elem name = "NORTHWEST" command = "unequip-module" - is-disabled = false - elem + elem name = "CTRL+WEST" command = "westface" - is-disabled = false - elem + elem name = "WEST+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+NORTH" command = "northface" - is-disabled = false - elem + elem name = "NORTH+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+EAST" command = "eastface" - is-disabled = false - elem + elem name = "EAST+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+SOUTH" command = "southface" - is-disabled = false - elem + elem name = "SOUTH+REP" command = ".movedown" - is-disabled = false - elem + elem name = "INSERT" command = "a-intent right" - is-disabled = false - elem + elem name = "DELETE" command = "delete-key-pressed" - is-disabled = false - elem + elem name = "1" command = "toggle-module 1" - is-disabled = false - elem + elem name = "CTRL+1" command = "toggle-module 1" - is-disabled = false - elem + elem name = "2" command = "toggle-module 2" - is-disabled = false - elem + elem name = "CTRL+2" command = "toggle-module 2" - is-disabled = false - elem + elem name = "3" command = "toggle-module 3" - is-disabled = false - elem + elem name = "CTRL+3" command = "toggle-module 3" - is-disabled = false - elem + elem name = "4" command = "a-intent left" - is-disabled = false - elem + elem name = "CTRL+4" command = "a-intent left" - is-disabled = false - elem + elem name = "A+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "CTRL+A+REP" command = ".moveleft" - is-disabled = false - elem + elem name = "B" command = "resist" - is-disabled = false - elem + elem name = "CTRL+B" command = "resist" - is-disabled = false - elem + elem name = "O" command = "ooc" - is-disabled = false - elem + elem name = "CTRL+O" command = "ooc" - is-disabled = false - elem + elem name = "D+REP" command = ".moveright" - is-disabled = false - elem + elem name = "CTRL+D+REP" command = ".moveright" - is-disabled = false - elem + elem name = "F" command = "a-intent left" - is-disabled = false - elem + elem name = "CTRL+F" command = "a-intent left" - is-disabled = false - elem + elem name = "G" command = "a-intent right" - is-disabled = false - elem + elem name = "CTRL+G" command = "a-intent right" - is-disabled = false - elem + elem name = "Q" command = "unequip-module" - is-disabled = false - elem + elem name = "CTRL+Q" command = "unequip-module" - is-disabled = false elem "s_key" name = "S+REP" command = ".movedown" - is-disabled = false - elem + elem name = "CTRL+S+REP" command = ".movedown" - is-disabled = false - elem + elem name = "T" command = "say" - is-disabled = false elem "w_key" name = "W+REP" command = ".moveup" - is-disabled = false - elem + elem name = "CTRL+W+REP" command = ".moveup" - is-disabled = false - elem + elem name = "X" command = ".northeast" - is-disabled = false - elem + elem name = "CTRL+X" command = ".northeast" - is-disabled = false - elem + elem name = "Y" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "CTRL+Y" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "Z" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "CTRL+Z" command = "Activate-Held-Object" - is-disabled = false - elem + elem name = "F1" command = "adminhelp" - is-disabled = false - elem + elem name = "CTRL+SHIFT+F1+REP" command = ".options" - is-disabled = false - elem + elem name = "F2+REP" command = ".screenshot auto" - is-disabled = false - elem + elem name = "SHIFT+F2+REP" command = ".screenshot" - is-disabled = false - elem + elem name = "F5" command = "Aghost" - is-disabled = false - elem + elem name = "F6" command = "Player-Panel" - is-disabled = false - elem + elem name = "F7" command = "Admin-PM" - is-disabled = false - elem + elem name = "F8" command = "Invisimin" - is-disabled = false - elem + elem name = "F12" command = "F12" - is-disabled = false menu "menu" - elem + elem name = "&File" - command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + elem name = "&Quick screenshot\tF2" + category = "&File" command = ".screenshot auto" - category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + elem name = "&Save screenshot as...\tShift+F2" + category = "&File" command = ".screenshot" - category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + elem name = "" - command = "" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" elem "reconnectbutton" name = "&Reconnect" + category = "&File" command = ".reconnect" - category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + elem name = "&Quit\tAlt-F4" - command = ".quit" category = "&File" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + command = ".quit" + elem name = "&Icons" - command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" elem "auto" name = "&Auto (stretch-to-fit)" + category = "&Icons" + group = "size" command = ".winset \"mapwindow.map.icon-size=0\"" - category = "&Icons" + can-check = true is-checked = true - can-check = true - group = "size" - is-disabled = false saved-params = "is-checked" - elem "icon96" + elem "icon96" name = "&96x96 (3x)" - command = ".winset \"mapwindow.map.icon-size=96\"" category = "&Icons" - is-checked = false - can-check = true group = "size" - is-disabled = false + command = ".winset \"mapwindow.map.icon-size=96\"" + can-check = true + is-checked = false saved-params = "is-checked" elem "icon64" name = "&64x64 (2x)" - command = ".winset \"mapwindow.map.icon-size=64\"" category = "&Icons" - is-checked = false - can-check = true group = "size" - is-disabled = false + command = ".winset \"mapwindow.map.icon-size=64\"" + can-check = true + is-checked = false saved-params = "is-checked" elem "icon48" name = "&48x48 (1.5x)" - command = ".winset \"mapwindow.map.icon-size=48\"" category = "&Icons" - is-checked = false - can-check = true group = "size" - is-disabled = false + command = ".winset \"mapwindow.map.icon-size=48\"" + can-check = true + is-checked = false saved-params = "is-checked" elem "icon32" name = "&32x32" - command = ".winset \"mapwindow.map.icon-size=32\"" category = "&Icons" - is-checked = false - can-check = true group = "size" - is-disabled = false + command = ".winset \"mapwindow.map.icon-size=32\"" + can-check = true + is-checked = false saved-params = "is-checked" - elem + elem name = "&Help" - command = "" - category = "" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + elem name = "&Admin Help\tF1" + category = "&Help" command = "adminhelp" - category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" - elem + elem name = "&Hotkeys" - command = "hotkeys-help" category = "&Help" - is-checked = false - can-check = false - group = "" - is-disabled = false - saved-params = "is-checked" + command = "hotkeys-help" window "mainwindow" elem "mainwindow" type = MAIN - pos = 0,0 size = 640x440 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false is-default = true - border = none - drop-zone = false - right-click = false - saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true - is-pane = false - is-minimized = false - is-maximized = false - can-scroll = none icon = 'icons\\ss13_64.png' - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "macro" menu = "menu" - on-close = "" + macro = "macro" + saved-params = "pos;size;is-minimized;is-maximized" elem "split" type = CHILD pos = 3,0 size = 634x417 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "splitter" - on-size = "" - left = "mapwindow" - right = "infowindow" is-vert = true splitter = 50 show-splitter = true - lock = none + left = "mapwindow" + right = "infowindow" + saved-params = "splitter" elem "input" type = INPUT pos = 5,420 size = 595x20 anchor1 = 0,100 anchor2 = 100,100 + is-default = true font-family = "" font-size = 10 font-style = "" text-color = #000000 background-color = #d3b5b5 - is-visible = true - is-disabled = false - is-transparent = false - is-default = true - border = none - drop-zone = false - right-click = false saved-params = "command" - on-size = "" - command = "" - multi-line = false - is-password = false - no-command = false elem "say" type = BUTTON + button-type = pushbox pos = 600,420 size = 37x20 anchor1 = 100,100 anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" - text = "Chat" - image = "" - command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" is-flat = true - stretch = false + text = "Chat" + command = ".winset \"say.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"" is-checked = false - group = "" - button-type = pushbox + saved-params = "is-checked" elem "asset_cache_browser" type = BROWSER - pos = 0,0 - size = 200x200 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none is-visible = false - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "" - on-size = "" - show-history = false - show-url = false - auto-format = true - use-title = false - on-show = "" - on-hide = "" elem "tooltip" type = BROWSER pos = 0,0 size = 999x999 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none is-visible = false - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "" - on-size = "" - show-history = false - show-url = false - auto-format = true - use-title = false - on-show = "" - on-hide = "" + window "mapwindow" elem "mapwindow" type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" + saved-params = "pos;size;is-minimized;is-maximized" elem "map" type = MAP - pos = 0,0 + is-default = true size = 640x480 anchor1 = 0,0 anchor2 = 100,100 @@ -1191,301 +774,91 @@ window "mapwindow" font-style = "" text-color = none background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = true - border = none - drop-zone = true - right-click = false - saved-params = "icon-size" - on-size = "" icon-size = 0 - text-mode = false - letterbox = true - zoom = 0 - on-show = "" - on-hide = "" - style = "" + saved-params = "icon-size" + window "infowindow" elem "infowindow" type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" + saved-params = "pos;size;is-minimized;is-maximized" elem "info" type = CHILD pos = 0,30 size = 640x445 anchor1 = 0,0 anchor2 = 100,100 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "splitter" - on-size = "" - left = "statwindow" - right = "outputwindow" is-vert = false splitter = 50 show-splitter = true - lock = none - elem "changelog" + left = "statwindow" + right = "outputwindow" + saved-params = "splitter" + elem "changelog" type = BUTTON + button-type = pushbutton pos = 16,5 size = 104x20 anchor1 = 3,0 anchor2 = 19,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" text = "Changelog" - image = "" command = "changelog" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "rules" type = BUTTON + button-type = pushbutton pos = 120,5 size = 100x20 anchor1 = 19,0 anchor2 = 34,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" text = "Rules" - image = "" command = "rules" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "wiki" type = BUTTON + button-type = pushbutton pos = 220,5 size = 100x20 anchor1 = 34,0 anchor2 = 50,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" text = "Wiki" - image = "" command = "wiki" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton elem "forum" type = BUTTON + button-type = pushbutton pos = 320,5 size = 100x20 anchor1 = 50,0 anchor2 = 66,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" text = "Forum" - image = "" command = "forum" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton - elem "github" - type = BUTTON + elem "github" + type = BUTTON + button-type = pushbutton pos = 420,5 size = 100x20 anchor1 = 66,0 anchor2 = 81,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" - text = "Github" - image = "" - command = "github" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton - elem "report-issue" - type = BUTTON + text = "Github" + command = "github" + elem "report-issue" + type = BUTTON + button-type = pushbutton pos = 520,5 size = 100x20 anchor1 = 81,0 anchor2 = 97,0 - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "is-checked" - on-size = "" - text = "Report Issue" - image = "" - command = "report-issue" - is-flat = false - stretch = false - is-checked = false - group = "" - button-type = pushbutton + text = "Report Issue" + command = "report-issue" + window "outputwindow" elem "outputwindow" type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" + saved-params = "pos;size;is-minimized;is-maximized" elem "output" type = OUTPUT - pos = 0,0 + is-default = true size = 640x480 anchor1 = 0,0 anchor2 = 100,100 @@ -1494,65 +867,16 @@ window "outputwindow" font-style = "" text-color = #000000 background-color = #ffffff - is-visible = true - is-disabled = false - is-transparent = false - is-default = true - border = none - drop-zone = false - right-click = false - saved-params = "max-lines" - on-size = "" - link-color = #0000ff - visited-color = #ff00ff - style = "" - enable-http-images = false - max-lines = 1000 - image = "" + window "statwindow" elem "statwindow" type = MAIN - pos = 0,0 - size = 640x480 - anchor1 = none - anchor2 = none - font-family = "" - font-size = 0 - font-style = "" - text-color = #000000 - background-color = none - is-visible = true - is-disabled = false - is-transparent = false - is-default = false - border = none - drop-zone = false - right-click = false - saved-params = "pos;size;is-minimized;is-maximized" - on-size = "" - title = "" - titlebar = true - statusbar = true - can-close = true - can-minimize = true - can-resize = true is-pane = true - is-minimized = false - is-maximized = false - can-scroll = none - icon = "" - image = "" - image-mode = stretch - keep-aspect = false - transparent-color = none - alpha = 255 - macro = "" - menu = "" - on-close = "" + saved-params = "pos;size;is-minimized;is-maximized" elem "stat" type = INFO - pos = 0,0 + is-default = true size = 640x480 anchor1 = 0,0 anchor2 = 100,100 @@ -1561,26 +885,5 @@ window "statwindow" font-style = "" text-color = #000000 background-color = #ffffff - is-visible = true - is-disabled = false - is-transparent = false - is-default = true - border = none - drop-zone = true - right-click = false - saved-params = "" - on-size = "" - highlight-color = #00ff00 - tab-text-color = #000000 - tab-background-color = none - tab-font-family = "" - tab-font-size = 0 - tab-font-style = "" allow-html = true multi-line = true - on-show = "" - on-hide = "" - on-tab = "" - prefix-color = none - suffix-color = none - From f9a9c79935fad0b3e9f3486895db905eb55577c2 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 15 Sep 2016 22:12:48 +0000 Subject: [PATCH 07/46] Refactor some abductor code using the now removed anim function These were not caught as they used addtimer and text proc name, I also took the opportunity to remove a few stray src --- .../miniantags/abduction/abduction_gear.dm | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 116d910e056..55a703913be 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -50,11 +50,10 @@ if(disguise == null) return stealth_active = 1 - if(istype(src.loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = src.loc - addtimer(GLOBAL_PROC, "anim", 0, FALSE, M.loc, M, 'icons/mob/mob.dmi', - null, "cloak", null, M.dir) - + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = loc + PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja/cloak, + list(get_turf(M), M.dir)) M.name_override = disguise.name M.icon = disguise.icon M.icon_state = disguise.icon_state @@ -65,10 +64,10 @@ if(!stealth_active) return stealth_active = 0 - if(istype(src.loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/M = src.loc - addtimer(GLOBAL_PROC, "anim", 0, FALSE, M.loc, M, 'icons/mob/mob.dmi', - null, "uncloak", null, M.dir) + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/M = loc + PoolOrNew(/obj/effect/overlay/temp/dir_setting/ninja, + list(get_turf(M), M.dir)) M.name_override = null M.cut_overlays() M.regenerate_icons() @@ -92,11 +91,11 @@ ActivateStealth() /obj/item/clothing/suit/armor/abductor/vest/proc/Adrenaline() - if(istype(src.loc, /mob/living/carbon/human)) + if(istype(loc, /mob/living/carbon/human)) if(combat_cooldown != initial(combat_cooldown)) - src.loc << "Combat injection is still recharging." + loc << "Combat injection is still recharging." return - var/mob/living/carbon/human/M = src.loc + var/mob/living/carbon/human/M = loc M.adjustStaminaLoss(-75) M.SetParalysis(0) M.SetStunned(0) From 89bf651edbcd4ed4a77f06fba1a8dfd497baecff Mon Sep 17 00:00:00 2001 From: XDTM Date: Fri, 16 Sep 2016 11:45:41 +0200 Subject: [PATCH 08/46] Icon for positive viruses --- code/game/data_huds.dm | 11 ++++++++--- icons/mob/hud.dmi | Bin 11695 -> 11848 bytes 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index fe14f5486f8..51476bad536 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -62,8 +62,11 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() for(var/datum/disease/D in viruses) - if((!(D.visibility_flags & HIDDEN_SCANNER)) && (D.severity != NONTHREAT)) - return 1 + if(!(D.visibility_flags & HIDDEN_SCANNER)) + if (D.severity == NONTHREAT) //a buffing virus gets an icon + return 2 + else + return 1 return 0 //helper for getting the appropriate health status @@ -160,8 +163,10 @@ holder.icon_state = "hudxeno" else if(stat == DEAD || (status_flags & FAKEDEATH)) holder.icon_state = "huddead" - else if(check_virus()) + else if(check_virus() == 1) holder.icon_state = "hudill" + else if(check_virus() == 2) + holder.icon_state = "hudbuff" else holder.icon_state = "hudhealthy" diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 2338f667955703fb1d776f167b1161b170f75f65..0d61c44cbbd7aed0719fcf6c39b6907cc926869e 100644 GIT binary patch literal 11848 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 literal 11695 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 From 09090cc224817e960d9343f95e9e412e1a394aa1 Mon Sep 17 00:00:00 2001 From: XDTM Date: Fri, 16 Sep 2016 14:28:47 +0200 Subject: [PATCH 09/46] Code fixes and fully_heal change --- code/game/data_huds.dm | 16 ++++++++++------ code/modules/mob/living/carbon/carbon.dm | 3 ++- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 51476bad536..8cd3b7d2f89 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -61,13 +61,16 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() + var/threat = 0 for(var/datum/disease/D in viruses) if(!(D.visibility_flags & HIDDEN_SCANNER)) - if (D.severity == NONTHREAT) //a buffing virus gets an icon - return 2 + if (D.severity != NONTHREAT) //a buffing virus gets an icon + threat = 2 + return threat //harmful viruses have priority else - return 1 - return 0 + threat = 1 //aka good virus + + return threat //helper for getting the appropriate health status /proc/RoundHealth(mob/living/M) @@ -158,14 +161,15 @@ /mob/living/carbon/med_hud_set_status() var/image/holder = hud_list[STATUS_HUD] var/icon/I = icon(icon, icon_state, dir) + var/virus_state = check_virus() holder.pixel_y = I.Height() - world.icon_size if(status_flags & XENO_HOST) holder.icon_state = "hudxeno" else if(stat == DEAD || (status_flags & FAKEDEATH)) holder.icon_state = "huddead" - else if(check_virus() == 1) + else if(virus_state == 2) holder.icon_state = "hudill" - else if(check_virus() == 2) + else if(virus_state == 1) holder.icon_state = "hudbuff" else holder.icon_state = "hudhealthy" diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 0198c4a1cf8..94ee29b74b0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -672,7 +672,8 @@ if(B) B.damaged_brain = 0 for(var/datum/disease/D in viruses) - D.cure(0) + if (D.severity != NONTHREAT) + D.cure(0) if(admin_revive) regenerate_limbs() handcuffed = initial(handcuffed) From 143e4ce1720767503743396e1c5c7cc390b23cec Mon Sep 17 00:00:00 2001 From: phil235 Date: Fri, 16 Sep 2016 14:45:05 +0200 Subject: [PATCH 10/46] Made the wheel system generic, so future coders can make different wheel types. I gave the talk wheel to aliens, monkeys and cyborgs. --- code/_onclick/hud/_defines.dm | 23 +-- code/_onclick/hud/alien.dm | 5 + code/_onclick/hud/alien_larva.dm | 5 + code/_onclick/hud/hud.dm | 18 +- code/_onclick/hud/human.dm | 16 +- code/_onclick/hud/monkey.dm | 5 + code/_onclick/hud/robot.dm | 5 + code/_onclick/hud/screen_objects.dm | 264 ++++++++++++++-------------- code/modules/mob/mob_helpers.dm | 9 +- icons/mob/screen_gen.dmi | Bin 116520 -> 115627 bytes 10 files changed, 194 insertions(+), 156 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index ad0ea23e9da..0902579bac8 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -51,17 +51,17 @@ #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs -#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgies -#define ui_borg_thrusters "CENTER-5:16, SOUTH:5"//borgies -#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs -#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs -#define ui_inv3 "CENTER :16,SOUTH:5" //borgs -#define ui_borg_module "CENTER+1:16,SOUTH:5" -#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs - -#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs -#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs +#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs +#define ui_borg_lamp "CENTER-4:16, SOUTH:5" //borgs +#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //borgs +#define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs +#define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs +#define ui_inv3 "CENTER :16,SOUTH:5" //borgs +#define ui_borg_module "CENTER+1:16,SOUTH:5" //borgs +#define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs +#define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs +#define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs +#define ui_borg_talk_wheel "CENTER+4:21,SOUTH+1:5" //borgs #define ui_monkey_head "CENTER-4:13,SOUTH:5" //monkey #define ui_monkey_mask "CENTER-3:14,SOUTH:5" //monkey @@ -69,6 +69,7 @@ #define ui_alien_storage_l "CENTER-2:14,SOUTH:5"//alien #define ui_alien_storage_r "CENTER+1:18,SOUTH:5"//alien +#define ui_alien_talk_wheel "EAST-3:26,SOUTH:5" //alien #define ui_drone_drop "CENTER+1:18,SOUTH:5" //maintenance drones #define ui_drone_pull "CENTER+2:2,SOUTH:5" //maintenance drones diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 2cd637f9653..305d7719b68 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -70,6 +70,11 @@ H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon + using = new/obj/screen/wheel/talk + using.screen_loc = ui_alien_talk_wheel + wheels += using + static_inventory += using + using = new /obj/screen/drop() using.icon = 'icons/mob/screen_alien.dmi' using.screen_loc = ui_drop_throw diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 9594fe08e61..4c04cc363ac 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -21,6 +21,11 @@ pull_icon.screen_loc = ui_pull_resist hotkeybuttons += pull_icon + using = new/obj/screen/wheel/talk + using.screen_loc = ui_alien_talk_wheel + wheels += using + static_inventory += using + zone_select = new /obj/screen/zone_sel/alien() zone_select.update_icon(mymob) static_inventory += zone_select diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index b2e89db6d36..1777463b8a3 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -33,7 +33,7 @@ var/obj/screen/throw_icon var/obj/screen/module_store_icon - var/obj/screen/talk_wheel/talk_wheel_icon + var/list/wheels = list() //list of the wheel screen objects var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden @@ -66,8 +66,7 @@ qdel(module_store_icon) module_store_icon = null - qdel(talk_wheel_icon) - talk_wheel_icon = null + wheels = null //all wheels are also in static_inventory if(static_inventory.len) for(var/thing in static_inventory) @@ -204,7 +203,18 @@ return /datum/hud/proc/persistant_inventory_update(mob/viewer) - return + if(!mymob) + return + var/mob/living/L = mymob + + var/mob/screenmob = viewer || L + + for(var/X in wheels) + var/obj/screen/wheel/W = X + if(W.toggled) + screenmob.client.screen |= W.buttons_list + else + screenmob.client.screen -= W.buttons_list //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 5ef4633da63..40f364abd9a 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -95,9 +95,10 @@ using.icon = ui_style static_inventory += using - talk_wheel_icon = new/obj/screen/talk_wheel - talk_wheel_icon.icon = ui_style - static_inventory += talk_wheel_icon + using = new/obj/screen/wheel/talk + using.icon = ui_style + wheels += using + static_inventory += using using = new /obj/screen/inventory/area_creator using.icon = ui_style @@ -361,6 +362,7 @@ /datum/hud/human/persistant_inventory_update(mob/viewer) if(!mymob) return + ..() var/mob/living/carbon/human/H = mymob var/mob/screenmob = viewer || H @@ -401,16 +403,12 @@ if(hud_version != HUD_STYLE_NOHUD) for(var/obj/item/I in H.held_items) I.screen_loc = ui_hand_position(H.get_held_index_of_item(I)) - H.client.screen += I + screenmob.client.screen += I else for(var/obj/item/I in H.held_items) I.screen_loc = null - H.client.screen -= I + screenmob.client.screen -= I - if(talk_wheel_icon.toggled) - H.client.screen |= talk_wheel_icon.talk_boxes - else - H.client.screen -= talk_wheel_icon.talk_boxes /mob/living/carbon/human/verb/toggle_hotkey_verbs() set category = "OOC" diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index dd6ec4bef44..588d212375a 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -16,6 +16,11 @@ using.screen_loc = ui_movi static_inventory += using + using = new/obj/screen/wheel/talk + using.icon = ui_style + wheels += using + static_inventory += using + using = new /obj/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index aaf740f479e..0ac784718ae 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -93,6 +93,11 @@ var/mob/living/silicon/robot/mymobR = mymob var/obj/screen/using + using = new/obj/screen/wheel/talk + using.screen_loc = ui_borg_talk_wheel + wheels += using + static_inventory += using + //Radio using = new /obj/screen/robot/radio() using.screen_loc = ui_borg_radio diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 93c6bbec76f..8dedf4b91b7 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -46,134 +46,6 @@ M.swap_hand() return 1 -/obj/screen/talk_wheel - name = "talk wheel" - layer = HUD_LAYER - icon_state = "talk_wheel" - screen_loc = "11:6,2:-11" - var/obj/screen/talk/talk_boxes - var/toggled = 0 - -/obj/screen/talk_wheel/New() - ..() - talk_boxes = new () - talk_boxes.wheel = src - -/obj/screen/talk_wheel/Destroy() - qdel(talk_boxes) - talk_boxes = null - return ..() - -/obj/screen/talk_wheel/Click() - if(world.time <= usr.next_move) - return - if(usr.stat) - return - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - if(toggled) - H.client.screen -= talk_boxes - else - H.client.screen |= talk_boxes - toggled = !toggled - -/obj/screen/talk - name = "talk option" - icon_state = "x3" - screen_loc = "8,8" - layer = HUD_LAYER - mouse_opacity = 2 - var/talk_cooldown = 0 - var/obj/screen/talk_wheel/wheel - -/obj/screen/talk/New() - ..() - var/image/I = image("icon" = icon, "icon_state" = "talk_help") - I.pixel_x = -32 - I.pixel_y = 32 - add_overlay(I) - var/image/J = image("icon" = icon, "icon_state" = "talk_hello") - J.pixel_x = 0 - J.pixel_y = 32 - add_overlay(J) - var/image/K = image("icon" = icon, "icon_state" = "talk_bye") - K.pixel_x = 32 - K.pixel_y = 32 - add_overlay(K) - var/image/L = image("icon" = icon, "icon_state" = "talk_come") - L.pixel_x = -32 - L.pixel_y = 0 - add_overlay(L) - var/image/N = image("icon" = icon, "icon_state" = "talk_thx") - N.pixel_x = 32 - N.pixel_y = 0 - add_overlay(N) - var/image/O = image("icon" = icon, "icon_state" = "talk_out") - O.pixel_x = -32 - O.pixel_y = -32 - add_overlay(O) - var/image/P = image("icon" = icon, "icon_state" = "talk_stop") - P.pixel_x = 0 - P.pixel_y = -32 - add_overlay(P) - var/image/Q = image("icon" = icon, "icon_state" = "talk_yes_no") - Q.pixel_x = 32 - Q.pixel_y = -32 - add_overlay(Q) - - - -/obj/screen/talk/Destroy() - wheel = null - return ..() - -/obj/screen/talk/Click(location, control,params) - if(ishuman(usr)) - if(usr.stat) - return - var/mob/living/carbon/human/H = usr - var/word_spoken = "" - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - - switch(icon_y) - if(1 to 32) - switch(icon_x) - if(1 to 32) - usr.client.screen -= src - wheel.toggled = !wheel.toggled - return - if(33 to 64) - word_spoken = pick("Thanks.", "Thanks!", "Thank you.") - else - word_spoken = pick("Come.", "Follow me.") - if(33 to 64) - switch(icon_x) - if(1 to 32) - word_spoken = pick("Hi.", "Hello.") - if(33 to 64) - word_spoken = pick("Bye.", "Goodbye.") - else - word_spoken = pick("Help!", "Help me!") - else - switch(icon_x) - if(1 to 32) - word_spoken = pick("Stop!", "Halt!") - if(33 to 64) - if(icon_y < -16) - word_spoken = "No." - else - word_spoken = "Yes." - else - word_spoken = pick("Go away!", "Out!", "Get out!") - - if(word_spoken && talk_cooldown < world.time) - talk_cooldown = world.time + 10 - H.say(word_spoken) - - - /obj/screen/inventory/craft name = "crafting menu" icon = 'icons/mob/screen_midnight.dmi' @@ -608,3 +480,139 @@ /obj/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll + + + +/obj/screen/wheel + name = "wheel" + layer = HUD_LAYER + icon_state = "" + screen_loc = null //if you make a new wheel, remember to give it a screen_loc + var/list/buttons_names = list() //list of the names for each button, its length is the amount of buttons. + var/toggled = 0 //wheel is hidden/shown + var/wheel_buttons_type //the type of buttons used with this wheel. + var/list/buttons_list = list() + +/obj/screen/wheel/New() + ..() + build_options() + + +//we create the buttons for the wheel and place them in a square spiral fashion. +/obj/screen/wheel/proc/build_options() + var/obj/screen/wheel_button/close_wheel/CW = new () + buttons_list += CW //the close option + CW.wheel = src + + var/list/offset_x_list = list() + var/list/offset_y_list = list() + var/num = 1 + var/N = 1 + var/M = 0 + var/sign = -1 + my_loop: + while(offset_y_list.len < buttons_names.len) + for(var/i=1, i<=num, i++) + offset_y_list += N + offset_x_list += M + if(offset_y_list.len == buttons_names.len) + break my_loop + if(N != 0) + N = 0 + M = -sign + else + N = sign + M = 0 + sign = -sign + num++ + + var/screenx = 8 + var/screeny = 8 + for(var/i = 1, i <= buttons_names.len, i++) + var/obj/screen/wheel_button/WB = new wheel_buttons_type() + WB.wheel = src + buttons_list += WB + screenx += offset_x_list[i] + screeny += offset_y_list[i] + WB.screen_loc = "[screenx], [screeny]" + set_button(WB, i) + +/obj/screen/wheel/proc/set_button(obj/screen/wheel_button/WB, button_number) + WB.name = buttons_names[button_number] + return + +/obj/screen/wheel/Destroy() + for(var/obj/screen/S in buttons_list) + qdel(S) + return ..() + +/obj/screen/wheel/Click() + if(world.time <= usr.next_move) + return + if(usr.stat) + return + if(isliving(usr)) + var/mob/living/L = usr + if(toggled) + L.client.screen -= buttons_list + else + L.client.screen |= buttons_list + toggled = !toggled + + +/obj/screen/wheel/talk + name = "talk wheel" + icon_state = "talk_wheel" + screen_loc = "11:6,2:-11" + wheel_buttons_type = /obj/screen/wheel_button/talk + buttons_names = list("help","hello","bye","stop","thanks","come","out", "yes", "no") + var/list/word_messages = list(list("Help!","Help me!"), list("Hello.", "Hi."), list("Bye.", "Goodbye."),\ + list("Stop!", "Halt!"), list("Thanks.", "Thanks!", "Thank you."), \ + list("Come.", "Follow me."), list("Out!", "Go away!", "Get out!"), \ + list("Yes.", "Affirmative."), list("No.", "Negative")) + +/obj/screen/wheel/talk/set_button(obj/screen/wheel_button/WB, button_number) + ..() + var/obj/screen/wheel_button/talk/T = WB //we already know what type the button is exactly. + T.icon_state = "talk_[T.name]" + T.word_messages = word_messages[button_number] + + +/obj/screen/wheel_button + name = "default wheel button" + screen_loc = "8,8" + layer = HUD_LAYER + mouse_opacity = 2 + var/obj/screen/wheel/wheel + +/obj/screen/wheel_button/Destroy() + wheel = null + return ..() + +/obj/screen/wheel_button/close_wheel + name = "close wheel" + icon_state = "x3" + +/obj/screen/wheel_button/close_wheel/Click() + if(isliving(usr)) + var/mob/living/L = usr + L.client.screen -= wheel.buttons_list + wheel.toggled = !wheel.toggled + + +/obj/screen/wheel_button/talk + name = "talk option" + icon_state = "talk_help" + var/talk_cooldown = 0 + var/list/word_messages = list() + +/obj/screen/wheel_button/talk/Click(location, control,params) + if(isliving(usr)) + var/mob/living/L = usr + if(L.stat) + return + + if(word_messages.len && talk_cooldown < world.time) + talk_cooldown = world.time + 10 + L.say(pick(word_messages)) + diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 089b9565b13..3066ac6d487 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -470,8 +470,9 @@ It's fairly easy to fix if dealing with single letters but not so much with comp set name = "talk-wheel" set hidden = 1 - if(ishuman(src)) - var/mob/living/carbon/human/H = src - if(H.hud_used && H.hud_used.talk_wheel_icon) - H.hud_used.talk_wheel_icon.Click() + if(isliving(src)) + var/mob/living/L = src + if(L.hud_used) + for(var/obj/screen/wheel/talk/TW in L.hud_used.wheels) + TW.Click() diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 28c61a1e7c3f99170e9efe0b576f0b6b22a054c8..256bd412b4fb47a424bd42ca7718e77875194c52 100644 GIT binary patch delta 11733 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 XXU*XYIfBSQAdtG+OV!H97UBO3p}1Qe delta 12648 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 From 447a80c743c072d7d1e13a39ccd7b24ad2e49760 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sat, 17 Sep 2016 09:06:12 -0400 Subject: [PATCH 11/46] Some cult fixes --- code/game/gamemodes/cult/runes.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 6e3ceba0756..dc0d006f4b3 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -337,6 +337,9 @@ var/list/teleport_runes = list() allow_excess_invokers = 1 rune_in_use = FALSE +/obj/effect/rune/convert/do_invoke_glow() + return + /obj/effect/rune/convert/invoke(var/list/invokers) if(rune_in_use) return @@ -366,7 +369,7 @@ var/list/teleport_runes = list() do_convert(L, invokers) else do_sacrifice(L, invokers) - color = initial(color) + animate(src, color = initial(color), time = 5) rune_in_use = FALSE /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers) @@ -383,8 +386,8 @@ var/list/teleport_runes = list() var/brutedamage = convertee.getBruteLoss() var/burndamage = convertee.getFireLoss() if(brutedamage || burndamage) - convertee.adjustBruteLoss(-brutedamage) - convertee.adjustFireLoss(-burndamage) + convertee.adjustBruteLoss(-(brutedamage * 0.75)) + convertee.adjustFireLoss(-(burndamage * 0.75)) convertee.visible_message("[convertee] writhes in pain \ [brutedamage || burndamage ? "even as their wounds heal and close" : "as the markings below them glow a bloody red"]!", \ "AAAAAAAAAAAAAA-") @@ -478,6 +481,7 @@ var/list/teleport_runes = list() M << "Nar-Sie does not respond!" fail_invoke() log_game("Summon Nar-Sie rune failed - gametype is not cult") + return if(locate(/obj/singularity/narsie) in poi_list) for(var/M in invokers) @@ -681,7 +685,7 @@ var/list/teleport_runes = list() var/turf/T = get_turf(src) rune_in_use = 1 affecting = user - user.color = "#7e1717" + user.color = "#7D1717" user.visible_message("[user] freezes statue-still, glowing an unearthly red.", \ "You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...") user.ghostize(1) From f50bb7fb4b577e52974e4ad5ca80368040bd52de Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sat, 17 Sep 2016 09:09:21 -0400 Subject: [PATCH 12/46] BARHAH HRA ZARGARIS --- code/game/gamemodes/cult/runes.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index dc0d006f4b3..b14f3d286aa 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -355,11 +355,11 @@ var/list/teleport_runes = list() rune_in_use = TRUE visible_message("[src] pulses blood red!") color = "#7D1717" - ..() var/mob/living/L = pick(myriad_targets) var/is_clock = is_servant_of_ratvar(L) var/is_convertable = is_convertable_to_cult(L.mind) if(L.stat != DEAD && (is_clock || is_convertable)) + invocation = "Mah'weyh pleggh at e'ntrath!" if(is_clock) L.visible_message("[L]'s eyes glow a defiant yellow!", \ "\"Stop resisting. You will be mi-\"\n\ @@ -368,7 +368,9 @@ var/list/teleport_runes = list() else if(is_convertable) do_convert(L, invokers) else + invocation = "Barhah hra zar'garis!" do_sacrifice(L, invokers) + ..() animate(src, color = initial(color), time = 5) rune_in_use = FALSE From 130bd5e36b6b671c2a14ef7b6c5919b4518c39bc Mon Sep 17 00:00:00 2001 From: Nick M Date: Sat, 17 Sep 2016 19:01:17 +0400 Subject: [PATCH 13/46] Fixes lattices appearing after lava explosion --- code/game/turfs/simulated/floor/plating.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index e06fd5bf633..8e4841da760 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -235,6 +235,9 @@ slowdown = 2 luminosity = 1 +/turf/open/floor/plating/lava/ex_act() + return + /turf/open/floor/plating/lava/airless initial_gas_mix = "TEMP=2.7" From ca285a00c07b9b4b2b8c8967b247b2a9f7460025 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sat, 17 Sep 2016 12:21:54 -0400 Subject: [PATCH 14/46] I can't actually get away with one --- code/game/gamemodes/cult/runes.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index b14f3d286aa..d6340bab28c 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -360,6 +360,7 @@ var/list/teleport_runes = list() var/is_convertable = is_convertable_to_cult(L.mind) if(L.stat != DEAD && (is_clock || is_convertable)) invocation = "Mah'weyh pleggh at e'ntrath!" + ..() if(is_clock) L.visible_message("[L]'s eyes glow a defiant yellow!", \ "\"Stop resisting. You will be mi-\"\n\ @@ -369,8 +370,8 @@ var/list/teleport_runes = list() do_convert(L, invokers) else invocation = "Barhah hra zar'garis!" + ..() do_sacrifice(L, invokers) - ..() animate(src, color = initial(color), time = 5) rune_in_use = FALSE From dc1287a176e2feb907eee3ba091080999c3a59c7 Mon Sep 17 00:00:00 2001 From: "Marc R. Uchniat" Date: Sat, 17 Sep 2016 22:42:27 -0400 Subject: [PATCH 15/46] allow kitchen spikes to be welded apart --- code/game/objects/structures/kitchen_spike.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index 042ce6b307d..56e81172352 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -20,6 +20,22 @@ var/obj/F = new /obj/structure/kitchenspike(src.loc,) transfer_fingerprints_to(F) qdel(src) + else if(istype(I, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = I + if(!WT.remove_fuel(0, user)) + return + user << "You begin cutting \the [src] apart..." + playsound(src.loc, "sound/items/Welder.ogg", 40, 1) + if(do_after(user, 40/WT.toolspeed, 1, target = src)) + if(!WT.isOn()) + return + playsound(src.loc, "sound/items/Welder.ogg", 50, 1) + visible_message("[user] slices apart \the [src].", + "You cut \the [src] apart with \the [WT].", + "You hear welding.") + new /obj/item/stack/sheet/metal(src.loc, 4) + qdel(src) + return else return ..() From 93f444fd38aa57167939f5a4a1c632c3cb773bd5 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 18 Sep 2016 13:32:26 +0200 Subject: [PATCH 16/46] Removes Hand of God gamemode. --- code/__DEFINES/hud.dm | 18 +- code/__DEFINES/role_preferences.dm | 4 - code/_onclick/hud/other_mobs.dm | 28 - code/datums/hud.dm | 2 - code/datums/mind.dm | 219 +----- code/game/gamemodes/game_mode.dm | 1 - code/game/gamemodes/handofgod/_handofgod.dm | 476 ------------- code/game/gamemodes/handofgod/actions.dm | 28 - code/game/gamemodes/handofgod/god.dm | 290 -------- code/game/gamemodes/handofgod/objectives.dm | 129 ---- code/game/gamemodes/handofgod/powers.dm | 363 ---------- code/game/gamemodes/handofgod/structures.dm | 661 ------------------ .../items.dm => objects/items/religion.dm} | 157 +---- .../weapons/implants/implant_loyality.dm | 3 +- code/game/objects/structures/divine.dm | 244 +++++++ .../handofgod => objects/structures}/traps.dm | 4 - code/modules/admin/player_panel.dm | 60 -- code/modules/awaymissions/capture_the_flag.dm | 2 - code/modules/mob/living/silicon/login.dm | 1 - .../modules/mob/living/silicon/robot/login.dm | 1 - .../living/simple_animal/hostile/skeleton.dm | 2 +- code/modules/mob/transform_procs.dm | 17 - .../chemistry/reagents/other_reagents.dm | 4 +- .../chemistry/recipes/pyrotechnics.dm | 2 +- tgstation.dme | 11 +- 25 files changed, 280 insertions(+), 2447 deletions(-) delete mode 100644 code/game/gamemodes/handofgod/_handofgod.dm delete mode 100644 code/game/gamemodes/handofgod/actions.dm delete mode 100644 code/game/gamemodes/handofgod/god.dm delete mode 100644 code/game/gamemodes/handofgod/objectives.dm delete mode 100644 code/game/gamemodes/handofgod/powers.dm delete mode 100644 code/game/gamemodes/handofgod/structures.dm rename code/game/{gamemodes/handofgod/items.dm => objects/items/religion.dm} (55%) create mode 100644 code/game/objects/structures/divine.dm rename code/game/{gamemodes/handofgod => objects/structures}/traps.dm (99%) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 57e6573bc73..6bbc2fe1b59 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -30,16 +30,14 @@ #define ANTAG_HUD_OPS 8 #define ANTAG_HUD_WIZ 9 #define ANTAG_HUD_SHADOW 10 -#define ANTAG_HUD_HOG_BLUE 11 -#define ANTAG_HUD_HOG_RED 12 -#define ANTAG_HUD_TRAITOR 13 -#define ANTAG_HUD_NINJA 14 -#define ANTAG_HUD_CHANGELING 15 -#define ANTAG_HUD_ABDUCTOR 16 -#define ANTAG_HUD_DEVIL 17 -#define ANTAG_HUD_SINTOUCHED 18 -#define ANTAG_HUD_SOULLESS 19 -#define ANTAG_HUD_CLOCKWORK 20 +#define ANTAG_HUD_TRAITOR 11 +#define ANTAG_HUD_NINJA 12 +#define ANTAG_HUD_CHANGELING 13 +#define ANTAG_HUD_ABDUCTOR 14 +#define ANTAG_HUD_DEVIL 15 +#define ANTAG_HUD_SINTOUCHED 16 +#define ANTAG_HUD_SOULLESS 17 +#define ANTAG_HUD_CLOCKWORK 18 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index aff4dea38c8..51502947f6b 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -21,8 +21,6 @@ #define ROLE_GANG "gangster" #define ROLE_ABDUCTOR "abductor" #define ROLE_REVENANT "revenant" -#define ROLE_HOG_GOD "hand of god: god" -#define ROLE_HOG_CULTIST "hand of god: cultist" #define ROLE_DEVIL "devil" #define ROLE_SERVANT_OF_RATVAR "servant of Ratvar" @@ -45,8 +43,6 @@ var/global/list/special_roles = list( ROLE_GANG = /datum/game_mode/gang, ROLE_REVENANT, ROLE_ABDUCTOR = /datum/game_mode/abduction, - ROLE_HOG_GOD = /datum/game_mode/hand_of_god, - ROLE_HOG_CULTIST = /datum/game_mode/hand_of_god, ROLE_DEVIL = /datum/game_mode/devil, ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult, ) diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index ac42696bc56..af7eabd8e9a 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -11,31 +11,3 @@ if(client && !hud_used) hud_used = new /datum/hud/brain(src) -/datum/hud/hog_god/New(mob/owner) - ..() - healths = new /obj/screen/healths/deity() - infodisplay += healths - - deity_power_display = new /obj/screen/deity_power_display() - infodisplay += deity_power_display - - deity_follower_display = new /obj/screen/deity_follower_display() - infodisplay += deity_follower_display - - -/mob/camera/god/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/hog_god(src) - -/obj/screen/deity_power_display - name = "Faith" - icon_state = "deity_power" - screen_loc = ui_deitypower - layer = HUD_LAYER - -/obj/screen/deity_follower_display - name = "Followers" - icon_state = "deity_followers" - screen_loc = ui_deityfollowers - layer = HUD_LAYER - diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 62c1700f58d..75adb165d3a 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -12,8 +12,6 @@ var/datum/atom_hud/huds = list( \ ANTAG_HUD_OPS = new/datum/atom_hud/antag(), \ ANTAG_HUD_WIZ = new/datum/atom_hud/antag(), \ ANTAG_HUD_SHADOW = new/datum/atom_hud/antag(), \ - ANTAG_HUD_HOG_BLUE = new/datum/atom_hud/antag(),\ - ANTAG_HUD_HOG_RED = new/datum/atom_hud/antag(),\ ANTAG_HUD_TRAITOR = new/datum/atom_hud/antag/hidden(),\ ANTAG_HUD_NINJA = new/datum/atom_hud/antag/hidden(),\ ANTAG_HUD_CHANGELING = new/datum/atom_hud/antag/hidden(),\ diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 61c61673d11..b335ccdd762 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -174,16 +174,6 @@ ticker.mode.remove_gangster(src,0,1,1) remove_objectives() -/datum/mind/proc/remove_hog_follower_prophet() - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - ticker.mode.blue_deity_prophets -= src - ticker.mode.blue_deity_followers -= src - ticker.mode.update_hog_icons_removed(src, "red") - ticker.mode.update_hog_icons_removed(src, "blue") - - - /datum/mind/proc/remove_antag_equip() var/list/Mob_Contents = current.get_contents() for(var/obj/item/I in Mob_Contents) @@ -221,12 +211,6 @@ else if(is_gangster(creator)) ticker.mode.add_gangster(src, creator.mind.gang_datum, TRUE) - else if(is_handofgod_redcultist(creator) || is_handofgod_redprophet(creator)) - ticker.mode.add_hog_follower(src, "Red") - - else if(is_handofgod_bluecultist(creator) || is_handofgod_blueprophet(creator)) - ticker.mode.add_hog_follower(src, "Blue") - else if(is_revolutionary_in_general(creator)) ticker.mode.add_revolutionary(src) @@ -490,38 +474,6 @@ sections["traitor"] = text - /** HAND OF GOD **/ - text = "hand of god" - if(ticker.mode.config_tag == "handofgod") - text = uppertext(text) - text = "[text]: " - if (src in ticker.mode.red_deities) - text += "RED GOD|red prophet|red follower|employee|blue god|blue prophet|blue follower" - else if(src in ticker.mode.red_deity_prophets) - text += "red god|RED PROPHET|red follower|employee|blue god|blue prophet|blue follower" - else if (src in ticker.mode.red_deity_followers) - text += "red god|red prophet|RED FOLLOWER|employee|blue god|blue prophet|blue follower" - else if (src in ticker.mode.blue_deities) - text += "red god|red prophet|red follower|employee|BLUE GOD|blue prophet|blue follower" - else if (src in ticker.mode.blue_deity_prophets) - text += "red god|red prophet|red follower|employee|blue god|BLUE PROPHET|blue follower" - else if (src in ticker.mode.blue_deity_followers) - text += "red god|red prophet|red follower|employee|blue god|blue prophet|BLUE FOLLOWER" - else - text += "red god|red prophet|red follower|EMPLOYEE|blue god|blue prophet|blue follower" - - if(current && current.client && (ROLE_HOG_GOD in current.client.prefs.be_special)) - text += "|HOG God Enabled in Prefs" - else - text += "|HOG God Disabled in Prefs" - - if(current && current.client && (ROLE_HOG_CULTIST in current.client.prefs.be_special)) - text += "|HOG Cultist Enabled in Prefs" - else - text += "|HOG Disabled in Prefs" - - sections["follower"] = text - if(ishuman(current) || ismonkey(current)) /** CHANGELING ***/ @@ -696,7 +648,7 @@ if(!def_value)//If it's a custom objective, it will be an empty string. def_value = "custom" - var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom","follower block (HOG)","build (HOG)","deicide (HOG)", "follower escape (HOG)", "sacrifice prophet (HOG)") + var/new_obj_type = input("Select objective type:", "Objective type", def_value) as null|anything in list("assassinate", "maroon", "debrain", "protect", "destroy", "prevent", "hijack", "escape", "survive", "martyr", "steal", "download", "nuclear", "capture", "absorb", "custom") if (!new_obj_type) return @@ -798,22 +750,6 @@ new_objective.owner = src new_objective.target_amount = target_number - if("follower block (HOG)") - new_objective = new /datum/objective/follower_block - new_objective.owner = src - if("build (HOG)") - new_objective = new /datum/objective/build - new_objective.owner = src - if("deicide (HOG)") - new_objective = new /datum/objective/deicide - new_objective.owner = src - if("follower escape (HOG)") - new_objective = new /datum/objective/escape_followers - new_objective.owner = src - if("sacrifice prophet (HOG)") - new_objective = new /datum/objective/sacrifice_prophet - new_objective.owner = src - if ("custom") var/expl = stripped_input(usr, "Custom objective:", "Objective", objective ? objective.explanation_text : "") if (!expl) @@ -850,46 +786,6 @@ objective.completed = !objective.completed log_admin("[key_name(usr)] toggled the win state for [current]'s objective: [objective.explanation_text]") - else if (href_list["handofgod"]) - switch(href_list["handofgod"]) - if("clear") //wipe handofgod status - if((src in ticker.mode.red_deity_followers) || (src in ticker.mode.blue_deity_followers) || (src in ticker.mode.red_deity_prophets) || (src in ticker.mode.blue_deity_prophets)) - remove_hog_follower_prophet() - current << "You have been brainwashed... again! Your faith is no more!" - message_admins("[key_name_admin(usr)] has de-hand of god'ed [current].") - log_admin("[key_name(usr)] has de-hand of god'ed [current].") - - if("red follower") - make_Handofgod_follower("red") - message_admins("[key_name_admin(usr)] has red follower'ed [current].") - log_admin("[key_name(usr)] has red follower'ed [current].") - - if("red prophet") - make_Handofgod_prophet("red") - message_admins("[key_name_admin(usr)] has red prophet'ed [current].") - log_admin("[key_name(usr)] has red prophet'ed [current].") - - if("blue follower") - make_Handofgod_follower("blue") - message_admins("[key_name_admin(usr)] has blue follower'ed [current].") - log_admin("[key_name(usr)] has blue follower'ed [current].") - - if("blue prophet") - make_Handofgod_prophet("blue") - message_admins("[key_name_admin(usr)] has blue prophet'ed [current].") - log_admin("[key_name(usr)] has blue prophet'ed [current].") - - if("red god") - make_Handofgod_god("red") - message_admins("[key_name_admin(usr)] has red god'ed [current].") - log_admin("[key_name(usr)] has red god'ed [current].") - - if("blue god") - make_Handofgod_god("blue") - message_admins("[key_name_admin(usr)] has blue god'ed [current].") - log_admin("[key_name(usr)] has blue god'ed [current].") - - else if (href_list["revolution"]) switch(href_list["revolution"]) if("clear") @@ -1563,119 +1459,6 @@ L = agent_landmarks[team] H.loc = L.loc - -/datum/mind/proc/make_Handofgod_follower(colour) - . = 0 - switch(colour) - if("red") - //Remove old allegiances - if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) - current << "You are no longer a member of the Blue cult!" - - ticker.mode.blue_deity_followers -= src - ticker.mode.blue_deity_prophets -= src - current.faction |= "red god" - current.faction -= "blue god" - - if(src in ticker.mode.red_deity_prophets) - current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" - ticker.mode.red_deity_prophets -= src - - ticker.mode.red_deity_followers |= src - current << "You are now a follower of the red cult's god!" - - special_role = "Hand of God: Red Follower" - . = 1 - if("blue") - //Remove old allegiances - if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) - current << "You are no longer a member of the Red cult!" - - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - current.faction -= "red god" - current.faction |= "blue god" - - if(src in ticker.mode.blue_deity_prophets) - current << "You have lost the connection with your deity, but you still believe in their grand design, You are no longer a prophet!" - ticker.mode.blue_deity_prophets -= src - - ticker.mode.blue_deity_followers |= src - current << "You are now a follower of the blue cult's god!" - - special_role = "Hand of God: Blue Follower" - . = 1 - else - return 0 - - ticker.mode.update_hog_icons_removed(src,"red") - ticker.mode.update_hog_icons_removed(src,"blue") - //ticker.mode.greet_hog_follower(src,colour) - ticker.mode.update_hog_icons_added(src, colour) - -/datum/mind/proc/make_Handofgod_prophet(colour) - . = 0 - switch(colour) - if("red") - //Remove old allegiances - - if(src in ticker.mode.blue_deity_followers || src in ticker.mode.blue_deity_prophets) - current << "You are no longer a member of the Blue cult!" - current.faction -= "blue god" - current.faction |= "red god" - - ticker.mode.blue_deity_followers -= src - ticker.mode.blue_deity_prophets -= src - ticker.mode.red_deity_followers -= src - - ticker.mode.red_deity_prophets |= src - current << "You are now a prophet of the red cult's god!" - - special_role = "Hand of God: Red Prophet" - . = 1 - if("blue") - //Remove old allegiances - - if(src in ticker.mode.red_deity_followers || src in ticker.mode.red_deity_prophets) - current << "You are no longer a member of the Red cult!" - current.faction -= "red god" - current.faction |= "blue god" - - ticker.mode.red_deity_followers -= src - ticker.mode.red_deity_prophets -= src - ticker.mode.blue_deity_followers -= src - - ticker.mode.blue_deity_prophets |= src - current << "You are now a prophet of the blue cult's god!" - - special_role = "Hand of God: Blue Prophet" - . = 1 - - else - return 0 - - ticker.mode.update_hog_icons_removed(src,"red") - ticker.mode.update_hog_icons_removed(src,"blue") - ticker.mode.greet_hog_follower(src,colour) - ticker.mode.update_hog_icons_added(src, colour) - -/datum/mind/proc/make_Handofgod_god(colour) - switch(colour) - if("red") - current.become_god("red") - ticker.mode.add_god(src,"red") - if("blue") - current.become_god("blue") - ticker.mode.add_god(src,"blue") - else - return 0 - ticker.mode.forge_deity_objectives(src) - ticker.mode.remove_hog_follower(src,0) - ticker.mode.update_hog_icons_added(src, colour) -// ticker.mode.greet_hog_follower(src,colour) - return 1 - - /datum/mind/proc/AddSpell(obj/effect/proc_holder/spell/S) spell_list += S S.action.Grant(current) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index eb15b771a5b..e4311624dc5 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -539,7 +539,6 @@ ticker.mode.remove_cultist(newborgie, 0, 0) ticker.mode.remove_revolutionary(newborgie, 0) ticker.mode.remove_gangster(newborgie, 0, remove_bosses=1) - ticker.mode.remove_hog_follower(newborgie, 0) remove_servant_of_ratvar(newborgie.current, TRUE) diff --git a/code/game/gamemodes/handofgod/_handofgod.dm b/code/game/gamemodes/handofgod/_handofgod.dm deleted file mode 100644 index 2de6b0f782d..00000000000 --- a/code/game/gamemodes/handofgod/_handofgod.dm +++ /dev/null @@ -1,476 +0,0 @@ - -var/global/list/global_handofgod_traptypes = list() -var/global/list/global_handofgod_structuretypes = list() - -#define CONDUIT_RANGE 15 - - -/datum/game_mode - var/list/datum/mind/red_deities = list() - var/list/datum/mind/red_deity_prophets = list() - var/list/datum/mind/red_deity_followers = list() - - var/list/datum/mind/blue_deities = list() - var/list/datum/mind/blue_deity_prophets = list() - var/list/datum/mind/blue_deity_followers = list() - - var/list/datum/mind/unassigned_followers = list() //for roundstart team assigning - var/list/datum/mind/assigned_to_red = list() - var/list/datum/mind/assigned_to_blue = list() - - -/datum/game_mode/hand_of_god - name = "hand of god" - config_tag = "handofgod" - antag_flag = ROLE_HOG_CULTIST //Followers use ROLE_HOG_CULTIST, Gods are picked later on with ROLE_HOG_GOD - - required_players = 25 - required_enemies = 8 - recommended_enemies = 8 - restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") - - announce_span = "danger" - announce_text = "Two cults are trying to overthrow one another!\n\ - Gods: Protect your nexus and eliminate the enemy god.\n\ - Prophets: Lead your cult by your deity's will.\n\ - Followers: Follow your prophet's orders and lead your deity to victory.\n\ - Crew: Destroy both cults before they can grow in strength." - - -///////////// -//Pre setup// -///////////// - -/datum/game_mode/hand_of_god/pre_setup() - if(config.protect_roles_from_antagonist) - restricted_jobs += protected_jobs - - if(config.protect_assistant_from_antagonist) - restricted_jobs += "Assistant" - - for(var/F in 1 to recommended_enemies) - if(!antag_candidates.len) - break - var/datum/mind/follower = pick_n_take(antag_candidates) - unassigned_followers += follower - follower.restricted_roles = restricted_jobs - log_game("[follower.key] (ckey) has been selected as a follower, however teams have not been decided yet.") - - while(unassigned_followers.len > (required_enemies / 2)) - var/datum/mind/chosen = pick_n_take(unassigned_followers) - add_hog_follower(chosen,"red") - - while(unassigned_followers.len) - var/datum/mind/chosen = pick_n_take(unassigned_followers) - add_hog_follower(chosen,"blue") - - return 1 - - -////////////// -//Post Setup// -////////////// - -//Pick a follower to uplift into a god -/datum/game_mode/hand_of_god/post_setup() - - //Find viable red god - var/list/red_god_possibilities = get_players_for_role(ROLE_HOG_GOD) - red_god_possibilities &= red_deity_followers //followers only - if(!red_god_possibilities.len) //No candidates? just pick any follower regardless of prefs - red_god_possibilities = red_deity_followers - - //Make red god - var/datum/mind/red_god = pick_n_take(red_god_possibilities) - if(red_god) - red_god.current.become_god("red") - remove_hog_follower(red_god,0) - add_god(red_god,"red") - - //Find viable blue god - var/list/blue_god_possibilities = get_players_for_role(ROLE_HOG_GOD) - blue_god_possibilities &= blue_deity_followers //followers only - if(!blue_god_possibilities.len) //No candidates? just pick any follower regardless of prefs - blue_god_possibilities = blue_deity_followers - - //Make blue god - var/datum/mind/blue_god = pick_n_take(blue_god_possibilities) - if(blue_god) - blue_god.current.become_god("blue") - remove_hog_follower(blue_god,0) - add_god(blue_god,"blue") - - - //Forge objectives - //This is done here so that both gods exist - if(red_god) - ticker.mode.forge_deity_objectives(red_god) - if(blue_god) - ticker.mode.forge_deity_objectives(blue_god) - - - ..() - -/////////////////// -//Objective Procs// -/////////////////// - -/datum/game_mode/proc/forge_deity_objectives(datum/mind/deity) - switch(rand(1,100)) - if(1 to 30) - var/datum/objective/deicide/deicide = new - deicide.owner = deity - if(deicide.find_target())//Hard to kill the other god if there is none - deity.objectives += deicide - - if(!(locate(/datum/objective/escape_followers) in deity.objectives)) - var/datum/objective/escape_followers/recruit = new - recruit.owner = deity - deity.objectives += recruit - recruit.gen_amount_goal(8, 12) - - if(31 to 60) - var/datum/objective/sacrifice_prophet/sacrifice = new - sacrifice.owner = deity - deity.objectives += sacrifice - - if(!(locate(/datum/objective/escape_followers) in deity.objectives)) - var/datum/objective/escape_followers/recruit = new - recruit.owner = deity - deity.objectives += recruit - recruit.gen_amount_goal(8, 12) - - if(61 to 85) - var/datum/objective/build/build = new - build.owner = deity - deity.objectives += build - build.gen_amount_goal(8, 16) - - var/datum/objective/sacrifice_prophet/sacrifice = new - sacrifice.owner = deity - deity.objectives += sacrifice - - if(!(locate(/datum/objective/escape_followers) in deity.objectives)) - var/datum/objective/escape_followers/recruit = new - recruit.owner = deity - deity.objectives += recruit - recruit.gen_amount_goal(8, 12) - - else - if (!locate(/datum/objective/follower_block) in deity.objectives) - var/datum/objective/follower_block/block = new - block.owner = deity - deity.objectives += block - -/////////////// -//Greet procs// -/////////////// - -/datum/game_mode/proc/greet_hog_follower(datum/mind/follower_mind,colour) - if(follower_mind in blue_deity_prophets || follower_mind in red_deity_prophets) - follower_mind.current << "You have been appointed as the prophet of the [colour] deity! You are the only one who can communicate with your deity at will. Guide your followers, but be wary, for many will want you dead." - else if(colour) - follower_mind.current << "You are a follower of the [colour] cult's deity!" - else - follower_mind.current << "You are a follower of a cult's deity!" - - -///////////////// -//Convert procs// -///////////////// - -/datum/game_mode/proc/add_hog_follower(datum/mind/follower_mind, colour = "No Colour") - var/mob/living/carbon/human/H = follower_mind.current - if(isloyal(H)) - H << "Your mindshield implant blocked the influence of the [colour] deity. " - return 0 - if((follower_mind in red_deity_followers) || (follower_mind in red_deity_prophets) || (follower_mind in blue_deity_followers) || (follower_mind in blue_deity_prophets)) - H << "You already belong to a deity. Your strong faith has blocked out the conversion attempt by the followers of the [colour] deity." - return 0 - var/obj/item/weapon/nullrod/N = H.null_rod_check() - if(N) - H << "Your holy weapon prevented the [colour] deity from brainwashing you." - return 0 - - if(colour == "red") - red_deity_followers += follower_mind - if(colour == "blue") - blue_deity_followers += follower_mind - - H.faction |= "[colour] god" - follower_mind.current << "You are now a follower of the [colour] deity! Follow your deity's prophet in order to complete your deity's objectives. Convert crewmembers to your cause by using your deity's nexus. And remember - there is no you, there is only the cult." - update_hog_icons_added(follower_mind, colour) - follower_mind.special_role = "Hand of God: [capitalize(colour)] Follower" - follower_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the [colour] follower cult!" - return 1 - - -/datum/game_mode/proc/add_god(datum/mind/god_mind, colour = "No Colour") - remove_hog_follower(god_mind, announce = 0) - if(colour == "red") - red_deities += god_mind - if(colour == "blue") - blue_deities += god_mind - god_mind.current.attack_log += "\[[time_stamp()]\] Has been made into a [colour] deity!" - god_mind.special_role = "Hand of God: [colour] God" - update_hog_icons_added(god_mind, colour) - -////////////////// -//Deconvert proc// -////////////////// - -/datum/game_mode/proc/remove_hog_follower(datum/mind/follower_mind, announce = 1)//deconverts both - if(follower_mind.current) - if(is_handofgod_cultist(follower_mind.current) || is_handofgod_prophet(follower_mind.current)) - follower_mind.remove_hog_follower_prophet() - update_hog_icons_removed(follower_mind,"red") - update_hog_icons_removed(follower_mind,"blue") - - var/mob/living/carbon/human/H = follower_mind.current - H.faction -= "red god" - H.faction -= "blue god" - - if(announce) - follower_mind.current.attack_log += "\[[time_stamp()]\] Has been deconverted from a deity's cult!" - follower_mind.current << "Your mind has been cleared from the brainwashing the followers have done to you. Now you serve yourself and the crew." - for(var/mob/living/M in view(follower_mind.current)) - M << "[follower_mind.current] looks like their faith is shattered. They're no longer a cultist!" - - - -////////////////////// -// Mob helper procs // -////////////////////// - -/proc/is_handofgod_god(A) - if(istype(A, /mob/camera/god)) - return 1 - return 0 - - -/proc/is_handofgod_bluecultist(A) - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.mind) - if(H.mind in ticker.mode.blue_deity_followers|ticker.mode.blue_deity_prophets) - return 1 - return 0 - - -/proc/is_handofgod_redcultist(A) - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.mind) - if(H.mind in ticker.mode.red_deity_followers|ticker.mode.red_deity_prophets) - return 1 - return 0 - - -/proc/is_handofgod_blueprophet(A) - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.mind) - if(H.mind in ticker.mode.blue_deity_prophets) - return 1 - return 0 - - -/proc/is_handofgod_redprophet(A) - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.mind) - if(H.mind in ticker.mode.red_deity_prophets) - return 1 - return 0 - - - -/proc/is_handofgod_cultist(A) //any of them what so ever, blue, red, hot pink, whatever. - if(is_handofgod_redcultist(A)) - return 1 - if(is_handofgod_bluecultist(A)) - return 1 - return 0 - - -/proc/is_handofgod_prophet(A) //any of them what so ever, blue, red, hot pink, whatever - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.mind) - if(H.mind in ticker.mode.blue_deity_prophets|ticker.mode.red_deity_prophets) - return 1 - return 0 - - -/mob/camera/god/proc/is_handofgod_myprophet(A) - if(!ishuman(A)) - return 0 - var/mob/living/carbon/human/H = A - if(!H.mind) - return 0 - if(side == "red") - if(H.mind in ticker.mode.red_deity_prophets) - return 1 - else if(side == "blue") - if(H.mind in ticker.mode.blue_deity_prophets) - return 1 - - -/mob/camera/god/proc/is_handofgod_myfollowers(mob/A) - if(!ishuman(A)) - return 0 - var/mob/living/carbon/human/H = A - if(!H.mind) - return 0 - if(side == "red") - if(H.mind in ticker.mode.red_deity_prophets|ticker.mode.red_deity_followers) - return 1 - else if(side == "blue") - if(H.mind in ticker.mode.blue_deity_prophets|ticker.mode.blue_deity_followers) - return 1 - -////////////////////// -//Roundend Reporting// -////////////////////// - - -/datum/game_mode/hand_of_god/declare_completion() - if(red_deities.len) - var/text = "
The red cult:" - for(var/datum/mind/red_god in red_deities) - var/godwin = 1 - - text += "
[red_god.key] was the red deity, [red_god.name] (" - if(red_god.current) - if(red_god.current.stat == DEAD) - text += "died" - else - text += "survived" - else - text += "ceased existing" - text += ")" - if(red_deity_prophets.len) - for(var/datum/mind/red_prophet in red_deity_prophets) - text += "
The red prophet was [red_prophet.name] ([red_prophet.key])" - else - text += "
the red prophet was killed for their beliefs." - - text += "
Red follower count: [red_deity_followers.len]" - text += "
Red followers: " - for(var/datum/mind/player in red_deity_followers) - text += "[player.name] ([player.key]), " - - var/objectives = "" - if(red_god.objectives.len) - var/count = 1 - for(var/datum/objective/O in red_god.objectives) - if(O.check_completion()) - objectives += "
Objective #[count]: [O.explanation_text] Success!" - feedback_add_details("god_objective","[O.type]|SUCCESS") - else - objectives += "
Objective #[count]: [O.explanation_text] Fail." - feedback_add_details("god_objective","[O.type]|FAIL") - godwin = 0 - count++ - - text += objectives - - if(godwin) - text += "
The red cult and deity were successful!" - feedback_add_details("god_success","SUCCESS") - else - text += "
The red cult and deity have failed!" - feedback_add_details("god_success","FAIL") - - text += "
" - - world << text - - if(blue_deities.len) - var/text = "
The blue cult:" - for(var/datum/mind/blue_god in blue_deities) - var/godwin = 1 - - text += "
[blue_god.key] was the blue deity, [blue_god.name] (" - if(blue_god.current) - if(blue_god.current.stat == DEAD) - text += "died" - else - text += "survived" - else - text += "ceased existing" - text += ")" - if(blue_deity_prophets.len) - for(var/datum/mind/blue_prophet in blue_deity_prophets) - text += "
The blue prophet was [blue_prophet.name] ([blue_prophet.key])" - else - text += "
the blue prophet was killed for their beliefs." - - text += "
Blue follower count: [blue_deity_followers.len]" - text += "
Blue followers: " - for(var/datum/mind/player in blue_deity_followers) - text += "[player.name] ([player.key])" - - var/objectives = "" - if(blue_god.objectives.len) - var/count = 1 - for(var/datum/objective/O in blue_god.objectives) - if(O.check_completion()) - objectives += "
Objective #[count]: [O.explanation_text] Success!" - feedback_add_details("god_objective","[O.type]|SUCCESS") - else - objectives += "
Objective #[count]: [O.explanation_text] Fail." - feedback_add_details("god_objective","[O.type]|FAIL") - godwin = 0 - count++ - - text += objectives - - if(godwin) - text += "
The blue cult and deity were successful!" - feedback_add_details("god_success","SUCCESS") - else - text += "
The blue cult and deity have failed!" - feedback_add_details("god_success","FAIL") - - text += "
" - - world << text - - ..() - return 1 - - -/datum/game_mode/proc/update_hog_icons_added(datum/mind/hog_mind,side) - var/hud_key - var/rank = 0 - if(side == "red") - hud_key = ANTAG_HUD_HOG_RED - if(is_handofgod_redprophet(hog_mind.current)) - rank = 1 - - else if(side == "blue") - hud_key = ANTAG_HUD_HOG_BLUE - if(is_handofgod_blueprophet(hog_mind.current)) - rank = 1 - - if(is_handofgod_god(hog_mind.current)) - rank = 2 - - if(hud_key) - var/datum/atom_hud/antag/hog_hud = huds[hud_key] - hog_hud.join_hud(hog_mind.current) - set_antag_hud(hog_mind.current, "hog-[side]-[rank]") - - -/datum/game_mode/proc/update_hog_icons_removed(datum/mind/hog_mind,side) - var/hud_key - if(side == "red") - hud_key = ANTAG_HUD_HOG_RED - else if(side == "blue") - hud_key = ANTAG_HUD_HOG_BLUE - - if(hud_key) - var/datum/atom_hud/antag/hog_hud = huds[hud_key] - hog_hud.leave_hud(hog_mind.current) - set_antag_hud(hog_mind.current,null) diff --git a/code/game/gamemodes/handofgod/actions.dm b/code/game/gamemodes/handofgod/actions.dm deleted file mode 100644 index 766a2522fde..00000000000 --- a/code/game/gamemodes/handofgod/actions.dm +++ /dev/null @@ -1,28 +0,0 @@ -/* Prophet's innate godspeak */ -/datum/action/innate/godspeak - name = "Godspeak" - button_icon_state = "godspeak" - check_flags = AB_CHECK_CONSCIOUS - var/mob/camera/god/god = null - -/datum/action/innate/godspeak/IsAvailable() - if(..()) - if(god) - return 1 - return 0 - -/datum/action/innate/godspeak/Activate() - var/msg = input(owner,"Speak to your god","Godspeak","") as null|text - if(!msg) - return - var/rendered = "Prophet [owner]: [msg]" - god << rendered - owner << rendered - for(var/mob/M in mob_list) - if(isobserver(M)) - var/link = FOLLOW_LINK(M, owner) - M << "[link] [rendered]" - -/datum/action/innate/godspeak/Destroy() - god = null - return ..() diff --git a/code/game/gamemodes/handofgod/god.dm b/code/game/gamemodes/handofgod/god.dm deleted file mode 100644 index 5a238736052..00000000000 --- a/code/game/gamemodes/handofgod/god.dm +++ /dev/null @@ -1,290 +0,0 @@ - -/mob/camera/god - name = "deity" //Auto changes to the player's deity name/random name - real_name = "deity" - icon = 'icons/mob/mob.dmi' - icon_state = "marker" - invisibility = 60 - see_in_dark = 0 - see_invisible = 55 - sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF - languages_spoken = ALL - languages_understood = ALL - hud_possible = list(ANTAG_HUD) - mouse_opacity = 0 //can't be clicked - - var/faith = 100 //For initial prophet appointing/stupid purchase - var/max_faith = 100 - var/side = "neutral" //Red or Blue for the gamemode - var/obj/structure/divine/nexus/god_nexus = null //The source of the god's power in this realm, kill it and the god is kill - var/nexus_required = FALSE //If the god dies from losing it's nexus, defaults to off so that gods don't instantly die at roundstart - var/followers_required = 0 //Same as above - var/alive_followers = 0 - var/list/structures = list() - var/list/conduits = list() - var/prophets_sacrificed_in_name = 0 - var/image/ghostimage = null //For observer with darkness off visiblity - var/list/prophets = list() - var/datum/action/innate/godspeak/speak2god - -/mob/camera/god/New() - ..() - update_icons() - build_hog_construction_lists() - - //Force nexuses after 15 minutes in hand of god mode - if(ticker && ticker.mode && ticker.mode.name == "hand of god") - addtimer(src, "forceplacenexus", 9000, FALSE) - - -//Rebuilds the list based on the gamemode's lists -//As they are the most accurate each tick -/mob/camera/god/proc/get_my_followers() - switch(side) - if("red") - . = ticker.mode.red_deity_followers|ticker.mode.red_deity_prophets - if("blue") - . = ticker.mode.blue_deity_followers|ticker.mode.blue_deity_prophets - else - . = list() - - -/mob/camera/god/Destroy() - var/list/followers = get_my_followers() - for(var/datum/mind/F in followers) - if(F.current) - F.current << "Your god is DEAD!" - for(var/X in prophets) - speak2god.Remove(X) - ghost_darkness_images -= ghostimage - updateallghostimages() - return ..() - - - -/mob/camera/god/proc/forceplacenexus() - if(god_nexus) - return - - if(ability_cost(0,1,0)) - place_nexus() - - else - if(blobstart.len) //we're on invalid turf, try to pick from blobstart - loc = pick(blobstart) - place_nexus() //if blobstart fails, places on dense turf, but better than nothing - src << "You failed to place your nexus, and it has been placed for you!" - - -/mob/camera/god/update_icons() - icon_state = "[initial(icon_state)]-[side]" - - if(ghostimage) - ghost_darkness_images -= ghostimage - - ghostimage = image(src.icon,src,src.icon_state) - ghost_darkness_images |= ghostimage - updateallghostimages() - - -/mob/camera/god/Stat() - ..() - if(statpanel("Status")) - if(god_nexus) - stat("Nexus health: ", god_nexus.health) - stat("Followers: ", alive_followers) - stat("Faith: ", "[faith]/[max_faith]") - - -/mob/camera/god/Login() - ..() - sync_mind() - src << "You are a deity!" - src << "You are a deity and are worshipped by a cult! You are rather weak right now, but that will change as you gain more followers." - src << "You will need to place an anchor to this world, a Nexus, in two minutes. If you don't, one will be placed immediately below you." - src << "Your Follower count determines how many people believe in you and are a part of your cult." - src << "Your Nexus Integrity tells you the condition of your nexus. If your nexus is destroyed, you will die. Place your Nexus on a safe, isolated place, that is still accessible to your followers." - src << "Your Faith is used to interact with the world. This will regenerate on its own, and it goes faster when you have more followers and power pylons." - src << "The first thing you should do after placing your nexus is to appoint a prophet. Only prophets can hear you talk, unless you use an expensive power." - update_health_hud() - - -/mob/camera/god/update_health_hud() - if(god_nexus && hud_used && hud_used.healths) - hud_used.healths.maptext = "

[god_nexus.health]
" - - -/mob/camera/god/proc/add_faith(faith_amt) - if(faith_amt) - faith = round(Clamp(faith+faith_amt, 0, max_faith)) - if(hud_used && hud_used.deity_power_display) - hud_used.deity_power_display.maptext = "
[faith]
" - - - -/mob/camera/god/proc/place_nexus() - if(god_nexus || (z != 1)) - return 0 - - var/obj/structure/divine/nexus/N = new(get_turf(src)) - N.assign_deity(src) - god_nexus = N - nexus_required = TRUE - verbs -= /mob/camera/god/verb/constructnexus - //verbs += /mob/camera/god/verb/movenexus //Translocators have no sprite - update_health_hud() - - var/area/A = get_area(src) - if(A) - var/areaname = A.name - var/list/followers = get_my_followers() - for(var/datum/mind/F in followers) - if(F.current) - F.current << "Your god's nexus is in \the [areaname]" - - -/mob/camera/god/verb/freeturret() - set category = "Deity" - set name = "Free Turret (0)" - set desc = "Place a single turret, for 0 faith." - - if(!ability_cost(0,1,1)) - return - var/obj/structure/divine/defensepylon/DP = new(get_turf(src)) - DP.assign_deity(src) - verbs -= /mob/camera/god/verb/freeturret - - - -/mob/camera/god/proc/update_followers() - alive_followers = 0 - var/list/all_followers = get_my_followers() - for(var/datum/mind/F in all_followers) - if(F.current && F.current.stat != DEAD) - alive_followers++ - - if(hud_used && hud_used.deity_follower_display) - hud_used.deity_follower_display.maptext = "
[alive_followers]
" - - -/mob/camera/god/proc/check_death() - if(!alive_followers) - src << "You no longer have any followers. You shudder as you feel your existence cease..." - if(god_nexus && !qdeleted(god_nexus)) - god_nexus.visible_message("\The [src] suddenly disappears!") - qdel(god_nexus) - qdel(src) - - -/mob/camera/god/say(msg) - if(!msg) - return - if(client) - if(client.prefs.muted & MUTE_IC) - src << "You cannot send IC messages (muted)." - return - if(src.client.handle_spam_prevention(msg,MUTE_IC)) - return - if(stat) - return - - god_speak(msg) - - -/mob/camera/god/proc/god_speak(msg) - log_say("Hand of God: [capitalize(side)] God/[key_name(src)] : [msg]") - msg = trim(copytext(sanitize(msg), 1, MAX_MESSAGE_LEN)) - if(!msg) - return - - msg = say_quote(msg, get_spans()) - var/rendered = "Divine Telepathy, [name] [msg]" - src << rendered - - for(var/mob/M in mob_list) - if(is_handofgod_myfollowers(M)) - M << rendered - if(isobserver(M)) - var/link = FOLLOW_LINK(M, src) - M << "[link] [rendered]" - - -/mob/camera/god/emote(act,m_type = 1 ,msg = null) - return - - -/mob/camera/god/Move(NewLoc, Dir = 0) - loc = NewLoc - - - -/mob/camera/god/Topic(href, href_list) - if(href_list["create_structure"]) - if(!ability_cost(75,1,1)) - return - - var/obj/structure/divine/construct_type = text2path(href_list["create_structure"]) //it's a path but we need to initial() some vars - if(!construct_type) - return - - add_faith(-75) - var/obj/structure/divine/construction_holder/CH = new(get_turf(src)) - CH.assign_deity(src) - CH.setup_construction(construct_type) - CH.visible_message("[src] has created a transparent, unfinished [initial(construct_type.name)]. It can be finished by adding materials.") - src << "You may click a construction site to cancel it, but only faith is refunded." - structure_construction_ui(src) - return - - if(href_list["place_trap"]) - if(!ability_cost(20,1,1)) - return - - var/atom/trap_type = text2path(href_list["place_trap"]) - if(!trap_type) - return - - src << "You lay \a [initial(trap_type.name)]" - add_faith(-20) - new trap_type(get_turf(src)) - return - - ..() - - -/mob/camera/god/proc/structure_construction_ui(mob/camera/god/user) - var/dat = "" - for(var/t in global_handofgod_structuretypes) - if(global_handofgod_structuretypes[t]) - var/obj/structure/divine/apath = global_handofgod_structuretypes[t] - dat += "
[capitalize(t)]

" - var/imgstate = initial(apath.autocolours) ? "[initial(apath.icon_state)]-[side]" : "[initial(apath.icon_state)]" - var/icon/I = icon('icons/obj/hand_of_god_structures.dmi',imgstate) - var/img_component = lowertext(t) - //I hate byond, but atleast it autocaches these so it's only 1*number_of_structures worth of actual calls - user << browse_rsc(I,"hog_structure-[img_component].png") - dat += "
" - dat += "Description: [initial(apath.desc)]
" - dat += "
Construct [capitalize(t)]


" - - var/datum/browser/popup = new(src, "structures","Construct Structure",350,500) - popup.set_content(dat) - popup.open() - - -/mob/camera/god/proc/trap_construction_ui(mob/camera/god/user) - var/dat = "" - for(var/t in global_handofgod_traptypes) - if(global_handofgod_traptypes[t]) - var/obj/structure/divine/trap/T = global_handofgod_traptypes[t] - dat += "
[capitalize(t)]

" - var/icon/I = icon('icons/obj/hand_of_god_structures.dmi',"[initial(T.icon_state)]") - var/img_component = lowertext(t) - user << browse_rsc(I,"hog_trap-[img_component].png") - dat += "
" - dat += "Description: [initial(T.desc)]
" - dat += "
Place [capitalize(t)]


" - - var/datum/browser/popup = new(src, "traps", "Place Trap",350,500) - popup.set_content(dat) - popup.open() diff --git a/code/game/gamemodes/handofgod/objectives.dm b/code/game/gamemodes/handofgod/objectives.dm deleted file mode 100644 index dc31d67f46c..00000000000 --- a/code/game/gamemodes/handofgod/objectives.dm +++ /dev/null @@ -1,129 +0,0 @@ - -/datum/objective/build - dangerrating = 15 - martyr_compatible = 1 - - -/datum/objective/build/proc/gen_amount_goal(lower, upper) - target_amount = rand(lower, upper) - explanation_text = "Build [target_amount] shrines." - return target_amount - - -/datum/objective/build/check_completion() - if(!owner || !owner.current) - return 0 - - var/shrines = 0 - if(is_handofgod_god(owner.current)) - var/mob/camera/god/G = owner.current - for(var/obj/structure/divine/shrine/S in G.structures) - S++ - - return (shrines >= target_amount) - - - -/datum/objective/deicide - dangerrating = 20 - martyr_compatible = 1 - -/datum/objective/deicide/check_completion() - if(target) - if(target.current) //Gods are deleted when they lose - return 0 - return 1 - - -/datum/objective/deicide/find_target() - if(!owner || !owner.current) - return - - if(is_handofgod_god(owner.current)) - var/mob/camera/god/G = owner.current - if(G.side == "red") - if(ticker.mode.blue_deities.len) - target = ticker.mode.blue_deities[1] - if(G.side == "blue") - if(ticker.mode.red_deities.len) - target = ticker.mode.red_deities[1] - if(!target) - return 0 - update_explanation_text() - -/datum/objective/deicide/update_explanation_text() - ..() - if(target && target.current) - explanation_text = "Phase [target.name], the false god, out of this plane of existence.." - else - explanation_text = "Free Objective" - - - -/datum/objective/follower_block - explanation_text = "Do not allow any followers of the false god to escape on the station's shuttle alive." - dangerrating = 25 - martyr_compatible = 1 - -/datum/objective/follower_block/check_completion() - var/side = "ABORT" - if(is_handofgod_redcultist(owner.current)) - side = "red" - else if(is_handofgod_bluecultist(owner.current)) - side = "blue" - if(side == "ABORT") - return 0 - - var/area/A = SSshuttle.emergency.areaInstance - - for(var/mob/living/player in player_list) - if(player.mind && player.stat != DEAD && get_area(player) == A) - if(side == "red") - if(is_handofgod_bluecultist(player)) - return 0 - else if(side == "blue") - if(is_handofgod_redcultist(player)) - return 0 - return 1 - - - -/datum/objective/escape_followers - dangerrating = 5 - - -/datum/objective/escape_followers/proc/gen_amount_goal(lower,upper) - target_amount = rand(lower,upper) - explanation_text = "Your will must surpass this station. Having [target_amount] followers escape on the shuttle or pods will allow that." - return target_amount - - -/datum/objective/escape_followers/check_completion() - var/escaped = 0 - if(is_handofgod_god(owner.current)) - var/mob/camera/god/G = owner.current - if(G.side == "red") - for(var/datum/mind/follower_mind in ticker.mode.red_deity_followers) - if(follower_mind.current && follower_mind.current.stat != DEAD) - if(follower_mind.current.onCentcom()) - escaped++ - - if(G.side == "blue") - for(var/datum/mind/follower_mind in ticker.mode.blue_deity_followers) - if(follower_mind.current && follower_mind.current.stat != DEAD) - if(follower_mind.current.onCentcom()) - escaped++ - - return (escaped >= target_amount) - - -/datum/objective/sacrifice_prophet - explanation_text = "A false prophet is preaching their god's faith on the station. Sacrificing them will show the mortals who the true god is." - dangerrating = 10 - - -/datum/objective/sacrifice_prophet/check_completion() - var/mob/camera/god/G = owner.current - if(istype(G)) - return G.prophets_sacrificed_in_name - return 0 diff --git a/code/game/gamemodes/handofgod/powers.dm b/code/game/gamemodes/handofgod/powers.dm deleted file mode 100644 index 30b3365cfcd..00000000000 --- a/code/game/gamemodes/handofgod/powers.dm +++ /dev/null @@ -1,363 +0,0 @@ -/mob/camera/god/proc/ability_cost(cost = 0,structures = 0, requires_conduit = 0, can_place_near_enemy_nexus = 0) - if(faith < cost) - src << "You lack the faith!" - return 0 - - if(structures) - if(!isturf(loc) || istype(loc, /turf/open/space)) - src << "Your structure would just float away, you need stable ground!" - return 0 - - var/turf/T = get_turf(src) - if(T) - if(T.density) - src << "There is something blocking your structure!" - return 0 - - for(var/atom/movable/AM in T) - if(AM == src) - continue - if(AM.density) - src << "There is something blocking your structure!" - return 0 - - if(requires_conduit) - //Organised this way as there can be multiple conduits, so it's more likely to be a conduit check. - var/valid = 0 - - for(var/obj/structure/divine/conduit/C in conduits) - if(get_dist(src, C) <= CONDUIT_RANGE) - valid++ - break - - if(!valid) - if(get_dist(src, god_nexus) <= CONDUIT_RANGE) - valid++ - - if(!valid) - src << "You must be near your Nexus or a Conduit to do this!" - return 0 - - if(!can_place_near_enemy_nexus) - var/datum/mind/enemy - switch(side) - if("red") - if(ticker.mode.blue_deities.len) - enemy = ticker.mode.blue_deities[1] - if("blue") - if(ticker.mode.red_deities.len) - enemy = ticker.mode.red_deities[1] - - if(enemy && is_handofgod_god(enemy.current)) - var/mob/camera/god/enemy_god = enemy.current - if(enemy_god.god_nexus && (get_dist(src,enemy_god.god_nexus) <= CONDUIT_RANGE*2)) - src << "You are too close to the other god's stronghold!" - return 0 - - return 1 - - -/mob/camera/god/verb/returntonexus() - set category = "Deity" - set name = "Goto Nexus" - set desc = "Teleports you to your next instantly." - - if(god_nexus) - Move(get_turf(god_nexus)) - else - src << "You don't even have a Nexus, construct one." - - -/mob/camera/god/verb/jumptofollower() - set category = "Deity" - set name = "Jump to Follower" - set desc = "Teleports you to one of your followers." - var/list/following = list() - if(side == "red") - following = ticker.mode.red_deity_followers|ticker.mode.red_deity_prophets - else if(side == "blue") - following = ticker.mode.blue_deity_followers|ticker.mode.blue_deity_prophets - else - src << "You are unaligned, and thus do not have followers" - return - - var/datum/mind/choice = input("Choose a follower","Jump to Follower") as null|anything in following - if(choice && choice.current) - Move(get_turf(choice.current)) - - -/mob/camera/god/verb/newprophet() - set category = "Deity" - set name = "Appoint Prophet (100)" - set desc = "Appoint one of your followers as your Prophet, who can hear your words" - - var/list/following = list() - - if(!ability_cost(100)) - return - if(side == "red") - var/datum/mind/old_proph = locate() in ticker.mode.red_deity_prophets - if(old_proph && old_proph.current && old_proph.current.stat != DEAD) - src << "You can only have one prophet alive at a time." - return - else - following = ticker.mode.red_deity_followers - else if(side == "blue") - var/datum/mind/old_proph = locate() in ticker.mode.blue_deity_prophets - if(old_proph && old_proph.current && old_proph.current.stat != DEAD) - src << "You can only have one prophet alive at a time." - return - else - following = ticker.mode.blue_deity_followers - - else - src << "You are unalligned, and thus do not have prophets" - return - - var/datum/mind/choice = input("Choose a follower to make into your prophet","Prophet Uplifting") as null|anything in following - if(choice && choice.current && choice.current.stat != DEAD) - src << "You choose [choice.current] as your prophet." - choice.make_Handofgod_prophet(side) - speak2god = new() - speak2god.god = src - speak2god.Grant(choice.current) - - //Prophet gear - var/mob/living/carbon/human/H = choice.current - var/popehat = null - var/popestick = null - var/success = "" - switch(side) - if("red") - popehat = /obj/item/clothing/head/helmet/plate/crusader/prophet/red - popestick = /obj/item/weapon/godstaff/red - if("blue") - popehat = /obj/item/clothing/head/helmet/plate/crusader/prophet/blue - popestick = /obj/item/weapon/godstaff/blue - - if(popehat) - var/obj/item/clothing/head/helmet/plate/crusader/prophet/P = new popehat() - - if(H.equip_to_slot_if_possible(P,slot_in_backpack,0,1,1)) - success = "It is in your backpack." - else - H.unEquip(H.head) - H.equip_to_slot_or_del(P,slot_head) - success = "It is on your head." - - if(success) - H << "A powerful hat has been bestowed upon you, you will need to wear it to utilize your staff fully." - H << "[success]" - - if(popestick) - var/obj/item/weapon/godstaff/G = new popestick() - G.god = src - if(!H.equip_to_slot_if_possible(G,slot_in_backpack,0,1,1)) - if(!H.put_in_hands(G)) - G.loc = get_turf(H) - success = "It is on the floor..." - else - success = "It is in your hands..." - else - success = "It is in your backpack..." - - if(success) - H << "A powerful staff has been bestowed upon you, you can use this to convert the false god's structures!" - H << "[success]" - //end prophet gear - - add_faith(-100) - - -/mob/camera/god/verb/talk(msg as text) - set category = "Deity" - set name = "Talk to Anyone (20)" - set desc = "Allows you to send a message to anyone, regardless of their faith." - if(!ability_cost(20)) - return - var/mob/choice = input("Choose who you wish to talk to", "Talk to ANYONE") as null|anything in mob_list - if(choice) - var/original = msg - msg = "You hear a voice coming from everywhere and nowhere... [msg]" - choice << msg - src << "You say the following to [choice], [original]" - add_faith(-20) - - -/mob/camera/god/verb/smite() - set category = "Deity" - set name = "Smite (40)" - set desc = "Hits anything under you with a moderate amount of damage." - - if(!ability_cost(40,0,1)) - return - if(!range(7,god_nexus)) - src << "You lack the strength to smite this far from your nexus." - return - - var/has_smitten = 0 //Hast thou been smitten, infidel? - for(var/mob/living/L in get_turf(src)) - L.adjustFireLoss(20) - L.adjustBruteLoss(20) - L << "You feel the wrath of [name]!" - has_smitten = 1 - if(has_smitten) - add_faith(-40) - - -/mob/camera/god/verb/disaster() - set category = "Deity" - set name = "Invoke Disaster (300)" //difficult to reach without lots of followers - set desc = "Tug at the fibres of reality itself and bend it to your whims!" - - if(!ability_cost(300,0,1)) - return - - var/event = pick(/datum/round_event/meteor_wave, /datum/round_event/communications_blackout, /datum/round_event/radiation_storm, /datum/round_event/carp_migration, - /datum/round_event/spacevine, /datum/round_event/vent_clog, /datum/round_event/wormholes) - if(event) - new event() - add_faith(-300) - - -/mob/camera/god/verb/constructnexus() - set category = "Deity" - set name = "Construct Nexus" - set desc = "Instantly creates your nexus, You can only do this once, make sure you're happy with it!" - - if(!ability_cost(0,1,0)) - return - - place_nexus() - - -/* //Transolocators have no sprite -/mob/camera/god/verb/movenexus() - set category = "Deity" - set name = "Relocate Nexus (50)" - set desc = "Instantly relocates your nexus to an existing translocator belonging to your faith, this destroys the translocator in the process" - - if(ability_cost(50,0,0) && god_nexus) - var/list/translocators = list() - var/list/used_keys = list() - for(var/obj/structure/divine/translocator/T in structures) - translocators["[T.name] ([get_area(T)])"] = T - - if(!translocators.len) - src << "You have no translocators!" - return - - var/picked = input(src,"Choose a translocator","Relocate Nexus") as null|anything in translocators - if(!picked || !translocators[picked]) - return - - var/obj/structure/divine/translocator/T = translocators[T] - var/turf/Tturf = get_turf(T) - god_nexus.loc = T - translocators[picked] = null - add_faith(-50) - qdel(T) -*/ - -/mob/camera/god/verb/construct_structures() - set category = "Deity" - set name = "Construct Structure (75)" - set desc = "Create the foundation of a divine object." - - if(!ability_cost(75,1,1)) - return - - structure_construction_ui(src) - - -/mob/camera/god/verb/construct_traps() - set category = "Deity" - set name = "Construct Trap (20)" - set desc = "Creates a ward or trap." - - if(!ability_cost(20,1,1)) - return - - trap_construction_ui(src) - - - -/mob/camera/god/verb/construct_items() - set category = "Deity" - set name = "Construct Items (20)" - set desc = "Construct some items for your followers" - - if(!ability_cost(20,1,1)) - return - - var/list/item_types = list("claymore sword" = /obj/item/weapon/claymore/hog) - if(side == "red") - item_types["red banner"] = /obj/item/weapon/banner/red - item_types["red bannerbackpack"] = /obj/item/weapon/storage/backpack/bannerpack/red - item_types["red armour"] = /obj/item/weapon/storage/box/itemset/crusader/red - - else if(side == "blue") - item_types["blue banner"] = /obj/item/weapon/banner/blue - item_types["blue bannerbackpack"] = /obj/item/weapon/storage/backpack/bannerpack/blue - item_types["blue armour"] = /obj/item/weapon/storage/box/itemset/crusader/blue - - - var/item = input("Choose what you wish to create.", "Divine Items") as null|anything in item_types - if(!item || !item_types[item] || !ability_cost(20,1,1)) - return - - src << "You produce \a [item]" - add_faith(-20) - - var/itemtype = item_types[item] - new itemtype (get_turf(src)) - - - -/mob/camera/god/verb/veil_structures() - set category = "Deity" - set name = "Veil Structures (20)" - set desc = "Hide your structures from sight and touch, but prevent yourself from using them." - - if(!ability_cost(20,1,1)) - return - - src << "You focus your powers and start dragging your influence into the spiritual plane." - for(var/mob/M in orange(3,src))//Yes I know this is terrible, but visible message doesnt work for this - M << "The air begins to shimmer..." - if(do_after(src, 30, 0, src)) - for(var/obj/structure/divine/R in orange(3,src)) - if(istype(R, /obj/structure/divine/nexus)|| istype(R, /obj/structure/divine/trap)||(src.side != R.side)) - continue - R.visible_message("[R] fades away.") - R.invisibility = 55 - R.alpha = 100 //To help ghosts distinguish hidden structures - R.density = 0 - R.deactivate() - src << "You hide your influence from view" - add_faith(-20) - - -/mob/camera/god/verb/reveal_structures() - set category = "Deity" - set name = "Reveal Structures (20)" - set desc = "Make your structures visible again and allow them to be used." - - if(!ability_cost(20,1,1)) - return - - src << "You focus your powers and start dragging your influence into the material plane." - for(var/mob/M in orange(3,src))//Yes I know this is terrible, but visible message doesnt work for this - M << "The air begins to shimmer..." - if(do_after(src, 40, 0, src)) - for(var/obj/structure/divine/R in orange(3,src)) - if(istype(R, /obj/structure/divine/nexus)|| istype(R, /obj/structure/divine/trap)||(src.side != R.side)) - continue - R.visible_message("[R] suddenly appears!") - R.invisibility = 0 - R.alpha = initial(R.alpha) - R.density = initial(R.density) - R.activate() - src << "You bring your influence into view" - add_faith(-20) - diff --git a/code/game/gamemodes/handofgod/structures.dm b/code/game/gamemodes/handofgod/structures.dm deleted file mode 100644 index 79d6615d06b..00000000000 --- a/code/game/gamemodes/handofgod/structures.dm +++ /dev/null @@ -1,661 +0,0 @@ - -/proc/build_hog_construction_lists() - if(global_handofgod_traptypes.len && global_handofgod_structuretypes.len) - return - - var/list/types = subtypesof(/obj/structure/divine) - /obj/structure/divine/trap - for(var/T in types) - var/obj/structure/divine/D = T - if(initial(D.constructable)) - if(initial(D.trap)) - global_handofgod_traptypes[initial(D.name)] = T - else - global_handofgod_structuretypes[initial(D.name)] = T - -/obj/structure/divine - name = "divine construction site" - icon = 'icons/obj/hand_of_god_structures.dmi' - desc = "An unfinished divine building" - anchored = 1 - density = 1 - var/constructable = TRUE - var/trap = FALSE - var/metal_cost = 0 - var/glass_cost = 0 - var/lesser_gem_cost = 0 - var/greater_gem_cost = 0 - var/mob/camera/god/deity - var/side = "neutral" //"blue" or "red", also used for colouring structures when construction is started by a deity - var/health = 100 - var/maxhealth = 100 - var/deactivated = 0 //Structures being hidden can't be used. Mainly to prevent invisible defense pylons. - var/autocolours = TRUE //do we colour to our side? - -/obj/structure/divine/New() - ..() - -/obj/structure/divine/proc/deactivate() - deactivated = 1 - -/obj/structure/divine/proc/activate() - deactivated = 0 - - -/obj/structure/divine/proc/update_icons() - if(autocolours) - icon_state = "[initial(icon_state)]-[side]" - - -/obj/structure/divine/Destroy() - if(deity) - deity.structures -= src - return ..() - - - -/obj/structure/divine/attackby(obj/item/I, mob/user) - - //Structure conversion/capture - if(istype(I, /obj/item/weapon/godstaff)) - if(!is_handofgod_cultist(user)) - user << "You're not quite sure what the hell you're even doing." - return - var/obj/item/weapon/godstaff/G = I - if(G.god && deity != G.god) - assign_deity(G.god, alert_old_deity = TRUE) - visible_message("\The [src] has been captured by [user]!") - else - return ..() - -/obj/structure/divine/attacked_by(obj/item/I, mob/living/user) - ..() - take_damage(I.force, I.damtype, 1) - -/obj/structure/divine/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1) - switch(damage_type) - if(BRUTE) - if(sound_effect) - if(damage) - playsound(loc, 'sound/weapons/smash.ogg', 50, 1) - else - playsound(loc, 'sound/weapons/tap.ogg', 50, 1) - if(BURN) - if(sound_effect) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - else - return - health -= damage - if(!health) - visible_message("\The [src] was destroyed!") - qdel(src) - - -/obj/structure/divine/bullet_act(obj/item/projectile/P) - . = ..() - take_damage(P.damage, P.damage_type, 0) - - -/obj/structure/divine/attack_alien(mob/living/carbon/alien/humanoid/user) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - add_hiddenprint(user) - visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - take_damage(20, BRUTE, 0) - -/obj/machinery/attack_animal(mob/living/simple_animal/M) - M.changeNext_move(CLICK_CD_MELEE) - M.do_attack_animation(src) - if(M.melee_damage_upper > 0 || M.obj_damage) - M.visible_message("[M.name] smashes against \the [src.name].",\ - "You smash against the [src.name].") - if(M.obj_damage) - take_damage(M.obj_damage, M.melee_damage_type, 1) - else - take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1) - - -/obj/structure/divine/proc/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE) - if(!new_deity) - return 0 - if(deity) - if(alert_old_deity) - deity << "Your [name] was captured by [new_deity]'s cult!" - deity.structures -= src - deity = new_deity - deity.structures |= src - side = deity.side - update_icons() - return 1 - - -/obj/structure/divine/construction_holder - alpha = 125 - constructable = FALSE - var/obj/structure/divine/construction_result = /obj/structure/divine //a path, but typed to /obj/structure/divine for initial() - - - -/obj/structure/divine/construction_holder/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE) - if(..()) - color = side - - -/obj/structure/divine/construction_holder/attack_god(mob/camera/god/user) - if(user.side == side && construction_result) - user.add_faith(75) - visible_message("[user] has cancelled \the [initial(construction_result.name)]") - qdel(src) - - -/obj/structure/divine/construction_holder/proc/setup_construction(construct_type) - if(ispath(construct_type)) - construction_result = construct_type - name = "[initial(construction_result.name)] construction site " - icon_state = initial(construction_result.icon_state) - metal_cost = initial(construction_result.metal_cost) - glass_cost = initial(construction_result.glass_cost) - lesser_gem_cost = initial(construction_result.lesser_gem_cost) - greater_gem_cost = initial(construction_result.greater_gem_cost) - desc = "An unfinished [initial(construction_result.name)]." - - -/obj/structure/divine/construction_holder/attackby(obj/item/I, mob/user) - if(!I || !user) - return 0 - - if(istype(I, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = I - if(metal_cost) - var/spend = min(metal_cost, M.amount) - user << "You add [spend] metal to \the [src]." - metal_cost = max(0, metal_cost - spend) - M.use(spend) - check_completion() - else - user << "\The [src] does not require any more metal!" - return - - if(istype(I, /obj/item/stack/sheet/glass)) - var/obj/item/stack/sheet/glass/G = I - if(glass_cost) - var/spend = min(glass_cost, G.amount) - user << "You add [spend] glass to \the [src]." - glass_cost = max(0, glass_cost - spend) - G.use(spend) - check_completion() - else - user << "\The [src] does not require any more glass!" - return - - if(istype(I, /obj/item/stack/sheet/lessergem)) - var/obj/item/stack/sheet/lessergem/LG = I - if(lesser_gem_cost) - var/spend = min(lesser_gem_cost, LG.amount) - user << "You add [spend] lesser gems to \the [src]." - lesser_gem_cost = max(0, lesser_gem_cost - spend) - LG.use(spend) - check_completion() - else - user << "\The [src] does not require any more lesser gems!" - return - - if(istype(I, /obj/item/stack/sheet/greatergem)) - var/obj/item/stack/sheet/greatergem/GG = I //GG! - if(greater_gem_cost) - var/spend = min(greater_gem_cost, GG.amount) - user << "You add [spend] greater gems to \the [src]." - greater_gem_cost = max(0, greater_gem_cost - spend) - GG.use(spend) - check_completion() - else - user << "\The [src] does not require any more greater gems!" - return - - else - return ..() - - -/obj/structure/divine/construction_holder/proc/check_completion() - if(!metal_cost && !glass_cost && !lesser_gem_cost && !greater_gem_cost) - visible_message("\The [initial(construction_result.name)] is complete!") - var/obj/structure/divine/D = new construction_result (get_turf(src)) - D.assign_deity(deity) - qdel(src) - - -/obj/structure/divine/construction_holder/examine(mob/user) - ..() - - if(metal_cost || glass_cost || lesser_gem_cost || greater_gem_cost) - user << "To finish construction it requires the following materials:" - if(metal_cost) - user << "[metal_cost] metal " - if(glass_cost) - user << "[glass_cost] glass " - if(lesser_gem_cost) - user << "[lesser_gem_cost] lesser gems " - if(greater_gem_cost) - user << "[greater_gem_cost] greater gems " - - -/obj/structure/divine/nexus - name = "nexus" - desc = "It anchors a deity to this world. It radiates an unusual aura. Cultists protect this at all costs. It looks well protected from explosive shock." - icon_state = "nexus" - health = 500 - maxhealth = 500 - constructable = FALSE - var/faith_regen_rate = 1 - var/list/powerpylons = list() - - -/obj/structure/divine/nexus/ex_act() - return - -/obj/structure/divine/nexus/take_damage(damage, damage_type = BRUTE, sound_effect = 1) - switch(damage_type) - if(BRUTE) - if(sound_effect) - if(damage) - playsound(loc, 'sound/weapons/smash.ogg', 50, 1) - else - playsound(loc, 'sound/weapons/tap.ogg', 50, 1) - if(BURN) - if(sound_effect) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - else - return - health -= damage - if(deity) - deity.update_health_hud() - if(!health) - if(!qdeleted(deity) && deity.nexus_required) - deity << "Your nexus was destroyed. You feel yourself fading..." - qdel(deity) - visible_message("\The [src] was destroyed!") - qdel(src) - - -/obj/structure/divine/nexus/New() - START_PROCESSING(SSobj, src) - - -/obj/structure/divine/nexus/process() - if(deity) - deity.update_followers() - deity.add_faith(faith_regen_rate + (powerpylons.len / 5) + (deity.alive_followers / 3)) - deity.max_faith = initial(deity.max_faith) + (deity.alive_followers*10) //10 followers = 100 max faith, so disaster() at around 20 followers - deity.check_death() - - -/obj/structure/divine/nexus/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - - -/obj/structure/divine/conduit - name = "conduit" - desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus." - icon_state = "conduit" - health = 150 - maxhealth = 150 - metal_cost = 10 - glass_cost = 5 - - -/obj/structure/divine/conduit/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE) - if(deity) - deity.conduits -= src - ..() - if(deity) - deity.conduits += src - -/obj/structure/divine/conduit/deactivate() - ..() - if(deity) - deity.conduits -= src - -/obj/structure/divine/conduit/activate() - ..() - if(deity) - deity.conduits += src - -/* //No good sprites, and not enough items to make it viable yet -/obj/structure/divine/forge - name = "forge" - desc = "A forge fueled by divine might, it allows the creation of sacred and powerful artifacts. It requires common materials to craft objects." - icon_state = "forge" - health = 250 - maxhealth = 250 - density = 0 - maxhealth = 250 - metal_cost = 40 -*/ - -/obj/structure/divine/convertaltar - name = "conversion altar" - desc = "An altar dedicated to a deity. Cultists can \"forcefully teach\" their non-aligned crewmembers to join their side and take up their deity." - icon_state = "convertaltar" - density = 0 - metal_cost = 10 - can_buckle = 1 - - -/obj/structure/divine/convertaltar/attack_hand(mob/living/user) - ..() - if(deactivated) - return - var/mob/living/carbon/human/H = locate() in get_turf(src) - if(!is_handofgod_cultist(user)) - user << "You try to use it, but unfortunately you don't know any rituals." - return - if(!H) - return - if(!H.mind) - user << "Only sentients may serve your deity." - return - if((side == "red" && is_handofgod_redcultist(user) && !is_handofgod_redcultist(H)) || (side == "blue" && is_handofgod_bluecultist(user) && !is_handofgod_bluecultist(H))) - user << "You invoke the conversion ritual." - ticker.mode.add_hog_follower(H.mind, side) - else - user << "You invoke the conversion ritual." - user << "But the altar ignores your words..." - - -/obj/structure/divine/sacrificealtar - name = "sacrificial altar" - desc = "An altar designed to perform blood sacrifice for a deity. The cultists performing the sacrifice will gain a powerful material to use in their forge. Sacrificing a prophet will yield even better results." - icon_state = "sacrificealtar" - density = 0 - metal_cost = 15 - can_buckle = 1 - - -/obj/structure/divine/sacrificealtar/attack_hand(mob/living/user) - ..() - if(deactivated) - return - var/mob/living/L = locate() in get_turf(src) - if(!is_handofgod_cultist(user)) - user << "You try to use it, but unfortunately you don't know any rituals." - return - if(!L) - return - if((side == "red" && is_handofgod_redcultist(user)) || (side == "blue" && is_handofgod_bluecultist(user))) - if((side == "red" && is_handofgod_redcultist(L)) || (side == "blue" && is_handofgod_bluecultist(L))) - user << "You cannot sacrifice a fellow cultist." - return - user << "You attempt to sacrifice [L] by invoking the sacrificial ritual." - sacrifice(L) - else - user << "You attempt to sacrifice [L] by invoking the sacrificial ritual." - user << "But the altar ignores your words..." - - -/obj/structure/divine/sacrificealtar/proc/sacrifice(mob/living/L) - if(!L) - L = locate() in get_turf(src) - if(L) - if(ismonkey(L)) - var/luck = rand(1,4) - if(luck > 3) - new /obj/item/stack/sheet/lessergem(get_turf(src)) - - else if(ishuman(L)) - var/mob/living/carbon/human/H = L - - //Sacrifice altars can't teamkill - if(side == "red" && is_handofgod_redcultist(H)) - return - else if(side == "blue" && is_handofgod_bluecultist(H)) - return - - if(is_handofgod_prophet(H)) - new /obj/item/stack/sheet/greatergem(get_turf(src)) - if(deity) - deity.prophets_sacrificed_in_name++ - else - new /obj/item/stack/sheet/lessergem(get_turf(src)) - - else if(isAI(L) || istype(L, /mob/living/carbon/alien/humanoid/royal/queen)) - new /obj/item/stack/sheet/greatergem(get_turf(src)) - else - new /obj/item/stack/sheet/lessergem(get_turf(src)) - L.gib() - - -/obj/structure/divine/healingfountain - name = "healing fountain" - desc = "A fountain containing the waters of life... or death, depending on where your allegiances lie." - icon_state = "fountain" - metal_cost = 10 - glass_cost = 5 - autocolours = FALSE - var/time_between_uses = 1800 - var/last_process = 0 - var/cult_only = TRUE - -/obj/structure/divine/healingfountain/anyone - desc = "A fountain containing the waters of life." - cult_only = FALSE - -/obj/structure/divine/healingfountain/attack_hand(mob/living/user) - if(deactivated) - return - if(last_process + time_between_uses > world.time) - user << "The fountain appears to be empty." - return - last_process = world.time - if(!is_handofgod_cultist(user) && cult_only) - user << "The water burns!" - user.reagents.add_reagent("hell_water",20) - else - user << "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards." - user.reagents.add_reagent("godblood",20) - update_icons() - addtimer(src, "update_icons", time_between_uses) - - -/obj/structure/divine/healingfountain/update_icons() - if(last_process + time_between_uses > world.time) - icon_state = "fountain" - else - icon_state = "fountain-[side]" - - -/obj/structure/divine/powerpylon - name = "power pylon" - desc = "A pylon which increases the deity's rate it can influence the world." - icon_state = "powerpylon" - density = 1 - health = 30 - maxhealth = 30 - metal_cost = 5 - glass_cost = 15 - - -/obj/structure/divine/powerpylon/New() - ..() - if(deity && deity.god_nexus) - deity.god_nexus.powerpylons += src - - -/obj/structure/divine/powerpylon/Destroy() - if(deity && deity.god_nexus) - deity.god_nexus.powerpylons -= src - return ..() - - -/obj/structure/divine/powerpylon/deactivate() - ..() - if(deity) - deity.god_nexus.powerpylons -= src - -/obj/structure/divine/powerpylon/activate() - ..() - if(deity) - deity.god_nexus.powerpylons += src - -/obj/structure/divine/defensepylon - name = "defense pylon" - desc = "A pylon which is blessed to withstand many blows, and fire strong bolts at nonbelievers. A god can toggle it." - icon_state = "defensepylon" - health = 150 - maxhealth = 150 - metal_cost = 25 - glass_cost = 30 - var/obj/machinery/porta_turret/defensepylon_internal_turret/pylon_gun - - -/obj/structure/divine/defensepylon/New() - ..() - pylon_gun = new(src) - pylon_gun.base = src - pylon_gun.faction = list("[side] god") - - -/obj/structure/divine/defensepylon/Destroy() - qdel(pylon_gun) //just in case - return ..() - - -/obj/structure/divine/defensepylon/examine(mob/user) - ..() - user << "\The [src] looks [pylon_gun.on ? "on" : "off"]." - - -/obj/structure/divine/defensepylon/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE) - if(..() && pylon_gun) - pylon_gun.faction = list("[side] god") - pylon_gun.side = side - -/obj/structure/divine/defensepylon/attack_god(mob/camera/god/user) - if(user.side == side) - if(deactivated) - user << "You need to reveal it first!" - return - pylon_gun.on = !pylon_gun.on - icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" - -/obj/structure/divine/defensepylon/deactivate() - ..() - pylon_gun.on = 0 - icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" - -/obj/structure/divine/defensepylon/activate() - ..() - pylon_gun.on = 1 - icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" - -//This sits inside the defensepylon, to avoid copypasta -/obj/machinery/porta_turret/defensepylon_internal_turret - name = "defense pylon" - desc = "A plyon which is blessed to withstand many blows, and fire strong bolts at nonbelievers." - icon = 'icons/obj/hand_of_god_structures.dmi' - installation = null - always_up = 1 - use_power = 0 - has_cover = 0 - health = 200 - projectile = /obj/item/projectile/beam/pylon_bolt - eprojectile = /obj/item/projectile/beam/pylon_bolt - shot_sound = 'sound/weapons/emitter2.ogg' - eshot_sound = 'sound/weapons/emitter2.ogg' - base_icon_state = "defensepylon" - active_state = "" - off_state = "" - faction = null - emp_vunerable = 0 - var/side = "neutral" - -/obj/machinery/porta_turret/defensepylon_internal_turret/setup() - return - -/obj/machinery/porta_turret/defensepylon_internal_turret/shootAt(atom/movable/target) - var/obj/item/projectile/A = ..() - if(A) - A.color = side - -/obj/machinery/porta_turret/defensepylon_internal_turret/assess_perp(mob/living/carbon/human/perp) - if(perp.handcuffed) //dishonourable to kill somebody who might be converted. - return 0 - var/badtarget = 0 - switch(side) - if("blue") - badtarget = is_handofgod_bluecultist(perp) - if("red") - badtarget = is_handofgod_redcultist(perp) - else - badtarget = 1 - if(badtarget) - return 0 - return 10 - - - -/obj/item/projectile/beam/pylon_bolt - name = "divine bolt" - icon_state = "greyscale_bolt" - damage = 15 - - -/obj/structure/divine/shrine - name = "shrine" - desc = "A shrine dedicated to a deity." - icon_state = "shrine" - metal_cost = 15 - glass_cost = 15 - - -/obj/structure/divine/shrine/assign_deity(mob/camera/god/new_deity, alert_old_deity = TRUE) - if(..()) - name = "shrine to [new_deity.name]" - desc = "A shrine dedicated to [new_deity.name]" - - - - -//Functional, but need sprites -/* -/obj/structure/divine/translocator - name = "translocator" - desc = "A powerful structure, made with a greater gem. It allows a deity to move their nexus to where this stands" - icon_state = "translocator" - health = 100 - maxhealth = 100 - metal_cost = 20 - glass_cost = 20 - greater_gem_cost = 1 - - -/obj/structure/divine/lazarusaltar - name = "lazarus altar" - desc = "A very powerful altar capable of bringing life back to the recently deceased, made with a greater gem. It can revive anyone and will heal virtually all wounds, but they are but a shell of their former self." - icon_state = "lazarusaltar" - density = 0 - health = 100 - maxhealth = 100 - metal_cost = 20 - greater_gem_cost = 1 - - -/obj/structure/divine/lazarusaltar/attack_hand(mob/living/user) - var/mob/living/L = locate() in get_turf(src) - if(!is_handofgod_culstist(user)) - user << "You try to use it, but unfortunately you don't know any rituals." - return - if(!L) - return - - if((side == "red" && is_handofgod_redcultist(user))) || (side == "blue" && is_handofgod_bluecultist(user))) - user << "You attempt to revive [L] by invoking the rebirth ritual." - L.revive() - L.adjustCloneLoss(50) - L.adjustStaminaLoss(100) - else - user << "You attempt to revive [L] by invoking the rebirth ritual." - user << "But the altar ignores your words..." -*/ - - diff --git a/code/game/gamemodes/handofgod/items.dm b/code/game/objects/items/religion.dm similarity index 55% rename from code/game/gamemodes/handofgod/items.dm rename to code/game/objects/items/religion.dm index f512c5c11cb..4f6fa7ad3f0 100644 --- a/code/game/gamemodes/handofgod/items.dm +++ b/code/game/objects/items/religion.dm @@ -7,29 +7,19 @@ var/moralecooldown = 0 var/moralewait = 600 - /obj/item/weapon/banner/attack_self(mob/living/carbon/human/user) if(moralecooldown + moralewait > world.time) return - var/side = "" - if(is_handofgod_redcultist(user)) - side = "red" - else if (is_handofgod_bluecultist(user)) - side = "blue" - - if(!side) - return user << "You increase the morale of your fellows!" moralecooldown = world.time for(var/mob/living/carbon/human/H in range(4,get_turf(src))) - if((side == "red") && is_handofgod_redcultist(H) || (side == "blue") && is_handofgod_bluecultist(H)) - H << "Your morale is increased by [user]'s banner!" - H.adjustBruteLoss(-15) - H.adjustFireLoss(-15) - H.AdjustStunned(-2) - H.AdjustWeakened(-2) - H.AdjustParalysis(-2) + H << "Your morale is increased by [user]'s banner!" + H.adjustBruteLoss(-15) + H.adjustFireLoss(-15) + H.AdjustStunned(-2) + H.AdjustWeakened(-2) + H.AdjustParalysis(-2) /obj/item/weapon/banner/red @@ -38,52 +28,32 @@ item_state = "banner-red" desc = "A banner with the logo of the red deity." -/obj/item/weapon/banner/red/examine(mob/user) - ..() - if(is_handofgod_redcultist(user)) - user << "A banner representing our might against the heretics. We may use it to increase the morale of our fellow members!" - else if(is_handofgod_bluecultist(user)) - user << "A heretical banner that should be destroyed posthaste." - - /obj/item/weapon/banner/blue name = "blue banner" icon_state = "banner-blue" item_state = "banner-blue" desc = "A banner with the logo of the blue deity" -/obj/item/weapon/banner/blue/examine(mob/user) - ..() - - if(is_handofgod_redcultist(user)) - user << "A heretical banner that should be destroyed posthaste." - else if(is_handofgod_bluecultist(user)) - user << "A banner representing our might against the heretics. We may use it to increase the morale of our fellow members!" - - /obj/item/weapon/storage/backpack/bannerpack name = "nanotrasen banner backpack" desc = "It's a backpack with lots of extra room. A banner with Nanotrasen's logo is attached, that can't be removed." max_combined_w_class = 27 //6 more then normal, for the tradeoff of declaring yourself an antag at all times. icon_state = "bannerpack" - /obj/item/weapon/storage/backpack/bannerpack/red name = "red banner backpack" desc = "It's a backpack with lots of extra room. A red banner is attached, that can't be removed." icon_state = "bannerpack-red" - /obj/item/weapon/storage/backpack/bannerpack/blue name = "blue banner backpack" desc = "It's a backpack with lots of extra room. A blue banner is attached, that can't be removed." icon_state = "bannerpack-blue" - - //this is all part of one item set /obj/item/clothing/suit/armor/plate/crusader name = "Crusader's Armour" + desc = "Armour that's comprised of metal and cloth." icon_state = "crusader" w_class = 4 //bulky slowdown = 2.0 //gotta pretend we're balanced. @@ -96,16 +66,9 @@ /obj/item/clothing/suit/armor/plate/crusader/blue icon_state = "crusader-blue" -/obj/item/clothing/suit/armor/plate/crusader/examine(mob/user) - ..() - if(!is_handofgod_cultist(user)) - user << "Armour that's comprised of metal and cloth." - else - user << "Armour that was used to protect from backstabs, gunshots, explosives, and lasers. The original wearers of this type of armour were trying to avoid being murdered. Since they're not around anymore, you're not sure if they were successful or not." - - /obj/item/clothing/head/helmet/plate/crusader name = "Crusader's Hood" + desc = "A brownish hood." icon_state = "crusader" w_class = 3 //normal flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE @@ -117,140 +80,67 @@ /obj/item/clothing/head/helmet/plate/crusader/red icon_state = "crusader-red" - -/obj/item/clothing/head/helmet/plate/crusader/examine(mob/user) - ..() - if(!is_handofgod_cultist(user)) - user << "A brownish hood." - else - user << "A hood that's very protective, despite being made of cloth. Due to the tendency of the wearer to be targeted for assassinations, being protected from being shot in the face was very important.." - - - //Prophet helmet /obj/item/clothing/head/helmet/plate/crusader/prophet name = "Prophet's Hat" + desc = "A religious-looking hat." alternate_worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' flags = 0 armor = list(melee = 60, bullet = 60, laser = 60, energy = 50, bomb = 70, bio = 50, rad = 50) //religion protects you from disease and radiation, honk. worn_x_dimension = 64 worn_y_dimension = 64 - var/side = "neither" - -/obj/item/clothing/head/helmet/plate/crusader/prophet/equipped(mob/living/carbon/user, slot) - var/faithful = 0 - if(slot == slot_head) - switch(side) - if("blue") - faithful = is_handofgod_bluecultist(user) - if("red") - faithful = is_handofgod_redcultist(user) - else - faithful = 1 - if(!faithful) - user << "Your mind is assaulted by a vast power, furious at your desecration!" - user.emote("scream") - user.adjustFireLoss(10) - user.unEquip(src) - user.head = null - user.update_inv_head() - src.screen_loc = null - user.Weaken(1) /obj/item/clothing/head/helmet/plate/crusader/prophet/red icon_state = "prophet-red" - side = "red" - /obj/item/clothing/head/helmet/plate/crusader/prophet/blue icon_state = "prophet-blue" - side = "blue" - - -/obj/item/clothing/head/helmet/plate/crusader/prophet/examine(mob/user) - ..() - if(!is_handofgod_cultist(user)) - user << "A brownish, religious-looking hat." - else - user << "A hat bestowed upon a prophet of gods and demigods." - user << "This hat belongs to the [side] god." - - //Structure conversion staff /obj/item/weapon/godstaff name = "godstaff" + desc = "It's a stick..?" icon_state = "godstaff-red" - var/mob/camera/god/god = null + var/conversion_color = "#ffffff" var/staffcooldown = 0 var/staffwait = 30 -/obj/item/weapon/godstaff/examine(mob/user) - ..() - if(!is_handofgod_cultist(user)) - user << "It's a stick..?" - else - user << "A powerful staff capable of changing the allegiance of god/demigod structures." - - -/obj/item/weapon/godstaff/attack_self(mob/living/carbon/user) - if((god && !god.is_handofgod_myprophet(user)) || !god) - user << "YOU ARE NOT THE CHOSEN ONE!" - return - if(!(istype(user.head, /obj/item/clothing/head/helmet/plate/crusader/prophet))) - user << "Your connection to your diety isn't strong enough! You must wear your big hat!" - return +/obj/item/weapon/godstaff/afterattack(atom/target, mob/user, proximity_flag, click_parameters) if(staffcooldown + staffwait > world.time) return - user.visible_message("[user] chants deeply and waves their staff") + user.visible_message("[user] chants deeply and waves their staff!") if(do_after(user, 20,1,src)) - for(var/obj/structure/divine/R in orange(3,user)) - user.say("Grant us true sight my god!") - if(istype(R, /obj/structure/divine/nexus)|| istype(R, /obj/structure/divine/trap)) - continue - R.visible_message("[R] suddenly appears!") - R.invisibility = 0 - R.alpha = initial(R.alpha) - R.density = initial(R.density) - R.activate() + target.color = conversion_color //wololo staffcooldown = world.time /obj/item/weapon/godstaff/red icon_state = "godstaff-red" + conversion_color = "#ff0000" /obj/item/weapon/godstaff/blue icon_state = "godstaff-blue" - - + conversion_color = "#0000ff" /obj/item/clothing/gloves/plate name = "Plate Gauntlets" icon_state = "crusader" + desc = "They're like gloves, but made of metal." siemens_coefficient = 0 cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - /obj/item/clothing/gloves/plate/red icon_state = "crusader-red" /obj/item/clothing/gloves/plate/blue icon_state = "crusader-blue" - -/obj/item/clothing/gloves/plate/examine(mob/user) - ..() - if(!is_handofgod_cultist(user)) - usr << "They're like gloves, but made of metal." - else - usr << "Protective gloves that are also blessed to protect from heat and shock." - - /obj/item/clothing/shoes/plate name = "Plate Boots" + desc = "Metal boots, they look heavy." icon_state = "crusader" w_class = 3 //normal armor = list(melee = 50, bullet = 50, laser = 50, energy = 40, bomb = 60, bio = 0, rad = 0) //does this even do anything on boots? @@ -268,14 +158,6 @@ icon_state = "crusader-blue" -/obj/item/clothing/shoes/plate/examine(mob/user) - ..() - if(!is_handofgod_cultist(user)) - usr << "Metal boots, they look heavy." - else - usr << "Heavy boots that are blessed for sure footing. You'll be safe from being taken down by the heresy that is the banana peel." - - /obj/item/weapon/storage/box/itemset/crusader name = "Crusader's Armour Set" //i can't into ck2 references desc = "This armour is said to be based on the armor of kings on another world thousands of years ago, who tended to assassinate, conspire, and plot against everyone who tried to do the same to them. Some things never change." @@ -301,6 +183,7 @@ new /obj/item/clothing/shoes/plate/red(src) -/obj/item/weapon/claymore/hog +/obj/item/weapon/claymore/weak + desc = "This one is rusted." force = 30 armour_penetration = 15 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm index c669b279ccc..fe9a59d0df5 100644 --- a/code/game/objects/items/weapons/implants/implant_loyality.dm +++ b/code/game/objects/items/weapons/implants/implant_loyality.dm @@ -32,7 +32,7 @@ return -1 if(target.mind in ticker.mode.revolutionaries) ticker.mode.remove_revolutionary(target.mind) - if((target.mind in ticker.mode.cult) || (target.mind in ticker.mode.blue_deity_prophets|ticker.mode.red_deity_prophets|ticker.mode.red_deity_followers|ticker.mode.blue_deity_followers)) + if(target.mind in ticker.mode.cult) target << "You feel something interfering with your mental conditioning, but you resist it!" else target << "You feel a sense of peace and security. You are now protected from brainwashing." @@ -46,7 +46,6 @@ return 1 return 0 - /obj/item/weapon/implanter/mindshield name = "implanter (mindshield)" diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm new file mode 100644 index 00000000000..f843044933d --- /dev/null +++ b/code/game/objects/structures/divine.dm @@ -0,0 +1,244 @@ +/obj/structure/divine + name = "divine construction site" + icon = 'icons/obj/hand_of_god_structures.dmi' + desc = "An unfinished divine building" + anchored = 1 + density = 1 + var/trap = FALSE + var/side = "neutral" //only used to decide icon states + var/health = 100 + var/maxhealth = 100 + var/deactivated = 0 //Structures being hidden can't be used. Mainly to prevent invisible defense pylons. + +/obj/structure/divine/proc/deactivate() + deactivated = 1 + +/obj/structure/divine/proc/activate() + deactivated = 0 + +/obj/structure/divine/proc/update_icons() + icon_state = "[initial(icon_state)]-[side]" + +/obj/structure/divine/attacked_by(obj/item/I, mob/living/user) + ..() + take_damage(I.force, I.damtype, 1) + +/obj/structure/divine/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1) + switch(damage_type) + if(BRUTE) + if(sound_effect) + if(damage) + playsound(loc, 'sound/weapons/smash.ogg', 50, 1) + else + playsound(loc, 'sound/weapons/tap.ogg', 50, 1) + if(BURN) + if(sound_effect) + playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) + else + return + health -= damage + if(!health) + visible_message("\The [src] was destroyed!") + qdel(src) + + +/obj/structure/divine/bullet_act(obj/item/projectile/P) + . = ..() + take_damage(P.damage, P.damage_type, 0) + + +/obj/structure/divine/attack_alien(mob/living/carbon/alien/humanoid/user) + user.changeNext_move(CLICK_CD_MELEE) + user.do_attack_animation(src) + add_hiddenprint(user) + visible_message("\The [user] slashes at [src]!") + playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) + take_damage(20, BRUTE, 0) + +/obj/machinery/attack_animal(mob/living/simple_animal/M) + M.changeNext_move(CLICK_CD_MELEE) + M.do_attack_animation(src) + if(M.melee_damage_upper > 0 || M.obj_damage) + M.visible_message("[M.name] smashes against \the [src.name].",\ + "You smash against the [src.name].") + if(M.obj_damage) + take_damage(M.obj_damage, M.melee_damage_type, 1) + else + take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1) + +/obj/structure/divine/nexus + name = "nexus" + desc = "It anchors a deity to this world. It radiates an unusual aura. It looks well protected from explosive shock." + icon_state = "nexus" + health = 500 + maxhealth = 500 + var/list/powerpylons = list() + +/obj/structure/divine/nexus/ex_act() + return + +/obj/structure/divine/conduit + name = "conduit" + desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus." + icon_state = "conduit" + health = 150 + maxhealth = 150 + +/obj/structure/divine/convertaltar + name = "conversion altar" + desc = "An altar dedicated to a deity." + icon_state = "convertaltar" + density = 0 + can_buckle = 1 + +/obj/structure/divine/sacrificealtar + name = "sacrificial altar" + desc = "An altar designed to perform blood sacrifice for a deity." + icon_state = "sacrificealtar" + density = 0 + can_buckle = 1 + +/obj/structure/divine/sacrificealtar/attack_hand(mob/living/user) + ..() + if(!has_buckled_mobs()) + return + var/mob/living/L = locate() in buckled_mobs + if(!L) + return + user << "You attempt to sacrifice [L] by invoking the sacrificial ritual." + L.gib() + message_admins("[key_name_admin(user)] has sacrificed [key_name_admin(L)] on the sacrifical altar.") + +/obj/structure/divine/healingfountain + name = "healing fountain" + desc = "A fountain containing the waters of life... or death, depending on where your allegiances lie." + icon_state = "fountain" + var/time_between_uses = 1800 + var/last_process = 0 + var/cult_only = TRUE + +/obj/structure/divine/healingfountain/anyone + desc = "A fountain containing the waters of life." + cult_only = FALSE + +/obj/structure/divine/healingfountain/attack_hand(mob/living/user) + if(deactivated) + return + if(last_process + time_between_uses > world.time) + user << "The fountain appears to be empty." + return + last_process = world.time + if(!iscultist(user) && cult_only) + user << "The water burns!" + user.reagents.add_reagent("hell_water",20) + else + user << "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards." + user.reagents.add_reagent("godblood",20) + update_icons() + addtimer(src, "update_icons", time_between_uses) + + +/obj/structure/divine/healingfountain/update_icons() + if(last_process + time_between_uses > world.time) + icon_state = "fountain" + else + icon_state = "fountain-[side]" + + +/obj/structure/divine/powerpylon + name = "power pylon" + desc = "A pylon which increases the deity's rate it can influence the world." + icon_state = "powerpylon" + density = 1 + health = 30 + maxhealth = 30 + +/obj/structure/divine/defensepylon + name = "defense pylon" + desc = "A pylon which is blessed to withstand many blows, and fire strong bolts at nonbelievers. A god can toggle it." + icon_state = "defensepylon" + health = 150 + maxhealth = 150 + var/gun_faction = "cult" + var/obj/machinery/porta_turret/defensepylon_internal_turret/pylon_gun + + +/obj/structure/divine/defensepylon/New() + ..() + pylon_gun = new(src) + pylon_gun.base = src + pylon_gun.faction = list(gun_faction) + pylon_gun.side = side + + +/obj/structure/divine/defensepylon/Destroy() + qdel(pylon_gun) //just in case + return ..() + +/obj/structure/divine/defensepylon/examine(mob/user) + ..() + user << "\The [src] looks [pylon_gun.on ? "on" : "off"]." + +/obj/structure/divine/defensepylon/attack_hand(mob/living/user) + if(gun_faction in user.faction) + pylon_gun.on = !pylon_gun.on + icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" + else + . = ..() + +/obj/structure/divine/defensepylon/deactivate() + ..() + pylon_gun.on = 0 + icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" + +/obj/structure/divine/defensepylon/activate() + ..() + pylon_gun.on = 1 + icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" + +//This sits inside the defensepylon, to avoid copypasta +/obj/machinery/porta_turret/defensepylon_internal_turret + name = "defense pylon" + desc = "A plyon which is blessed to withstand many blows, and fire strong bolts at nonbelievers." + icon = 'icons/obj/hand_of_god_structures.dmi' + installation = null + always_up = 1 + use_power = 0 + has_cover = 0 + health = 200 + projectile = /obj/item/projectile/beam/pylon_bolt + eprojectile = /obj/item/projectile/beam/pylon_bolt + shot_sound = 'sound/weapons/emitter2.ogg' + eshot_sound = 'sound/weapons/emitter2.ogg' + base_icon_state = "defensepylon" + active_state = "" + off_state = "" + faction = null + emp_vunerable = 0 + var/side = "neutral" + +/obj/machinery/porta_turret/defensepylon_internal_turret/setup() + return + +/obj/machinery/porta_turret/defensepylon_internal_turret/shootAt(atom/movable/target) + var/obj/item/projectile/A = ..() + if(A) + A.color = side + +/obj/machinery/porta_turret/defensepylon_internal_turret/assess_perp(mob/living/carbon/human/perp) + if(perp.handcuffed) //dishonourable to kill somebody who might be converted. + return 0 + var/list/test = faction & perp.faction + if(test.len) + return 0 + return 10 + +/obj/item/projectile/beam/pylon_bolt + name = "divine bolt" + icon_state = "greyscale_bolt" + damage = 15 + +/obj/structure/divine/shrine + name = "shrine" + desc = "A shrine dedicated to a deity." + icon_state = "shrine" \ No newline at end of file diff --git a/code/game/gamemodes/handofgod/traps.dm b/code/game/objects/structures/traps.dm similarity index 99% rename from code/game/gamemodes/handofgod/traps.dm rename to code/game/objects/structures/traps.dm index b39475f0ce1..f189f443e20 100644 --- a/code/game/gamemodes/handofgod/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -8,7 +8,6 @@ health = 20 maxhealth = 20 trap = TRUE - autocolours = FALSE var/last_trigger = 0 var/time_between_triggers = 600 //takes a minute to recharge @@ -24,7 +23,6 @@ trap_effect(L) animate(src, alpha = initial(alpha), time = time_between_triggers) - /obj/structure/divine/trap/examine(mob/user) ..() if(!isliving(user)) //bad ghosts, stop trying to powergame from beyond the grave @@ -37,13 +35,11 @@ /obj/structure/divine/trap/proc/trap_effect(mob/living/L) return - /obj/structure/divine/trap/stun name = "shock trap" desc = "A trap that will shock you, it will burn your flesh and render you immobile, You'd better avoid it." icon_state = "trap-shock" - /obj/structure/divine/trap/stun/trap_effect(mob/living/L) L << "You are paralyzed from the intense shock!" L.Weaken(5) diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index 07da6355d06..199e00dfd23 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -478,66 +478,6 @@ dat += "FLW" dat += "" - if(ticker.mode.red_deities.len || ticker.mode.red_deity_prophets.len || ticker.mode.blue_deity_prophets.len || ticker.mode.red_deity_followers.len || ticker.mode.blue_deity_followers.len) - dat += "
" - for(var/datum/mind/N in ticker.mode.red_deities) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "" - dat += "
Red Deity
Red Deity: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" - - if(ticker.mode.blue_deities.len) - dat += "
" - for(var/datum/mind/N in ticker.mode.blue_deities) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "" - dat += "
Blue Deity
Blue Deity: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" - - if(ticker.mode.red_deity_prophets.len) - dat += "
" - for(var/datum/mind/N in ticker.mode.red_deity_prophets) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "" - dat += "
Red Deity Prophets
Red Deity Prophet: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" - - if(ticker.mode.blue_deity_prophets.len) - dat += "
" - for(var/datum/mind/N in ticker.mode.blue_deity_prophets) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "" - dat += "
Blue Deity Prophets
Blue Deity Prophet: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" - - if(ticker.mode.red_deity_followers.len) - dat += "
" - for(var/datum/mind/N in ticker.mode.red_deity_followers) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "" - dat += "
Red Deity Followers
Red Deity Followers: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" - - if(ticker.mode.blue_deity_followers.len) - dat += "
" - for(var/datum/mind/N in ticker.mode.blue_deity_followers) - var/mob/M = N.current - if(M) - dat += "" - dat += "" - dat += "" - dat += "
Blue Deity Followers
Blue Deity Followers: [M.real_name][M.client ? "" : " (No Client)"][M.stat == 2 ? " (DEAD)" : ""]PMFLW
" - if(ticker.mode.traitors.len > 0) dat += "
" for(var/datum/mind/traitor in ticker.mode.traitors) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index e6cb0ad5723..6c7de4dcef8 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -470,7 +470,6 @@ health = INFINITY maxhealth = INFINITY var/team = WHITE_TEAM - constructable = FALSE time_between_triggers = 1 alpha = 255 @@ -482,7 +481,6 @@ L << "Stay out of the enemy spawn!" L.death() - /obj/structure/divine/trap/ctf/red team = RED_TEAM icon_state = "trap-fire" diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 87e348dd92c..e0c6708d564 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -3,5 +3,4 @@ ticker.mode.remove_cultist(mind, 0, 0) ticker.mode.remove_revolutionary(mind, 0) ticker.mode.remove_gangster(mind, remove_bosses=1) - ticker.mode.remove_hog_follower(mind,0) ..() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 30712e68b42..59bcff4fa60 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -6,4 +6,3 @@ if(mind) ticker.mode.remove_revolutionary(mind) ticker.mode.remove_gangster(mind,1,remove_bosses=1) - ticker.mode.remove_hog_follower(mind, 0) diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index ad20e68458e..4664a41082c 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -70,7 +70,7 @@ loot = list(/obj/effect/decal/remains/human, /obj/item/clothing/suit/armor/riot/knight/templar, /obj/item/clothing/head/helmet/knight/templar, - /obj/item/weapon/claymore/hog{name = "holy sword"}) + /obj/item/weapon/claymore/weak{name = "holy sword"}) /mob/living/simple_animal/hostile/skeleton/ice name = "ice skeleton" diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index 9ba2db5975b..6f662412c65 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -486,23 +486,6 @@ qdel(src) -/mob/proc/become_god(var/side_colour) - var/mob/camera/god/G = new /mob/camera/god(loc) - G.side = side_colour - if(mind) - mind.transfer_to(G) - else - G.key = key - - G.job = "Deity" - G.rename_self("deity") - G.update_icons() - - . = G - qdel(src) - - - /mob/living/carbon/human/proc/corgize() if (notransform) return diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 7c311d980b3..c38d9023457 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -188,11 +188,9 @@ if("emote") M.visible_message("[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")].") if(data >= 75) // 30 units, 135 seconds - if(iscultist(M) || is_handofgod_cultist(M) || is_handofgod_prophet(M) || is_servant_of_ratvar(M)) + if(iscultist(M) || is_servant_of_ratvar(M)) if(iscultist(M)) ticker.mode.remove_cultist(M.mind, 1, 1) - else if(is_handofgod_cultist(M) || is_handofgod_prophet(M)) - ticker.mode.remove_hog_follower(M.mind) else if(is_servant_of_ratvar(M)) remove_servant_of_ratvar(M) holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better?? diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index ab7c9dd746e..ec261d12045 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -69,7 +69,7 @@ R.adjustHealth(50) sleep(20) for(var/mob/living/carbon/C in get_hearers_in_view(round(created_volume/48,1),get_turf(holder.my_atom))) - if(iscultist(C) || is_handofgod_cultist(C)) + if(iscultist(C)) C << "The divine explosion sears you!" C.Weaken(2) C.adjust_fire_stacks(5) diff --git a/tgstation.dme b/tgstation.dme index 45351474e52..c8817520e98 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -365,14 +365,6 @@ #include "code\game\gamemodes\gang\gang_datum.dm" #include "code\game\gamemodes\gang\gang_pen.dm" #include "code\game\gamemodes\gang\recaller.dm" -#include "code\game\gamemodes\handofgod\_handofgod.dm" -#include "code\game\gamemodes\handofgod\actions.dm" -#include "code\game\gamemodes\handofgod\god.dm" -#include "code\game\gamemodes\handofgod\items.dm" -#include "code\game\gamemodes\handofgod\objectives.dm" -#include "code\game\gamemodes\handofgod\powers.dm" -#include "code\game\gamemodes\handofgod\structures.dm" -#include "code\game\gamemodes\handofgod\traps.dm" #include "code\game\gamemodes\malfunction\Malf_Modules.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" @@ -604,6 +596,7 @@ #include "code\game\objects\items\documents.dm" #include "code\game\objects\items\latexballoon.dm" #include "code\game\objects\items\nuke_tools.dm" +#include "code\game\objects\items\religion.dm" #include "code\game\objects\items\shooting_range.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" @@ -749,6 +742,7 @@ #include "code\game\objects\structures\bedsheet_bin.dm" #include "code\game\objects\structures\destructible_structures.dm" #include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\divine.dm" #include "code\game\objects\structures\door_assembly.dm" #include "code\game\objects\structures\dresser.dm" #include "code\game\objects\structures\electricchair.dm" @@ -784,6 +778,7 @@ #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\traps.dm" #include "code\game\objects\structures\watercloset.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" From ba6acc2ea0d4c864fcb16d69250d2fcca7b89236 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Sun, 18 Sep 2016 17:45:12 -0400 Subject: [PATCH 17/46] Reduces the copypaste in cleanable decal code (#20491) * Only holy water will clean blood runes * macro! * holy no longer required * i am far too unethical and spite driven half the time * it appears code done in the middle of the night in the hope that oranges hasn't merged my pr isn't always that good --- code/__DEFINES/is_helpers.dm | 2 + code/__DEFINES/misc.dm | 1 - .../miniantags/slaughter/slaughter.dm | 1 + .../effects/decals/Cleanable/aliens.dm | 4 -- .../effects/decals/Cleanable/humans.dm | 12 ---- .../objects/effects/decals/Cleanable/misc.dm | 58 ++++++------------- .../effects/decals/Cleanable/robots.dm | 6 -- code/game/objects/effects/decals/cleanable.dm | 2 + code/game/objects/effects/decals/crayon.dm | 8 +-- code/game/objects/items/stacks/stack.dm | 1 + code/game/objects/items/weapons/mop.dm | 14 ++--- .../modules/mob/living/silicon/robot/robot.dm | 5 +- .../simple_animal/friendly/cockroach.dm | 1 - 13 files changed, 33 insertions(+), 82 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index fa2ad08b30b..ad3d3d6027b 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -4,6 +4,8 @@ #define in_range(source, user) (get_dist(source, user) <= 1) +#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) //if something is cleanable + // MOB HELPERS #define ishuman(A) (istype(A, /mob/living/carbon/human)) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index a246df231ce..1ec6a0ed426 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -482,7 +482,6 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define STORAGE_VIEW_DEPTH 2 - // Medal names #define BOSS_KILL_MEDAL "Killer" diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm index f63dfae041e..2ac221435fc 100644 --- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm +++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm @@ -63,6 +63,7 @@ icon = 'icons/obj/surgery.dmi' name = "pile of viscera" desc = "A repulsive pile of guts and gore." + gender = NEUTER random_icon_states = list("innards") /mob/living/simple_animal/slaughter/phasein() diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index a0e5d4a3dc3..fbc74142fd9 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -3,9 +3,6 @@ /obj/effect/decal/cleanable/xenoblood name = "xeno blood" desc = "It's green and acidic. It looks like... blood?" - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") @@ -43,7 +40,6 @@ /obj/effect/decal/cleanable/xenoblood/xgibs name = "xeno gibs" desc = "Gnarly..." - gender = PLURAL icon = 'icons/effects/blood.dmi' icon_state = "xgib1" random_icon_states = list("xgib1", "xgib2", "xgib3", "xgib4", "xgib5", "xgib6") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 916bd7d2cf3..34118d95ac3 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -1,9 +1,6 @@ /obj/effect/decal/cleanable/blood name = "blood" desc = "It's red and gooey. Perhaps it's the chef's cooking?" - gender = PLURAL - density = 0 - layer = ABOVE_NORMAL_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") @@ -29,16 +26,12 @@ /obj/effect/decal/cleanable/blood/tracks icon_state = "tracks" desc = "They look like tracks left by wheels." - gender = PLURAL random_icon_states = null /obj/effect/decal/cleanable/trail_holder //not a child of blood on purpose name = "blood" icon_state = "ltrails_1" desc = "Your instincts say you shouldn't be following these." - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER random_icon_states = null var/list/existing_dirs = list() blood_DNA = list() @@ -51,9 +44,6 @@ /obj/effect/decal/cleanable/blood/gibs name = "gibs" desc = "They look bloody and gruesome." - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") @@ -108,7 +98,6 @@ /obj/effect/decal/cleanable/blood/drip name = "drips of blood" desc = "It's red." - gender = PLURAL icon_state = "1" random_icon_states = list("drip1","drip2","drip3","drip4","drip5") bloodiness = 0 @@ -125,7 +114,6 @@ icon = 'icons/effects/footprints.dmi' icon_state = "nothingwhatsoever" desc = "where might they lead?" - gender = PLURAL random_icon_states = null var/entered_dirs = 0 var/exited_dirs = 0 diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index ebf8ab3f8c5..5e460de0b80 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -1,16 +1,12 @@ /obj/effect/decal/cleanable/generic name = "clutter" desc = "Someone should clean that up." - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/obj/objects.dmi' icon_state = "shards" /obj/effect/decal/cleanable/ash name = "ashes" desc = "Ashes to ashes, dust to dust, and into space." - gender = PLURAL icon = 'icons/obj/objects.dmi' icon_state = "ash" @@ -24,25 +20,16 @@ name = "dirt" desc = "Someone should clean that up." icon_state = "dirt" - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER mouse_opacity = 0 /obj/effect/decal/cleanable/flour name = "flour" desc = "It's still good. Four second rule!" - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon_state = "flour" /obj/effect/decal/cleanable/greenglow name = "glowing goo" desc = "Jeez. I hope that's not for lunch." - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER luminosity = 1 icon_state = "greenglow" @@ -52,36 +39,34 @@ /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." - density = 0 - layer = OBJ_LAYER + gender = NEUTER + layer = WALL_OBJ_LAYER icon_state = "cobweb1" - burntime = 1 /obj/effect/decal/cleanable/cobweb/fire_act() qdel(src) +/obj/effect/decal/cleanable/cobweb2 + name = "cobweb" + desc = "Somebody should remove that." + gender = NEUTER + layer = WALL_OBJ_LAYER + icon_state = "cobweb2" + +/obj/effect/decal/cleanable/cobweb2/fire_act() + qdel(src) + /obj/effect/decal/cleanable/molten_item name = "gooey grey mass" desc = "It looks like a melted... something." - density = 0 - layer = OBJ_LAYER + gender = NEUTER icon = 'icons/obj/chemical.dmi' icon_state = "molten" -/obj/effect/decal/cleanable/cobweb2 - name = "cobweb" - desc = "Somebody should remove that." - density = 0 - layer = OBJ_LAYER - icon_state = "cobweb2" - //Vomit (sorry) /obj/effect/decal/cleanable/vomit name = "vomit" desc = "Gosh, how unpleasant." - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") @@ -112,38 +97,34 @@ /obj/effect/decal/cleanable/tomato_smudge name = "tomato smudge" desc = "It's red." - density = 0 - layer = ABOVE_OPEN_TURF_LAYER + gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" - density = 0 - layer = ABOVE_OPEN_TURF_LAYER + gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") /obj/effect/decal/cleanable/egg_smudge name = "smashed egg" desc = "Seems like this one won't hatch." - density = 0 - layer = ABOVE_OPEN_TURF_LAYER + gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") /obj/effect/decal/cleanable/pie_smudge //honk name = "smashed pie" desc = "It's pie cream from a cream pie." - density = 0 - layer = ABOVE_OPEN_TURF_LAYER + gender = NEUTER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") /obj/effect/decal/cleanable/chem_pile name = "chemical pile" desc = "A pile of chemicals. You can't quite tell what's inside it." - gender = PLURAL + gender = NEUTER icon = 'icons/obj/objects.dmi' icon_state = "ash" @@ -152,8 +133,6 @@ desc = "The shredded remains of what appears to be clothing." icon_state = "shreds" gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/cleanable/shreds/New() pixel_x = rand(-5, 5) @@ -165,3 +144,4 @@ desc = "A sizable pile of table salt. Someone must be upset." icon = 'icons/effects/tomatodecal.dmi' icon_state = "salt_pile" + gender = NEUTER diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index 7c0666a0c6e..5b56853cff2 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -3,9 +3,6 @@ /obj/effect/decal/cleanable/robot_debris name = "robot debris" desc = "It's a useless heap of junk... or is it?" - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "gib1" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") @@ -45,9 +42,6 @@ /obj/effect/decal/cleanable/oil name = "motor oil" desc = "It's black and greasy. Looks like Beepsky made another mess." - gender = PLURAL - density = 0 - layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "floor1" var/viruses = list() diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm index 9a24696cc87..b4a78c247b2 100644 --- a/code/game/objects/effects/decals/cleanable.dm +++ b/code/game/objects/effects/decals/cleanable.dm @@ -1,4 +1,6 @@ /obj/effect/decal/cleanable + gender = PLURAL + layer = ABOVE_NORMAL_TURF_LAYER var/list/random_icon_states = list() var/blood_state = "" //I'm sorry but cleanable/blood code is ass, and so is blood_DNA var/bloodiness = 0 //0-100, amount of blood in this decal, used for making footprints and affecting the alpha of bloody footprints diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index c629ff1e768..4a0175076a1 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -3,15 +3,9 @@ desc = "Graffiti. Damn kids." icon = 'icons/effects/crayondecal.dmi' icon_state = "rune1" - layer = ABOVE_NORMAL_TURF_LAYER + gender = NEUTER var/do_icon_rotate = TRUE -/obj/effect/decal/cleanable/crayon/examine() - set src in view(2) - ..() - return - - /obj/effect/decal/cleanable/crayon/New(location, main = "#FFFFFF", var/type = "rune1", var/e_name = "rune", var/rotation = 0, var/alt_icon = null) ..() loc = location diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2e765ab4e05..198b09036f9 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -137,6 +137,7 @@ if (R.max_res_amount > 1) var/obj/item/stack/new_item = O new_item.amount = R.res_amount*multiplier + new_item.update_icon() if(new_item.amount <= 0)//if the stack is empty, i.e it has been merged with an existing stack and has been garbage collected return diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 2f4c84ba913..feeab19e611 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -1,5 +1,3 @@ -#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune)) - /obj/item/weapon/mop desc = "The world of janitalia wouldn't be complete without a mop." name = "mop" @@ -42,16 +40,14 @@ obj/item/weapon/mop/proc/clean(turf/A) user << "Your mop is dry!" return - var/turf/turf = A - if(is_cleanable(A)) - turf = A.loc + var/turf/T = get_turf(A) - if(istype(turf)) - user.visible_message("[user] begins to clean \the [turf] with [src].", "You begin to clean \the [turf] with [src]...") + if(T) + user.visible_message("[user] begins to clean \the [T] with [src].", "You begin to clean \the [T] with [src]...") - if(do_after(user, src.mopspeed, target = turf)) + if(do_after(user, src.mopspeed, target = T)) user << "You finish mopping." - clean(turf) + clean(T) /obj/effect/attackby(obj/item/I, mob/user, params) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 76f8e90ef6e..6f56ca375b9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -785,9 +785,8 @@ if(isturf(tile)) tile.clean_blood() for(var/A in tile) - if(istype(A, /obj/effect)) - if(is_cleanable(A)) - qdel(A) + if(is_cleanable(A)) + qdel(A) else if(istype(A, /obj/item)) var/obj/item/cleaned_item = A cleaned_item.clean_blood() diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index 9d6a9ab7f64..fc4045ae569 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -53,4 +53,3 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - layer = ABOVE_OPEN_TURF_LAYER From 8357b8a4c558eb03580bed418d7839900be30905 Mon Sep 17 00:00:00 2001 From: XDTM Date: Mon, 19 Sep 2016 02:07:55 +0200 Subject: [PATCH 18/46] Adds gas canister crates to cargo (#20555) * New canisters for cargo * No ministation conflicts * Removed plasma, added n2o (with atmos access) * Added multi-id support and atmos access --- _maps/map_files/MiniStation/cargopacks.dm | 28 ----------- code/modules/cargo/packs.dm | 57 +++++++++++++++++++++++ 2 files changed, 57 insertions(+), 28 deletions(-) diff --git a/_maps/map_files/MiniStation/cargopacks.dm b/_maps/map_files/MiniStation/cargopacks.dm index a6a1db75df3..097711e7f43 100644 --- a/_maps/map_files/MiniStation/cargopacks.dm +++ b/_maps/map_files/MiniStation/cargopacks.dm @@ -1,31 +1,3 @@ -/datum/supply_pack/engineering/oxygen - name = "Oxygen Canister" - cost = 15 - contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) - crate_name = "oxygen canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/engineering/toxins - name = "Plasma Canister" - cost = 30 - contains = list(/obj/machinery/portable_atmospherics/canister/toxins) - crate_name = "plasma canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/engineering/nitrogen - name = "Nitrogen Canister" - cost = 20 - contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) - crate_name = "nitrogen canister crate" - crate_type = /obj/structure/closet/crate/large - -/datum/supply_pack/engineering/carbon_dio - name = "Carbon Dioxide Canister" - cost = 35 - contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) - crate_name = "carbon dioxide canister crate" - crate_type = /obj/structure/closet/crate/large - /obj/machinery/hydroponics/constructable/unattached anchored = 0 diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 5764994c628..b1ed528cb40 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -5,6 +5,7 @@ datum/supply_pack var/contraband = FALSE var/cost = 700 // Minimum cost, or infinite points are possible. var/access = FALSE + var/access_any = FALSE var/list/contains = null var/crate_name = "crate" var/crate_type = /obj/structure/closet/crate @@ -17,6 +18,8 @@ datum/supply_pack C.name = crate_name if(access) C.req_access = list(access) + if(access_any) + C.req_one_access = access_any fill(C) @@ -452,6 +455,35 @@ datum/supply_pack crate_name = "fuel tank crate" crate_type = /obj/structure/closet/crate/large +/datum/supply_pack/engineering/oxygen + name = "Oxygen Canister" + cost = 1500 + contains = list(/obj/machinery/portable_atmospherics/canister/oxygen) + crate_name = "oxygen canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/engineering/nitrogen + name = "Nitrogen Canister" + cost = 2000 + contains = list(/obj/machinery/portable_atmospherics/canister/nitrogen) + crate_name = "nitrogen canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/engineering/carbon_dio + name = "Carbon Dioxide Canister" + cost = 3000 + contains = list(/obj/machinery/portable_atmospherics/canister/carbon_dioxide) + crate_name = "carbon dioxide canister crate" + crate_type = /obj/structure/closet/crate/large + +/datum/supply_pack/science/nitrous_oxide_canister + name = "Nitrous Oxide Canister" + cost = 3000 + access = access_atmospherics + contains = list(/obj/machinery/portable_atmospherics/canister/nitrous_oxide) + crate_name = "nitrous oxide canister crate" + crate_type = /obj/structure/closet/crate/secure + /datum/supply_pack/engineering/tools name = "Toolbox Crate" contains = list(/obj/item/weapon/storage/toolbox/electrical, @@ -829,6 +861,24 @@ datum/supply_pack crate_type = /obj/structure/closet/crate/secure dangerous = TRUE +/datum/supply_pack/science/bz_canister + name = "BZ Canister" + cost = 4000 + access_any = list(access_rd, access_atmospherics) + contains = list(/obj/machinery/portable_atmospherics/canister/bz) + crate_name = "bz canister crate" + crate_type = /obj/structure/closet/crate/secure + dangerous = TRUE + +/datum/supply_pack/science/freon_canister + name = "Freon Canister" + cost = 6000 + access_any = list(access_rd, access_atmospherics) + contains = list(/obj/machinery/portable_atmospherics/canister/freon) + crate_name = "freon canister crate" + crate_type = /obj/structure/closet/crate/secure + dangerous = TRUE + /datum/supply_pack/science/research name = "Machine Prototype Crate" cost = 8000 @@ -1201,6 +1251,13 @@ datum/supply_pack crate_name = "high-capacity water tank crate" crate_type = /obj/structure/closet/crate/large +/datum/supply_pack/misc/water_vapor + name = "Water Vapor Canister" + cost = 2500 + contains = list(/obj/machinery/portable_atmospherics/canister/water_vapor) + crate_name = "water vapor canister crate" + crate_type = /obj/structure/closet/crate/large + /datum/supply_pack/misc/lasertag name = "Laser Tag Crate" cost = 1500 From cfeeb7162aa70ec6486c650c6013aeba30048d4d Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 19 Sep 2016 00:07:56 +0000 Subject: [PATCH 19/46] Automatic changelog generation for PR #20555 [ci skip] --- html/changelogs/AutoChangeLog-pr-20555.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20555.yml diff --git a/html/changelogs/AutoChangeLog-pr-20555.yml b/html/changelogs/AutoChangeLog-pr-20555.yml new file mode 100644 index 00000000000..adb61bdd033 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20555.yml @@ -0,0 +1,4 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "Canisters of any type of gas are now orderable in cargo. Dangerous experimental gases will require Research Director approval." From 77b736d48f0b8922f8cf821c2061224f7fe1db11 Mon Sep 17 00:00:00 2001 From: oranges Date: Tue, 20 Sep 2016 01:08:42 +1200 Subject: [PATCH 20/46] Properly guard air removal in some atmos machines (#20543) * Properly guard removing air from empty tiles in some atmos machines Scrubbers had the guard, but were trying to access gases before checking, leading to a lot of needless runtimes. dp vents did not seem to check at all * remove stray bracket --- .../components/binary_devices/dp_vent_pump.dm | 12 +++++++++--- .../components/unary_devices/vent_scrubber.dm | 5 +++-- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index 8208ada42d7..b61e862502c 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -65,7 +65,7 @@ Acts like a normal vent, but has an input AND output. ..() if(!on) - return 0 + return FALSE var/datum/gas_mixture/air1 = AIR1 var/datum/gas_mixture/air2 = AIR2 @@ -85,6 +85,9 @@ Acts like a normal vent, but has an input AND output. var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = air1.remove(transfer_moles) + //Removed can be null if there is no atmosphere in air1 + if(!removed) + return FALSE loc.assume_air(removed) air_update_turf() @@ -105,6 +108,9 @@ Acts like a normal vent, but has an input AND output. var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + //removed can be null if there is no air in the location + if(!removed) + return FALSE air2.merge(removed) air_update_turf() @@ -112,7 +118,7 @@ Acts like a normal vent, but has an input AND output. var/datum/pipeline/parent2 = PARENT2 parent2.update = 1 - return 1 + return TRUE //Radio remote control @@ -195,4 +201,4 @@ Acts like a normal vent, but has an input AND output. #undef EXT_BOUND #undef INPUT_MIN -#undef OUTPUT_MAX \ No newline at end of file +#undef OUTPUT_MAX diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index f95900688ec..b39fe29c0ff 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -184,9 +184,10 @@ //Take a gas sample var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) - var/list/removed_gases = removed.gases - if (isnull(removed)) //in space + //Nothing left to remove from the tile + if (isnull(removed)) return + var/list/removed_gases = removed.gases //Filter it var/datum/gas_mixture/filtered_out = new From 34e2e48da7e73405043ab0c3fe4968edd57f5f86 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 19 Sep 2016 15:21:01 +0000 Subject: [PATCH 21/46] Automatic changelog generation for PR #20547 [ci skip] --- html/changelogs/AutoChangeLog-pr-20547.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20547.yml diff --git a/html/changelogs/AutoChangeLog-pr-20547.yml b/html/changelogs/AutoChangeLog-pr-20547.yml new file mode 100644 index 00000000000..c5bc55ff948 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20547.yml @@ -0,0 +1,5 @@ +author: "XDTM" +delete-after: True +changes: + - rscadd: "Positive viruses are now recognized by medical HUDs with a special icon." + - tweak: "fully_heal no longer removes nonharmful viruses. This affects legion souls, staffs of healing, and changeling's revive." From d4588aea617a9c6249cf7b3919d9fd5b4c47fb7d Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 19 Sep 2016 15:22:25 +0000 Subject: [PATCH 22/46] Automatic changelog generation for PR #20569 [ci skip] --- html/changelogs/AutoChangeLog-pr-20569.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20569.yml diff --git a/html/changelogs/AutoChangeLog-pr-20569.yml b/html/changelogs/AutoChangeLog-pr-20569.yml new file mode 100644 index 00000000000..284aa369da9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20569.yml @@ -0,0 +1,4 @@ +author: "feemjmeem" +delete-after: True +changes: + - tweak: "You can now disassemble meatspike frames with a welding tool." From f48692ffed77c534487d2698f3706d6f45af995d Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 19 Sep 2016 15:35:12 +0000 Subject: [PATCH 23/46] Automatic changelog generation for PR #20568 [ci skip] --- html/changelogs/AutoChangeLog-pr-20568.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20568.yml diff --git a/html/changelogs/AutoChangeLog-pr-20568.yml b/html/changelogs/AutoChangeLog-pr-20568.yml new file mode 100644 index 00000000000..2e5fe31830d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20568.yml @@ -0,0 +1,4 @@ +author: "Nicho1010" +delete-after: True +changes: + - bugfix: "Fixed lattices appearing after exploding lava" From 0419e998fece6007a83e9c067d41adb5a832bc0d Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Mon, 19 Sep 2016 17:46:27 -0700 Subject: [PATCH 24/46] Fixes space movement (#20571) Fixed some issues with space movement, namely that it didn't trigger when something moved of its own accord after it was already scheduled to get space moved. --- code/controllers/subsystem/spacedrift.dm | 10 ++++++++++ code/game/atoms_movable.dm | 9 ++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystem/spacedrift.dm b/code/controllers/subsystem/spacedrift.dm index 51b8df01619..856f51ce7ac 100644 --- a/code/controllers/subsystem/spacedrift.dm +++ b/code/controllers/subsystem/spacedrift.dm @@ -32,8 +32,15 @@ var/datum/subsystem/spacedrift/SSspacedrift if (MC_TICK_CHECK) return continue + + if (AM.inertia_next_move > world.time) + if (MC_TICK_CHECK) + return + continue + if (!AM.loc || AM.loc != AM.inertia_last_loc || AM.Process_Spacemove(0)) AM.inertia_dir = 0 + if (!AM.inertia_dir) AM.inertia_last_loc = null processing -= AM @@ -43,7 +50,10 @@ var/datum/subsystem/spacedrift/SSspacedrift var/old_dir = AM.dir var/old_loc = AM.loc + AM.inertia_moving = TRUE step(AM, AM.inertia_dir) + AM.inertia_moving = FALSE + AM.inertia_next_move = world.time + AM.inertia_move_delay if (AM.loc == old_loc) AM.inertia_dir = 0 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8cb112ca8f8..e71b533d3c8 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -13,7 +13,10 @@ var/verb_exclaim = "exclaims" var/verb_yell = "yells" var/inertia_dir = 0 - var/inertia_last_loc + var/atom/inertia_last_loc + var/inertia_moving = 0 + var/inertia_next_move = 0 + var/inertia_move_delay = 5 var/pass_flags = 0 var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move glide_size = 8 @@ -71,13 +74,13 @@ last_move = direct setDir(direct) - if(. && has_buckled_mobs() && !handle_buckled_mob_movement(loc,direct)) //movement failed due to buckled mob(s) . = 0 //Called after a successful Move(). By this point, we've already moved /atom/movable/proc/Moved(atom/OldLoc, Dir) - if (!inertia_dir) + if (!inertia_moving) + inertia_next_move = world.time + inertia_move_delay newtonian_move(Dir) return 1 From 64a00bd0ee2decc9e2f14f085ed50b00c27e71ab Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 00:46:30 +0000 Subject: [PATCH 25/46] Automatic changelog generation for PR #20571 [ci skip] --- html/changelogs/AutoChangeLog-pr-20571.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20571.yml diff --git a/html/changelogs/AutoChangeLog-pr-20571.yml b/html/changelogs/AutoChangeLog-pr-20571.yml new file mode 100644 index 00000000000..b915f334c3d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20571.yml @@ -0,0 +1,4 @@ +author: "MrStonedOne" +delete-after: True +changes: + - bugfix: "Fixed space/nograv movement not triggering when atoms moved twice quickly in space/nograv" From b1d61e471839f5f421b3d893829ad79dc7372b41 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Mon, 19 Sep 2016 20:49:51 -0400 Subject: [PATCH 26/46] Makes bubblegum possibly more fun/fair to fight maybe (#20552) Significantly reworked bubblegum's attacks, it now has the following attacks; Attacks through blood, done occasionally and at the end of every charge. Spray blood if it failed to attack through blood during its normal attack sequence. Warp through blood if it failed to attack through blood during its normal attack sequence. Spawn up to 6 slaughterlings, which block enemies but not it. Charge at a target. May be prefaced by a blood warp or done up to 3 times if below half health. --- .../mining/lavaland/necropolis_chests.dm | 8 +- .../hostile/megafauna/bubblegum.dm | 231 ++++++++++++++---- icons/effects/bubblegum.dmi | Bin 0 -> 13876 bytes 3 files changed, 193 insertions(+), 46 deletions(-) create mode 100644 icons/effects/bubblegum.dmi diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 02e71c0f08f..365e3ade3f6 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -704,15 +704,13 @@ /obj/structure/closet/crate/necropolis/bubblegum/New() ..() - var/loot = rand(1,4) + var/loot = rand(1,3) switch(loot) if(1) - new /obj/item/weapon/antag_spawner/slaughter_demon(src) - if(2) new /obj/item/mayhem(src) - if(3) + if(2) new /obj/item/blood_contract(src) - if(4) + if(3) new /obj/item/weapon/gun/magic/staff/spellblade(src) /obj/item/blood_contract diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index f961094c4c9..b64463f3b7c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -9,15 +9,15 @@ Bubblegum's footsteps are heralded by shaking booms, proving its tremendous size It acts as a melee creature, chasing down and attacking its target while also using different attacks to augment its power that increase as it takes damage. -It often charges, dealing massive damage to anything unfortunate enough to be standing where it's aiming. -Whenever it isn't chasing something down, it will sink into nearby blood pools (if possible) and springs out of the closest one to its target. -To make this possible, it sprays streams of blood at random. -From these blood pools Bubblegum may summon slaughterlings - weak, low-damage minions designed to impede the target's progress. +It tries to strike at its target through any bloodpools under them; if it fails to do that, it will spray blood and then attempt to warp to a bloodpool near the target. +If it fails to warp to a target, it may summon up to 6 slaughterlings from the blood around it. +If it does not summon all 6 slaughterlings, it will instead charge at its target, dealing massive damage to anything it hits and spraying a stream of blood. +At half health, it will either charge three times or warp, then charge, instead of doing a single charge. When Bubblegum dies, it leaves behind a chest that can contain three things: - 1. A slaughter demon spawner - 2. A bottle that, when activated, drives everyone nearby into a frenzy - 3. A contract that marks for death the chosen target + 1. A bottle that, when activated, drives everyone nearby into a frenzy + 2. A contract that marks for death the chosen target + 3. A spellblade that can slice off limbs at range Difficulty: Hard @@ -45,6 +45,7 @@ Difficulty: Hard pixel_x = -32 del_on_death = 1 loot = list(/obj/structure/closet/crate/necropolis/bubblegum) + blood_volume = BLOOD_VOLUME_MAXIMUM //BLEED FOR ME var/charging = 0 medal_type = MEDAL_PREFIX score_type = BUBBLEGUM_SCORE @@ -57,6 +58,12 @@ Difficulty: Hard desc = "You're not quite sure how a signal can be bloody." invisibility = 100 +/mob/living/simple_animal/hostile/megafauna/bubblegum/adjustBruteLoss(amount) + if(amount > 0 && prob(33)) + var/obj/effect/decal/cleanable/blood/B = new /obj/effect/decal/cleanable/blood(loc) + B.bloodiness = 20 + . = ..() + /mob/living/simple_animal/hostile/megafauna/bubblegum/Life() ..() move_to_delay = Clamp(round((health/maxHealth) * 10), 5, 10) @@ -67,18 +74,21 @@ Difficulty: Hard return ranged_cooldown = world.time + ranged_cooldown_time - blood_warp() - - if(prob(25)) + var/warped = FALSE + if(!try_bloodattack()) addtimer(src, "blood_spray", 0) + warped = blood_warp() + if(warped && prob(100 - anger_modifier)) + return - else if(prob(5+anger_modifier/2)) - slaughterlings() - else - if(health > maxHealth/2 && !client) + if(prob(90 - anger_modifier) || slaughterlings()) + if(health > maxHealth * 0.5 || client) addtimer(src, "charge", 0) else - addtimer(src, "triple_charge", 0) + if(prob(70) || warped) + addtimer(src, "triple_charge", 0) + else + addtimer(src, "warp_charge", 0) /mob/living/simple_animal/hostile/megafauna/bubblegum/New() @@ -109,20 +119,22 @@ Difficulty: Hard ..() /mob/living/simple_animal/hostile/megafauna/bubblegum/Move() - if(!stat) - playsound(src.loc, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) PoolOrNew(/obj/effect/overlay/temp/decoy/fading, list(loc,src)) DestroySurroundings() . = ..() + if(!stat && .) + playsound(src, 'sound/effects/meteorimpact.ogg', 200, 1, 2, 1) if(charging) DestroySurroundings() +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/warp_charge() + blood_warp() + charge() + /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/triple_charge() charge() - sleep(10) charge() - sleep(10) charge() /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/charge() @@ -139,6 +151,7 @@ Difficulty: Hard sleep(5) throw_at(T, get_dist(src, T), 1, src, 0) charging = 0 + try_bloodattack() Goto(target, move_to_delay, minimum_distance) @@ -166,17 +179,132 @@ Difficulty: Hard charging = 0 +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood() + var/list/targets = ListTargets() + . = list() + for(var/mob/living/L in targets) + var/list/bloodpool = get_pools(get_turf(L), 0) + if(bloodpool.len && !faction_check(L)) + . += L + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/try_bloodattack() + var/list/targets = get_mobs_on_blood() + if(targets.len) + addtimer(src, "bloodattack", 0, FALSE, targets) + + return TRUE + return FALSE + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodattack(list/targets) + var/mob/living/target_one = pick_n_take(targets) + var/turf/target_one_turf = get_turf(target_one) + var/mob/living/target_two + if(targets.len) + target_two = pick_n_take(targets) + var/turf/target_two_turf = get_turf(target_two) + if(target_two.stat != CONSCIOUS || prob(10)) + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/rightpaw, target_two_turf) + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/rightthumb, target_two_turf) + bloodgrab(target_two_turf) + else + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/rightsmack, target_two_turf) + bloodsmack(target_two_turf) + + var/list/pools = get_pools(get_turf(target_one), 0) + if(pools.len) + target_one_turf = get_turf(target_one) + if(target_one.stat != CONSCIOUS || prob(10)) + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/leftpaw, target_one_turf) + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/leftthumb, target_one_turf) + bloodgrab(target_one_turf) + else + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/leftsmack, target_one_turf) + bloodsmack(target_one_turf) + + if(!target_two && target_one) + pools = get_pools(get_turf(target_one), 0) + if(pools.len) + target_one_turf = get_turf(target_one) + if(target_one.stat != CONSCIOUS || prob(10)) + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/rightpaw, target_one_turf) + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/rightthumb, target_one_turf) + bloodgrab(target_one_turf) + else + PoolOrNew(/obj/effect/overlay/temp/bubblegum_hands/rightsmack, target_one_turf) + bloodsmack(target_one_turf) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodsmack(turf/T) + sleep(2.5) + for(var/mob/living/L in T) + if(!faction_check(L)) + L << "[src] rends you!" + playsound(T, attack_sound, 100, 1, -1) + var/limb_to_hit = L.get_bodypart(pick("head", "chest", "r_arm", "l_arm", "r_leg", "l_leg")) + L.apply_damage(25, BRUTE, limb_to_hit, L.run_armor_check(limb_to_hit, "melee", null, null, armour_penetration)) + sleep(3) + +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/bloodgrab(turf/T) + sleep(6) + for(var/mob/living/L in T) + if(!faction_check(L)) + L << "[src] drags you through the blood!" + playsound(T, 'sound/magic/enter_blood.ogg', 100, 1, -1) + var/turf/targetturf = get_step(src, dir) + L.forceMove(targetturf) + playsound(targetturf, 'sound/magic/exit_blood.ogg', 100, 1, -1) + if(L.stat != CONSCIOUS) + addtimer(src, "devour", 2, FALSE, L) + sleep(1) + +/obj/effect/overlay/temp/bubblegum_hands + icon = 'icons/effects/bubblegum.dmi' + duration = 9 + +/obj/effect/overlay/temp/bubblegum_hands/rightthumb + icon_state = "rightthumbgrab" + +/obj/effect/overlay/temp/bubblegum_hands/leftthumb + icon_state = "leftthumbgrab" + +/obj/effect/overlay/temp/bubblegum_hands/rightpaw + icon_state = "rightpawgrab" + layer = BELOW_MOB_LAYER + +/obj/effect/overlay/temp/bubblegum_hands/leftpaw + icon_state = "leftpawgrab" + layer = BELOW_MOB_LAYER + +/obj/effect/overlay/temp/bubblegum_hands/rightsmack + icon_state = "rightsmack" + +/obj/effect/overlay/temp/bubblegum_hands/leftsmack + icon_state = "leftsmack" + /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_warp() + if(Adjacent(target)) + return FALSE + var/list/can_jaunt = get_pools(get_turf(src), 1) + if(!can_jaunt.len) + return FALSE + + var/list/pools = get_pools(get_turf(target), 2) + var/list/pools_to_remove = get_pools(get_turf(target), 1) + pools -= pools_to_remove + if(!pools.len) + return FALSE + + var/obj/effect/overlay/temp/decoy/DA = PoolOrNew(/obj/effect/overlay/temp/decoy, list(loc,src)) + DA.color = "#FF0000" + var/oldtransform = DA.transform + DA.transform = matrix()*2 + animate(DA, alpha = 255, color = initial(DA.color), transform = oldtransform, time = 5) + sleep(5) + qdel(DA) + var/obj/effect/decal/cleanable/blood/found_bloodpool - var/list/pools = list() - var/can_jaunt = FALSE - for(var/obj/effect/decal/cleanable/blood/nearby in view(src,2)) - can_jaunt = TRUE - break - if(!can_jaunt) - return - for(var/obj/effect/decal/cleanable/blood/nearby in view(get_turf(target),2)) - pools += nearby + pools = get_pools(get_turf(target), 2) + pools_to_remove = get_pools(get_turf(target), 1) + pools -= pools_to_remove if(pools.len) shuffle(pools) found_bloodpool = pick(pools) @@ -186,35 +314,56 @@ Difficulty: Hard forceMove(get_turf(found_bloodpool)) playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, 1, -1) visible_message("And springs back out!") + return TRUE + return FALSE +/mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_pools(turf/T, range) + . = list() + for(var/obj/effect/decal/cleanable/blood/nearby in view(T, range)) + . += nearby /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/blood_spray() visible_message("[src] sprays a stream of gore!") - var/turf/E = get_edge_target_turf(src, src.dir) - var/range = 10 + var/range = 6 + round(anger_modifier * 0.4) var/turf/previousturf = get_turf(src) - for(var/turf/J in getline(src,E)) - if(!range) - break + var/turf/J = previousturf + var/targetdir = get_dir(src, target) + if(target.loc == loc) + targetdir = dir + face_atom(target) + new /obj/effect/decal/cleanable/blood(J) + for(var/i in 1 to range) + J = get_step(previousturf, targetdir) PoolOrNew(/obj/effect/overlay/temp/dir_setting/bloodsplatter, list(previousturf, get_dir(previousturf, J))) - if(!previousturf.CanAtmosPass(J)) + playsound(previousturf,'sound/effects/splat.ogg', 100, 1, -1) + if(!J || !previousturf.CanAtmosPass(J)) break - playsound(J,'sound/effects/splat.ogg', 100, 1, -1) - new /obj/effect/decal/cleanable/blood(J) - range-- + var/obj/effect/decal/cleanable/blood/B = new /obj/effect/decal/cleanable/blood(J) + B.bloodiness = 0 previousturf = J sleep(1) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/slaughterlings() visible_message("[src] summons a shoal of slaughterlings!") - for(var/obj/effect/decal/cleanable/blood/H in range(src, 10)) - if(prob(25)) - new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter(H.loc) + var/max_amount = 6 + for(var/H in get_pools(get_turf(src), 1)) + if(!max_amount) + break + max_amount-- + var/obj/effect/decal/cleanable/blood/B = H + new /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter(B.loc) + return max_amount /mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter name = "slaughterling" desc = "Though not yet strong enough to create a true physical form, it's nonetheless determined to murder you." - faction = list("mining") + density = 0 + faction = list("mining", "boss") weather_immunities = list("lava","ash") +/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/slaughter/CanPass(atom/movable/mover, turf/target, height = 0) + if(istype(mover, /mob/living/simple_animal/hostile/megafauna/bubblegum)) + return 1 + return 0 + #undef MEDAL_PREFIX \ No newline at end of file diff --git a/icons/effects/bubblegum.dmi b/icons/effects/bubblegum.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a53dd7d563aa87c70ff9c6e4b08c077dba500ab8 GIT binary patch literal 13876 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 Date: Tue, 20 Sep 2016 00:49:52 +0000 Subject: [PATCH 27/46] Automatic changelog generation for PR #20552 [ci skip] --- html/changelogs/AutoChangeLog-pr-20552.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20552.yml diff --git a/html/changelogs/AutoChangeLog-pr-20552.yml b/html/changelogs/AutoChangeLog-pr-20552.yml new file mode 100644 index 00000000000..0a185f3c110 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20552.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - experiment: "Bubblegum has been seen reaching through blood. Try not to get hit." From 5b6a5a64490315590c1e9c06113f10f8d9efca96 Mon Sep 17 00:00:00 2001 From: Ergovisavi Date: Mon, 19 Sep 2016 18:52:10 -0700 Subject: [PATCH 28/46] Added "neutral" to drone's factions (#20578) --- code/modules/mob/living/simple_animal/friendly/drone/_drone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 5dcfcc2b9ed..fb94224fbbf 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -46,7 +46,7 @@ staticOverlays = list() hud_possible = list(DIAG_STAT_HUD, DIAG_HUD, ANTAG_HUD) unique_name = TRUE - faction = list("silicon") + faction = list("neutral","silicon") dextrous = TRUE dextrous_hud_type = /datum/hud/dextrous/drone var/staticChoice = "static" From eaf66fef15a75a98e78a7ad5fb0fd9f18a5a649c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 01:52:12 +0000 Subject: [PATCH 29/46] Automatic changelog generation for PR #20578 [ci skip] --- html/changelogs/AutoChangeLog-pr-20578.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20578.yml diff --git a/html/changelogs/AutoChangeLog-pr-20578.yml b/html/changelogs/AutoChangeLog-pr-20578.yml new file mode 100644 index 00000000000..83f15b5a45e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20578.yml @@ -0,0 +1,4 @@ +author: "Ergovisavi" +delete-after: True +changes: + - bugfix: "fixed \"friendly\" xenobio mobs and mining drones attacking station drones" From 9496e1631a86450f97db407e0e34a9999a1e7d8e Mon Sep 17 00:00:00 2001 From: Hamzah Date: Tue, 20 Sep 2016 03:53:43 +0100 Subject: [PATCH 30/46] Limb grower (#20501) Added a Experimental Limb Grower to the medbay department, now medical stuff can grow synthetic limbs using Synthflesh to help crew that suffer any work related accidents. --- _maps/map_files/MetaStation/MetaStation.dmm | 2 + _maps/map_files/TgStation/tgstation.2.1.3.dmm | 21 +- code/__DEFINES/machines.dm | 1 + code/game/machinery/limbgrower.dm | 238 ++++++++++++++++++ code/game/objects/items/weapons/melee/misc.dm | 11 + .../reagents/reagent_containers/glass.dm | 3 + .../research/designs/limbgrower_designs.dm | 43 ++++ code/modules/research/research.dm | 10 + icons/obj/machines/limbgrower.dmi | Bin 0 -> 25047 bytes tgstation.dme | 2 + 10 files changed, 324 insertions(+), 7 deletions(-) create mode 100644 code/game/machinery/limbgrower.dm create mode 100644 code/modules/research/designs/limbgrower_designs.dm create mode 100644 icons/obj/machines/limbgrower.dmi diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index ae44b7d3bde..073f251c330 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -62703,6 +62703,8 @@ network = list("SS13","Medbay") }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/limbgrower, +/obj/item/weapon/reagent_containers/glass/beaker/synthflesh, /turf/open/floor/plasteel/whiteblue/side{ dir = 4 }, diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index a23232c6e3e..ec77a16dc25 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -38438,13 +38438,8 @@ /turf/open/floor/plasteel/white, /area/medical/sleeper) "bGS" = ( -/obj/structure/table, -/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/weapon/reagent_containers/glass/bottle/morphine, -/obj/item/weapon/reagent_containers/syringe, +/obj/machinery/limbgrower, +/obj/item/weapon/reagent_containers/glass/beaker/synthflesh, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bGT" = ( @@ -39187,6 +39182,18 @@ pixel_y = 2 }, /obj/item/weapon/storage/box/syringes, +/obj/item/weapon/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/weapon/reagent_containers/glass/bottle/morphine{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/weapon/reagent_containers/syringe{ + pixel_x = 6; + pixel_y = -3 + }, /turf/open/floor/plasteel/white, /area/medical/sleeper) "bIn" = ( diff --git a/code/__DEFINES/machines.dm b/code/__DEFINES/machines.dm index ebdedff9517..0ff00ff276f 100644 --- a/code/__DEFINES/machines.dm +++ b/code/__DEFINES/machines.dm @@ -22,6 +22,7 @@ #define CRAFTLATHE 8 //Uses fuck if I know. For use eventually. #define MECHFAB 16 //Remember, objects utilising this flag should have construction_time and construction_cost vars. #define BIOGENERATOR 32 //Uses biomass +#define LIMBGROWER 64 //Uses synthetic flesh //Note: More then one of these can be added to a design but imprinter and lathe designs are incompatable. #define MC_CPU "CPU" diff --git a/code/game/machinery/limbgrower.dm b/code/game/machinery/limbgrower.dm new file mode 100644 index 00000000000..14c8415adf8 --- /dev/null +++ b/code/game/machinery/limbgrower.dm @@ -0,0 +1,238 @@ +#define LIMBGROWER_MAIN_MENU 1 +#define LIMBGROWER_CATEGORY_MENU 2 +#define LIMBGROWER_CHEMICAL_MENU 3 +//use these for the menu system + + +/obj/machinery/limbgrower + name = "limb grower" + desc = "It grows new limbs using Synthflesh." + icon = 'icons/obj/machines/limbgrower.dmi' + icon_state = "limbgrower_idleoff" + density = 1 + flags = OPENCONTAINER + + var/operating = 0 + anchored = 1 + use_power = 1 + var/disabled = 0 + idle_power_usage = 10 + active_power_usage = 100 + var/busy = 0 + var/prod_coeff = 1 + + var/datum/design/being_built + var/datum/research/files + var/selected_category + var/screen = 1 + var/emag = FALSE //Gives access to other cool stuff + + var/list/categories = list( + "human", + "lizard", + "plasmaman", + "special" + ) + +/obj/machinery/limbgrower/New() + ..() + create_reagents(0) + var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/limbgrower(null) + B.apply_default_parts(src) + files = new /datum/research/limbgrower(src) + +/obj/item/weapon/circuitboard/machine/limbgrower + name = "circuit board (Limb Grower)" + build_path = /obj/machinery/limbgrower + origin_tech = "programming=2;biotech=2" + req_components = list( + /obj/item/weapon/stock_parts/manipulator = 1, + /obj/item/weapon/reagent_containers/glass/beaker = 2, + /obj/item/weapon/stock_parts/console_screen = 1) + +/obj/machinery/limbgrower/interact(mob/user) + if(!is_operational()) + return + + var/dat = main_win(user) + + switch(screen) + if(LIMBGROWER_MAIN_MENU) + dat = main_win(user) + if(LIMBGROWER_CATEGORY_MENU) + dat = category_win(user,selected_category) + if(LIMBGROWER_CHEMICAL_MENU) + dat = chemical_win(user) + + var/datum/browser/popup = new(user, "Limb Grower", name, 400, 500) + popup.set_content(dat) + popup.open() + +/obj/machinery/limbgrower/deconstruction() + for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) + reagents.trans_to(G, G.reagents.maximum_volume) + +/obj/machinery/limbgrower/attackby(obj/item/O, mob/user, params) + if (busy) + user << "The Limb Grower is busy. Please wait for completion of previous operation." + return + + if(default_deconstruction_screwdriver(user, "limbgrower_panelopen", "limbgrower_idleoff", O)) + updateUsrDialog() + return + + if(exchange_parts(user, O)) + return + + if(panel_open && default_deconstruction_crowbar(O)) + return + + if(user.a_intent == "harm") //so we can hit the machine + return ..() + +/obj/machinery/limbgrower/Topic(href, href_list) + if(..()) + return + if (!busy) + if(href_list["menu"]) + screen = text2num(href_list["menu"]) + + if(href_list["category"]) + selected_category = href_list["category"] + + if(href_list["disposeI"]) //Get rid of a reagent incase you add the wrong one by mistake + reagents.del_reagent(href_list["disposeI"]) + + if(href_list["make"]) + + ///////////////// + //href protection + being_built = files.FindDesignByID(href_list["make"]) //check if it's a valid design + if(!being_built) + return + + + var/synth_cost = being_built.reagents["synthflesh"]*prod_coeff + var/power = max(2000, synth_cost/5) + + if(reagents.has_reagent("synthflesh", being_built.reagents["synthflesh"]*prod_coeff)) + busy = 1 + use_power(power) + flick("limbgrower_fill",src) + icon_state = "limbgrower_idleon" + addtimer(src, "build_item",32*prod_coeff) + + else + usr << "The limb grower is busy. Please wait for completion of previous operation." + + updateUsrDialog() + return + +/obj/machinery/limbgrower/proc/build_item() + if(reagents.has_reagent("synthflesh", being_built.reagents["synthflesh"]*prod_coeff)) //sanity check, if this happens we are in big trouble + reagents.remove_reagent("synthflesh",being_built.reagents["synthflesh"]*prod_coeff) + var/buildpath = being_built.build_path + if(ispath(buildpath, /obj/item/bodypart)) //This feels like spatgheti code, but i need to initilise a limb somehow + build_limb(buildpath) + else + //Just build whatever it is + new buildpath(loc) + else + src.visible_message(" Something went very wrong and there isnt enough synthflesh anymore!") + busy = 0 + flick("limbgrower_unfill",src) + icon_state = "limbgrower_idleoff" + updateUsrDialog() + +/obj/machinery/limbgrower/proc/build_limb(buildpath) + //i need to create a body part manually using a set icon (otherwise it doesnt appear) + var/obj/item/bodypart/limb + limb = new buildpath(loc) + if(selected_category=="human" || selected_category=="lizard") // Doing this because plasmamen have their limbs in a different icon file + limb.icon = 'icons/mob/human_parts_greyscale.dmi' + else + limb.icon = 'icons/mob/human_parts.dmi' + // Set this limb up using the specias name and body zone + limb.icon_state = "[selected_category]_[limb.body_zone]_s" + limb.name = "Synthetic [selected_category] [parse_zone(limb.body_zone)]" + limb.desc = "A synthetic [selected_category] limb that will morph on its first use in surgery. This one is for the [parse_zone(limb.body_zone)]" + +/obj/machinery/limbgrower/RefreshParts() + reagents.maximum_volume = 0 + for(var/obj/item/weapon/reagent_containers/glass/G in component_parts) + reagents.maximum_volume += G.volume + G.reagents.trans_to(src, G.reagents.total_volume) + var/T=1.2 + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + T -= M.rating*0.2 + prod_coeff = min(1,max(0,T)) // Coeff going 1 -> 0,8 -> 0,6 -> 0,4 + +/obj/machinery/limbgrower/proc/main_win(mob/user) + var/dat = "

Limb Grower Menu:


" + dat += "Chemical Storage" + dat += materials_printout() + dat += "
Traitors
" + + for(var/C in categories) + if(C=="special" && !emag) //Only want to show special when console is emagged + continue + + dat += "" + dat += "" + //one category per line + + dat += "
[C]
" + return dat + +/obj/machinery/limbgrower/proc/category_win(mob/user,selected_category) + var/dat = "Return to main menu" + dat += "

Browsing [selected_category]:


" + dat += materials_printout() + + for(var/v in files.known_designs) + var/datum/design/D = files.known_designs[v] + if(!(selected_category in D.category)) + continue + if(disabled || !can_build(D)) + dat += "[D.name]" + else + dat += "[D.name]" + dat += "[get_design_cost(D)]
" + + dat += "
" + return dat + + +/obj/machinery/limbgrower/proc/chemical_win(mob/user) + var/dat = "Return to main menu" + dat += "

Browsing Chemical Storage:


" + dat += materials_printout() + + for(var/datum/reagent/R in reagents.reagent_list) + dat += "[R.name]: [R.volume]" + dat += "Purge
" + + dat += "
" + return dat + +/obj/machinery/limbgrower/proc/materials_printout() + var/dat = "Total amount:> [reagents.total_volume] / [reagents.maximum_volume] cm3
" + return dat + +/obj/machinery/limbgrower/proc/can_build(datum/design/D) + return (reagents.has_reagent("synthflesh", D.reagents["synthflesh"]*prod_coeff)) //Return whether the machine has enough synthflesh to produce the design + +/obj/machinery/limbgrower/proc/get_design_cost(datum/design/D) + var/dat + if(D.reagents["synthflesh"]) + dat += "[D.reagents["synthflesh"] * prod_coeff] Synthetic flesh " + return dat + +/obj/machinery/limbgrower/emag_act(mob/user) + if(emag==TRUE) + return + for(var/datum/design/D in files.possible_designs) + if((D.build_type & LIMBGROWER) && ("special" in D.category)) + files.AddDesign2Known(D) + user << "A warning flashes onto the screen, stating that safety overrides have been deactivated" + emag = TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index b81a9cf75aa..6c20ea10f6f 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -21,6 +21,17 @@ user.visible_message("[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.") return (OXYLOSS) +/obj/item/weapon/melee/synthetic_arm_blade + name = "synthetic arm blade" + desc = "A grotesque blade that on closer inspection seems made of synthentic flesh, it still feels like it would hurt very badly as a weapon." + icon = 'icons/obj/weapons.dmi' + icon_state = "arm_blade" + item_state = "arm_blade" + origin_tech = "combat=5,biotech=5" + w_class = 5.0 + force = 15 + throwforce = 10 + sharpness = IS_SHARP /obj/item/weapon/melee/sabre name = "officer's sabre" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 1676c8339e0..469be2bbbb2 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -212,6 +212,9 @@ /obj/item/weapon/reagent_containers/glass/beaker/large/epinephrine name = "epinephrine reserve tank" list_reagents = list("epinephrine" = 50) + +/obj/item/weapon/reagent_containers/glass/beaker/synthflesh + list_reagents = list("synthflesh" = 50) /obj/item/weapon/reagent_containers/glass/bucket name = "bucket" diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm new file mode 100644 index 00000000000..591888bfd9d --- /dev/null +++ b/code/modules/research/designs/limbgrower_designs.dm @@ -0,0 +1,43 @@ +///////////////////////////////////// +//////////Limb Grower Designs /////// +///////////////////////////////////// + +/datum/design/leftarm + name = "Left Arm" + id = "leftarm" + build_type = LIMBGROWER + reagents = list("synthflesh" = 25) + build_path = /obj/item/bodypart/l_arm + category = list("initial","human","lizard","plasmaman") + +/datum/design/rightarm + name = "Right Arm" + id = "rightarm" + build_type = LIMBGROWER + reagents = list("synthflesh" = 25) + build_path = /obj/item/bodypart/r_arm + category = list("initial","human","lizard","plasmaman") + +/datum/design/leftleg + name = "Left Leg" + id = "leftleg" + build_type = LIMBGROWER + reagents = list("synthflesh" = 25) + build_path = /obj/item/bodypart/l_leg + category = list("initial","human","lizard","plasmaman") + +/datum/design/rightleg + name = "Right Leg" + id = "rightleg" + build_type = LIMBGROWER + reagents = list("synthflesh" = 25) + build_path = /obj/item/bodypart/r_leg + category = list("initial","human","lizard","plasmaman") + +/datum/design/armblade + name = "Arm Blade" + id = "armblade" + build_type = LIMBGROWER + reagents = list("synthflesh" = 75) + build_path = /obj/item/weapon/melee/synthetic_arm_blade + category = list("special") \ No newline at end of file diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 94bc846e530..6d1cabc38b8 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -143,6 +143,16 @@ research holder datum. if((D.build_type & AUTOLATHE) && ("initial" in D.category)) //autolathe starts without hacked designs AddDesign2Known(D) +//Limb Grower files +/datum/research/limbgrower/New() + for(var/T in (subtypesof(/datum/tech))) + possible_tech += new T(src) + for(var/path in subtypesof(/datum/design)) + var/datum/design/D = new path(src) + possible_designs += D + if((D.build_type & LIMBGROWER) && ("initial" in D.category)) + AddDesign2Known(D) + /datum/research/autolathe/AddDesign2Known(datum/design/D) if(!(D.build_type & AUTOLATHE)) return diff --git a/icons/obj/machines/limbgrower.dmi b/icons/obj/machines/limbgrower.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7e26a9f7f24635eee42d59d441232c3c2e2cee61 GIT binary patch literal 25047 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 Date: Tue, 20 Sep 2016 02:53:45 +0000 Subject: [PATCH 31/46] Automatic changelog generation for PR #20501 [ci skip] --- html/changelogs/AutoChangeLog-pr-20501.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20501.yml diff --git a/html/changelogs/AutoChangeLog-pr-20501.yml b/html/changelogs/AutoChangeLog-pr-20501.yml new file mode 100644 index 00000000000..6d449f5caca --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20501.yml @@ -0,0 +1,4 @@ +author: "chickenboy10" +delete-after: True +changes: + - rscadd: "Added a Experimental Limb Grower to the medbay department, now medical stuff can grow synthetic limbs using Synthflesh to help crew that suffer any work related accidents. There may also be a limb that can be grown with a special card..." From cba00b0749eea11c73eb3a5873f7ea963370f7c1 Mon Sep 17 00:00:00 2001 From: Screemonster Date: Tue, 20 Sep 2016 05:08:28 +0100 Subject: [PATCH 32/46] Sanitises input on abandoned crates (#20570) A few fixes on crates. The crates now inform players that all the digits in the code must be unique rather than forcing them to dive into code comments to know this rather important thing about cracking them, and perform a sanity-check on the input to reject any guess with repeating digits without wasting an attempt. The multitool will return the last attempt along with the cows and bulls, purely to save players having to use an external notepad or whatever to keep track of what they've entered. Gets rid of the z in the list of possible digits, and rewrote the cows-and-bulls check so the original bug that caused 0 to return a cow shouldn't happen any more. --- code/modules/mining/abandoned_crates.dm | 40 +++++++++++++++---------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 40c2a19addb..9109ddefc76 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -11,12 +11,12 @@ /obj/structure/closet/crate/secure/loot/New() ..() - var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "z") + var/list/digits = list("1", "2", "3", "4", "5", "6", "7", "8", "9", "0") code = "" for(var/i = 0, i < codelen, i++) var/dig = pick(digits) code += dig - digits -= dig //Player can enter codes with matching digits, but there are never matching digits in the answer + digits -= dig //there are never matching digits in the answer var/loot = rand(1,100) //100 different crates with varying chances of spawning switch(loot) @@ -153,18 +153,26 @@ /obj/structure/closet/crate/secure/loot/attack_hand(mob/user) if(locked) user << "The crate is locked with a Deca-code lock." - var/input = input(usr, "Enter [codelen] digits.", "Deca-Code Lock", "") as text + var/input = input(usr, "Enter [codelen] digits. All digits must be unique.", "Deca-Code Lock", "") as text if(user.canUseTopic(src, 1)) + var/list/sanitised = list() + var/sanitycheck = 1 + for(var/i=1,i<=length(input),i++) //put the guess into a list + sanitised += text2num(copytext(input,i,i+1)) + for(var/i=1,i<=(length(input)-1),i++) //compare each digit in the guess to all those following it + for(var/j=(i+1),j<=length(input),j++) + if(sanitised[i] == sanitised[j]) + sanitycheck = null //if a digit is repeated, reject the input if (input == code) user << "The crate unlocks!" locked = 0 cut_overlays() add_overlay("securecrateg") - else if (input == null || length(input) != codelen) + else if (input == null || sanitycheck == null || length(input) != codelen) user << "You leave the crate alone." else user << "A red light flashes." - lastattempt = replacetext(input, 0, "z") + lastattempt = input attempts-- if(attempts == 0) boom(user) @@ -192,19 +200,21 @@ user << "* Anti-Tamper Bomb will activate after [src.attempts] failed access attempts." if(lastattempt != null) var/list/guess = list() + var/list/answer = list() var/bulls = 0 var/cows = 0 - for(var/i = 1, i < codelen + 1, i++) - var/a = copytext(lastattempt, i, i+1) //Stuff the code into the list - guess += a - guess[a] = i - for(var/i in guess) //Go through list and count matches - var/a = findtext(code, i) - if(a == guess[i]) - ++bulls - else if(a) + for(var/i=1,i<=length(lastattempt),i++) + guess += text2num(copytext(lastattempt,i,i+1)) + for(var/i=1,i<=length(lastattempt),i++) + answer += text2num(copytext(code,i,i+1)) + for(var/i = 1, i < codelen + 1, i++) // Go through list and count matches + if( answer.Find(guess[i],1,codelen+1)) ++cows - user << "Last code attempt had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions." + if( answer[i] == guess[i]) + ++bulls + --cows + + user << "Last code attempt, [lastattempt], had [bulls] correct digits at correct positions and [cows] correct digits at incorrect positions." return return ..() From bba59de28d08868415c295354c342fd296a19918 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 04:08:30 +0000 Subject: [PATCH 33/46] Automatic changelog generation for PR #20570 [ci skip] --- html/changelogs/AutoChangeLog-pr-20570.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20570.yml diff --git a/html/changelogs/AutoChangeLog-pr-20570.yml b/html/changelogs/AutoChangeLog-pr-20570.yml new file mode 100644 index 00000000000..e6d9f87a72d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20570.yml @@ -0,0 +1,7 @@ +author: "Screemonster" +delete-after: True +changes: + - tweak: "Abandoned crates no longer accept impossible guesses." + - tweak: "Lets players know that all the digits in the code must be unique." + - tweak: "Reads the last guess back on the multitool along with the correct/incorrect guess readout." + - bugfix: "multitool output on crates no longer returns nonsense values." From 7e5b05ed1f8464d9dadb23a983b9e962d0729c5e Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Tue, 20 Sep 2016 01:43:05 -0400 Subject: [PATCH 34/46] oh my god i'm an idiot (#20581) --- .../mob/living/simple_animal/hostile/megafauna/hierophant.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index c144c200d3b..37aa5575a9b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -87,7 +87,7 @@ Difficulty: Hard did_reset = TRUE //visible_message("\"Vixyvrmrk xs fewi...\"") blink(spawned_rune) - adjustHealth(max((health - maxHealth) * 0.5, 25)) //heal for 50% of our missing health + adjustHealth(min((health - maxHealth) * 0.5, -50)) //heal for 50% of our missing health wander = FALSE /*if(health > maxHealth * 0.9) visible_message("\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\"") From 8a83df0d3bfa63276fd866161a233cdcd592b883 Mon Sep 17 00:00:00 2001 From: kevinz000 Date: Tue, 20 Sep 2016 02:36:11 -0700 Subject: [PATCH 35/46] Arm Combat Cybernetic Implants (because toolset arm shanks weren't enough) (#20544) * combat_cybernetics * flashlight-arms * surgery * thiswillprobablyfixit... * nopethatdoesntwork * revert * nerf * prayingtornjesusitcompiles --- code/game/objects/items/robot/robot_items.dm | 9 ++-- .../objects/items/weapons/melee/energy.dm | 1 - code/modules/assembly/flash.dm | 29 +++++++++++ .../mob/living/silicon/robot/robot_modules.dm | 2 +- code/modules/surgery/organs/augments_arms.dm | 50 +++++++++++++++++++ code/modules/surgery/organs/augments_chest.dm | 1 + 6 files changed, 86 insertions(+), 6 deletions(-) diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 5e8b75b987a..5f1e514cde7 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -10,15 +10,16 @@ icon_state = "elecarm" var/charge_cost = 30 -/obj/item/borg/stun/attack(mob/living/M, mob/living/silicon/robot/user) +/obj/item/borg/stun/attack(mob/living/M, mob/living/user) if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.check_shields(0, "[M]'s [name]", src, MELEE_ATTACK)) playsound(M, 'sound/weapons/Genhit.ogg', 50, 1) return 0 - - if(!user.cell.use(charge_cost)) - return + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + if(!R.cell.use(charge_cost)) + return user.do_attack_animation(M) M.Weaken(5) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 9f93c93eca3..b9d3a17e023 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -238,7 +238,6 @@ /obj/item/weapon/melee/energy/blade/dropped() ..() - qdel(src) /obj/item/weapon/melee/energy/blade/attack_self(mob/user) return diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index 27b859bd10c..f174129c534 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -190,3 +190,32 @@ item_state = "nullrod" /obj/item/device/assembly/flash/handheld //this is now the regular pocket flashes + +/obj/item/device/assembly/flash/armimplant + name = "photon projector" + desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocals fix the flashbulb if it ever burns out." + var/flashcd = 20 + var/overheat = 0 + var/obj/item/organ/cyberimp/arm/flash/I = null + +/obj/item/device/assembly/flash/armimplant/burn_out() + if(I && I.owner) + I.owner << "Your photon projector implant overheats and deactivates!" + I.Retract() + overheat = FALSE + addtimer(src, "cooldown", flashcd * 2) + +/obj/item/device/assembly/flash/armimplant/try_use_flash(mob/user = null) + if(overheat) + if(I && I.owner) + I.owner << "Your photon projector is running too hot to be used again so quickly!" + return FALSE + overheat = TRUE + addtimer(src, "cooldown", flashcd) + playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) + update_icon(1) + return TRUE + + +/obj/item/device/assembly/flash/armimplant/proc/cooldown() + overheat = FALSE diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 34017a7c64e..7658a71c484 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -402,4 +402,4 @@ /datum/robot_energy_storage/medical max_energy = 2500 recharge_rate = 250 - name = "Medical Synthesizer" + name = "Medical Synthesizer" diff --git a/code/modules/surgery/organs/augments_arms.dm b/code/modules/surgery/organs/augments_arms.dm index 76220ef9ddc..9cfed984f4c 100644 --- a/code/modules/surgery/organs/augments_arms.dm +++ b/code/modules/surgery/organs/augments_arms.dm @@ -68,6 +68,10 @@ "[holder] snaps back into your [zone == "r_arm" ? "right" : "left"] arm.", "You hear a short mechanical noise.") + if(istype(holder, /obj/item/device/assembly/flash/armimplant)) + var/obj/item/device/assembly/flash/F = holder + F.SetLuminosity(0) + owner.unEquip(holder, 1) holder.loc = src holder = null @@ -85,6 +89,10 @@ holder.w_class = 5 holder.materials = null + if(istype(holder, /obj/item/device/assembly/flash/armimplant)) + var/obj/item/device/assembly/flash/F = holder + F.SetLuminosity(7) + var/obj/item/arm_item = owner.get_active_held_item() if(arm_item) @@ -178,3 +186,45 @@ items_list += new /obj/item/weapon/kitchen/knife/combat/cyborg(src) return 1 return 0 + +/obj/item/organ/cyberimp/arm/esword + name = "arm-mounted energy blade" + desc = "An illegal, and highly dangerous cybernetic implant that can project a deadly blade of concentrated enregy." + contents = newlist(/obj/item/weapon/melee/energy/blade) + +/obj/item/organ/cyberimp/arm/medibeam + name = "integrated medical beamgun" + desc = "A cybernetic implant that allows the user to project a healing beam from their hand." + contents = newlist(/obj/item/weapon/gun/medbeam) + +/obj/item/organ/cyberimp/arm/flash + name = "integrated high-intensity photon projector" //Why not + desc = "An integrated projector mounted onto a user's arm, that is able to be used as a powerful flash." + contents = newlist(/obj/item/device/assembly/flash/armimplant) + +/obj/item/organ/cyberimp/arm/flash/New() + ..() + if(locate(/obj/item/device/assembly/flash/armimplant) in items_list) + var/obj/item/device/assembly/flash/armimplant/F = locate(/obj/item/device/assembly/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/cyberimp/arm/baton + name = "arm electrification implant" + desc = "An illegal combat implant that allows the user to administer disabling shocks from their arm." + contents = newlist(/obj/item/borg/stun) + +/obj/item/organ/cyberimp/arm/combat + name = "combat cybernetics implant" + desc = "A powerful cybernetic implant that contains combat modules built into the user's arm" + contents = newlist(/obj/item/weapon/melee/energy/blade, /obj/item/weapon/gun/medbeam, /obj/item/borg/stun, /obj/item/device/assembly/flash/armimplant) + +/obj/item/organ/cyberimp/arm/combat/New() + ..() + if(locate(/obj/item/device/assembly/flash/armimplant) in items_list) + var/obj/item/device/assembly/flash/armimplant/F = locate(/obj/item/device/assembly/flash/armimplant) in items_list + F.I = src + +/obj/item/organ/cyberimp/arm/surgery + name = "surgical toolset implant" + desc = "A set of surgical tools hidden behind a concealed panel on the user's arm" + contents = newlist(/obj/item/weapon/retractor, /obj/item/weapon/hemostat, /obj/item/weapon/cautery, /obj/item/weapon/surgicaldrill, /obj/item/weapon/scalpel, /obj/item/weapon/circular_saw, /obj/item/weapon/surgical_drapes) diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index b977b039dff..5121e955a1b 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -197,3 +197,4 @@ toggle(silent=1) return 0 + From cb7036e66c52fb2c6e11b13161593da0edfed09d Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 09:36:12 +0000 Subject: [PATCH 36/46] Automatic changelog generation for PR #20544 [ci skip] --- html/changelogs/AutoChangeLog-pr-20544.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20544.yml diff --git a/html/changelogs/AutoChangeLog-pr-20544.yml b/html/changelogs/AutoChangeLog-pr-20544.yml new file mode 100644 index 00000000000..ed63895a28c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20544.yml @@ -0,0 +1,5 @@ +author: "Mekhi" +delete-after: True +changes: + - rscadd: "Nanotrasen has been experimenting on cybernetics for a while, and rumors are they have a few combat prototypes available..." + - experiment: "New arm implants: Energy-blade projector, implanted medical beamgun, stun-arm implant (Like the borg version), flash implant that is automatically-regenerating and doubles as a powerful flashlight. There is also one with all four items in one. Also, a surgery toolkit implant. Adminspawn only for the moment." From ea21aa4e0017a6de036d9f0b823b960b6fb6b8fe Mon Sep 17 00:00:00 2001 From: Xhuis Date: Tue, 20 Sep 2016 05:37:08 -0400 Subject: [PATCH 37/46] Highlander Patch (#20211) * Highlander changes * Prevents losing your claymore F O R E V E R * Adds partial bloodthirst sating from attacking * Reworks bloodthirst * Forgot to push this * Adds a disk-capture mechanic * Changes based on feedback * Bugfixes * Makes the pinpointer functional --- code/game/gamemodes/nuclear/nuclearbomb.dm | 16 ++- code/game/objects/items/weapons/weaponry.dm | 39 ++++++- code/modules/admin/verbs/onlyone.dm | 106 ++++++++++++-------- code/modules/mob/new_player/new_player.dm | 3 + 4 files changed, 117 insertions(+), 47 deletions(-) diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 98d0f963433..e0d0fdb3d00 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -91,7 +91,7 @@ var/bomb_set if (istype(I, /obj/item/weapon/disk/nuclear)) if(!user.drop_item()) return - I.loc = src + I.forceMove(src) auth = I add_fingerprint(user) return @@ -496,6 +496,20 @@ This is here to make the tiles around the station mininuke change when it's arme poi_list |= src START_PROCESSING(SSobj, src) +/obj/item/weapon/disk/nuclear/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/weapon/claymore/highlander)) + var/obj/item/weapon/claymore/highlander/H = I + if(H.nuke_disk) + user << "Wait... what?" + qdel(H.nuke_disk) + H.nuke_disk = null + return + user.visible_message("[user] captures [src]!", "You've got the disk! Defend it with your life!") + loc = H + H.nuke_disk = src + return 1 + return ..() + /obj/item/weapon/disk/nuclear/suicide_act(mob/user) user.visible_message("[user] is \ going delta! It looks like they're comitting suicide.") diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 0702a80d30c..07d09d07451 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -82,10 +82,14 @@ var/highlander_claymores = 0 /obj/item/weapon/claymore/highlander //ALL COMMENTS MADE REGARDING THIS SWORD MUST BE MADE IN ALL CAPS desc = "THERE CAN BE ONLY ONE, AND IT WILL BE YOU!!!\nActivate it in your hand to point to the nearest victim." + flags = CONDUCT | NODROP + slot_flags = null block_chance = 0 //RNG WON'T HELP YOU NOW, PANSY - attack_verb = list("brutalized", "eviscerated", "disemboweled", "hacked", "carved", "cleaved", "gored") //ONLY THE MOST VISCERAL ATTACK VERBS + attack_verb = list("brutalized", "eviscerated", "disemboweled", "hacked", "carved", "cleaved") //ONLY THE MOST VISCERAL ATTACK VERBS var/notches = 0 //HOW MANY PEOPLE HAVE BEEN SLAIN WITH THIS BLADE var/announced = FALSE //IF WE ARE THE ONLY ONE LEFT STANDING + var/bloodthirst_level = 0 //HOW THIRSTY WE ARE FOR BLOOD + var/obj/item/weapon/disk/nuclear/nuke_disk //OUR STORED NUKE DISK /obj/item/weapon/claymore/highlander/New() ..() @@ -95,19 +99,27 @@ var/highlander_claymores = 0 /obj/item/weapon/claymore/highlander/Destroy() STOP_PROCESSING(SSobj, src) highlander_claymores-- + if(nuke_disk) + nuke_disk.forceMove(get_turf(src)) + nuke_disk.visible_message("The nuke disk is vulnerable!") + nuke_disk = null return ..() /obj/item/weapon/claymore/highlander/process() if(isliving(loc)) var/mob/living/L = loc if(L.stat != DEAD) + if(!announced) + handle_bloodthirst(L) if(announced || admin_spawned || highlander_claymores > 1) return announced = TRUE L.fully_heal() - world << "[L.real_name] IS THE ONLY ONE LEFT STANDING!" + world << "[uppertext(L.real_name)] IS THE ONLY ONE LEFT STANDING!" world << sound('sound/misc/highlander_only_one.ogg') L << "YOU ARE THE ONLY ONE LEFT STANDING!" + for(var/obj/item/weapon/bloodcrawl/B in L) + qdel(B) /obj/item/weapon/claymore/highlander/pickup(mob/living/user) user << "The power of Scotland protects you! You are shielded from all stuns and knockdowns." @@ -120,12 +132,18 @@ var/highlander_claymores = 0 /obj/item/weapon/claymore/highlander/examine(mob/user) ..() user << "It has [!notches ? "nothing" : "[notches] notches"] scratched into the blade." + if(nuke_disk) + user << "It's holding the nuke disk!" /obj/item/weapon/claymore/highlander/attack(mob/living/target, mob/living/user) var/old_target_stat = target.stat . = ..() + bloodthirst_level = max(bloodthirst_level - (target.mind && target.mind.special_role == "highlander" ? 15 : 5), 0) if(target && target.stat == DEAD && old_target_stat != DEAD && target.mind && target.mind.special_role == "highlander") user.fully_heal() //STEAL THE LIFE OF OUR FALLEN FOES + if(bloodthirst_level >= 30) + user << "[src] shakes greedily as it devours [target]'s soul. Its bloodthirst is quenched for the moment..." + bloodthirst_level = 0 add_notch(user) target.visible_message("[target] crumbles to dust beneath [user]'s blows!", "As you fall, your body crumbles to dust!") target.dust() @@ -138,6 +156,7 @@ var/highlander_claymores = 0 closest_victim = H if(!closest_victim) user << "[src] thrums for a moment and falls dark. Perhaps there's nobody nearby." + return user << "[src] thrums and points to the [dir2text(get_dir(user, closest_victim))]." /obj/item/weapon/claymore/highlander/IsReflect() @@ -196,6 +215,22 @@ var/highlander_claymores = 0 name = new_name playsound(user, 'sound/items/Screwdriver2.ogg', 50, 1) +/obj/item/weapon/claymore/highlander/proc/handle_bloodthirst(mob/living/S) //THE BLADE THIRSTS FOR BLOOD AND WILL PUNISH THE WEAK OR PACIFISTIC + bloodthirst_level += (1 + min(notches, 10)) + if(bloodthirst_level == 30) + S << "[src] shudders in your hand. It hungers for battle..." + if(bloodthirst_level == 60) + S << "[src] trembles violently. Kill someone already!" + if(bloodthirst_level == 90) + S << "[src] starts shaking viciously! Shed blood or it'll give you away!" + if(bloodthirst_level >= 120) + var/turf/T = get_turf(S) + for(var/mob/M in player_list - S) + if(M.z == T.z) + M << "THERE IS A COWARD WHO DOES NOT FIGHT TO THE [uppertext(dir2text(get_dir(M, T)))]. THEIR NAME IS [uppertext(S.real_name)] - SLAUGHTER THEM." + S << "you fucked up" + bloodthirst_level = 100 + /obj/item/weapon/katana name = "katana" desc = "Woefully underpowered in D20" diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm index affb6b57bc9..fa8998008d6 100644 --- a/code/modules/admin/verbs/onlyone.dm +++ b/code/modules/admin/verbs/onlyone.dm @@ -1,60 +1,78 @@ -/client/proc/only_one() +var/highlander = FALSE +/client/proc/only_one() //Gives everyone kilts, berets, claymores, and pinpointers, with the objective to hijack the emergency shuttle. if(!ticker || !ticker.mode) alert("The game hasn't started yet!") return + highlander = TRUE world << "THERE CAN BE ONLY ONE!!!" world << sound('sound/misc/highlander.ogg') + for(var/obj/item/weapon/disk/nuclear/N in poi_list) + N.relocate() //Gets it out of bags and such + for(var/mob/living/carbon/human/H in player_list) - if(H.stat == DEAD || !(H.client)) continue - - ticker.mode.traitors += H.mind - H.mind.special_role = "highlander" - - H.dna.species.specflags |= NOGUNS //nice try jackass - - var/datum/objective/steal/steal_objective = new - steal_objective.owner = H.mind - steal_objective.set_target(new /datum/objective_item/steal/nukedisc) - H.mind.objectives += steal_objective - - var/datum/objective/hijack/hijack_objective = new - hijack_objective.explanation_text = "Escape on the shuttle alone. Ensure nobody else makes it out." - hijack_objective.owner = H.mind - H.mind.objectives += hijack_objective - - H.mind.announce_objectives() - - for (var/obj/item/I in H) - if (istype(I, /obj/item/weapon/implant)) - continue - qdel(I) - - H.equip_to_slot_or_del(new /obj/item/clothing/under/kilt/highlander(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(H), slot_ears) - H.equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/weapon/pinpointer(H.loc), slot_l_store) - - var/obj/item/weapon/card/id/W = new(H) - W.icon_state = "centcom" - W.access = get_all_accesses() - W.access += get_all_centcom_access() - W.assignment = "Highlander" - W.registered_name = H.real_name - W.flags |= NODROP - W.update_label(H.real_name) - H.equip_to_slot_or_del(W, slot_wear_id) - - var/obj/item/weapon/claymore/highlander/H1 = new(H) - H.put_in_hands(H1) - H1.pickup(H) + if(H.stat == DEAD || !(H.client)) + continue + H.make_scottish() message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE!") log_admin("[key_name(usr)] used THERE CAN BE ONLY ONE.") addtimer(SSshuttle.emergency, "request", 50, FALSE, null, 1) +/mob/living/carbon/human/proc/make_scottish() + ticker.mode.traitors += mind + mind.special_role = "highlander" + dna.species.specflags |= NOGUNS //nice try jackass + + var/datum/objective/steal/steal_objective = new + steal_objective.owner = mind + steal_objective.set_target(new /datum/objective_item/steal/nukedisc) + mind.objectives += steal_objective + + var/datum/objective/hijack/hijack_objective = new + hijack_objective.explanation_text = "Escape on the shuttle alone. Ensure that nobody else makes it out." + hijack_objective.owner = mind + mind.objectives += hijack_objective + + mind.announce_objectives() + + for(var/obj/item/I in src) + if(istype(I, /obj/item/weapon/implant)) + continue + qdel(I) + equip_to_slot_or_del(new /obj/item/clothing/under/kilt/highlander(src), slot_w_uniform) + equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/captain(src), slot_ears) + equip_to_slot_or_del(new /obj/item/clothing/head/beret/highlander(src), slot_head) + equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(src), slot_shoes) + equip_to_slot_or_del(new /obj/item/weapon/pinpointer(src), slot_l_store) + for(var/obj/item/weapon/pinpointer/P in src) + P.attack_self(src) + var/obj/item/weapon/card/id/W = new(src) + W.icon_state = "centcom" + W.access = get_all_accesses() + W.access += get_all_centcom_access() + W.assignment = "Highlander" + W.registered_name = real_name + W.flags |= NODROP + W.update_label(real_name) + equip_to_slot_or_del(W, slot_wear_id) + + var/obj/item/weapon/claymore/highlander/H1 = new(src) + if(!highlander) + H1.admin_spawned = TRUE //To prevent announcing + put_in_hands(H1) + H1.pickup(src) //For the stun shielding + + var/obj/item/weapon/bloodcrawl/antiwelder = new(src) + antiwelder.name = "compulsion of honor" + antiwelder.desc = "You are unable to hold anything in this hand until you're the last one left!" + antiwelder.icon_state = "bloodhand_right" + put_in_hands(antiwelder) + + src << "Your [H1.name] cries out for blood. Join in the slaughter, lest you be claimed yourself...\n\ + Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it." + /proc/only_me() if(!ticker || !ticker.mode) alert("The game hasn't started yet!") diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 3c2c95fbbf8..e947d24c1a7 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -332,6 +332,9 @@ data_core.manifest_inject(humanc) AnnounceArrival(humanc, rank) AddEmploymentContract(humanc) + if(highlander) + humanc << "THERE CAN BE ONLY ONE!!!" + humanc.make_scottish() joined_player_list += character.ckey From e54286fba811462763d495fc553c2c72c64f5f0b Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 09:37:10 +0000 Subject: [PATCH 38/46] Automatic changelog generation for PR #20211 [ci skip] --- html/changelogs/AutoChangeLog-pr-20211.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20211.yml diff --git a/html/changelogs/AutoChangeLog-pr-20211.yml b/html/changelogs/AutoChangeLog-pr-20211.yml new file mode 100644 index 00000000000..586fa4b7028 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20211.yml @@ -0,0 +1,5 @@ +author: "Nanotrasen Stress Relief Board" +delete-after: True +changes: + - rscadd: "Latecomers to highlander can now join in on the fun." + - rscadd: "The crew are encouraged to less pacifistic during highlander. Failing to shed blood will result in your soul being devoured. Have a nice day." From 8ceb7416a26e3b84352c7021f85598799a42c89c Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 09:42:53 +0000 Subject: [PATCH 39/46] Automatic changelog generation for PR #20488 [ci skip] --- html/changelogs/AutoChangeLog-pr-20488.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20488.yml diff --git a/html/changelogs/AutoChangeLog-pr-20488.yml b/html/changelogs/AutoChangeLog-pr-20488.yml new file mode 100644 index 00000000000..cb21538e9cb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20488.yml @@ -0,0 +1,4 @@ +author: "phil235" +delete-after: True +changes: + - experiment: "adds a talk button next to the crafting button. Clicking it makes a \"wheel\" appear around you with short predetermined messages that you click to say them. This lets you say common responses without having to type in the chat bar. Current messages available are: \"Hi\", \"Bye\", \"Thanks\", \"Come\", \"Help\", \"Stop\", \"Get out\", \"Yes\", and \"No\". The talk button can be activated with the hotkey \"H\" or \"CTRL+H\"" From 5d2255e0e5340a43d9fc517f6c4667c686cb823d Mon Sep 17 00:00:00 2001 From: yackemflam Date: Tue, 20 Sep 2016 18:47:24 +0900 Subject: [PATCH 40/46] Syndicate Ninja (#20520) * Syndicate Ninja * Update uplink_kits.dm --- .../objects/items/weapons/storage/uplink_kits.dm | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index 9f27404afae..38ade34e247 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -2,7 +2,7 @@ /obj/item/weapon/storage/box/syndicate/New() ..() - switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "lordsingulo" = 1, "darklord" = 1, "sniper" = 1, "metaops" = 1))) + switch (pickweight(list("bloodyspai" = 3, "stealth" = 2, "bond" = 2, "screwed" = 2, "sabotage" = 3, "guns" = 2, "murder" = 2, "implant" = 1, "hacker" = 3, "lordsingulo" = 1, "darklord" = 1, "sniper" = 1, "metaops" = 1, "ninja" = 1))) if("bloodyspai") // 27 tc now this is more right new /obj/item/clothing/under/chameleon(src) // 2 tc since it's not the full set new /obj/item/clothing/mask/chameleon(src) // Goes with above @@ -131,6 +131,19 @@ new /obj/item/weapon/grenade/plastic/c4 (src) // 1 tc new /obj/item/weapon/card/emag(src) // 6 tc return + + if("ninja") // 33 tc worth + new /obj/item/weapon/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc? + new /obj/item/weapon/implanter/adrenalin(src) // 8 tc + new /obj/item/weapon/throwing_star(src) // ~5 tc for all 6 + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/throwing_star(src) + new /obj/item/weapon/storage/belt/military/assault(src) // 3 tc + new /obj/item/weapon/card/id/syndicate(src) // 2 tc + new /obj/item/device/chameleon(src) // 7 tc /obj/item/weapon/storage/box/syndie_kit name = "box" From f4e2b2e7b7b3d0c4c7ecc9c7f84f9e4ac89f2fb2 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 09:47:25 +0000 Subject: [PATCH 41/46] Automatic changelog generation for PR #20520 [ci skip] --- html/changelogs/AutoChangeLog-pr-20520.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20520.yml diff --git a/html/changelogs/AutoChangeLog-pr-20520.yml b/html/changelogs/AutoChangeLog-pr-20520.yml new file mode 100644 index 00000000000..b3a6e127152 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20520.yml @@ -0,0 +1,4 @@ +author: "Yackemflam" +delete-after: True +changes: + - rscadd: "The syndicate has learned on how to give their agents a true syndicate ninja experience." From 3c34269258f1eee229d00cc7e7b7b85a1baebe44 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Tue, 20 Sep 2016 05:48:12 -0400 Subject: [PATCH 42/46] this is kind of cruel to phil (#20573) but phil's nice so I'll stop after this --- code/game/gamemodes/cult/ritual.dm | 5 +- code/game/gamemodes/cult/runes.dm | 89 +++++++++++++----------------- 2 files changed, 40 insertions(+), 54 deletions(-) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 9c7b709b6b6..0b1d11cd3c4 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -74,9 +74,8 @@ This file contains the arcane tome files. Successful conversions will produce a tome for the new cultist, in addition to healing them.
\ Successful sacrifices will please the Geometer, can complete your objective if it sacrificed the sacrifice target, and will attempt to place the target into a soulstone.

" - text += "Raise Dead
This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \ - the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \ - within a few seconds, they will be brought back to life, healed of all ailments.

" + text += "Raise Dead
This rune requires the corpse of a cultist placed upon the rune, and one person sacrificed for each revival you wish to do.\ + Provided there are remaining revivals from those sacrificed, invoking the rune will revive the cultist placed upon it.

" text += "Electromagnetic Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. This rune may allow you to gain the upper \ hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location. The size of the EMP will grow significantly for each additional adjacent cultist when the \ diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index d6340bab28c..d42b1bdeaff 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -1,4 +1,4 @@ -/var/list/sacrificed = list() +/var/list/sacrificed = list() //a mixed list of minds and mobs var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed) /* @@ -412,9 +412,11 @@ var/list/teleport_runes = list() var/sacrifice_fulfilled = FALSE if(sacrificial.mind) - sacrificed.Add(sacrificial.mind) + sacrificed += sacrificial.mind if(is_sacrifice_target(sacrificial.mind)) sacrifice_fulfilled = TRUE + else + sacrificed += sacrificial PoolOrNew(/obj/effect/overlay/temp/cult/sac, get_turf(src)) for(var/M in invokers) @@ -518,50 +520,47 @@ var/list/teleport_runes = list() ..() return -//Rite of Resurrection: Requires two corpses. Revives one and gibs the other. +//Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people sacrificed /obj/effect/rune/raise_dead cultist_name = "Raise Dead" - cultist_desc = "requires two corpses, one on the rune and one adjacent to the rune. The one on the rune is brought to life, the other is turned to ash." + cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived." invocation = null //Depends on the name of the user - see below icon_state = "1" color = "#C80000" + var/static/revives_used = 0 + +/obj/effect/rune/raise_dead/examine(mob/user) + ..() + if(iscultist(user) || user.stat == DEAD) + var/revive_number = 0 + if(sacrificed.len) + revive_number = sacrificed.len - revives_used + user << "Revives Remaining: [revive_number]" /obj/effect/rune/raise_dead/invoke(var/list/invokers) var/turf/T = get_turf(src) - var/mob/living/mob_to_sacrifice var/mob/living/mob_to_revive - var/list/potential_sacrifice_mobs = list() var/list/potential_revive_mobs = list() var/mob/living/user = invokers[1] if(rune_in_use) return - for(var/mob/living/M in orange(1,T)) - if(M.stat == DEAD && !iscultist(M)) - potential_sacrifice_mobs |= M - if(!potential_sacrifice_mobs.len) - user << "There are no eligible sacrifices nearby!" - log_game("Raise Dead rune failed - no catalyst corpses") - fail_invoke() - return for(var/mob/living/M in T.contents) - if(M.stat == DEAD) + if(iscultist(M) && M.stat == DEAD) potential_revive_mobs |= M if(!potential_revive_mobs.len) - user << "There is no eligible revival target on the rune!" + user << "There are no dead cultists on the rune!" log_game("Raise Dead rune failed - no corpses to revive") fail_invoke() return - if(potential_sacrifice_mobs.len > 1) - mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs - else - mob_to_sacrifice = potential_sacrifice_mobs[1] - if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, TRUE)) + if(!sacrificed.len || sacrificed.len <= revives_used) + user << "You have sacrificed too few people to revive a cultist!" + fail_invoke() return if(potential_revive_mobs.len > 1) - mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs + mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs else mob_to_revive = potential_revive_mobs[1] - if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_sacrifice, user, TRUE) || !validness_checks(mob_to_revive, user, FALSE)) + if(!src || qdeleted(src) || rune_in_use || !validness_checks(mob_to_revive, user)) return rune_in_use = 1 if(user.name == "Herbert West") @@ -569,19 +568,7 @@ var/list/teleport_runes = list() else user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") ..() - mob_to_sacrifice.visible_message("[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!") - mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",time=20) - sleep(20) - if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src)) - rune_in_use = 0 - return - if(!mob_to_revive || mob_to_revive.stat != DEAD) - visible_message("The glowing tendril snaps against the rune with a shocking crack.") - rune_in_use = 0 - fail_invoke() - return - mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones.") - mob_to_sacrifice.dust() + revives_used++ mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it! mob_to_revive.grab_ghost() mob_to_revive << "\"PASNAR SAVRAE YAM'TOTH. Arise.\"" @@ -589,7 +576,7 @@ var/list/teleport_runes = list() "You awaken suddenly from the void. You're alive!") rune_in_use = 0 -/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user, saccing) +/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user) var/turf/T = get_turf(src) if(!user) return 0 @@ -598,28 +585,28 @@ var/list/teleport_runes = list() if(!target_mob) fail_invoke() return 0 - if(saccing) - if(!in_range(target_mob, src)) - user << "The sacrificial target has been moved!" - fail_invoke() - log_game("Raise Dead rune failed - catalyst corpse moved") - return 0 - if(target_mob.stat != DEAD) - user << "The sacrificial target must be dead!" - fail_invoke() - log_game("Raise Dead rune failed - catalyst corpse is not dead") - return 0 - else if(!(target_mob in T.contents)) - user << "The corpse to revive has been moved!" + if(!(target_mob in T.contents)) + user << "The cultist to revive has been moved!" fail_invoke() log_game("Raise Dead rune failed - revival target moved") return 0 + var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE) + if(!ghost) + user << "The corpse to revive has no spirit!" + fail_invoke() + log_game("Raise Dead rune failed - revival target has no ghost") + return 0 + if(!sacrificed.len || sacrificed.len <= revives_used) + user << "You have sacrificed too few people to revive a cultist!" + fail_invoke() + log_game("Raise Dead rune failed - too few sacrificed") + return 0 return 1 /obj/effect/rune/raise_dead/fail_invoke() ..() for(var/mob/living/M in range(1,src)) - if(M.stat == DEAD) + if(iscultist(M) && M.stat == DEAD) M.visible_message("[M] twitches.") From 1de3b45e84adad6ab438aaeffb9104e54ffa2c60 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Tue, 20 Sep 2016 09:48:13 +0000 Subject: [PATCH 43/46] Automatic changelog generation for PR #20573 [ci skip] --- html/changelogs/AutoChangeLog-pr-20573.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-20573.yml diff --git a/html/changelogs/AutoChangeLog-pr-20573.yml b/html/changelogs/AutoChangeLog-pr-20573.yml new file mode 100644 index 00000000000..0aee1e6e0d8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-20573.yml @@ -0,0 +1,4 @@ +author: "Joan" +delete-after: True +changes: + - experiment: "The Raise Dead rune no longer requires a noncultist corpse to revive a cultist; instead, it will draw from the pool of all people sacrificed to power the rune." From 7dd3372613bd519305ba7438cd2d7e45eb5c0209 Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Tue, 20 Sep 2016 11:23:43 +0000 Subject: [PATCH 44/46] Automatic changelog compile, [ci skip] --- html/changelog.html | 105 +++++++++++++-------- html/changelogs/.all_changelog.yml | 70 ++++++++++++++ html/changelogs/AutoChangeLog-pr-20211.yml | 5 - html/changelogs/AutoChangeLog-pr-20430.yml | 4 - html/changelogs/AutoChangeLog-pr-20488.yml | 4 - html/changelogs/AutoChangeLog-pr-20499.yml | 4 - html/changelogs/AutoChangeLog-pr-20501.yml | 4 - html/changelogs/AutoChangeLog-pr-20512.yml | 7 -- html/changelogs/AutoChangeLog-pr-20520.yml | 4 - html/changelogs/AutoChangeLog-pr-20544.yml | 5 - html/changelogs/AutoChangeLog-pr-20547.yml | 5 - html/changelogs/AutoChangeLog-pr-20552.yml | 4 - html/changelogs/AutoChangeLog-pr-20555.yml | 4 - html/changelogs/AutoChangeLog-pr-20568.yml | 4 - html/changelogs/AutoChangeLog-pr-20569.yml | 4 - html/changelogs/AutoChangeLog-pr-20570.yml | 7 -- html/changelogs/AutoChangeLog-pr-20571.yml | 4 - html/changelogs/AutoChangeLog-pr-20573.yml | 4 - html/changelogs/AutoChangeLog-pr-20578.yml | 4 - 19 files changed, 134 insertions(+), 118 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-20211.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20430.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20488.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20499.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20501.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20512.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20520.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20544.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20547.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20552.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20555.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20568.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20569.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20570.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20571.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20573.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-20578.yml diff --git a/html/changelog.html b/html/changelog.html index 85e774e50bf..0a1e74bb5a1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,70 @@ -->
+

20 September 2016

+

Ergovisavi updated:

+
    +
  • fixed "friendly" xenobio mobs and mining drones attacking station drones
  • +
+

Joan updated:

+
    +
  • Miners can now buy KA AoE damage mods from the mining vendor for 2000 points per mod.
  • +
  • Combined the Convert and Sacrifice runes into one rune. It'll convert targets that are alive and eligible, and attempt to sacrifice them otherwise. The only changes to mechanics are that: Converting someone will heal them of all brute and burn damage they had, and sacrificing anything will always produce a soulstone(but will still only sometimes fill it)
  • +
  • You can no longer teleport to Teleport runes that have dense objects on top of them.
  • +
  • Wall runes will now activate other nearby wall runes when activated, but will automatically disable after a minute and a half of continuous activity and become unusable for 5 seconds.
  • +
  • The Blood Boil rune no longer does all of its damage instantly or stuns, but if you remain in range for the full duration you will be sent deep into critical.
  • +
  • Bubblegum has been seen reaching through blood. Try not to get hit.
  • +
  • The Raise Dead rune no longer requires a noncultist corpse to revive a cultist; instead, it will draw from the pool of all people sacrificed to power the rune.
  • +
+

Mekhi updated:

+
    +
  • Nanotrasen has been experimenting on cybernetics for a while, and rumors are they have a few combat prototypes available...
  • +
  • New arm implants: Energy-blade projector, implanted medical beamgun, stun-arm implant (Like the borg version), flash implant that is automatically-regenerating and doubles as a powerful flashlight. There is also one with all four items in one. Also, a surgery toolkit implant. Adminspawn only for the moment.
  • +
+

MrStonedOne updated:

+
    +
  • Fixed space/nograv movement not triggering when atoms moved twice quickly in space/nograv
  • +
+

Nanotrasen Stress Relief Board updated:

+
    +
  • Latecomers to highlander can now join in on the fun.
  • +
  • The crew are encouraged to less pacifistic during highlander. Failing to shed blood will result in your soul being devoured. Have a nice day.
  • +
+

Nicho1010 updated:

+
    +
  • Fixed lattices appearing after exploding lava
  • +
+

Screemonster updated:

+
    +
  • Abandoned crates no longer accept impossible guesses.
  • +
  • Lets players know that all the digits in the code must be unique.
  • +
  • Reads the last guess back on the multitool along with the correct/incorrect guess readout.
  • +
  • multitool output on crates no longer returns nonsense values.
  • +
+

XDTM updated:

+
    +
  • Positive viruses are now recognized by medical HUDs with a special icon.
  • +
  • fully_heal no longer removes nonharmful viruses. This affects legion souls, staffs of healing, and changeling's revive.
  • +
  • Canisters of any type of gas are now orderable in cargo. Dangerous experimental gases will require Research Director approval.
  • +
+

Yackemflam updated:

+
    +
  • The syndicate has learned on how to give their agents a true syndicate ninja experience.
  • +
+

chickenboy10 updated:

+
    +
  • Added a Experimental Limb Grower to the medbay department, now medical stuff can grow synthetic limbs using Synthflesh to help crew that suffer any work related accidents. There may also be a limb that can be grown with a special card...
  • +
+

feemjmeem updated:

+
    +
  • You can now disassemble meatspike frames with a welding tool.
  • +
+

phil235 updated:

+
    +
  • adds a talk button next to the crafting button. Clicking it makes a "wheel" appear around you with short predetermined messages that you click to say them. This lets you say common responses without having to type in the chat bar. Current messages available are: "Hi", "Bye", "Thanks", "Come", "Help", "Stop", "Get out", "Yes", and "No". The talk button can be activated with the hotkey "H" or "CTRL+H"
  • +
  • Wearing colored glasses colors your vision. This option can be enabled/disabled by alt-clicking any glasses with such feature.
  • +
+

17 September 2016

BoxcarRacer41 updated:

    @@ -1056,47 +1120,6 @@
  • Clockwork cultists may now have the "Escape" and "Silicon" objectives, requiring a certain amount of servants to escape on the shuttle and all silicons to be converted respectively.
  • Ocular wardens are now forced to target bibles rather than the people holding them.
- -

19 July 2016

-

Joan updated:

-
    -
  • Cogscarabs can no longer pass mobs and have slightly less health.
  • -
  • The Gateway to the Celestial Derelict can now take damage from bombs.
  • -
-

RemieRichards updated:

-
    -
  • Added VR Sleepers that allow users to enter a virtual body in a virtual world (Currently not mapped in ;_;)
  • -
-

Xhuis updated:

-
    -
  • Added communication intercept texts for gamemodes that were missing them.
  • -
  • Changed all intercept texts and improved grammar for a lot of key game code.
  • -
  • The shuttle can now leave while a celestial gateway exists.
  • -
  • If the shuttle docks at Central Command while a celestial gateway exists, Ratvar's servants will win a minor victory. His arrival will still award a major victory.
  • -
  • The celestial gateway can now take damage from explosions.
  • -
- -

18 July 2016

-

CoreOverload updated:

-
    -
  • Sterilizine now reduces probability of step failure if you apply it after starting surgery. Useful while operating in less-than-perfect conditions.
  • -
  • Potent alcohol can be used as replacement for sterilizine.
  • -
-

Joan updated:

-
    -
  • The Vanguard scripture no longer prevents you from using slabs while active, but you cannot reactivate it if it is currently active.
  • -
  • It now only lasts 20 seconds, instead of 30.
  • -
  • When Vanguard deactivates, it now stuns for half the time of all stuns absorbed, instead of all of them.
  • -
  • Invoking Sevtug is less potent at long ranges, and slightly more potent if extremely close.
  • -
  • Invoking Sevtug now requires 3 invokers instead of 1.
  • -
  • The Clockwork Slab now has action buttons for rapidly invoking Guvax and Vanguard.
  • -
  • Belligerent is now chanted more often.
  • -
  • Taunting Tirade now weakens nearby nonservants, but is now only invoked once every 6 seconds(1 second chant, 5 second flee time) and is only chanted five times.
  • -
-

lordpidey updated:

-
    -
  • Flyswatters are now included in beekeeping crates, they are great at killing insects and flies of all sizes.
  • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f4c61eb52ee..845b084581f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7110,3 +7110,73 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. your active hand and talk normally. - rscadd: Added new things - imageadd: added some icons and images +2016-09-20: + Ergovisavi: + - bugfix: fixed "friendly" xenobio mobs and mining drones attacking station drones + Joan: + - rscadd: Miners can now buy KA AoE damage mods from the mining vendor for 2000 + points per mod. + - rscadd: 'Combined the Convert and Sacrifice runes into one rune. It''ll convert + targets that are alive and eligible, and attempt to sacrifice them otherwise. + The only changes to mechanics are that: Converting someone will heal them of + all brute and burn damage they had, and sacrificing anything will always produce + a soulstone(but will still only sometimes fill it)' + - tweak: You can no longer teleport to Teleport runes that have dense objects on + top of them. + - experiment: Wall runes will now activate other nearby wall runes when activated, + but will automatically disable after a minute and a half of continuous activity + and become unusable for 5 seconds. + - experiment: The Blood Boil rune no longer does all of its damage instantly or + stuns, but if you remain in range for the full duration you will be sent deep + into critical. + - experiment: Bubblegum has been seen reaching through blood. Try not to get hit. + - experiment: The Raise Dead rune no longer requires a noncultist corpse to revive + a cultist; instead, it will draw from the pool of all people sacrificed to power + the rune. + Mekhi: + - rscadd: Nanotrasen has been experimenting on cybernetics for a while, and rumors + are they have a few combat prototypes available... + - experiment: 'New arm implants: Energy-blade projector, implanted medical beamgun, + stun-arm implant (Like the borg version), flash implant that is automatically-regenerating + and doubles as a powerful flashlight. There is also one with all four items + in one. Also, a surgery toolkit implant. Adminspawn only for the moment.' + MrStonedOne: + - bugfix: Fixed space/nograv movement not triggering when atoms moved twice quickly + in space/nograv + Nanotrasen Stress Relief Board: + - rscadd: Latecomers to highlander can now join in on the fun. + - rscadd: The crew are encouraged to less pacifistic during highlander. Failing + to shed blood will result in your soul being devoured. Have a nice day. + Nicho1010: + - bugfix: Fixed lattices appearing after exploding lava + Screemonster: + - tweak: Abandoned crates no longer accept impossible guesses. + - tweak: Lets players know that all the digits in the code must be unique. + - tweak: Reads the last guess back on the multitool along with the correct/incorrect + guess readout. + - bugfix: multitool output on crates no longer returns nonsense values. + XDTM: + - rscadd: Positive viruses are now recognized by medical HUDs with a special icon. + - tweak: fully_heal no longer removes nonharmful viruses. This affects legion souls, + staffs of healing, and changeling's revive. + - rscadd: Canisters of any type of gas are now orderable in cargo. Dangerous experimental + gases will require Research Director approval. + Yackemflam: + - rscadd: The syndicate has learned on how to give their agents a true syndicate + ninja experience. + chickenboy10: + - rscadd: Added a Experimental Limb Grower to the medbay department, now medical + stuff can grow synthetic limbs using Synthflesh to help crew that suffer any + work related accidents. There may also be a limb that can be grown with a special + card... + feemjmeem: + - tweak: You can now disassemble meatspike frames with a welding tool. + phil235: + - experiment: 'adds a talk button next to the crafting button. Clicking it makes + a "wheel" appear around you with short predetermined messages that you click + to say them. This lets you say common responses without having to type in the + chat bar. Current messages available are: "Hi", "Bye", "Thanks", "Come", "Help", + "Stop", "Get out", "Yes", and "No". The talk button can be activated with the + hotkey "H" or "CTRL+H"' + - rscadd: Wearing colored glasses colors your vision. This option can be enabled/disabled + by alt-clicking any glasses with such feature. diff --git a/html/changelogs/AutoChangeLog-pr-20211.yml b/html/changelogs/AutoChangeLog-pr-20211.yml deleted file mode 100644 index 586fa4b7028..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20211.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Nanotrasen Stress Relief Board" -delete-after: True -changes: - - rscadd: "Latecomers to highlander can now join in on the fun." - - rscadd: "The crew are encouraged to less pacifistic during highlander. Failing to shed blood will result in your soul being devoured. Have a nice day." diff --git a/html/changelogs/AutoChangeLog-pr-20430.yml b/html/changelogs/AutoChangeLog-pr-20430.yml deleted file mode 100644 index e265a4797a5..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20430.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Miners can now buy KA AoE damage mods from the mining vendor for 2000 points per mod." diff --git a/html/changelogs/AutoChangeLog-pr-20488.yml b/html/changelogs/AutoChangeLog-pr-20488.yml deleted file mode 100644 index cb21538e9cb..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20488.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "phil235" -delete-after: True -changes: - - experiment: "adds a talk button next to the crafting button. Clicking it makes a \"wheel\" appear around you with short predetermined messages that you click to say them. This lets you say common responses without having to type in the chat bar. Current messages available are: \"Hi\", \"Bye\", \"Thanks\", \"Come\", \"Help\", \"Stop\", \"Get out\", \"Yes\", and \"No\". The talk button can be activated with the hotkey \"H\" or \"CTRL+H\"" diff --git a/html/changelogs/AutoChangeLog-pr-20499.yml b/html/changelogs/AutoChangeLog-pr-20499.yml deleted file mode 100644 index 5d271b48595..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20499.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "phil235" -delete-after: True -changes: - - rscadd: "Wearing colored glasses colors your vision. This option can be enabled/disabled by alt-clicking any glasses with such feature." diff --git a/html/changelogs/AutoChangeLog-pr-20501.yml b/html/changelogs/AutoChangeLog-pr-20501.yml deleted file mode 100644 index 6d449f5caca..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20501.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "chickenboy10" -delete-after: True -changes: - - rscadd: "Added a Experimental Limb Grower to the medbay department, now medical stuff can grow synthetic limbs using Synthflesh to help crew that suffer any work related accidents. There may also be a limb that can be grown with a special card..." diff --git a/html/changelogs/AutoChangeLog-pr-20512.yml b/html/changelogs/AutoChangeLog-pr-20512.yml deleted file mode 100644 index 1f693d70690..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20512.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - rscadd: "Combined the Convert and Sacrifice runes into one rune. It'll convert targets that are alive and eligible, and attempt to sacrifice them otherwise. The only changes to mechanics are that: Converting someone will heal them of all brute and burn damage they had, and sacrificing anything will always produce a soulstone(but will still only sometimes fill it)" - - tweak: "You can no longer teleport to Teleport runes that have dense objects on top of them." - - experiment: "Wall runes will now activate other nearby wall runes when activated, but will automatically disable after a minute and a half of continuous activity and become unusable for 5 seconds." - - experiment: "The Blood Boil rune no longer does all of its damage instantly or stuns, but if you remain in range for the full duration you will be sent deep into critical." diff --git a/html/changelogs/AutoChangeLog-pr-20520.yml b/html/changelogs/AutoChangeLog-pr-20520.yml deleted file mode 100644 index b3a6e127152..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20520.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Yackemflam" -delete-after: True -changes: - - rscadd: "The syndicate has learned on how to give their agents a true syndicate ninja experience." diff --git a/html/changelogs/AutoChangeLog-pr-20544.yml b/html/changelogs/AutoChangeLog-pr-20544.yml deleted file mode 100644 index ed63895a28c..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20544.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Mekhi" -delete-after: True -changes: - - rscadd: "Nanotrasen has been experimenting on cybernetics for a while, and rumors are they have a few combat prototypes available..." - - experiment: "New arm implants: Energy-blade projector, implanted medical beamgun, stun-arm implant (Like the borg version), flash implant that is automatically-regenerating and doubles as a powerful flashlight. There is also one with all four items in one. Also, a surgery toolkit implant. Adminspawn only for the moment." diff --git a/html/changelogs/AutoChangeLog-pr-20547.yml b/html/changelogs/AutoChangeLog-pr-20547.yml deleted file mode 100644 index c5bc55ff948..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20547.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Positive viruses are now recognized by medical HUDs with a special icon." - - tweak: "fully_heal no longer removes nonharmful viruses. This affects legion souls, staffs of healing, and changeling's revive." diff --git a/html/changelogs/AutoChangeLog-pr-20552.yml b/html/changelogs/AutoChangeLog-pr-20552.yml deleted file mode 100644 index 0a185f3c110..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20552.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - experiment: "Bubblegum has been seen reaching through blood. Try not to get hit." diff --git a/html/changelogs/AutoChangeLog-pr-20555.yml b/html/changelogs/AutoChangeLog-pr-20555.yml deleted file mode 100644 index adb61bdd033..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "XDTM" -delete-after: True -changes: - - rscadd: "Canisters of any type of gas are now orderable in cargo. Dangerous experimental gases will require Research Director approval." diff --git a/html/changelogs/AutoChangeLog-pr-20568.yml b/html/changelogs/AutoChangeLog-pr-20568.yml deleted file mode 100644 index 2e5fe31830d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20568.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Nicho1010" -delete-after: True -changes: - - bugfix: "Fixed lattices appearing after exploding lava" diff --git a/html/changelogs/AutoChangeLog-pr-20569.yml b/html/changelogs/AutoChangeLog-pr-20569.yml deleted file mode 100644 index 284aa369da9..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20569.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "feemjmeem" -delete-after: True -changes: - - tweak: "You can now disassemble meatspike frames with a welding tool." diff --git a/html/changelogs/AutoChangeLog-pr-20570.yml b/html/changelogs/AutoChangeLog-pr-20570.yml deleted file mode 100644 index e6d9f87a72d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20570.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "Screemonster" -delete-after: True -changes: - - tweak: "Abandoned crates no longer accept impossible guesses." - - tweak: "Lets players know that all the digits in the code must be unique." - - tweak: "Reads the last guess back on the multitool along with the correct/incorrect guess readout." - - bugfix: "multitool output on crates no longer returns nonsense values." diff --git a/html/changelogs/AutoChangeLog-pr-20571.yml b/html/changelogs/AutoChangeLog-pr-20571.yml deleted file mode 100644 index b915f334c3d..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20571.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "MrStonedOne" -delete-after: True -changes: - - bugfix: "Fixed space/nograv movement not triggering when atoms moved twice quickly in space/nograv" diff --git a/html/changelogs/AutoChangeLog-pr-20573.yml b/html/changelogs/AutoChangeLog-pr-20573.yml deleted file mode 100644 index 0aee1e6e0d8..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20573.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Joan" -delete-after: True -changes: - - experiment: "The Raise Dead rune no longer requires a noncultist corpse to revive a cultist; instead, it will draw from the pool of all people sacrificed to power the rune." diff --git a/html/changelogs/AutoChangeLog-pr-20578.yml b/html/changelogs/AutoChangeLog-pr-20578.yml deleted file mode 100644 index 83f15b5a45e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-20578.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ergovisavi" -delete-after: True -changes: - - bugfix: "fixed \"friendly\" xenobio mobs and mining drones attacking station drones" From 6700f30012bc4efd77489e85ea8e17fa5cd08f20 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 20 Sep 2016 17:36:27 +0200 Subject: [PATCH 45/46] Repathes structures to fluff, traps to their own path --- .../lavaland_surface_fountain_hall.dmm | 6 +- _maps/RandomZLevels/Academy.dmm | 8 +- _maps/RandomZLevels/caves.dmm | 8 +- _maps/RandomZLevels/research.dmm | 2 +- _maps/map_files/generic/z2.dmm | 6 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/structures/divine.dm | 226 ++---------------- code/game/objects/structures/fluff.dm | 40 ++++ code/game/objects/structures/traps.dm | 34 ++- code/modules/awaymissions/capture_the_flag.dm | 12 +- 10 files changed, 90 insertions(+), 254 deletions(-) diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm index b367a068f15..918b0e894b7 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_fountain_hall.dmm @@ -8,19 +8,19 @@ }, /area/ruin/unpowered) "c" = ( -/obj/structure/divine/healingfountain/anyone, +/obj/structure/healingfountain, /turf/open/floor/engine/cult{ baseturf = /turf/open/floor/plating/lava/smooth }, /area/ruin/unpowered) "d" = ( -/obj/structure/divine/conduit, +/obj/structure/fluff/divine/conduit, /turf/open/floor/engine/cult{ baseturf = /turf/open/floor/plating/lava/smooth }, /area/ruin/unpowered) "e" = ( -/obj/structure/divine/sacrificealtar, +/obj/structure/sacrificealtar, /turf/open/floor/engine/cult{ baseturf = /turf/open/floor/plating/lava/smooth }, diff --git a/_maps/RandomZLevels/Academy.dmm b/_maps/RandomZLevels/Academy.dmm index 4577417fc7b..260a66f8642 100644 --- a/_maps/RandomZLevels/Academy.dmm +++ b/_maps/RandomZLevels/Academy.dmm @@ -852,7 +852,7 @@ /turf/closed/wall, /area/awaymission/academy/headmaster) "cI" = ( -/obj/structure/divine/trap/damage, +/obj/structure/trap/damage, /turf/open/floor/carpet, /area/awaymission/academy/headmaster) "cJ" = ( @@ -3881,11 +3881,11 @@ d2 = 4; icon_state = "2-4" }, -/obj/structure/divine/trap/chill, +/obj/structure/trap/chill, /turf/open/floor/plating, /area/awaymission/academy/academyaft) "kN" = ( -/obj/structure/divine/trap/fire, +/obj/structure/trap/fire, /turf/open/floor/engine, /area/awaymission/academy/academyaft) "kO" = ( @@ -3946,7 +3946,7 @@ /turf/open/floor/engine/cult, /area/awaymission/academy/academycellar) "la" = ( -/obj/structure/divine/trap/damage, +/obj/structure/trap/damage, /turf/open/floor/engine/cult, /area/awaymission/academy/academycellar) "lb" = ( diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index 839dee842a4..dea105695ea 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -167,7 +167,7 @@ name = "\improper BMP Asteroid Level 4" }) "av" = ( -/obj/structure/divine/trap/stun{ +/obj/structure/trap/stun{ desc = "A rune inscribed in the floor, the air feeling electrified around it."; name = "shock rune" }, @@ -474,7 +474,7 @@ name = "\improper BMP Asteroid Level 3" }) "aY" = ( -/obj/structure/divine/trap/fire{ +/obj/structure/trap/fire{ desc = "An old rune inscribed on the floor, giving off an intense amount of heat."; name = "flame rune" }, @@ -485,7 +485,7 @@ name = "\improper BMP Asteroid Level 4" }) "aZ" = ( -/obj/structure/divine/trap/fire{ +/obj/structure/trap/fire{ desc = "An old rune inscribed on the floor, giving off an intense amount of heat."; name = "flame rune" }, @@ -672,7 +672,7 @@ name = "\improper BMP Asteroid Level 4" }) "bs" = ( -/obj/structure/divine/trap/stun{ +/obj/structure/trap/stun{ desc = "A rune inscribed in the floor, the air feeling electrified around it."; name = "shock rune" }, diff --git a/_maps/RandomZLevels/research.dmm b/_maps/RandomZLevels/research.dmm index d66f49ddb40..3f56227c366 100644 --- a/_maps/RandomZLevels/research.dmm +++ b/_maps/RandomZLevels/research.dmm @@ -4907,7 +4907,7 @@ /turf/open/floor/mineral/plasma, /area/space) "nd" = ( -/obj/structure/divine/healingfountain/anyone, +/obj/structure/healingfountain, /turf/open/floor/mineral/plasma, /area/space) "ne" = ( diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm index b9586bc48b5..723bcc61f73 100644 --- a/_maps/map_files/generic/z2.dmm +++ b/_maps/map_files/generic/z2.dmm @@ -5307,7 +5307,7 @@ /turf/open/floor/plating, /area/ctf) "qD" = ( -/obj/structure/divine/trap/ctf/blue, +/obj/structure/trap/ctf/blue, /turf/open/floor/plasteel/blue, /area/ctf) "qE" = ( @@ -5335,7 +5335,7 @@ /turf/open/floor/plasteel/darkred, /area/ctf) "qI" = ( -/obj/structure/divine/trap/ctf/red, +/obj/structure/trap/ctf/red, /turf/open/floor/plasteel/darkred, /area/ctf) "qJ" = ( @@ -5379,7 +5379,7 @@ /turf/open/floor/plasteel/circuit/gcircuit/off, /area/ctf) "qQ" = ( -/obj/structure/divine/trap/ctf/red, +/obj/structure/trap/ctf/red, /turf/open/floor/plasteel/red, /area/ctf) "qR" = ( diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2e765ab4e05..579e58e771a 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -232,7 +232,7 @@ ..() return -/obj/item/stack/AltClick(mob/user) +/obj/item/stack/AltClick(mob/living/user) if(user.incapacitated()) user << "You can't do that right now!" return diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index f843044933d..51415356960 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -1,104 +1,13 @@ -/obj/structure/divine - name = "divine construction site" - icon = 'icons/obj/hand_of_god_structures.dmi' - desc = "An unfinished divine building" - anchored = 1 - density = 1 - var/trap = FALSE - var/side = "neutral" //only used to decide icon states - var/health = 100 - var/maxhealth = 100 - var/deactivated = 0 //Structures being hidden can't be used. Mainly to prevent invisible defense pylons. - -/obj/structure/divine/proc/deactivate() - deactivated = 1 - -/obj/structure/divine/proc/activate() - deactivated = 0 - -/obj/structure/divine/proc/update_icons() - icon_state = "[initial(icon_state)]-[side]" - -/obj/structure/divine/attacked_by(obj/item/I, mob/living/user) - ..() - take_damage(I.force, I.damtype, 1) - -/obj/structure/divine/proc/take_damage(damage, damage_type = BRUTE, sound_effect = 1) - switch(damage_type) - if(BRUTE) - if(sound_effect) - if(damage) - playsound(loc, 'sound/weapons/smash.ogg', 50, 1) - else - playsound(loc, 'sound/weapons/tap.ogg', 50, 1) - if(BURN) - if(sound_effect) - playsound(src.loc, 'sound/items/Welder.ogg', 100, 1) - else - return - health -= damage - if(!health) - visible_message("\The [src] was destroyed!") - qdel(src) - - -/obj/structure/divine/bullet_act(obj/item/projectile/P) - . = ..() - take_damage(P.damage, P.damage_type, 0) - - -/obj/structure/divine/attack_alien(mob/living/carbon/alien/humanoid/user) - user.changeNext_move(CLICK_CD_MELEE) - user.do_attack_animation(src) - add_hiddenprint(user) - visible_message("\The [user] slashes at [src]!") - playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1) - take_damage(20, BRUTE, 0) - -/obj/machinery/attack_animal(mob/living/simple_animal/M) - M.changeNext_move(CLICK_CD_MELEE) - M.do_attack_animation(src) - if(M.melee_damage_upper > 0 || M.obj_damage) - M.visible_message("[M.name] smashes against \the [src.name].",\ - "You smash against the [src.name].") - if(M.obj_damage) - take_damage(M.obj_damage, M.melee_damage_type, 1) - else - take_damage(rand(M.melee_damage_lower,M.melee_damage_upper), M.melee_damage_type, 1) - -/obj/structure/divine/nexus - name = "nexus" - desc = "It anchors a deity to this world. It radiates an unusual aura. It looks well protected from explosive shock." - icon_state = "nexus" - health = 500 - maxhealth = 500 - var/list/powerpylons = list() - -/obj/structure/divine/nexus/ex_act() - return - -/obj/structure/divine/conduit - name = "conduit" - desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus." - icon_state = "conduit" - health = 150 - maxhealth = 150 - -/obj/structure/divine/convertaltar - name = "conversion altar" - desc = "An altar dedicated to a deity." - icon_state = "convertaltar" - density = 0 - can_buckle = 1 - -/obj/structure/divine/sacrificealtar +/obj/structure/sacrificealtar name = "sacrificial altar" desc = "An altar designed to perform blood sacrifice for a deity." + icon = 'icons/obj/hand_of_god_structures.dmi' icon_state = "sacrificealtar" + anchored = 1 density = 0 can_buckle = 1 -/obj/structure/divine/sacrificealtar/attack_hand(mob/living/user) +/obj/structure/sacrificealtar/attack_hand(mob/living/user) ..() if(!has_buckled_mobs()) return @@ -109,136 +18,29 @@ L.gib() message_admins("[key_name_admin(user)] has sacrificed [key_name_admin(L)] on the sacrifical altar.") -/obj/structure/divine/healingfountain +/obj/structure/healingfountain name = "healing fountain" - desc = "A fountain containing the waters of life... or death, depending on where your allegiances lie." + desc = "A fountain containing the waters of life." + icon = 'icons/obj/hand_of_god_structures.dmi' icon_state = "fountain" + anchored = 1 + density = 1 var/time_between_uses = 1800 var/last_process = 0 - var/cult_only = TRUE -/obj/structure/divine/healingfountain/anyone - desc = "A fountain containing the waters of life." - cult_only = FALSE - -/obj/structure/divine/healingfountain/attack_hand(mob/living/user) - if(deactivated) - return +/obj/structure/healingfountain/attack_hand(mob/living/user) if(last_process + time_between_uses > world.time) user << "The fountain appears to be empty." return last_process = world.time - if(!iscultist(user) && cult_only) - user << "The water burns!" - user.reagents.add_reagent("hell_water",20) - else - user << "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards." - user.reagents.add_reagent("godblood",20) + user << "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards." + user.reagents.add_reagent("godblood",20) update_icons() addtimer(src, "update_icons", time_between_uses) -/obj/structure/divine/healingfountain/update_icons() +/obj/structure/healingfountain/proc/update_icons() if(last_process + time_between_uses > world.time) icon_state = "fountain" else - icon_state = "fountain-[side]" - - -/obj/structure/divine/powerpylon - name = "power pylon" - desc = "A pylon which increases the deity's rate it can influence the world." - icon_state = "powerpylon" - density = 1 - health = 30 - maxhealth = 30 - -/obj/structure/divine/defensepylon - name = "defense pylon" - desc = "A pylon which is blessed to withstand many blows, and fire strong bolts at nonbelievers. A god can toggle it." - icon_state = "defensepylon" - health = 150 - maxhealth = 150 - var/gun_faction = "cult" - var/obj/machinery/porta_turret/defensepylon_internal_turret/pylon_gun - - -/obj/structure/divine/defensepylon/New() - ..() - pylon_gun = new(src) - pylon_gun.base = src - pylon_gun.faction = list(gun_faction) - pylon_gun.side = side - - -/obj/structure/divine/defensepylon/Destroy() - qdel(pylon_gun) //just in case - return ..() - -/obj/structure/divine/defensepylon/examine(mob/user) - ..() - user << "\The [src] looks [pylon_gun.on ? "on" : "off"]." - -/obj/structure/divine/defensepylon/attack_hand(mob/living/user) - if(gun_faction in user.faction) - pylon_gun.on = !pylon_gun.on - icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" - else - . = ..() - -/obj/structure/divine/defensepylon/deactivate() - ..() - pylon_gun.on = 0 - icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" - -/obj/structure/divine/defensepylon/activate() - ..() - pylon_gun.on = 1 - icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon" - -//This sits inside the defensepylon, to avoid copypasta -/obj/machinery/porta_turret/defensepylon_internal_turret - name = "defense pylon" - desc = "A plyon which is blessed to withstand many blows, and fire strong bolts at nonbelievers." - icon = 'icons/obj/hand_of_god_structures.dmi' - installation = null - always_up = 1 - use_power = 0 - has_cover = 0 - health = 200 - projectile = /obj/item/projectile/beam/pylon_bolt - eprojectile = /obj/item/projectile/beam/pylon_bolt - shot_sound = 'sound/weapons/emitter2.ogg' - eshot_sound = 'sound/weapons/emitter2.ogg' - base_icon_state = "defensepylon" - active_state = "" - off_state = "" - faction = null - emp_vunerable = 0 - var/side = "neutral" - -/obj/machinery/porta_turret/defensepylon_internal_turret/setup() - return - -/obj/machinery/porta_turret/defensepylon_internal_turret/shootAt(atom/movable/target) - var/obj/item/projectile/A = ..() - if(A) - A.color = side - -/obj/machinery/porta_turret/defensepylon_internal_turret/assess_perp(mob/living/carbon/human/perp) - if(perp.handcuffed) //dishonourable to kill somebody who might be converted. - return 0 - var/list/test = faction & perp.faction - if(test.len) - return 0 - return 10 - -/obj/item/projectile/beam/pylon_bolt - name = "divine bolt" - icon_state = "greyscale_bolt" - damage = 15 - -/obj/structure/divine/shrine - name = "shrine" - desc = "A shrine dedicated to a deity." - icon_state = "shrine" \ No newline at end of file + icon_state = "fountain-red" \ No newline at end of file diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm index c2fa1e72cf6..13ae66801be 100644 --- a/code/game/objects/structures/fluff.dm +++ b/code/game/objects/structures/fluff.dm @@ -120,3 +120,43 @@ name = "dense stack of papers" desc = "A stack of various papers, childish scribbles scattered across each page." icon_state = "paperstack" + + +/obj/structure/fluff/divine + name = "Miracle" + icon = 'icons/obj/hand_of_god_structures.dmi' + anchored = 1 + density = 1 + +/obj/structure/fluff/divine/nexus + name = "nexus" + desc = "It anchors a deity to this world. It radiates an unusual aura. It looks well protected from explosive shock." + icon_state = "nexus-neutral" + +/obj/structure/fluff/divine/conduit + name = "conduit" + desc = "It allows a deity to extend their reach. Their powers are just as potent near a conduit as a nexus." + icon_state = "conduit-neutral" + +/obj/structure/fluff/divine/convertaltar + name = "conversion altar" + desc = "An altar dedicated to a deity." + icon_state = "convertaltar-neutral" + density = 0 + can_buckle = 1 + +/obj/structure/fluff/divine/powerpylon + name = "power pylon" + desc = "A pylon which increases the deity's rate it can influence the world." + icon_state = "powerpylon" + can_buckle = 1 + +/obj/structure/fluff/divine/defensepylon + name = "defense pylon" + desc = "A pylon which is blessed to withstand many blows, and fire strong bolts at nonbelievers. A god can toggle it." + icon_state = "defensepylon" + +/obj/structure/fluff/divine/shrine + name = "shrine" + desc = "A shrine dedicated to a deity." + icon_state = "shrine" \ No newline at end of file diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index f189f443e20..3c8880412b1 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -1,18 +1,14 @@ - -/obj/structure/divine/trap +/obj/structure/trap name = "IT'S A TARP" desc = "stepping on me is a guaranteed bad day" + icon = 'icons/obj/hand_of_god_structures.dmi' icon_state = "trap" density = 0 alpha = 30 //initially quite hidden when not "recharging" - health = 20 - maxhealth = 20 - trap = TRUE var/last_trigger = 0 var/time_between_triggers = 600 //takes a minute to recharge - -/obj/structure/divine/trap/Crossed(atom/movable/AM) +/obj/structure/trap/Crossed(atom/movable/AM) if(last_trigger + time_between_triggers > world.time) return alpha = initial(alpha) @@ -23,7 +19,7 @@ trap_effect(L) animate(src, alpha = initial(alpha), time = time_between_triggers) -/obj/structure/divine/trap/examine(mob/user) +/obj/structure/trap/examine(mob/user) ..() if(!isliving(user)) //bad ghosts, stop trying to powergame from beyond the grave return @@ -32,15 +28,15 @@ animate(src, alpha = initial(alpha), time = time_between_triggers) -/obj/structure/divine/trap/proc/trap_effect(mob/living/L) +/obj/structure/trap/proc/trap_effect(mob/living/L) return -/obj/structure/divine/trap/stun +/obj/structure/trap/stun name = "shock trap" desc = "A trap that will shock you, it will burn your flesh and render you immobile, You'd better avoid it." icon_state = "trap-shock" -/obj/structure/divine/trap/stun/trap_effect(mob/living/L) +/obj/structure/trap/stun/trap_effect(mob/living/L) L << "You are paralyzed from the intense shock!" L.Weaken(5) var/turf/Lturf = get_turf(L) @@ -48,13 +44,13 @@ new /obj/effect/particle_effect/sparks(Lturf) -/obj/structure/divine/trap/fire +/obj/structure/trap/fire name = "flame trap" desc = "A trap that will set you ablaze. You'd better avoid it." icon_state = "trap-fire" -/obj/structure/divine/trap/fire/trap_effect(mob/living/L) +/obj/structure/trap/fire/trap_effect(mob/living/L) L << "Spontaneous combustion!" L.Weaken(1) var/turf/Lturf = get_turf(L) @@ -62,26 +58,26 @@ new /obj/effect/particle_effect/sparks(Lturf) -/obj/structure/divine/trap/chill +/obj/structure/trap/chill name = "frost trap" desc = "A trap that will chill you to the bone. You'd better avoid it." icon_state = "trap-frost" -/obj/structure/divine/trap/chill/trap_effect(mob/living/L) +/obj/structure/trap/chill/trap_effect(mob/living/L) L << "You're frozen solid!" L.Weaken(1) L.bodytemperature -= 300 new /obj/effect/particle_effect/sparks(get_turf(L)) -/obj/structure/divine/trap/damage +/obj/structure/trap/damage name = "earth trap" desc = "A trap that will summon a small earthquake, just for you. You'd better avoid it." icon_state = "trap-earth" -/obj/structure/divine/trap/damage/trap_effect(mob/living/L) +/obj/structure/trap/damage/trap_effect(mob/living/L) L << "The ground quakes beneath your feet!" L.Weaken(5) L.adjustBruteLoss(35) @@ -90,7 +86,7 @@ new /obj/structure/flora/rock(Lturf) -/obj/structure/divine/trap/ward +/obj/structure/trap/ward name = "divine ward" desc = "A divine barrier, It looks like you could destroy it with enough effort, or wait for it to dissipate..." icon_state = "ward" @@ -100,6 +96,6 @@ time_between_triggers = 1200 //Exists for 2 minutes -/obj/structure/divine/trap/ward/New() +/obj/structure/trap/ward/New() ..() QDEL_IN(src, time_between_triggers) diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 6c7de4dcef8..c6c4e545d42 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -463,29 +463,27 @@ -/obj/structure/divine/trap/ctf +/obj/structure/trap/ctf name = "Spawn protection" desc = "Stay outta the enemy spawn!" icon_state = "trap" - health = INFINITY - maxhealth = INFINITY var/team = WHITE_TEAM time_between_triggers = 1 alpha = 255 -/obj/structure/divine/trap/examine(mob/user) +/obj/structure/trap/examine(mob/user) return -/obj/structure/divine/trap/ctf/trap_effect(mob/living/L) +/obj/structure/trap/ctf/trap_effect(mob/living/L) if(!(src.team in L.faction)) L << "Stay out of the enemy spawn!" L.death() -/obj/structure/divine/trap/ctf/red +/obj/structure/trap/ctf/red team = RED_TEAM icon_state = "trap-fire" -/obj/structure/divine/trap/ctf/blue +/obj/structure/trap/ctf/blue team = BLUE_TEAM icon_state = "trap-frost" From 14886c1bacbe65354137f4b67738e9fb3b9641c3 Mon Sep 17 00:00:00 2001 From: AnturK Date: Tue, 20 Sep 2016 18:52:31 +0200 Subject: [PATCH 46/46] fixup --- code/game/objects/structures/traps.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/objects/structures/traps.dm b/code/game/objects/structures/traps.dm index 3c8880412b1..b6c9e0ba7bb 100644 --- a/code/game/objects/structures/traps.dm +++ b/code/game/objects/structures/traps.dm @@ -90,8 +90,6 @@ name = "divine ward" desc = "A divine barrier, It looks like you could destroy it with enough effort, or wait for it to dissipate..." icon_state = "ward" - health = 150 - maxhealth = 150 density = 1 time_between_triggers = 1200 //Exists for 2 minutes