From 4991b0e9b15d8e44c1c8688a9130e59952db9320 Mon Sep 17 00:00:00 2001 From: Alberyk Date: Sun, 26 Feb 2017 17:19:00 -0300 Subject: [PATCH 01/55] Custom items 26/02 (#1843) Adding the following items: Family Beret - Kar'lan Sel'ler - toasterstrudes Tajaran Service Uniform - Guskov Andrei - fireandglory Siik'maas-Tau Ceti Basic Dictionary - Zhilin Vadim - fireandglory Emergency Response Team Duty Jacket - Fai Sinsa - soundscopes Old Tajaran Nobleman Suit - Faysal Al-Shennawi - alberyk Prosthetic Vaurca Eyelids - Ka'Akaix'Ghoz Zo'ra - sleepywolf Removed: Clement Beach implant at player's request Vittorio Giurifiglio arm band, because item was turned into a custom loadout option due to the owner and players requests --- code/modules/clothing/glasses/glasses.dm | 2 + code/modules/customitems/item_defines.dm | 83 ++++++++++++++++---- icons/mob/custom_synthetic.dmi | Bin 90672 -> 92954 bytes icons/obj/custom_items/fai_jacket.dmi | Bin 0 -> 741 bytes icons/obj/custom_items/faysal_uniform.dmi | Bin 0 -> 980 bytes icons/obj/custom_items/ghoz_eyes.dmi | Bin 0 -> 476 bytes icons/obj/custom_items/guskov_uniform.dmi | Bin 0 -> 791 bytes icons/obj/custom_items/karlan_beret.dmi | Bin 0 -> 448 bytes icons/obj/custom_items/vittorio_armband.dmi | Bin 848 -> 0 bytes icons/obj/custom_items/zhilin_book.dmi | Bin 0 -> 623 bytes 10 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 icons/obj/custom_items/fai_jacket.dmi create mode 100644 icons/obj/custom_items/faysal_uniform.dmi create mode 100644 icons/obj/custom_items/ghoz_eyes.dmi create mode 100644 icons/obj/custom_items/guskov_uniform.dmi create mode 100644 icons/obj/custom_items/karlan_beret.dmi delete mode 100644 icons/obj/custom_items/vittorio_armband.dmi create mode 100644 icons/obj/custom_items/zhilin_book.dmi diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index bf6c7d78cf1..07a92303b99 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -188,6 +188,7 @@ flags_inv |= HIDEEYES body_parts_covered |= EYES icon_state = initial(icon_state) + item_state = initial(item_state) flash_protection = initial(flash_protection) tint = initial(tint) usr << "You flip \the [src] down to protect your eyes." @@ -196,6 +197,7 @@ flags_inv &= ~HIDEEYES body_parts_covered &= ~EYES icon_state = "[initial(icon_state)]up" + item_state = "[initial(item_state)]up" flash_protection = FLASH_PROTECTION_NONE tint = TINT_NONE usr << "You push \the [src] up out of your face." diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index cf37d1ced15..47a336aee2d 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -165,7 +165,7 @@ All custom items with worn sprites must follow the contained sprite system: http /obj/item/weapon/melee/fluff/tina_knife //Consecrated Athame - Tina Kaekel - tainavaa name = "consecrated athame" - desc = "An athame used in occult rituals. The double-edged dagger is dull. The handle is black with a pink/white occult design strewn about it, and 'Tina' is inscribed into it in decorated letters." + desc = "An athame used in occult rituals. The double-edged dagger is dull. The handle is black with a pink/white occult design strewn about it, and \"Tina\" is inscribed into it in decorated letters." icon = 'icons/obj/custom_items/tina_knife.dmi' icon_state = "tina_knife" item_state = "knife" @@ -178,7 +178,7 @@ All custom items with worn sprites must follow the contained sprite system: http name = "\"Hephaestus Industrial Exosuit MK III\" APLU customisation kit" desc = "A ripley APLU model manufactured by Hephaestus industries, a common sight in New Gibson nowadays. It shines with chrome painting and a fancy reinforced glass cockpit." new_name = "Hephaestus Industrial Exosuit MK III" - new_desc = "An ripley APLU model manufactured by Hephaestus industries, a common sight in New Gibson nowadays. It shines with chrome painting and a fancy reinforced glass cockpit." + new_desc = "A ripley APLU model manufactured by Hephaestus industries, a common sight in New Gibson nowadays. It shines with chrome painting and a fancy reinforced glass cockpit." new_icon = "ripley_zairjah" //a lot of thanks to cakeisossim for the sprites allowed_types = list("ripley","firefighter") @@ -406,14 +406,6 @@ All custom items with worn sprites must follow the contained sprite system: http desc = "A NT Asset Protection Force Beret. It has the NT APF insignia on it as well as the Name \"Goellstein\" inside." -/obj/item/clothing/accessory/armband/fluff/vittorio_armband //ATLAS Armband - Vittorio Giurifiglio - tytostyris - name = "ATLAS armband" - desc = "This is an atlas armband showing anyone who sees this person, as a member of the Political party Atlas." - icon = 'icons/obj/custom_items/vittorio_armband.dmi' - icon_state = "vittorio_armband" - item_state = "vittorio_armband" - contained_sprite = 1 - /obj/item/clothing/head/fluff/vittorio_fez //Black Fez - Vittorio Giurifiglio - tytostyris name = "black fez" desc = "It is a black fez, it bears an Emblem of the Astronomical symbol of Earth, It also has some nice tassels." @@ -480,7 +472,7 @@ All custom items with worn sprites must follow the contained sprite system: http /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/barcia_flask //First Shot - Gabriel Barcia - mrgabol100 name = "first shot" - desc = "A flask. Smells of absinthe, maybe vodka. The bottom left corner has a silver bar. \"The bottom is engraved, it reads 'The First Shot\"." + desc = "A flask. Smells of absinthe, maybe vodka. The bottom left corner has a silver bar. The bottom is engraved, it reads: \"The First Shot\"." icon = 'icons/obj/custom_items/barcia_flask.dmi' icon_state = "barcia_flask" @@ -497,6 +489,7 @@ All custom items with worn sprites must follow the contained sprite system: http gender = NEUTER body_parts_covered = null + /obj/item/clothing/under/dress/fluff/sayyidah_dress //Traditional Jumper Dress - Sayyidah Al-Kateb - alberyk name = "traditional jumper dress" desc = "A light summer-time dress, decorated neatly with black and silver colors, it seems to be rather old." @@ -552,7 +545,7 @@ All custom items with worn sprites must follow the contained sprite system: http user.visible_message("[user] thrust the [src.name] into [M]'s face.") -/obj/item/weapon/fluff/akela_photo // Akela's Family Photo - Akela Ha'kim - moltenkore +/obj/item/weapon/fluff/akela_photo //Akela's Family Photo - Akela Ha'kim - moltenkore name = "family photo" desc = "You see on the photo a tajaran couple holding a small kit in their arms, while looking very happy. On the back it is written; \"Nasir, Akela and Ishka\", with a little gold mark that reads: \"Two months\"." icon = 'icons/obj/custom_items/akela_photo.dmi' @@ -856,7 +849,7 @@ All custom items with worn sprites must follow the contained sprite system: http /obj/item/clothing/head/beret/engineering/fluff/ikrad_beret //LR-31MTA Beret - Ikrad Yam'hir - houseofsynth - name = "LR-31MTA Beret" + name = "LR-31MTA beret" desc = "A silver beret with an insignia on the front, it looks like an old Tajaran cannon with a ring around it. \ Along the top half of the ring \"LR-31MTA\" is engraved. The word \"Yam'hir\" is engraved along the bottom half of the ring. \ The beret looks old and is worn in some places around the edges. It appears to have a flap inside, \ @@ -939,7 +932,7 @@ All custom items with worn sprites must follow the contained sprite system: http var/licensed_systems = "Republic of Biesel, Sol Alliance, Nralakk" var/supplementary_endorsements = "Licensed Medical Examiner; Sol Alliance, Republic of Biesel - Concealed firearm carry; Sol Alliance, Republic of Biesel" var/citizenship = "Republic of Biesel" - + /obj/item/clothing/accessory/badge/fluff/bell_badge/verb/read() set name = "Review credentials" set category = "Object" @@ -953,3 +946,65 @@ All custom items with worn sprites must follow the contained sprite system: http usr << "The systems that the credentials show the user is licensed to investigate in are [licensed_systems]." usr << "Additional endorsements registered on the card show: [supplementary_endorsements]." return + + +/obj/item/clothing/head/beret/engineering/fluff/karlan_beret //Family Beret - Kar'lan Sel'ler - toasterstrudes + name = "family beret" + desc = "A brown beret with an orange patch. The patch have the initials; \"K.S.\" sewn into it." + icon = 'icons/obj/custom_items/karlan_beret.dmi' + icon_state = "karlan_beret" + item_state = "karlan_beret" + contained_sprite = 1 + + +/obj/item/clothing/under/fluff/guskov_uniform //Tajaran Service Uniform - Guskov Andrei - fireandglory + name = "tajaran service uniform" + desc = "This is obviously a military service uniform, there are signs that it is of Tajaran make, modified to be a bit less warm, although it doesn't look like any uniform used by the People's Republic of Adhomai." + icon = 'icons/obj/custom_items/guskov_uniform.dmi' + icon_state = "guskov_uniform" + item_state = "guskov_uniform" + contained_sprite = 1 + + +/obj/item/weapon/fluff/zhilin_book //Siik'maas-Tau Ceti Basic Dictionary - Zhilin Vadim - fireandglory + name = "siik'maas-tau ceti basic dictionary" + desc = "A hefty dictionary with a simple design on the cover, it seems to be for translations. There's a label on the back denoting that it belongs to a \"Zhilin Vadim\"." + icon = 'icons/obj/custom_items/zhilin_book.dmi' + icon_state = "zhilin_book" + w_class = 3 + +/obj/item/weapon/fluff/zhilin_book/attack_self(mob/user as mob) + user.visible_message("[user] starts flipping through \the [src].", + "You start looking through \the [src], it appears to be filled with translations of Tau-Ceti basic for tajaran users.", + "You hear pages being flipped.") + playsound(src.loc, "pageturn", 50, 1) + + +/obj/item/clothing/suit/storage/toggle/fluff/fay_jacket //Emergency Response Team Duty Jacket - Fai Sinsa - soundscopes + name = "emergency response team duty jacket" + desc = "A militaristic duty jacket worn by members of the NanoTrasen Emergency Response Teams. The nameplate reads: \"Tpr Sinsa\"." + icon = 'icons/obj/custom_items/fai_jacket.dmi' + icon_state = "fai_jacket" + item_state = "fai_jacket" + icon_open = "fai_jacket_open" + icon_closed = "fai_jacket" + contained_sprite = 1 + + +/obj/item/clothing/under/fluff/faysal_uniform //Old Tajaran Nobleman Suit - Faysal Al-Shennawi - alberyk + name = "old tajaran nobleman suit" + desc = "A fancy looking suit, made of white line, adorned with golden details and buttons bearing long forgotten meanings. A blue sash decorates this piece of clothing." + icon = 'icons/obj/custom_items/faysal_uniform.dmi' + icon_state = "faysal_uniform" + item_state = "faysal_uniform" + contained_sprite = 1 + + +/obj/item/clothing/glasses/welding/fluff/ghoz_eyes //Prosthetic Vaurca Eyelids - Ka'Akaix'Ghoz Zo'ra - sleepywolf + name = "prosthetic vaurca eyelids" + desc = "A small contraption of micro-actuators with a button on the side." + icon = 'icons/obj/custom_items/ghoz_eyes.dmi' + icon_state = "ghoz_eyes" + item_state = "ghoz_eyes" + contained_sprite = 1 + action_button_name = "Toggle Eyelids" diff --git a/icons/mob/custom_synthetic.dmi b/icons/mob/custom_synthetic.dmi index 7526831b8c637641e246a38ce8b60358ac145be5..acb2b0cb966338759b442e085a4b68886d903504 100644 GIT binary patch literal 92954 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 literal 90672 zcmagG2{=@3{5O8=vL;25C4|bBJ$s2zC}d|Od$wc`Gf|dg$-WOE*_Fy}2-#DXh#336 zuQQC9|2_3Q&+q+R*Z;lV=jzEgGjqgp>xR2d=%FpBM~4u#3N}pIH$VtV^b8~?IFIr3%}SF zv#}qU+Fsm0n-k)H<>hPNvn^;wF0qrIo7tuMY+IRI$XMQ?gidzX|DbK!GNXhHNEX{UJiz!yWAJuB2^{uOE}`` zOxAXK|Hut;Nt(-xJ}BdAp?ABAw`gj(Ypmj%CCKoB>idGoq~Z^mlFQ)k|Vz>VX?o3B;%_|)`HiS|1s zPnYF=6832@k#~H&O3%g~&D6@8cS2e-^UcCpdb+v-fi*S~4+MS-|3Gr{^L57a7`_g_ zkoli#X<4HbY`pH@M<#e4FYnp<9Is397@0bHn!P?hp?Ri=u>WxX-F58~6opKn2ktz>Da`)(Fv0XCMyh zgNUluu_?o3_R`FKnX%&gYsomYBfPS~bjY$7P74W%h_Jo>{8>s&4B8feZ==!p(q)xu z-TJ2iY>XmyLsg;0lYtQ4P!Q<+(O0BG%)taz*Ht7 zLF>WcPvKtiKl?%9OBa)T#KdG9T#n?_ zW#qdQ>9kpS@e)aFK^3dsWm^qW8U5VgBwQyFcTf($Vy)}{zR(0y&uQz&bLqkCBsU&a ze6>s_muyPuhilb^#IB~9rF%)Y^;jAjL{8IOT$fQz3U#od-UxK3ct*knSp{8vmOuCL zlFW1v%8br1kd=iQGZJ{~>N(_85Uv#t-?4wG-D}M!P7ZAz`Oj@oQB{2ujXdne{K&;@ zwlJDaV0uy|WZ`&)Z&`|C+tTgP94)_po424lkho4b;jrq>fvEX?8fAXua0qzyqStPG zJIE{%KTidLk?9rE`4C7@WA@4mqWXUlgZyfTBD z0>Jy60qZehM>{?VbA4!7Yxl+>6n*_9ZBP~p6}|!U7VHkRWVGHoSHXXR^UqvDFxKm&U5P}sRI9WX00LM9I9PRg2V~Pj3HGj$B;r>RXqNpqGr6>Bg4;+K^ zcNP)}3K$tW1T+c5&%q#wis3wBcm<5p#TYTSmiKk<-=6~+MKD@uMNI?tswv1Z(Cw4GG%OIH;Q3lVcIUfo-`r6p;x%Uk2S8%M! z15;iqtI)C&0;)O32Vdf^N=J?gh)t^E`?VoN)$j|O%OM-E{pO{FN5PHWeb=|x-7Lf< zIYhHEP7)qpB`X-nAy@8Uhe*kkgoOBCeH;wO3f$ zWU2pRzSCi%k!7>KuHuUV{4iYb1=6$x!OqU!GBR?OUqImTe9yUFxgQRvEz4PTkIM;7 z;Dh<6vz|P8Qti2UO;7#)%gr zcoX3;{7yqv-%L%pqVV>e7CA(i(lK{jmD7vHDkBEyl;#Q55EAe$Npv%dSJ~LJoMz&- z8gtGG%jEfk7j5LjSc7m>$#D<7X@lkH*mdg(Qt?vIdZj>HJ14$+8;(K?GhoJD78)p^ z8#yNpjW*P{vyZo6_#-$8H>+KNF48cmnBbN-P@p>l)=;(Y7LN%2fDl}e<*&7K)YOzq zP447)5xy-zI9@@&Y&6tTr^S?g3d*L!gv()f{W zb06cBvK$wo%>l0ZP|<+76ZJmpiak9dRt{o_oaUytV{AF^iqJoLR!K8-!t{>5NI)0x zAHq@Zal#0k!9F8llQFHJns`csh5A}&KASFIc7?k1t#gC7nx2t)b;JCZZeze&VYcOr zZJ0$z%V5!dIG+%>yyFNhsEh^5zVydIRVjCDD?WdwMD>NtJ%9e~o6fEg67M@f4dy8S z#Le;H{82t0{4Q1b)`y?F1PCF6-$PIB__Ix5ED3XN^nD@2aO~LTLq@nc^Ct#+%Gf)$ zcQ2OD3pC4t?bBp41<7#*hzzC}KDDf?Gr&=o{Rff>>l8aLOq2e28CHPJ!^(2Rgb&e6kLOQV8YVN7Y#W`zqPLLD@^)C zE~j&G$26v8nt}75Yy}0LjbnC{Kn|(rhD=8sMSpp~Dkfi*r%79P!Zly?t2&ryBr8Ej zWgWuy--bC=-#G4wIe2`y3nRgZBkYTiuriUST%fS9J6~DJPj1XxqOS45nH}&Gf)FZeNu=&MMN9R(*vrJH*#;?*wIN7V|KpRRv;me?R8q@|5G zXKfjh6GYFPBpp-GUXjiXny3PHm_7u)Z*s-bcj|Ih;Qp^rijh$iUCFx>xWUgmKyHb-&?C};FA_x&TinFT@`alGuJHFV$&8-W-!)Hs*FFtHC1mh@i^ zE3?W_7 z(ze<@`7>8G@KDR*!ro*Eqf-@r9o_|JFX25nSFJZ*@H^Eb_cA8wnB8}07v1&#$qu1% z!->$d?-oayg*WRZbHxkKKYNWg>m)0~H@zLceg)6ox#S5B(N9ss6%i4zIGg+BBT-PQ2ICWagBvB7Tua&0IzHRHpCU{rcj$6Q;4VUZyJDK@oO4~$18}9qQ(^_ z*HN8b--`%#PWCppa+&1EhIEdK?_VzGPVVMqI~QE59;{8>{^;yye{>HmqJJS+N_F$Q z&H@2^NDU{W`%oT>_B=g;-C0;MEK~gDH91%)%5#?P!dbd0@G5w(*>QKbfQw_WOE6&` z-`n7K=(aZ!b#QBdJ;o8Q4Ne8+N^qGaVI}Z8PA^oH4|dndm+k+1Yog9 z-JtDw%&dTNM5TRS@EIhS4@)8(kn<{Y)gB2yi=jP%JPuIVtFlZ9#dNFMHH8d zS83ybUvByZvly3l)%@+3;?v;~b8U9V2A_F9yLmMV=%3?@J5^NxpN5G}$JBa?edmLz*)4Q|ghI1oeK_WoOS@0a~qNC_J=v>0V|159zTVhWl+R z>INc-_Xgvt8~@OD~n#kJ_EZ|mlNc<>llOf*`1qAhDt3%e#rqEvO79%tb%!6^<6Syp zl}tY$(`p2GM>jQ|o-BKmJ+s^Z#WkdWEiEr6!lW*L`)?UPaQM|q!<)JHhW0lc`Ld!^8#LKqv0D$1d{Vw zPSA7DluK-hU=~OSj=UezZhf`4BO0I|BQ&=#YAv-vb@4B|sds`GxbH0w(KFw~&+6ij zhT)=`aUYD$U~UQtNg=x}LBBMz%^R)sXq@_=&TmtA`glp5PYWn`iFt(DP{VUTKUrB> zuU@@Maw$=~ZE#>L@^-Sw11l>CQu(vD0RoYXDm>N#h*6zaRjU~$lK9}0Nn*0W_B!p4 z4WGzN4vww?o_=6kZLm`**xr<@`5d#Mvvv`$1xW_3 zB)ua+darP}G}RH;ui}YGKY+B&L!OHS0!_ZSZ0v z;a_aeZ@8D)$NIXDb;a&QDQJm(tV}e!%~L1oTwWSi3%|(mkE6Kjv!j1x^ro4 z*F$nivu~P551A|95CcvUw%MR#f|Sq;nu*nKP9Z3o@Ymz1w(lFHaTvvj?4HaWZPtsPSo9nccE z#U?|nDy3Jc+inA#FE~;{O^1oqvONjjl$Lswq-d>Qc{YNsd1Iw5ymJB~?hXm=zG>6} zR$pLIF%M`G?+q?LZi~P_(Rl7vh%!; zlS08%;C{mhMqA7R>w5Ucoy2U}$Gfo|JDS-5_X|XGonaz zCMD=@XgMf7eQF_?*fqH%O8qlbK$%M@oN(T>jG#t51J2;^VE|5q-GeH}j|mfP$s|q6m20^a5_) zBZ&4>COJ47x2F2OdjhbX%%&B>_Qr1{L`J4W7Zt&8@qUbh4x49+O436MoqkyJ4- zycMW%Gf`l3qUHeV5V!yVN|+7M<403P%%Ld!kpmm&Q_KtxbmyzRRi*bs2QdiJns1+$ zFb>0cn{cu=J%K$n#T5Wb=>;(!HwQwqRb-V1W%b7^jMaV;OoZ`fIH1u1 zJc1x_={B?O#je46EqV$6k?d(k6(xf5arPIk*gg^|!jtm>eO~fnl8f(V`aV{q+{Nsi z{Bs|oUgN3^$XZ>WFNeU)LHp%W*tw4;e^L`L-buY#M^YpuQ3nBC;iK{g=I8b&Z}7a{ zFEGZAz7rC!tsm1cz;}z+;RNtscigT(dPdKrUXl(syJM>KrelO6)9zA-rd8A;hqp`TUYO@i1wUj0S(@kVUf9_)$Y}I+_ zJ!@RynaIAuJq?*{HBbNd{3pFPBl4a{)G_eF1gCLSM%6Kp)$&1I8}k9j3&6Je=g^lN zAFz^?$D@mvkIPWdh{ki9%PkkV!r|KT&B&WPYp{FRz5<-vCCECpoYR{nvQO|eQjU2f zs%i1gcdmL9v=X69j$2eT1Uto3LZhj2H9Z0>SDX%9SIDg%hib zd&C1M{ol1*zJvbA?3wGw2wCxoKcBl>y^yGnI2SZ|IO~i#%&P%2#zja{e|9a?W5XwKcj!mXn$Nd4$~8qo4~%(; zq7slQ>|QAsZ>MLPIh|!nzu+}k`i(WWz}6n?_TIC3VNbBVNB!A*Pe9Z}z?j%0!Tcw& zSmI0u$Y$W1D%23$HnLVKOw0C+b6_s1)n{cz`0?Xn?2ZG?4`n*Yqp24ItHsIdJ0Xm} zD-ww?9K}wj~WH7xibcri=kKD@M*MpE9?qbenSLi_(Q(o z#z80Jd6qa~=ZEG|uSQXi*KP;8yn2n_bJTQOMn_ARl6c5*q`(Z`Tzh}7{1N~CF{Hz; zK6iZYs6}bCOb~kPb;etT@uC2mWP%11fBnI5ed_Ak)Ced%%!OQrrRvHjmE|IUR3|^R}Tjl4Dn~t z++*{NzzhRGmrkjoUo{Uw#gA6JP*PoVpE<{(!@y+b_r8w!6tSXvm$z-dl+&Zzj&$zK zaq<7bGkEY)M8vJUH5`dyzXEs!FV^iWBrIIelGx?c5)m~mV-J{dI69+rj6bz2ThC-p zoR<#(`8N$fuK^Ne75tcF<>EJ&vwUL&0HsxCdi&!$*~U&p&*jSzfD8fniEA&Ab--VO zysBv~l^pPC7&8$;gXX1+JCGx2-+JaU$L*W>d`|Bi;=X?G+>U>>`f+c<9ovMZY7_ss z!aGt?Up0}*&aD8h-we=lUEkfWmE`4p)dTJk<5u*Diz(CJcF5id?~5Y6lHAorQh8Z6 zYlF)%FMrN6r6C|X|5iAo=-waQy z7ClE+`avhOTpJA0j2+i~`e(59@~PD6Gt>t`XVlACxg%K*EiG8bx?3r9wPE zgV#cc+7O}^^9OjoSDW?@UA)g|ur+8DNU~j_+H9vP_?;?DRmIErO^RrVI|o~b4jwcX zYycBB;Jqtnuwg$sdSuKi6&YlB*9%`+FXj}^w>A9o@2wUAe@H0Wrz1o&3p9RQ(u#T` zw@2c-FV85o4X%RN3hDRAg{^f@{KiLku_F&YpucheU-~uzv!mIkb5xbaKiwywD8Ghw zO8fi;l@EpgUHnTraSwP$7@i;9aSU;puY}?LfAHu3-ek0cj)fNg`drVS@=NYq9e^Fz z{PM7L6q_*~`{za`;yPxfu`TrW&G1|5U*7Q9{wVgpnrc!DyfJ_t|3cB1k>}zBRZU(u80P?se+e zY%%;7(E>xw3-96+ybfCOB!UrCR+Fz2?XQa%sLW>v$#7tpz<>gA9~;U18KJ=Eq9hVHZwXqqb9_@%08zeeUjzexX3x0*R2a>C@f6H_{0`1c3eSvF^TL8>G47y4J z-TWh{2_S-!(@)Ga`V5fc1ufKa^!ik&F%j#lE%+O~7?0Uu7A0P%X!TGr$+Hj5=1?JwWqH8R@|Jik;$2V$ZgD@X-plzOg*--q9&x2yQ^_<Hao;MR zFMOwj1tQd60q2hXw3gh6Q@lcQq6@RCq28H5)}9yH&BS!~UUjP8t#K!!cJHmhN1QlN zw95BL!%>Gvh8T8Zvep7a2ghq1mZps*0Z22A&lSCM+QYwI68b&Z_S#M0zts=%;Q3~6@~YA3bdiUSN@>?oo07gICCXE0S9P!t$3U=hQgYSegD zLv`DG<+8ND+E)O9t$2)ds0n;u(gl9F=8GX4jeHgc&)uz9ZtBF)?XJB^79o5~khZGC zka_GXql~-ZpI_Z?kt3RXR9d!Jo=s#e`?L0vkML$8e^a$=G#mzn}y;wD~f__KYahCA)NV^y%v%64eC#8amPR0x$ zT|u)S?j)q*G=cU}FiL|kCjUA*0Xbyh{S2Og5oigM-CdzTmr!anMBkHAiQ1=^EF%%` zN8R%u`G_uI38(J`7)cBS4a7;WZ*WD?U25;@Z^E!I>Ec!fDv=n8`^Z|eWwYvE?!Ouq z%UK?gK9K5J#XYq3K%skW&q|L~jnYn<;U(6H-4JEk3Z(1L@dOtN6+oNyHkVGdTd>?t z?*H1}I!dy)vUS(Up2~3eXZrq)13yKLx8jS-vx*mT)6}5(hxAE$%WM*#5KQk`iqX6*EHb{DO-k1&e znX?b1;a-wxSNfALuAbP;QLffqBKvyyrf|TnBVpE9O zIKggLjZtNZ{LJ~y9Kia^+h34{ko-=wP|=Eenp4S8z3lR8-=0DTz&LRx!`biLkb~T9 z_PKK1NV!vX6uOe)HeGkJmpzGs6D9mq#7B5r9S-dw;J^a>vbgz(V)M&xUdirZ$w7B?SXmFIl*mGiyf_V(ZRvLV#H zGPAvL27-kmU66#I|8tH@xZSnLbnPG7)4bCtlp5|Jc~?pWfcz5m)*iO(n|ei0+3U~Y zR|AZ=B&>oUy1`-6LNcpLCn#zXy3O$Zbim~6V{ow+}3;JL0OT*eZzK7f%wW40R6^YEG@UYmp1o0e{ISyh=x_2B6qE! z6igN!4BS{>?(bo8FSz|jW=30{{uR3G*Uj@lkyZkbKop(`y{A!ifFGd!cF-twG?l%x!4|VbZfV&lb0Jwx24jT!&ZL*R|(H2&Vf75|A z;X|7{s<)`qA!$qfkm69`C6zq(;-$zJW2dTgQkI!DPCA2Peme3Zr(tL$#trP|2~d45 z{RQB*JD+3@4 z6p0H+Q68k|&t6qMihMp5nAdQb@fg?6Kp%}sVF`GH=k#Jo%Z0O}SAwQK=UrogyaZ6A zs3Mn!nEXWC?YH75ouzxPlAYXnai%Pnud`F{c3=pg^kyO-(y2*4V74JDtCh`}-`XR}A2Gs1dyo$lM^ zJN}{6{~Klhrv-zzt#MhQO1(*FN4)w|kW0JT;Xl%wwDTR{4c`MyM_Da(kCwg!m&EZ9 zGF^Bfk&@Uy3Ewcq$}(o(uFxMP5?V2e(<6)S7SMO+YmD%{1)x3WH+MXAsbl{5FZdSz zP}nro-5WRV+T!4O_fEd}CWtWc@~6q2!MuK5A*gAxTV#31K53nk>w2Mq;WlA?i)o-f z0wwgfSIfi`@{74%h*})Ko10U>jhTSss&lR+&68aIgTuXCCz~l4&=7 zxZ%-NDMd!)aH)_k-+-*_`PNS>1Lh&GBetI2yk5bR`K@KnL$F&SRpGZQ)yp>V1FP`- z3m#(6X_NVX3=h*n#->`+{y5XI36}#BYo;nwV$Q5K$6Y}Zh@kn)w8J1zMwFo1-t`%TVn(6%g8*K)ELtl=A$Y2ct+#dOM;2 z)>Z9IGDxYMJz44H*2nvKj6qP-oCkO2JVEK>``3@(o0mb*wEh!WPqA>$0tEPj4-!@9 zedw|f2=Miv6xpXG$w_c-oWApq*9D-u5&lNpJ3H*o0c#D6e03I%4_Z6Y39!^{32xS) z$Ba*t^(mAY)ZmvaPW0Nll}D~nX#7Q)t#ErxOw_B$b|n7vZ`W%WSt));rEyoPt~r{o z>R)Tl6Gl3!9V$&$g1PvUyPwVI!e6GNMg=mz&6M>izca!2Z1pDvXD5+mgV2NQMcYJa zSOdr#;_}mtXU*vW`yr=HZw1rUdX4#H7#Ae$QmJb<+M zD5n1hCD~i{um9(iQLn?5VfbNdqm~!lJSB!#6kG)w4;txXC>jbX6% zPb2q5uyA2-sSKTk*iOkZ;Jt1OnzPhkivtf2{qI!^@$Oe=LWs&?1ugCG=)ieKvw5^3 zv+=FH_-8-ijR*UF3J0GGYSa-c5a;1;h{i;kQIg+N3xL=FwV|V@bT6xWoKVY=34&oj zn!l-cLnL`P0|!-9q^Qhv{)qZP6ukpB)^<{0cbY&v#vjA|4XD-N$9ZoOpl`om6a~D6 z@sAnNJ5Tr`lf^2En?IG56jw1;Dywkni#&@wL(FrlDzo<=6K>w3LQ5dlkQCPs`)E-$ z&siI{6kzz36--E&uF9$81Y6E3=3nMa5jJcg7nCR759$t%+yPi7vU^D^a`WP)Vo$_F zRN#NqhPr~RNf*A!rnEoV4nY!?v=9h)L2rhlpDCP)q60=l_SUz#ZDXox78Nx9Cu0ke z(8WwNvVnZLO;N*^bd1WgZn^yz4ub)Fsyc^*`ESi_&J=Kd-NSrx&$+9f!+r3=ngEM| z(e9K5*09tS`Pztkz_?j(=8+ck%0bHy>UXER1F$}xlb_%LWCwV>B82!=V+%D|b;NWu z-#t2dWY50{BBiS;r3)zh6As+lRzt=*^RV-KNA+2?8s{Nm*sCUQ>V259CF?lcCI#(s31{Q2|eDQ1B*K zDyNOGp>zxMB?H?oC(^vs3>qLYHoty#6kSZNblBIKfBJH&p9uaT?+njQO(QpzqVyvf zpgfM0jQiqpjuO1!hoh)Z8KFsJ-1|4gKUoiDVVurkdE^=>L9#Az8^kmD*X3RT-U*Uk zQ+WKDw_s!nkJ0x4^%AkbXU4I3Gi_eRjkK+UFegpZO}%xx;hTT>w=S-CO4PSyTEm}{ zHisI@HZZ+j`0)+73Ybsl&#sV)l}L1oyo19@o5vJw%FD*BW_aE%ai3dZdOPu!<$FPL zH34MGW?W(l)NJhMSnJ-Ffq+dy_ZbL6ubQ;S;4ai3O&z&lT}P?H>5m7Ho~wDo$|OK6 zX$j-~u&k?6wr{P)cQIegedI;x*!D>xVZ5Six%|;jK{1q`>iz<1wD|QY&CX3=>+At9 z25{hIUH)k|A$T)83(`C>1nDUka}*QPY_}3Rw$|j+N>M$|a1qlvM`KK_wmG}3K<+k@ zVx(3bYz;?JxnW}_XSeBXuhIJNHur&HEN<*HP1CS_MM}ZJ1S`Zvlf}kJC1070XXGS< z0u;xdIjpvPJ{Z>%a3~mfMkJgR?>4-$G_(MNZd#K3%!&sA!4l+hM!p)?i}Xu-`pKp; z)^Bn+PMP5CKlnw7u26S2f*1dp7+$6+0C>p65!lzMNuN9x!o^USV+2F*euq`*Sc#Mc zG)_ei9yeMDk0)(DnS$yEK5+{Y?g>wB>Y$tYUXU5rHaw1PJYxYCAri$syjnkcpEkHv z8QK0K##;7#V#sD>&Hh2d1E}>4Tx!xz_rjr(ogo{iPuGvjYj#S z;*Z4n^ zU2ZXXGu6YF;FR;zDQjGm+y`L*Fid%lR$0*U`L?`ipSjt1H@K}oA|U7aFZ=`F0=Fjl zKr$FTRRY2OC`@X_PeG@}DQDNeg`-)+-!h&{x9r=DrTx*-=ts(qB~L+@+U5AN*MlqP zj!!q)RC+%dJMfs{v-mz6_5=7rX3T%(oSnOc2I^NYg~oSE zil-{f&nG9EX36|!0&C0I!h#Gs9dDh|Akyjphl~piV$UlD&u%gW+%mt5hZP!BVU z9z9V87atfUr*B`>4*FR9Kh}wIRNlg~k2u2IvUqx_nf{D^VTrZ7BO6#Gmxs9Xet4^6 zi|wD{oMaIw$BN$|)@HrVon@Zc-c~dE!Q{c&oP1NTx1>V|G#+6i`=YQ%+b4@jqtrts zhq6l)GY;yk1}zb|LFOpB$AzS}qf5kx5B~950&e1bzQRh6TT$Wxv**!HkGiw1Wp`^4^O4qsO zHQpbL*mY4CQc)mZ&-srZ@SVWI7N z&mm!bSU7vB{c~`~QvHF;?D@}w-$=c;5EOr36*#&l%WqL&K^yw8n;c;|cEo85ZWnC8mTN!d0INmp*Oz z>uz(;r@c-k-L{1cwLj(dtxU1)$>;+eieKR2lIC0SAxSoYKubBIyLf6^pJ!U%<4Hl) z@O_SRuN|tRUgPUOJF5M~2PhF`Fb-huXaU~x@1#Q z+D3D(+NOf*uix1GcI<3^_CT~BG;n_c^w<%)UuJ<68fLjov((i;%b(`RE&U)3>x^O3 z1l+fS<^9K!vWaw;S|!n?od*RUiPO2dTg84~Br&l-*^r`d=U6q0?`d!NkB-=RMHO|{ zpwhe$Kn(S@eTnkyHOm(iO0tf>Ucj+4Gz^o?^!{B(Q(qf(fCOagJ?r$vIKA;P1i<-q(w=fn4DIcQ#dz-5WWU%r7Dy?X>BXCQsipLFohivA=a?d-*hyH3w~%8wt6Mwn)Y zX7SHcY?V7!4U(=uA5mr0=TBb<`X{{h;Qt7(_4-qfo?s%R9R$t5J+PEYt6U-7w&iBu zDk&Gg-!)iWTf2Tak%GJL1PK0YI(R#oNx{sDNM52d?mNMM{v3Yr-g9d5*~#Iwvp}7o z38rte)+{6;EgFbj02-#@9mT2he{y42mOyUo$M_IMk~$|VqLwmxNVf1%i|_DraA5CX zf-Cb(pW9@y;o$@Hs$9n$RvEjT|3B{F@gH{(&4@#9bCJ+u#ZyValK{_KTqW`;-x&W5LN+y2f-rK6pwIQxX^s(qD9F_zZhDnzsEm+;xnd;5>$c+oX;b8u}e z*eaw&B-{A+M0483AqA$ct7jiyU3`Qv7SQmbKN%CGk-oKXk8Cg;&U2}gB6~f>=L2Q< zzacx5`+<#j2Q$iBQHsEh%x9oXF>XxlL<@3#0&-kQMiG*cmQpMKgE;9bI4c{}xhX1W z=0|SV$WvZzm;7%y3430}TIj(EHI=wsu+11ji8$&J`EL4QJYUHXVxmumm(&MOfr z7T*^a((hI^o4FV!+_v@gCs)l<35Pd$2P=QCrhF$SbHev0B>X$+OA%oOM>6vWG3a-3 zxM(n-S9ZSFpqQk8`}?55IiYFT&Tlu|uPdB9VK-8;OcEA;X_B@yh`b{^sgf1H0LCTB zL(LY$d1g;aDfLdyKFur2rQhpfzCY1nQhq1Aujmz)oEoG*sGZ!Bo!Y5QeE4mQAwptD zCW?y^rihig*NC4t`d7Yr82Q!%XMe`0(uXuEqMvST6AYp9|$ z55@6b06t%UJY$$i5E6ame@Xyvx+V#SQp~F9RpjZ?<{EzBNL=WlyEEX4wEVtsZsTK% zOn7hfuUBc@ig1~x9vDb;sF(EGQddvc(TbB{>2E1Y&#re2nPJbgR8 zZ17#0KK;{5wBNhe1*t$ls+Z?-n{Af|xj)p9Boka|>6ar26M7bG3%u3{7}SIQy0sCW z0-Y61ub5{JQp7JANg$7>-98%?kBVYZ19-cqpNfv-2=Z(Hds9OiA(UJNd?Wl}Zp&|p zoYa_9{Bj@AkF-M0wU0*st8+0EGBQ7J03hP@jOcIE5 zJb#{HdUVfm9Up8(A-|L|647*o8FCCiPdD`?UvqbFj}!u|`uD__;$fXF`?R#I_MDJy zy6hk%yZ*qAtZWZK4RL4ALv5;0BBaJ;my>oDbxSDuiq=%Y&)z~m<5HG& zMwR7sq-pA%tU98aLapMrY^Y3b_e4#fGuZnB;3ULnl3c)j5CWg~Jz-xyB;K^(H8Ve` zFnB*${gJbcIe3op>FH#`()j>O8J#Fi*{8j^0sL`}Wsq^=f_m){E#q`1VTaaL08u-- z$4pqe*F)G2-X1HwdIJ3v{dJG$`}S}n`Q2Wm5r_aC_YyDz$S-qnIV#8t2XvnPB?X}K zs9EAy3#(p(OR|pt5+X=I(y+om>B?F35mIL^25bb1ewL@|Rv%pge2*9gt}-Xv^+94) zw~)!(X&rqt-Z!)spbnQ&#K{AS;6zd890YF{v+ z-kzS4fuxuQG!keKI9(7~1Y*op-&u(7v1SVtdo7?0{S1Yxg3Cy9)IC#o|xLy zpx!v$C9A-r93dinvBpp0{jt5c-^J1Uw;EW3o}3U3nDN`nXNApsGnIgVI3uUhvq)5- zmmJWAQZmidYs}SWt*AHLH^;ScaKela2}JWkeAOEpu_}XVcoiMZP}aA<=w*hY5! zozGSg=o4^Zf6Sat*uRwoS-vU}GRbCccb{dQR2MP2`?H2H@_1{U5vvof_Rra9&vV6{OD@8h zK+ct3Ep{uE5c&Kxpt+%x%`|YhBH<2y`4kau1$|bs@;%vusZ_AC#-V;yMss0R#X<;N zqJ2{^lj=JVODL+m6+cnH%v&NhR@Jc`*!zSt3r`>?mf>&Y$sIs|pj=jsn zyMIL&UxmB%9lZdiUeejr-SGI_6RIr@IR;3p5x(905JHsO%b$!2bV#t(XM&pm0AH+3 zLL?g~&<3+pPPZf*4S(qdZEG&I)7{%qu0Ae{me5vOv#I4Tl3|f%7*tnZ%i=14agm2= zjX55-^C%l~9BB{{_3Vk4px7%r+mK^I<%5BSMN4={!m9N0!s(KY-E%3CSCDSiyk00b zquW&%aptm+-eb?kf3pA^o@+cEa0B_N`T-fDrjg`&JM<}WJyaHcgRK==kWVA~X1?6I zdOn(g64&mr<>)u2!zC73T9Y=k?>QEM`W*Zk+19IUoQT zCVgUqs>Z1n6YBKIoz7idqTxwPH5x^eoHab|7(E7Z2FTv{7E8bm16_YVIj;XO(RN;J zO!<`_c;33=S4o9&?dNeWl?_;7N%PWav1&LD$G@O{~Um8YajJI#+O0r$d0*4YG1fkTB+XFy;QJ2(LoRoAgXZ9W9AdmYhNdP>b z1S`c`ZEj&#>BTF?+U`uK;1~X*SHxEk^@`k|vytVYWSDfy?x^kIEAtG~okM=+1`R&0 zhG*3s3X{0(!vD*J9D7Wod@xl*Cm}89OgBzxzLB3M0$yIgsE;UfBI}h;s(iT#0 z*<3+uP-l1%tMT@N=CwNo;#zwwkEre!P!XO4N1RbJo26qKcpSLaa7M2sTQJHhl`6FLp%!WRvHzEYR{ zpBT{!-`H_0KG8Gtc-oplYft~ZacKLDL6DEmdHwn4Vx|^JBE1L094*x;@yg&CIzcb* zp%2SI`oq}sZwm|-!egr z3LW9b-dxo5=qnh#ThGIHDeR_rlt;}dN$2ReA*r-J&!u78QbR)$C~28QDGB*A;KQ7= z;^%R1DaA@^$hi3PRey6GTo=2V2ZlO`x6`GGC`b5g6O|A3mvb&P=7w*k&AoV}zdpY@ zeF5D6L%?k$8lb3TVC2)>QRIEp!*R2)KA4wm+rZe!E_u?ECUif5E9zAQMAQz1d|RyT z?FDM~ej;-E`_Rxc^D+cb5VZ>gvksjd zS-Ms4^?sPk5mYiulWK!yw(Asd9LPOb?)>Y)fV}daApJ0rrAeaA)@{aY0Jed|2zaEbE_4`vLzEr z_)MC8t5QFO_WYnh$lm_` z?A3X^H?GkNtIGhX)b*1@2jEfi&grd%T;S)FdsA#Vcxy3}uz3C0%H;RTLw249|Kxf?T^SUENPk9F%8f!W{$;pu%jf^Y+kYUzy}gQ`0f zW+W={C)D@o`U?G<(SI4T@#VyOMf@RtY`>TT75ojZF?es=i&L0q)}P`8w;5PVbd2;J z61sM;92xH~WLj0;sOV-zm_}_+I0F}~oOKJ`7!H33bOI2?#eydp*l0LUad@*sDvI~_ z_VSzqs7Lp;nqAv2+-zI3A!Q%qx_0`@ZV!*)|Hs%{KvmUs@8XA&F6l;8Iz>Vnr9nUh zq@+Z;L8Rmm(%k}5QUcN;eMl+kM(HkT1Ua1ZU&r@*zk7do+&jj9jPt(kz1e5)wbx#2 z&iOp^nd@+sHe_Lj_`KB2_J?R17cY;FUcf(m%Tttp*A2P`tRgV|F!M(yGNA5v^{!lp zqdXwua(0WZZ~3`0aUn!zPXr- z8fd%QCOlca%@Zi#_J7srhC#1)=E%@UP<3Mfc*NT_a12 z&bZ7Lwhk(eGY+OoE>uy1r~e+JJDAdibVr@zS_82G>$gMFUWL%NQ}U*|>FHM=cK%nb zm#n<9A z->eB)?mlFo5~R6$ZEtC3?@kS{RzI?8%{6EXbfI6-!OqBzsG0{t&Dasdw)a+pFh{Fg+`cp@d8z_ zrP51AF={#A5;3GqV<5=Km)kU)JtL5+Fs%6wpc%;CXVpjiGsR4JfWi39i3BNdaNd|@ z%`}5V;^0R6aglV-4W?<@yO}MfNp1k_!ms7q)e%-Pc2=-6uLVL4g1bVX4UEt~&sCE5 ziUpKUcRa)!jQ#)Xt)X`hbPzn)GN?57j=Q?e=>%6|f1a~`H^^$2J5;4b86D^}a5EM4 z9$-Q~wr)OS>405-XQCxqIg~mLRau8#q${owLf*Y=eR}#02bJ%k;*A7(agZIqT)Y;R z*xl~_z4*0b&7;${&iviGOhW{i1gIbZjLzuV7gxY#Pmhh|-upDR6})8BiNEBTWrx|& z))ph}d5H;-n*OGXc>EAWyi%b6^~oB8>doM8ed$|n4}i%4Gv2ouk)Fr|ar}$T7Mx8A zQMk-=MI^PdHtGF>W6w%F$zs*4i|0Me=7orYg8a_V)c@s`k;BVNx)67exBt%4qNY%O z@(LT3#D`xNhaQhd^0`GrKuPe?ymVWD4;0A=Y2W|(0Ak9&uDEU*RwM*r23n4eIFq%^ zA&RQDw&8P3-<_V+E)+aN(dEI9X@Yls%x96Pot8YOe;ye-3^t!}dH53HFofv^_$x2y+b#4ky@W8qQ5{S`v15MKJ4wf47SMW7_6~Y~n=Lf{(hgx1( z5PsStF0YO?i+zt!Ie91vr{I86j)o}j{ znhM$<{U4y|0af1;6Hd6vh==Jt9%AWMmOhR5fpv6U#v-Ymu_&8|3hb-khUqwCt9TL6 z$*M2_4w7E~iXpmxqFOpHrNIkQhSS&tBkxg)6uVt90NjR7P|B1`%MmfZb>fx3Sm+J1 zYHjsDNTz9GXR==8)~1vBo6E3Vs(@v}$h$jU+@g0uBGr_u3}l6$`F)*hs#;Dtef=LS z=0(a5XE=wWSzk))e)u+GBpXi!wPOFYeue%M4=Q8%>K2rHu*>+>FXoTx;=UzI&4o^; zfD!>cx5TdT_w6wuv@t*poH_1d%=z>hA*K)rLYz{07iR|j63hLk6P zQ`R*J1eFIKE}UstglII1_kbJ$WIdEAh3HM&k|6!VFEsB_9Xb+=s`B8*00_l-)`8lf zEqJ}sH*Rrgy z{_CMy@AWPVL#YJFW8X;hObpMo%%HJX^!@G|#NE>2; zfahK>IYi?+|Ac#yjg97MjR}SL$ zZ}p)Eu6H~GLe#Bqk~1S1{u~+*NYeK#cP!GO$v`5Y;AIA+4|F^gwzx~szI#FxH~0wz zaY-sCeav|SCY;E<*Onl2yElPBJqRn1lKBTC)i(sLsuX;Z^Iv)mj~76uNKo<=8QC3gP#YD61aSjpd8 zfGWD!&IIIMC_+dLB3{)mwTP_ha+ab(czY!Or?lP3?eX?j^<|y6Bucb`RN8sIwR26R zA4(bcR0kik2dWf|yNl-m6W|4pR2DE&vxQ;E)c?8RhUBw}EDWDn=DB}!m>mzwe2geJp z5KXW2ii0cdE3=-VihaW`GrEvKMR?g%9uhp%^r`qjb4tlbq;j($9@ccr8VyqDX#Lep z=o5WDCMEJpeZfh^FMrQ2KWZGPr;gtAC=RS%VQb`VJH zV7N({{MgQ6w^Pc7aJxxaS;xd&c)^c^>cz9~=7zX7^1`J*f9D$U-hIaVB*C>0F!4L_ zp@^55%*yZ(bR{h!%E>>*>#jXw(!iU^VA4|2A? z{MsIVM?O6N^7$tlM5UUt_PvPGHNEhId)0~G4UL+k6PupYG&(k;^&8i+pO_!w`-T$s z{2npejx*~yVlcL!9nUq~W!)PU3rc+CX5y)QProjc)8nIN5{pXyeXUyVaOobVw%ahM zQC6N?g;IDDFUMRPu}oZx#BYhMMPg|QV(G1qBUN>y*By@a&iY2lr>B?K3h{rN#9vf-4;c(;Nm`z>xo(qlV%VI6zY z8o5sQXVo;S@(@0a6#S@ewX*OE3lg=Y@84AX?4)3ct}fvFV`A!qzKz3N9}y(qsE8nT zrutnQx>=uM8<&t|mHV`GIj{I*qYcH%H^i=UK0>NNgb)UYmn-_u{DQpwu5i26+dIoA%x%3t zu^yOuRm~EzSI4?7P^y^Y2BgZw{f?FC5Q=H>(g&Kc@17IY)FqDyW6!!~#=yx)8{n1Gg+T&YO#LsipmJ*M_Q&8)uB z@4GPhQEwny539YXFo3)>-BDmoq@o|RI0+=5JNFkCz&EtGeYp2yZ(wls-8*snc;zMz zV@a8BK4>ec0g}e5;OoKmP{!(;*Vls=6~q?Tr*Q)a9sHcF&EA!V54%i9%O4r5y4St| z%R@@OW8$ADt*Tp-?2si`amvL;c?bw|=5Pu-524t6Qzz{kvg$^OOjAn!`L9B7<)b#g zbEfvmv-g4-gHQ4ty-kr=eHT=Z>!pe35Y;z!SaS$*Y~u7AE|vGQKQ;=!-J{A@v*Z_B zaZ4~lE3aSh-Bb*}eW%KVIl2j#mIsQVXYt^XazlNfmcyuZ1_Y-$N#*z{auK#>u zm0-)&YdvC!`J-0399Tx-Z|6nc`2pPnJG9j|FYW~2h>**)zFe%-JHDSt^X1EzB<`h& z9b6|NBnHjl-8+2I^|)1f5wtoVf6+lwCK*fX@=jlSg|w8D1;5Ugr+TlihCuhN2_o11bhM`*}{4! zl4@$Y0xZjD9WG+hLmB#0VKrSKo~BSu`JVd}q7ZC^x!mZa0_B-~)c z9q_&X=f0@%!#4zl&A~p&g%$9I>3Gq-GsaI^H5ypg+=HTh`D68LaBtz)HEaQ%T(4XY zb(pXDe{IsZ8v}FMJhUaeoh?J9ii>|}x-a1_j zR8OH=j2dH5anJfrld%VvTB4V;YbzEBOHpNuM`sOjBW`9vxitOjwHS)tCR~0{ygk~eLMXA{`~6@ zgN53SwBJ)Q|Gr>UvtdgICUubAowN64)0Eq9Xu$_uNq~lXlc~=QG||pBOv4Flbl#kt z-p)Z_b;2;fU|fr&XQnh`RnVcRs96=-}f%i`N73us!trPBwRXb#%7J4V|e~-HLGhX-WQ@J z81e*vG(6>lxYRFsU(s|NOZ!Q@aAO05dt;T3$4ed@s~>^bQ435ki=3|@-=iEHtn*Nn34NbG(D1%8fM zGNlhaC0O$`PQ?m~iWu_t@S7$(dC5vS9`sMpOs7b>Z$x9Gymj4E&+dcvN|i{(pG08i zLx$n|$GM+rq#*{<0=1V{-;y-|6X97_hyPj(u~o`2!NmT% z&wsMLZ(+vxV?n% zLX>;k{_SJ}t^a=w0{2(c=I_#*(gDnyYZISKP(Z@mFh8F)5$q4@Iz;xA@_7J|SwBCC>ai*PyT;(C3C`@B?GT%MmTS z1~T}GV0Orh_vwWS4F*v{jh?`tf0?i`i&Qf=vciDC>u@ijmya~J)fGwKxP$7F$!=Wj zTRwU-Ur6a|_8xwCYK7H1t~!@4ChII93v*uNKEy%GV}KU$Eo(R`?k3>>YyD9(#tJp? zK+iuh4JDFL*D-CkR-7CQpQgNPU>IdRZ8Jtfo9fHjQrJVoDk8qS{oY`K{nDt+QEqY! z7vjujnQP;sGEnhgwrffAr>t8|y41cHAwh`c>>JvSV<+}sGOsIDrHJ-jeuvNnz8c-B zJ@Zp!$i$&Os3ow=K)Ggn=!wC<)A!Ko`UQ`F6MFXYh!$KgTfInLEK^o26AePIp~hlb z*<9nyLTyZMd=mQOAq z-^TN0p?D4Ahra=e^fkdh1_0?-1D!(OwoHdk?_8#B-lKmjArO8_*h1Utw$||9MF&H*=%zFa!~NT5 z0*q1-^G;L67p^HWFi>VlkP>z6^7Dafql7^O4Kq)f!aiNI`rv{ZhM+E$>mxtQ27?96 zRa63BA1IvwH;Jy!c^(S-hIZI%8@)jI5Dm@jBJQ;e*VB z#`k^u5;|V_JcEN=kjo4W$M=(Ph;!^(<@WBkPo;E7l9=(C-=gJ~aLoNyLh1uOJtgLh zLEK-8lK%}g|4xzmB-=dg&jmLkb#xNFJg-KKaKHmKCG_B{L$2Snd*v~JI?>CC%nw+% z;d>*Iy_35Nvn+`q6vT807ZdBCfW0pmPK;nuD=#_}bGS4MU(-5{B;}uX@%Ew=xm((6 z`H)w1Q}+;c)9lcH-F0Lv@FUQDlPMBCjUqOjz@C!7!t;P=p#Fa9VApHmc8l@cItVJwgmac)< z$8@S+^FMO`Yp$74UIW=t3DtRG`YO?H%P^ec?|*O*;z@~b&;z5m1cNUPca(MwkEFi% zsP(diny}J3^=y0rT-6WMEhaooent z>IOaV1;f)2M50Eo>>7ZZmvUcr`4cCG-POs$G-$Ayf(9vB#qxX2anF;rSNW0aqAqEA z8wNy=BSs*dK+MQ-rxOg17prjUqm2~aCJ{Ui#o@%;yR3eVCQ{i&C896Yy5-4TB#fI2 zAo;(h3O?v}ui2m+*2or?LlPb;$OH|NX8!TFn@ngye2og2&L4wUNpLi#h%%(woMW?} zJHhxb{I2fa-RUmzK`rIgNPL0`u-{Kv8MFyiYCr3e3RVBB1<>ZFu2o_c)LR#I9^?W6 z;c`Mv!b#0&ttjBgDHkPmA?=r$SioVdsDCN%{JfzH$tSd+PyvRN7fQU)Y={PFOMA5K zPOA)16qMpWCVv`{aa(3JBjQ~wWqMf4Y6&8=!Z2}A*` ze@De%Cw{$v$cTZ&6GW#*mF^)Ade)Wdn$SS3=;JK%oNs~(idBbl?*T>s==xb$frC(Y@Q}dM2Z3! zd3w0h=&RjI9+{LiJ8DC>HNs`bKLG6T5mlcg!i-^~BmIXm4FRc8a6LxPC3QE>uh~O+u>D9Yd%O z-H6Dd`0%>kgE_I3jxW+1i2&vYJhJL5BoA&5Suyh>9|A)50l=&rE_jYYKvo7*FPp9u zoI?t6IQvp?F{Zv8s3jD+Q_$O?E42nf>iK~WvAkNJIbB;(bq(*Y?p_zK?%D6GCIqPt zi{0&Mp~4-bSF|ZKDkr|k8i!M^^p6MI5t!rK#`N&lDV99~cV5e_MymV6uVE3`xyYpi zh}e>8?~XQ!$V4d~e@5|B%I}$hz~S&yn6M?%__|n;4jH_8i9oCTJ)QZX2l3keM=H~2 z*v(rN%)Wf>@onNNXxUvE0GG`Gx|%b}Qt-dn(>;JOkTOGj&Fjx>F~e%BD5d?YZ9{-$Wl*|KS-V-G;~Or?o$d=4}pCP1|3_rSzKxV*nP*`-Rw6Ih~B`u?Fj~ZThYd^ z*2$JVl#@kjIRFd#x-ahd=o2LjX&3=PBY6+Aep2@oqPxWn86Uz|5?u4m7X(FyeH0n8 zq6P5dgM*XtJyUTQ07^Ar3Oi~FwNKS&j7TVJ1v!!Kw@!S{$Qe7y#EaDW-M08Qij6Xu zGx_+6yP4V}B6iB0QA_6{)q2N`O3T zSTT-fM(bTQ#CdgbN%-+x2B_I;Dd~@3w!0P=r^k7^)bZeJRFyI^osSu^et7H?sN^!? z)7)Zq?CJC%tz%$7MITWn)}ipb0<_U`;vI(XnVGjo39tHpeTdA>KHn1s9?dtHVZK-3 zlAw1gllsg0r5*vCx8Gh8xL_;#aUb{brBc0O;A=-3)iiqhdfkV1Qwf~M;Mo&zuptm& ztY2Swd3GAERIDR<)@-aF+I9$iofGe@Ly#u@CxS;FR7*qT^6()tSnLq*!vbJ|q9ACc z7koV$^K8L5mP<9iD}D;iJi&}SAjUa(rVN&0<~c9{tOMrq^F$CL<7)q<5WZ2Kkz+gqdp>_>ZRNc;f(i?=y)ZOVN88#(EVRK5dy#s$;BhQH z?QHfE)?DRV!u$8sS9_lgAd>UVeDIy^G9lZFpT`C{Sw_j9j2%usUV7(NymjgyQBZK2 zX*m@F_cXp7=ugOQz0RhxV+pj!CZ_tHBFX-C0rPI&SF}lWf0C8w%Hrmyf?>umP9(`d z9Qp2*33=PT4e!+)^eWYs_i=sDQi7O?wP5kGtv>Xdf^~fMwGJ2B)4nB~UcyJElX zx5bX7y6cMu`6K?YHjk=n>Qm<^c{Zii?(kP*xZJ*4?<4K&pG&zNquP`Xtj0M?_uq#d zk-FIzMpv_!Fi16CyqXDkQlY((p`#HvZJi!Bw7CKTU&0W}dx@%nYv+Lq6Yrm3GZM4i zR^_Koce(lIw96SnBz55_nzkAnWGDF<=ja~ z?tsVLyNxz(ojyAEt36tS4TbC>{32iVzJ}{bW@c4R&7(sad_+Qe84o%w__ZeXtnTvP z8(_J0J$FNn#`4CA@(VMXr>wRE-86;`lcDs=PrUl^HghYrDu!p_ndmHP5MP{SeTZx^ z2-ZZWyMpNd-`@$LaCW}rgZR%Sye*LTtGO+b1;PQ?VYwGA^en~Opq`{{PVm(<< z*P|q@T2S+bR8|hY{iYQ8kdpE$)BiTE6zwK)l*;rikIUfp1<`=%Y28a-DG2zjlAg{^ zboAd%)-=T-MzeQ{t*r^N+Fn64SWSLncPYO5kAybi$&1Yy=G5f;2=}iAeIOVng^9kB&xJADQr$gw< zj<~{MJb9OE&#)-Y;vCxI@sHP}?>#0pKTHNaA@ESLc118|xtu-{d5#l@lU*Tu`C4%O0K!#$uk~_wdrx6dp(s#Rb3`)$ZDL`cQxtPn#Uv`0LuY5 zn;cz{WcW{0>u;%kNSgJf54L%}EJn5mH?7RmI;x#`diYG3welD{R1+MI>8 z_i~H9o#U=pMN%|4xQkD*T)JNi_jfpw5S5aAs8jh~pzC(;_*CaIm%V;5b6_MQdraKR z-GDYA%7p(5g~7Ui1Czs3PPNkH?MDbswJ~;oM*~YoU*A^MpAXfpHOksBBx`E+%U&4SuhrBMp0&viZC7$<32V0_Q zpD$y|!#~er{zKuMmOoWsfGqRCaJ@5c>Du9=m>m7YyJn@A8B~6u3Vwh!!u$yVQ_pK~ zb*thu{;|oS@!9#W;Dco|&Ra@Fv|uETm)(RZcR#RvZY)(D&OHrXt4+_FvlE?XZtSrglZJu;^I^`5D*p!vU=_>rft+E&sp+8+D@87Gy(2_LF1k1=2m@;W8LLoB6+t0$hz`SwZ?|Y82%>{A(8w|9SHgu1kG2gZ3vXSP(yC1TTBoHP;E7gObEsG2Kdz`Iq z(Y=uB$wn*-_4i-{3d$d`Ma;sOmDj7Lz@W9mO-V@xI4V=Uf|o@hLuPsfJ&d7P_>s5( z83tUUT{g-DcW#DOBgL3F_G3?wMtv5>$M3g{iKS~NXKx<(N-^0B(}54zplvn@nXATb z&0;jjqL8(497b$=DwB4e#6~TCOLIcp0sY-gr8{J!VuS_h5J1l?me&kP${_sXvY7!@ z3YLB3M|tm$+bRy1x+PQIEGTu%m|PKGKKJ1RZ@N5$0K0=_R8n7tAlMVk!e~H9BTPIM zoF;Oq1z?`D(Hk%3iS9C(yf2>OU{8$Ud+^%R@4{Ehio;JJp-S9yg^TU@$si;AN>RFl zIQ#0Z7%a^B#sircSnq(X7x3p7lrmBF+b?DbT=-F%^d|@D>1HaYn|+ge8!1>LK^Rq+ zrs5i|1Q3NtH-vc_#VlbbyBc@RMPAXDcjA-u zEU`jgmL4qdR*ngO zcc8~lc?%y#NBnVG`i7kyWwu>|3-1lR8(59J7;a98Y{LVCHB>2TTY-q%^A4%jbDG9c4q{veD&d=K8j>lH0h4IKUvQf{T_vWf+m5sq9 zAI_KMjRs)~FuO|&yq-1Yde3t{aPA#p=_m4}m7J8*Yiy>WV|vH0_z%l}g*ajmY%a)? zp3$^sx9?-EFuk~GV#XsxnSsV|CskF z-)KQRI$K5}N})SeXQ^_f@dsgP8=713YuS4^dabN9;`kJb{{PUP9rj|8bM7gOR!e*7 zLP}kXn*gEXlR!-;cfe>1>Y;c6Syum!4ncqFL4P&mbj0@cu28fTDe2i)ABGjAKl!hct<)cK1GV3wesWqJkA1n41CqY)XJTuSHQSk5(*c>q7dmg$s; zOoi^J>#G<14@H$;ygNyZ3x4w0BM1*=2$7LJrmhmW@78B(%Y_qdUy@cY01oMF?Ov9P zUGe4E*8>dmwxOkEvByjG#BLK`WmsgHupS7J%2;r;&=bx}a7I9i2`-LA$ls3s{8C8V ztd0SaHXfM@&TzU2aZQ^2gb@r>tVGx$u7)N7Ki(u&b1GO@BQE?ci)mEyh?VC<%R~kP0 z>Q2j=m3Uqeh+m^$%~(`{T-3Cxs0tzUY6)2o_+7^!+*sb;?^gdTgT%s=%$^b01zrj% z*^O-YwrRE9edx{Ndhj$oeHj+&*UCBGUP0p1REh>p?*@N82B;z7b&+LCCw9-H0NY>{ z&)umMY+O`eP`E}PQds>V<`nlttC3?r_bY zYVd7}#Kci-*i3z|IL%=I{FCeDUmj9j%0k$FcVR))Wzz?I;g#6%*xHll`u)|<1yxsq zRzJ$rJ-#n-ZX2mR%TF9PU`lNG_P8_)MTB6dOl^etM2UUBH-090ef4ueG(Q3}ex<@N zSO24NRu7;w0a*@N{+j*BABor|gS78#=(i;672A++M?IsFT56Bv%~V(Ykvn1I@|WoL z*ms+YSL4;8z;$hI3J+uVE}veJ;Cv?ExO_*2#8dfU2HuSS)s+_-3`Bmy8H6ub-*eGr{j$yB8iS118*)<` zrRkx9=N2~P7jEeQ6td&8jyaQlYND9;j9Wj3+4tPU?Br-HrvVwb{s_w11A^%G`Yx|a zaqBE5@_aUG`liPw;zaKZ$1#%u_W4Z!q4!k$X6*@r$eIM^j zr8V)@dG-76&qyJPJdVPfBGa0=BZMK8PZSAW%^lik7Qa(;2=k$5!k?vUryI#LhwIUq zhXG*KMxU3+C0;*t02l)(9xBE#7F6Vov5$Y{W&U&_V;FVo^>^cbH-vUX@@ta-htRuQ zp^i%&xkzGy(V6Ke6VNgMq>cq4&dZ}*LcftJC;RroR3jdrR_|1Tlt4?-LS+4@DCNtR zKK-V1TutAF+qAttDXn@xh|<&m~1<*EAekLSo(PRwBb~eyTZX zPfWWA61Ml@GeUsULv~?OsfXCVaB>|?pxAnuT3Aq6#!`Ld_G zGP#<|z&1si>dEJ7%Gijj4Q^BZ8h3*=T(B;l!-Bx?m8BpqzqsOEp)rAX5#5o?Wi8n~ zaO@)+1cP!H`+U5Tz&TE^QnW^2c}u7J`Pf6BE|AMPWh8 zaHZr?0sUufPO*m^_jm93Qdg$w4&F5AXeor?#0nX)|HS#YdQ)+8FJ{)BnjT_cXoz-% zpo%3w-Tm3(&sWR1KlhgWSdRc=`XEClyo}F-KsnJzI^b z1Ep`P1ula1)V9yPu@Er#b2femKecw)dO%@J(TcO^cK80lJ9Ednwl6$Y6;OKG=cn)xIiQy$kId9`9{oPj+u$~I{g?%UPr2RQl`m0e|7gK zt`uh-MVwp!=DpI&Dcb^MN}rVW&Ls=*upmtfK6)zM+X4^XlY`l&TS@`Rsbw%ujg;Ix z_ZAR!56&WsR+u@;h`M#J&Y0aHG`E&PL2EC#-#X{oh14%0ug_)s2benO6<|HO%fKIB zf3@;^shdqo-^v&Yv3?kVwN}II^&Z6co!~rYQTk<3qFDFF6%RM8li6*t(%=T7ls#aU zMPq`xR{YmSzhXHU@k>QoKg0uH2Z33%o^m*fXpvNVqCRC*n)JJXvBkos0hp2Hb_ke* z5S*LX{U@)%>v4 zH!#9S4p>u0b_K7w(lL?-H{xFsh@&kt_L_}NMa#bs0U5D^ibIMiZ$Pkq->|LW;7mIs zI68Hrq`cj?=^FNZ*h$}CJ4p4Lx*S7h*z6A*LzTKJT9p4ddL|LyU3FLEjw3l9)q~Jp zK*nvW@q8fsBS3fd#L70H=2X>MIDLnnCD7eYdf4}r*rt|sVcx`*m@9<|g4%bHoYzW_ zE+hB=eR6S&gk3NPT7mge&uQP0{GjoFkv@oqg!gNrJs z(e-&8@!yQSYQ&Mg*3gmYF!UuXVE*;6^n=|5k)PWz$o5nos%C10%uvToUdvucj5XQ~ ze0dJlk^cEzA)jK2jzdnf)w5`goTvs_ee_{`yWd++^UVOv>a{#EpqWNAqnY)!S*E z?{zlVFf{8aH@Df}1;cDzb_COx9=K?_M2rBZ0lbE`Jp zr8n~`jC@{Mm>^sH@XxCH_fK4pB9k}JflkZWXsFtu9Icn9i!!Yn{LIA5etqxOqEss^ z^Unq-HmqFH5R)uTAK=~|SvnYZt0wz$@Dtq@=e`I4O&*0)wYlB~0UU_YNC=~oH>AhGnkjGyOxC()j39A~oWa1H%{9^L zx^wIFIQ~;G7BC$7hSwtN#kWv!7`)pBx9E*~$dlRnc-(ymsFg82`S`eI%*Yj? zk*4mppsrmjuobG4WYVP{k=X%k<3Ex*7R@WD=c>CMh~2n0B9Vj0^Pt+KJUc6p!eZLX+)U$vyQ_FApXL43|5 zGttL;=BKPo6W0W*CVxEHq4=>+(iWsW9ScR6&{zh$ag}~$fqwkySWeRFr{e;6TQL0H zHA?ozC}|7EcnDU!Yq5ZfAq9U#nIINS0DE68wY{q~c1bFv^{XZf_M|WX9zY;1d&VFdD!Wu6&U@25--m`|3s#}dTbrAxU8C4~dp)G3Y5ji3xi$U<79?3k z-b=L(6xX1|Y~=`oAL-cr@?GHgx-8H+X_b4%reegT-U=A0)S`YZ9^`df3q*Z9D{|Q1Gez8Y44Wp?|)28;jK7Vs#@>2m=Q}`sshq{6D z`Px@-lY5lYm(cL=Av-usj;7;0982YXG+QSg#r~P`Q~jI>xv+tdsZT)i(Dgtv0A#>H z(s{Y@%7qrqd{CJ%`x`oVf!jWb%AxitOpZXm&^`1J`bC#N&AlP*7K7uU=M>iRXi7>w6? zkhP*fd)D(Qbz1P}nzH<^*KcDe-BR{yv83%^%OC>EvB5(IKgOar9VwO5(|+zzbW|Om z2)L}i)F-|+u6_qnMwsi=99;_c0l5}{OpX}07lBcSzT8uE4jZvy<83EtQM!=^(H!sB zRP+8v`so@8vbT{Un0$}LU1Ud7o*Ju8A^3LJxpua>PN2^igpQ$AGR6KF`(DXkcuNcS zLu~Iq9CDJbtp2X(t#*rn_p3X~WpKIp5sm&$R#W~bSuK^OEtTC1mW~CY+#U1V-_~%Y z_KZ+DYtwwk&SZ5f(%7OZpc#Adyog#G8r5ig@Pt(a z)yp?57_AH>dj&VU1V*35Uqp@s8vFRdej+c3n+_?&)+MpRi3t>BKHO=VBvb2?qnOs>~j#9w*M!-6qMPz?(`+b*1rZ z^_=TN+i~}afi>+Sdrb;|$X3Qvu}A?zL(~)gdKW6$Yf@nDADzFijnJZQKD*@|1B(Dj zhIi`>8Z4e0RL*?w)P9)a80RAZm51ZuxWoxaQxx<;IDvyLzY1bWTTbx7$$0a#Zg3qG zp@(YQG@ZvHHc{(sG3V{%f7*5oO{pQ5_TuT$x_Gl&;a%)2w86#GY{tm^U|;b6k81k4 zO%PWAP&ug=)g1j=c_9*wQcZ`O1XH{@YD9WH75G;R5YT6FU?2;mu6ynVKxqQJ(?4oz zn9<~4HFZs~aGY}Uy}i?TM9~f&!H|}<;VVT2r?th)k-<%xIc{JnW!@7HPR%q^Atlf3WSap2kuIMxt6YK^#=WjK zN=($3zW~r^`LQ%WEFHB-@^csnvFwDYZ+3c>_vd;?7OD)&!j@WOLO~} z_~CT3gayAW>X|(2E}S>xm&1d5Q2BOBu&B7>KXFHA)W5Bsl0g<1Q!jLU2gLU)r&rr0 zyjoOG%{^bYIv)9ep!w(n5GQ0KHQ{0mt`3#NX-Ka>)ZudBH z4%h%D%G8O<(nqLHY)9@@jrH0K7SZjio+i$xj~haee{`@&Ex54~-PlT~PY z#U(FEc4y$TWEhh4SVpe@<8+X51y#Hf=2bD*_QJyZSoF>%*=h$&0KC(WF(74;_XK|S zA-_guw}a%S=@r}7VeSvks4qVVImN~rhVl*WsyT9Jf7(h!-I9GX8#stcx^K6MQlP>d z^py13&5B=PpHpC3lY*qHK@lZbqkyAvZY;2Sin%?ziiv2gY~Do2fmo_qn3Shp-a$!G zR=-SMn7eil;W7Ik`YMO2i|GSC^=Jwj{ChncH{@ftPeA;LFTmf!T}!gLn*I&t(PCyG z@ad-NREo_idZJEu92$xsc5f}($ucusVVlwT#Az|1V4%hy%x)sKyjM*@rl++qGUUmIOKR( z9q*m0CvFU-uc<^$gAq{Ne`=UvibOfnS${Zz2m`e5Rn09 z$?uQL?UY`Pnf*UJvDx1=q}9#EhRasAbUow0{leAdfeNwXWqI_iTB&~aZe4aeUAyca zAcls=BE>yar}+g?qJPU8#wtBLNH&>LsSYSZQ2LtlSp=wEJeQ_p)L0c`)BZ|iT9Vo0 zs4e`$q4oq>jLRp?Q25ER?cNe54pq9S?Ti9qi#k0=^foeTl_Oe zZC{>M4QI_m+qwM2tWrafzZMCfrW-5WK0ixZKz!<@$LMuQGKtu;x_T7z1o$FeX`dUd zSzytQi6kozsP+5>KZ8lL!JgkH8)78o z?ztAyBxdS;_BqlOZrJKab1px1dn#YMJRAYZ862|1X-SNm3rjozC9zO|JQ8zcv|AYZ`QbaJ;_AzH1HRY5#8sNgWpS} zi2`i_IsoUO5>#EuhmR3T^=FxCp0^;V$`S`M^D6SfLbi_u!uks_%A*DIG9kOwX%f}n zv#gWDSgI|OxGC6FSCzL0ALqg!^QRc;d09M7OYQ_eVev3$?o_A^v3mQrtEyb-iU~&) z?&V-I@R1EhjoybMel)})eZM2PDMrMz$lcqxbyMCwMshv>W+9x%abgE4RsAXQ2LVQ& zOQY-gq7(eVZfrzIy8@f$< zRooaY6n*lgsN@d#XNk&7|beCW*PRd z?vFzTLO>G=BuxC0;yTY=CM^$fMC_)v_nl3PMXw&wzJxHV!5fUPXD~8E_ann)dLHM| z>*Bo%R&4qi*lkISF3o{$y6~Sa!CZnJA4dc$Jo>_YjTh_w)(O;~1YL1mz^1^_Q5qUuA;VNz+@ljJ_Y4fXt%?_w&OPqxbgM(ixeal5tZCb+?)2F15#rIBFON<79KP z+FoA1oH@NOeGSVs(cuX!p_DuNKdS}((A z!+Xp>Uo^J1GIW@dSPEwQYjEC?dmsDZm7qhC{Idh+oi4ZXwUKGzN9K~EDghRw_YFyt z(EAk#>|5qG)i>D8L+$G{huol{w*cp#?yLDfzN{JB=GFWMdYb9Ah}^$v$mDJvu&&4@ zd{X0^9zW}-D!)`yf~o0(jQ6lN=ejOqW`yaQiZ7nC$k?;-{39zOep^O`#?ob;>~Uf5 z9*Vyofb-yXSUhdTBVUj9U;Wv7cX;xhp*O%>|_XjG8P3Ac*mLryYt=cMIY@xUR zd&{pAxe;=jJ?LSLm&9likq#uXkk1VqSQj$@`hNBAB6iELx@^LW`K*pMUdRy{qv_MS*8oBs%Uf`h>#?2Zt2 znlZpFDiuvwJ2)&nln!s`UUR`jM{6+R&DY|PrD-)Lu9=Gp56AsHWeZqh)PdL#9$piQ zS6*{3NZi0V>#mR7-@Lg)8JTQv#ZDgh7W|N`-nwmKW=m# zE-A6LNmi8-!5+2P|BAORN?kS2;tB8hCL3w$C`%~FE^Ys~=tw6m7tNgT2JCfwb`yH5 zLHMIGMNLcfy}6TnJgp0m4i z=?Tb;&dey9B(AVt)WpY={>h5PdCB!bEtK58HTfhlS0qI`Ua8&sA-bM8jb7;#OQyP0 zdUop~;ERFD%hxIv>N2R(11nME+1AmrX=E8C8rk{&BaWH%AwK$zT_G^42I5d0-%G?q@~W zO>+vQ8WbL0U2$&Vqd1lSL#6{As-#@?s}(BdFVp?Bby>1scrTd)(Bc=+ut0r$2!dmBBPhWSo zGb+?8gwMIehE`@umx5eb2mT;6j_0){ZF=TAiI6}=3v25z?~jvqI*0z&*69B23|$U7 z5tKr+cI~_TYqpo1oGXG{=_)8NM@Qbj%UiBOyfIPcEddt-1|{_iRL`9%Z~74;>z%#WoMEC%w2BNeB`gfK)_ zc0z9|NRLbNFC6HDD1kO)`gteb>)3{4MQV;)TT7sAA zE^{rz8}sz^rHD*O`;#E+G{tb8m?vzVR3M7VtoZCRq>LQUD&6Ku-ZxH)-MeQ!PGVLb z9;7k_L?E09KHy7gYN}A~7#QLWQoNyhJKJd#%zQ8@2C$$HKv) zgHdH6KDW=s-xpxjR-A|tF;Y3UD}{xgC*j!oQVf*XZD)VVG3I_5NHLVoGJ+6_ntz4_ zMquqd7c53hqIG6Qggps*9-L_I2Fgvsbt&zZ~ zPK>XgPRhJEHXix}2I)q(Bvlr6OvmQ;(6M%UML22O^<)r`d+mrx$;$_+`I6aONq2}2 zDiW3z*~x%Te1vuwx=rN&%^cLqkak$c{Oj+icaOmQtbB(B#c8gBlh_d>1|&Klb)}Mt zf)P03KvnRhmr)gE_W^eC_N`YlIDm(T$F3in?6LkI1O_WujROrtFS$~Ot?j6L1h@GI z1)oUdJ<-%0r#Vt!;m%gW47m8qAJF*+L$8oDBo*XlDVVlBwTk3;AI#^=Ko`}Iwdj{( z1rahj?F9IW_ZuPHdm|MSBA+e;yn3pdHAtf^A}t$p&Ei0>0qCzOYY9zL!g;A{)i)^qPb*pc-kFharo2j5>ZPx02_ea&UvA5S3(`!_X z_c(T{1_ddg*=iBTou~g`C-}5?f?gE$cuG~!0*Sbd>bKM(OD}Jw>+7`xNT}DBKQ6z- zWJ{;DNZ1%;(wMEJ(?}U>M{$A0cAUU@WI2f(HG0ofEacCr$x1BPaY}l=CmHiwT|6Gv!N);(ydnxwcoo;Vq%~SgYkr2)!se2L-0((Y@GyJM@S&v-l4c`MV&d9^3yB zn}nz&ecf`GwV>Y;KpGNYN_s2qF5l%UO7jVuWj#_Yj^hTXtIx`RO#Jrp!Z3coVrOlw z$P{EEFdMP6M+T;}5bP9*D}_5fMBvE7m->RU57k2ATX&gjuxX{@#Yr{OH+aEPVKGZs z6p@JV{LTq8LoD-wFDVEyfLD4^)t--i2QUE(R+}jZ1jida0(Nm=p;u998azRE3@Iw=d)Gh>@XlOCh$`u zQpE!zsR$v*U5YW_;~28(jbTKspI6(NivmhA6d6J9&(af(O;{%?O%aQuXGMZA7kUaE z-}3NE{{dpvn89XerwfkN%*5DWcA9$h^hpUxh%BVK{hS8SC0|-E$*I9~6lPTUL?E-| zj5I;J*DPGV3GgExEheBBfVp2h;GC~AH7a(o$rWuioF*IoLK95(JbNxH9sI=hO903K z7fk&YwXCI*X28c}AJG`&3n!XUMc3_N#jE?{ZgrUktauAMp4i{w1x$kJ#vvWeU!%`D zU4xKVaIU0~rNTR41aKpvONBj3A^07aw~SyP-?il8>Qg!xIjCPi>-SGoh zq7*9RFsKr1;e)O9v1)^9kDT6{{jByb;DB5`^FLY+IG79z1zirf^QBewi%|-ln+*8Geg4v!2vF+q=o$uv`ra7baTkgI;x1f%Hiv9)+m4Qpqe1v6 zV*kNHj_azs8m;W@aT2A^vzVm2ySgB+^HkomsXy}ry?q?gb@XyPh)p+d*UdQ#?PaS7 zI~1D<@$mJL64kH|^MluTceQ+F_Iz^|0)IaTW|f1^vy0FZ&9|2fjP7lID3Bx{DdpRP z+a?49pa_0B=EyD%BY`RBN(l{Nf7Q{2o5RY2)Li)z9JPSvTp`XlxtA`rqxs&z@SJ?k zTihe)*LfZ(9LcnS{J-%a9;;6JA2zX2`jGNSiUETC!KYXv@ME9+QpBuK_e%rU*I&^= z4I!^)&2YXU!Eq%~n*JUk#yx|-U!Nndt6{g~UM~C$BT^`{2a*_wCMym(EYv03E`9hP z{mvL7=nb)ddp<5z`45%HYC=?D+MoJ{hN8?(qqRRNa*-9cIDq}lq#shmTKM@HGRctP zuCdwmtjy2jfJcUepcp}czo&rjGpB+Rgwc?OimI@Oj|v|w>DFUeTlo1ixj-f!XqLyK zG~werZ$N;5b2DIfyY~pVu9|;5yF5G;f&{_iH^hO4+`Z<89f8q=c6T`&sT?rMChht* zH`zEiIgh?S*F;$@0UJb=aqL$_9$IwS%JE-p=qXcEvq*uo1UFVU6%;tG9W9EuHU6%gNHb!94nfZ7}NmOdwj_rL+EKGC$?NRESuedjwfPn*;&STL9_1kgcn`Cp+ zQ}5$U`RXBLW)%V*6N32$H(6=|xMKj$l$X{1!VY$I0YbM)(fx3XuGPnU7$MueF!bO= z%uhOHISus;J&_@M$OkS*iL8yO0zd>w%^PYs`VQyLjT)d!gw- zcYR~m?#SK(Lr0W)I=XKTC0inCBWHKR|4zGYr52Xs>^h5~bD7d;)ZrRe>Xpp^tOLxs zV51X|9tu7!CJ79z3Qt3VRRB|i0x5cC_d?)23sf!W($btX@l|UNbH|$fPB`R?h{4BY zxlK8-{>Hl4izmGYT=JqA35I25fZ+Dd&TkPUP|nxZEF@NjtwosARX`gAgU0aj>D}MP z-K?E_rHAKE&!_L>^DmTx>xqxvqPUb)oSmr3G+ENq=AkOQElD zzwEe=RSx)jS4#}qe51Ete~njh$Cc7PB)*edT}p}+0z%y4h=^9cPe75&w+gT z58zpqtJK5WhM?S7uXl9F&{R@WQ**aOl8+D_D!f>?5a@xOY^(1re8vN<1wO6b`#od1 z4>3Hmu)pO=a#B_C4w~UwPImo+Ykd1}xCR$P=M&hefk4kV;yJnIVU;30N^*>6d!Yf% zZe{c*-TCWJC&Py{Xes{Cp)?Y_ng=#BpE`LMnP-j1+LPtcf5iF#5O9qZa;J0Rciw&} z#Gf~{+@65|LZjvnEr3P=v=IdYJfXKW*bys1FOrlW1)azbOII}Jc9QjV^lIcU4Sk~LTzyFSHz`tav`>m!@eY}J_vlah(6$$CP1DR0ffx|j zgeT@3q!b^QLSqwl;%M>o_wW}vFXrCQhig2i1a*Hmw^VC9m4=V^{%X3IzQF5sm*A$E zlZ8Z!$r@kulyMsq0^0=$^q({&a^@o0Zs&W3eU`#tMVQskv!=a{)$I}K>Ez(ZTj_wt zJ&hyVdcSxo?!obItt2OC!HfG5lXi-lnnb|SV=hXw=G|IbQ}ZkX`D?O-_V|P@lFZ?A zPQq(cVzo_<@y!)xYQ0#13Kj5Ijckf-T3Jr)hA|8zvnr_sX?S3qNhb76?sXk}$sYtiktOpXL4#U9HNs|`5&<(Z zl>ERF8?*|^o8r(VvvO`@Tu{;K$8u9gUzSX|ttH-JW4^hYb@O&S|NeYL^PZU`*IWoY z^>PwWwkT(akk9(sEi zCH-{Ew55!&jU--l)&dcI3k&fM+Y9*Ou)SQG9axY^yG$>p&ax)?UJ&K0RHg+vSw-c5 z0LeU`UIte45>k#-<)r2sowNvPiufn0$MxBz{Y-;TvmGw`nX>aoy4O}u7~&EW?@VAo z{SijK5xC8C_y=y#CIvtxi1e#zXiTZ=D;taX@xSjGaO@f4Q_OQ_rx$4TY{;rNDdmS- z@S+_Pc}ZheY4VZrtU>}z*?Wp}>LkN6V+H6-0pB32*&LHZ4*dbPBZ{R{8FPl0zb`;sg~AWX*2n`St-eWQr>$e@>@}=>>0h1PyYH`0~HgYs4HXGKU z+%dfrWMA|>FUc6~XsYSoq8e|-YXLIR?0dwbkuMbuOb14wvU>fP|Fd103dlxKjsERH zW8e0T<$%NB)L$AXMB)j(o15?OC06wR!vdJgpM%+TVPOH?SqeN%z_hK|V#!8gj6ia7 zV?3XL9(KN`)IS(u(|t2nbH`Ne8sS8Z;f6bWRc*oVGzIS)?Dgf2k3jfK#7@9Vdy?DWIZzYz??iaP$qex6xd-ADT zEtUA|C4YuDy_rykxG!RU-cXrwdV1PKy?zgV|1tADW``l@5aOv+5?3~l>ywe3TlNUo zBAY}M#%oHpoqVs%-V1T&;lvGtUs#YCN_N0rAPUH!-3-_1T_;508SX>OmG3_{X^*4E zUl^Zq_iSG9?#x|&*Z-i5y>-Jpoh#8{&gXu3lj=ET(~b3fqynMec#~b66ixhKlhGQ+ zX8M#Yyu5T`YKmo{;9>NKG72vYm#5$M-SWD+;)pO4O&g#EM2+^s1cYagmC5|B7xhrF zi8;-3ChSxAd3fX>KgK9W9}h6?^PE8@fVcujYF0tP;GaJ{o3EWkaYimt%)PxS9z1y9 zG;GfbYA_5$7W5dMcyGLJH+74O%e|Z-bLRmvZ_fMr6g8>};EoOsY}B7G`H|l-iDL&- znjG%mWQQ(>V?fSwD1ZG9mOkeV;qW@HQTxU&d=MDTe|eZs2}$WxdYN*l-xeIR%2^>p zNza(b@$j_G=^^6Cj`WH}s2Z32g?d#e2F3Jwz%doOiC_^69LF&g58=0?Duga$!9X80 z0{x8Aw_dwhxquJ*uV{#DBR%C10&>R)jh4kDF=6Y|a92emEk z_y@0}v^$f3U|FF|A8Bo0GFy|O>2QHwApd25F_MtpXwl|9U7wVQNRNXpx7^#dA152{ zHWC$Cs87nbF6VKfKOnjJ`2&Ccl(DVm@+@7Pp943xwBQZU)qw8Emzew(_UaWm=p^=d zO)h-}1T*NG(xOKv-@8Do7dF0@q=_~!I->g$L8<#Dt2KhMcEUHo#xA3zqzM1_@rKjO zpfZ$ma|h~S-KUK$KB8$BQalv&pBeq`yUw~ok2w$sA5W@8j_2^y^5Une`pvIc5l%H6 zzJH3M3raC(2ASnL)bohrpVWS*p-g4wae7r<`7^OIfNpHO&)&Yds&kmL7OoX5 zA0J;~aWN_|lkN&F#{!+4MptL2q@bX9W@Plm#)T)&==t+rc(q9jYVO#FudbhsNN~g1 zOmiyDEi6z#uYmNaWgnv_hfSAivSzD^AWTf4;{|FQ?pLS38*XmSc4Ev3at{5j`_~&#eJS`E zh~#~O-p^I-|EOjL_YZn*?~?Bt4ZNhq;K=)}oocB5jl)FP_%snuoI|Yv$mN;vD8}f7 zkBw_NR;99u(#0lPj^jvzY*s!Bylsx+r??~B(Ii`Q-l$PTf7p*E=jNh7s>Hfw;oJCxs)Y8GgWFh*}CLbJ)HmrnLS zu2_rUbedHg8%A%2!(6_-FY&r|xWgg{T4@8H2}Tns^a?Aol8})Hc*#`j+Xb9C#+>h* z_-pCxO+IEd?VfVOuU#{yO8oG5W?}fo8W|}0Cvy+>iamugXc_V24%49VerV@IStAgH z&mdhq$rTf0AUt>&*u8%@|n)};@BszL;J0|Lwy*msMP2A2ds?wLyp*a;ln8$ zFbJExL6J@iyilyoC*mqbk;T3#^5uvo7hC5__3Y6;Jji}$P-APhrq#mlFWpJmVJf>i z0`fHM-5g^ykwdQ_nwHtdr1ir7nqr z&b9G9==X?%PJ@I(IG2;s`!(K09_*aPib*~91yapa!Nhd(YHNPY%J?4+{qSZu$^?ba zXZ~WzaIGK6fw6Q;M6;|&-c8%{C2v?sVKgrKQ zJ~W*XO9WS@lX_?A17V6chXyasl=n5?$M;*x9TlQ_V69kaEPe_TCV9-+>K!@wT3()sSsg{!e&aPTW~DtyeN)$TWO;Sn^TxAYV# zM6yMv=VJyrU@?=IXaPx+0f_Li}p95aoJWnBZ=-) zNH~Bu!NDS8(78o8OA;lCcNNx%O}ur=PCL8QIegxFHmivRUOhg~5~i7BRu3c4WW{xc zmpZ*%?i&dJwm@1-#L7f5gF$cUxrwYik_i|TG2aB-fiNgRx~ z{tF5umZX+PegskJr}{8-;nh7c&s#&h!l@(Swb)nHTpbsSlSC&hq42$=-?Ed-m!wQ= zfg;qA+B3=oG>tJ4;pOt`@8yo#qgxc0Iakt^7_m8b)A6o?q)5kNv3YX8u=KHsIW!Sc*KD6m<#caL!;-9+G3ejn)QWd^Rxq9y-)p36(?lf z6osfRsyz#<%Ye89=l!`xDyfW3GRPoH@lo#H24%=cr>7Sr%9510?&@k{yQ= zJ=nvZ!iOFK`b(W`i%7rPXJ$+CktMTu+B30N%8+1IfqS{XwmyCmUDc4SfM)IvH$A&y z^X9Mui!5D7jf6>tP@U%}hNSQ^EA}XTtIZa6DCUASpJwL0dWmG|Y&66sWXDHW>id#b zB_=jGVj*;(#5aKkvGbVOIStU`3L=$^hO^b(I(vL(ruY@o%|-EeOcC3L3{9~Zow!}< zx0GxHU&LUEJV)wlm3^X;WIqFuTXobD$2z9T zNeOa$jht()%4a1{GMK**)2VQQTAk>V6wZ8hCYvNgvS>=`@nAlM3q?^-Q-X+?KUQ7C zW?($Phhv)*vh#cR^dU|hc&UVDwcWh&7vzmRp}vWpCp9hM&HE^VQoQ3;dUnzwqZrI@p&8`?6VOOpS2qvhN2T=Xf;|r#rhxrdC1mA zx`@H1)-`Wi1x=K9dxv%q!Ymj|cM~8vjHdY7m78BUNpy`jTI6d63|= zvI;BD4XUgo3x9W-&)Z+r1uv5ZZJb=_UWCvJeHk${43Ka3#|10kEW!#F|96Oo<8KhN%`*UMdExt3aR;9yJkuR0`K)Takm+D z>L(A~7*g_;>T4c06b9NFOxYHdp=|TevUIpm5%e2;bVzD2{OAy@0TVAh7i7Cef24Fd zDzqL=ZeYA1EO}3l?xo#aWaDewbLuTiLl|6gyp@Mj+dw1KKuCVJHw?H{ZJm{)+J{Hg?>TABB z8oQX%VHSUSh@aV6w$TqM+I~O1_h8FnZ6z1JiF=)EhP!b+mR69l?2GvAi~8fqeBC!1 zzW4oEh6c-`P+0q$HH^KcG?e=w@wyTSCytj97H0WfbwyN_J1d5&E;FMG_=KmWt$pfm zkb5Xyzoo*LiGpyiHv$YY_@hy}^16i1jla$bwB)ELXk=`O+nskt)Wh5@L|0Uwhp#eq zPn+}nII;|O+n$p-H*!I~OxW+;GESUZxzVOtas6=9a5``zIIdarPCjrVQ?Q?$mZw&V zapA65pdnQFKU3k#)m5Zt(GNbeBTb}m=HgMlYe8as%tyOeS6G3Xh)Cby10P@243* zhj<&3vXq>+g1q+jgD+;$4zJH75S+8ijIyIr+&f1Ie+ZDK&x~6b@uL0iOpXDSjh)99 z3GTSNnjx(W;fG&0jc>l|#H8BIe`n{ww9|g^(V?r4Q{O;r8dzO^(nrJOd^!&x1{YuH z+_MeL9;8P!7&rSNen%qNe!WUMJZMU@5U<0AkZLK0+KAV2#ZV-eRik}iL_B|TBV|jG z0oK7u;cH3O=gK#bQ-6=5WWoW)&@|cg_~#2Oh}Tsw_xZ|ow%sePZeYpM%V=DhH zVbMG^Qr_3*m_G=A`&KCHA~v5gCf4vC4c1<4bKq`r*{xZ}88+5l@$0D;4t?6)5%c8& zZ{A1a$oVb;xl-PY!%QQGS}JNxNHiBqcO4b=lTYvUda9?%H|j%ZsgF(!@`<`P9a8Vg zX7|dE0rMmXh&8?^Sa$aYx8lk6zHyk3AHg%--kp~a#0%OhOwV_=4N*0V;(Lpa%br?90tO( zZK>h{jwYAV$*z&V{^H^fw2R-2ei00#lq1V6;gI)5^zDi7@tbv9T2qaj?3Q!yXw0Am zZ&DS_J>#}l*r#Cat!WB;{7)HJ4v6BzFK|ipExk=x4yVpC3H_OLZ-!I{ryUD4-}dcf z6uap*vpH{P6j!JRdZSnkNDNS=I)Y#a4<@!E~@%Y^+|Kp?L`WGUNoG8nZ zPf%Y1vA>$p2KJ7%T-|xJHG@7rjn)EBdXsRra?p!Xfs@QQIleEbep@UJP{viPamCz*N%wCkBCWk(~zKzyg3Wsn^yH7QvN%HaxAw(P=#3&fpo_2bPFwl0bH_)E3> zi1@23*|yDpE|y*S*`N)RW~IQhjbkkNWMa|>&`n{tuOP)(5f^s&qwp-O&9hlECG}m? zxPGNUH-RW?{*1$Mc7&Fcz6;NQMh_X(lXaS4<(!Vf3;{l+&Ptp4@5^gg-`*h#$S-Q)bMAd^-K422I@#3R9#$x)gj zTJL6>Xf{Xe*n(7e_GsT`OJ_k+@X~7GTxBC=S}q@DM=liral`lLr|z01OH>~b#*=_{ zQ{Z8)5aoCVPQNmIuqcopkA2nOHO{_1_)B2?vVRBfiBF3n`qsj=LbHE+y+#MUY45i% z6RM&9@jbOHKl6{$e$U~a*9R9C-W;QfQQFH)4+QV6%v$q>lpT|TiQ5-()&%Bf+jBE# zQ6Un=^+?o`c2hyympxqWj3JZH;=omnZ}@3RPD5OcSc3Kl__G7!7E#Y5D59~ye!hrw z`zVT;!*FQRK@ha(e!W^4*A{{HiOA7w_VrY*PcS8ZFPNUkT3Z*X!}KzrEHgU6IURP#>{5v{Abc831$w+B6S{-|oW>a9)b zc4JQ>nF_j1PYF)lp0Ej`%msAG&APRIqHYr#D`7DYB4Vb2m8^27ir3NCQGL4##?zcu zQ~Ps$Fiv8tgTZ^eLRI^9>-)&{rp{QPV|^5(nXuzkDygLV@dORb9P8jXUg>o70EaMP z(b=0{|skzY-_4z>##v6Mi3<_ zo-Tpf+)`egvZ9gI^ZTZ-Yh$2b3|RAZC#>M~d1U0}EaF17xk%D*5;=zIl-_*O$&Aue z@tk*Ck2EhAsi&fC!NMlqa0Tks3?lpuX7p@i;|I?5)RZNIK1RILnhX8R9WBsov91is zb4Z`glfgT^OgS9QM(^R*3YRn;aiNEk@drUWi9r5O{``(D`?JanT>oRsZ${9a3uN$Q zsk|a9|Gw_cL{iXq9EiR01&+B}-@o4lz8?*n9(l%S)^#0>1#h8vw5Em*Zgl@bzU?{~ zfkigMP|WGNVfr7m{Sj(w{cA`q2vLF4>b=kVwc{<^(ZBU1Q`w1JQ&Hqo&V9THT1b3^b1;?x}T0Q4fZ7Eh-!UP((!KDrf`?5GoVu7CsX1&iHRMC%%GXXFio4KESdcmF1 zxQd}ZIDDqA0m`2U1#2QWqUpU^clplp((0Qh!Wx%(p7U_yV;sKKcx);A`O4YRmB!g| z_S##Hk8P)!#kXK>lbb~t$Nwri>?AgTuV@tyi(oVYcJYjCG3_K`g@!OHWcqYj+Y6sw zP*mmHdz;V5o3oeG3&@q5b%yhFg5I5io+g2g?!5x|INc%^=&_6)7mhf{yJOzPDCSm8 zi~I1kfX+LmT`88J>?SN^H40SxbI#f4tLSg!Oj@L)F^%coq?SX12ihM~@7!pi;)Nnc z8D~*UQD6`{ABI8opJ8JhGU_1c7lu`0XI>x}-rR zUt}*z>k?t^7-mT;-C!c45+8FR2zR(I-_1-mXfh@+~c zi9n{c;h}QZ$*~{kfurBTw4BL&eqmfeW+|6Znf%}U*ZauTBc&|F8`-+d%Fx<+V2G>w z=Ac`Np7Y1eCTF7&M~5V8Rbu!U{)N-ztee;DvFRv~yecXgBpFbdP?$a=(eA&gp*~pu zo;kY@19!m*EoByqseCWA)=ATl?-$>M8zB7PrxLB5|#gHm(fSqf&%aK>0T!o z>Yq~SN$=FM_68dsFuC&8B4N!EDBuO0-5UZb+*(XhY`Vu}>j)T#>s6N9{O-ATQf&g~ zSGG}!gaI&#@3p5!T~iWY2$~oBkW$2k|JXo<0KaGn9Y&))7C?S*5(m*BRJR59?6GuZ zEW!YLHT@g-Z4~!?lz4Bz*s-jVON?c-TN- z0u%!DEHg)CIRJGgPv2|KAkTCHh4vSqdl1u{ zTYPN71Fc;?_!xL)x9<1;x`Ip8BRi01P4>{(AFE7P2N%NEM1iNC6bCxb?PYA{%dCx0aO6tL|uW}Ma$s2mKl>Ef$-IISAx>f zfwtS{MVjuE8T1k_guT94RtSvOTQ!9BEq0DW(=%eB+ef}`w;KZ9gs#Xw*K(1PU7t6H zm!+#GnnmDSjc&G~w7@#&H6w2N+STBTQ3P_E@?t880*v5att;buNX9CS8eh&ge$WVc zn^8n=E{*O!6y%cb%1s<;H3C%T&I);m{M-0WIK3(BS6&~AD(jsx^g=HlE#ryWsfNlQ zcM=!GlCv_$&f&h@z=H<)qNGh%8DEKPwK^$mhQ!F*4@4}PEg=<&3VUeVEl~yfWycWL z%LiO?GWND4j?al|#b3_UKDt>^*_l43!BT05_7reRK76m9gQ)+a76=+WnNLA}oDroVRMyD6GWmqSl63fK_hSklt&@mEi=%3IXN*7ovE2)*thUqf$v-PDQaBRP6j z@oo8OL3;duD{yX_o&mRcz=;0gEu(6$NmM6jNv?Xa!goChK=b-qLGbHpsgNxq z8k~l48CE^t&=39T4PX5ozXzTEDVySa2<&dRlLHskbr;`>jK74lIL$mJaLXm$yPrFq zYfU1gcD_vj7W^L;U^4BPDh$l7rBTf6isy5$fCiSPNkxJkg+n>GUXp@80?CqKYcc}k zQJjuqxADNvXe|Me{`Yz34?p~;a%&H4vm(4ml%=na={AxH7Y~dNE)87*y0(BCs9_p2#%^`X zp$;V|z&l2jC{T9n1EeoAl!*fS0ZmLT4W0G*IF`rsf!8_oXgHm~udbUU6X#xm$@~Q3 zQaEJ@4;|HjfUw7oOD_(ol`T50QC!#acDCNGpyyMcX7#0&qp&nzqY^i^@$!@Xt2%Pr zy4|tu`uP-W9?|OI9}x#gxPmg%eIhWBI!-vNfu0n`RI%E+a%mNKAqm5mGmrxo%E8Sr zFDSgT?)HBxeBB3nc5=e3U5#!NA6)Pac+;%7B|dzG{jna5xCu7sY5)p37_Os;OIeqz zyl)7>75@fiq7a-yBdZrG#|k;{rN8fp=dEU6se9LokTvAxX}TDI;R)36yOso!l8Kq+ zK>sg$O392tfJ)3-9u@Up{57xg@jx1Sem3TBRvK zCPFQR!)yI4TspULG1{k^`@toXdK)N(f!Es~OE`UZZ5;gL-POKkP*8%-Dl24Zui`f`7@r zJsD9A{&I^v=Y-DHAjizBhl5uTn^^YyW-?EJW)oFSn=z#`P8aEHg{)JS>_?EJ=04vu zD~jK|+LUKb?M|(c$JCvxw{Ok!B^YSu9>(g=%2je}O_firH>JcoUA=}Pl766FBNCz3 zraAWq&)2{K;#ygvoVRBZO_JP6#7{>P?q353cd4&^-CC&#+3^cIV3RkZm-dZcl=lfT zs@4{fE-ho%!-8<|pEV&t7wILq-l-J`79Up^qDtG`wO~k?KMR!c5IPt%qFv_IHf|~S z!I$j$DMUoNynBoEgfRV_#^PoaHBuoC59r4=`{yll9va3c+|=(zwm{Zy@X>udm4Nt^ zTEHfy{T$$Sv1X_n7E8s+tfu4N(aCK{UxH{)+_RJTSG%l2V5S^BETCD!GcVo(J%jzy z1ODPMn+g!9bB-dQ`j{R)S#2kMkd7IB%k5_mx9T>3mJE~1F~W+I9sH=?c;g|}^spT( z(n;Xxy4+yDbzrZc5wYVi^2m9tG!5Mv3A{*2@LSzs1Hfq+E_OQAjam1M4Iyk^Z}ua$ z`0DIiU-}%lOoy>ojlSQ>A{b;`HdKbla*-n1en)2GvUd?>7 zL|9af!P-hF$W~4yJFIt2w%K1r8!R|eL;sn{L>eQqHv~j-H(pW9a@P$d&Sgi1*Zbzj4DlZj?>$o#C9HF$07(VrDkJ914Uv;4O*@nxD?R&NmbUtfi z!ynZZ%MdIDX5uKK1Fi(i*XC3+J=nbyZKDX__wVh494OC6t^D@lIreEg*VRjq=O)=0 z?GceMz5eszG97HVsX6J7pa+9yPBZ!%yKPn``1VLzEaFFp<0yi%j7FQM$ra;nXvyoM z)g!^txLE|80bC{vY+LI%;F^{@z=AH-xTY(6_9~z5nVC>YUsF=bm|oA<@QYvX{9g+V zjLQtc9pFFCx_!N)X{!9`9!K@XSsv6ce14_>VWN<5SAe$Ix{pL&%#E3}PiT6{GnKw( zDaIcC@w_?FPSWM;AM_@HC)gmubAHkzhb99biXBH46N^avTP1W2H8-<1t&8tEhG@$Gu>#(RCQH?%4erKwK$@gb|JF0(W!)W-I#!O$=cj-$Da= zRylf;mhyt&*fRvZEE&el6zLX$gEW#b`0VRp16ltfqx#ol zU$S*qX{1KX?LFu`@|ml?O2{-(;I#Mz&j6t~T|&j>R^dMd0{%NpM{3?`3vT`a&w%H6 z0~(|3&%EGUZF5i@#{6w1!#`49A-4=MHLy{x;&Y$!WVq)xT&%9g^`+Kqb z3ay(Y*nqkQ(~kn~wDF`b^~rU&fPuR!F@%(qJ1>iQ*Ek0k+MP-&w= zAlAaFMOKwBud0fN8Ui6*X3Hrv0&W`S-yeHlp@Jx~auCB}Lo-3*RWVx(7*kV(->$^j z4sSq|Ox)Z)t-)Ql*`Uz9vR2@67Kkv{|A&rZ4cPlPrxbD-{4TNR7gIShogemr%bG=z z;8MxPMm8%Cr#{S&O~t`fVhq*IURC@bWNY`T#~4KB5B=Mn^eN9Cv#5+Ah7iha#7NM& za|#~C$ub24NgvY@V(h|2TDj~W@h#CV zzvmnmYN?J?k54A_5Nek=cMZB@7L!mky1-=rTzk#Db$Bz}>|Xtboltt+$tOYfNwCFb zu=r(aArq0NxlAy-&s+XSNBN8ZgBsi(5N^9*R=Itm#~6p9HmLOQ^k(Q1XlN6=Dp~sB zF;yJlHWUVGiwDD24O3aNpH_wzHbY^<^h!sCA%0%){|9s>3*s*Ty2`OWlQ93b5R5i* zFNK}c55v#j_2WCt^kfUR@K^4#|ADxm=&)?Aqzua)j{-ceZZ z9nrcPS5BxK!iyvywFIrt(u=bUe;jkYEENkjkjiM&&0QNO`zgQ&`8eAqtBHjf%8IJ~ zONUUQl=sOS{siD~_|JpQ=7l19pJ4ak0?2IBFZl$m>-dH&L6oANy)+(<>>?k?>n8s< zWfq%kk)|_eIH~(Z4B~VxT_AV;ZB^yTtY9=soeUw4!{Q*w49zgwuoO`Y7iS=4RIPN+ zU^Yqs(f_BJ1)TJN(xQzaWZ~vh1sK)dewRTYStk|z(fQk&op2~kJYa)b4c}K| z%Md1`S2O;fD3#6g%rLLTCW3+havxOTA57aIMvh+)pnG-$0D-BkLFGZH#)Jd^pmM69 zolW$OKYs&!Fi9@g=a~sqEG)kgfTyR?7tqu|0IGLn>Quc zwakn0_?8p|NnZ9>>(kO2*m6t2j;CK5a-0-KNYSIuV+1ohwXFfN4ye-5pNMo~I$aScG7};3eFy3qz)U0R& zRII9wnUqdZd(L+xfFnvE`bHKH4Cl8gOeqsb3;M}w9Mmv@s)8L&j?`bi`{nkRm%HQS zoiw6r^^!~j?PNv3dHpTVX#fi26M!AzVB9-Wek*A>uA)%Ew*5?}?(8xWw`8HLA`V%A zFy!kk8UU8Dm7565(UcPgZ}g+NvI;x*Say+392OifS)mSFryRZXxa9`W7Z1mg)!{Fa z_$OKbojSP;>;cLH3o&+0rQPYm&Pmb7kB=$iuh3%$Lop7d2843zjQQxr)-^f$y=GIq z9dCix3x4ar^v6L|@W#_qfd2iW-p0zGGsn55)i?gxa69|KJvAzcTZhbk% z=L%LHqDJHCInGRmw_@N@R@{34d-1>q9nI87ppvQ3pgLFw{h2BV+V}dc?d+Sy!^&sx zfT(}?w7<1?Zh6wz^;HK!oo;`v>x*yCmJXDnI}DrN?olpC>w$Rt`f-v|(~RC_r~h9? zBgCN^0?ZQZ`?l{-kRBdlRzV=@^AD^AAI|B+f{@Ck{G@Dy7m3}7kd2U#F{-ypOWz9u zQ{u+r(XIC8#XmHd*2$Fpw(c6IYR(Nx61GKp{?_`Ng~Jiq?;viG>>c3ScoPOZDYyRg zD+vdgd#ACVAfXQ0EM%Z*V zpQSZ6yPn>z{JlB$cDVg3dWYVfwij2fH?Ze}8;=YJMc;n;4BqpY{d*=Tm*pj`w1U+*k{G9@yy+!>z8#Qx!5;yd7$?Sh_3%GOj zH2-$f2Zj2|Zd`IVh`ewA#frJYBqRULirxEcTCGp;OP7>R1-PulQ@3uK{=<{~hCgrY zK8cQHkO|DHozUt9UTtyT!$P)N?Jwuq$Im4p_SZ}QaAEL+l~q~T9W*9ir)lTpu>Ac3 zCVBGG0rnrJY?qO0)WGhe#iMya(T5LQKsoX*?|<%$hd-B+wR}@pGb6-lEN1iCc3LmJ zV4<=zNCN&~&t;G7I$-K1=ho4eruO;Xf%3`DSA@2dY__?0W7_$f;dj{Cm;|}u8W*xh z*PPgqxX0}QH}D8Z1?3HE)1Q24&g1`qiQ$YP(u?L{=R+!x&+ViNYGpfgfT>`V?SV^P1 zEbV9a%oH@h9lv5Pz+4b&3iy~QAhTD{$@r|3*pvUTL0J1I4HG*JX8T^ z(yj>tIXgQm3;7LvkgTk%j@6!yf#K_=xi3J*W@G2>?yj(i2x|EcTqd7~@?VaI0q`}D z=l1;Pr@LUCz{;=|UUw1t7~;Y8IF{Hby1K4m$eGt{+sCz)kdbXp5o!~XGXGWiM3$nxRC!iQ< zoa5;%Ge8LED22&*Qs0$ruat@bzcP>Gf+5cz6ZEIm>I1CA1SG`qb*A^^J}NPUD>I94 zt}a!F-GBKFB!z<|E>Iy-3`9L^LIP$TqYIl~x4yQ%>s=H2>GBX#!zqS%1^h}<43T5D zi=t3z_s1n#@Y|s8KYoA}Xp|SS)Hpx}5I!McaYF+c5U*1M)*?mCbE(rf<~IGjLythx zK}JT##6O&FvG}*iNsyo90wAUy{!Z@`)&Bu8fp@BhJp#*@(F%kdC6y-2e9nkJst+cJ z_LZ+=!-Ob=Fr?jq8%JowncWdD2gB+9lD6iT1bIs(H2wz@`V|4Xz1PiHFjyDyEfS1?5dKBjIRVfUGIr9-OLripHC3oS(zt8s!%gs713t%ysWBH!YaOt zS3$4}RPb4;$Pwnu*p+%yca!d=JZt5Nh~+4^W#Ts z1qFSP^&OJLK`k>gLHCyF=WA0_q=2dZv%Bkld2BPZFEXnMgFG|YQ?5mhWD1sabTEJs zsj8}aczv5vI|aW~W*(f_D^Or=6S<^-=G?|k>_J(b<`MTPWIX^XiJn@nj&GY!uLOK5 zkQ%C^dX-AH2w%Zx0ySbdvkG2s;>|M!VbTPvZ}z#eG#L(m9r>Dn25EGn=wLl~5C;Gs zka1g7#0>fp2*%9hcj8o4kMXXA`6B+c*pHf~rj@t1G|m3|p<7;5U>VwUP#C%xseJZc_MVg`(dI+ON54Qabhv4? zS%5sPyf~fhL29>OyD4x%kooYfX#9;yKN(s2D+PrB79ViSste$EjaZ-Hj_yV#D??(* zr%&8l+e(_+U|p1tm6f`;ZMYagp~bW&QVf|bZT-2ToubKjcA-1JLu`@S05B8w`2Xm7 z3$UuXc5QSa-Klg50umC^QUVgvqI7q6cOzW_(gI3%cZak{H%NEKl34%XeZPJ7Ise}0 zxL0Xa4>|AIjIE2xIh z2h|W}SFFJ%Fj5-At9ElZr;fItXOLccPf$N68nFNeF|)Dg0i38msFT4vm39$$wlkof z!DhpBCzUO(NGFg=HAE3$Cq)=0PTR!7IDr-M4Gi|c}jR_cd2{48> z7=I{_JSy(EypLu(GLwdBakK1lv-T4R)o4k&A``G5^_TKG!$rbR(_B+3*A%9$! z!2L0UFM#rafqNEUa0rSORaGC?Y;Y5ZMkjn#A+)>2!Oe{%(xRliYD%rokun?QZDl3v zkRar=gY!zO!4K>Q9!7LbWaI|(8e;o zL%!?@gyi~}KCe~JZm#Ex1^jZ~#ah(AUC%=< zx7Ot^Xk7xn94S3JI}DGPs>ndQW@~L74Cp>n)BGS1a^c^eoxy7#(29i=cykYWd4z|f1&JDzWGvZ?xsS%kR#yFadSefoXskPC-KO_E z*e*77>Hx+WQ0UDb+BGm$h0T?R*8~3Nv}YRvEWjHCnZQyWC%_LXGYBsX5gVW#pdf~! z&~7!inF&I75~XSh`MgX88l<(|-fRAN|CTxk8(9dwXnuqxft$qW*DeK$4~&|8^{EcH zGp%+X(4;DCsRJ}%Xby{tjQj?yA~34)&YL+o&m*IwtF#`)tr?_Y;uTd@&l{mTPQR(7 z{s`NxLI8{fI)HTk1-VXSR^5Dj1UXI?^W)Xq41?eRv?8fkI0O(#L2+?+7(P9y-vl*! zYo~5(oEK>|P&VLM;|FMOZ-I~yB7W`3ks=NxDgThltJ14LHVPywpp^-jXGA0?`<0pB!U%D0gC!9Yb#Fz5UzlB#RwkM zV>>n#hS@nk0rd-j4)DIdeVdu1Wl-M>F?K9%ywgJKWLhD4ul|l43)xd6ho2LeBk<}o z00o(n5-xDjv+NGkASKA?rhe5L9UYyw`6mXHHZL~V2WH@7ASvIJs(@}`tr5V1gR%N^ zwA6gSJEq_t52Ug@Hj8?iPQK@9E8p*#L4$~eEm905``at)XUBS#YM_tMqbvhxionYg zCTHW6F(JB5D5F%irU&l!P3jCE5_-HH7MNp6pO1PK5VJk z6$lJ5bH`DDo!i^9SZwuF#p@Q?IXL*zus`)5W|9L)oo?5y;}1BK8{g)PA4MMOQmm$g z-4EFs{9pX!hR$}Z!2%kO-n(1XU128DHMBUBySWWfgs0)E)v%AiAFT0d*1;kXVgZRY zR8LWv%Cs?<%iyMQzFsY&?B_&<)3Lh282+A-VBPm4-AGMBK?&RTCG&i~9pmYQ<-@Fo zEOx}95?WVMy;5_VRdB$8M>W){jy3>oL{nEcW^{D)OBzZiDEa_zHJF5I+SJtgWa0wU^I5Xl!aU)apCFt{*i+Z#IAV>Ojk1t3sGfdd|)L(oY=Ki!3YDB zpL>IlZ{GRGj~~oe5I@@31fPisYTJl4J0jqzz{^H@W(4nWZ)*g*Bif~-L_xqo3kEv1 zqK1cZ4)eU$!T~f#ov|Emw0u0_)~%S*-iwM^iXT+6?xeN*Ln;hE%XrepOk|!H{AvLi z(3QfM;3`<8t3NTQNd-jfXV61T-@*b7@@;0Hor^0Nd=@9#2FV&b=^ru3TI#|H;S3g#C*+#oZF_@TY+ zLXX&l3#tqSZV#$UbbpXq<=uS=(P=~PHK=4GY{3&=DWAv8q?7>@?NNv}670$fujf)Q z6QS>A6uL_nTk1y_>vY9RnLDxD1GJ6FCYD^-6VK zDAH4NqP28`Ti%}LJXWqQMYh3fQ;iSMgDj1eg?jRO$FC&Oa<9m$XE12I^>ai9495c;K42)JvvjUL1Y`Fzhn&-(XTu4aBsvR$Q>1U@` zw5<7lls4A9NICE|GyD8h8z^Ua8j?y5b-CwEIMz&zU{ykA1~71MaL7039JtTGt-X4@ zHQ)jD4}^2APk^1{n}JPam-UZ92%i7VrVvmbDZV|5vse2z$u z)Kkratc{Tn47rtpn7A_-op4q@#<2gOYjY@BUHD^5%&5})U|}F8ogai=dI**QL1p~{ zCIrt10>T4c@4uY!14b%$7Fqp3vp@7s^d9o(nWhK-M!(%^2OQ*&-081uu_8_D>fnV8 zf&v8yF!k{#AnV}d=B|Pf`?i8Oo4K@o{!*uPS)E>&d+?I`%!%y17mzh&%GM7BX+C=< z9`awc08ik#3*LSI?K@g-pD$YNyE!IS4O@I0MYAp-0tRa}7`s9Tompru0@Tt%zJV%+ z-k)rsS{8^pAWvmSK0OhqsG23kd_zP~BdNevV?7CUfsd~H%od`@gV%KWYvdRtK9Ff9 zu>_{n>7fjH`sTQwGr3_fu(hN#Jxi|tCrQPhpLd2tN+pod#g{BYR4xNo#UT6wKjeaNZ`1 zR>Pv=&~H@i(0G$AVj5`AnzWry>&+|?qJGc1$CNCM zRaCn?U`yr&X-<8i?N#Dt(_-@?>e?{T?{>C)Ig z*C(^=%^fQOVL<)axsH3TJ)V%fa-5vL@6tS%fU~*%t+XZO--u=#JG8r?tSqU9J#8dj zfcA_ufr`vvTUj@SjymC7llhSU;bjW1n~!_&!S1ekS)P*1|0C@FH${5A(e1moQ zovf^E#b1#}>_0!Bk+Df?2FcI5ee?B>ysYfT#^12^ygZ3`rR0?}8EZ(T8?9ieO^C3v zQ8mI3{cVwI-;sycZ_5sJ@el-oObisr^oFdZr~?EyCiXZPn3>M{*NyX3C`_PGM#dsw zK;NO(zvaDVZ|Z7cD4kCx$-g4(w0}j|*pRudrweeKDL*x!D{+U2u^GLo{|AGA)3-{K23!#_Hw@*u5Q-*8Ay zhlz;RyoPqBWOM&x#rD>g7XSNt7W4Wf2s_X~i?5WRk6oZ2QZO~O;@THlvGBwS$kZTV zI-I=qb~-n=vJwX_N7Pg)s+h=CJ5QX1HPKEa4ar;k4C4^Gsca<39mWP~XichktGI^eH_&}WS4TAADc_=Nq zg)@|N$fj%7YZLmv7EOv2kpON5#CNDwO;!;gJ#HGZv(~e z3Tm5gws57#dAl5{bRSFKe5h(&NH`(;D@^l@?==kuZrn;r++J7?SXh^+6w~HQH65?W zuO-(j@4M!o0*HF{<<<3fD8Ty2Km4N*#%Bc0ZCmIifz)^Fwf5N~R=bXaUjM@~|1CU~ zPx4R2i$?)*)^AKn)Gv*k6ORYWce&utxId(Q1erm}NhT+lM~!a>x!r{9m0=xv;n$MO zSRxvq9>Mw4G?Eu#KODSqNir!;R@#BK*T^eZse3S7mDg!Uv2Ue4qbsZM{_r2X`o9kq zjx0r{r>I6+u$RPTQU9PpUM0k3ruZ&zrJdyhD1obk4 z5p%wq$%xQ^PuyIn5JksTHi(`<0XA6Yo-J0@r*@x?VDE1|kOQ0j`u4VaD^7`m3UdK@ zB)|Q6Ozny7_Jy%)2sND2=lMVrY9%el+m z{$Q%TFn2d^Lj8EribMijGJ2M^Z};FLH)OsM0Q`5fju6r3&!=;di@$xe2~K5nns_h# z8Wvw%LvUZ+4;j}nC+!*mk*k#2_`a;~&^w&$8J;?0T-xh~fnJ3=!_9I9eDOxHu^-M0 z!^t8q5kiqLNzg*`MIrWG8~lFCKLf!wN&XXxua-QvOm%B3o_G}BrjzF7PL)^Ef_wI# zD1kowAx_^;Pw(-!RVorsOXd17n%zaWf>5hRw0tRoS7(nHUJu{-MuZi)*3V0HkM>O5 zz;C654&j%2UPNsNt}d{5>ES-pt0E7(yUOf-mO% zH9{byy3BmyZo_`}GAg_MnnWcqt83~(PC8BG`nKXL6Wq+Ul78LuU-xa_<-Xl|6YQos zFhW#=;ogp}S-|MFOld?`S8y^il*vrv&fjs?w+;WJOa+%qgF|m1lKy4ibs=b2>>RR5 zXdIH_i=+sr=fke#Y*TH`c_1rL3WMd-A?-{l6H1ip91mOi_lVk^oHDf#Q4w`(cW68y z4t9666V^LdwCf7_5X?ZRXU_{?O*9a-k+Za(-i@CiFmqS3WqG|EH7o4W+BnSvOkW1k zUSM?@YJuf@^=Z*to|F!UWQ?xa9i%Sp-B(QXYz}0|q)T>57+tnDL6;p_*#Vk(G+LUs za?Kk(*A65FK7x|>2W~YPt!(p-g|EvqD@5(AB)<@w_+Z-`82Yl(6$vFUoABu*jo~qgUn`z+ z9Mi{3FdVRr5jU8x?`4Unzl$ImwX93_4K73gd6nw=d~yCXa-l%qVlNLTVhO4))Yq1Q z3;r`VIXRNPK|DyGc?E+hzwmS6c;Lsy$wU`|P$A97ZwFs9)Nn?~$h-(`L;8OMrSW3A zfm3bREF*Fyf~)}y+}n+-@b7TD&aeOWolNsAcWy`t=d7Vl_i^05d<07)lNhB*EqM5T z$JDo-V&NlM+zI@=b^I#{!_1Z-LD6x*e;P+eT``dK4)=ybW)T z`j4pz!qzWh9!S%j<*W`GJLYM%u*)x6HfM^hkroZ-Qo%|Ly zgYb)6cZ3L($G-uVhLuYA0Avf*3Dv*!mYG;OYD&m&l$zdBuFvg7E*pRy&-wPoGKiJLj z13@cH+AE{1l|(j=#+Dv03P|Od_veCwhrsT) zE7+ZqC+kCvXKRtCr7M%if~V^SOc!5d0cGWldz|%VlI?lsF^o$iHEsHAt)v}D@P01_ z4I;8?Mz6Js#Qmc2I^O85xpPp$jTvQom>J7Jr1H>ni|GT8=G?Ev=ZKk+u;p_Q1-lZY zBqG@94#9^wicmOlT5!($n*s#P?5(mj-ZFad@TaLx$`_jgFQca(cwo<_{zaC%14ubHhdD%AQFkDJj_^|I@2Ldw~MZUcjblF9O5Su6DF+ z9xYPG;cTZhuAI_y_)ZDh)r`;aeS^&unE3==8rL2xU%V<@+lHMeKN`25F^d!BjwTxJ zXL?*WFSkyf(}nc3-+GpBzJrXbxQ)Pn&sGFx8Kv#^PvFRaY8%EX?lnbFROU@08~@+6 z_QRES81(e?G&3F3iPR9Z-CiLfzdz~CpbIeL8*=qUqCY-{yFVT}KK93sQ8dA^3^l$b zcZ-L?N(4kK7dq+}B?1ZVRecI0f+(aN=1zcsi(R$qzXV*&TkofR+F&!oh6p9LQ88c_ z7eicFZCd@@?Rhos$FHS!$rw513IzNBfHPen-#KnYiYP_mLdMG7>d;rS0__)DL#hw4 z0LnyWTKJ{qLTK7;9PFc!n_DAr+4-cLjb zR0(dhr4X7{ObbyT6lUo6pJV>Psx*x11$#@-UVJ78oSMsMm9nGen&bwb|5>oC8yeR$ zOa-LHjjhCcBf(QR1A)j+J-1~e4)0&nE^85uVA(Zs&4pmrRM|Xi45aS!H!MeCw=ntV zmoVX%mI=6-7cgN%IB`C^->B)b^Ja=6?2EzN+kfM6!zh!75FvK8zW7f^Y&&LzJLq)k z3@uAr%Y7kW!?&L=J;DGCf&Vs$dppwTO?~=`#Y!mfb&sA9IL&Ou&!@M^qyQ$hFR3KD zZ=InP?k9Zmf*7}<~?Wbst^Z7s6(Eo%g;le7N&i z;?Ms=dGg1tpMCM52~o3|=sZD|ZU$=mgr~VjJP5oukQ~!JljN@`u`cO+WLUF@E`Yl% zanbHNjW$FPx{-9Frn6z@yRZUkCg31|?B?JY6o9`U_CxGIfFL|zf(FXtiw{gyA?WY` zdWKNF!kljlVS_A`e9hU`%OwS^n_1+x@PIA!Nh}(0h- zw+=0=3xkXA(?C)HhJbf=Cj=lbJEpn&!_Ury+{yx@Z2m>g8|K?z5*yBXq5TV+1Fxc% z>PXo>=~!58!{e^`uhd5&+_l+|UFlMn5dRbGQaVOVY^{>c?Fg=+Uj4M1ToHjmVg3=S z`9hvEc}t^}#y{8i()#yB)>PE8v!cF@ z_|d-B9Ca@LH5pFyq-B>4%G67wO{gYm$1{UQbs#IyCrBqD53HY7tkB9kfaRO#uAbuy z3J{*2XEM6`)!&hPp~~W{{#;uq86qRU%ll>YxUr`4o(YBRKREP&i91WOjJ-m*YGBA= zbg%f-3W&=d9-RXd!-v$GT`pfM7I=YP2;z{~>}qzkx*?2O-_sb=9gFK7fh}&*RZJSp0B{XykYoS#U~u%$qle z4H+qA?KUXxd`vdLkAJU9;MR09E*ZJvrtq@8m6(qRGmeISUDt1~Xcm@J|HX^67BTSX zK*7!hL2&npn*az2xikbR1;+TJFk$fzfM$0^5?f>%&Hj}IIJw9J zSpciY`<#uHS0zB!-cbrY2BaqfI$X%E2;G;aoxl|zynu-@3~hz zmFEv#LF_wM*5qr~Deo8Q2?x^;PNWO_Gb${#1eZ2ppyXysC`Jb6kh1wa#|OgR4wh$@ z9P#gtXJ;0^k%V+~zZJ&fZc;zFQdtAUz#hKe_Y0I_rDr!hSHkP%u0GrW)w)6nS00|P zoTmqpqZ|ao^41mq>^DwAVY8m+ynIFH%eS6IMb~qZx#MPV+1^I}PZ*fvJ6#TL3<6l@ zIG$kQMbHj)Mmu^R(>HFl#`+m<>m0O{=aRD8qu_me>d*dsN9RqY_Xu5V1x6p`b*|S-+Do;qz8_WPoE66M<}@07vJ`yt@^2@h(}hK4=ac6G+v%i8B*t5){+(2o zahJ-lg8K1fR^7G`no1+-CGq1xRy)EAClha-x(g3i1eMEp%M!KQ;xg40660!I$`$q!(Uu3qMhb(*E4?%B!Ti!Ag?GuUS8sG7za>>-Ugv4|=Ido#^xLt}& z`(${xk7vAF;8V!ug3D2Tkp0!>1wC_KJH!0;q^PmmReVGWq>I{ql=QY4Beq4^f4TpzoF{J@0s$N!upI8C;k%AMZq4dj;~Uh zkX|?a-K6x=c55}l>K+na@u4e@u0G~zI_Jbp7XHXbQ`_e*M5PO^_pjnl9zQhMDVeg$ zbgZRaqhOqLcW=^K9&Z{Z9(o>xO|O}g^JBKl)LONqcQ)FA&RvaOe&>g#pDE|MCx7S? zp=w@w^AS`SIQ`IlUG23{ggNAdUUF>5F+hv3Bg;)GF%}KIn@m$ruh_iaU?2 zdnk~r$TQsRd*{DA^jOk%p!R7CGy^)DxzVnIA1`{z%moGmpeGw;xgT{o%5{CrrP)u< z$<=jI;~0F}x^+Bqq0Y~Svu2LZ2<4yDbyG%Nc|x1YUYD0RinP_==k^{ew5_d!!X{n9 zS1S-kHunS%^7X(xLO7gZd`XfR4fL%A`~$x3@{DWn>3NuYS534AXRA~|jIl*V+|wp7 zXwWhn+O?DI@eTC?u4Lb~{en+}vnS3=I!Di43CLEXgWU{HO71`LR8B9b^JfUp7ROS)aY;{2B>`2HTI=gOmFw!pE&5dXWnjeM%X)-9 zKE(CqsynW@MP*fPW$|XC*z(!7j{Yoq;|uGjLt)Uons+H?rIW{ftHax);cR`-BGUgvt zBId|Y-VO~o{<7~4TU)&ahe|F#jmv`HC|;ea@wL<*aR!ax_pK$W%L1{F3N+6~-be)d zQaeYP+|s9J6~{~+4_JO}Yq0BWAo@Dh4huu95UI?fjM?FbjHr6q%R=vK7slOc+ZC_6 zXFxH%&Kw6L_8cMO3gqll1^>-zbdz}&d&95j8gtk*f5(bXKpo{SbSNJjwbJB0l;-+4 zW$UYJ+v9Pal|etL=B)e)Lj!~nzKcjMxuo6lrRe3?a(V|CIQ=KYgFflp7}2_Izj=bZ zFbe{aUF8elHbOhRo~EZqU$YR4nA{^ypZgjS`=y1>#l0b~ufCUpMueK9a2~E`xc)VD z$h#*Tgc=RNwy{UWrP8AmTGuQ6oMj966OTSvn8cJ*E+v+hP>eAXP+ znUSnjZ)8O;Nsb;;RFtc}6bp)5ys=};yFN@jlse1z-}d>#-<_~Nn2Rq5j{7#`Ts1MYqcLN?u_fcxBNY`}rS!6sTr&LR0u5W;o=6uPQ(KO9 zrNWM_PoO9roo0XEf#r(10q4+VAa;1rx=h|*;joN-Xp^;pr+iY_EAIkKY8kgsM@49bkGZYjo;oA_13Ny&rQ&c-P_ zA^z#p3WTJrt23IiVE3$@$edUg$~B+So|{cV9o$2Sxqd8q6Fq~{mvzaE=QMu$5 zhiqf7&6!SQ*U8pRK7-sTC_l+C3K7#fJ*99KE}KeUzunFH)We!vK+77TCu*^gzMXrEt0nuH|g<)&BLAwl8CaPsGVMMVX> zoG-OaqmpP-Wbv><@7?`Ea_lPBS@eY1;J;=;eP@lmF3Zicb`Mu2n$O8?G7Lwq>!!wc zvjz-J?%ejh);s)L?!1iq!-ZpoRNDI;A~U^E$F|Nkk8S~HT~u6r?t@%c-*>9xwolHu zg4*itJiUIO@={uTt)VL2oBY*^P4)Ij zw^rMtcT{3a}~Fn&l+c7ZC()tctgC&!zF=X{iycb`Hc*7RR^?q@B9S z1!?}P7J$zW@AK@!%W&-&GNamTYIH=60vy~lZ^EGy@X739G4Qw=VKzs>la~M9jI@EiEHMII zRU&>V@#6Kyr|aXxQ$PkyL$_aO{b=KG5NSXRH#D0u^#O?Ys?Zi{XeD0+F zG(4x`l}1;%6ni}FsoUg3^Q)8&48{@}x+)=E+?OWWH3;vN+?qlmfm&3-qP+=R&2G9Jlz+929lC6xjELSEr|&bpvnx9vP{ zDw6X_y~-D4o7+i!;1_QO8FAx(7Gdi@59&Axn&@AG@VnVEAIp-6cQQMCMBJ@X&D&dc z8qJaK9iFs8S@AoweqI3w(jQbO41$Qnb9F;+K|NC3*H=fz%Z4%R$CdqGD_zSi8Mvlr z&dc;M)D+5aO;)EmtaCoN2H)r5Ao@$QVFt6oeyy&-54 z9g6>Y%N$KoeS$^r-Wg_ zUFH{;wYvPe`#P>D6oT(VirtnwA-r#C=N?+QjdgCL)AR+3PUygIs5N}y_O@jc%p9qU z5Yk1v$a;LCr5OE<&25sW859pJDR-$H(t~Gaz!1&AI}Dv|irY5$PlT+IAl^?cWjS=4 zMW4Plk3~g6f15yC7=w$@YJIlJq-uK)dXmpw;3$L|2#~P6jSnb655`T=%5ol{;LiK_ z^Shug7eQCm>S+!hGkO~dn*R0RGg4*7{dmE;x3tn=-?;BoF%mLv`~+gS6{ZtnlgBH_ zvaxWS-hVHm=oKE$dci1&ujz$8#d1-j)aHjy{PP!&z$vkf+n?8q6$d6ZYA)5c_jdb& z?q|uYpjg6tUG2b;deHNsHPf#WqkY4W>@ltYj!l-R{V_nZy_K|_y%jm*AZs&>j6_~B zht-S`sc#F-u>IunY2xSC!j4oH$|C$;*_K%rjWvTZfSJ2#=)UjR_Qsk>Hl8*-Snqdo zo4BfE=$k#OaN0(RSi?Kn0X7m6lAXPsZ|=JvJT;{qBr7ocQRd5v)ca!E%*MYh5QJa6 zi>QkHc4){szVs0IhIN1(>v;c9A`Zt>Q8?*8sM=yuc&^t@3u{cPG8!a9RX08yVTfPz z!Vs@uNxjK6oO<-{R+c8Beoh9`Dp3;z#a4bl@EdL*6_H7r^sXu>*jWkaT&2{ua%au7 zn^yluz3t4MKO8$bao$&_$95z6?%g|B9Z0k3B^`aym4clf$j2mwYWc@X!f@5yQI(r2iy3r9N&2F3@Bw4S6*> zey@(XUMDopmiHzCT@{61Ra&>^^F+v75GIVYUN<@O_w_zRBJb7cH-xRM7aG>qmg(0E z_e-S-+EUCcda{OB=Qj zPmV&Zwy+dUdnv^HHE)1_Dzkrkv`pS7`FBHg@#}p@$#|oxx@K}}g!&h6!2X|hDW=UB znc5z3RJ|s#L}WiBgE1|teH^zW0FKKd_|gs%@hbaa`?K&E*4$AJ|CE$;t6$ zy6`F(pA^sXwJk86H;qJPhseWZT^iR%Ttm7PYSz{h8@>3>kDJHtSJ-_lEG!^j7k-Ic z7MK54(>-=+S=Qgl#|-TI>rtfZ{dDt09|HE!qWL*~cY8GS=Hud;0`Tcm)4wfJKUyzJ zX=xVv7u&Nn(=)Jdxfe0 z8=s2i5ZCoG`fQ)7RWI5zGQNN|Gu({4fw75Q_LOr|2E0L0`;xjOkdio=L}npMM&oE! zc4eflrg|QaSPYplCR{tx*sZ&5K=>S2F^pC*enghHd7RI*n~dd!9^mTjxx0QzqLl{W z)%v(yB$IKlWT1WrcMwMRYV+wi5wIOXF-YAmjdqd!ImTt%QYdkSGgzaK=AzxV7fVEL zRzuH){^z^7-Qrz`I8t06@v>elILU z<>xMZ#yI`bcVd-~6ORJ8pW4Nu6BuyhMf*O@#e{**tgvi5svIG9QpnA(3hj_g^U3-3?G zzWVcR`6`AU7>bPmv-Wc#*NEd~j;3*j$E=2hvvu3HSL3%@#wS=(i; z`_O-%W5d{1*;7C0+Im(O6`R}G&^5SM?;obVlm?;hx4b+g?U@u{4603blg>#>GP*z6 zkn2nzxS#)W&H#`H2%e1&4eicNQq$53%gXYA34dv*2f5GQgka{E=DKV3rFw4m3lD^s z3nTa$&uQ-_ym*>oipHBKFxnm)%G6J8QYfQrB|j4 zLdHl1zG@*|c3qaa#NnjaM`^5g;eu%t2DPa>_rE@HNRQIx5sP=Wm63@dL%JXKi6kKJ z^IBRnP*rSWhYD9npPXY->Ef5A?jJ3>pYw(oQK(hX4&AaX-!0Zwp!vf(;$N)yjR`(P zgVEp=y0cSxUabm3f9Um6zj=2@1+z^P%;)hZQa1h+*t>n#A2;!5XF`2azIQ)(Hmps*x2M{ zXFsl_JHN0{I5M0hNMy>Z@eGAZ@H)MDD>Zr7&AsJzi?#xulZ%V}M_Z-=^;ucOv_d}L zcP&znak5CS=tt#$i7F;PLYzieH^OGN!s5d#^oh2G%<&EE*blc$BgBj7R zL*fW^Affd6>YdtmI;0w|UhOo*jsO6oXT}oGTTN5FTR6Md-V7;jM2n`SoFZNJUr(pS zWHqxI$BR3y2+cH{gd{_-D1~G}HJ}CyY}1LMdGuA>la< zi(a>&QdSOpYmnCbo43OoxiQm5SjndD@t@&6}44K!;KYZrnWqM znTIyevvJaLjZx6+vGUtK?Vc}|(W{?chN?LoBFG2r45^l(nT!7xw_xt}!xu!|5Ygu@ z-~L{lOJmtab{vo&t@MW(V~@EbW&iTTZ1HCZB7_mZ#+Ar%#{Q4Ucs!t_}v~lhLhY+A5T? z*gmLu&t)7c@@pLro;D6Y@E8&o=Fog7)z0%;PSQNX}(Fbmj zP1cQrz!5(~Zo)`zn{V31`Rt>>sJ5VX>l*87$Z!E$MN~$!N0S>Pg{ieFy(Ryc@zl8y zLx_Gr#R1Oj8azHPZVsz1yg73VPMU9Zu1$gaE5lyOlE`Xb{PBkg;e`Hl;jeI8L`W|- zH;=sd0Pu1)Z)t5X&AgQAyW;IVjXI=#Z291Q&2E`w(|VItE~prb%l%^4Rh zpQQmG`KH;(@WJ6P$8+75e*oBeo85cg7HFeoyc{ho3LaU)+GHpDB;&ib>GU=*7^~48 zsg66uLjXkKdY=C2XRDf(%)gH`%Lq*PL}!xni&b1N5|wk z!W9Yt*4grX^;>7HnI-j_jB`#6d@7H`1kd&T=aZd*Z%R{CnYXsfc^tgnWe~uU5HFLoWz=qNsJQKAOpZA7M#`=3yFYVr=yuw7h5$RaDm=*ieUf%OLmA@ZP zP*!>3d;H7Ek59NVOq4uR6?FO15-@FVkpK?++l&-0dV9UdvfTJ|`9S}Az1MXa+sG^O z1;}^A!Q%-$jfhAq0lo_OOgmt8y4c?jZw@UXXqieiyk1<4n;6fVDF^9y000(TKPD?D z8;XPJrMWzM^LL+#rTlc`BxY)w!*@*-&{g>F< zBJ=1wJ6qwx*xCq+%X3Sb{Yp3Fjgde|SY}u6x<@j+vlrw0cmd6NCEX`yV_QLpF`gt1B$SY`k7_=CdO?5&Iy0Z*D19>xU0yG z5TJi{ya%KrZDtQk^zv7jWG{><1k%7@^WSO&XyYk1osq^ zHx3)tFew3cK*Ov@kxJjL@Y?x#YLq!|Ym-=|Jz`t`ux`fGyj6N|l)@f0V?}$ht%J9o zc?0O@Ta~LnaWRIT*OztjuW1Q&s84JRU(PgB=Xc)NYI(9K>w1o8Q(Dn_<=;oE_NqHg znUk(!wYy?;Z~c%-`8#i!``ahfckAzdq0i-~|3SQM5(gvN6&@ot@oo}{^!D~Ly!X=+ z5k(CGA_D{!3>LrO^_z_K8CT?2RNxPd311}6=&2DxK?(CDB1|U#e_{F+yxg*gBrRVO_$epp7 z)&F>qhs;CaZJ=qGfxVur%=9Mbwl0$_%M1ILL`A3YbBDfq1M#Sq?SQnHe+&<7JdqYm zMzc*z{6lPcO4T}rO+=2V6F?iR$z>1DQWag9Zf1^!KF1Gc?5i5#rMIHX2q0CTC zMWw60`uDxdr*|5S4ziCsNHM8aX@BCgCi1=sF}C-L4c0_n$Ce}x-2ULTzTHhdMA2*f z^@5I-l)v7E+upa}D`Jwk_BJ1LO#W%P2frr|kK7*rSY=0igYd`U(hRw;AxG23UtR7u zw7l`_2trtO0|$0FZI|0?ZC35+yp2PfLzZ{1`^({M9)?e#JftBbu&tjrkch|mv#9P7 zf_Fs12osHlnboYsCFp`oZ|p9SX)Za1YWz+1s(H7FM&oa7hwKT?m(OTixp~oZlR$ob zcc>uPYn&pDdwwc2IJC<-!pu4%HEEs-a_@;+Gu(5+R|l`(e$SmNR>|IP8u~B(5g2qh zD2UFVwF^T-#zG}EH>u#HO-fU?=0sk)ekEaQ)&P(G&U%KJ;00R8-g#Z9sj3xTeWvhG z*(|L}zoxo(+fzR=qLxAzy;KgcGn-sO{u3pkWDCP)0`UaQy~t%$!besoK=qM7bL!#{ zQ+lL#x=$M-5q-b+g{sQ5x%UU1S(Y_BZg(Pw9w9#3V)QM~NA{DZayYYEi~;=}0OEcR zCUUZBhu1h5Pv1V;1^r(=RmMk*2O=svd!mnz@0IUW(I@z`W`6#@$m8LrbX$VdvVDNz zMiRq%P>mHIq!y0%v6Vy24d9v+iBiq8_v@}rOo0#mNfgo+W4=ZOPXxE==qt82wDb$UgzSiI}}O0H1+%bI=v6&XlR?(Yi_d0^a7g zy$!J`l7X#HWTTgRJI(iyp=%2P=(2;zvIna~Te+|RAD_s$*_Vt?qPH(PG?)N?wAz>> z{qrsAOJ?Pngw?_ip4#OL>sLWx&0W1ED$Tf}Cq}~*6zzLnZ{9@Yd@b^i<5pju2+uRO z!l(Y-B%#e8ZJt_Cv`7CI@RY@N8yLi{A>nVt{PM}K4wRIs=A0Cp$*tZ z5G{~HiB5^ zAe@8fd8A*Zg5+kYeahL-Yn;NL3TEsyMeFYno%+pZjUeN+;@md zYvtd=#JT?IaE+!QugV_JVs2ed6|~iv?g^npYE#A{s#uPQ0uNCJm~yg2C4a!4{^vVO zZ@D#7q8&ckMDscOFx<#DE?-k(f%7mI7V&3$Wf$!QY3Th!`99Lq>!nJbgQtMq{fGW; zQv2S~)0o|*@5$$xb$ssKHg*jaTG_t6JKbph=ZOg?!naVVBRqNQN#^svv3*8<<`z=% zf`mOFah6@u$*1}MA^Tj(+EfYQg$dB8hd37A58^zru@oFSl2)!@R$G_~(# zn37`!Jq5H2!8?6NhT$xVH{nG^;9wuj6ThUs`gx^53!1Aibbnf07q*;cc4fSG;vdQF zB!cL^brepfMU{@f!M*Y}6XORJjZVVC_J4vr54hwcCw}iVEpPt?+Cm`d`r?=FjM)Nv zxQ!G~*6}c(Zk*wQmz(fv8)Id7SZs9U^SoltRz&erW9BZpa}&T4VN5g_{PL3QjY$mQ z(E9)#dgL1isvhm{hm>{P^3j&}E+h{Pj`egNA~lj0`1OtN zLeow0V0??Ozfb#Z@gQE?!tVi(fr|Yv7|Cltx%}#0>KjQvXF$)yOm+zUp_Jd}&aEP^ zhQMc@B868X)1yQX+@JGKt)niU<4F3VLWtN@hOLCnqG;kTu zz(R~G-^#_x=g*Nv>k|`WD>8>CCNy48DWWhLdveK&t!29L0Iry2jbT5ib!j4-Nc5+b z%q5o}TJ}Buz?kPbWe=pax;dh>_r*O)mhR0eLa%=C_3|6^j@K_XOW3VrbjpHo5T5u8 z&2;4WJbOl71TsmCi_BX{UFh&O;VanrDb_W$Z_Q1J{)tsXiykzZJB`CN`;cR;D`T3d61Ks_xZ@oem{la`tqJ$Nc4 zgkPD&yhS3c)m|gzx88S=;S4eM|36)Q1y~eq+x8+Qpp@YJsbI*0(*Lhx9PALhYf}6y7(qf0u z#>*NYJG0BJ!a?JsA5Y_@$kfEQ!%Jq^Ns^b)5dbBvd6m6fO9}#c;tFhL;XHAY-Uw80Q z&~pX=7yi@Ni+)#VO+l`2o+-qi?3dRAg_DlzM_*a=+z&y~ZG#y~mO!7FY2cR?J&w7~ zES!T@0R(GM8+PCYogSR_@8$zCadDmWJ#+#utQ^%Rd^Rcw3D3rCha}du;KBT-NOBh4aI;NvOfs}Yb zn6z&_eo{zTS^28JJ2&(gm@agmIAgtDy-8-(IFAm=E>&W9H>~{T7#;|>wzdvv`J9CN z6Y$@qeF|JNEgMuw33aVK#2o86eARsYWqMl6^(Nhh3vIez&8+~- z`6AV9p}3`Y$CVC0DWB+|?xS{NJn6xEaemZnsA6^0HT^BgYu`oXwd>WXeZJ}Yn>3QP z8=f)~{)!uoTv043fYM1HZ%yW^C@4fyR^0O`{G6o7KjK2l-A;%2es;#hNU$#k!}vL4 zY+^E5YdKVx{Qij=BSoy$KsWW6Q)rfzN^z9`>eAgX8K+VAoeXy8QhvQk8D%WsrR3MB zN!W}I5s!{Bc^KKHRxcrq6eU@U%=D9ddqZuVTB*0@{Fu>u@D0v{bhG|t=!V()s}I-j z?O#eCtEj|cMHT^J3_!6ooq>Vso;9+2X5Qx!@76|BnS^UUH9eG$iS4V@($UtD(-GJF zF5A-xVSqburY=pnzfw)!67aoey1j4XG6>@0;8?5nu-)x-Ykqhs@B1+ObFo9fvd>yv zN@{BD*f*oK6Zmn(xajsC=)@QqVU8ay+sroi&gJb zJ(^`8kloz6Y*0iim|uY|!gg(m>m~!ms;+PDZDNLEuehd&8B^;7DJfx9WW5J!bkMFOlk-a*pmHPK;Z?uFpT zmERXOy&&+8j2N5s%B^AsEK4*G!wu4Rsi*h|5x41+fQQZF5wSvOes*x{pmyYBI&&jQ zdI%bW?PzJiI^DWTFqaj=hZ%*G9SJU-7;|)?MaGOjiceL#G;k~RmJO4B&0n>f3H5}2 zQ$blgnd6qDqmb_3=%1#~pHH`M-js{DK?B9KwQbgzvDBt7oo}AjapH|#s+OHe z-h|I`ts!?I*`(arTS1#fs519y;$-QG26!KaIfCmEys4{G&*uV>q2pUEUGuE&lYyNl z2PZg@$RqEBBz5m2Be{tW$6&Wf6X~7su}xws$eq`DilYW3=iGa2s=;n;JBZ_5aKjvI zUkcw*Dsgm{IG~VL!9NW+E|MAq`R(X+SxuL!J*B>)8Bs)2!mi_fe;E4~3 z0N){GcOPT7jHgduy1{UA-!hNg^Uohs06|{?t0#& z5JT;8*xB10Ji{Yp3Uowt4%#;mhQH7fn5h&06ZiZYt}V;-_Qr%XnZ-Rv`V&%2%ZsA1>o+=atbm@s?{mPd5$il z>?fwzEeO_DKv^M|QfEP~PPc|eoo2XZhvTOP-5`t)<{_LB)&ci+=e5%ZYG7RnYS}_Z z346%=g(ERP>nkfEzfu|eq%{QpA|{Vg(jwFYQa|P~*?~`jWZt^DzUf^_Pe}naFT|0+ z3|$J2U{~LH=1+6g0mfI;+t>39B-bf)R*2P$3;%;q`U8j-DY>3epP`pAC}{( zyY6_?Z0>Yj`N6*b3{Nb_$5tfN_{Db4F1;zXw8nJr2|tK2oTFp+?iy=h6 z8wL3gWVtFC7kTZ4xl3i#Y{YO^TiL?HzCb0Fw(FByt2*crGQ|D>MxE>A{NS5XaEJco ziek!Z71j)_S}~>WjRKIj=lLLnx>K)jJ`y1~b;FuyP{lGw&3W%9p=dWoU$5ZW2b)AM zKXDBmHOyTr(;B7$nuc2L<#;7Br5DmMZZ%Xtp{nA-n~k1$ZM~Yy>|cOo9OCPryacx< zxkS4(kDCPiOe#Db{Tn!&&B7`j`Lc)tvV0l+oAjU`$Y$$D?X$t=SgKZ1*2WCsVWVAW zDwnoas?(hqOiCD7ojLoxs$uV#sFU#{nCH?w_G^D#+*}9bgWm;wf?LWa{UB>Huo1tRK1<|0`^AJ4CLe9vcHj)!zm&eJr^<4OplW$#B~s`uXb(IpY1 zLeqoGE7*bRzIzPgT-3Hxf^jgf-Yv=2j3P`tkSl!v0H0qnt#1CD!?duvX|mO8i;iik z*vjO$9*u&xV0{35!9q#(jX7DRHWZaN z@XC_}JKQqnm%#6BzLv*3NdLEal}KhKi)v?0m+c%eYgj-YRyxBNKPKXM41FG0p`m#a z3li$_A(m|BVa}8qZDl4uwl*CMNMcPcb!LQ243tG&FfSWw0=ZnSk(ZcYdH#VK2w$7tKBGW?|Cdm6|`d#zK4wXb})q4|ncCA*|--@Mx=hWBiI`PI$wU zbt9GAub3ZWF2OA^vSc6lxfqq&yZ0;B*L(8M=8B*MvlHH@zi8W&Z33W(pG}C>iYEYuJFxs&JdU4q&&8Qb6;DBp5q<_ zwK7(!Mnf(ORs7-CQ*tT-7HQEa&k0&vzH2jey7a~=*m-e=xe4DadEQKu)1ty9;VH;{}z`|ZobHoEydxNUXG zF`lTPOwf5xWNdmv>$wcd46DBngYNiMN`yVj92Iv-bx|spa)#&Ao~<8~$7uW`R$1X( zM~E4kBIrv>h)6SF^aS4NoWiFpzF8T^=5vi)-Ry_tM|_E zlc?h7oF7pY%cdQ9GW)$;c3IykHgCYhm&SW^C0y>WCXD`67(Kk3KG!wB$|c!Al3lKs zpoNm38Hcl0GGpO`H6706Q?ut&`i@{97a{9?!6e0`+^u@=ku%c%u8p4#&eVn*QR3K+ zcZ<(X`qU>#{vL|oNw{gP{WJ@WE|Rs!)u!sf*mO<)_6I4-yM;hhIq9AqA&+zw{NQepPTZ zw+-bb@}w%)a?E(cBSKCu%AI90pLBILtiO8UGPl2?lw<}iMV8SmfZyHJ)$wO(vhi`z zK$(>DE;r_bceLHJk3R3tHkSt$YBMNqd3N)#0`*fl0;x!;p6kipGc3xyWhxF z%JtQuHF@VVQsG)MBtBQlmgejQ0!n_I>^&u6mm%fX-GmsV)#4YcQAZ21oKG$<2TtbU z&}l&!Qh(hgGsB9`K2?40m3%MLtn|ES0;a{^hg-r{l8IKyTZ(>Be02K9FIz2211$0Q+3p~REE=15)9lNVtGLK@-Qt$Q>@70Q4p!Dc(2Mfc_Vyn%p zt(jrvc|8wsxFOrK=Z%x@)&eXi-er69(>b`VA1Ho5;icGG-Xf)eZ0uaaFO;Sg`jHxE zXS>>kEjpx}ri!jLX;vSp=;_$nZ_mv~$2hp7U{h1-bkDB35zgzDt5=J+h=|cAkiy#$%vH z4XsH+qHanJo~$LI8F>_z)4?Oz-;ia}!oU4~#bh9Zi_s!ndFa!Ri-$FG?z#BGT`cy( z^Sj{nja5X%a_;VGz792G?x3LRq@XY=oywcBh3P*UHUE{!xHEG^o+zSZfDf@gt|aW) zVEOg!_)*i2uy(ReuG&)_-B7AD{-Nc9*k#-=ibwe>yDLqACSawAJ+$#ZKLgtyeczQh z6pG|{qtCnRU?#F<0*ZB??1J(<=zR3XF9+m3z0-m`8y5v+w%>nfNvz!qQ7wQx6V|+G z(c>vt|0zuo8_TPjyQKWqP-|%yo2d3>J!H0_0q6QKJSAExvkWhfW<&y`y-vPx@3oob(9A5H6%gR`E7DiNnLZf=Pq zXfc8qGNsh!i*A7A4Dm4*57`WZo1XQhNXA|(+j*-d$tS6F?^KC6!6o+JO4fi^rSchF zxb^QBZj(8pmQXJ1tbolWdC3!JOWNv_7Oj1tlHRwHRYmhmopPF{<&;ulM?l`Y;^^3n z8FPKn-_V~=b~Cc`FZPc!=yVZ^d|5!5^vWM;Duivti7qe14@D-U|Xwaj>5wp%QPd`8z69EW#-`NgP#aol&_gxT4m}Ua5GA= zeBY*bJVN;^u@koZj*PKjuiu|5#a^@y3hiRPGweFyjXdwTm-y%&PCpPA;9bOg6PG#q zw54y_y5zp9A7_uAm;c}z5KEw0jJ1!gAD|Z3mI(yLurM;k;-TF*wPynzOaQ2?hy{QP zvWX8lj9n3k&^Ga@Gh3HPUULwJ!)KaKotFdkt?Cji`FoBnc9#=Bx<$!Aw6eQXLf~FN@3c1pwEE619l z-zQZ-rFbGadYXiK1{&`jRDFl?8|XbJr0nsNzHVN%eZk%9xpi$kaMj~7ZgN%=7MizCARxER?>x?2-qEJq)XT!t0c{Q6cP;Iizv9C#5}s-C-f>~dgVOHPBRs#1GupuKSn zT*ZWSy0P-ols8B*GwXI?41SB#o#i`V5rpt#94aFsz?H+2lgYuw?f&GYGnrB z@;0aSCO54@CB!V7Z@T!D(i=gfO68Z~bhq--izt{Q;~>Uo#_+ zLR^zQx`B!}6U;gRY6*-=gfMn?H<$f`vd@x35ckDA3_ASyPr3~k)8ygqwTB7n`wykV zs$1W59kKk>nH%!^Q1o86si~PJ)P*>;IXWtaDZ`uFB=JUAWn)*}=h!OfrRF5HQYw%L zc`=0dNgzqWqJrE0;G@T*yW)TfOyi_K#6`R(h2Vfca`Z%A`p%ShKwAem`@aA-u{JM` z7#TIShi(ac@vF)sL@y5Fm##H zH|js#eo|e#PG-)y;lCs9RS^welK9MJGVb36`RL8i|NOD6AO$nogW~`LV($#L>M^F) z&DXyxD(WO&ZVz_PGW}=?d{DYiB{`#xd0;_4Jr1=Rpa6p<(1Ki5q$^y`!?R& zL{eoc`ZvDbtdK`+)O^ST(jcZWkUrJhw;4zPlmzdZCyrRTE8Z-XB>y+2LwM+Yb$to+ z2x8Q@^FpSe(&_kNAE!3rq$Ih{otH@CUST~^v@mAh$DU)}N$-W+bOtO*|IP+FxH{|a zn@_gm86liZDeu1@B*02GTCjfEhnQyu9QI&3lYbIFlyL-RRBUX_JUeEjb@0oyXnewp zVzH6$1&pr|eSjgu_1Cc5YqUMtFD}qL^=Exk=DA3z$58;u4V9)DDYjWm8{P-KR@n3C z;;YB6Hz%_zKm7#guR9kK4>z~Xm8UDJwzU~|I)I2tNsAt%yg|WYHXE868{6aDS^T8V@UEK| z(2Q)Glq1eo2CrG;{aPzA=&gI@ww+%Z?q$bSmnb^0v^qoSauk{BT%`KeRg(Jq0BWhX zmzZVlM z4ONh0_;rattBUqRr*77tT4h;RMo8ey4DS>V%iM!WnPR27^L+MOl9W>v-!{C&>oNN> z;qpWGg?uTvr_RhNojO9J}(nis8*{m*E9K)DPg>{p+yY{`HHF zCgH@YIBbFNTq-J^J6C`K5qGeF$Iw<(vY5BaKoYC@*JSS=(PL<4z!JemZ%r84M4IaF z%uXo4G-ssU`#VhH^L%s&sw3W95x?M*Xr^b{nwLSmgHENnZykZS4=Y#`;63XswGZgn zFHgo3khWTz&EOz~*2vy(U;55ikIJL=o*f$bZI|4q7y0DMm!Qligh7`R6Kd@ah%$G}dXl6@w>qwz zWK}Y1fGGYd_t*0mGzFj-LRlemO_BcE@q>#zS&f-i+jx@jXYJO-nkjTP!`093_f(tl zWu>i>Mx^2GoZy5Z3pw%chv6$G^_OL99DU6h70? z_JZe$QgkA#YX^%Ljdm5+*C(TZyL43gUefqWfrtX{aLbETN zZHxd^=IwFU;`GW)s-h=ucFm610<$1z85g_|e9A8>TNA;OSHla-ilt&-ox4UyXpD~gD)R*6#E^(l1Q@Ezq=V-NZ4;FOo zWP)7VslNo=c`N`i6~|vm8|NntAH5iL2-~DVHVU=nXNq~fnh{dZv;0u^bmtP!CZN?@ zvrn)#cuD!e#OE(w)YF3Vft- zY!*C#qh7PLH#FxYr`f{*^WtyqYnB_w%9QtnF;-5y8R*sH{FKTj5KCkd-jPu<3tzegf^Su_d|?P31M%89gw(pfL}o($X_3Y~5| zNjg?yZ2dDMpKsE)bU@Y~kydXA}qo<=hqR!f*2 zH(O<<7;`ix3X|8sUo(-w)R^ITz0~6F5nMR+SUi;PjdE~{qT)Qd=lUjk1CIn_ zjw0&8s5hZ&TdN;wy;r5j5IS4fujEj{MXI;&?o1iTOhs~UWejM#_6ytjEmk0~GFld2 z=94JdGhB8>LdWOzfn*60j2SFs_PJ->QNf1Wu}fy{+Si|Y~^&t zkHbQx0e_{pJ_SH|Y&pt25|*W9aSvlI&msf zEP1hukK(T!=b4pKU9YQm(rB7gthygA^CxCT00?#wew(Xa<|}CD-3|o1bi4!tJQ#Q3 zEkea>`#-FcnA}$Tv4DWkRA6Nk%Ssy*RLh4DoYdUz1yy%m{pLitK&}mOjRKeC#=PBw z{UA_&;6{&s=8*d)Ah}p!=74rinJd>SoAV#pZ688r4}pKy8$0Ri)=Z@eV-DAG?te)h zE{);j0Ib^1#rX130DdO8fBF(KsWn$oO_TUA48H?rz+!55@UuKo;tH^Ks!p%JE~4!F ze6`pd5M+KBSy*uBg%U$p@>y`5gC6*z~=N{7vT2gXOzJDiVcYXq%iN?P5 z#bvoBQ(%2}e|~6xlhgOW)*Ec7GXV5ds9dhlatc-HF|EA*9_sq~`g0xPt`m-m z7@DuXQR}6PnD>HaEES^nFL5JL)5olDS+%z)r8FO`y)Z^PUezift6tK-lx>Qa^ziV& zlH02JAY?M`QM)KSevAkjc007l!!b?}y{GHMNiGyG1ytV?8jue33AP!Cs3?Zf0@c&s zMLByditzGEX=rFH3JMS0Q2FC~JX(vLu&H;}CqN#|BI*3Rofez%mT%k6V`F2t_xIyT z%qxzNW~cVYHk~vl_49q=Wayd|-_QddD~CN-WF>p>+{A=Nc=;8|sJsP-)X@N`X~5mv zjVc^_%gZ!T762togd;GB<9tOY6W}!hKG&t5;+5WQ20p=&g6`O=e|HLteaLby_k1;$ zr}GkcL-e0iE&Q~d%ozbddX@SRP=`=dRFn!FbmJlet zqyHWU9Bez9(1tPGpY8duW_GN`|Ej#AVs)ck$sS4VWCX<7ckOQv?VNorc5sugi2C0_ zy-imr{Qee>U!Uwx-2&cwp!Ew7_V=--Q*2KrA?;ZtE--Z;b8`b-Mj|IFlC58fRI|!Q z9bmoqbHjIUNQ-MFya9vKi21k4)--rka>)i?ATf~J;%N%x*vGE^3-Bc`^X0By_1aLR zWbN{-9K+z#r)8W0mH)d4Q%7(CAubUJL_4n}E3I7)diC{*L$AO){2GztImma;n2;^# zdF=>g@O(YIbJ~Xlx7!_t554l5@kL!U)Eo^>Rz3vPP>Jy z!~^U)18?$7`{ztSEP=#7ufz{5a0io7c-DmG1E((;f;fL8Mr9?)GoLprjX*H!o@>8H`pOQFTauI&(0NTn!{@m-UAW` zNnrQ8qd;B`v#zc~*)t;llEo{fSy14bsxb5c+Tn&coJH~n!}OOa5bec7xaQGOdr>0f z*|XWW7-gL&&sTc7MNbQ;w4a2Ul#rnYYI}o2g zZ!0La=1sB%67tN!v#oDq_QKqHglf*uP!6k-2tgHv&{X8`P7&wq$n3>I!{$`w#!EeO zCY?f985@z7lwwn^!LU06o%v#=Z8VkR(v+ zDJGU@4Qyj1Co8O6S@A2nJ{723Y&SK^QAmkIbpCQjtW0;U9_92nLs>sW!cAPsbX3IF z(un@|xMKG{f}S)j51tPWRfR0%qH{jPGdz&U6Ifh3!=F0)r9xlGVJFJ|GX7PE@DOb6 z?B`KVtz?(r)A84~J;OJYv}Kz!3zZlDov)pjnWs9z=S>&-YR?T_f8vqr>0lNjb+wH` z7WP;QDVcR;@lG0`xF>sB&Ygjy6SI=ys7I6q&vm49evaHc^#Pvj!ISedOdes;a! zUx`lmuR+ZJ#zOQU@(42&EtH-Fvt2dcByQnWlsi3kqrkkk6W^<23Ft-DxJmTsNf{`8 zOwQOv*iXvV*NzP6JO=DHU8Ywr@)NL9ke@tAxE0j@_W*E6S^e;u)p9?ii^MrDujJff z&3}z@xc*kzq4)W)hPgQ#6g}>db8Ne9)%7W{oO!kbAqa1tcrtfqz{cZceq64po}O?$ z2F7+9!Y@A12OspmbE{qn1;+;-tn@3PpwEP9c;;br3lnwkdz#g65MYM`_D^xUHg_RN zy9IkK`EQB7Jq7WMCk{eFhBPa#8SlYT>UpSbOFht16KA!y{QHQ&ppT49|2{c3KA=#> zb3`8{4290_SQ|Ri<3vv0`}FZjWzOAL5Dn8!gbFD4E2w6vVosoZ8g!$GMlpHz2siTR z`u47!!`unhL;rFK1Qv*AOU+{HP!!NsKwb!ysC)kp(7zvPvP-BQk;#KASFyNJC9fZ~ z^Hg?XM%ioYil=Gy2e=Ol?uWJ3A%snpvD?PM2v+&(12?%CZh^OVuwJ?4A@p z#^#E@w?93&k74-FslbndUZ4PlzK8fJMFhja%`8CIUH#P)v-&N$fQKYv(UR9SCvN%z=*B7y1PM2v^r!(2r{Jojz&DtWY2gP+3J~WMV>2 zM~6sfqoG_NsTAV$`vDOUQ>WwZ;lakm1*8gMXK%ijy!t$I68(>cK@1$PalgU%wZA{; z>}}Sx0JIC630Eei$cIM44gkzS@Brg64-clIFG0#b#{{tid;|d?L^$|=n@R)Fqpal8 z|3ZzC7yk!?6bA(}B}JzMUY}e06Wn2ur0`)j-ai0^=@GY3#vG}1G*3`Pd;|ZxF`h1? zKVx;n37=v6lqq2Ae!Q-fqrS#g0nC}49IAL)FhZCf&_F=fZ=gdBD5xu+O{>&(efVAT zc0VaN8}Y4zorReAR&B<|qp>T0@)7Ib1sGaL>-{hhK2)YOtG{`6JRY2&@Ug=4+`u7fXlPhyj~lVs8k^)e!`k{}uF_iRqMO2~uY9ki%eCW`4a#}b6*Jq-b94H4 zu0BTS`i-5C)mZQpAc4PkcZ=V@@1~e4c1YPGIfPyN!`+z_0q-IJvI@-C;&W45S{_eP z{?gmrEJTZAtgMn_<~;EQR+q{nfB1=Y`tjwNxVP8ORccV7n z4Kc>Wv3d7S)m?vipvy^B+fRF>;pJ5@zqfV{`971j4*4+?ahv6^8j*=U=Q9iRtuom+ zZ5;ROsx8MNW0M_E%hxjrd}2-DS+JAu1aY@!jwzjL^X74|K!8e)Z5M;YyZmp@m>`3D zONrcBayW`_LZdrd{nBI&7Iwe$m*=p&B*VBTg~EYQ=}1 zl~hirs29wfY!9o`;9=kyWwJ2k!3J z+gmtW*aahx!FW7(YLTF+;rC3l91cZt>4AQiq_b^@`}PZm#iujY<#`doYlF*1eLMbfM)Ol9rFNgTGB7N3Ki9K>B{lMM4MJfKO; zjzQbZCO$Lz$VkdKJ&TztYWtE_$UM-D^@%3G_dfH1Ms;Pe3ruoGP|~NUc}+o(%ij@&FiR zKF`)DQuE*rxsP9axR`HC(RT6VsiIL+hXc?ZqAf&9b}xU_$p{EYyX$g|1 zxUO}24|{EXCG0S3aJCCJKn;Dc#GlY54|R*>2@<*m7;8OZgI{3-&2A;!W0C_r@w$}9s;C_Z?~J%79+GlL}d$l~UU&WFu?>t}6y9Sy-k zA_Rbbqqyy7X8!mc>|0%mt{E;4* zpcTr_@$p2>f?MBFZ6djXX`8jkKKUW9KO$<#SVs3}P6ADsM_J~sA|je|AG>X#&V6>X z{Q9XjX%3AOV2rH!Zvxt@oKzv-lbG$P%L@BDke{m_5?L?q027a`I!cjK64XiQ@yfcr zCFOREo&EWfxbl;&>1K0Oy#C7`A_P<(ehbNRo!$5bKN0P;g)*Prs)(V_RL*He1}uKR z0H}P+ZbfC`vne+_+;1(yS+Tu2c;GNfXB4x^NZLAN>yG@OgBbM+h``uf8iFSY<8?_f zlCFQXMQO>I12Ft)Vaq(Q5L7f<+@h5+9%r85PB*EH3FGi8oHASu6`{+IrEy()-L~I& z0;`6FNtcz$i4}>=_R9e7Vtk5(F8bf#M0#NP+pK6dUJ;y}M~R zvT!XFiSyQfC)+cwWW`+jd-LRKgXqaG@^g=>F%b(%f?Mj&AG4U5WCxBnl3 z@m?AKKLqB+@v1z_?2-61Ka`cH{3D}|$&XHn{oB$wN;i4K4A2hMX|2=3;P*cxADeHF z?2`{E$MAGuVbQag0IRZs8ta0ViAd&;~4u;$nM@16H3 zKtL>n331~qQO6gKMjjIlg1C5xI7lgF5uKnF+V^fg!4B0eX=*WXRWET(zGn!NmC^l| z6wRM5EG&p#Av6?n%Y0>DzIc&z+)!LS>4)Nmgfk7=y`kQYmAL~z$QOsu<|QBXymcc} z(?yP&(um2WHa1!sb$CTC|A3#@{_@0b4wa2v*4gjHj%)$v3-p?Yy>7jOCm9a`peC}|-#1Oo%6zed`P05qVot9&PmE546%}Q~L!&d*4(RnPkU7M5bWB33sT+ z0-p=n{e}0*9)o-8^Y<{mwD=28YkA)Pu`vBidi?qao7Uw>#{~=A28D!@Qfi{ANwXOO zero?7;BDXFn0A_R7c@}v{Ug7*6hpGxj47@1G|L<5=wHgGrfWof9erDeK9l;xUk`cj zc-{l@r9&5hzn6+47bpOdX>jK7N*{TQUrX)A%%YRNV`G8Tin@iq?<@$J=g`F`qk5Z- z7^Q@$t4$1}1Hj>qmf9}sq5Oa?Tjsu*dxHuY{_ySI6oiAl8UWsprsAIMM$v3K z$cS*-%Dvk#mN{(&+BG$MgUp6!r91I~l`Lj|#|VH`p6YaDxNCSASQyVZaeXo+J1Cm2 zJpd9j_N*@~kp8z{n_G*K;{=b0|_%}u4 zBk5y!5O$q3Uw|W&I>$DyWCF-;?fS+mzJHvKzaH!j{~Wk=+6>gIJdnsWHk~n@0cUqs zc2y#M3PJDeXN@&RdP1qVhs)~fa`FRypm!$=uvcL{qX&nFmpmmE)3+pjVC7kdZS$=iX1&b>3;un4+(@h|z_u$|>5Jm& zL;MG82Z(@_acpAQFVeqAsfL{aa|8j72>GVKRQE#leH=r62S+;v@z`F9xSM zamu|r=d?NXrPS2o{&FXS^Z(IQ>bX5!?K0}@iICF122u5RSr<{n{ujDer&x=vlE+pv z4jwsF4=_K?Q~jC*!QpVUP!xdOJ|CRIDZN{z!OLIok>O1X(AL@RM|s0+cEfC@9a3N?IjvQ*bLzt9^qcjrWF%uD&9qOF=hva%e=kW@tiw?ZP+sF%AWa!);$B$MF64z_dT=A?d^KA- z2?CPkfG#S)q|(u;4Rn8Vb$Cf@c_+rlc#;=6XD3SyBWo_|l3o%vSC*UhHZL^a{r7pT zVZUEpwE!X;Y8QY9#_kn@;vP>EcYQc(8MOcVHwAg#A?Apxad%{)?EP@hH$9+@jSYKJ zfCJWVJZf0qf?#2V1M%Hh9Od?tgK ziLDcBe{!azN^4kW;JgXi9eK8*7lNbG{ju&dO_x_yQMY+C#*&Gmv;5seIr0j{D)gQD zI)84zZOA|N)JH>5o65HCQe7SEQ=!lOA3OgJ8=%sow`@6dQ3T6BJl?p4lQNbIef}@K z2Or%yGFLP9f25#rZ8jn$e&Ey5Y-p$z|LDKA2-dv(xZ*&f2%9F;Lsja(Y%}j9EAn3_ zP-V785zI>!)~ov$5j>J42S(=a73BK_u~-sI0hO15j;y>+Qw$EpaD89Jju*hRJvsf+ zpwvfe@2Dy&5!}|0dVYRhyz*aL58%D1C#ID8hxQQsAKK%1zy8?&j=9N`akb%1m<{w2 zsQl|Ig)C74+lS4`=0vxaJ*%K_L<>D2+W)2xmc}ifm!vA-zZ|7lZ-|?f~=*y*Nm5sX!86HZZFDmeOI@3C@G>I$5`izd13$WD|_Md5F+_M zX!6q?noLzR@(os_6wVXQnnPpx<9z_$G@gR9l@{<4eG!vSw``rGJc(i9j!{z#|N6gH zEy`WvTL3xJCH#Su4=1+K%=RmEK!VP5plOw?<-L9@#R6+ zNhs}?X7gt`$W&Scz690gT!sp-pYqsfQpDN$X@4MJ`nT@}TP_o$x1%L0U5R-j|Cu|$ zl1Q3ctYv1q=q%VKvF%H<$>n72z4%TrncsR{W`8-420IvlZ}5@*rE!zmH{Cz!@&G^E zLsv;PR~z;H#mv`6j+#V<51i~?S&UM9e+QRlQ9i6EArAtMhfE^ zB^tjph(0Jv8075E`tjo{iMfvV@<;@w^C!t{{ouIN=$l()VSoX|0B{7?As}5l`6EnT zVIO1}938$_<Fy>F5gDxnopf^13 z1T%v9=KAm0ywCq0k55eJF7}cuOCwZb`D-tw|9e<+JH6OUO_PvRD^vAT{3ev~O`a2W z*P{X9ThRnbWtjiL(cv2Jt{S&&E6i_^fA`5?KNMUE2(hG!Dfr;zQu&4 z`22PMBOgCMkwynn=B>$+z$*V;KKJSl5)BQ!GRf<=l1gE*@yslIm+-P!$kf;Mj*nYV>5*SNTXk9Y-6=xsM6ny-Z{88g&Ox7mC8 ziNW~`FaV<%2D#{^Z-Co5Ht8YZhl@Nb`wOp8J~_`;e@4_Aw>>XYQ`y06U)D@7IOw=| zVEORrO*7v(XV^>?Uku&JH^bJn_x-(F0j>GNrKT?plz=hi1FkbN=;>-vPwTAtQdU9+ zP)1J6(C{VXr4tu=c=%xUuddplxdYqJ97in27l35f@7apEp?~=YDYXkxkj+1qKhgh< zQxGrjA1(>=M-Gre7_Mn=Hie6>hF&vYwS84>;-~_@M47o*_J7*UFH_AC`0=wr3R&6K z3)B0slSy$<%98t-FRAJLX(|-FrMIwU7^Kh}h&KJ|(QRX~uj?;;uX4RK+XvAkkMj+9av)tk!UYCv+=Re<_MMsbXCrFDagtNa>yVAwA)g!J z?OU&!AtLK3-P);J%M_N&B4V?71R@$-d+XTWdcXCqH0Zt^UuQ$6>&QOa sC*!skFre7OpH1$yFMztjI!K^%=l!?y&+z=IK){cZoVskajMV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DJ?NGJ}WUfJGCS}zaTYFiHkEOv#1y-W5~ssR+N~V3SnbWPl8gg z(ecHl2rVWAwcu8*tl;YB0`@Ebd-+J8>&auA0005#NklJ($7gU#&KjobNzq-a}=H?-9^EF9(!s8nC1XmE9pAQ_F!YhYA+Y zYlQ%lpK3@9HPwzX2E@#;X9TV44Dy7Ss!DM^k`Cv81G= zq(7?jG_hKV<^vq3#rnKZbne9R0glUV^O4mxc>wc3p+otAap&Bs1c3`Quz(pLkPi@` zwt$iXdN7X%^L0L$CjJ?~?@xKaKo`gdF#zTP18pE5;A=StNDt^{Kqwyw9O!ERj!v>5 zrWWY-HXlR*&e%0zGoATo06LxDI(G~LGO@jbg8rAqcpSq3sr4G5wWI)D=#&qVl9K+7 zBKaV$NIr-c5Y7h|0K)m;5iddbPpbaa3xLxeq5 zl-1SSfMp9FJAN}vj5bk^K0Z=!5EC$pnkYntF-weFTU~K+bSOlFFiMLdKY=Gfge^*m z0000cLxmkWeO*o^N zR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainG zjE%TBGg33tGfE(w;*!LYR3K9+EwQpVF(FEcH_C|8M#GbOXA7${-L#hF%=n41b= z<4_Ky5jspzbSNvh`niBz1OPAnEv$XoT~+`90&z)1K~z|U?U(CL<1i3~6B~SM?Ens! zU0@-!ki>%bf4v>M$SZAUoGMw+{>W5nReeWua+ySPs%ovZ*81M6(>I&V8IPZuOo}6#|9uE3^FGgz)g<*N!}0QP(x1~fiYlU4D~XK z+?4ph`N&4j2SU*g0qg_iKgp|}LHm(0O2CG|7z>pDB%iE)faznra0X>QS#S-`d@v=8Nh~LHdwO$SDzbxvDWqf-`8)fmoUEdhVIk=0000gD?;V;M~;#Ok5xd4p0@}#dd&F z7bx9-h*nx^k{XW?D5bp*4E!SJJ%o4)@h`xbyaLsDD6<-K8fk4j(*>qhb!R7ETD89>6fk{@eWRBw5C!PS(<@|m5>vD6wQ62=342dF>sltM zdBHN8Nnr0xJTu1FM=9?BgWx!#=L4u4H&&y6AeJbI6H?WK8;j91CH z`9SNi0AhH@FaLA%0b`6Y7TBH-XrRH3Wy%lJqk+NCMPduYd_YT`4;W*Nv2{1B$q;sM SbN3Xa9%=5JS%HiKVwZcU{EV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5DZR8fJHITxG%qtPzbIFUi!&v&s2C_=$i)q00HMoL_t(oh3%K^ZmTd1hG_`3!67>| zrJ!y1f1R`GPK8z{+0vty~_*}u(f@lSKKQjYKKp8;V_q+yafNaJTAmcN^$9>)j(%s|^H44c1S5NtWX z2E-7}FW(vawiwW4kM|Fr|C{D@UD9Xc%d)Jm<@x^ufQP36T*9{o%(>HjHlXV3dIP8C VBx+hDWeflS002ovPDHLkV1lP)PJRFY literal 0 HcmV?d00001 diff --git a/icons/obj/custom_items/karlan_beret.dmi b/icons/obj/custom_items/karlan_beret.dmi new file mode 100644 index 0000000000000000000000000000000000000000..88b9239156b2adbc8251212be597a2cce39c2214 GIT binary patch literal 448 zcmV;x0YCnUP)3RRI60RlvZ&>XZlV00001bW%=J06^y0W&i*H zhk8_4bVOxyV{&P5bZKvH004NLQ&w*wM2=FGbOXA7$|JW#hF%=n41b^ zXXKX@7vzJqn(CPA7-H8QpOK0%zy!qrWd&D17qIgHNO&+p;_D6{0002DNklka%KzcNff>A&{z-(+lng(OzViZ2X`asy&7@5oHBuF5^GoooA qT-p678VW; z4jLL70|NsuFE1h@A|N0jCMG5;D=Qx#9~Bi9US3`h5D*Ow4Gatn0RaIE3kx(fG#D5d z2L}f?H#ajgGdnvwOiWBaKR-M?JSQh7Jv}{2N=iOHK2lOrKtMnS1_m`XHAzWHLPA0~ zI5-|29z#PzEiElYMMX1qB@)9TXH4O-)TiL_{bkC{|WhBqSs`IXOl~ zMiLSdL?j%u00001bW%=J06^y0W&i*HetJ|`bVOxyV{&P5bZKvH004NLQ&wiSoq$Iy6 zGe17DC^soFFGY!qGbOXA7${}P#hF%=n41b=?!~dmoHY} zCN($!00EpyL_t(oh3%JXPlGTNhF93Jl(DM=VVsF$8z>u7HbI?t=iLAQM^@uv;*x42 zjeh9!fe$Cm`_LSEp;A%&I|xT=yr%0_keI&*092NM7|eusfgA&=F^kl>pejc|YK>;A z-Qj|L=t?ly&OzJtdOiRG@MqZyQnUJ1%KDSGC2f&wvY=Xeq6EQ!O*xkykM?owi| zzQ&uJ<_YG^(@On_;CA9%#!JMiF;5db4s0Oht^>Zq8Rt10-+3n~q6wrZdnH5H53;-a z;^7f7hOATme#hIKS+o3UwMv5{Qf>#fh9Yz?R*TexR$a<|4bSVv!;94fZy@Kuf%d^> z6WlJ>maJ2sx1noTzPwun@EeP?w^t|>3Wego;W&=ee62^N3xq#2zs4CB`%(o8g+ihD a16~2jRUxNU-wSmB0000V=-0C=1w$2$suFc1a6I(v$T_TsNiBN0iVR}jT$7C(U`D0q4cyO|VC+vx$S z*K`{n*jpi^SdQZ`K%z8F?W9de-{LRlC-3=x`~R3sr&DwZ+9|t9fa|)w zwgr%`Q^3k5UDxf6$Kwb9JkLv-AR3KEq_Th_`NQ1}27>_zwLqwq`6(%&lmt7w1OO01 zkR-|0yhRyaKfd+~+q(yvA~&J+QxI&vwa<+b-#_O7<_D2K-QR+c($r^YH3EbXP(vEb zNdhn&4k4ukW4rG8`P5!4761TB87S4Sv628OCHnn-6<7GapV^dBC?$^zZ z0HFFZaC`)cc9C4hO8d=LH=&FbmMh+!faQuK Date: Mon, 27 Feb 2017 19:15:31 -0300 Subject: [PATCH 02/55] Antag contest week event (#1834) * Update carp_migration.dm * Add files via upload * Update sol_items.dm * Update sol_items.dm * Update captain.dm * Update civilian.dm * Update sol_items.dm * Update baystation12.dme * Add files via upload * Update carp_migration.dm * Add files via upload * Add files via upload * Add files via upload * Update sol_items.dm * Update civilian.dm --- baystation12.dme | 1 + code/game/jobs/job/captain.dm | 15 +- code/game/jobs/job/civilian.dm | 17 +- code/modules/antag_contest/contest_helpers.dm | 11 + code/modules/antag_contest/sol_items.dm | 291 ++++++++++++++++++ icons/obj/sol_uniform.dmi | Bin 0 -> 22388 bytes maps/exodus-1.dmm | 2 +- 7 files changed, 324 insertions(+), 13 deletions(-) create mode 100644 code/modules/antag_contest/sol_items.dm create mode 100644 icons/obj/sol_uniform.dmi diff --git a/baystation12.dme b/baystation12.dme index 0775de87e57..88cc8eac53e 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -990,6 +990,7 @@ #include "code\modules\antag_contest\contest_helpers.dm" #include "code\modules\antag_contest\contest_objective.dm" #include "code\modules\antag_contest\contest_verbs.dm" +#include "code\modules\antag_contest\sol_items.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" #include "code\modules\assembly\helpers.dm" diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 82858a19d42..9c7ed17b2a6 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -1,7 +1,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) /datum/job/captain - title = "Captain" + title = "Sol Officer" flag = CAPTAIN department = "Command" head_position = 1 @@ -9,7 +9,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "company officials and Corporate Regulations" + supervisors = "the Sol Alliance and Admiral Michael Frost" selection_color = "#ccccff" idtype = /obj/item/weapon/card/id/gold req_admin_notify = 1 @@ -29,20 +29,19 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel/cap(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/dress/officer(H), slot_w_uniform) if(H.age>49) - // Since we can have something other than the default uniform at this + // Since we can have something other than the default uniform at this // point, check if we can actually attach the medal var/obj/item/clothing/uniform = H.w_uniform var/obj/item/clothing/accessory/medal/gold/captain/medal = new() - if(uniform && uniform.can_attach_accessory(medal)) uniform.attach_accessory(null, medal) else qdel(medal) H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/head/dress/officer(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand) @@ -50,7 +49,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) - H.implant_loyalty(H) + H.implant_loyalty_sol(H) return 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 472c6bf856e..b5e3df4625f 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -263,18 +263,19 @@ //var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds. /datum/job/lawyer - title = "Internal Affairs Agent" + title = "Alliance Representative" flag = LAWYER department = "Civilian" department_flag = CIVILIAN faction = "Station" total_positions = 2 spawn_positions = 2 - supervisors = "company officials and Corporate Regulations" + supervisors = "the Sol Alliance and Admiral Michael Frost" selection_color = "#dddddd" economic_modifier = 7 access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads) minimal_access = list(access_lawyer, access_sec_doors, access_heads) + alt_titles = list("NanoTrasen Internal Affairs Agent") equip(var/mob/living/carbon/human/H) @@ -291,8 +292,16 @@ H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses) H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) - - H.implant_loyalty(H) + + if (H.mind.role_alt_title) + switch(H.mind.role_alt_title) + if("Alliance Representative") + H.equip_to_slot_or_del(new /obj/item/weapon/melee/telebaton(H), slot_in_backpack) //remove those when the event is over + H.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/colt(H), slot_in_backpack) //remove those when the event is over + H.implant_loyalty_sol(H) + if("NanoTrasen Internal Affairs Agent") + H.implant_loyalty(H) + return 1 diff --git a/code/modules/antag_contest/contest_helpers.dm b/code/modules/antag_contest/contest_helpers.dm index 53235d77b50..3bef7a99c5d 100644 --- a/code/modules/antag_contest/contest_helpers.dm +++ b/code/modules/antag_contest/contest_helpers.dm @@ -42,3 +42,14 @@ antag_contest_side = ANTI_SYNTH else antag_contest_side = 0 + + +/mob/living/carbon/human/proc/implant_loyalty_sol(mob/living/carbon/human/M, override = FALSE) // Won't override by default. + + var/obj/item/weapon/implant/loyalty/sol/L = new/obj/item/weapon/implant/loyalty/sol(M) + L.imp_in = M + L.implanted = 1 + var/obj/item/organ/external/affected = M.organs_by_name["head"] + affected.implants += L + L.part = affected + L.implanted(src) \ No newline at end of file diff --git a/code/modules/antag_contest/sol_items.dm b/code/modules/antag_contest/sol_items.dm new file mode 100644 index 00000000000..304ff05aae8 --- /dev/null +++ b/code/modules/antag_contest/sol_items.dm @@ -0,0 +1,291 @@ +/* + * Sol Alliance military related items + */ + + +/obj/item/weapon/implant/loyalty/sol + name = "loyalty implant" + desc = "Makes you loyal to the Sol Alliance, or to a certain individual." + +/obj/item/weapon/implant/loyalty/sol/implanted(mob/M) + if(!istype(M, /mob/living/carbon/human)) return 0 + var/mob/living/carbon/human/H = M + var/datum/antagonist/antag_data = get_antag_data(H.mind.special_role) + if(antag_data && (antag_data.flags & ANTAG_IMPLANT_IMMUNE)) + H.visible_message("[H] seems to resist the implant!", "You feel the tendrils of the Sol Alliance try to invade your mind!") + return 0 + else + clear_antag_roles(H.mind, 1) + H << "You feel a surge of loyalty towards Admiral Michael Frost." + return 1 + + +//sol uniforms + +/obj/item/clothing/under/rank/fatigues //regular sol navy combat fatigues + name = "sol navy fatigues" + desc = "Military looking uniform issued to Sol Alliance navy, to be used while in the field." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "sol_uniform" + item_state = "sol_uniform" + contained_sprite = 1 + armor = list(melee = 10, bullet = 10, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/under/rank/fatigues/marine //regular sol navy marine fatigues + name = "sol marine fatigues" + desc = "Military looking uniform issued to Sol Alliance marines, to be used while in the field." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "marine_fatigue" + item_state = "marine_fatigue" + contained_sprite = 1 + +/obj/item/clothing/under/rank/service //navy personnel service unniform + name = "sol navy service uniform" + desc = "Military looking service uniform issued to Sol Alliance navy members." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "whiteservice" + item_state = "whiteservice" + contained_sprite = 1 + +/obj/item/clothing/under/rank/service/marine //sol marine service unniform + name = "sol marine service uniform" + desc = "Military looking service uniform issued to Sol Alliance marines." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "tanutility" + item_state = "tanutility" + contained_sprite = 1 + +/obj/item/clothing/under/rank/dress //navy personnel dress unniform + name = "sol navy dress uniform" + desc = "A fancy military looking dress uniform issued to Sol Alliance navy members." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "sailor" + item_state = "sailor" + contained_sprite = 1 + +/obj/item/clothing/under/rank/dress/marine //sol marine dress unniform + name = "sol marine dress uniform" + desc = "A fancy military looking dress uniform issued to Sol Alliance marine." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "mahreendress" + item_state = "mahreendress" + contained_sprite = 1 + +/obj/item/clothing/under/rank/dress/officer //sol marine officer dress unniform + name = "sol navy officer dress uniform" + desc = "A fancy military looking dress uniform issued to Sol Alliance navy officers." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "dress" + item_state = "dress" + contained_sprite = 1 + +/obj/item/clothing/under/rank/dress/admiral //admiral uniform + name = "sol navy admiral uniform" + desc = "A fancy military dress uniform issued to a higher member of the Sol Alliance navy." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "admiral_uniform" + item_state = "admiral_uniform" + contained_sprite = 1 + +//hats + +/obj/item/clothing/head/navy + name = "sol navy utility cover" + desc = "An eight pointed cover issued to Sol Alliance navy members as part of their field uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "greyutility" + item_state = "greyutility" + contained_sprite = 1 + armor = list(melee = 10, bullet = 10, laser = 10,energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/head/navy/marine + name = "sol marine utility cover" + desc = "An eight pointed cover issued to Sol Alliance marines as part of their field uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "greenutility" + item_state = "greenutility" + contained_sprite = 1 + +/obj/item/clothing/head/navy/garrison + name = "sol marine garrison cap" + desc = "A green garrison cap issued to Sol Alliance marines." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "greengarrisoncap" + item_state = "greengarrisoncap" + contained_sprite = 1 + +/obj/item/clothing/head/dress + name = "sol navy dress cap" + desc = "A white cap issued as part of the Sol Alliance navy dress uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "whitepeakcap" + item_state = "whitepeakcap" + contained_sprite = 1 + +/obj/item/clothing/head/dress/marine + name = "sol marine dress cap" + desc = "A green cap issued as part of the Sol Alliance marine dress uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "whitewheelcap" + item_state = "whitewheelcap" + contained_sprite = 1 + +/obj/item/clothing/head/dress/officer + name = "sol navy officer dress cap" + desc = "A white cap issued as part of the Sol Alliance navy officers dress uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "whitepeakcap" + item_state = "whitepeakcap" + contained_sprite = 1 + +/obj/item/clothing/head/dress/admiral + name = "sol navy admiral dress cap" + desc = "A fancy looking cap issued to a higher member of the Sol Alliance navy." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "admiral_cap" + item_state = "admiral_cap" + contained_sprite = 1 + +//ceremonial swords + +/obj/item/weapon/melee/ceremonial_sword + name = "sol officer ceremonial sword" + desc = "A ceremonial sword issued to Sol navy officers as part of their dress uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "officersword" + item_state = "officersword" + contained_sprite = 1 + flags = CONDUCT + slot_flags = SLOT_BELT + force = 15 + throwforce = 5 + w_class = 4 + sharp = 1 + edge = 1 + can_embed = 0 + origin_tech = list(TECH_COMBAT = 4) + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + hitsound = 'sound/weapons/bladeslice.ogg' + +/obj/item/weapon/melee/ceremonial_sword/marine + name = "sol marine ceremonial sword" + desc = "A ceremonial sword issued to Sol marine officers as part of their dress uniform." + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "marineofficersword" + item_state = "marineofficersword" + contained_sprite = 1 + +//closet uniform + +/obj/structure/closet/sol + name = "sol navy uniform closet" + desc = "It's a storage unit for Sol Alliance navy uniforms." + icon_state = "syndicate1" + icon_closed = "syndicate1" + icon_opened = "syndicate1open" + +/obj/structure/closet/sol/navy/New() + ..() + new /obj/item/clothing/under/rank/fatigues(src) + new /obj/item/clothing/under/rank/fatigues(src) + new /obj/item/clothing/under/rank/fatigues(src) + new /obj/item/clothing/under/rank/service(src) + new /obj/item/clothing/under/rank/service(src) + new /obj/item/clothing/under/rank/service(src) + new /obj/item/clothing/head/navy(src) + new /obj/item/clothing/head/navy(src) + new /obj/item/clothing/head/navy(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/jackboots(src) + +/obj/structure/closet/sol/marine + name = "sol marines uniform closet" + desc = "It's a storage unit for Sol Alliance marine uniforms." + +/obj/structure/closet/sol/marine/New() + ..() + new /obj/item/clothing/under/rank/fatigues/marine(src) + new /obj/item/clothing/under/rank/fatigues/marine(src) + new /obj/item/clothing/under/rank/fatigues/marine(src) + new /obj/item/clothing/under/rank/service/marine(src) + new /obj/item/clothing/under/rank/service/marine(src) + new /obj/item/clothing/under/rank/service/marine(src) + new /obj/item/clothing/head/navy/marine(src) + new /obj/item/clothing/head/navy/marine(src) + new /obj/item/clothing/head/navy/garrison(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/shoes/jackboots(src) + +/obj/structure/closet/sol/navy_dress + name = "sol navy dress uniform closet" + desc = "It's a storage unit for Sol Alliance navy dress uniforms." + +/obj/structure/closet/sol/marine/New() + ..() + new /obj/item/clothing/under/rank/dress(src) + new /obj/item/clothing/under/rank/dress(src) + new /obj/item/clothing/under/rank/dress(src) + new /obj/item/clothing/head/dress(src) + new /obj/item/clothing/head/dress(src) + new /obj/item/clothing/head/dress(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/gloves/white(src) + new /obj/item/clothing/gloves/white(src) + new /obj/item/clothing/gloves/white(src) + +/obj/structure/closet/sol/marine_dress + name = "sol marine dress uniform closet" + desc = "It's a storage unit for Sol Alliance marine dress uniforms." + +/obj/structure/closet/sol/marine/New() + ..() + new /obj/item/clothing/under/rank/dress/marine(src) + new /obj/item/clothing/under/rank/dress/marine(src) + new /obj/item/clothing/under/rank/dress/marine(src) + new /obj/item/clothing/head/dress/marine(src) + new /obj/item/clothing/head/dress/marine(src) + new /obj/item/clothing/head/dress/marine(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/clothing/gloves/white(src) + new /obj/item/clothing/gloves/white(src) + new /obj/item/clothing/gloves/white(src) + +/obj/structure/closet/secure_closet/soll_officer + name = "soll alliance officer locker" + req_access = list(access_captain) + icon_state = "capsecure1" + icon_closed = "capsecure" + icon_locked = "capsecure1" + icon_opened = "capsecureopen" + icon_broken = "capsecurebroken" + icon_off = "capsecureoff" + +/obj/structure/closet/secure_closet/soll_officer/New() + ..() + if(prob(50)) + new /obj/item/weapon/storage/backpack/captain(src) + else + new /obj/item/weapon/storage/backpack/satchel_cap(src) + new /obj/item/clothing/under/rank/dress/officer(src) + new /obj/item/clothing/head/dress/officer(src) + new /obj/item/clothing/suit/storage/vest(src) + new /obj/item/weapon/cartridge/captain(src) + new /obj/item/clothing/head/helmet(src) + new /obj/item/clothing/shoes/laceup(src) + new /obj/item/device/radio/headset/heads/captain(src) + new /obj/item/clothing/gloves/white(src) + new /obj/item/weapon/gun/energy/pistol(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/melee/telebaton(src) + new /obj/item/weapon/melee/ceremonial_sword(src) + new /obj/item/clothing/under/rank/fatigues(src) + new /obj/item/clothing/under/rank/service(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/accessory/holster/armpit(src) + return diff --git a/icons/obj/sol_uniform.dmi b/icons/obj/sol_uniform.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0ea97c488b29960269e9f1934ea3c9201a145d04 GIT binary patch literal 22388 zcmb5W1yohh*Dp#*NU12D(jeV=K#&gU?(Pn01Zn9`0qO28LAq1AySw2o{`YIe)QE@K+g8)YrJLp`f5p#l?i>p`f63U;ZP)gCjrmvZcU|vYVo+ zqp*>KfxVfnqnV906qIXfPV9iSALE-ZGbbOEE6eVBx7;I9Wy zEVFm=bf*PuP1 zE-SWQB(2BzsPpEKaEjv~UBQ}~CLZ9)5o$(4+eQ~CPjlKi>%J(nwZJW*IwzJ99Jk`x>?5+FcH!cmth?#(@VYC}JpaVL?UL)Pojx z4+W?6=Vz2r_n2C(o+fL3@QAq)%cOaTd;P#Q$?m#i zr!<@M$VN1eG=;#I2d1nH?G~Uc%Xa*h;MQ~qNozTLHzE|s0(%x z-~I7<1>;LBh6sy^2=|?sfm z>6qEugS|r+Njf?@sZ`FWYwOu!(}lAoTxvc(0v}Wdubkjo0pd6LKdpaL>T~AhNr2z- zPg!rnrzmo3C?(EH++v#1`wzkbe@{pK;F~O2)_m*l-@Zta$MkjiBViySA!X*}iO$yQ z|9uVReDKeA%6xOBaWOghgcRW@>S5liW#^|&*y)I;UEi+}?~P1Pm8Wf4iCAmzbLB7* zjIu#bk=y2LqHmuoXNxTx?zK#(DQ<6QPXBZUk9RU?-lRT7)NE}9VvwJZ`MSf;J>lzm z)?A2KwwDp5kn^47|4hi>7>~aq^@=<{=Dpjpf-*EV*5^Fsz1odU9Igy>`ycH=p7x zyOz2wB$`L9FYmC%`-8m4FOpf^r$6z#9$VR)hoAmyjCh~69TG22jx%FBLFe*STdt$3 z&%4MC%I#cTiq^+O;&vs;jj@7~@cv2-*b~GV-;7kL zR-~b#YPV#^c>7k+%8G7wc2-zeShsFI&bewI>Of7<-a@OD{zAf8Tl^*fGmPk_9# z5`uu562VwS<|j=?KcfN66L3L6>7$bFQK;nai&wk94ZEPQq*Pj^`+`V31@9tfD{wEY z9%1R8Zyn;Nl`0`5aX4-LQI*<*3C6rUvU3@c{o{=i>QCp};3_}NGpOdvt^Mkuvdt0> zoxDXiOdsccwG8KyfBa^3WaRAQSob*L!DY9W4pJUJTmOwjzQdaZXDA*S@J4E1lY*Em zM{tFXxTPpj>x|EK8&ffi`VY;|dVSr0TR3b-B_=})7z$%Yz153Vnxejjey6}v z&+f7mN&cGcA0%7&uC0qt{_h_J`I)qBa-UM35y=n8vf|GP^`dj&EQZ#shmllpI;4(A zvw)Pz#&1A;4pQ-l zs+FzP=&TkCDUEWr?Tn2nQkKw3%!Y8Ir;ABgSTKB+UHFEkOWdX~7}cJywPb1Ue*E}h zXkwzEs+!->I@tYlos;=U8O)~WM8TV-8}#}+Uxb^Edy;0xH`}Jm4#Ix6Jl4yF8VyD@ zh83!=@d%7gN#zu(tB%ylMRCjLtQ0YEbQi00iThQlN1|eRBE({q7=*u z)9TJY2E{3ad{tKo_4ul=++2$2n3&mGD?Ep%Hm>opN7371msTNp`FDMNeX-b*ztsYB z^XH!74LHLo5|hRd_|!K-`SIg-^4nX#^gMPa z71^jG^*K}lM@LpDHKhG|w_igkP1B{DH%DUBk2lmxPY5rM!pOvA!kFgw?qplcLABkl z%II^sbkdbSe?EhExo@!97A}>*$Y?WuDjJu6rG%mF`D^c?`M&%4b~pZ@@lMhu=e~=2 zL+hoHglvL6e@R3Uk*mOI+Zf{-is}<1nDe}+Ei)+!3@D12;Frx}<)V@E$&HfD=jt{}&)>hv$izR= z(fthhk*7EUB|otcOJD{|%&gc0m%V*1%h-*Y$N-LzvJI8gvO;d2oEHmgSsZIM)Rq?e zwnoLY_f8h9(S8~_h`|jsaqsSM4oKHxdYwET7J5B1JP$kcdY^5GYtm!s(V7<&7C`?h z%oV|L=lpi|d*pm7tGEVHOY(INIk|*}YRIunYhz)^c=S6*I_lUO%z|7i_7tWhscdc- z_9UtPw*|Ppca=RTfpx8zi9^QZ^YKGhB^v0=^el#h$=T@$mdr^vf1kA(HH)VD8J@1q zhWM)oH3ptVRWvmRQ@I>WZEUtX(IH)y?B{z$WiX?Ylfo`8b;hu^_Cqe~L`y4+B{ta{ z*ifT*D9ufmR_sr!s2SU4g3{8cY;0_ww3`zj@2@d%aQdDe@70=JD=MXF&1o&6@EE)OcD3{iho@|>X=f1Q~+pt~Xu(pV^A)jadyvCP0$z!N=Uq3>2n@3 zu3|>S!oevBK4LI=7Q7Xt1Jy-CWjWKZMUDw+q45qaL+$O-h)U?)of{efw?CQq#r1WS z>Db4+yF1lt)3=Y0k7ChXnL>g2Wo0TF$+E|b1s>_KVc2KZiN%I3QJLH?8z{rK5FI75 zkz;WVTaD%t4wzBKh8J~TyFBaU$nNi>SYvt;0u>&T$BrehIMQrcf(KfX{=cm+~K|b-Z_TU z{-BXdvU_L8jj!^+l~y$TY3kdE?T%F{0t>>7&lKx&q#r^s#5K|gs?L2b00L7>W56h5`E2RO;ZKXcd)9(wCY^0&C;S)c9?ko$zUe*GxKkmxO{lRt7^ z9r`&dClBE>p9sV5ov)pkebeu>i>bB-8MoWN+oBiE>yQVj^M(~6qjqzag+6$1qD$7c zZL^g>Z%?YG5n>M`P@0e4{=D!8&EG;RKh{a&T6|BaTHCpoQIm&!Z)ZXQ0zgnbqS!|tGu=!4NctjK~^eWP9k7D%pAUPzZjZ_iGha2za7(YbkJ#3hPhcMdPZzV zAcE`maBy%?tI&TnH8rKEtSqmsJ#1CC*v)g?+_@eBk+HU>|NHlE@-7e00w>RcW0PB4 z2m3c;|05qWDy_}GY+2r~-5Tj6>!mEp-LwwzIC%?APuL9L$Gf5UsH^J#2n$zc*6 z1+L5Tk*nUi?x-Uh68H454S}T+X|h`vfl7B>L)!eN-c5pD8>ciC#m1u5@M>8hy5=Jp zng6u%i1%EB!*=Ywy>TwvnQlr;36_vYqP;~BdUi#wf`Jpke43UR_o%q*qD1our!>Oq zLsDX-n2Sq-ezWh^%~7vU%1OFELOE{fmg}EWLD6>m`=7Y`#{~%Qc)fFSazKi6cpd9Z zcbNf6>xmyBiq=*;$wFJvk$p;0R8Q`?ZoTI7QW+mCy=?l&)SrBwh{CCQqq%D-vvQej zAS5m$-l_x8Lc`}^I$?`!&f+FswJ6i?^!yw}0! zd+nN=I@L8J1~w)1^z;O(AElKOtyjjz4H>#0ZZ+$lNJkr6WfH(I+Njbp@O;#{gbLXu z=S`>oA}X3av!4Wk*uwhS^DaFyVV0iE#;9P{Re#uXKAg*0xNcpnu}IjOEfXOAiWLRz zJ*2A2WD?njHbwCUvGp$K1yzS3-oo&r1s;o)J=~Pv&1B;KJ}x^X@SDC<-wFQD`JjZ_ zcF1}`)e(WI#^{7lNBfyBgOxAdd8wu+j@tP@%*3CUmGMIFs)zxgCl(8O=MRuI9Fku9 z3%n=uhen2j5sZ8T|LF}PoZx5d^8ddlzYh7>cyY?je|QV{fR)zlo~Zwi=3K2j#pP#Pvo@wc)VDtHdepc!Y1$L#=TN!o!b8}kRU688T!hv z!)MX@dKME43!&X+yY1I)&A0QAc!?*^H&WK$Y<@ak9jFaq343m|^YzO-&4ezEY85_8 zOkB?(`%jA@D)Qc&#ELmLrCnS&8WSXEnJRtaB?rk!j}g1KYwBm5wyD~W+>FPAy0qw7%iMy3;EfH#TC4f) zvx!hA9!hT-&uyM%xj8yaWQ^qqWxki`iUVC4G-Hy~!E&3imJHcbDpWt!Ytk#1 zYKohgQJ0jIkdcuAz;D-}36MWjWMX2zIfcje@G-4>{ryo>1f51L)acSu_^jntyDuz2 z1u(YfLmaT>)%>zCX+E=-#(R?mlhe~^vqauc!y3s?h@jcaV^z$+djFn^sh|ZmdWeIG z%`f?^Gi27O$t^ex5tcVMk;$E(4wbDirQFhOKxGL=KvD=5&7G$v-WW{gDBhZw)DV>J zcK9_b%SZ3?Memb0E4v6Lfq0|*$Z=JRJO94s9G{%dQ|5mSnNiJ`+q|EHq+O-h zRsbx5is^%MjsH=rUUD($hVKL6*b3XE3nT|!8<;QZPoF^h{{IjpswK(?&Q0Ui041ah zRaaM^tc+z8%Ez>Rn@=0}yk0~Ald?6XqC-wYBQbmA?EZ9W(|T(h5*m7Y(uw}^Ys$+S+MKks8;R@GDN*4e2l%Oqcaq`V1xp zD&ll&n~uz&*5pfX*Ca}%aqfMwwr9f~s3E$y{Ti+SiiL=DAKZrQ4pg)NFcDwY{No3* zaegiYA2iUQ&a1VaVU`Z1^;8-m2Zf_f$-g_nJ_g%>k{|?6;d5P4LVhCL&;|d%O;K!g z^!LuyU%9yf$;r5w4BCTWUW3EJ44;QD|L2@ek*XnR4xK_w+6B@S&>G;fx_fc$dLd*}a2 zpb+?+`EjHSHJ|m<9{j6-J;Bbh{A14OuqDO+a3VBaq7nF4pM;4is=HexIXM}$nj2dw zHWVBj36SU85h(D|`UC{PlangPOin6(!bFC`}-+}Oj0;p#5 zUOpyl_Pl@^QjDz&SOPb{ysc7>E^7Fbqv^Vrqlp!BcTiesB@#{eelAUzcg%q48thB{ zqHhj=Z0(r>k^(dpkB`7d3+)u12$#B6X>h`!(zu`%qyFh`-;O&imDBFKP#_wK_&b0} zKB-p+wYKtO(y0r3dqbkh>~=;;WKubOCw4dP_RCc0;JGFi+q~N%klaa4S}9`0sYS#5 znQ+PhSvtmHqX2Vmt%AXI|F{;)Kt)f#1sct@u3!u>ioZc%kR$x}pJ-J|71K>BR2fr- z64HKb0Wg7&h5!h^tgMfN#w?kcnY}o6rlwS7t#>q_>+=r?h)zzH04-oaLBV@0tfKT+ z9IULwM5s`HcS470%U=P+1(~6*YJ@-ZufE)%3jb$07T9=6bb#sO8jrgn%^gh|%OW<6 zP`@~^Un0)(p%V`Zuv>BpUWs64w45=yV_Q3IPLxEfRTR9*dLQ44VZ^&Y*=Jb%ML^0B zV^8_1)#Qwt^!4)c64l(o%uH{lRO_E5JHOb?M&+H(u-BtSE0z%ZYLsz@!LZNs#rY7w zwT_w^SA1O~RYOBVv1-Nlqa$my()p5sp`p#4vFxtDf2k>4LF%t?Io3A9{L|so|YaPBP}`}%ytHU!u<`H`1hEY=FztafXriC1h1Cu{vJ+7;HPb{%&d8wIbSt@E3du>e1-s)`LR zD(qU-nz&^6(*9!{*40=rY_fQjnR(>}t0@tuV00BL^;ak<2s`Q4CyU*I1{?=fU zkh?n%k=G3g)JqsZNlQzE7M*tF+-p%4ApIAn=inbxyTTGScxQUT2^1;;^@v5M{ySFi z>S$5Y%Bo~!%varVxi#%49tTZC%RT8=oN||p0n3H@sKfcXqQcDs+x7Cg`-glBx*;Ll zU%ZSQ3;UDfGiOeut5Q`$Nxox;dw=!n(Dxz)MyF;&I<52Or;yt-M~b*6crQZ!8vNa~ zudtY**I6v3-)!Zj+FnL02fLc|Ge$j(xGV$%``y(vm71`vo}TnC1me1LJ)!IBs&HR) z-csf7eyISi^d1l!AZhr8g&_xORPKT&_K}nnS~2ByPVvSHGI4%ko{mU*UR7 z8VRe%y!4oPh2o!SYHE72>p*vVnZ@BKByD!aA^6;b<$k!iH=~}+rLHUpSW+nIpO^S_ zMJIjjQ{zPRxtVjYNw3iJJ_KP1eg6E})XFNSrY6o|dzktf>{rJtpAhXgrdE{6nY1Hl z^NCFq=%ckP^*m@G*myghbub~YyaU+(eRdxJ{3wiHd++Sk{y->7SVmXZpjivr?l8jm z6YQMp!M|PSOBz4@vq3~UwCli$h;USb(X#W|TsF`$F*@1K>uBnjmL3j)hRMfwgjbmN z$;upnA4wyl9Qk9d)JvKSm8Ul+v84J227;Z<#B6Lz;?56}glEn&5l4KYR_&oj1KH)} zk-za`>dzy*yDYuL+>AOxxqa>--eQ%h!|UB+t-Gcd2*WV*pyr{XqVk>(vRM8r_f29k zp>eRU`3OqM=;+tN!a~=R4uspX=R1bsG@hQpB$l|uYBDyqxRkm@>OM-10~sDFEr%gC z!0o}0Ua?vxz35~bi?(%ejAr9x&Upl}8!mzC9KqocO6kQA2Vi=mV?zB-ug zH^^hj_%M+b*R#2~`Ri2hS6%D#r}DG2Gr6|qd{oz-Lk%au+$nR<=~tAGSE_RK94C$%zouF#pxXxZ zgOK-5!ECBf>A|?u2C#fD1q|GVIVCULM6UEYNSmx|Y<5q9+d1If2Rs*B3!$*1B~>4_ z8Rvm>rLi`nUJD6YONT(UNELeXWeV;-fV;3KOv}05ZbP#Ekro4$V|^4VZQ3<$f_rAHwA@DuH!> z;T~v4b!Uz|lM|r9ezd~)zZ&<9h$j%GVlv{$;GTKnBlzzYw%y+Njz4W4Kz5uDmjah` zR{)uVzOx-)P*#?gndu8SN*@cq9uGWRTn{PNPnuVoRNEGbr?)XFDWS8L-JAANDJlEs zehf4;uX~9#!BEar(^C!z6o^k|F4~wih|A{>g+)XPnWs#C0}0OlrS5zyZ_~aAkV*G* z1AD9^0-M(($w^1q3<&}-b~NS14VJSo8)rg{QR|3`SNlVzWxToYOGXH4-qj{;-_C0q ziQPe31i26dfoubG1afv6&gH(bfbUYdC&v2R%P& zMhSGCzu2wAVP=H3s+m;8*n`z#FM_T)a8GW~>Ca9!<<&{)nJ)c^7V#Nj*`yoOs!?&$RyN#l8$6l%PW z6R`-LFoNZmEo_^gI91_D12W+kVYuFKOe$7YNI_z7&ZC6^z9+8dZB_QO1zWb{|BFQb zf7I{)J14_-%}q5f=E;5L35sC6zT9O3@a>?ZnN|G51xV_Rk~KPJcTaAuLXj$@{eX2wsv|OXb>yM|#$}FbVHT6`}d8W%{9XJ`FXv zkzGgT{n7VYKoA`-7E*vYBkxsz(LPt9a(ZnhK~lj4r=r$*Y<*|)q6%_$<|ME0%2`2@X~{wHRn04Q^aOFC zMaytFxrauBmcY|m-OcUh5_T_TtP>E@js3d6T1JL^{S{k_Z(s=4BO~k0r!_Ha*xz8i z>rZgzVR-n8$Kt_v<$&~S6XHEQ+^c#Jj^^m&A5N&k(L*#x6nXr-hjpHF5+vp*CgvkZ zG;nr=_Rjmk25MoxLg13~3aGezRZm>}UbYYp>t0GA-e!;a4;kkyx+$A^ubuX&+S@+` zU5XmDFKt<{;sR*jTSNkzjQh(Q#U~5sSQWFD$w}pwt$lKys<^2kvki-@{sC7|ghI@D zA`_DzvKo;Faybm94WW`7KXaN`@F1GH77xi?HE)z@0oJi+{%OOcK>@m61S1H!+EY4(t?+C`zGL zFc}?R@PTujn*$#%$X$L8(=n1{>UMP$(3hvlGcQ7l2of%vscIgODT3!|_nbhJ1RXs8 ze(U15>lUdLyAPB_Z5zNmpfV>-f#H6AL{Nbg(FlLg@=(>xu2v588-6UIX??T3zhw*w zD5rWM9Z3q=;z{XJ_5AQBiE{lHhJyu!ha36);9PG~1@0X+4wGKXiUxW*e@F%M>roQQGN zTW?pI)4;rUCds`R5q!d_W*_MjByX#L&i5ay!0Ow}=S29`FcDHfz3Fy*e+8f-K$v4= zW4%cQ@x3_p#Z9^$FfT@*G1Ez@iB#O5IUNPqx`z4TAe^8mu-D(iQt^xjfP;w@>Qao| zcEi(X0(BZ^W(iUABeQd!b5mWqC@NBI2V!^uH;hnIkYlk(Hq=u+paCm5iA`E-0_=wM35;N)t}5hzm0MfQDDE6vd{b(2B^8840AYk4|1y47#l(J^{v zPCzs;ZYy^pb*7`qG9n7nN2kIfv9(gYFGZ3(J}ZfdV2L0W>>nbDcN zC?yd#W%TmguZH-rfz7Pq;xJGs=eB0X4gG+G516uYGRX3F18`Aft5ZKzng{|A3nh&@ zN~9(^J^i}jLf6ce#%b9vBQ+O{r-CHi$V^}8Mc`gvq0ECWue;PYv(+CIYd-konBV9i zx;(mX(|34Pt35nBr!+={WbX|(?!QUkv#_nsw64M>Z?h_R$yx9dmH%2dvcioYXfl8NR#&e<*avllrkH)%}%k@@?- zdRJrKl#;t^NZla{7;v#&QzEO}eb}|URB~b$Ze8fZH2hX=n%rf}=79?PBxw59>>Cg@ z(cmw#xKLOJ5z>)jI`ne9GZ0I{5$P=zTian|-@_|*0gfs^^ zX+Uwqsl+rMP9dpQyFE59iOct^aZyj1UMRVO@FroyZo2seP z*xi*|{i^!?$QtYL&}#CbS~yTfR5l_scWc7OUz-S4jFlrJx2Xv)jZE%5hQX15opzBP zON=JL*zrWo6z(2Feik1WO-wPKh#<%b{}Mqo{q|?vogaN9Z|&w-{6Bo$;U|AZe&nCn z)@>+q#Z6_a- zlcBjewtNVTV4cRFxw#+nhtyn?p4x#*`{t7AM?~!>#Pt!}MEWIxb4OIPuu{1Z*bZM1tcZBjbnS zoIKG!&Z%VIua7YuEU$k<$3#V3rOHr7lVvuo^b57h(1A379hSaaKfej%SbcFpj4CBI zL5O4~5R?DU7n{CotH!0#^2P69;8r!(Y&}V-eQhbmHnkVe%i{;M(RsB9EBz|$Nh)vH8xY&VS9|%`^lBF zgcSX7VzFNBkzhoZSL=l`)$~~(bJ3a z+q% z(lYekpdM&B%?fIT8F6`UoF@~(xL)0%NpE^YqVJ*}Y4^kL6$4D&geveT^pttgv#%-K z(3v^pFt|8%l%*3gs_C6CwauP;^s#4n9r-vUQ<^DiPa;aD5Y{k7&9l+c8CSTH!L|XCJBDzs@6qpJIvscC!z$ zqKxP2mfUFJ{e1oX;V7h&g#`tnLBZVwsJXhfR=;k(;&FQiK0s6p_GzDOGy3{5Huk-| zf`YiTbWXu`!&vKLzS-V4nK4Omah&%N(|2e1itXFVg#HuB4Yz${(y|w0vdQVa3lAGU zJMJUJk=s-Qc5rJ_oN7Wx4$rRDN;4IUvtMLwIILAT`1lqt8XI>Hch??Et%n|E^I#K- zQql<%M4Nhc8xEbu=I2YkVJ^(?<6gM$AMWbAt6;?ka4(pn@M^=jM2K2|{T4ngzxCZI zYhqjbImI<8r26~Jidz($hg~b&l#!LAKu!gin2Fr*J3i4k=z+ZFexkd=qEdNda?qS& z1Sv#qVsCKu$mGSetp!suGs{n4qx|23Z95B_6#pwO_AYP>ri^azEkMYH3TdS#d2Ini zN6OE=HAcr1WzgU#^pKB{G&ndS&fu&Ok!!MM<$g_IJd$2Ask6VoFD@ww%Uk6D;#P^k z8(T()pR@?@G+^S}9pK}q@1`KsQ%b^jPfxOnD$u_7k1Ed_p`lMtHO1brT}kv|c1|uX z01)T!^3QYMb-s`}RcO*5b?o!ug zpPZ{OV(xVcMHSk^<>o$v>;8=LKVFLbidOGWKiSgwXZ#Rjul|$YGa4#H9t%uJGh18J z0Uy7&zYklAN_cK%YWl0DhV575^2TzTl#2`2;-Z!#7k>X^1#>P2Q)5$8+&##bseJCv zgV14dRVE{MDBa(Bet!T?JT-@PK1yR0Lk(vQ^muqmu*>#>bve2MZ+B>OBB4@Wf3nCm z?1C#kuxHxftRD6X)W6;R3*CmB`X8a^b|*!OB4hu(=@7@|^|5q9XU8d#SMI*O<`Qvi zJ>dz}e<9nSny+tjdw|XxH<147RQfZ$;0@6k`?Mnsxi78SvQAY+E`}cyFBQ4Z>fLAJ z8*UO5*Z0_AtNp93*XYYlj}p^FH1PuHt+z4JZ!t#GMr`w%ESzwgA@;X=`Bwrner>^y z|KN2tdKV}BnoKO8y$#rPk2?a#G<{U*;!{)0iV|HV z3oBWpx{Z09(GJc}z|*-i8Gl!`;pbhYSM)i0^r>1%mXd>3_GC3AqPqB0lVv{0(;;}z z?q=U)dxL6TLQ-N>T_^Wwk6PYS4YJ(o@G*t|TR8Az!C&4l19NZnRX~sHb4k^2qo0(( z94WotU^h|6@NM%sVn(}_38hC2lOJ{COwsoPa#vu7Qj%L12@PDWGbjHJsK14DayI^ zvL^B4mEEvkr`3P&w6$3_z=hpd?c z%BMhwhZ{TPV%3gd3`#Ls*=@kH`80}r!m}~m`7z+#FETm$FPMu9&1~TtRDU?|gBSgH zTQ=*kOAv{hQ~*H^wa+=Y#ZgpARpzf7+{8W&LUCQL?v$62L2GGgSpcx;#Z&EUn?xTNRdxvO4p9F6Mx~$Oq zs<9|f%(EgRDlJCHOgvcMZE2y#nU4F{@8ABB;roh1U51aq&zWNdRQHfuAgfRv4h;V!!!s_jS~BtP@ z^4iZ{pyiAH%)xDK#O?PU$D#r9zaG#=_sM+A@zuTlfh;;F_-_~LzXh}6Vi1lIr>4&C zUb+!_Z-~Bx7ytaa6vnrQC?Yu>od}>zpomLuxXx9Y?>^enNS>Xu&BR9405h&zOZp3y ze3i6mIr5B$DtY^-$F--AW+~ytmrAo*AzU#wzL@1+X6twR zvNVV8R|h1N+sK@yzWGE-N=lmEkC*-HRUanA2u;XLm=%@y@`7`LXkAee<$lxKvVH zuNQZ4QvY>BX;xf?(+s_ETUqjjic%!`nu6^AZcA=gYloeUO>SDPI-L;7qe4se{rsO7o69W$L&gMC79yYB-R~0(#@`)}(Dvk0 z+*Nt=0hj5Dbb>` zy0?%%0jnQB3#!5f6WNmXLMHH+7DZg8AXX*^T|ZK6n>v*;UNOllD9wAUel|{H=1Vf5 zAh5yIKAfOf*Fq;k!YYA|a8gf*pXl&dx<`y1ev}7p!wHF_ERe4Q4oFpYUvQYjJiBwD z^S>5Q%|YNQfkvu5H&sClQ-uSKUzY0p+ z;ic&^d;3<&L$6AUieQQ9=!Pg~gF{0n9G%Sbs#5w%DLn{bdle?+b17-J=3TSQx_F@N zC>B((kBRCa(+qhru?u_$784N}PZt%>%+ z-4ip?sdI93X(D9P8c%N1J+IU@pMXm@dqHL1qvg_q)>8W#{Ued^vD@_@pZs`AeGtbi zUJtIIt3H)!HatH(K336U;pUd_vnLgD0x1kvmX%uJY$MwzcDFB^SqD1@+WXjj8J0It zu%rYlfU|{YhVORMbje&5aTMhtu131tC|b1re_sjaX!xE zdo1A}7P|i0v{@(>nvW^_zhBJX z2$7HTIpeWORY<7F+m?Z-F0y60cTjm6^N6VEr0gU=dQ~xI+q7uno;s}w+Fy+0Ac$3`i^I_amLY0w}CObK6RuOja_ou zAJzyrw&}>s)Zri)60VIGB}XU(a94!7Ws>0(!rCWUmEA$v5&YWX%$n0z8s41M%=4ij1<}^%U^nf$v6#b#v*CIU zDz_3@u#RW0&2n^-q?GfshmV%qF0}ALv*_T=`Y*Qd`3L;K$eCH+F`ZfPXhFS_XVWdY z*!z_411M+$`tMFtIOH-DX0u*$>dKQ zH$(wtY}XOK3#y}T3m?dV5l@UF+gunj_iAsX1#bqw(_-kg>yQ$9ubEL$kl8O^AFoE9 zf62=B-2a(?OV*?bEK}sLl>EKwz#0Qx#8<{$rC3KWvOBbtp+x@^-@aAM%|}1Kun_mX zU$fTw8#t9W+3YK58uP!{U1ZUZ(%a*q7x?&6t&prK*6@UMy<7-t+0*YY;eqHI`|c}n zt@&W6R7*vB1#_Ar~5YF3{r5YF8%oQN`)|6BU%is3Wh5r zQU3D3TL`R=J2w;AoR#AzgUVM=Z%ca8F-=4tFYxybinL9DIxc^tWCwzVcfBgi2fyUx zKR#_Dy^sfBMQ3JaHZ?PQG2HzI?9nvZ}1B{vQZ&gA6e=-AlXH;-Li!oZ?Dx_{X()4pnJT6)|93p~6#mu}?ox{--H z4ODUXlEluRD{q~f$N}Z-NGVJ`lkL$end2VQ3i0G7;G^ zww@?p70?UK!lA41`90XqQ0=b7c*nL<_7-90aN5byk!mXixZ{L`V1ZxA(b3T~-M8-! zEW}du{3dZ5GX!}vTbBCG*w7H_tAaxI#g|`^_btY{cFJ6sB?dPaOKIG7Jou7+3TkOt zwSQi8j=pySSQC)SHt}2JSbo<*EM6=@4j?{i+0B{cgbNT~H<^$OQ*Hh^u(!+>9E5#J zjsoW7J?C`1NkSYxl9j;cCpd-WCfRV_-$QXlTdl5oIrF_cndpSDaslP@@EJk+jPTu1 zfrZcg|G5n2^bs#i$mBlz5cdBvl?x+%epxEsHDmn7`u_J~w)(+W%{U3-Hy%^B>ew&% zD+l12yXs98O+-zRR;jErTxUu3B-`l#i@*h(SU&8;%^*0Kj<^n$R`>&})~8%r9lxn( z?)pj`6(yyDXry~Q>$zBJsA}|2LD*PC=mIS>(W}HLYQ%3eQvtbDdt6Vi_L|W;^y{Ll zy}i9ha&%h`3_Z83~FQB%gffmY3y(@8ILRPuno@6x#H1CN(DCm%<(YJn8XLI<7Nt}P{Zm-YqV+vkj0d6AYKCp0pgwfGd@sPS z#zx!|?A0We^e0oID9#qbW@lW*Y*TUy~DQh@A_P0Ic<1aco>@767U+xcoe z4vS8a78yRsopqKH`AJ^|duH$|_0hg~p}YC>vclW>3>*2W2X&b|F&1ks(P_wtoYYkn zUj|swe0GP&n`~tj`#2+4xSS%ewjrX|3Y`8~VU6$$U`-*Y2>P``Rx{s0&$sCX$~SpN zHhYoFkTLCM?BiLp16;rRG??3nk-AmYmsKDzSE(SA+QkVR_*`oa54QNmvs;C7=J z&0&v@k4+wKPA6w(V&da-0rZ$(UM|yi)M45fWIwLijJB*k>%#(^w4XO#suDDa;h7kw zG$bsr9)i{D;YRQfm?#}vM?XrvOGocIvQoR(9_Bsh0ORSvcOaW5UJ( zx1girM&vwf1BPbR_PhjMbcP<-L}jx%w^(nOhw~R) z{zo;}8P!zQwQqotA`pZ@7$C#~h*$uJ&MU!&6Ep;nW&lGGlwPERBp^jZf`SyODpjg5 zG$~00g`p@#1PmQUKthj6NFe0BjNi|9ee3=At?$=4XYaf2I(yxH&OYb4&)z|Svq6}I zM~}e7@0%WOfV+nW1Vj~@a$!G=P)d3#Dn}^iMy$fgeGBEK*x=gO=F|t*f}@Oq=t}s? z9<+g&#X%JJnth7gvwdK`x^bkQb=aqpcE7k>TS{ zC_pZE!-PzX$rL&DOh*sCtES9-sE)q%djxiOE3-`f7jvq)CkV7)T7oLKLO|dVqIuzK z#GOw$NJ~peF&hbn78i_xJWoQg+b;XBx zF6x}44|p3;exlTRf5^LgJfQ6<%IuUx`tQ@T0p(?78mqiMG!z{#Y$Xlx{Qsf*ln9W4v*Y(*cvBbiC3?BMyrmS!irTVzPYuQb+#)uf4dvE~kBn zx(Gz#bq3tuN7~79JX~d;j&P-bt{yL6=x_%89u2q1eqWj<7!DrJB5Ds+*|(&FNEH$z zgD0^-t~juoL zRD(>;ZlglMpib$e>z`(OOIXcyF7?(aImQlm#V6Pe8@;U}M*CY++^k0a_{zOY)>p~P zPu`uqkeQ!Vv=p9Q8SHkkoG5ML+>}|@-f}=iVkPR0!`w6+L%;GO;OvK$MUv*y4m5`4 z{%&+=zhcjfvEl#AMf|cEB9)7~VZL*ocXMh#bMday<8N17XlPNln0QgxT&G8*s7o;R zmPLo}ye6V#NqVR~_F()(USLR;iG*X61O9}qmT)%T?zzniAGus`L+sNbs^r_F0ziP^ z@$xUVtc7piPI`goyIm4vO}in9O_<;Al9VYr{fTnD6Q;PD`O#wUZZ=Ok=9!V?OT&y( zSgEkr7qN%@D}y6R#^oA9&KK1-U(9{AKwVG0_{AI&>k0!8f!#|F22@h-UO0ZT;IwHY z=F;lpbSsPxv`^PNOM}5;($+sklJXR4a$BY+nQQm3`P_+9)ve~cJ5O~H^|j}W^=HD@ z+pMpppFTMiJVS;c>jh_%;GPTxw~&yg5Zh^V(5NTx(!_|p9h5p!`FUxnG|!f8@o`~2 zjAftXc#je4!_8|{K(cnf&#i85YbzjOjqWj<`P-iyHS)XPWje2^rrpxHm}#zOEj)j_0JAHeM(_yBWLf`ju*f0 zVuQC2xVfbi4i1{NaTwz%g}2YWUL-Lq=;OZl<-Vbo(aoWGu$ZcDFrh9grj3#z6}UTOs& z9>Gl}B$eqBU+5gbO}*W1s>0^f>T!n#I9=iVim!Fj(^;|kpqUl1zFi0H^Kdhp)F-`C zk&)bV+Y|6REW=-iyQ>7zDdKIY4>gt%LQeC}$&xtkx)gSaCXw&Hr#b2#5s_S&N!X>l zH@y=y>7|YguLD_S_ao ztpO7@2j$lcx-27;Qt0P3LA-(HY)LT|@}Hi2?sum7wHgAcNQ2jFaXH~rDsgMQ)WW|0 z-EgI@EsDF_xAcnonQ^YKPX+GMknNu(8_cn%-8*q{qRYfwMQG&Mu3l*zoOr`>0)h^t z{iz+A@+;T1He@{ND&ywK_ASJuncc%(oY1_%ZuW7_^Fx8)=OVxnRbUF!oEHd2V48d# zQF`Q|&(IrhbGY&FNSj?w>Itr!i(Dl-vQcMU*1O4((luts-$K%yspM{Q+zF}!F#BLh zpXt$^VtP-*G1(*t6>;8XOa=KUL%R@50L5`9{^s&z-vF4g!HT`9U=p2BC=8Xk|jp~@*&U;xubZ>0f&jMa=Q#l1$Svr(|9m*hY@qoyqB<(4)K%s+ zUT3*fHJW6yt&0!Ss~f#4#Ep2iZ;!@+se-qi%&lr@zuZvO7obDq#2QML0Y-;*YIjUn zhwEaw$#AgPG8T4mj8Mjtxgnw|+bj147Q@cIAdoGkgBP6MsD0aKHh!U$bTj77%_yEG zvkq+`*~_ix-Ol^Is(oOJ(-)Y1ZmBo*h*w8wR@Mg{Rvb)(Qc|9N6*GTZM-PpuXQbq^ znb;S5Meb(YAu$H@w3%tQ%^i^$=Tk~24##e!6^=5bBC{xBT~_o^)S2^offIXi_LaL1 zTIujQoUYf&)}x-ydz*~H#^OtQTY7X=%S85$<_`~Iq();8IhR;%8S<5{LVjnl$Hu} z$&J>b#cHg(UpW@BKZis{kjy&I;nmg0XUe>zsy?)zq$^yG(UKoskpr{_1hWt?t< zsMUUdaO#tdbVK#mZRa!0P3t}e9-Paq)G!S{_qM`1g?n&&LbS1!k`feOwLmJq)C0}R zzEzp`X*4k;d=^*=ldDQ=f!a0j%G-Wfl#I54M_)ykwoBjuu<#qlzyUC1$*@x{ z12g+;oghXAW(59=&L7G=I_}m6u{Vd|No7h9yHBE>COU0lHmbw$%se`9_D+{d+iu|5b6{mT2SdTol<2Q>rDzX-YJ>=FO3Cei&$aCM@Gq+Uvt?+L zQxR{K>k0os!NL2_CF|L|Rnkxg37GIvIeW88MBl^4@fP>yk8Uka8hDh!eTA5U6U+2! zBU&8$V7%II&#i4pjv})!#$VR}4Ss6`F#;j%HKHsP-iOf-UPtR!9F>cC3N*0V1&_)_ z(yh40gB(hRL26P`-?gxKQOUivNcx^>1+C+G!7a^k*DnyeMC(e9+vwI`Qn4_cUcJ0e z+X%_7E#dyu#M^sxFk`n_-gxp_es|~4o!S}#wsL?>#>-D|OKGbw-@d(>60kP$){yH{ z$XoTnHV*Xf)th#&G-5iMX#IuUi(XxrYP#y^R}$`fn1F~2Gx^pd(w^m!)87{Q*%W9e8-u4`te+mxG0=WSh!z3;!=U_-5e z=`ac6370KPW>kb`jD)An&6cA%58}Gr#EFBO=N!z&2jB<-XLTjEXN>+~hB6ALAGgCEPI}(3wox++sK}Wv68C^JbStuUJ*X zPMV7FjFBi-j9BCukXig(#(At`)Vf#9AV=5zHoH}T-@(XC5SyQ9(j?O=B2xNu3z)e#5IIwojFG#vhu-pRlfSFw4w6N9nuHRjl-i{X9l&xz;D%pc^35@{Cm-I|Sxgj@ zO0R)DJm3L)lcc7Xqr0pqE?5r1CJZ&U=B{LIh$rwJ6@KAq#iKJg{_8abaify&@zsd? z1rpk1xCE%Nv+9Rr3%z<1U!5#=z%*fiBp{Wxv2R0<%Ne{x8>;4;^;Ff<(02&+!}UMq zj%~c&9tRmXGZ8HOsIY^U6|WBHy1%gebDoAGeOPIY*B-fUvv+H(cdi45_l3UcI*>dF z{-DG~fDKAG&Fyrc*qL@p(Z00t8^pm#S>FM;%g5z6{Y&rx%J467u$nG_ykc^>>Y_vR FzX3rO2gm>b literal 0 HcmV?d00001 diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index b622d0d4583..59ff1526446 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -3392,7 +3392,7 @@ "bnl" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) "bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) "bnn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) -"bno" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bno" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/soll_officer,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnp" = (/obj/machinery/modular_computer/console/preset/command,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bnr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) From 9823371e1a829710a9992d973d770a75dafdff74 Mon Sep 17 00:00:00 2001 From: skull132 Date: Tue, 28 Feb 2017 12:42:08 +0200 Subject: [PATCH 03/55] Fix whitelists for antag event Whoever thought that using strings in this, and not var/flag, deserves to be shot. Hardcoded strings are godawful. --- code/game/jobs/jobs.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 7383e1c7bb8..360b8faac08 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -54,6 +54,7 @@ var/list/assistant_occupations = list() //Leaving this on one line stops Travis var/list/command_positions = list( "Captain", + "Sol Officer", "Head of Personnel", "Head of Security", "Chief Engineer", @@ -100,6 +101,7 @@ var/list/cargo_positions = list( var/list/civilian_positions = list( "Head of Personnel", "Internal Affairs Agent", + "Alliance Representative", "Bartender", "Gardener", "Chef", @@ -126,7 +128,7 @@ var/list/nonhuman_positions = list( ) /proc/guest_jobbans(var/job) - return ((job in command_positions) || job == "Internal Affairs Agent") + return ((job in command_positions) || job == "Internal Affairs Agent" || job == "Alliance Representative") /proc/get_job_datums() var/list/occupations = list() From e00ba48c8f631cd895df1f55db288e135752a9ed Mon Sep 17 00:00:00 2001 From: LordFowl Date: Wed, 1 Mar 2017 01:22:59 -0500 Subject: [PATCH 04/55] SolRep Uniforms (#1856) After discussing it with Jackboot, I have decided to give the SolRep their own uniform. In an attempt to differentiate them from the captain, I created a new uniform sprite based off of the US Navy Dress Blue uniform. Since SolRep's and their alternate title of IAA are very different, I decided it would be best to spawn all of the SA gear on the SolRep specifically, so that the IAA doesn't get greedy with a locker. The SolRep now spawns with: A regular pair of sunglasses. A Lieutenant Sol Navy dress uniform A Navy cap Laced dress shoes A ceremonial sword They no longer spawn with a briefcase. I also switched the sprite of the Marine dress cap and the Navy dress cap, because I believe that they better match their source this way. I also renamed the dress whites uniform to be Sol Navy Commander Dress Uniform, and the Dress blues are Sol Navy Lieutenant Dress Uniform. This is to me the best way to convey rank without creating a whole new insignia accessory. --- code/game/jobs/job/civilian.dm | 23 ++++++++++++++--------- code/modules/antag_contest/sol_items.dm | 20 ++++++++++++++------ code/modules/client/preferences_gear.dm | 8 ++++---- icons/obj/sol_uniform.dmi | Bin 22388 -> 23603 bytes 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index b5e3df4625f..ada7174fadc 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -49,7 +49,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) - if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel(H), slot_back) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chef(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/chef(H), slot_wear_suit) @@ -286,22 +286,27 @@ if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses) - H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) - + if (H.mind.role_alt_title) switch(H.mind.role_alt_title) if("Alliance Representative") H.equip_to_slot_or_del(new /obj/item/weapon/melee/telebaton(H), slot_in_backpack) //remove those when the event is over + H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_in_backpack) H.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/colt(H), slot_in_backpack) //remove those when the event is over + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/dress/subofficer(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) + H.equip_to_slot_or_del(new /obj/item/clothing/head/dress/officer(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/weapon/melee/ceremonial_sword(H), slot_belt) H.implant_loyalty_sol(H) if("NanoTrasen Internal Affairs Agent") H.implant_loyalty(H) - + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses) + H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) return 1 diff --git a/code/modules/antag_contest/sol_items.dm b/code/modules/antag_contest/sol_items.dm index 304ff05aae8..b40e2c6b63e 100644 --- a/code/modules/antag_contest/sol_items.dm +++ b/code/modules/antag_contest/sol_items.dm @@ -72,13 +72,21 @@ contained_sprite = 1 /obj/item/clothing/under/rank/dress/officer //sol marine officer dress unniform - name = "sol navy officer dress uniform" - desc = "A fancy military looking dress uniform issued to Sol Alliance navy officers." + name = "sol navy commander dress uniform" + desc = "A fancy military looking dress uniform issued to high ranking Sol Alliance navy officers. This one wears the rank of Commander" icon = 'icons/obj/sol_uniform.dmi' icon_state = "dress" item_state = "dress" contained_sprite = 1 +/obj/item/clothing/under/rank/dress/subofficer //sol marine officer dress unniform + name = "sol navy lieutenant dress uniform" + desc = "A fancy military looking dress uniform issued to lower ranking Sol Alliance navy officers. This one wears the rank of Lieutenant" + icon = 'icons/obj/sol_uniform.dmi' + icon_state = "subdress" + item_state = "subdress" + contained_sprite = 1 + /obj/item/clothing/under/rank/dress/admiral //admiral uniform name = "sol navy admiral uniform" desc = "A fancy military dress uniform issued to a higher member of the Sol Alliance navy." @@ -126,16 +134,16 @@ name = "sol marine dress cap" desc = "A green cap issued as part of the Sol Alliance marine dress uniform." icon = 'icons/obj/sol_uniform.dmi' - icon_state = "whitewheelcap" - item_state = "whitewheelcap" + icon_state = "whitepeakcap" + item_state = "whitepeakcap" contained_sprite = 1 /obj/item/clothing/head/dress/officer name = "sol navy officer dress cap" desc = "A white cap issued as part of the Sol Alliance navy officers dress uniform." icon = 'icons/obj/sol_uniform.dmi' - icon_state = "whitepeakcap" - item_state = "whitepeakcap" + icon_state = "whitewheelcap" + item_state = "whitewheelcap" contained_sprite = 1 /obj/item/clothing/head/dress/admiral diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index d355926c873..4dcd2cea189 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -677,28 +677,28 @@ var/global/list/gear_datums = list() path = /obj/item/clothing/accessory/holster/armpit slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") /datum/gear/hip display_name = "holster, hip" path = /obj/item/clothing/accessory/holster/hip slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") /datum/gear/waist display_name = "holster, waist" path = /obj/item/clothing/accessory/holster/waist slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") /datum/gear/thigh display_name = "holster, thigh" path = /obj/item/clothing/accessory/holster/thigh slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") /datum/gear/tie_blue display_name = "tie, blue" diff --git a/icons/obj/sol_uniform.dmi b/icons/obj/sol_uniform.dmi index 0ea97c488b29960269e9f1934ea3c9201a145d04..a7f75ca1e0008049e104fab9f58ad1c20213e9da 100644 GIT binary patch literal 23603 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 FzX3rO2gm>b From 9931c463125aaa49249b234aaf1a2050935d678d Mon Sep 17 00:00:00 2001 From: Alberyk Date: Wed, 1 Mar 2017 18:15:18 -0300 Subject: [PATCH 05/55] Event locker fixes (#1851) Fix some minor issues with the sol outfit closes. --- code/modules/antag_contest/sol_items.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/antag_contest/sol_items.dm b/code/modules/antag_contest/sol_items.dm index b40e2c6b63e..e5b164d3fb7 100644 --- a/code/modules/antag_contest/sol_items.dm +++ b/code/modules/antag_contest/sol_items.dm @@ -230,7 +230,7 @@ name = "sol navy dress uniform closet" desc = "It's a storage unit for Sol Alliance navy dress uniforms." -/obj/structure/closet/sol/marine/New() +/obj/structure/closet/sol/navy_dress/New() ..() new /obj/item/clothing/under/rank/dress(src) new /obj/item/clothing/under/rank/dress(src) @@ -249,7 +249,7 @@ name = "sol marine dress uniform closet" desc = "It's a storage unit for Sol Alliance marine dress uniforms." -/obj/structure/closet/sol/marine/New() +/obj/structure/closet/sol/marine_dress/New() ..() new /obj/item/clothing/under/rank/dress/marine(src) new /obj/item/clothing/under/rank/dress/marine(src) @@ -265,7 +265,7 @@ new /obj/item/clothing/gloves/white(src) /obj/structure/closet/secure_closet/soll_officer - name = "soll alliance officer locker" + name = "sol alliance officer locker" req_access = list(access_captain) icon_state = "capsecure1" icon_closed = "capsecure" From 44cb24e4cbb78d2c3c33b5477d4dd386ea210a1c Mon Sep 17 00:00:00 2001 From: printer16 Date: Sat, 4 Mar 2017 17:12:05 -0500 Subject: [PATCH 06/55] Fixes #1841 (#1849) --- .../malfunction/newmalf_ability_trees/tree_networking.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm index 3bf6ab01108..046da249b1d 100644 --- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm +++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_networking.dm @@ -111,6 +111,13 @@ return log_ability_use(user, "elite encryption hack (SUCCESS - title: [title])") command_announcement.Announce(text, title) + for (var/obj/machinery/computer/communications/C in machines) + if(! (C.stat & (BROKEN|NOPOWER) ) ) + var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( C.loc ) + P.name = "[command_name()] Update" + P.info = replacetext(text, "\n", "
") + P.update_space(P.info) + P.update_icon() /datum/game_mode/malfunction/verb/elite_encryption_hack() set category = "Software" From 97856e8735477eb9ad0a862339c507f95e7822a7 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sat, 4 Mar 2017 18:01:06 -0600 Subject: [PATCH 07/55] Improved scheduler (#1864) changes: Rewrote scheduler to use a sorted linked-list to store scheduled tasks so that only one element needs to be checked if none of the tasks are ready to fire. Scheduler now checks tasks every 2 ds. Adding tasks to an empty scheduler or tasks that are triggered after any existing tasks is fast, but adding tasks that trigger between two existing tasks requires iterating through some of the task list. It's no addtimer(), but it's something. --- baystation12.dme | 1 + code/__defines/process_scheduler.dm | 2 + code/controllers/Processes/scheduler.dm | 202 +++++++++++++----------- code/datums/scheduled_task.dm | 79 +++++++++ code/game/machinery/doors/door.dm | 3 +- code/game/turfs/simulated.dm | 30 ++-- 6 files changed, 204 insertions(+), 113 deletions(-) create mode 100644 code/datums/scheduled_task.dm diff --git a/baystation12.dme b/baystation12.dme index 65f5ad87282..829a6030dba 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -170,6 +170,7 @@ #include "code\datums\mind.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" +#include "code\datums\scheduled_task.dm" #include "code\datums\server_greeting.dm" #include "code\datums\sun.dm" #include "code\datums\supplypacks.dm" diff --git a/code/__defines/process_scheduler.dm b/code/__defines/process_scheduler.dm index 3db5980b7c1..d2dfe2505d6 100644 --- a/code/__defines/process_scheduler.dm +++ b/code/__defines/process_scheduler.dm @@ -30,3 +30,5 @@ last_slept = TimeOfHour; \ tick_start = world.tick_usage; \ } + +#define PSCHED_CHECK_TICK (world.tick_usage > 100 || (world.tick_usage - tick_start) > tick_allowance) diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index f2729d5d3aa..bef21d18b77 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -4,54 +4,141 @@ * Scheduler * ************/ /datum/controller/process/scheduler - var/list/scheduled_tasks - var/tick_completed = TRUE - var/list/queued_tasks + var/list/datum/scheduled_task/tasks = list() + var/datum/scheduled_task/head /datum/controller/process/scheduler/setup() name = "scheduler" - schedule_interval = 2 SECONDS - scheduled_tasks = list() + schedule_interval = 2 scheduler = src /datum/controller/process/scheduler/doWork() - if (tick_completed) - queued_tasks = scheduled_tasks.Copy() - tick_completed = FALSE + while (head && !PSCHED_CHECK_TICK) + if (head.destroyed) + head = head.next + tasks -= head + head.kill() + continue + if (head.trigger_time >= world.time) + return // Nothing after this will be ready to fire. - while (queued_tasks.len) - var/datum/scheduled_task/task = queued_tasks[queued_tasks.len] - queued_tasks.len-- + // This one's ready to fire, process it. + var/datum/scheduled_task/task = head + head = task.next + task.pre_process() + task.process() + task.post_process() + if (task.destroyed) // post_process probably destroyed it. + tasks -= task + task.kill() +/datum/controller/process/scheduler/proc/queue(datum/scheduled_task/task) + if (!task || !task.trigger_time) + warning("scheduler: Invalid task queued! Ignoring.") + return + // Reset this in-case we're doing a rebuild. + task.next = null + if (!head && !tasks.len) + head = task + tasks += task + return + + if (!head) // Head's missing but we still have tasks, rebuild. + tasks += task + rebuild_queue() + return + + var/datum/scheduled_task/curr = head + while (curr.next && curr.trigger_time < task.trigger_time) + curr = curr.next + + if (!curr.next) + // We're at the end of the queue, just append. + curr.next = task + tasks += task + return + + // Inserting midway into the list. + var/old_next = curr.next + curr.next = task + task.next = old_next + tasks += task + +// Rebuilds the queue linked-list, removing invalid or destroyed entries. +/datum/controller/process/scheduler/proc/rebuild_queue() + log_debug("scheduler: Rebuilding queue.") + var/list/old_tasks = tasks + tasks = list() + if (!old_tasks.len) + log_debug("scheduler: rebuild was called on empty queue! Aborting.") + return + + // Find the head. + for (var/thing in old_tasks) + var/datum/scheduled_task/task = thing if (QDELETED(task)) - scheduled_tasks -= task + old_tasks -= task continue - if (world.time > task.trigger_time) - unschedule(task) - task.pre_process() - task.process() - task.post_process() - F_SCHECK + if (task.destroyed) + old_tasks -= task + task.kill() + continue - tick_completed = TRUE + if (!head || task.trigger_time < head.trigger_time) + head = task + + if (!head) + log_debug("scheduler: unable to find head! Purging task queue.") + for (var/thing in old_tasks) + var/datum/scheduled_task/task = thing + if (QDELETED(task)) + continue + + task.kill() + + head = null + return + + // Don't queue the head. + tasks += head + old_tasks -= head + + // Now rebuild the queue. + for (var/thing in old_tasks) + var/datum/scheduled_task/task = thing + + queue(task) + + log_debug("scheduler: Queue diff is [old_tasks.len - tasks.len].") /datum/controller/process/scheduler/statProcess() ..() - stat(null, "[scheduled_tasks.len] tasks, [queued_tasks.len] queued") + stat(null, "[tasks.len] task\s") /datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st) - scheduled_tasks += st - destroyed_event.register(st, src, /datum/controller/process/scheduler/proc/unschedule) + queue(st) /datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st) - if(st in scheduled_tasks) - scheduled_tasks -= st - destroyed_event.unregister(st, src) + st.destroyed = TRUE /********** * Helpers * **********/ +/proc/schedule(source, the_proc, time, ...) + if (time < 0) + return + time += world.time + var/list/the_args + if (length(args) > 3) + the_args = args.Copy(4) + else + the_args = list() + if (source) + return schedule_task_with_source(time, the_proc, the_args) + else + return schedule_task(time, the_proc, the_args) + /proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list()) return schedule_task(world.time + in_time, procedure, arguments) @@ -77,68 +164,3 @@ var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/repeat_scheduled_task, list(repeat_interval)) scheduler.schedule(st) return st - -/************* -* Task Datum * -*************/ -/datum/scheduled_task - var/trigger_time - var/procedure - var/list/arguments - var/task_after_process - var/list/task_after_process_args - -/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) - ..() - src.trigger_time = trigger_time - src.procedure = procedure - src.arguments = arguments ? arguments : list() - src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task - src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list() - task_after_process_args += src - -/datum/scheduled_task/Destroy() - procedure = null - arguments.Cut() - task_after_process = null - task_after_process_args.Cut() - return ..() - -/datum/scheduled_task/proc/pre_process() - task_triggered_event.raise_event(list(src)) - -/datum/scheduled_task/proc/process() - if(procedure) - call(procedure)(arglist(arguments)) - -/datum/scheduled_task/proc/post_process() - call(task_after_process)(arglist(task_after_process_args)) - -// Resets the trigger time, has no effect if the task has already triggered -/datum/scheduled_task/proc/trigger_task_in(var/trigger_in) - src.trigger_time = world.time + trigger_in - -/datum/scheduled_task/source - var/datum/source - -/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) - src.source = source - destroyed_event.register(src.source, src, /datum/scheduled_task/source/proc/source_destroyed) - ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args) - -/datum/scheduled_task/source/Destroy() - source = null - return ..() - -/datum/scheduled_task/source/process() - call(source, procedure)(arglist(arguments)) - -/datum/scheduled_task/source/proc/source_destroyed() - qdel(src) - -/proc/destroy_scheduled_task(var/datum/scheduled_task/st) - qdel(st) - -/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st) - st.trigger_time = world.time + trigger_delay - scheduler.schedule(st) diff --git a/code/datums/scheduled_task.dm b/code/datums/scheduled_task.dm new file mode 100644 index 00000000000..f7ffb042325 --- /dev/null +++ b/code/datums/scheduled_task.dm @@ -0,0 +1,79 @@ +/************* +* Task Datum * +*************/ +/datum/scheduled_task + var/trigger_time + var/procedure + var/list/arguments + var/task_after_process + var/list/task_after_process_args + var/datum/scheduled_task/next + var/destroyed = FALSE + +/datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) + ..() + src.trigger_time = trigger_time + src.procedure = procedure + src.arguments = arguments ? arguments : list() + src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task + src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list() + task_after_process_args += src + +/datum/scheduled_task/Destroy() + if (!destroyed) + kill(no_del = TRUE) + procedure = null + arguments.Cut() + task_after_process = null + task_after_process_args.Cut() + return ..() + +/datum/scheduled_task/proc/pre_process() + return + +/datum/scheduled_task/proc/process() + if(procedure) + call(procedure)(arglist(arguments)) + +/datum/scheduled_task/proc/post_process() + call(task_after_process)(arglist(task_after_process_args)) + +// Resets the trigger time, has no effect if the task has already triggered +/datum/scheduled_task/proc/trigger_task_in(var/trigger_in) + src.trigger_time = world.time + trigger_in + +/datum/scheduled_task/proc/kill(no_del = FALSE) + if (!destroyed) + warning("scheduler: Non-destroyed task was killed!") + destroyed = TRUE + + if (src in scheduler.tasks) + warning("scheduler: Task was not cleaned up correctly, rebuilding scheduler queue!") + scheduler.rebuild_queue() + + if (!no_del) + qdel(src) + +/datum/scheduled_task/source + var/datum/source + +/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) + src.source = source + ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args) + +/datum/scheduled_task/source/Destroy() + source = null + return ..() + +/datum/scheduled_task/source/process() + call(source, procedure)(arglist(arguments)) + +/datum/scheduled_task/source/proc/source_destroyed() + destroyed = TRUE + +/proc/destroy_scheduled_task(var/datum/scheduled_task/st) + st.destroyed = TRUE + +/proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st) + st.trigger_time = world.time + trigger_delay + scheduler.schedule(st) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 391d885fccb..16f96f844b7 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -30,8 +30,7 @@ var/obj/item/stack/material/steel/repairing var/block_air_zones = 1 //If set, air zones cannot merge across the door even when it is opened. var/open_duration = 150//How long it stays open - var/datum/scheduled_task/close_task - var/datum/scheduled_task/hatch_task + var/hashatch = 0//If 1, this door has hatches, and certain small creatures can move through them without opening the door var/hatchstate = 0//0: closed, 1: open diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 11022e2f469..977d25059b5 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -14,8 +14,6 @@ var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to var/dirt = 0 - var/datum/scheduled_task/unwet_task - // This is not great. /turf/simulated/proc/wet_floor(var/wet_val = 1) if(wet_val < wet) @@ -26,22 +24,17 @@ wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") overlays += wet_overlay - if(unwet_task) - unwet_task.trigger_task_in(180 SECONDS) - else - unwet_task = schedule_task_in(180 SECONDS) - task_triggered_event.register(unwet_task, src, /turf/simulated/proc/task_unwet_floor) - -/turf/simulated/proc/task_unwet_floor(var/triggered_task) - if(triggered_task == unwet_task) - unwet_task = null - unwet_floor() + schedule_task_with_source_in(180 SECONDS, src, .proc/unwet_floor) /turf/simulated/proc/unwet_floor() - wet = 0 - if(wet_overlay) - overlays -= wet_overlay - wet_overlay = null + --wet + if (wet < 1) + wet = 0 + if(wet_overlay) + overlays -= wet_overlay + wet_overlay = null + else + schedule_task_with_source_in(180 SECONDS, src, .proc/unwet_floor) /turf/simulated/clean_blood() for(var/obj/effect/decal/cleanable/blood/B in contents) @@ -54,11 +47,6 @@ holy = 1 levelupdate() -/turf/simulated/Destroy() - qdel(unwet_task) - unwet_task = null - return ..() - /turf/simulated/proc/initialize() return From 5320d6af3efd0acd1dfdb74f675e7241fbc12ced Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sat, 4 Mar 2017 18:02:03 -0600 Subject: [PATCH 08/55] IPC Lights (#1846) changes: IPCs now emit a weak light based on the color of their screen. The system for making species emit light is modular, and Shells+HKs have been excluded from light emission. --- .../living/carbon/human/species/species.dm | 5 ++ .../species/station/machine_subspecies.dm | 13 +++++ .../carbon/human/species/station/station.dm | 52 +++++++++++++++++++ .../mob/living/carbon/human/update_icons.dm | 10 ++++ html/changelogs/lohikar-ipc-lights.yml | 4 ++ 5 files changed, 84 insertions(+) create mode 100644 html/changelogs/lohikar-ipc-lights.yml diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 8fa5dddad77..7a04d4e972e 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -40,6 +40,8 @@ var/virus_immune var/short_sighted var/bald = 0 + var/light_range + var/light_power // Language/culture vars. var/default_language = "Ceti Basic" // Default language is used when 'say' is used without modifiers. @@ -438,3 +440,6 @@ return 0 H.hud_used.move_intent.update_move_icon(H) return 1 + +/datum/species/proc/get_light_color(hair_style) + return diff --git a/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm index 84431259827..39e460840ed 100644 --- a/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/machine_subspecies.dm @@ -17,6 +17,9 @@ icobase = 'icons/mob/human_races/r_human.dmi' deform = 'icons/mob/human_races/robotic.dmi' + light_range = 0 + light_power = 0 + eyes = "eyes_s" show_ssd = "completely quiescent" @@ -48,6 +51,8 @@ "r_foot" = list("path" = /obj/item/organ/external/foot/right/shell) ) +/datum/species/machine/shell/get_light_color(hair_style) + return /datum/species/machine/shell/handle_post_spawn(var/mob/living/carbon/human/H) add_inherent_verbs(H) @@ -128,6 +133,9 @@ sprint_speed_factor = 1.4 +/datum/species/machine/industrial/get_light_color(hair_style) + return LIGHT_COLOR_TUNGSTEN + /datum/species/machine/industrial/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost) if (H.stat == CONSCIOUS) H.bodytemperature += cost*0.9 @@ -156,6 +164,9 @@ icobase = 'icons/mob/human_races/r_terminator.dmi' deform = 'icons/mob/human_races/r_terminator.dmi' + light_range = 0 + light_power = 0 + unarmed_types = list(/datum/unarmed_attack/terminator) rarity_value = 20 @@ -231,6 +242,8 @@ sprint_speed_factor = 1.25 slowdown = 1 +/datum/species/machine/terminator/get_light_color(hair_style) + return /datum/species/machine/terminator/handle_sprint_cost(var/mob/living/carbon/human/H, var/cost) if (H.stat == CONSCIOUS) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 2caa05ba8ee..26793c6dfcc 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -355,6 +355,9 @@ icobase = 'icons/mob/human_races/r_machine.dmi' deform = 'icons/mob/human_races/r_machine.dmi' + light_range = 2 + light_power = 0.5 + unarmed_types = list(/datum/unarmed_attack/punch) rarity_value = 2 @@ -503,6 +506,55 @@ datum/species/machine/handle_post_spawn(var/mob/living/carbon/human/H) var/DBQuery/update_query = dbcon.NewQuery("UPDATE ss13_ipc_tracking SET tag_status = :status WHERE player_ckey = :ckey AND character_name = :character_name") update_query.Execute(query_details) +/datum/species/machine/get_light_color(hair_style) + // I hate this, but I can't think of a better way that doesn't involve + // rewriting hair. + switch (hair_style) + if ("pink IPC screen") + return LIGHT_COLOR_PINK + + if ("red IPC screen") + return LIGHT_COLOR_RED + + if ("green IPC screen") + return LIGHT_COLOR_GREEN + + if ("blue IPC screen") + return LIGHT_COLOR_BLUE + + if ("breakout IPC screen") + return LIGHT_COLOR_CYAN + + if ("eight IPC screen") + return LIGHT_COLOR_CYAN + + if ("goggles IPC screen") + return LIGHT_COLOR_RED + + if ("heart IPC screen") + return LIGHT_COLOR_PINK + + if ("monoeye IPC screen") + return LIGHT_COLOR_ORANGE + + if ("nature IPC screen") + return LIGHT_COLOR_CYAN + + if ("orange IPC screen") + return LIGHT_COLOR_ORANGE + + if ("purple IPC screen") + return LIGHT_COLOR_PURPLE + + if ("shower IPC screen") + return "#FFFFFF" + + if ("static IPC screen") + return "#FFFFFF" + + if ("yellow IPC screen") + return LIGHT_COLOR_YELLOW + /datum/species/bug name = "Vaurca Worker" short_name = "vau" diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 163cd728143..cd072134433 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -389,6 +389,16 @@ var/global/list/damage_icon_parts = list() face_standing.Blend(hair_s, ICON_OVERLAY) + if (species.light_range) + var/col = species.get_light_color(h_style) + if (!col) + col = "#FFFFFF" + + set_light(species.light_range, species.light_power, col, uv = 0, angle = LIGHT_WIDE) + + else if (species.light_range) + set_light(FALSE) + overlays_standing[HAIR_LAYER] = image(face_standing) if(update_icons) update_icons() diff --git a/html/changelogs/lohikar-ipc-lights.yml b/html/changelogs/lohikar-ipc-lights.yml new file mode 100644 index 00000000000..ddc885a07bf --- /dev/null +++ b/html/changelogs/lohikar-ipc-lights.yml @@ -0,0 +1,4 @@ +author: Lohikar +delete-after: True +changes: + - rscadd: "IPCs (not including shells) now emit a small amount of light, colored according to their type and screen color." From 7bc62acb6eb832491af8835d49aa843e54c32fae Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sat, 4 Mar 2017 18:05:14 -0600 Subject: [PATCH 09/55] Pooling fixes (#1866) Fixes some bad arguments on getFromPool calls that were causing things to not work correctly. Fixes #1800. Damn you butterfly effect. --- code/game/machinery/doors/door.dm | 2 +- code/game/objects/effects/chem/chemsmoke.dm | 2 +- code/game/objects/effects/chem/foam.dm | 4 ++-- code/game/objects/effects/spiders.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/windoor_assembly.dm | 2 +- code/modules/mob/living/simple_animal/hostile/giant_spider.dm | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 16f96f844b7..b4118abd48a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -228,7 +228,7 @@ switch (Proj.damage_type) if(BRUTE) new /obj/item/stack/material/steel(src.loc, 2) - getFromPool(/obj/item/stack/rods, list(src.loc, 3)) + getFromPool(/obj/item/stack/rods, src.loc, 3) if(BURN) new /obj/effect/decal/cleanable/ash(src.loc) // Turn it to ashes! qdel(src) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 1e06328564c..d95d9966b29 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -250,7 +250,7 @@ if(passed_smoke) smoke = passed_smoke else - smoke = getFromPool(/obj/effect/effect/smoke/chem, list(location, smoke_duration + rand(smoke_duration*-0.25, smoke_duration*0.25), T, I)) + smoke = getFromPool(/obj/effect/effect/smoke/chem, location, smoke_duration + rand(smoke_duration*-0.25, smoke_duration*0.25), T, I) if(chemholder.reagents.reagent_list.len) chemholder.reagents.trans_to_obj(smoke, chemholder.reagents.total_volume / dist, copy = 1) //copy reagents to the smoke so mob/breathe() can handle inhaling the reagents diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 73ea7cf3c67..b7d2acc5411 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -108,7 +108,7 @@ F.amount += amount return - F = getFromPool(/obj/effect/effect/foam, list(location, metal)) + F = getFromPool(/obj/effect/effect/foam, location, metal) F.amount = amount if(!metal) // don't carry other chemicals if a metal foam @@ -180,4 +180,4 @@ /obj/structure/foamedmetal/CanPass(atom/movable/mover, turf/target, height=1.5, air_group = 0) if(air_group) return 0 - return !density \ No newline at end of file + return !density diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 5265e05531a..02d66ed114d 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -101,7 +101,7 @@ O = loc for(var/i=0, iYou dissasembled the windoor assembly!" new /obj/item/stack/material/glass/reinforced(get_turf(src), 5) if(secure) - getFromPool(/obj/item/stack/rods, list(get_turf(src), 4)) + getFromPool(/obj/item/stack/rods, get_turf(src), 4) qdel(src) else user << "You need more welding fuel to dissassemble the windoor assembly." diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 043b912a588..dbacbd9ca34 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -151,7 +151,7 @@ if(busy == LAYING_EGGS) E = locate() in get_turf(src) if(!E) - getFromPool(/obj/effect/spider/eggcluster, list(loc, src)) + getFromPool(/obj/effect/spider/eggcluster, loc, src) fed-- busy = 0 stop_automated_movement = 0 From 3080c20428854fd41a58ca34ec14f4601b6a50b6 Mon Sep 17 00:00:00 2001 From: NanakoAC Date: Sun, 5 Mar 2017 00:07:37 +0000 Subject: [PATCH 10/55] Diona fixes and Tweaks (#1871) I'm currently in bugfixing mode to prepare for next update. This PR is a package of fixes for some outstanding issues related to diona that have caused complaints, and a few minor tweaks. Fixed diona not having a mouth. This wasn't intended, even in bay. It was caused by a fuckup with typing order. Although there were hacky fixes i could do, i opted for the most correct fix, which was re-pathing all diona external organs to be /obj/item/organ/external/BODYPART/diona, whereas before they were /obj/item/organ/external/diona/BODYPART This approach is the most flexible and future proof. Having all heads behave properly as heads is more important than having base behaviour for diona organs. That can be handled with vars and flags. This did involve duplicating quite a few vars to all that were part of the main class, but its worth it. Rebalanced Plant-b-gone, requested repeatedly by garn. In general it got heavily nerfed, but carefully tuned. It now slightly outdamages a diona's base regen rate, but not by much. Reagent permeability is also factored in now so equipment can protect against it. Some radium treatment will make it a non issue Also increased the click cooldown for spraybottles used on mobs. it was pretty broken at 4 dc. Fixed nymphs getting Tau Ceti Basic for free upon evolving. Now they'll only have it if they had it as a nymph. (this doesnt affect diona that directly join as gestalt) Added another ear slot for diona, so they can wear two headsets, or a mouse. Often requested Adjusted diona air consumption. They have a mechanic whereby they consume gases from the environment for nutrition. Ive just made this actually remove said gases. Consumption is significantly below the rate of replacement so it wont be an issue anywhere with a vent, but they can cause air alarms if they hang around too long in an unventilated room. Fixed a devouring bug where a creature could get stuck marked as devouring something (but not actually doing so) and be unable to start devouring it. Instead of rejection, trying to devour something you're already eating now cancels. --- .../living/carbon/alien/diona/progression.dm | 4 + code/modules/mob/living/carbon/diona_base.dm | 10 +- code/modules/mob/living/carbon/human/life.dm | 4 +- .../carbon/human/species/species_hud.dm | 3 +- .../carbon/human/species/station/station.dm | 22 +- code/modules/mob/living/devour.dm | 3 +- code/modules/organs/organ_alien.dm | 431 ------------------ code/modules/organs/subtypes/diona.dm | 92 ++-- .../Chemistry-Reagents-Toxins.dm | 17 +- .../reagents/reagent_containers/spray.dm | 7 +- html/changelogs/Nanako-DionaTweaks.yml | 40 ++ 11 files changed, 147 insertions(+), 486 deletions(-) delete mode 100644 code/modules/organs/organ_alien.dm create mode 100644 html/changelogs/Nanako-DionaTweaks.yml diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index d5990e00d32..73c4f521df3 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -66,6 +66,10 @@ for (var/obj/item/W in src.contents) src.drop_from_inventory(W) + //So that the nymph doesn't get basic for free when evolving. + if (adult.languages) + adult.languages.Cut() + for(var/datum/language/L in languages) adult.add_language(L.name) diff --git a/code/modules/mob/living/carbon/diona_base.dm b/code/modules/mob/living/carbon/diona_base.dm index 70ef8be96ac..11fd1775d32 100644 --- a/code/modules/mob/living/carbon/diona_base.dm +++ b/code/modules/mob/living/carbon/diona_base.dm @@ -81,19 +81,19 @@ var/list/diona_banned_languages = list( //But diona gestalts gain nutrition by extracting matter from gases in the air. If a gestalt spends a long time in space or on the asteroid, it may need to actually eat food //For simplicity, we'll assume any gas is fine, so they'll just absorb nutrition based on pressure if (!pressure) - return + return 0 if (DS.nutrient_organ) if (DS.nutrient_organ.is_broken()) - return + return 0 var/plus= (min(pressure,diona_max_pressure) / diona_max_pressure)* diona_nutrition_factor if (DS.nutrient_organ) if(DS.nutrient_organ.is_bruised()) plus *= 0.5 + plus = min(plus, max_nutrition - nutrition) nutrition += plus - if (nutrition > max_nutrition) - nutrition = max_nutrition + return plus*7 //The return value is the number of moles to remove from the local environment /mob/living/carbon/proc/diona_handle_temperature(var/datum/dionastats/DS) if (bodytemperature < TEMP_REGEN_STOP) @@ -270,7 +270,7 @@ var/list/diona_banned_languages = list( for (var/i in species.has_limbs) path = species.has_limbs[i]["path"] var/limb_exists = 0 - for (var/obj/item/organ/external/diona/B in H.organs) + for (var/obj/item/organ/external/B in H.organs) if (B.type == path) limb_exists = 1 break diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index aa26a0710d2..5a634750dc9 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -618,7 +618,7 @@ var/adjusted_pressure = calculate_affecting_pressure(pressure) if (is_diona()) - diona_handle_air(get_dionastats(), pressure) + environment.remove(diona_handle_air(get_dionastats(), pressure)) //Check for contaminants before anything else because we don't want to skip it. for(var/g in environment.gas) @@ -1461,7 +1461,7 @@ if (BITTEST(hud_updateflag, ID_HUD) && hud_list[ID_HUD]) var/image/holder = hud_list[ID_HUD] - + //The following function is found in code/defines/procs/hud.dm holder.icon_state = get_sec_hud_icon(src) hud_list[ID_HUD] = holder diff --git a/code/modules/mob/living/carbon/human/species/species_hud.dm b/code/modules/mob/living/carbon/human/species/species_hud.dm index d3591803be6..13354058ebb 100644 --- a/code/modules/mob/living/carbon/human/species/species_hud.dm +++ b/code/modules/mob/living/carbon/human/species/species_hud.dm @@ -57,7 +57,8 @@ gear = list( "i_clothing" = list("loc" = ui_iclothing, "name" = "Uniform", "slot" = slot_w_uniform, "state" = "center", "toggle" = 1), "o_clothing" = list("loc" = ui_shoes, "name" = "Suit", "slot" = slot_wear_suit, "state" = "suit", "toggle" = 1), - "l_ear" = list("loc" = ui_gloves, "name" = "Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), + "l_ear" = list("loc" = ui_glasses, "name" = "Left Ear", "slot" = slot_l_ear, "state" = "ears", "toggle" = 1), + "r_ear" = list("loc" = ui_gloves, "name" = "Right Ear", "slot" = slot_r_ear, "state" = "ears", "toggle" = 1), "head" = list("loc" = ui_oclothing, "name" = "Hat", "slot" = slot_head, "state" = "hair", "toggle" = 1), "suit storage" = list("loc" = ui_sstore1, "name" = "Suit Storage", "slot" = slot_s_store, "state" = "suitstore"), "back" = list("loc" = ui_back, "name" = "Back", "slot" = slot_back, "state" = "back"), diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 26793c6dfcc..5498252df0e 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -237,17 +237,17 @@ ) has_limbs = list( - "chest" = list("path" = /obj/item/organ/external/diona/chest), - "groin" = list("path" = /obj/item/organ/external/diona/groin), - "head" = list("path" = /obj/item/organ/external/diona/head), - "l_arm" = list("path" = /obj/item/organ/external/diona/arm), - "r_arm" = list("path" = /obj/item/organ/external/diona/arm/right), - "l_leg" = list("path" = /obj/item/organ/external/diona/leg), - "r_leg" = list("path" = /obj/item/organ/external/diona/leg/right), - "l_hand" = list("path" = /obj/item/organ/external/diona/hand), - "r_hand" = list("path" = /obj/item/organ/external/diona/hand/right), - "l_foot" = list("path" = /obj/item/organ/external/diona/foot), - "r_foot" = list("path" = /obj/item/organ/external/diona/foot/right) + "chest" = list("path" = /obj/item/organ/external/chest/diona), + "groin" = list("path" = /obj/item/organ/external/groin/diona), + "head" = list("path" = /obj/item/organ/external/head/diona), + "l_arm" = list("path" = /obj/item/organ/external/arm/diona), + "r_arm" = list("path" = /obj/item/organ/external/arm/right/diona), + "l_leg" = list("path" = /obj/item/organ/external/leg/diona), + "r_leg" = list("path" = /obj/item/organ/external/leg/right/diona), + "l_hand" = list("path" = /obj/item/organ/external/hand/diona), + "r_hand" = list("path" = /obj/item/organ/external/hand/right/diona), + "l_foot" = list("path" = /obj/item/organ/external/foot/diona), + "r_foot" = list("path" = /obj/item/organ/external/foot/right/diona) ) //inherent_verbs = list() diff --git a/code/modules/mob/living/devour.dm b/code/modules/mob/living/devour.dm index c68c4f99006..80b1795af66 100644 --- a/code/modules/mob/living/devour.dm +++ b/code/modules/mob/living/devour.dm @@ -47,7 +47,8 @@ return 0 if (devouring == victim) - src << span("danger","You're already eating that!.") + src << span("notice","You stop eating [victim].") + devouring = null return if (ishuman(src)) diff --git a/code/modules/organs/organ_alien.dm b/code/modules/organs/organ_alien.dm deleted file mode 100644 index a248455e16f..00000000000 --- a/code/modules/organs/organ_alien.dm +++ /dev/null @@ -1,431 +0,0 @@ -/proc/spawn_diona_nymph_from_organ(var/obj/item/organ/organ) - if(!istype(organ)) - return 0 - - //This is a terrible hack and I should be ashamed. - var/datum/seed/diona = plant_controller.seeds["diona"] - if(!diona) - return 0 - - spawn(1) // So it has time to be thrown about by the gib() proc. - var/mob/living/carbon/alien/diona/D = new(get_turf(organ)) - diona.request_player(D) - spawn(60) - if(D) - if(!D.ckey || !D.client) - D.death() - return 1 - -/obj/item/organ/external/diona - name = "tendril" - cannot_break = 1 - amputation_point = "branch" - joint = "structural ligament" - dislocated = -1 - status = ORGAN_PLANT - - - -/obj/item/organ/external/diona/chest - name = "core trunk" - limb_name = "chest" - icon_name = "torso" - health = 200 - min_broken_damage = 50 - body_part = UPPER_TORSO - vital = 1 - cannot_amputate = 1 - parent_organ = null - -/obj/item/organ/external/diona/groin - name = "fork" - limb_name = "groin" - icon_name = "groin" - health = 100 - min_broken_damage = 50 - body_part = LOWER_TORSO - parent_organ = "chest" - -/obj/item/organ/external/diona/arm - name = "left upper tendril" - limb_name = "l_arm" - icon_name = "l_arm" - health = 35 - min_broken_damage = 20 - body_part = ARM_LEFT - parent_organ = "chest" - can_grasp = 1 - -/obj/item/organ/external/diona/arm/right - name = "right upper tendril" - limb_name = "r_arm" - icon_name = "r_arm" - body_part = ARM_RIGHT - -/obj/item/organ/external/diona/leg - name = "left lower tendril" - limb_name = "l_leg" - icon_name = "l_leg" - health = 35 - min_broken_damage = 20 - body_part = LEG_LEFT - icon_position = LEFT - parent_organ = "groin" - can_stand = 1 - -/obj/item/organ/external/diona/leg/right - name = "right lower tendril" - limb_name = "r_leg" - icon_name = "r_leg" - body_part = LEG_RIGHT - icon_position = RIGHT - -/obj/item/organ/external/diona/foot - name = "left foot" - limb_name = "l_foot" - icon_name = "l_foot" - health = 20 - min_broken_damage = 10 - body_part = FOOT_LEFT - icon_position = LEFT - parent_organ = "l_leg" - can_stand = 1 - -/obj/item/organ/external/diona/foot/right - name = "right foot" - limb_name = "r_foot" - icon_name = "r_foot" - body_part = FOOT_RIGHT - icon_position = RIGHT - parent_organ = "r_leg" - joint = "right ankle" - amputation_point = "right ankle" - -/obj/item/organ/external/diona/hand - name = "left grasper" - limb_name = "l_hand" - icon_name = "l_hand" - health = 30 - min_broken_damage = 15 - body_part = HAND_LEFT - parent_organ = "l_arm" - can_grasp = 1 - -/obj/item/organ/external/diona/hand/right - name = "right grasper" - limb_name = "r_hand" - icon_name = "r_hand" - body_part = HAND_RIGHT - parent_organ = "r_arm" - -/obj/item/organ/external/diona/head - limb_name = "head" - icon_name = "head" - name = "head" - health = 50 - min_broken_damage = 25 - body_part = HEAD - parent_organ = "chest" - -/obj/item/organ/external/diona/head/removed() - if(owner) - owner.u_equip(owner.head) - owner.u_equip(owner.l_ear) - ..() - -//DIONA ORGANS. -/obj/item/organ/external/diona/removed() - var/mob/living/carbon/human/H = owner - ..() - if(!istype(H) || !H.organs || !H.organs.len) - H.death()//if you somehow remove all of a gestalt's organs, it will dissolve into nymphs - - if (H.is_diona()) - spawn(1) - H.update_dionastats()//This ensures that the dionastats registers the removal of an organ - -/obj/item/organ/diona/process() - - if(loc != owner) - owner = null - - //Set/remove bad organ status, only every 10 ticks to reduce processing - //Unfortunately internal organs aren't a special subclass so this runs on every organ - if (owner && owner.life_tick % 10 == 0) - internal_set_bad() - - germ_level = 0//Diona don't get infections or organ decay - - -/obj/item/organ/diona/strata - name = "neural strata" - parent_organ = "chest" - organ_tag = "neural strata" - -/obj/item/organ/diona/bladder - name = "gas bladder" - parent_organ = "head" - organ_tag = "gas bladder" - -/obj/item/organ/diona/polyp - name = "polyp segment" - parent_organ = "groin" - organ_tag = "polyp segment" - -/obj/item/organ/diona/ligament - name = "anchoring ligament" - parent_organ = "groin" - organ_tag = "anchoring ligament" - -/obj/item/organ/diona - name = "diona nymph" - icon = 'icons/obj/objects.dmi' - icon_state = "nymph" - organ_tag = "special" // Turns into a nymph instantly, no transplanting possible. - -/obj/item/organ/diona/removed(var/mob/living/user) - var/mob/living/carbon/human/H = owner - ..() - if(!istype(H) || !H.organs || !H.organs.len) - H.death() - -/obj/item/organ/diona/removed() - var/mob/living/carbon/human/H = owner - ..() - if(!istype(H) || !H.organs || !H.organs.len) - H.death()//if you somehow remove all of a gestalt's organs, it will dissolve into nymphs - - if (H.is_diona()) - spawn(1) - H.update_dionastats()//This ensures that the dionastats registers the removal of an organ - - -// These are different to the standard diona organs as they have a purpose in other -// species (absorbing radiation and light respectively) -/obj/item/organ/diona/nutrients - name = "nutrient channel" - parent_organ = "chest" - organ_tag = "nutrient channel" - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - -/obj/item/organ/diona/node - name = "response node" - parent_organ = "head" - organ_tag = "response node" - icon = 'icons/mob/alien.dmi' - icon_state = "claw" - - -//CORTICAL BORER ORGANS. -/obj/item/organ/borer - name = "cortical borer" - parent_organ = "head" - vital = 1 - -/obj/item/organ/borer/process() - - // Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss. - for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine")) - if(owner.reagents.get_reagent_amount(chem) < 3) - owner.reagents.add_reagent(chem, 5) - - // They're also super gross and ooze ichor. - if(prob(5)) - var/mob/living/carbon/human/H = owner - if(!istype(H)) - return - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list - blood_splatter(H,B,1) - var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner) - if(goo) - goo.name = "husk ichor" - goo.desc = "It's thick and stinks of decay." - goo.basecolor = "#412464" - goo.update_icon() - -/obj/item/organ/borer - name = "cortical borer" - icon = 'icons/obj/objects.dmi' - icon_state = "borer" - organ_tag = "brain" - desc = "A disgusting space slug." - -/obj/item/organ/borer/removed(var/mob/living/user) - - ..() - - var/mob/living/simple_animal/borer/B = owner.has_brain_worms() - if(B) - B.leave_host() - B.ckey = owner.ckey - - spawn(0) - qdel(src) - -//XENOMORPH ORGANS -/obj/item/organ/xenos/eggsac - name = "egg sac" - parent_organ = "groin" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - parent_organ = "chest" - var/stored_plasma = 0 - var/max_plasma = 500 - -/obj/item/organ/xenos/plasmavessel/queen - name = "bloated plasma vessel" - stored_plasma = 200 - max_plasma = 500 - -/obj/item/organ/xenos/plasmavessel/sentinel - stored_plasma = 100 - max_plasma = 250 - -/obj/item/organ/xenos/plasmavessel/hunter - name = "tiny plasma vessel" - stored_plasma = 100 - max_plasma = 150 - -/obj/item/organ/xenos/acidgland - name = "acid gland" - parent_organ = "head" - -/obj/item/organ/xenos/hivenode - name = "hive node" - parent_organ = "chest" - -/obj/item/organ/xenos/resinspinner - name = "resin spinner" - parent_organ = "head" - -/obj/item/organ/xenos - name = "xeno organ" - icon = 'icons/effects/blood.dmi' - desc = "It smells like an accident in a chemical factory." - -/obj/item/organ/xenos/eggsac - name = "egg sac" - icon_state = "xgibmid1" - organ_tag = "egg sac" - -/obj/item/organ/xenos/plasmavessel - name = "plasma vessel" - icon_state = "xgibdown1" - organ_tag = "plasma vessel" - -/obj/item/organ/xenos/acidgland - name = "acid gland" - icon_state = "xgibtorso" - organ_tag = "acid gland" - -/obj/item/organ/xenos/hivenode - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "hive node" - -/obj/item/organ/xenos/resinspinner - name = "hive node" - icon_state = "xgibmid2" - organ_tag = "resin spinner" - -//VOX ORGANS. -/obj/item/organ/stack - name = "cortical stack" - parent_organ = "head" - robotic = 2 - vital = 1 - var/backup_time = 0 - var/datum/mind/backup - -/obj/item/organ/stack/process() - if(owner && owner.stat != 2 && !is_broken()) - backup_time = world.time - if(owner.mind) backup = owner.mind - -/obj/item/organ/stack/vox - -/obj/item/organ/stack/vox/stack - -/obj/item/organ/stack - name = "cortical stack" - icon_state = "brain-prosthetic" - organ_tag = "stack" - robotic = 2 - -/obj/item/organ/stack/vox - name = "vox cortical stack" - -// Slime limbs. -/obj/item/organ/external/chest/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/groin/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/arm/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/arm/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/leg/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/leg/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/foot/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/foot/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/hand/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/hand/right/slime - cannot_break = 1 - dislocated = -1 - -/obj/item/organ/external/head/slime - cannot_break = 1 - dislocated = -1 - -/*//VAURCA ORGANS -/obj/item/organ/vaurca/neuralsocket - name = "neural socket" - organ_tag = "neural socket" - icon = 'icons/mob/alien.dmi' - icon_state = "neural_socket" - -/obj/item/organ/vaurca/neuralsocket/removed() - return - -/obj/item/organ/vaurca/breathingapparatus - name = "breathing apparatus" - organ_tag = "breathing apparatus" - icon = 'icons/mob/alien.dmi' - icon_state = "breathing_app" - -/obj/item/organ/vaurca/breathingapparatus/removed() - return - -/obj/item/organ/vaurca/tracheae - name = "tracheae" - organ_tag = "tracheae" - icon = 'icons/mob/alien.dmi' - icon_state = "tracheae" -/obj/item/organ/vaurca/tracheae/removed() - return */ diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index 61652aafd44..6b9b7975c9c 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -17,14 +17,17 @@ D.death() return 1 + +//Probable future TODO: Refactor diona organs to be /obj/item/organ/external/bodypart/diona +//Having them not inherit from specific bodypart classes is a problem + /obj/item/organ/external/diona name = "tendril" cannot_break = 1 - amputation_point = "branch" - joint = "structural ligament" - dislocated = -1 -/obj/item/organ/external/diona/chest + + +/obj/item/organ/external/chest/diona name = "core trunk" limb_name = "chest" icon_name = "torso" @@ -35,8 +38,12 @@ vital = 1 cannot_amputate = 1 parent_organ = null - -/obj/item/organ/external/diona/groin + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" +//------ +/obj/item/organ/external/groin/diona name = "fork" limb_name = "groin" icon_name = "groin" @@ -45,8 +52,12 @@ w_class = 4 body_part = LOWER_TORSO parent_organ = "chest" + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/arm +/obj/item/organ/external/arm/diona name = "left upper tendril" limb_name = "l_arm" icon_name = "l_arm" @@ -56,14 +67,22 @@ body_part = ARM_LEFT parent_organ = "chest" can_grasp = 1 + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/arm/right +/obj/item/organ/external/arm/right/diona name = "right upper tendril" limb_name = "r_arm" icon_name = "r_arm" body_part = ARM_RIGHT + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/leg +/obj/item/organ/external/leg/diona name = "left lower tendril" limb_name = "l_leg" icon_name = "l_leg" @@ -74,15 +93,23 @@ icon_position = LEFT parent_organ = "groin" can_stand = 1 + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/leg/right +/obj/item/organ/external/leg/right/diona name = "right lower tendril" limb_name = "r_leg" icon_name = "r_leg" body_part = LEG_RIGHT icon_position = RIGHT + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/foot +/obj/item/organ/external/foot/diona name = "left foot" limb_name = "l_foot" icon_name = "l_foot" @@ -93,8 +120,12 @@ icon_position = LEFT parent_organ = "l_leg" can_stand = 1 + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/foot/right +/obj/item/organ/external/foot/right/diona name = "right foot" limb_name = "r_foot" icon_name = "r_foot" @@ -103,8 +134,12 @@ parent_organ = "r_leg" joint = "right ankle" amputation_point = "right ankle" + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/hand +/obj/item/organ/external/hand/diona name = "left grasper" limb_name = "l_hand" icon_name = "l_hand" @@ -114,15 +149,23 @@ body_part = HAND_LEFT parent_organ = "l_arm" can_grasp = 1 + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/hand/right +/obj/item/organ/external/hand/right/diona name = "right grasper" limb_name = "r_hand" icon_name = "r_hand" body_part = HAND_RIGHT parent_organ = "r_arm" + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/head +/obj/item/organ/external/head/diona limb_name = "head" icon_name = "head" name = "head" @@ -131,21 +174,12 @@ w_class = 3 body_part = HEAD parent_organ = "chest" + cannot_break = 1 + dislocated = -1 + joint = "structural ligament" + amputation_point = "branch" -/obj/item/organ/external/diona/head/removed() - if(owner) - owner.u_equip(owner.head) - owner.u_equip(owner.l_ear) - ..() -//DIONA ORGANS. -/obj/item/organ/external/diona/removed() - var/mob/living/carbon/human/H = owner - ..() - if(!istype(H) || !H.organs || !H.organs.len) - H.death() - if(prob(50) && spawn_diona_nymph(get_turf(src))) - qdel(src) /obj/item/organ/diona/process() return @@ -154,7 +188,7 @@ name = "neural strata" parent_organ = "chest" organ_tag = "neural strata" - + /obj/item/organ/diona/bladder name = "gas bladder" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 8f7d494e6b0..69495a4bd43 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -176,6 +176,13 @@ strength = 0.5 // It's not THAT poisonous. color = "#664330" +/datum/reagent/toxin/fertilizer/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_DIONA) + M.nutrition += removed*3 + //Fertilizer is good for plants + else + ..() + /datum/reagent/toxin/fertilizer/eznutrient name = "EZ Nutrient" id = "eznutrient" @@ -195,7 +202,7 @@ reagent_state = LIQUID color = "#49002E" strength = 4 - metabolism = REM * 0.35 + metabolism = REM*1.5 /datum/reagent/toxin/plantbgone/touch_turf(var/turf/T) if(istype(T, /turf/simulated/wall)) @@ -212,12 +219,12 @@ /datum/reagent/toxin/plantbgone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) - M.adjustToxLoss(50 * removed) + M.adjustToxLoss(8 * removed) +//Affect touch automatically transfers to affect_blood, so we'll apply the damage there, after accounting for permeability /datum/reagent/toxin/plantbgone/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) - ..() - if(alien == IS_DIONA) - M.adjustToxLoss(50 * removed) + removed *= M.reagent_permeability() + affect_blood(M, alien, removed*0.5) /datum/reagent/acid/polyacid name = "Polytrinic acid" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index ebb346dc6e8..06c6bd648ac 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -33,6 +33,11 @@ if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/closet) || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) return + if(istype(A, /mob)) + user.setClickCooldown(25) + else + user.setClickCooldown(4) + if(istype(A, /spell)) return @@ -53,7 +58,7 @@ playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) - user.setClickCooldown(4) + if(reagents.has_reagent("sacid")) message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].") diff --git a/html/changelogs/Nanako-DionaTweaks.yml b/html/changelogs/Nanako-DionaTweaks.yml new file mode 100644 index 00000000000..4604dd789f3 --- /dev/null +++ b/html/changelogs/Nanako-DionaTweaks.yml @@ -0,0 +1,40 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Nanako + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Fixed diona gestalts not having a mouth." + - bugfix: "Nymphs which evolve into gestalts no longer get Tau Ceti Basic for free. They will only have it if they knew it as a nymph." + - tweak: "Diona gestalts now have a second ear slot." + - tweak: "Gestalts now remove air from the atmosphere when converting it to nutrition." + - tweak: "Rebalanced plant-b-gone versus diona. Also diona can now eat fertilizer." From 90b8a1859432bb9483f7cf69cef49e46c6f983a6 Mon Sep 17 00:00:00 2001 From: BlueNexus Date: Sun, 5 Mar 2017 10:27:25 +0000 Subject: [PATCH 11/55] A circle is 360 degrees (#1882) Just in case you weren't aware. (Bugfix) --- code/_helpers/type2type.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm index 232f696a719..39c33cadfce 100644 --- a/code/_helpers/type2type.dm +++ b/code/_helpers/type2type.dm @@ -222,7 +222,7 @@ proc/tg_list2text(list/list, glue=",") // Converts an angle (degrees) into an ss13 direction /proc/angle2dir(var/degree) - degree = (degree + 22.5) % 365 // 22.5 = 45 / 2 + degree = (degree + 22.5) % 360 // 22.5 = 45 / 2 if (degree < 45) return NORTH if (degree < 90) return NORTHEAST if (degree < 135) return EAST From 73c29bd5a7d44ad5a27bb34e7b473c4884dc4e94 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 5 Mar 2017 07:14:28 -0600 Subject: [PATCH 12/55] Miscellaneous Fixes (#1868) changes: Engineering now actually gets engineering-type alert consoles instead of the non-functional base type. Lighting is no longer broken by shuttles. The ERT shuttle autoannouncer should no longer cause lighting runtimes. Fixed some bad newlines in some character setup help texts. Custom loadout tweaks now properly write to SQL. Custom loadout is now saved as JSON. Players are now shown a notice when the server was unable to load their custom loadout. Drowsyness is now clamped to zero. Added some new tips to the example. Tweaked some tips' grammar. Removed some tips that do not apply to our code base. Probably fixes embraced vampire thralls not getting vampire verbs. Fixes #1844. Fixes #1835. Probably fixes #1687. Probably fixes #1824. Fixes #1839 --- code/_helpers/unsorted.dm | 8 --- code/controllers/Processes/effects.dm | 4 +- code/game/antagonist/antagonist_add.dm | 7 +- code/game/gamemodes/vampire/vampire_powers.dm | 4 ++ .../preference_setup/general/01_basic.dm | 6 +- .../preference_setup/loadout/loadout.dm | 18 +++++- code/modules/client/preferences.dm | 4 +- code/modules/effects/effect_system.dm | 6 ++ code/modules/effects/sparks/spawner.dm | 12 ++-- code/modules/effects/sparks/visuals.dm | 13 ++-- code/modules/effects/visual_effect.dm | 7 +- code/modules/lighting/lighting_source.dm | 3 + code/modules/mob/living/carbon/human/life.dm | 13 ++-- config/example/tips.txt | 64 ++++++++++--------- html/changelogs/lohikar-PR-1868.yml | 5 ++ maps/exodus-1.dmm | 8 +-- maps/exodus-5.dmm | 2 +- 17 files changed, 103 insertions(+), 81 deletions(-) create mode 100644 html/changelogs/lohikar-PR-1868.yml diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 617d8be87a4..4b7e24a93f7 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -794,8 +794,6 @@ proc/GaussRandRound(var/sigma,var/roundto) var/old_icon1 = T.icon var/old_overlays = T.overlays.Copy() var/old_underlays = T.underlays.Copy() - if (T.dynamic_lighting && T.lighting_overlay) - T.lighting_overlay.forceMove(B, harderforce = TRUE) var/turf/X = B.ChangeTurf(T.type) X.set_dir(old_dir1) @@ -851,12 +849,6 @@ proc/GaussRandRound(var/sigma,var/roundto) if(!istype(M,/mob) || istype(M, /mob/eye)) continue // If we need to check for more mobs, I'll add a variable M.loc = X -// var/area/AR = X.loc - -// if(AR.lighting_use_dynamic) //TODO: rewrite this code so it's not messed by lighting ~Carn -// X.opacity = !X.opacity -// X.SetOpacity(!X.opacity) - toupdate += X if(turftoleave) diff --git a/code/controllers/Processes/effects.dm b/code/controllers/Processes/effects.dm index 00d79a9c9b8..a9e8efe2f62 100644 --- a/code/controllers/Processes/effects.dm +++ b/code/controllers/Processes/effects.dm @@ -37,7 +37,7 @@ var/datum/controller/process/effects/effect_master effects_objects += E if (EFFECT_DESTROY) - qdel(E) + returnToPool(E) F_SCHECK @@ -61,7 +61,7 @@ var/datum/controller/process/effects/effect_master if (EFFECT_DESTROY) effects_visuals -= V V.end() - qdel(V) + returnToPool(V) F_SCHECK diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm index 6eb6a230083..9f9c828b59a 100644 --- a/code/game/antagonist/antagonist_add.dm +++ b/code/game/antagonist/antagonist_add.dm @@ -45,7 +45,7 @@ update_icons_added(player) return 1 -/datum/antagonist/proc/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) +/datum/antagonist/proc/remove_antagonist(var/datum/mind/player, var/show_message = TRUE, var/implanted) if(!istype(player)) return 0 @@ -53,14 +53,15 @@ player.current.verbs -= faction_verb if(player in current_antagonists) - player.current << "You are no longer a [role_text]!" + if (show_message) + player.current << "You are no longer a [role_text]!" current_antagonists -= player faction_members -= player player.special_role = null update_icons_removed(player) BITSET(player.current.hud_updateflag, SPECIALROLE_HUD) - if (!is_special_character(player)) + if (!is_special_character(player) && !player.current.client.holder) player.current.client.verbs -= /client/proc/aooc return 1 diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm index e483bb0c30a..341d2ba8e1d 100644 --- a/code/game/gamemodes/vampire/vampire_powers.dm +++ b/code/game/gamemodes/vampire/vampire_powers.dm @@ -850,6 +850,10 @@ if (alert(src, choice_text, "Choices", "Yes", "No") == "No") src << "[denial_response]" return + + vampire_thrall.remove_antagonist(T.mind, 0, 0) + qdel(draining_vamp) + draining_vamp = null else src << "You feel corruption running in [T.name]'s blood. Much like yourself, \he[T] is already a spawn of the Veil, and cannot be Embraced." return diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 71037aade69..0d2d0e7262c 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -105,12 +105,12 @@ return TOPIC_NOACTION else if(href_list["namehelp"]) - alert(user, "Due to game mechanics, you are no longer able to edit the name for this character. The grace period offered is 5 days since the character's initial save.

If you have a need to change the character's name, or further questions regarding this policy, please contact an administrator.") + alert(user, "Due to game mechanics, you are no longer able to edit the name for this character. The grace period offered is 5 days since the character's initial save.\n\nIf you have a need to change the character's name, or further questions regarding this policy, please contact an administrator.") return TOPIC_NOACTION else if(href_list["random_name"]) if (!pref.can_edit_name) - alert(user, "You can no longer edit the name of your character.

If there is a legitimate need, please contact an administrator regarding the matter.") + alert(user, "You can no longer edit the name of your character.\n\nIf there is a legitimate need, please contact an administrator regarding the matter.") return TOPIC_NOACTION pref.real_name = random_name(pref.gender, pref.species) @@ -141,4 +141,4 @@ pref.metadata = sanitize(new_metadata) return TOPIC_REFRESH - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index bffc269c5a4..bc567f41f44 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -34,6 +34,7 @@ var/list/gear_datums = list() name = "Loadout" sort_order = 1 var/current_tab = "General" + var/gear_reset = FALSE /datum/category_item/player_setup_item/loadout/load_character(var/savefile/S) S["gear"] >> pref.gear @@ -51,7 +52,7 @@ var/list/gear_datums = list() return list("ss13_characters" = list("gear", "id" = 1, "ckey" = 1)) /datum/category_item/player_setup_item/loadout/gather_save_parameters() - return list(":gear" = list2params(pref.gear), ":id" = pref.current_character, ":ckey" = pref.client.ckey) + return list(":gear" = json_encode(pref.gear), ":id" = pref.current_character, ":ckey" = pref.client.ckey) /datum/category_item/player_setup_item/loadout/proc/valid_gear_choices(var/max_cost) . = list() @@ -66,9 +67,18 @@ var/list/gear_datums = list() . += gear_name /datum/category_item/player_setup_item/loadout/sanitize_character(var/sql_load = 0) - if (sql_load) - pref.gear = params2list(pref.gear) + gear_reset = FALSE + if (pref.gear && istext(pref.gear)) + try + pref.gear = json_decode(pref.gear) + catch + log_debug("SQL_CHAR: Unable to load preferences for client [pref.client ? pref.client.ckey : "UNKNOWN"].") + pref.gear = list() + gear_reset = TRUE + else + pref.gear = list() + gear_reset = TRUE var/mob/preference_mob = preference_mob() if(!islist(pref.gear)) @@ -106,6 +116,8 @@ var/list/gear_datums = list() fcolor = "#E67300" . = list() . += "" + if (gear_reset) + . += "" . += "" . += "
Your loadout failed to load and will be reset if you save this slot.
[total_cost]/[MAX_GEAR_COST] loadout points spent. \[Clear Loadout\]
" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 5455a4370ed..045f2f9398c 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -62,8 +62,8 @@ datum/preferences var/species = "Human" //Species datum to use. var/species_preview //Used for the species selection window. var/list/alternate_languages = list() //Secondary language(s) - var/list/language_prefixes = list() //Kanguage prefix keys - var/list/gear //Custom/fluff item loadout. + var/list/language_prefixes = list() // Language prefix keys + var/list/gear // Custom/fluff item loadout. //Some faction information. var/home_system = "Unset" //System of birth. diff --git a/code/modules/effects/effect_system.dm b/code/modules/effects/effect_system.dm index 2c6a985de9c..a68dcecb1ca 100644 --- a/code/modules/effects/effect_system.dm +++ b/code/modules/effects/effect_system.dm @@ -29,3 +29,9 @@ /datum/effect_system/proc/bind(var/target) holder = target + +/datum/effect_system/proc/set_loc(var/atom/movable/loc) + if (istype(loc, /turf/)) + location = loc + else + location = get_turf(loc) diff --git a/code/modules/effects/sparks/spawner.dm b/code/modules/effects/sparks/spawner.dm index dc195a04328..6f3790b866e 100644 --- a/code/modules/effects/sparks/spawner.dm +++ b/code/modules/effects/sparks/spawner.dm @@ -5,13 +5,10 @@ // Using the spark procs is preferred to directly instancing this. /datum/effect_system/sparks/New(var/atom/movable/loc, var/start_immediately = TRUE, var/amt = 1, var/list/spread_dirs = list()) - if(!loc || loc.gcDestroyed) + if(QDELETED(loc)) return - if (istype(loc, /turf)) - location = loc - else - holder = loc + set_loc(loc) if (amt) amount = amt @@ -34,8 +31,9 @@ var/total_sparks = 1 if (location) - var/obj/visual_effect/sparks/S = new /obj/visual_effect/sparks(location, src, 0) //Trigger one on the tile it's on + var/obj/visual_effect/sparks/S = getFromPool(/obj/visual_effect/sparks, location, src, 0) //Trigger one on the tile it's on S.start() + playsound(location, "sparks", 100, 1) effects_visuals += S // Queue it. while (total_sparks <= src.amount) @@ -47,7 +45,7 @@ else direction = pick(src.spread) - S = new /obj/visual_effect/sparks(location, src) + S = getFromPool(/obj/visual_effect/sparks, location, src) S.start(direction) effects_visuals += S total_sparks++ diff --git a/code/modules/effects/sparks/visuals.dm b/code/modules/effects/sparks/visuals.dm index 185a46f5af1..684cb3d78b1 100644 --- a/code/modules/effects/sparks/visuals.dm +++ b/code/modules/effects/sparks/visuals.dm @@ -1,19 +1,13 @@ // -- Spark visual_effect -- /obj/visual_effect/sparks name = "sparks" - icon = 'icons/effects/effects.dmi' - //icon_state = "sparks" + icon_state = "sparks" anchored = 1 mouse_opacity = 0 - live_icon_state = "sparks" /obj/visual_effect/sparks/New(var/turf/loc) ..(loc) - life_ticks = rand(2,10) - -/obj/visual_effect/sparks/resetVariables() - . = ..() - life_ticks = rand(2,10) + life_ticks = rand(5,10) /obj/visual_effect/sparks/tick() . = ..() @@ -22,6 +16,9 @@ if(T) T.hotspot_expose(1000, 100) + if (life_ticks < 2) + animate(src, alpha = 0, time = 2, easing = SINE_EASING | EASE_IN) + /obj/visual_effect/sparks/start(var/direction) ..() if (direction) diff --git a/code/modules/effects/visual_effect.dm b/code/modules/effects/visual_effect.dm index a8caa85fdc2..454d1e3c2fe 100644 --- a/code/modules/effects/visual_effect.dm +++ b/code/modules/effects/visual_effect.dm @@ -1,23 +1,22 @@ /obj/visual_effect name = "effect" + icon = 'icons/effects/effects.dmi' anchored = 1 simulated = 0 mouse_opacity = 0 var/life_ticks // How many ticks this effect will life before it stops processing. var/life_ticks_max // The high limit for the random tick picker. var/life_ticks_min // The low limit for the random tick picker. - var/live_icon_state // The icon-state to use when this object is shown to the user. /obj/visual_effect/New(var/life_min = 3 SECONDS, var/life_max = 5 SECONDS) ..() life_ticks_min = life_min life_ticks_max = life_max life_ticks = rand(life_ticks_min, life_ticks_max) + flick(icon_state, src) // Called when the visual_effect is manifested. /obj/visual_effect/proc/start() - if (live_icon_state) - icon_state = live_icon_state // Called every effects processor tick. Return value determines what the process does to this object. /obj/visual_effect/proc/tick() @@ -30,8 +29,6 @@ // Called just before the visual_effect is returned to the pool. /obj/visual_effect/proc/end() loc = null - if (live_icon_state) - icon_state = null /obj/visual_effect/Destroy() // ¯\_(ツ)_/¯ diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index c4f371b2029..3c8987a3287 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -332,6 +332,9 @@ var/static/update_gen = 1 applied = 1 + if (!source_turf) + return + var/Tx var/Ty var/Sx = source_turf.x diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 5a634750dc9..674304f1e33 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1055,11 +1055,14 @@ handle_statuses() if (drowsyness) - drowsyness-- - eye_blurry = max(2, eye_blurry) - if (prob(5)) - sleeping += 1 - Paralyse(5) + if (drowsyness < 0) + drowsyness = 0 + else + drowsyness-- + eye_blurry = max(2, eye_blurry) + if (prob(5)) + sleeping += 1 + Paralyse(5) confused = max(0, confused - 1) diff --git a/config/example/tips.txt b/config/example/tips.txt index 1291e1d4240..5683ad344bc 100644 --- a/config/example/tips.txt +++ b/config/example/tips.txt @@ -12,11 +12,11 @@ You can grab someone by clicking on them with the grab intent, then upgrade the Holding alt and left clicking a tile will allow you to see its contents in the top right window pane, which is much faster than right clicking. The resist button will allow you to resist out of handcuffs, being buckled to a chair or bed, out of locked lockers and more. Whenever you're stuck, try resisting! You can move an item out of the way by dragging it and then clicking on an adjacent tile with an empty hand. -Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using.There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more! +Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more! As the Captain, you are one of the highest priority targets on the station. Everything from revolutions, to nuclear operatives, to traitors that need to rob you of your unique lasgun or your life are things to worry about. As the Captain, you have absolute access and control over the station, but this does not mean that being a horrible person won't result in mutiny and a ban. As the Chief Medical Officer, your hypospray is like an instant injection syringe that can hold 30 units as opposed to the standard 15. -As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and EMTs during a nuclear emergency, blob infestation, or some other crisis to keep people alive and fighting. +As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and EMTs during a pirate raid, blob infestation, or some other crisis to keep people alive and fighting. As a Medical Doctor, you can attempt to drain blood from a husk with a syringe to determine the cause. If you can extract blood, it was caused by extreme temperatures or lasers, if there is no blood to extract, it was caused by something unnatural. As a Medical Doctor, you can surgically implant or extract things from people's chests. This can range from putting in a bomb to pulling out an alien larva. As a Medical Doctor, you must target the correct limb and be on help intent when trying to perform surgery on someone. @@ -24,8 +24,8 @@ As a Chemist, there are dozens of chemicals that can heal, and even more that ca As the Virologist, you only require small amounts of vaccine to heal a sick patient. Work with the Chemist to distribute your cures more efficiently. As the Research Director, you can take AIs out of their cores by loading them into an intelliCard, and then from there into an AI system integrity restorer computer to revive and/or repair them. As the Research Director, you can lock down cyborgs instead of blowing them up. Then you can have their laws reset or if that doesn't work, safely dismantled. -As a Xenoscientist, you can inject yourself with the mutation toxin extracted from green slimes to become a slime person, who will never be attacked by slimes! -As a Xenoscientist, you can maximize the number of uses you get out of a slime by feeding it slime steroid, created from purple slimes, while alive. You can then apply extract enhancer, created from cerulean slimes, on each extract. +As a Xenobiologist, you can inject yourself with the mutation toxin extracted from green slimes to become a slime person, who will never be attacked by slimes! +As a Xenobiologist, you can maximize the number of uses you get out of a slime by feeding it slime steroid, created from purple slimes, while alive. You can then apply extract enhancer, created from cerulean slimes, on each extract. As a Scientist, researchable machine parts can seriously improve the efficiency and speed of machines around the station. In some cases, it can even unlock new functions. As a Scientist, the teleporter in Misc research can be set-up to teleport across the whole station! All you need to do is crack the formula. As a Roboticist, you can repair your cyborgs with a welding tool. If they have taken burn damage from lasers, you can remove their battery, expose the wiring with a screwdriver and replace their wires with a cable coil. @@ -40,8 +40,6 @@ As the Chief Engineer, you can rename areas or create entirely new ones using yo As the Research Director, you can spy on and even forge PDA communications with the message monitor console! The key is in your office. As an Engineer, the supermatter shard is an extremely dangerous piece of equipment: touching it will disintegrate you. As an Engineer, you can electrify grilles by placing wire "nodes" beneath them: the big seemingly unconnected bulges from a half completed wiring job. -As an Engineer, you can power the station solely with the solar arrays. While uninteresting, it is a much safer alternative to most other engines. -As an Engineer, you can repair windows by using a welding tool on them while on any intent other than harm. As an Engineer, you can lock emitters using your ID card to prevent others from disabling them. As an Atmospheric Technician, you can't unwrench a pipe if the pressure within is too high. As the Head of Security, you are expected to coordinate your security force to handle any threat that comes to the station. Sometimes it means making use of the armory to handle a blob, sometimes it means being ruthless during a revolution or cult. @@ -80,11 +78,11 @@ As a Traitor, the Captain and the Head of Security are two of the most difficult As a Traitor, you can manufacture and recycle revolver bullets at a hacked autolathe, making the revolver an extremely powerful tool. As a Traitor, you may sometimes hunt other traitors, and in turn be hunted by them. As a Traitor, the syndicate encryption key is very useful for coordinating plans with your fellow traitors -- or, of course, betraying them. -As a Nuclear Operative, communication is key! Use your radio to speak to your fellow operatives and coordinate an attack plan. -As a Nuclear Operative, you should look into purchasing a syndicate cyborg, as they can provide heavy fire support, are immune to conventional stuns, and can easily take down the AI. -As a Nuclear Operative, stick together! While your equipment is robust, your fellow operatives are much better at saving your life: they can drag you away from danger while stunned and provide cover fire. -As a Nuclear Operative, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life. -As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. +As a Mercenary, communication is key! Use your radio to speak to your fellow operatives and coordinate an attack plan. +As a Mercenary, you should look into purchasing a syndicate cyborg, as they can provide heavy fire support, are immune to conventional stuns, and can easily take down the AI. +As a Mercenary, stick together! While your equipment is robust, your fellow operatives are much better at saving your life: they can drag you away from danger while stunned and provide cover fire. +As a Mercenary, you might end up in a situation where the AI has bolted you into a room. Having some spare C4 in your pocket can save your life. +As a Monkey, you can crawl through air or scrubber vents by alt+left clicking them. You must drop everything you are wearing and holding to do this, however. As a Monkey, you can still wear a few human items, such as backpacks, gas masks and hats, and still have two free hands. As the Malfunctioning AI, you should either order your cyborgs to dismantle the robotics console or blow it up yourself in order to protect them. Make sure to hunt down all those laptops too! As an Alien, your melee prowess is unmatched, but your ranged abilities are sorely lacking. Make use of corners to force a melee confrontation! @@ -134,38 +132,44 @@ Remember the cheesy line! Toolboxes do more damage if they are full of things, but their contents will spill when you use them as a weapon. Heads of Staff will be more willing to help you if you bring paperwork that's already filled out. See no evil, hear no evil, speak no evil. -Auto-Hiss, despite the name, can be used for Unathi, Tajara, and Vaurca. +Despite the name, Auto-Hiss can be used for Unathi, Tajara, and Vaurca. Service borgs can use the special maidborg sprite if they pray hard enough. -Chainswords and energy weapons can slice walls and people. +Chainswords and energy weapons can slice both walls and people. If you see this message something has gone seriously wrong. If you're having trouble as an antagonist, consider a Dionaea whitelist. As a Medical Doctor, you can attach limbs from one species to the torso of another species. You too can make your own Frankenstein monster! The second antag contest is still running, you know. Killing mice on sight is not and never will be gank, no matter how much people complain. -As an Unathi, you are the only species capable of wearing the rare Breacher hardsuits. +Unathi are the only species capable of wearing the rare Breacher hardsuits. As an Unathi, you can devour small mobs after some time. -As a Tajaran, you move pretty fast. Zoom zoom, kitty. -As a Tajaran, your resistance to cold probably doesn't actually help you in space. Feel free to try, though. -As a Skrell you can look pretty and...uhh...not slip? -As a Skrell you have free reign to validhunt synthetics. (Not really, please don't do this oh God what have I done). -As a Human you are the best. Why do you care about your mechanics? -As a Human you are really very great. -As an IPC you are immune to most chemicals and gasses. -As an IPC you can survive longer than most species in space, despite your supposed "weakness". -As a Dionaea you can survive pretty much anything except a tiny little bottle of weedkiller. -As a Dionaea you will die in darkness. Find the light at the end of the tunnel, and quick. -As a Vaurca you can remotely speak to any other Vaurca on board. Not that there are any. -As a Vaurca you can wade freely through phoron gas. Avoid phoron fires though. Somehow a species that breathes phoron gas is really weak to fire. +As a Tajara, you move pretty fast. Zoom zoom, kitty. +As a Tajara, your resistance to cold probably doesn't actually help you in space. Feel free to try, though. +As a Skrell, you can look pretty and...uhh...not slip? +As a Skrell, you have free reign to validhunt synthetics. (Not really, please don't do this oh God what have I done). +As a Human, you are the best. Why do you care about your mechanics? +As a Human, you are really very great. +Due to IPCs' synthetic nature, they're immune to most chemicals and gasses. +IPCs can survive longer than most species in space, despite their supposed "weakness". +As a Dionaea, you can survive pretty much anything except a tiny little bottle of weedkiller. +Dionae die in darkness. Find the light at the end of the tunnel, and quick. +All Vaurca can remotely speak to any other Vaurca on board. Not that there are any. +Vaurca can wade freely through phoron gas. Avoid phoron fires though. Somehow a species that breathes phoron gas is really weak to fire. As an ERT trooper, your most powerful weapons are your team mates. Your second most powerful weapon is your bigass gun. -As an ERT trooper you're still expected to roleplay and progress the round. +ERT troopers are still expected to roleplay and progress the round. Try not to wordlessly gun down everyone you see. As a Ninja, you should learn the difference between invisibility and invulnerability. As a Ninja, you have a pretty badass sword. Use it. -As a Cortical Borer, you a limp feather can kill you if you're outside of a host. -As a NanoTrasen Actor you can't do anything. Thank Bay. +A Ninja's sword can cut through many objects. Experiment! +As a Cortical Borer, a limp feather can kill you if you're outside of a host. +NanoTrasen Actors can't do anything. Thank Bay. As a Syndicate Commando you are a Nuke Operative with bigger and better guns. Use them. As a Death Commando you have only one course of action: RIP AND TEAR. As a Highlander, there can be only one. As a Loyalist, remember that you are an antagonist too! As a Renegade, consider playing a better gamemode. As a Vampire, you can create new vampires out of willing and less than willing crew. Mind that new vampires may decide to turn their powers against you. -As a Vampire, if you start going hungry for blood don't expect to stay hidden for long. \ No newline at end of file +As a Vampire, if you start going hungry for blood don't expect to stay hidden for long. +You can use . (period) instead of : to speak into a radio. +The radio key .i will allow you to speak into a nearby intercom, .r will speak into a radio in your right hand, and .l will speak into your left. The microphone does not need to be enabled for this to work. +Your ID card's access determines what departmental channels you can set intercoms to. +You can fax papers between request consoles by attacking the console with a paper. Make sure the paper tray is closed first! +No wall or window is 100% impervious to heat. diff --git a/html/changelogs/lohikar-PR-1868.yml b/html/changelogs/lohikar-PR-1868.yml new file mode 100644 index 00000000000..89ba898d80c --- /dev/null +++ b/html/changelogs/lohikar-PR-1868.yml @@ -0,0 +1,5 @@ +author: Lohikar +delete-after: True +changes: + - bugfix: "Fixed Engineering's alert consoles displaying as blank." + - bugfix: "Vampires should now be able to properly embrace thralls." diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 97c3273762c..4e9dd7a6518 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -5695,6 +5695,7 @@ "cfA" = (/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) "cfB" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/powered/pump/filled,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHEAST)"; icon_state = "corner_white"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/foyer) "cfC" = (/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) +"cfD" = (/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/foyer) "cfE" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) "cfF" = (/obj/machinery/light,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/obj/structure/flora/pottedplant/random,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) "cfG" = (/obj/machinery/light,/obj/structure/table/standard,/obj/machinery/chemical_dispenser/bar_soft/full,/obj/effect/floor_decal/corner/white/diagonal,/turf/simulated/floor/tiled,/area/engineering/break_room) @@ -5962,7 +5963,7 @@ "ckI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) "ckJ" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/reinforced{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/engineering/atmos) "ckK" = (/obj/machinery/door/airlock/maintenance{name = "Engineering EVA Storage Maintainance"; req_access = list(12); req_one_access = list(11,24)},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/red,/turf/simulated/floor/tiled,/area/engineering/engine_eva) -"ckL" = (/obj/machinery/computer/station_alert,/turf/simulated/floor/tiled,/area/engineering/foyer) +"ckL" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "ckM" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "surgeryobs"; name = "Operating Theatre Privacy Shutters"; opacity = 0},/turf/simulated/floor/plating,/area/medical/surgery) "ckN" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/cyan,/turf/simulated/floor/tiled,/area/engineering/foyer) "ckO" = (/obj/structure/table/reinforced,/obj/item/weapon/clipboard,/obj/item/weapon/tape_roll,/turf/simulated/floor/tiled,/area/engineering/foyer) @@ -7102,7 +7103,6 @@ "cGE" = (/obj/machinery/computer/general_air_control/supermatter_core{frequency = 1438; input_tag = "cooling_in"; name = "Engine Cooling Control"; output_tag = "cooling_out"; pressure_setting = 100; sensors = list("engine_sensor" = "Engine Core")},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cGF" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_c"; icon_state = "swall_c"},/area/shuttle/constructionsite/station) "cGG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/industrial/warning,/obj/machinery/computer/power_monitor,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) -"cGH" = (/obj/machinery/computer/station_alert,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cGI" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/computer/rcon,/turf/simulated/floor/tiled,/area/engineering/engine_monitoring) "cGJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cGK" = (/obj/machinery/airlock_sensor{frequency = 1379; id_tag = "eng_al_c_snsr"; pixel_x = -25; pixel_y = 0},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 10},/turf/simulated/floor/plating,/area/engineering/engine_airlock) @@ -7536,7 +7536,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaafaafaafchCchCchCchCchCchCchCchCchCchCchCchCchCaaaaaachDchEchFchFcgFcgGcfdcgIcgHcgLcgJcgNcgMcgPcgOcgRcgQcgTcgScgVcgUcgXcgWchacgZbVibVibVibVibVibVibVibVichhchbbWMchibWMbUhccuccucidciecifccuccuchjchmchlcgKcbmcbmcbmcbmcbmcaechnchpcaecilcgDcilcaichrchqcaicipceBbVJchtbVJchubnFcisbnFbnFcitciuciuciucivbnFceEchvchschschwchBchxchHchGchIchJchLchLchLchLchNchMchLchOchLchPchQceLciLciMciNchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafaafaaaaaaaaaaaaaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCchRchSchRchCchTchUchTchCchVchWchVchCaaaaaaciUchEchFcgFcgFchXcfdchZchYciYciaciccibcihcigcijciiciicikciicaTbYEcimbYGcincjjciocirciqcirciwcixcjpcjpcjqcjqcjqcjqbUhcjrchKciyciyciAcizciDciCciFciEciHciBciIciGciGciJcjFcaecaecaeciPciOciQcaicaicaicaiceBceBbVJciRbVJciSbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEciTciKciWciVcjaciXcjbciZcjecjdcjfcjdcjdcjgcjicjhcgxcjkcgxcjlcjmceLckcckdckechyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCchRcjnchRchCchTcjochTchCchVcjschVchCaaaaaaciUchFcgFcgFcgFcjtckjckkcjuciYcjvcjxcjwcjzcjyckrcjAcjCcjBcjDcaTbYEcjEchacjGcjIcjHcjJcjJcjJcjKcjMcjLcjNckFckGckHcjqbUhcjrcjcciycjOcjQcjPckMcjScjUcjTckQcjRcjWcjVciGcjXcjFckVckWckXckacjZckbclbclcclccldclcclebVJbVJbVJbVJbnFcisbnFaaaaaaaaaaaaaaaaaaaaaceEckgckfckickhcljceHcjYceHcllcklcknckmckmckocgxcgxckqckpckmckscktceLckwckvckxchyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCckyckAckzchCckBckDckCchCckEckJckIchCaaaaafciUclGchFcgFcgFcgFcfdclHclIciYciYckKciYciYciYciYckLciickNckOcaTckRckPckTckSckYckUckZckZckZclaclfclfclgcjqclXclYclZclhcjrckuciycliclmclkclpcloclrclqcltclncluclsciGclvcjFcmocmpcmqclyclxclzcmqcmucmvcmwbnFcmxclcclcclcclcclccmybnFaaaaaaaaaaaaaaaaaaaaaceEclBclAclDclCceHclwclFclEceLclJclKclKclKclLclOclNclPclMclKclKclQceLcmOcmPcmQcmRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaaaaaachCckyckAckzchCckBckDckCchCckEckJckIchCaaaaafciUclGchFcgFcgFcgFcfdclHclIciYciYckKciYciYciYciYcfDciickNckOcaTckRckPckTckSckYckUckZckZckZclaclfclfclgcjqclXclYclZclhcjrckuciycliclmclkclpcloclrclqcltclncluclsciGclvcjFcmocmpcmqclyclxclzcmqcmucmvcmwbnFcmxclcclcclcclcclccmybnFaaaaaaaaaaaaaaaaaaaaaceEclBclAclDclCceHclwclFclEceLclJclKclKclKclLclOclNclPclMclKclKclQceLcmOcmPcmQcmRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafaafchCcmScmTcmUchCcmVcmTcmWchCcmVcmTcmWchCaaaaafcmXchFchFcgFcgFclScfdcmZcnaclUclTclWclVcmacmacmccmbcmacmdcmecaTcmgcmfcmicmhcjjcmjcmjcmkclfcmlcmncmmcmrcjqcnucnvcnwcmscjrclRciycmtcmAcmzcjrcmCcmEcmDcjFcmBcmGcmFciGcmHcjFcnJcnKcmqcnLcmJcnLcmqaaaaaaaaabnFbnFbnFcnNcmvcmvcmwbnFbnFaaaaaaaaaaaaceHceHceHceHceHceHceHceHceHcmIcmLcmKceLceLcnRcnScnTceLceLceLceLcnUcnScnTceLceLcnVcnWcnVaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaIfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaafaafaafaaaaafcnXaafcnXaafcnYaafcnZaafcnYaafcnZaafaafaaacfdcmYcmNcgFcgFcnbcodcndcnccogcohcnecojcojcnfcojcolcngconcolcoocnicnhcnjcoscotcotcotcotcnlcnkcowcowcowcoxcoxcoxcoxcnmcjrcmMcnncmtcnpcnocjrcmCcmEcnrcjFcnqcnscmFcnycnxcjFcnJcnKcmqcnBcnAcnCcmqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaceHcnDcnFcnEcoOcnGcnHcnzcoScnIcnOcnMceHaapaafaafaafaafaaaaaaaaacnQaaaaaaaaaaafcoXcoYcoXaafaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaaaaaaaafcoZcpacpbcpccpdcpecpfcpccpgcphcpfcpicpjcpkcplcogcogcogcogcogcogcogcogcobcoacoecoccofcprcokcoicomcolcoqcopcorcolcovcoucoycotcoAcozcoCcoBcoEcoDcpHcpIcpIcpJcpKcpKcpHcpLcjrcjrcpMcoFcjrcjrcjrcoGcmEcoHcjFcjFcjFcpYcpRcjFcjFcnJcpScmqcoKcoJcoKcmqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaafaafceHcoLcoMcoLcoPcoNcoQcoIcoScoScoRcoSceHceHaaaaaaaaaaafaafaaaaacaaaaaaaaaaaaaafaaacoUaaaaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -7558,7 +7558,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafaafaaaaaqaaaaaaaafchCcmVcmTcmWchCcmVcmTcmWchCcmVcmTcFjchCaaachCcmWcmTcFjchCaaaaafaaacEEcMIcEdcFmcFncEfcFpcFqcDXcEpcErcEqcEOcEscEucEtcEwcEvcEOcExcEGcEycEeaaaaaacAScELcEJcFEaaaaaabOscENcEMcEPcCccEQcEQcEQcCcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcDScDRcuxcuxcuxcuxcuxcDTcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacljceHceHceHceHceHceHceHceHcEUcEUcEUcljaaaaaacswcswcswcswcswaaaaaaaaacqzaaaaaaaaacswcswcswcaBcswaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaafaafaaJaaaaaaaafchCcEVcEXcEWchCcEYcFbcFachCcFccFecFdchCaafchCcFfcFhcFgchCaaaaafaaacEEcFWcDccFncFncFicFYcFZcGacFlcFrcFocFtcFscFvcFucFxcFwcGkcGlcGmcGncEeaafaaacGocGpcGqcAScGraaabOscFycMAcFzcCcaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacsocrgcrgcGwcERcCZcCZcCZcEScGwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFCcFCcFCaaaaaaaaaaaaaaaaaaaaaaaaaaacswaafcFDaafcswaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaJaaaaafaafchCcFFcFGcFFchCcFHcFIcFHchCcFJcFKcFJchCaaachCcFJcFJcFLchCaaaaafaaacEEcGccFMcFmcFncDdcGJcEKcDXcFNcFPcFOcEOcFQcFScFRcFScFTcEOcFUcGScFVcEeaapcGBcFXcGWcGXcFXcFXcGFbOscGecGdcGfcCcaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacHccCWcCWcCWcCWcCWcHcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaafaaacswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaJaafaafaaachCcFFcGgcFFchCcFHcGhcFHchCcFJcGicFJchCaafchCcFJcGjcFJchCaafaafaafcHhcHicGycGxcGAcGzcHncEKcDXcETcGDcGCcEOcGEcGIcGGcHacGHcEOcGKcHxcGLcEeaaacHzcHAcHBcGMcHDcHEcGNcHGcMGcHIbOsbOsaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcHJcricricricCpcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcswcswcswcswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaJaafaafaaachCcFFcGgcFFchCcFHcGhcFHchCcFJcGicFJchCaafchCcFJcGjcFJchCaafaafaafcHhcHicGycGxcGAcGzcHncEKcDXcETcGDcGCcEOcGEcGIcGGcHackLcEOcGKcHxcGLcEeaaacHzcHAcHBcGMcHDcHEcGNcHGcMGcHIbOsbOsaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrgcHJcricricricCpcrgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswcswcswcswcswaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaBaaaaaachCchCchCchCchCchCchCchCchCchCchCchCchCaaacHKchCchCchCchCaaaaaaaaaaaacCScCScCScCScCScHLcHMcHMcHMcHMcHNcHMcHOcHPcHQcHPcHRcHMcHMcHScHMcHMcHMcHzcHAcHTcGOcHVcHWcHXaafaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacswaaaaaaaafaafaaaaafaafaaaaaaaafaafaafaaaaaaaaaaaaaaaaaaaafaaacHYcHZcHZcHZcIacGPcGQcIdcIecGRcGTcIhcGUcIjcGYcGVcHdcIrcIocIpcIqcIrcIscHecIucIvcHecHMcHzcHAcIwcHfcIycIzcGNaafaaacHYcIBcHYcIBcHYcIBaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFcuFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamaafcHgcHkcHjaaacHgcHkcHjaaacHgcHkcHjaafaafaaaaafaafaafaafaafcIGcHZcHZcHZcIacGPcHlcIIcIJcHmcHocIMcHpcIOcHrcHqcITcITcITcIUcITcITcITcIVcITcIWcIXcHMcHscFXcFXcFXcFXcFXcHtaafaafcJacJacJacJacJacJaaafcICaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaacyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFcyFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/exodus-5.dmm b/maps/exodus-5.dmm index e3877f1d241..cf5bbd19d84 100644 --- a/maps/exodus-5.dmm +++ b/maps/exodus-5.dmm @@ -885,7 +885,7 @@ "ra" = (/obj/structure/cable/blue{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock"},/obj/machinery/door/airlock/glass_engineering{name = "Storage"; req_access = list(10)},/turf/simulated/floor/tiled,/area/outpost/engineering/storage) "rb" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "exterior access button"; pixel_x = -25; pixel_y = -25; req_access = list(10)},/turf/simulated/floor/airless,/area/outpost/engineering/hallway) "rc" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/obj/structure/table/standard,/obj/random/tech_supply,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) -"rd" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/obj/machinery/computer/station_alert,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) +"rd" = (/obj/structure/cable/blue{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/status_display{pixel_y = 32},/obj/machinery/camera/network/engineering_outpost{c_tag = "Engineering Outpost Meeting Room"},/obj/machinery/computer/station_alert/engineering,/turf/simulated/floor/wood,/area/outpost/engineering/meeting) "re" = (/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (WEST)"; icon_state = "carpet_edges"; dir = 8},/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTHWEST)"; icon_state = "carpet_edges"; dir = 9},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "rf" = (/obj/structure/bed/chair,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) "rg" = (/obj/structure/cable/blue{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/bed/chair,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/carpet{tag = "icon-carpet_edges (NORTH)"; icon_state = "carpet_edges"; dir = 1},/turf/simulated/floor/carpet,/area/outpost/engineering/meeting) From c1447203459025d304f8e34bdfbaf464fd9d5a4a Mon Sep 17 00:00:00 2001 From: skull132 Date: Sun, 5 Mar 2017 19:25:18 +0200 Subject: [PATCH 13/55] Fixes robotic organ surgery (#1883) An invalid open state was stopping the use nanopaste to fix robotic internal organs. This is now fixed. --- code/modules/surgery/robotics.dm | 12 ++++++------ html/changelogs/skull132-robo_surgery.yml | 6 ++++++ 2 files changed, 12 insertions(+), 6 deletions(-) create mode 100644 html/changelogs/skull132-robo_surgery.yml diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 1d169bf2e73..867e222c3bd 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -78,7 +78,7 @@ var/obj/item/organ/external/affected = target.get_organ(target_zone) user.visible_message("[user] opens the maintenance hatch on [target]'s [affected.name] with \the [tool].", \ "You open the maintenance hatch on [target]'s [affected.name] with \the [tool].") - affected.open = 2 + affected.open = 3 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -134,7 +134,7 @@ var/obj/item/weapon/weldingtool/welder = tool if(!welder.isOn() || !welder.remove_fuel(1,user)) return 0 - return affected && affected.open == 2 && affected.brute_dam > 0 && target_zone != "mouth" + return affected && affected.open == 3 && affected.brute_dam > 0 && target_zone != "mouth" begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -166,7 +166,7 @@ if(..()) var/obj/item/stack/cable_coil/C = tool var/obj/item/organ/external/affected = target.get_organ(target_zone) - var/limb_can_operate = (affected && affected.open == 2 && affected.burn_dam > 0 && target_zone != "mouth") + var/limb_can_operate = (affected && affected.open == 3 && affected.burn_dam > 0 && target_zone != "mouth") if(limb_can_operate) if(istype(C)) if(!C.get_amount() >= 3) @@ -197,7 +197,7 @@ /datum/surgery_step/robotics/fix_organ_robotic //For artificial organs allowed_tools = list( /obj/item/stack/nanopaste = 100, - /obj/item/weapon/bonegel = 30, + /obj/item/weapon/bonegel = 30, /obj/item/weapon/screwdriver = 70 ) @@ -215,7 +215,7 @@ if(I.damage > 0 && I.robotic >= 2) is_organ_damaged = 1 break - return affected.open == 2 && is_organ_damaged + return affected.open == 3 && is_organ_damaged begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -375,7 +375,7 @@ var/obj/item/device/mmi/M = tool var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!(affected && affected.open == 2)) + if(!(affected && affected.open == 3)) return 0 if(!istype(M)) diff --git a/html/changelogs/skull132-robo_surgery.yml b/html/changelogs/skull132-robo_surgery.yml new file mode 100644 index 00000000000..3c317e10831 --- /dev/null +++ b/html/changelogs/skull132-robo_surgery.yml @@ -0,0 +1,6 @@ +author: Skull132 + +delete-after: True + +changes: + - bugfix: "Internal organ repair surgery for mechanical organs now works properly again." From 4004eba862ba910c68d5205dc2ef5808f852dc13 Mon Sep 17 00:00:00 2001 From: skull132 Date: Sun, 5 Mar 2017 11:25:50 -0500 Subject: [PATCH 14/55] Changelogs, 05MAR2017 --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/skull132-robo_surgery.yml | 6 ------ 3 files changed, 10 insertions(+), 6 deletions(-) delete mode 100644 html/changelogs/skull132-robo_surgery.yml diff --git a/html/changelog.html b/html/changelog.html index 7fff4929a01..229d3be6c82 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->
+

05 March 2017

+

Skull132 updated:

+
    +
  • Internal organ repair surgery for mechanical organs now works properly again.
  • +
+

17 February 2017

LordFowl updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 254d6225955..aef15ce5db7 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -3787,3 +3787,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. LordFowl: - bugfix: Shells now spawn with fully robotic legs. - bugfix: Green IPC screen has been fixed. +2017-03-05: + Skull132: + - bugfix: Internal organ repair surgery for mechanical organs now works properly + again. diff --git a/html/changelogs/skull132-robo_surgery.yml b/html/changelogs/skull132-robo_surgery.yml deleted file mode 100644 index 3c317e10831..00000000000 --- a/html/changelogs/skull132-robo_surgery.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Skull132 - -delete-after: True - -changes: - - bugfix: "Internal organ repair surgery for mechanical organs now works properly again." From 5b737098d9fb99fd32a3c4f5f98134f3c8133114 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 5 Mar 2017 14:03:59 -0600 Subject: [PATCH 15/55] do_after progress bars (#1857) Adds the do_after progress bars that were originally going to be added with lighting, but got scrapped due to PR-bloat. changes: do_after actions now have a progress bar. Added a changelog for directional lighting as I apparently forgot it. The do_after proc's required arguments are unchanged, however it now accepts the argument act_target, which allows the caller to specify what object the progress bar should appear over. Defaults to user. --- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/omni_devices/omni_base.dm | 2 +- .../components/portables_connector.dm | 2 +- .../components/trinary_devices/filter.dm | 2 +- .../components/trinary_devices/mixer.dm | 2 +- code/ATMOSPHERICS/components/tvalve.dm | 2 +- .../components/unary/heat_exchanger.dm | 2 +- .../components/unary/vent_scrubber.dm | 4 +- code/ATMOSPHERICS/components/valve.dm | 2 +- code/ATMOSPHERICS/pipes.dm | 2 +- code/_helpers/unsorted.dm | 108 ++++++++++++++---- code/modules/clothing/spacesuits/rig/rig.dm | 4 +- code/modules/effects/sparks/visuals.dm | 2 +- html/changelogs/lohikar-doafter.yml | 4 + html/changelogs/lohikar-lighting.yml | 2 +- html/changelogs/lohikar-pr-1726.yml | 4 + icons/effects/doafter_icon.dmi | Bin 0 -> 587 bytes 18 files changed, 110 insertions(+), 38 deletions(-) create mode 100644 html/changelogs/lohikar-doafter.yml create mode 100644 html/changelogs/lohikar-pr-1726.yml create mode 100644 icons/effects/doafter_icon.dmi diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index a032b747d96..05488c719af 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -250,7 +250,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 1832ea8784e..c6ef3e201da 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -229,7 +229,7 @@ Thus, the two variables affect pump operation are set in New(): return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index ac7d88301af..b62a63da903 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -92,7 +92,7 @@ return 1 user << "You begin to unfasten \the [src]..." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - if(do_after(user, 40)) + if(do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 4f6473fccf3..72eedd3d7f1 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -146,7 +146,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index e78d777cabc..3506c3a2a75 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -139,7 +139,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index a163c122f01..48accdd6dbd 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -114,7 +114,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index f93970a93fd..c3592deb365 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -358,7 +358,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index 79e43a8e1c3..b6014ff34f5 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -80,7 +80,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 6e445bed48a..3cb91710571 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -275,7 +275,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ @@ -290,7 +290,7 @@ user << "\The [WT] must be turned on!" else if (WT.remove_fuel(0,user)) user << "Now welding \the [src]." - if(do_after(user, 20)) + if(do_after(user, 20, act_target = src)) if(!src || !WT.isOn()) return playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) if(!welded) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 94d583c721c..121d58e186e 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -315,7 +315,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index d5656f75fc0..ee9d9ee0afb 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -93,7 +93,7 @@ return 1 playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) user << "You begin to unfasten \the [src]..." - if (do_after(user, 40)) + if (do_after(user, 40, act_target = src)) user.visible_message( \ "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 4b7e24a93f7..d928ce9ab13 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -646,45 +646,109 @@ proc/GaussRandRound(var/sigma,var/roundto) else return get_step(ref, base_dir) -/proc/do_mob(var/mob/user, var/mob/target, var/delay = 30, var/numticks = 5, var/needhand = 1) //This is quite an ugly solution but i refuse to use the old request system. - if(!user || !target) return 0 - if(numticks == 0) return 0 - - var/delayfraction = round(delay/numticks) - var/original_user_loc = user.loc - var/original_target_loc = target.loc +/proc/do_mob(mob/user , mob/target, delay = 30, numticks = 10, needhand = TRUE, display_progress = TRUE) //This is quite an ugly solution but i refuse to use the old request system. + if(!user || !target) + return 0 + var/user_loc = user.loc + var/target_loc = target.loc var/holding = user.get_active_hand() - - for(var/i = 0, i[wearer]'s suit emits a quiet hum as it begins to adjust its seals.","With a quiet hum, the suit begins running checks and adjusting components.") - if(seal_delay && !do_after(wearer,seal_delay)) + if(seal_delay && !do_after(wearer, seal_delay, act_target = src)) if(wearer) wearer << "You must remain still while the suit is adjusting the components." failed_to_seal = 1 @@ -244,7 +244,7 @@ if(!failed_to_seal && wearer.back == src && piece == compare_piece) - if(seal_delay && !instant && !do_after(wearer,seal_delay,needhand=0)) + if(seal_delay && !instant && !do_after(wearer,seal_delay,needhand=0, act_target = src)) failed_to_seal = 1 piece.icon_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]" diff --git a/code/modules/effects/sparks/visuals.dm b/code/modules/effects/sparks/visuals.dm index 684cb3d78b1..7e55170e3d1 100644 --- a/code/modules/effects/sparks/visuals.dm +++ b/code/modules/effects/sparks/visuals.dm @@ -12,7 +12,7 @@ /obj/visual_effect/sparks/tick() . = ..() - var/turf/T = loc + var/turf/T = get_turf(src) if(T) T.hotspot_expose(1000, 100) diff --git a/html/changelogs/lohikar-doafter.yml b/html/changelogs/lohikar-doafter.yml new file mode 100644 index 00000000000..9ca31ec08ca --- /dev/null +++ b/html/changelogs/lohikar-doafter.yml @@ -0,0 +1,4 @@ +author: Lohikar +delete-after: True +changes: + - rscadd: "A progress bar is now shown when you start an action which takes time." diff --git a/html/changelogs/lohikar-lighting.yml b/html/changelogs/lohikar-lighting.yml index d79fb92bd7a..b5169786f3a 100644 --- a/html/changelogs/lohikar-lighting.yml +++ b/html/changelogs/lohikar-lighting.yml @@ -1,7 +1,7 @@ author: Lohikar delete-after: True changes: - - rscadd: "Ported over /vg/'s smooth lighting system." + - rscadd: "Ported over and improved /vg/'s smooth lighting system." - rscadd: "Tweaked the emission color of station lighting." - rscadd: "Glowing slime cores now emit colored light instead of white light." - rscadd: "Space tiles are now darker." diff --git a/html/changelogs/lohikar-pr-1726.yml b/html/changelogs/lohikar-pr-1726.yml new file mode 100644 index 00000000000..1a29432244c --- /dev/null +++ b/html/changelogs/lohikar-pr-1726.yml @@ -0,0 +1,4 @@ +author: Lohikar +delete-after: True +changes: + - tweak: "Flashlights, Floodlights, and Synthetic Integrated lights are now directional." diff --git a/icons/effects/doafter_icon.dmi b/icons/effects/doafter_icon.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5910ccf2c005057b53e9a1ee5489b2b034a2e209 GIT binary patch literal 587 zcmV-R0<`^!P)|rL?yL!2(b^bia|EGdr3xX{Pwj$V?V7COj zBiM#u_oQF^#?gHNd{&%5IspkQumUTv0xPfrE3ksIxPnrTYoPi7EeVPFztA>cAC7DLaHkXi z0Bp#?S=R@Mc_r@@XcosO1(L}-g_uV`gpdR9`6=)zLkQ)pvnXf3a(FOL>^>XIwR#kN7k&P~}lj}6|;g9*rgd^V!QvEsqa1Wk$5M2|# zQ}TQT0001BQ`T0ZpZ&p_TKL@`l(yVT^_30w+TeOU=?};je5wDk!QL2LZzlagXa>P| z5c~=N006+h^#?6ut8Z&J*gL`XZY=LTW9xr!H`pJ7>yK=k4A36{00016^9&8}+C77P Zc>`G$|4S{!RXG3v002ovPDHLkV1f^`0PX+) literal 0 HcmV?d00001 From fd217ec7739285c166b6a3aa86c046c63f67355d Mon Sep 17 00:00:00 2001 From: Alberyk Date: Sun, 5 Mar 2017 17:05:27 -0300 Subject: [PATCH 16/55] Changeling updates and fix (#1765) - Fixes #1660 -re-added old code changeling features, like non-stealthy sting and arm blades, with proper sprites this time, and shields -changeling revive will now be only triggered when the ling wants to come back -lings can't ling monkeys anymore -fixed ipcs being affected by stings -removed species transformation skill, now, using transform will turn you also into said species --- baystation12.dme | 1 + .../gamemodes/changeling/changeling_items.dm | 91 +++++ .../gamemodes/changeling/changeling_powers.dm | 314 ++++++++++-------- .../gamemodes/changeling/modularchangling.dm | 26 +- html/changelogs/alberyk-PR-1765.yml | 12 + icons/obj/changeling.dmi | Bin 0 -> 15137 bytes 6 files changed, 297 insertions(+), 147 deletions(-) create mode 100644 code/game/gamemodes/changeling/changeling_items.dm create mode 100644 html/changelogs/alberyk-PR-1765.yml create mode 100644 icons/obj/changeling.dmi diff --git a/baystation12.dme b/baystation12.dme index 829a6030dba..024b5731acc 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -334,6 +334,7 @@ #include "code\game\gamemodes\setupgame.dm" #include "code\game\gamemodes\calamity\calamity.dm" #include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\changeling_items.dm" #include "code\game\gamemodes\changeling\changeling_powers.dm" #include "code\game\gamemodes\changeling\modularchangling.dm" #include "code\game\gamemodes\cult\cult.dm" diff --git a/code/game/gamemodes/changeling/changeling_items.dm b/code/game/gamemodes/changeling/changeling_items.dm new file mode 100644 index 00000000000..cf27d5301ba --- /dev/null +++ b/code/game/gamemodes/changeling/changeling_items.dm @@ -0,0 +1,91 @@ +/obj/item/weapon/melee/arm_blade + name = "arm blade" + desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter." + icon = 'icons/obj/changeling.dmi' + icon_state = "arm_blade" + item_state = "arm_blade" + contained_sprite = 1 + w_class = 4 + force = 30 + sharp = 1 + edge = 1 + anchored = 1 + throwforce = 0 //Just to be on the safe side + throw_range = 0 + throw_speed = 0 + can_embed = 0 + attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") + var/mob/living/creator + +/obj/item/weapon/melee/arm_blade/New() + processing_objects |= src + +/obj/item/weapon/melee/arm_blade/Destroy() + processing_objects -= src + ..() + +/obj/item/weapon/melee/arm_blade/dropped() + visible_message("With a sickening crunch, [user] reforms their arm blade into an arm!", + "We assimilate the weapon back into our body.", + "You hear organic matter ripping and tearing!") + playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) + spawn(1) if(src) qdel(src) + +/obj/item/weapon/melee/arm_blade/process() + if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src)) + // Tidy up a bit. + if(istype(loc,/mob/living)) + var/mob/living/carbon/human/host = loc + if(istype(host)) + for(var/obj/item/organ/external/organ in host.organs) + for(var/obj/item/O in organ.implants) + if(O == src) + organ.implants -= src + host.pinned -= src + host.embedded -= src + host.drop_from_inventory(src) + spawn(1) if(src) qdel(src) + +/obj/item/weapon/shield/riot/changeling + name = "shield-like mass" + desc = "A mass of tough, boney tissue. You can still see the fingers as a twisted pattern in the shield." + icon = 'icons/obj/changeling.dmi' + icon_state = "ling_shield" + item_state = "ling_shield" + contained_sprite = 1 + slot_flags = null + anchored = 1 + throwforce = 0 //Just to be on the safe side + throw_range = 0 + throw_speed = 0 + can_embed = 0 + var/mob/living/creator + +/obj/item/weapon/shield/riot/changeling/New() + processing_objects |= src + +/obj/item/weapon/shield/riot/changeling/Destroy() + processing_objects -= src + ..() + +/obj/item/weapon/shield/riot/changeling/dropped() + visible_message("With a sickening crunch, [user] reforms their arm blade into an arm!", + "We assimilate the weapon back into our body.", + "You hear organic matter ripping and tearing!") + playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) + spawn(1) if(src) qdel(src) + +/obj/item/weapon/shield/riot/changeling/process() + if(!creator || loc != creator || (creator.l_hand != src && creator.r_hand != src)) + // Tidy up a bit. + if(istype(loc,/mob/living)) + var/mob/living/carbon/human/host = loc + if(istype(host)) + for(var/obj/item/organ/external/organ in host.organs) + for(var/obj/item/O in organ.implants) + if(O == src) + organ.implants -= src + host.pinned -= src + host.embedded -= src + host.drop_from_inventory(src) + spawn(1) if(src) qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index eb3a092a03c..f57322c47a1 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -1,8 +1,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega") /datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind) - var/list/absorbed_dna = list() - var/list/absorbed_species = list() + var/list/datum/absorbed_dna/absorbed_dna = list() var/list/absorbed_languages = list() var/absorbedcount = 0 var/chem_charges = 20 @@ -31,12 +30,24 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E geneticdamage = max(0, geneticdamage-1) /datum/changeling/proc/GetDNA(var/dna_owner) - var/datum/dna/chosen_dna - for(var/datum/dna/DNA in absorbed_dna) - if(dna_owner == DNA.real_name) - chosen_dna = DNA - break - return chosen_dna + for(var/datum/absorbed_dna/DNA in absorbed_dna) + if(dna_owner == DNA.name) + return DNA + +/mob/proc/absorbDNA(var/datum/absorbed_dna/newDNA) + var/datum/changeling/changeling = null + if(src.mind && src.mind.changeling) + changeling = src.mind.changeling + if(!changeling) + return + + for(var/language in newDNA.languages) + changeling.absorbed_languages |= language + + changeling_update_languages(changeling.absorbed_languages) + + if(!changeling.GetDNA(newDNA.name)) // Don't duplicate - I wonder if it's possible for it to still be a different DNA? DNA code could use a rewrite + changeling.absorbed_dna += newDNA //Restores our verbs. It will only restore verbs allowed during lesser (monkey) form if we are not human /mob/proc/make_changeling() @@ -65,14 +76,13 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E if(!(P in src.verbs)) src.verbs += P.verbpath - mind.changeling.absorbed_dna |= dna + for(var/language in languages) + mind.changeling.absorbed_languages |= language var/mob/living/carbon/human/H = src if(istype(H)) - mind.changeling.absorbed_species += H.species.name - - for(var/language in languages) - mind.changeling.absorbed_languages |= language + var/datum/absorbed_dna/newDNA = new(H.real_name, H.dna, H.species.name, H.languages) + absorbDNA(newDNA) return 1 @@ -83,13 +93,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E if(P.isVerb) verbs -= P.verbpath -//removes changeling powers but keeps those with allowduringlesserform -/mob/proc/remove_changeling_powers_monkey() - if(!mind || !mind.changeling) return - for(var/datum/power/changeling/P in mind.changeling.purchasedpowers) - if(P.isVerb && (P.allowduringlesserform == 0)) - verbs -= P.verbpath - //Helper proc. Does all the checks and stuff for us to avoid copypasta /mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0) @@ -133,46 +136,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E return -//Used to switch species based on the changeling datum. -/mob/proc/changeling_change_species() - - set category = "Changeling" - set name = "Change Species (5)" - - var/mob/living/carbon/human/H = src - if(!istype(H)) - src << "We may only use this power while in humanoid form." - return - - var/datum/changeling/changeling = changeling_power(5,1,0) - if(!changeling) return - - if(changeling.absorbed_species.len < 2) - src << "We do not know of any other species genomes to use." - return - - var/S = input("Select the target species: ", "Target Species", null) as null|anything in changeling.absorbed_species - if(!S) return - - domutcheck(src, null) - - changeling.chem_charges -= 5 - changeling.geneticdamage = 30 - - src.visible_message("[src] transforms!") - - src.verbs -= /mob/proc/changeling_change_species - H.set_species(S,1) //Until someone moves body colour into DNA, they're going to have to use the default. - - spawn(10) - src.verbs += /mob/proc/changeling_change_species - src.regenerate_icons() - - changeling_update_languages(changeling.absorbed_languages) - feedback_add_details("changeling_powers","TR") - - return 1 - //Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim. //Doesn't cost anything as it's the most basic ability. /mob/proc/changeling_absorb_dna() @@ -196,6 +159,10 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E src << "We do not know how to parse this creature's DNA!" return + if(islesserform(T)) + src << "This creature DNA is not compatible with our form!" + return + if(HUSK in T.mutations) src << "This creature's DNA is ruined beyond useability!" return @@ -213,6 +180,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E switch(stage) if(1) src << "This creature is compatible. We must hold still..." + src.visible_message("[src]'s skin begins to shift and squirm!") if(2) src << "We extend a proboscis." src.visible_message("[src] extends a proboscis!") @@ -234,9 +202,6 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E src.visible_message("[src] sucks the fluids from [T]!") T << "You have been absorbed by the changeling!" - T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set. - changeling.absorbed_dna |= T.dna - if(src.nutrition < max_nutrition) src.nutrition = min((nutrition + T.nutrition), max_nutrition) changeling.chem_charges += 10 changeling.geneticpoints += 2 @@ -247,16 +212,15 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E changeling_update_languages(changeling.absorbed_languages) - //Steal their species! - if(T.species && !(T.species.name in changeling.absorbed_species)) - changeling.absorbed_species += T.species.name + var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages) + absorbDNA(newDNA) if(T.mind && T.mind.changeling) if(T.mind.changeling.absorbed_dna) - for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot - if(dna_data in changeling.absorbed_dna) + for(var/datum/absorbed_dna/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot + if(changeling.GetDNA(dna_data.name)) continue - changeling.absorbed_dna += dna_data + absorbDNA(dna_data) changeling.absorbedcount++ T.mind.changeling.absorbed_dna.len = 1 @@ -295,31 +259,44 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E if(!changeling) return var/list/names = list() - for(var/datum/dna/DNA in changeling.absorbed_dna) - names += "[DNA.real_name]" + for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna) + names += "[DNA.name]" var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names if(!S) return - var/datum/dna/chosen_dna = changeling.GetDNA(S) + var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S) if(!chosen_dna) return changeling.chem_charges -= 5 - src.visible_message("[src] transforms!") changeling.geneticdamage = 30 - src.dna = chosen_dna.Clone() - src.real_name = chosen_dna.real_name - src.flavor_text = "" - src.UpdateAppearance() - domutcheck(src, null) + + handle_changeling_transform(chosen_dna) src.verbs -= /mob/proc/changeling_transform - spawn(10) src.verbs += /mob/proc/changeling_transform + spawn(10) + src.verbs += /mob/proc/changeling_transform + + changeling_update_languages(changeling.absorbed_languages) feedback_add_details("changeling_powers","TR") return 1 +/mob/proc/handle_changeling_transform(var/datum/absorbed_dna/chosen_dna) + src.visible_message("[src] transforms!") + + if(ishuman(src)) + var/mob/living/carbon/human/H = src + var/newSpecies = chosen_dna.speciesName + H.set_species(newSpecies,1) + + src.dna = chosen_dna.dna + src.real_name = chosen_dna.name + src.flavor_text = "" + domutcheck(src, null) + src.UpdateAppearance() + //Transform into a monkey. /mob/proc/changeling_lesser_form() @@ -340,15 +317,10 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E return changeling.chem_charges-- - H.remove_changeling_powers_monkey() //we weren't making us of allowduringlesserform before for some reason? -Ryan784 H.visible_message("[H] transforms!") changeling.geneticdamage = 30 H << "Our genes cry out!" - var/list/implants = list() //Try to preserve implants. - for(var/obj/item/weapon/implant/W in H) - implants += W - H.monkeyize() - verbs += /mob/proc/changeling_lesser_transform //allow us to actually transform BACK into a human - Ryan784 + H = H.monkeyize() feedback_add_details("changeling_powers","LF") return 1 @@ -457,25 +429,29 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E // charge the changeling chemical cost for stasis changeling.chem_charges -= 20 - // restore us to health - C.revive() - - // remove our fake death flag - C.status_flags &= ~(FAKEDEATH) - - // let us move again - C.update_canmove() - - // re-add out changeling powers - C.make_changeling() - - // sending display messages - C << "We have regenerated." - + C << "We are ready to rise. Use the Revive verb when you are ready." + C.verbs += /mob/proc/changeling_revive feedback_add_details("changeling_powers","FD") return 1 +/mob/proc/changeling_revive() + set category = "Changeling" + set name = "Revive" + + var/mob/living/carbon/C = src + // restore us to health + C.revive() + // remove our fake death flag + C.status_flags &= ~(FAKEDEATH) + // let us move again + C.update_canmove() + // re-add out changeling powers + C.make_changeling() + // sending display messages + C << "We have regenerated." + C.verbs -= /mob/proc/changeling_revive + //Boosts the range of your next sting attack by 1 /mob/proc/changeling_boost_range() @@ -581,7 +557,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E // HIVE MIND UPLOAD/DOWNLOAD DNA -var/list/datum/dna/hivemind_bank = list() +var/list/datum/absorbed_dna/hivemind_bank = list() /mob/proc/changeling_hiveupload() set category = "Changeling" @@ -592,9 +568,14 @@ var/list/datum/dna/hivemind_bank = list() if(!changeling) return var/list/names = list() - for(var/datum/dna/DNA in changeling.absorbed_dna) - if(!(DNA in hivemind_bank)) - names += DNA.real_name + for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna) + var/valid = 1 + for(var/datum/absorbed_dna/DNB in hivemind_bank) + if(DNA.name == DNB.name) + valid = 0 + break + if(valid) + names += DNA.name if(names.len <= 0) src << "The airwaves already have all of our DNA." @@ -603,7 +584,7 @@ var/list/datum/dna/hivemind_bank = list() var/S = input("Select a DNA to channel: ", "Channel DNA", null) as null|anything in names if(!S) return - var/datum/dna/chosen_dna = changeling.GetDNA(S) + var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S) if(!chosen_dna) return @@ -622,9 +603,9 @@ var/list/datum/dna/hivemind_bank = list() if(!changeling) return var/list/names = list() - for(var/datum/dna/DNA in hivemind_bank) - if(!(DNA in changeling.absorbed_dna)) - names[DNA.real_name] = DNA + for(var/datum/absorbed_dna/DNA in hivemind_bank) + if(!(changeling.GetDNA(DNA.name))) + names[DNA.name] = DNA if(names.len <= 0) src << "There's no new DNA to absorb from the air." @@ -637,7 +618,7 @@ var/list/datum/dna/hivemind_bank = list() return changeling.chem_charges -= 20 - changeling.absorbed_dna += chosen_dna + absorbDNA(chosen_dna) src << "We absorb the DNA of [S] from the air." feedback_add_details("changeling_powers","HD") return 1 @@ -692,7 +673,7 @@ var/list/datum/dna/hivemind_bank = list() return 1 //Handles the general sting code to reduce on copypasta (seeming as somebody decided to make SO MANY dumb abilities) -/mob/proc/changeling_sting(var/required_chems=0, var/verb_path) +/mob/proc/changeling_sting(var/required_chems=0, var/verb_path, var/stealthy = 0) var/datum/changeling/changeling = changeling_power(required_chems) if(!changeling) return @@ -711,9 +692,20 @@ var/list/datum/dna/hivemind_bank = list() src.verbs -= verb_path spawn(10) src.verbs += verb_path - src << "We stealthily sting [T]." + if(stealthy == 1) + src << "We stealthily sting [T]." + T << "You feel a tiny prick." + else + src.visible_message(pick("[src]'s eyes balloon and burst out in a welter of blood, burrowing into [T]!", + "[src]'s arm rapidly shifts into a giant scorpion-stinger and stabs into [T]!", + "[src]'s throat lengthens and twists before vomitting a chunky red spew all over [T]!", + "[src]'s tongue stretches an impossible length and stabs into [T]!", + "[src] sneezes a cloud of shrieking spiders at [T]!", + "[src] erupts a grotesque tail and impales [T]!", + "[src]'s chin skin bulges and tears, launching a bone-dart at [T]!")) + if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting - T << "You feel a tiny prick." + return @@ -722,7 +714,7 @@ var/list/datum/dna/hivemind_bank = list() set name = "Hallucination Sting (15)" set desc = "Causes terror in the target." - var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting) + var/mob/living/carbon/T = changeling_sting(15,/mob/proc/changeling_lsdsting,stealthy = 1) if(!T) return 0 spawn(rand(300,600)) if(T) T.hallucination += 400 @@ -734,7 +726,7 @@ var/list/datum/dna/hivemind_bank = list() set name = "Silence sting (10)" set desc="Sting target" - var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting) + var/mob/living/carbon/T = changeling_sting(10,/mob/proc/changeling_silence_sting,stealthy = 1) if(!T) return 0 T.silent += 30 feedback_add_details("changeling_powers","SS") @@ -745,7 +737,7 @@ var/list/datum/dna/hivemind_bank = list() set name = "Blind sting (20)" set desc="Sting target" - var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting) + var/mob/living/carbon/T = changeling_sting(20,/mob/proc/changeling_blind_sting,stealthy = 0) if(!T) return 0 T << "Your eyes burn horrificly!" T.disabilities |= NEARSIGHTED @@ -760,7 +752,7 @@ var/list/datum/dna/hivemind_bank = list() set name = "Deaf sting (5)" set desc="Sting target:" - var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting) + var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_deaf_sting,stealthy = 0) if(!T) return 0 T << "Your ears pop and begin ringing loudly!" T.sdisabilities |= DEAF @@ -773,7 +765,7 @@ var/list/datum/dna/hivemind_bank = list() set name = "Paralysis sting (30)" set desc="Sting target" - var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting) + var/mob/living/carbon/T = changeling_sting(30,/mob/proc/changeling_paralysis_sting,stealthy = 0) if(!T) return 0 T << "Your muscles begin to painfully tighten." T.Weaken(20) @@ -788,29 +780,25 @@ var/list/datum/dna/hivemind_bank = list() var/datum/changeling/changeling = changeling_power(40) if(!changeling) return 0 - - var/list/names = list() - for(var/datum/dna/DNA in changeling.absorbed_dna) - names += "[DNA.real_name]" + for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna) + names += "[DNA.name]" var/S = input("Select the target DNA: ", "Target DNA", null) as null|anything in names if(!S) return - var/datum/dna/chosen_dna = changeling.GetDNA(S) + var/datum/absorbed_dna/chosen_dna = changeling.GetDNA(S) if(!chosen_dna) return - var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting) + var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_transformation_sting,stealthy = 1) if(!T) return 0 if((HUSK in T.mutations) || (!ishuman(T) && !issmall(T))) src << "Our sting appears ineffective against its DNA." return 0 - T.visible_message("[T] transforms!") - T.dna = chosen_dna.Clone() - T.real_name = chosen_dna.real_name - T.UpdateAppearance() - domutcheck(T, null) + + T.handle_changeling_transform(chosen_dna) + feedback_add_details("changeling_powers","TS") return 1 @@ -819,10 +807,9 @@ var/list/datum/dna/hivemind_bank = list() set name = "Unfat sting (5)" set desc = "Sting target" - var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting) + var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting,stealthy = 1) if(!T) return 0 T << "you feel a small prick as stomach churns violently and you become to feel skinnier." - T.overeatduration = 0 T.nutrition -= 100 feedback_add_details("changeling_powers","US") return 1 @@ -832,13 +819,13 @@ var/list/datum/dna/hivemind_bank = list() set name = "Death Sting (40)" set desc = "Causes spasms onto death." - var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting) + var/mob/living/carbon/T = changeling_sting(40,/mob/proc/changeling_DEATHsting,stealthy = 0) if(!T) return 0 T << "You feel a small prick and your chest becomes tight." T.silent = 10 T.Paralyse(10) T.make_jittery(1000) - if(T.reagents) T.reagents.add_reagent("lexorin", 40) + if(T.reagents) T.reagents.add_reagent("cyanide", 5) feedback_add_details("changeling_powers","DTHS") return 1 @@ -853,13 +840,66 @@ var/list/datum/dna/hivemind_bank = list() if(!changeling) return 0 - var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting) + var/mob/living/carbon/human/T = changeling_sting(40, /mob/proc/changeling_extract_dna_sting,stealthy = 1) if(!T) return 0 - T.dna.real_name = T.real_name - changeling.absorbed_dna |= T.dna - if(T.species && !(T.species.name in changeling.absorbed_species)) - changeling.absorbed_species += T.species.name + var/datum/absorbed_dna/newDNA = new(T.real_name, T.dna, T.species.name, T.languages) + absorbDNA(newDNA) feedback_add_details("changeling_powers","ED") return 1 + +/mob/proc/armblades() + set category = "Changeling" + set name = "Form Blades" + set desc="Rupture the flesh and mend the bone of your hand into a deadly blade." + + var/mob/living/M = src + + if(M.l_hand && M.r_hand) + M << "Your hands are full." + return + + var/obj/item/weapon/melee/arm_blade/blade = new(M) + blade.creator = M + M.put_in_hands(blade) + playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) + src.visible_message("A grotesque blade forms around [M]\'s arm!", + "Our arm twists and mutates, transforming it into a deadly blade.", + "You hear organic matter ripping and tearing!") + gibs(src.loc) + +/mob/proc/changeling_shield() + set category = "Changeling" + set name = "Form Shield" + set desc="Bend the flesh and bone of your hand into a grotesque shield." + + var/mob/living/M = src + + if(M.l_hand && M.r_hand) + M << "Your hands are full." + return + + var/obj/item/weapon/shield/riot/changeling/shield = new(M) + shield.creator = M + M.put_in_hands(shield) + playsound(loc, 'sound/effects/blobattack.ogg', 30, 1) + src.visible_message("The end of [M]\'s hand inflates rapidly, forming a huge shield-like mass!", + "We inflate our hand into a robust shield.", + "You hear organic matter ripping and tearing!") + gibs(src.loc) + +//dna related datum + +/datum/absorbed_dna + var/name + var/datum/dna/dna + var/speciesName + var/list/languages + +/datum/absorbed_dna/New(var/newName, var/newDNA, var/newSpecies, var/newLanguages) + ..() + name = newName + dna = newDNA + speciesName = newSpecies + languages = newLanguages diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm index 7ba0052b816..303016281a2 100644 --- a/code/game/gamemodes/changeling/modularchangling.dm +++ b/code/game/gamemodes/changeling/modularchangling.dm @@ -26,12 +26,6 @@ var/list/datum/power/changeling/powerinstances = list() genomecost = 0 verbpath = /mob/proc/changeling_transform -/datum/power/changeling/change_species - name = "Change Species" - desc = "We take on the apperance of a species that we have absorbed." - genomecost = 0 - verbpath = /mob/proc/changeling_change_species - /datum/power/changeling/fakedeath name = "Regenerative Stasis" desc = "We become weakened to a death-like state, where we will rise again from death." @@ -64,14 +58,14 @@ var/list/datum/power/changeling/powerinstances = list() /datum/power/changeling/deaf_sting name = "Deaf Sting" - desc = "We silently sting a human, completely deafening them for a short time." + desc = "We sting a human, completely deafening them for a short time." genomecost = 1 allowduringlesserform = 1 verbpath = /mob/proc/changeling_deaf_sting /datum/power/changeling/blind_sting name = "Blind Sting" - desc = "We silently sting a human, completely blinding them for a short time." + desc = "We sting a human, completely blinding them for a short time." genomecost = 2 allowduringlesserform = 1 verbpath = /mob/proc/changeling_blind_sting @@ -108,7 +102,7 @@ var/list/datum/power/changeling/powerinstances = list() /datum/power/changeling/paralysis_sting name = "Paralysis Sting" - desc = "We silently sting a human, paralyzing them for a short time." + desc = "We sting a human, paralyzing them for a short time." genomecost = 8 verbpath = /mob/proc/changeling_paralysis_sting @@ -121,7 +115,7 @@ var/list/datum/power/changeling/powerinstances = list() /datum/power/changeling/DeathSting name = "Death Sting" - desc = "We silently sting a human, filling them with potent chemicals. Their rapid death is all but assured." + desc = "We sting a human, filling them with potent chemicals. Their rapid death is all but assured." genomecost = 10 verbpath = /mob/proc/changeling_DEATHsting @@ -184,7 +178,19 @@ var/list/datum/power/changeling/powerinstances = list() genomecost = 7 verbpath = /mob/proc/changeling_rapidregen +//weapon and armor like powers +/datum/power/changeling/armblades + name = "Mutate Armblades" + desc = "Permits us to reshape our arms into a deadly blade." + genomecost = 2 + verbpath = /mob/proc/armblades + +/datum/power/changeling/shield + name = "Mutate Shield" + desc = "Permits us to bloat our hands into a robust shield." + genomecost = 3 + verbpath = /mob/proc/changeling_shield // Modularchangling, totally stolen from the new player panel. YAYY /datum/changeling/proc/EvolutionMenu()//The new one diff --git a/html/changelogs/alberyk-PR-1765.yml b/html/changelogs/alberyk-PR-1765.yml new file mode 100644 index 00000000000..5af08198159 --- /dev/null +++ b/html/changelogs/alberyk-PR-1765.yml @@ -0,0 +1,12 @@ +author: Alberyk + +delete-after: True + +changes: + - rscadd: "Added arm blades and arm shields abilities to changelings." + - rscadd: "Added visible messages to certain lings stings." + - tweak: "Changelings can now select when getting up after using their regeneration skill." + - tweak: "Changeling transform will now change to the species of the selected dna, replacing change species." + - tweak: "Changelings can't absorb monkeys anymore." + - bugfix: "Fixed organ rejection caused by ling transformation." + - bugfix: "Fixed changeling stings affecting ipcs." diff --git a/icons/obj/changeling.dmi b/icons/obj/changeling.dmi new file mode 100644 index 0000000000000000000000000000000000000000..15f0e3a947550ad6cf044306209b0861a9ff484a GIT binary patch literal 15137 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 Date: Sun, 5 Mar 2017 14:05:57 -0600 Subject: [PATCH 17/55] /vg/ AME port (#1831) changes: Ported /vg/'s anti-matter engine. Anti-matter engine is now orderable from cargo. Anti-matter fuel is now orderable from cargo. Using 1 of each AM crate from Cargo, you can get 240 kW. Note: We already have this engine in our code, this is just an update to it. --- code/__defines/machinery.dm | 5 + code/datums/supplypacks.dm | 41 +++ code/modules/power/antimatter/computer.dm | 7 +- .../power/antimatter/containment_jar.dm | 29 +- code/modules/power/antimatter/control.dm | 280 +++++++++++------- code/modules/power/antimatter/engine.dm | 23 +- code/modules/power/antimatter/fuel.dm | 24 +- code/modules/power/antimatter/shielding.dm | 216 ++++++++------ html/changelogs/lohikar-ame.yml | 4 + icons/obj/machines/new_ame.dmi | Bin 0 -> 22056 bytes nano/templates/ame.tmpl | 56 ++++ 11 files changed, 458 insertions(+), 227 deletions(-) create mode 100644 html/changelogs/lohikar-ame.yml create mode 100644 icons/obj/machines/new_ame.dmi create mode 100644 nano/templates/ame.tmpl diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index ab74ab7ddfe..9758cfdef84 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -105,3 +105,8 @@ var/list/restricted_camera_networks = list(NETWORK_ERT,NETWORK_MERCENARY,"Secret // If this is returned from a machine's process() proc, the machine will stop processing but // will continue to have power calculations done. #define M_NO_PROCESS 27 + +// This controls how much power the AME generates per unit of fuel. +// Assuming 100% efficency, use this equation to figure out power output. +// power_generated = (fuel**2) * AM_POWER_FACTOR +#define AM_POWER_FACTOR 50000 diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 2ca39087c20..73cdc5f6884 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -1733,3 +1733,44 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee containertype = /obj/structure/closet/crate containername = "IPC/Shell tag implanters" group = "Security" + +/datum/supply_packs/ame_ctrl + name = "Antimatter Reactor Control Unit" + contains = list( + /obj/machinery/power/am_control_unit + ) + cost = 40 + containertype = /obj/structure/closet/crate/secure/large + containername = "antimatter reactor control unit kit" + group = "Engineering" + access = access_ce + +/datum/supply_packs/ame_section + name = "Antimatter Reactor Shielding Kit" + contains = list( + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container, + /obj/item/device/am_shielding_container + ) + cost = 20 + containertype = /obj/structure/closet/crate/secure/phoron + containername = "antimatter reactor shielding (9x) crate" + group = "Engineering" + access = access_ce + +/datum/supply_packs/ame_fuel + name = "Antimatter Reactor Fuel" + contains = list( + /obj/item/weapon/am_containment + ) + cost = 20 + containertype = /obj/structure/closet/crate/secure/bin + containername = "antimatter fuel container" + group = "Engineering" + access = access_engine diff --git a/code/modules/power/antimatter/computer.dm b/code/modules/power/antimatter/computer.dm index d531ccfb540..bbb9220f539 100644 --- a/code/modules/power/antimatter/computer.dm +++ b/code/modules/power/antimatter/computer.dm @@ -18,10 +18,10 @@ /obj/machinery/computer/am_engine/New() ..() spawn( 24 ) - for(var/obj/machinery/power/am_engine/engine/E in world) + for(var/obj/machinery/power/am_engine/engine/E in machines) if(E.engine_id == src.engine_id) src.connected_E = E - for(var/obj/machinery/power/am_engine/injector/I in world) + for(var/obj/machinery/power/am_engine/injector/I in machines) if(I.engine_id == src.engine_id) src.connected_I = I return @@ -45,7 +45,7 @@ src.state = STATE_DEFAULT if("login") var/mob/M = usr - var/obj/item/weapon/card/id/I = M.get_active_hand() + var/obj/item/weapon/card/id/I = M.equipped() if (I && istype(I)) if(src.check_access(I)) authenticated = 1 @@ -57,6 +57,7 @@ src.updateUsrDialog() /obj/machinery/computer/am_engine/attack_ai(var/mob/user as mob) + src.add_hiddenprint(user) return src.attack_hand(user) /obj/machinery/computer/am_engine/attack_paw(var/mob/user as mob) diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm index dd0e503bd47..7c2c07b0022 100644 --- a/code/modules/power/antimatter/containment_jar.dm +++ b/code/modules/power/antimatter/containment_jar.dm @@ -1,6 +1,7 @@ /obj/item/weapon/am_containment name = "antimatter containment jar" - desc = "Holds antimatter." + desc = "Holds antimatter. Warranty void if exposed to matter." + description_antag = "Antimatter is extremely volatile, and containment jars are not particularly strong. Weak explosions will reduce the container's integrity, and larger ones will cause it to explode immediately." icon = 'icons/obj/machines/antimatter.dmi' icon_state = "jar" density = 0 @@ -10,24 +11,28 @@ throw_speed = 1 throw_range = 2 - var/fuel = 10000 - var/fuel_max = 10000//Lets try this for now + var/fuel = 1000 // WAS ORIGINALLY 10000 + var/fuel_max = 1000//Lets try this for now var/stability = 100//TODO: add all the stability things to this so its not very safe if you keep hitting in on things + var/exploded = 0 +/obj/item/weapon/am_containment/proc/boom() + var/percent = 0 + if(fuel) + percent = (fuel / fuel_max) * 100 + if(!exploded && percent >= 10) + explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess + exploded=1 + if(src) + qdel(src) /obj/item/weapon/am_containment/ex_act(severity) switch(severity) if(1.0) - explosion(get_turf(src), 1, 2, 3, 5)//Should likely be larger but this works fine for now I guess - if(src) - qdel(src) - return + boom() if(2.0) if(prob((fuel/10)-stability)) - explosion(get_turf(src), 1, 2, 3, 5) - if(src) - qdel(src) - return + boom() stability -= 40 if(3.0) stability -= 20 @@ -38,4 +43,4 @@ if(fuel < wanted) wanted = fuel fuel -= wanted - return wanted \ No newline at end of file + return wanted diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 8c7af58346e..2ed4d447265 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -1,9 +1,13 @@ /obj/machinery/power/am_control_unit name = "antimatter control unit" - desc = "This device injects antimatter into connected shielding units, the more antimatter injected the more power produced. Wrench the device to set it up." - icon = 'icons/obj/machines/antimatter.dmi' + desc = "The control unit for an antimatter reactor. Probably safe." + description_info = "Use a wrench to attach the control unit to the ground, then arrange the reactor sections nearby. Reactor sections can only be activated if they are near the control unit, but otherwise are not restricted in how they must be placed." + description_antag = "The antimatter engine will quickly destabilize if the fuel injection rate is set too high, causing a large explosion." + icon = 'icons/obj/machines/new_ame.dmi' icon_state = "control" - anchored = 1 + var/icon_mod = "on" // on, critical, or fuck + var/old_icon_mod = "on" + anchored = 0 density = 1 use_power = 1 idle_power_usage = 100 @@ -15,18 +19,19 @@ var/update_shield_icons = 0 var/stability = 100 var/exploding = 0 + var/exploded = 0 - var/active = 0//On or not - var/fuel_injection = 2//How much fuel to inject - var/shield_icon_delay = 0//delays resetting for a short time + var/active = 0 //On or not + var/fuel_injection = 2 //How much fuel to inject + var/shield_icon_delay = 0 //delays resetting for a short time var/reported_core_efficiency = 0 var/power_cycle = 0 - var/power_cycle_delay = 4//How many ticks till produce_power is called + var/power_cycle_delay = 4 //How many ticks till produce_power is called var/stored_core_stability = 0 var/stored_core_stability_delay = 0 - var/stored_power = 0//Power to deploy per tick + var/stored_power = 0 //Power to deploy per tick /obj/machinery/power/am_control_unit/New() @@ -34,17 +39,25 @@ linked_shielding = list() linked_cores = list() - -/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just qdel on the others +/obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others for(var/obj/machinery/am_shielding/AMS in linked_shielding) + AMS.control_unit = null qdel(AMS) + for(var/obj/machinery/am_shielding/AMS in linked_cores) + AMS.control_unit = null + qdel(AMS) + qdel(fueljar) + fueljar = null ..() /obj/machinery/power/am_control_unit/process() - if(exploding) - explosion(get_turf(src),8,12,18,12) - if(src) qdel(src) + if(exploding && !exploded) + message_admins("AME explosion at ([x],[y],[z] - JMP) - Last touched by [fingerprintslast]",0,1) + exploded=1 + explosion(get_turf(src),8,10,12,15) + if(src) + qdel(src) if(update_shield_icons && !shield_icon_delay) check_shield_icons() @@ -58,6 +71,8 @@ //Angry buzz or such here return + check_core_stability() + add_avail(stored_power) power_cycle++ @@ -65,41 +80,43 @@ produce_power() power_cycle = 0 - return - - /obj/machinery/power/am_control_unit/proc/produce_power() - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - var/core_power = reported_core_efficiency//Effectively how much fuel we can safely deal with - if(core_power <= 0) return 0//Something is wrong + playsound(get_turf(src), 'sound/effects/bang.ogg', 25, 1) + for (var/thing in linked_cores) + flick("core2", thing) + var/core_power = reported_core_efficiency //Effectively how much fuel we can safely deal with + if(core_power <= 0) + return 0//Something is wrong var/core_damage = 0 var/fuel = fueljar.usefuel(fuel_injection) - stored_power = (fuel/core_power)*fuel*200000 + stored_power = (fuel / core_power) * fuel * AM_POWER_FACTOR // Was 200000, was too much. New value run past Aurx. - N3X //Now check if the cores could deal with it safely, this is done after so you can overload for more power if needed, still a bad idea - if(fuel > (2*core_power))//More fuel has been put in than the current cores can deal with - if(prob(50))core_damage = 1//Small chance of damage - if((fuel-core_power) > 5) core_damage = 5//Now its really starting to overload the cores - if((fuel-core_power) > 10) core_damage = 20//Welp now you did it, they wont stand much of this - if(core_damage == 0) return + if(fuel > (2*core_power)) //More fuel has been put in than the current cores can deal with + if(prob(50)) + core_damage = 1 //Small chance of damage + if((fuel-core_power) > 5) + core_damage = 5 //Now its really starting to overload the cores + if((fuel-core_power) > 10) + core_damage = 20 //Welp now you did it, they wont stand much of this + if(core_damage == 0) + return for(var/obj/machinery/am_shielding/AMS in linked_cores) AMS.stability -= core_damage AMS.check_stability(1) - playsound(src.loc, 'sound/effects/bang.ogg', 50, 1) - return - + playsound(get_turf(src), 'sound/effects/bang.ogg', 50, 1) /obj/machinery/power/am_control_unit/emp_act(severity) switch(severity) if(1) - if(active) toggle_power() + if(active) + toggle_power() stability -= rand(15,30) if(2) - if(active) toggle_power() + if(active) + toggle_power() stability -= rand(10,20) ..() - return 0 - /obj/machinery/power/am_control_unit/ex_act(severity) switch(severity) @@ -112,55 +129,50 @@ check_stability() return - -/obj/machinery/power/am_control_unit/bullet_act(var/obj/item/projectile/Proj) - if(Proj.check_armour != "bullet") - stability -= Proj.force - return 0 - - /obj/machinery/power/am_control_unit/power_change() ..() if(stat & NOPOWER && active) toggle_power() return - /obj/machinery/power/am_control_unit/update_icon() - if(active) icon_state = "control_on" - else icon_state = "control" + if(active) + icon_state = "control_[icon_mod]" + else + icon_state = "control" //No other icons for it atm - /obj/machinery/power/am_control_unit/attackby(obj/item/W, mob/user) - if(!istype(W) || !user) return - if(istype(W, /obj/item/weapon/wrench)) + if(!istype(W) || !user) + return + if(iswrench(W)) if(!anchored) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] secures the [src.name] to the floor.", \ "You secure the anchor bolts to the floor.", \ "You hear a ratchet") src.anchored = 1 + update_shield_icons = 2 + check_shield_icons() connect_to_network() else if(!linked_shielding.len > 0) - playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1) + playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1) user.visible_message("[user.name] unsecures the [src.name].", \ "You remove the anchor bolts.", \ "You hear a ratchet") src.anchored = 0 disconnect_from_network() else - user << "\red Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!" + to_chat(user, "Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!") return if(istype(W, /obj/item/weapon/am_containment)) if(fueljar) - user << "\red There is already a [fueljar] inside!" + to_chat(user, "There is already a [fueljar] inside!") return fueljar = W - user.remove_from_mob(W) - W.loc = src - user.update_icons() + user.drop_from_inventory(W, src) + message_admins("AME loaded with fuel by [user.real_name] ([user.key]) at ([x],[y],[z] - JMP)",0,1) user.visible_message("[user.name] loads an [W.name] into the [src.name].", \ "You load an [W.name].", \ "You hear a thunk.") @@ -180,19 +192,25 @@ /obj/machinery/power/am_control_unit/proc/add_shielding(var/obj/machinery/am_shielding/AMS, var/AMS_linking = 0) - if(!istype(AMS)) return 0 - if(!anchored) return 0 - if(!AMS_linking && !AMS.link_control(src)) return 0 - linked_shielding.Add(AMS) + if(!istype(AMS)) + return 0 + if(!anchored) + return 0 + if(!AMS_linking && !AMS.link_control(src)) + return 0 + if(!(AMS in linked_shielding)) + linked_shielding.Add(AMS) update_shield_icons = 1 return 1 /obj/machinery/power/am_control_unit/proc/remove_shielding(var/obj/machinery/am_shielding/AMS) - if(!istype(AMS)) return 0 + if(!istype(AMS)) + return 0 linked_shielding.Remove(AMS) update_shield_icons = 2 - if(active) toggle_power() + if(active) + toggle_power() return 1 @@ -210,40 +228,63 @@ else use_power = 1 visible_message("The [src.name] shuts down.") + for(var/obj/machinery/am_shielding/AMS in linked_cores) + AMS.update_icon() update_icon() return /obj/machinery/power/am_control_unit/proc/check_shield_icons()//Forces icon_update for all shields - if(shield_icon_delay) return + if(shield_icon_delay) + return shield_icon_delay = 1 if(update_shield_icons == 2)//2 means to clear everything and rebuild + for(var/obj/machinery/am_shielding/neighbor in cardinalrange(loc)) + if(!neighbor.control_unit) + linked_shielding += neighbor for(var/obj/machinery/am_shielding/AMS in linked_shielding) - if(AMS.processing) AMS.shutdown_core() + if(AMS.processing) + AMS.shutdown_core() AMS.control_unit = null spawn(10) AMS.controllerscan() + AMS.assimilate() linked_shielding = list() else for(var/obj/machinery/am_shielding/AMS in linked_shielding) AMS.update_icon() - spawn(20) - shield_icon_delay = 0 - return + sleep(20) + shield_icon_delay = 0 /obj/machinery/power/am_control_unit/proc/check_core_stability() - if(stored_core_stability_delay || linked_cores.len <= 0) return - stored_core_stability_delay = 1 + //if(stored_core_stability_delay || linked_cores.len <= 0) return + if(linked_cores.len <= 0) + return + //stored_core_stability_delay = 1 stored_core_stability = 0 - for(var/obj/machinery/am_shielding/AMS in linked_cores) - stored_core_stability += AMS.stability - stored_core_stability/=linked_cores.len - spawn(40) - stored_core_stability_delay = 0 - return + for(var/thing in linked_cores) + var/obj/machinery/am_shielding/AMS = thing + if (!AMS || AMS.gcDestroyed) + continue + stored_core_stability += AMS.stability + stored_core_stability /= linked_cores.len + switch(stored_core_stability) + if(0 to 24) + icon_mod = "fuck" + if(25 to 49) + icon_mod = "critical" + if(50 to INFINITY) + icon_mod = "on" + + if(icon_mod != old_icon_mod) + old_icon_mod = icon_mod + update_icon() + + //spawn(40) + // stored_core_stability_delay = 0 /obj/machinery/power/am_control_unit/interact(mob/user) if((get_dist(src, user) > 1) || (stat & (BROKEN|NOPOWER))) @@ -251,43 +292,56 @@ user.unset_machine() user << browse(null, "window=AMcontrol") return - user.set_machine(src) + return ui_interact(user) - var/dat = "" - dat += "AntiMatter Control Panel
    " - dat += "Close
    " - dat += "Refresh
    " - dat += "Force Shielding Update

    " - dat += "Status: [(active?"Injecting":"Standby")]
    " - dat += "Toggle Status
    " +/obj/machinery/power/am_control_unit/ui_interact(mob/user, ui_key = "main") + if(!user) + return - dat += "Instability: [stability]%
    " - dat += "Reactor parts: [linked_shielding.len]
    "//TODO: perhaps add some sort of stability check - dat += "Cores: [linked_cores.len]

    " - dat += "-Current Efficiency: [reported_core_efficiency]
    " - dat += "-Average Stability: [stored_core_stability] (update)
    " - dat += "Last Produced: [stored_power]
    " + var/list/fueljar_data=null + if(fueljar) + fueljar_data=list( + "fuel"=fueljar.fuel, + "fuel_max"=fueljar.fuel_max, + "injecting"=fuel_injection + ) - dat += "Fuel: " - if(!fueljar) - dat += "
    No fuel receptacle detected." + var/list/data = list( + "active" = active, + //"stability" = stability, + "linked_shields" = linked_shielding.len, + "linked_cores" = linked_cores.len, + "efficiency" = reported_core_efficiency, + "stability" = stored_core_stability, + "stored_power" = stored_power, + "fueljar" = fueljar_data, + "siliconUser" = istype(user, /mob/living/silicon) + ) + + var/datum/nanoui/ui = nanomanager.get_open_ui(user, src, ui_key) + if (!ui) + // the ui does not exist, so we'll create a new one + ui = new(user, src, ui_key, "ame.tmpl", "Antimatter Control Unit", 500, data["siliconUser"] ? 465 : 390) + // When the UI is first opened this is the data it will use + ui.set_initial_data(data) + ui.open() + // Auto update every Master Controller tick + ui.set_auto_update(1) else - dat += "Eject
    " - dat += "- [fueljar.fuel]/[fueljar.fuel_max] Units
    " - - dat += "- Injecting: [fuel_injection] units
    " - dat += "- --|++

    " - - - user << browse(dat, "window=AMcontrol;size=420x500") - onclose(user, "AMcontrol") - return + // The UI is already open so push the new data to it + ui.push_data(data) + return /obj/machinery/power/am_control_unit/Topic(href, href_list) - ..() + if(..()) + return 1 + if(href_list["close"]) + if(usr.machine == src) + usr.unset_machine() + return 1 //Ignore input if we are broken or guy is not touching us, AI can control from a ways away - if(stat & (BROKEN|NOPOWER) || (get_dist(src, usr) > 1 && !istype(usr, /mob/living/silicon/ai))) + if(stat & (BROKEN|NOPOWER)) usr.unset_machine() usr << browse(null, "window=AMcontrol") return @@ -299,26 +353,34 @@ if(href_list["togglestatus"]) toggle_power() + message_admins("AME toggled [active?"on":"off"] by [usr.real_name] ([usr.key]) at ([x],[y],[z] - JMP)",0,1) + return 1 if(href_list["refreshicons"]) - update_shield_icons = 1 + update_shield_icons = 2 // Fuck it + return 1 if(href_list["ejectjar"]) if(fueljar) - fueljar.loc = src.loc + message_admins("AME fuel jar ejected by [usr.real_name] ([usr.key]) at ([x],[y],[z] - JMP)",0,1) + fueljar.forceMove(src.loc) fueljar = null //fueljar.control_unit = null currently it does not care where it is //update_icon() when we have the icon for it + return 1 - if(href_list["strengthup"]) - fuel_injection++ - - if(href_list["strengthdown"]) - fuel_injection-- - if(fuel_injection < 0) fuel_injection = 0 + if(href_list["set_strength"]) + var/newval = input("Enter new injection strength") as num|null + if(isnull(newval)) + return + fuel_injection=newval + fuel_injection=max(1,fuel_injection) + message_admins("AME injection strength set to [fuel_injection] by [usr.real_name] ([usr.key]) at ([x],[y],[z] - JMP)",0,1) + return 1 if(href_list["refreshstability"]) check_core_stability() + return 1 updateDialog() - return \ No newline at end of file + return 1 diff --git a/code/modules/power/antimatter/engine.dm b/code/modules/power/antimatter/engine.dm index a2d4a38ca04..a1ff0845c98 100644 --- a/code/modules/power/antimatter/engine.dm +++ b/code/modules/power/antimatter/engine.dm @@ -38,16 +38,18 @@ /obj/machinery/power/am_engine/injector/attackby(obj/item/weapon/fuel/F, mob/user) - if( (stat & BROKEN) || !connected) return + if( (stat & BROKEN) || !connected) + return if(istype(F, /obj/item/weapon/fuel/H)) if(injecting) - user << "Theres already a fuel rod in the injector!" + to_chat(user, "There's already a fuel rod in the injector!") return - user << "You insert the rod into the injector" + to_chat(user, "You insert the rod into the injector.") injecting = 1 var/fuel = F.fuel qdel(F) + F = null spawn( 300 ) injecting = 0 new/obj/item/weapon/fuel(src.loc) @@ -55,12 +57,13 @@ if(istype(F, /obj/item/weapon/fuel/antiH)) if(injecting) - user << "Theres already a fuel rod in the injector!" + to_chat(user, "There's already a fuel rod in the injector!") return - user << "You insert the rod into the injector" + to_chat(user, "You insert the rod into the injector.") injecting = 1 var/fuel = F.fuel qdel(F) + F = null spawn( 300 ) injecting = 0 new /obj/item/weapon/fuel(src.loc) @@ -83,6 +86,7 @@ /obj/machinery/power/am_engine/engine/proc/engine_go() + if( (!src.connected) || (stat & BROKEN) ) return @@ -109,7 +113,7 @@ antiH_fuel = residual_matter for(var/mob/M in hearers(src, null)) - M.show_message(text("\red You hear a loud bang!")) + M.show_message(text("You hear a loud bang!")) //Q = k x (delta T) @@ -123,6 +127,7 @@ /obj/machinery/power/am_engine/engine/proc/engine_process() + do if( (!src.connected) || (stat & BROKEN) ) return @@ -161,7 +166,7 @@ if(energy > convert2energy(8e-12)) //TOO MUCH ENERGY for(var/mob/M in hearers(src, null)) - M.show_message(text("\red You hear a loud whirring!")) + M.show_message(text("You hear a loud whirring!")) sleep(20) //Q = k x (delta T) @@ -180,7 +185,7 @@ if(energy > convert2energy(8e-12)) //FAR TOO MUCH ENERGY STILL for(var/mob/M in hearers(src, null)) - M.show_message(text("\red BANG!")) + M.show_message(text("BANG!")) new /obj/effect/bhole(src.loc) else //this amount of energy is okay so it does the proper output thing @@ -204,4 +209,4 @@ stopping = 0 - return \ No newline at end of file + return diff --git a/code/modules/power/antimatter/fuel.dm b/code/modules/power/antimatter/fuel.dm index 56098a0b56d..b700253c5cf 100644 --- a/code/modules/power/antimatter/fuel.dm +++ b/code/modules/power/antimatter/fuel.dm @@ -1,5 +1,5 @@ /obj/item/weapon/fuel - name = "Magnetic Storage Ring" + name = "nagnetic storage ring" desc = "A magnetic storage ring." icon = 'icons/obj/items.dmi' icon_state = "rcdammo" @@ -11,12 +11,12 @@ var/content = null /obj/item/weapon/fuel/H - name = "Hydrogen storage ring" + name = "hydrogen storage ring" content = "Hydrogen" fuel = 1e-12 //pico-kilogram /obj/item/weapon/fuel/antiH - name = "Anti-Hydrogen storage ring" + name = "anti-hydrogen storage ring" content = "Anti-Hydrogen" fuel = 1e-12 //pico-kilogram @@ -26,16 +26,17 @@ if(istype(F, /obj/item/weapon/fuel/antiH)) src.fuel += F.fuel F.fuel = 0 - user << "You have added the anti-Hydrogen to the storage ring, it now contains [src.fuel]kg" + to_chat(user, "You add the anti-Hydrogen to the storage ring. It now contains [src.fuel]kg.") if(istype(F, /obj/item/weapon/fuel/H)) src.fuel += F.fuel qdel(F) + F = null src:annihilation(src.fuel) if(istype(src, /obj/item/weapon/fuel/H)) if(istype(F, /obj/item/weapon/fuel/H)) src.fuel += F.fuel F.fuel = 0 - user << "You have added the Hydrogen to the storage ring, it now contains [src.fuel]kg" + to_chat(user, "You add the Hydrogen to the storage ring. It now contains [src.fuel]kg") if(istype(F, /obj/item/weapon/fuel/antiH)) src.fuel += F.fuel qdel(src) @@ -43,6 +44,7 @@ /obj/item/weapon/fuel/antiH/proc/annihilation(var/mass) + var/strength = convert2energy(mass) if (strength < 773.0) @@ -67,21 +69,23 @@ return -/obj/item/weapon/fuel/examine(mob/user) - if(get_dist(src, user) <= 1) - user << "A magnetic storage ring, it contains [fuel]kg of [content ? content : "nothing"]." +/obj/item/weapon/fuel/examine() + ..() + to_chat(user, "A magnetic storage ring containing [fuel]kg of [content ? content : "nothing"].") /obj/item/weapon/fuel/proc/injest(mob/M as mob) switch(content) if("Anti-Hydrogen") + mob << span("notice", "That was not a very bright idea.") M.gib() if("Hydrogen") - M << "\blue You feel very light, as if you might just float away..." + to_chat(M, "You feel very light, as if you might just float away...") qdel(src) return /obj/item/weapon/fuel/attack(mob/M as mob, mob/user as mob) if (user != M) + //If you come from the distant future and happen to find this unincluded and derelict file, you may be wondering what this is. In truth, it's better that you don't know. var/obj/effect/equip_e/human/O = new /obj/effect/equip_e/human( ) O.source = user O.target = M @@ -95,5 +99,5 @@ return else for(var/mob/O in viewers(M, null)) - O.show_message(text("\red [M] ate the [content ? content : "empty canister"]!"), 1) + O.show_message(text("\The [M] eats the [content ? content : "empty canister"]!"), 1) src.injest(M) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 4f89687fb4e..ece15f20691 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -3,15 +3,19 @@ proc/cardinalrange(var/center) var/list/things = list() for(var/direction in cardinal) var/turf/T = get_step(center, direction) - if(!T) continue + if(!T) + continue things += T.contents return things /obj/machinery/am_shielding name = "antimatter reactor section" - desc = "This device was built using a phoron life-form that seems to increase phoron's natural ability to react with neutrinos while reducing the combustibility." + desc = "A shielding component for an antimatter reactor. Looks delicate." + description_info = "Antimatter shielding sections must be beside an anchored control unit or another shielding section. If either are destroyed, the section will disappear." + description_antag = "Antimatter shielding sections are delicate. Attacking the shielding unit with a damaging object will reduce its stability, as will explosions. If the stability hits zero, the reactor may explode." - icon = 'icons/obj/machines/antimatter.dmi' + //icon = 'icons/obj/machines/antimatter.dmi' + icon = 'icons/obj/machines/new_ame.dmi' icon_state = "shield" anchored = 1 density = 1 @@ -24,14 +28,42 @@ proc/cardinalrange(var/center) var/processing = 0//To track if we are in the update list or not, we need to be when we are damaged and if we ever var/stability = 100//If this gets low bad things tend to happen var/efficiency = 1//How many cores this core counts for when doing power processing, phoron in the air and stability could affect this + var/coredirs = 0 + var/dirs = 0 + var/mapped = 0 //Set to 1 to ignore usual suicide if it doesn't immediately find a control_unit +// Stupidly easy way to use it in maps +/obj/machinery/am_shielding/map + mapped = 1 -/obj/machinery/am_shielding/New(loc) - ..(loc) - spawn(10) +/obj/machinery/am_shielding/New(loc, var/obj/machinery/power/am_control_unit/AMC) + ..() + if(!AMC) + if (!mapped) + WARNING("AME sector somehow created without a parent control unit!") controllerscan() - return + return + link_control(AMC) + remove_machine(src) + spawn (10) + update_icon() +/obj/machinery/am_shielding/proc/link_control(var/obj/machinery/power/am_control_unit/AMC) + if(!istype(AMC)) + return 0 + if(control_unit && control_unit != AMC) + return 0//Already have one + control_unit = AMC + return control_unit.add_shielding(src,1) + +/obj/machinery/am_shielding/Destroy() + if(control_unit) + control_unit.remove_shielding(src) + if(processing) + shutdown_core() + visible_message("\The [src.name] melts!") + //Might want to have it leave a mess on the floor but no sprites for now + ..() /obj/machinery/am_shielding/proc/controllerscan(var/priorscan = 0) //Make sure we are the only one here @@ -39,9 +71,9 @@ proc/cardinalrange(var/center) qdel(src) return for(var/obj/machinery/am_shielding/AMS in loc.contents) - if(AMS == src) continue - spawn(0) - qdel(src) + if(AMS == src) + continue + qdel(src) return //Search for shielding first @@ -49,41 +81,37 @@ proc/cardinalrange(var/center) if(AMS && AMS.control_unit && link_control(AMS.control_unit)) break - if(!control_unit)//No other guys nearby look for a control unit - for(var/direction in cardinal) + if(!control_unit)//No other guys nearby, look for a control unit for(var/obj/machinery/power/am_control_unit/AMC in cardinalrange(src)) if(AMC.add_shielding(src)) break - - if(!control_unit) - if(!priorscan) - spawn(20) + if(!mapped) // Prevent rescanning and suicide if it's part of the map + if(!priorscan) + sleep(20) controllerscan(1)//Last chance - return - spawn(0) + return qdel(src) - return +// Find surrounding unconnected shielding and add them to our controller +/obj/machinery/am_shielding/proc/assimilate() + if(!control_unit) + return // nothing to share :'^( + for(var/obj/machinery/am_shielding/neighbor in cardinalrange(src)) + if(neighbor && !neighbor.control_unit) + neighbor.link_control(control_unit) + neighbor.assimilate() // recursion is fun, right? -/obj/machinery/am_shielding/Destroy() - if(control_unit) control_unit.remove_shielding(src) - if(processing) shutdown_core() - visible_message("\red The [src.name] melts!") - //Might want to have it leave a mess on the floor but no sprites for now - ..() - return - - -/obj/machinery/am_shielding/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) - if(air_group || (height==0)) return 1 +/obj/machinery/am_shielding/Cross(atom/movable/mover, turf/target, height=1.5, air_group = 0) + if(air_group || (height==0)) + return 1 return 0 /obj/machinery/am_shielding/process() - if(!processing) . = PROCESS_KILL + if(!processing) + . = PROCESS_KILL //TODO: core functions and stability //TODO: think about checking the airmix for phoron and increasing power output - return /obj/machinery/am_shielding/emp_act()//Immune due to not really much in the way of electronics. @@ -98,110 +126,130 @@ proc/cardinalrange(var/center) stability -= 40 if(3.0) stability -= 20 - check_stability() - return - - -/obj/machinery/am_shielding/bullet_act(var/obj/item/projectile/Proj) - if(Proj.check_armour != "bullet") - stability -= Proj.force/2 - return 0 - /obj/machinery/am_shielding/update_icon() - overlays.Cut() + overlays.len = 0 + coredirs = 0 + dirs = 0 for(var/direction in alldirs) - var/machine = locate(/obj/machinery, get_step(loc, direction)) - if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit)||(istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit)) - overlays += "shield_[direction]" + var/turf/T = get_step(loc, direction) + for(var/obj/machinery/machine in T) + // Detect cores + if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit && machine:processing)) + coredirs |= direction + + // Detect cores, shielding, and control boxen. + if(direction in cardinal) + if((istype(machine, /obj/machinery/am_shielding) && machine:control_unit == control_unit) || (istype(machine, /obj/machinery/power/am_control_unit) && machine == control_unit)) + dirs |= direction + + // If we're next to a core, set the prefix. + var/prefix = "" + var/icondirs = dirs + + if(coredirs) + prefix="core" + + // Set our overlay + icon_state = "[prefix]shield_[icondirs]" if(core_check()) - overlays += "core" - if(!processing) setup_core() - else if(processing) shutdown_core() + icon_state = "core[control_unit && control_unit.active]" + if(!processing) + setup_core() + else if(processing) + shutdown_core() /obj/machinery/am_shielding/attackby(obj/item/W, mob/user) - if(!istype(W) || !user) return + if(!istype(W) || !user) + return if(W.force > 10) stability -= W.force/2 check_stability() ..() return - - -//Call this to link a detected shilding unit to the controller -/obj/machinery/am_shielding/proc/link_control(var/obj/machinery/power/am_control_unit/AMC) - if(!istype(AMC)) return 0 - if(control_unit && control_unit != AMC) return 0//Already have one - control_unit = AMC - control_unit.add_shielding(src,1) - return 1 - - //Scans cards for shields or the control unit and if all there it /obj/machinery/am_shielding/proc/core_check() for(var/direction in alldirs) - var/machine = locate(/obj/machinery, get_step(loc, direction)) - if(!machine) return 0//Need all for a core - if(!istype(machine, /obj/machinery/am_shielding) && !istype(machine, /obj/machinery/power/am_control_unit)) return 0 + var/found_am_device=0 + for(var/obj/machinery/machine in get_step(loc, direction)) + if(!machine) + continue + if(istype(machine, /obj/machinery/am_shielding) || istype(machine, /obj/machinery/power/am_control_unit)) + found_am_device=1 + break + if(!found_am_device) + return 0 return 1 /obj/machinery/am_shielding/proc/setup_core() processing = 1 - machines.Add(src) - if(!control_unit) return + if(!control_unit) + return control_unit.linked_cores.Add(src) control_unit.reported_core_efficiency += efficiency - return /obj/machinery/am_shielding/proc/shutdown_core() processing = 0 - if(!control_unit) return + if(!control_unit) + return control_unit.linked_cores.Remove(src) control_unit.reported_core_efficiency -= efficiency - return /obj/machinery/am_shielding/proc/check_stability(var/injecting_fuel = 0) - if(stability > 0) return + if(stability > 0) + return if(injecting_fuel && control_unit) control_unit.exploding = 1 - if(src) - qdel(src) - return - + qdel(src) /obj/machinery/am_shielding/proc/recalc_efficiency(var/new_efficiency)//tbh still not 100% sure how I want to deal with efficiency so this is likely temp - if(!control_unit || !processing) return + if(!control_unit || !processing) + return if(stability < 50) new_efficiency /= 2 control_unit.reported_core_efficiency += (new_efficiency - efficiency) efficiency = new_efficiency - return /obj/item/device/am_shielding_container name = "packaged antimatter reactor section" - desc = "A small storage unit containing an antimatter reactor section. To use place near an antimatter control unit or deployed antimatter reactor section and use a multitool to activate this package." + desc = "A section of antimatter reactor shielding. Do not eat." + description_info = "To deploy, drop near an antimatter control unit or an existing deployed section and use your multitool on it." icon = 'icons/obj/machines/antimatter.dmi' icon_state = "box" item_state = "electronic" - w_class = 4.0 - flags = CONDUCT + siemens_coefficient = 1 throwforce = 5 throw_speed = 1 throw_range = 2 - matter = list(DEFAULT_WALL_MATERIAL = 100, "waste" = 2000) /obj/item/device/am_shielding_container/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/device/multitool) && istype(src.loc,/turf)) - new/obj/machinery/am_shielding(src.loc) - qdel(src) - return + if(ismultitool(I) && isturf(loc)) + if(locate(/obj/machinery/am_shielding/) in loc) + to_chat(user, "\icon[src]There is already an antimatter reactor section there.") + return + + //Search for shielding first + for(var/obj/machinery/am_shielding/AMS in cardinalrange(src)) + if(AMS.control_unit) + new/obj/machinery/am_shielding(src.loc, AMS.control_unit) + qdel(src) + return + + //No other guys nearby, look for a control unit + var/obj/machinery/power/am_control_unit/AMC = locate() in cardinalrange(src) + if(AMC && AMC.anchored) + new/obj/machinery/am_shielding(src.loc, AMC) + qdel(src) + else //Stranded & Alone + to_chat(user, "\icon[src]Couldn't connect to an Antimatter Control Unit.") + return + ..() - return \ No newline at end of file diff --git a/html/changelogs/lohikar-ame.yml b/html/changelogs/lohikar-ame.yml new file mode 100644 index 00000000000..3c494891011 --- /dev/null +++ b/html/changelogs/lohikar-ame.yml @@ -0,0 +1,4 @@ +author: Lohikar +delete-after: True +changes: + - rscadd: "A new engine type is now orderable from cargo." diff --git a/icons/obj/machines/new_ame.dmi b/icons/obj/machines/new_ame.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2c7c6b24748528b04b9adbbdc8684f63db396fcf GIT binary patch literal 22056 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

    9b^sSeY)fe)b4-^U9p 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 VU4dsB_y8;fxomcKqC4#W{XZc@^1uK9 literal 0 HcmV?d00001 diff --git a/nano/templates/ame.tmpl b/nano/templates/ame.tmpl new file mode 100644 index 00000000000..92501ee4655 --- /dev/null +++ b/nano/templates/ame.tmpl @@ -0,0 +1,56 @@ +

    +
    Status:
    + {{if data.active}} +
    Injecting
    + {{else}} +
    Standby
    + {{/if}} +  {{:helper.link("Toggle Status", "gear", {"togglestatus":1},null)}} +
    +{{if !data.fueljar}} +
    No fuel jar detected.
    +{{else}} +
    +
    +
    Fuel:
    +
    {{:data.fueljar.fuel}}/{{:data.fueljar.fuel_max}}
    + {{:helper.link("Eject", "eject", {"ejectjar":1},null,'floatRight')}} +
    +
    +
    Injecting:
    +
    + {{:helper.link(data.fueljar.injecting+" units", 'carat-2-n-s', {'set_strength': 1})}} +
    +
    +
    +{{/if}} +
    +
    +
    Stability:
    +
    + {{:helper.displayBar(data.stability,0,100,"good")}} + {{:data.stability}}% +
    +
    +
    +
    Shielding Count:
    +
    {{:data.linked_shields}}
    +
    +
    +
    Cores:
    +
    {{:data.linked_cores}}
    + {{:helper.link("Refresh Parts",null,{"refreshicons" : 1},(data.active?"disabled":null),'floatRight')}} +
    +
    +
    Current Efficiency:
    +
    {{:data.efficiency}}
    +
    +
    +
    Average Efficiency:
    +
    {{:data.stability}}
    +
    +
    +
    Last Produced:
    +
    {{:data.stored_power}}
    +
    +
    \ No newline at end of file From e2725ab4cb9672705aee681faa3eda3910be3f8d Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 5 Mar 2017 14:28:11 -0600 Subject: [PATCH 18/55] Computer dark visibility tweaks (#1829) changes: Holo-computers' displays now draw above the lighting layer, allowing them to be seen in the dark. APCs' displays now draw above the lighting layer, allowing them to be seen in the dark. --- baystation12.dme | 1 + code/__defines/lighting.dm | 5 +++ code/_helpers/overlay.dm | 33 ++++++++++++++++++ code/game/machinery/computer/RCON_Console.dm | 2 +- code/game/machinery/computer/camera.dm | 2 ++ code/game/machinery/computer/computer.dm | 5 ++- code/game/machinery/computer/guestpass.dm | 1 + code/game/machinery/computer/medical.dm | 2 +- code/game/machinery/computer/shuttle.dm | 1 + code/game/machinery/computer/skills.dm | 2 +- .../computers/modular_computer/core.dm | 21 +++++++++--- .../computers/modular_computer/power.dm | 20 ++++++++--- .../computers/modular_computer/variables.dm | 2 ++ .../computers/subtypes/dev_console.dm | 1 + .../computers/subtypes/dev_telescreen.dm | 1 + code/modules/power/apc.dm | 34 +++++++++---------- maps/exodus-1.dmm | 24 ++++++------- 17 files changed, 114 insertions(+), 43 deletions(-) create mode 100644 code/_helpers/overlay.dm diff --git a/baystation12.dme b/baystation12.dme index 024b5731acc..17b446c8011 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -53,6 +53,7 @@ #include "code\_helpers\matrices.dm" #include "code\_helpers\mobs.dm" #include "code\_helpers\names.dm" +#include "code\_helpers\overlay.dm" #include "code\_helpers\sanitize_values.dm" #include "code\_helpers\spawn_sync.dm" #include "code\_helpers\text.dm" diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index 815f4dc2d82..48ec6f22322 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -82,6 +82,11 @@ #define L_WALLMOUNT_RANGE 2 #define L_WALLMOUNT_HI_POWER 2 // For red/delta alert on fire alarms. #define L_WALLMOUNT_HI_RANGE 4 +// This controls by how much console sprites are dimmed before being overlayed. +#define HOLOSCREEN_ADDITION_FACTOR 1 +#define HOLOSCREEN_MULTIPLICATION_FACTOR 0.5 +#define HOLOSCREEN_ADDITION_OPACITY 0.8 +#define HOLOSCREEN_MULTIPLICATION_OPACITY 1 // Just so we can avoid unneeded proc calls when profiling is disabled. #define L_PROF(O,T) if (lighting_profiling) {lprof_write(O,T);} diff --git a/code/_helpers/overlay.dm b/code/_helpers/overlay.dm new file mode 100644 index 00000000000..3ee93ccaf52 --- /dev/null +++ b/code/_helpers/overlay.dm @@ -0,0 +1,33 @@ +// Factor/Opacity values are defined in __defines\lighting.dm + +/proc/holographic_overlay(obj/target, icon, icon_state) + var/image/multiply = make_screen_overlay(icon, icon_state) + multiply.blend_mode = BLEND_MULTIPLY + multiply.color = list( + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_FACTOR, HOLOSCREEN_MULTIPLICATION_OPACITY + ) + target.overlays += multiply + var/image/overlay = make_screen_overlay(icon, icon_state) + overlay.blend_mode = BLEND_ADD + overlay.color = list( + HOLOSCREEN_ADDITION_FACTOR, 0, 0, 0, + 0, HOLOSCREEN_ADDITION_FACTOR, 0, 0, + 0, 0, HOLOSCREEN_ADDITION_FACTOR, 0, + 0, 0, 0, HOLOSCREEN_ADDITION_OPACITY + ) + target.overlays += overlay + +/proc/make_screen_overlay(icon, icon_state, brightness_factor = null) + var/image/overlay = image(icon, icon_state) + overlay.layer = LIGHTING_LAYER + 0.1 + if (brightness_factor) + overlay.color = list( + brightness_factor, 0, 0, 0, + 0, brightness_factor, 0, 0, + 0, 0, brightness_factor, 0, + 0, 0, 0, 1 + ) + return overlay diff --git a/code/game/machinery/computer/RCON_Console.dm b/code/game/machinery/computer/RCON_Console.dm index ec0d0f3c7d5..3d45813923d 100644 --- a/code/game/machinery/computer/RCON_Console.dm +++ b/code/game/machinery/computer/RCON_Console.dm @@ -40,4 +40,4 @@ /obj/machinery/computer/rcon/update_icon() ..() if(is_operable()) - overlays += image('icons/obj/computer.dmi', "ai-fixer-empty", overlay_layer) + holographic_overlay(src, src.icon, "ai-fixer-empty") diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index cc3fb188f9b..30684a17c4b 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -215,6 +215,7 @@ network = list(NETWORK_THUNDER) density = 0 circuit = null + is_holographic = FALSE /obj/machinery/computer/security/telescreen/entertainment name = "entertainment monitor" @@ -260,6 +261,7 @@ icon_screen = "syndicam" network = list(NETWORK_MERCENARY) circuit = null + is_holographic = FALSE // I mean, it is, but the holo effect looks terrible with the current merc shuttle floor. /obj/machinery/computer/security/nuclear/New() ..() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 66ed07fb01f..775b3aa937f 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -14,6 +14,7 @@ var/light_range_on = 2 var/light_power_on = 1 var/overlay_layer + var/is_holographic = TRUE /obj/machinery/computer/New() overlay_layer = layer @@ -64,8 +65,10 @@ if(stat & BROKEN) overlays += image(icon,"[icon_state]_broken", overlay_layer) + else if (is_holographic) + holographic_overlay(src, src.icon, icon_screen) else - overlays += image(icon,icon_screen, overlay_layer) + overlays += image(icon, icon_screen, overlay_layer) /obj/machinery/computer/power_change() ..() diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index f9c7be55df0..c63134fe0c2 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -47,6 +47,7 @@ light_color = LIGHT_COLOR_BLUE icon_screen = "pass" + is_holographic = FALSE density = 0 var/obj/item/weapon/card/id/giver diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index ac7b363a36b..19c63736c68 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -16,7 +16,6 @@ var/datum/data/record/active2 = null var/a_id = null var/temp = null - //var/printing = null /obj/machinery/computer/med_data/AltClick(var/mob/user) eject_id() @@ -562,3 +561,4 @@ icon_state = "laptop" icon_screen = "medlaptop" + is_holographic = FALSE diff --git a/code/game/machinery/computer/shuttle.dm b/code/game/machinery/computer/shuttle.dm index 735f61947a2..7f6152bdd6d 100644 --- a/code/game/machinery/computer/shuttle.dm +++ b/code/game/machinery/computer/shuttle.dm @@ -2,6 +2,7 @@ name = "Shuttle" desc = "For shuttle control." + is_holographic = FALSE icon_screen = "shuttle" light_color = "#00ffff" var/auth_need = 3.0 diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 713ad039f11..7a0a92b1d2e 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -16,7 +16,7 @@ var/datum/data/record/active1 = null var/a_id = null var/temp = null - //var/printing = null + is_holographic = FALSE var/can_change_id = 0 var/list/Perp var/tempname = null diff --git a/code/modules/modular_computers/computers/modular_computer/core.dm b/code/modules/modular_computers/computers/modular_computer/core.dm index c11c6a69485..12f92976f0a 100644 --- a/code/modules/modular_computers/computers/modular_computer/core.dm +++ b/code/modules/modular_computers/computers/modular_computer/core.dm @@ -1,4 +1,5 @@ /obj/item/modular_computer/process() + handle_power() // Handles all computer power interaction if(!enabled) // The computer is turned off last_power_usage = 0 return 0 @@ -30,7 +31,7 @@ else idle_threads.Remove(P) - handle_power() // Handles all computer power interaction + check_update_ui_need() /obj/item/modular_computer/proc/get_preset_programs(var/app_preset_name) @@ -75,7 +76,7 @@ return NO_EMAG_ACT else computer_emagged = 1 - to_chat(user, "You emag \the [src]. It's screen briefly shows a \"OVERRIDE ACCEPTED: New software downloads available.\" message.") + to_chat(user, "You emag \the [src]. Its screen briefly displays a \"OVERRIDE ACCEPTED: New software downloads available.\" message.") return 1 /obj/item/modular_computer/update_icon() @@ -85,7 +86,10 @@ if(!enabled) var/probably_working = hard_drive && processor_unit && damage < broken_damage && (apc_power(0) || battery_power(0)) if(icon_state_screensaver && probably_working) - overlays.Add(icon_state_screensaver) + if (is_holographic) + holographic_overlay(src, src.icon, icon_state_screensaver) + else + overlays += image(icon_state_screensaver) if (screensaver_light_range && probably_working) set_light(screensaver_light_range, 1, screensaver_light_color ? screensaver_light_color : "#FFFFFF") @@ -93,10 +97,17 @@ set_light(0) return if(active_program) - overlays.Add(active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu) + var/state = active_program.program_icon_state ? active_program.program_icon_state : icon_state_menu + if (is_holographic) + holographic_overlay(src, src.icon, state) + else + overlays += image(state) set_light(light_strength, l_color = active_program.color) else - overlays.Add(icon_state_menu) + if (is_holographic) + holographic_overlay(src, src.icon, icon_state_menu) + else + overlays += image(icon_state_menu) set_light(light_strength, l_color = menu_light_color) /obj/item/modular_computer/proc/turn_on(var/mob/user) diff --git a/code/modules/modular_computers/computers/modular_computer/power.dm b/code/modules/modular_computers/computers/modular_computer/power.dm index 48871619fab..db5db333e16 100644 --- a/code/modules/modular_computers/computers/modular_computer/power.dm +++ b/code/modules/modular_computers/computers/modular_computer/power.dm @@ -7,6 +7,9 @@ PRG.event_powerfailure(1) shutdown_computer(0) + power_has_failed = TRUE + update_icon() + // Tries to use power from battery. Passing 0 as parameter results in this proc returning whether battery is functional or not. /obj/item/modular_computer/proc/battery_power(var/power_usage = 0) apc_powered = FALSE @@ -38,14 +41,21 @@ // Handles power-related things, such as battery interaction, recharging, shutdown when it's discharged /obj/item/modular_computer/proc/handle_power() var/power_usage = screen_on ? base_active_power_usage : base_idle_power_usage - for(var/obj/item/weapon/computer_hardware/H in get_all_components()) - if(H.enabled) - power_usage += H.power_usage - last_power_usage = power_usage + if (enabled) + for(var/obj/item/weapon/computer_hardware/H in get_all_components()) + if(H.enabled) + power_usage += H.power_usage + last_power_usage = power_usage // First tries to charge from an APC, if APC is unavailable switches to battery power. If neither works the computer fails. if(apc_power(power_usage)) + if (power_has_failed) + power_has_failed = FALSE + update_icon() return if(battery_power(power_usage)) + if (power_has_failed) + power_has_failed = FALSE + update_icon() return - power_failure() \ No newline at end of file + power_failure() diff --git a/code/modules/modular_computers/computers/modular_computer/variables.dm b/code/modules/modular_computers/computers/modular_computer/variables.dm index cf8836f089a..40f8c386d84 100644 --- a/code/modules/modular_computers/computers/modular_computer/variables.dm +++ b/code/modules/modular_computers/computers/modular_computer/variables.dm @@ -35,6 +35,8 @@ var/steel_sheet_cost = 5 // Amount of steel sheets refunded when disassembling an empty frame of this computer. var/light_strength = 0 // Intensity of light this computer emits. Comparable to numbers light fixtures use. var/list/idle_threads = list() // Idle programs on background. They still receive process calls but can't be interacted with. + var/power_has_failed = FALSE + var/is_holographic = FALSE // Damage of the chassis. If the chassis takes too much damage it will break apart. var/damage = 0 // Current damage level diff --git a/code/modules/modular_computers/computers/subtypes/dev_console.dm b/code/modules/modular_computers/computers/subtypes/dev_console.dm index 7780ba21a2f..0fe95cc5dfd 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_console.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_console.dm @@ -19,3 +19,4 @@ broken_damage = 150 screensaver_light_range = 1.4 screensaver_light_color = "#0099ff" + is_holographic = TRUE diff --git a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm index 3df8b0e0d27..1fb08ea1cb3 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_telescreen.dm @@ -16,6 +16,7 @@ max_damage = 300 broken_damage = 150 w_class = 5 + is_holographic = TRUE /obj/item/modular_computer/telescreen/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if(istype(W, /obj/item/weapon/crowbar)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 7363f909624..28e7398548c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -276,27 +276,27 @@ status_overlays_lighting.len = 4 status_overlays_environ.len = 4 - status_overlays_lock[1] = image(icon, "apcox-0") // 0=blue 1=red - status_overlays_lock[2] = image(icon, "apcox-1") + status_overlays_lock[1] = make_screen_overlay(icon, "apcox-0") // 0=blue 1=red + status_overlays_lock[2] = make_screen_overlay(icon, "apcox-1") - status_overlays_charging[1] = image(icon, "apco3-0") - status_overlays_charging[2] = image(icon, "apco3-1") - status_overlays_charging[3] = image(icon, "apco3-2") + status_overlays_charging[1] = make_screen_overlay(icon, "apco3-0") + status_overlays_charging[2] = make_screen_overlay(icon, "apco3-1") + status_overlays_charging[3] = make_screen_overlay(icon, "apco3-2") - status_overlays_equipment[1] = image(icon, "apco0-0") - status_overlays_equipment[2] = image(icon, "apco0-1") - status_overlays_equipment[3] = image(icon, "apco0-2") - status_overlays_equipment[4] = image(icon, "apco0-3") + status_overlays_equipment[1] = make_screen_overlay(icon, "apco0-0") + status_overlays_equipment[2] = make_screen_overlay(icon, "apco0-1") + status_overlays_equipment[3] = make_screen_overlay(icon, "apco0-2") + status_overlays_equipment[4] = make_screen_overlay(icon, "apco0-3") - status_overlays_lighting[1] = image(icon, "apco1-0") - status_overlays_lighting[2] = image(icon, "apco1-1") - status_overlays_lighting[3] = image(icon, "apco1-2") - status_overlays_lighting[4] = image(icon, "apco1-3") + status_overlays_lighting[1] = make_screen_overlay(icon, "apco1-0") + status_overlays_lighting[2] = make_screen_overlay(icon, "apco1-1") + status_overlays_lighting[3] = make_screen_overlay(icon, "apco1-2") + status_overlays_lighting[4] = make_screen_overlay(icon, "apco1-3") - status_overlays_environ[1] = image(icon, "apco2-0") - status_overlays_environ[2] = image(icon, "apco2-1") - status_overlays_environ[3] = image(icon, "apco2-2") - status_overlays_environ[4] = image(icon, "apco2-3") + status_overlays_environ[1] = make_screen_overlay(icon, "apco2-0") + status_overlays_environ[2] = make_screen_overlay(icon, "apco2-1") + status_overlays_environ[3] = make_screen_overlay(icon, "apco2-2") + status_overlays_environ[4] = make_screen_overlay(icon, "apco2-3") var/update = check_updates() //returns 0 if no need to update icons. // 1 if we need to update the icon_state diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 4e9dd7a6518..6c26bd4b3c0 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -2991,7 +2991,7 @@ "bfA" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/wood,/area/bridge/meeting_room) "bfB" = (/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) "bfC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) -"bfD" = (/obj/item/modular_computer/console/preset/research,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) +"bfD" = (/obj/item/modular_computer/console/preset/research,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "bfE" = (/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "bfF" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "bfG" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) @@ -3195,7 +3195,7 @@ "bjw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only{dir = 2},/turf/simulated/floor/plating,/area/hallway/secondary/entry/aft) "bjx" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/tiled,/area/hallway/primary/starboard) "bjy" = (/turf/simulated/wall,/area/maintenance/disposal) -"bjz" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/item/modular_computer/console/preset/security,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) +"bjz" = (/obj/effect/decal/cleanable/cobweb2,/obj/machinery/atmospherics/unary/vent_pump/on,/obj/item/modular_computer/console/preset/security,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "bjA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker) "bjB" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) "bjC" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; target_pressure = 200},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3388,12 +3388,12 @@ "bnh" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "bni" = (/obj/structure/sign/chemistry,/turf/simulated/wall/r_wall,/area/medical/chemistry) "bnj" = (/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/maintenance/substation/command) -"bnk" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/modular_computer/console/preset/command,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) +"bnk" = (/obj/machinery/ai_status_display{pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/item/modular_computer/console/preset/command,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "bnl" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) "bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) -"bnn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/modular_computer/console/preset/civilian,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) +"bnn" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/modular_computer/console/preset/civilian,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "bno" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bnp" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/modular_computer/console/preset/engineering,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) +"bnp" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/item/modular_computer/console/preset/engineering,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "bnq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bnr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bns" = (/turf/simulated/wall,/area/medical/reception) @@ -3436,7 +3436,7 @@ "bod" = (/obj/machinery/conveyor_switch/oneway{convdir = -1; id = "garbage"; name = "disposal coveyor"},/turf/simulated/floor/plating,/area/maintenance/disposal) "boe" = (/obj/machinery/alarm{pixel_y = 23},/obj/item/weapon/cigbutt,/turf/simulated/floor/plating,/area/maintenance/disposal) "bof" = (/obj/effect/decal/cleanable/blood/oil,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/maintenance/disposal) -"bog" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/item/modular_computer/console/preset/medical,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) +"bog" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/item/modular_computer/console/preset/medical,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai) "boh" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled{temperature = 278},/area/medical/morgue) "boi" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/locker) "boj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3624,7 +3624,7 @@ "brJ" = (/obj/item/weapon/paper_bin{pixel_y = -10},/obj/item/weapon/folder/white{pixel_y = 0},/obj/item/weapon/pen,/obj/machinery/vending/wallmed1{name = "NanoMed Wall"; pixel_x = 25; pixel_y = 16},/obj/structure/table/standard{name = "plastic table frame"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/turf/simulated/floor/tiled,/area/medical/exam_room) "brK" = (/obj/machinery/disposal/deliveryChute{dir = 1; name = "disposal inlet"},/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/disposal) "brL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/disposal) -"brM" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access = list(20)},/obj/structure/window/reinforced,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) +"brM" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/asimov,/obj/item/weapon/aiModule/freeformcore,/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Core Modules"; req_access = list(20)},/obj/structure/window/reinforced,/obj/item/weapon/aiModule/corp,/obj/item/weapon/aiModule/paladin,/obj/item/weapon/aiModule/robocop,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "brN" = (/obj/machinery/camera/network/civilian_west{c_tag = "Waste Disposal"; dir = 8},/obj/item/weapon/material/ashtray/plastic{pixel_x = 5; pixel_y = -5},/obj/effect/decal/cleanable/ash,/obj/item/weapon/cigbutt/cigarbutt,/turf/simulated/floor/plating,/area/maintenance/disposal) "brO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/locker) "brP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/locker) @@ -3658,7 +3658,7 @@ "bsr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/flasher{id = "AI"; pixel_x = -22; pixel_y = 24},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) "bss" = (/obj/machinery/porta_turret,/obj/item/device/radio/intercom/locked{frequency = 1343; locked_frequency = 1343; name = "Private AI Channel"; pixel_x = -5; pixel_y = 22},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) "bst" = (/obj/machinery/porta_turret,/obj/machinery/alarm/cold{pixel_y = 22},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) -"bsu" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access = list(20)},/obj/item/weapon/aiModule/purge,/obj/structure/window/reinforced,/obj/item/weapon/aiModule/antimov,/obj/item/weapon/aiModule/teleporterOffline,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) +"bsu" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/oxygen,/obj/item/weapon/aiModule/oneHuman,/obj/machinery/door/window{base_state = "left"; dir = 8; icon_state = "left"; name = "High-Risk Modules"; req_access = list(20)},/obj/item/weapon/aiModule/purge,/obj/structure/window/reinforced,/obj/item/weapon/aiModule/antimov,/obj/item/weapon/aiModule/teleporterOffline,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "bsv" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/bodybags,/obj/item/weapon/storage/box/bodybags,/obj/effect/floor_decal/corner/paleblue{tag = "icon-corner_white (NORTHWEST)"; icon_state = "corner_white"; dir = 9},/obj/machinery/alarm/cold{dir = 4; pixel_x = -22},/turf/simulated/floor/tiled,/area/medical/morgue) "bsw" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) "bsx" = (/turf/simulated/wall,/area/crew_quarters/captain) @@ -3736,11 +3736,11 @@ "btR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/substation/command) "btS" = (/obj/effect/landmark/start{name = "Roboticist"},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled,/area/assembly/robotics) "btT" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan,/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/turret_protected/ai_upload) -"btU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/borgupload,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) +"btU" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/borgupload,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "btV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) "btW" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "btX" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) -"btY" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/aiupload,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) +"btY" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/aiupload,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "btZ" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only{dir = 2},/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/structure/cable/cyan,/turf/simulated/floor/plating,/area/turret_protected/ai_upload) "bua" = (/obj/structure/displaycase,/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bub" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/carpet,/area/crew_quarters/captain) @@ -3785,7 +3785,7 @@ "buO" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/recharger/wallcharger{pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "buP" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "buQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) -"buR" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/nanotrasen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/weapon/aiModule/reset,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) +"buR" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/nanotrasen,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/item/weapon/aiModule/reset,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "buS" = (/obj/machinery/hologram/holopad,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "buT" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/captain) "buU" = (/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = -27},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) @@ -3838,7 +3838,7 @@ "bvP" = (/turf/space,/turf/simulated/shuttle/wall{tag = "icon-swall_c (EAST)"; icon_state = "swall_c"; dir = 4},/area/shuttle/research/station) "bvQ" = (/obj/machinery/conveyor_switch/oneway{id = "QMLoad2"},/obj/effect/floor_decal/industrial/warning{tag = "icon-warning (SOUTHWEST)"; icon_state = "warning"; dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/loading) "bvR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) -"bvS" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/freeform,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/item/weapon/aiModule/protectStation,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai_upload) +"bvS" = (/obj/structure/table/standard,/obj/item/weapon/aiModule/freeform,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/item/weapon/aiModule/protectStation,/turf/simulated/floor/tiled/dark{name = "cooled dark floor"; temperature = 278},/area/turret_protected/ai_upload) "bvT" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/captain,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bvU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bvV" = (/obj/structure/table/woodentable,/obj/item/device/camera,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/carpet,/area/crew_quarters/captain) From c5b9d75e34a3b959e824a5613b55ca6fb87c6c42 Mon Sep 17 00:00:00 2001 From: skull132 Date: Mon, 6 Mar 2017 00:26:18 +0200 Subject: [PATCH 19/55] End The Contest (#1887) It was fun. --- baystation12.dme | 4 ---- code/game/jobs/job/captain.dm | 12 +++++----- code/game/jobs/job/civilian.dm | 32 +++++++------------------ code/game/jobs/jobs.dm | 4 +--- code/modules/client/client procs.dm | 5 ---- code/modules/client/preferences_gear.dm | 8 +++---- maps/exodus-1.dmm | 4 ++-- 7 files changed, 22 insertions(+), 47 deletions(-) diff --git a/baystation12.dme b/baystation12.dme index 88cc8eac53e..1d1f7052c4d 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -986,10 +986,6 @@ #include "code\modules\alarm\fire_alarm.dm" #include "code\modules\alarm\motion_alarm.dm" #include "code\modules\alarm\power_alarm.dm" -#include "code\modules\antag_contest\contest_defines.dm" -#include "code\modules\antag_contest\contest_helpers.dm" -#include "code\modules\antag_contest\contest_objective.dm" -#include "code\modules\antag_contest\contest_verbs.dm" #include "code\modules\antag_contest\sol_items.dm" #include "code\modules\assembly\assembly.dm" #include "code\modules\assembly\bomb.dm" diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index 9c7ed17b2a6..02e8eba06a5 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -1,7 +1,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) /datum/job/captain - title = "Sol Officer" + title = "Captain" flag = CAPTAIN department = "Command" head_position = 1 @@ -9,7 +9,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the Sol Alliance and Admiral Michael Frost" + supervisors = "company officials and Corporate Regulations" selection_color = "#ccccff" idtype = /obj/item/weapon/card/id/gold req_admin_notify = 1 @@ -29,7 +29,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel_cap(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel/cap(H), slot_back) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/dress/officer(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform) if(H.age>49) // Since we can have something other than the default uniform at this // point, check if we can actually attach the medal @@ -40,8 +40,8 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) else qdel(medal) H.equip_to_slot_or_del(new /obj/item/device/pda/captain(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/head/dress/officer(H), slot_head) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/head/caphat(H), slot_head) H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) if(H.backbag == 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H), slot_l_hand) @@ -49,7 +49,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) - H.implant_loyalty_sol(H) + H.implant_loyalty(H) return 1 diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index ada7174fadc..11d57e3f7bb 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -263,19 +263,18 @@ //var/global/lawyer = 0//Checks for another lawyer //This changed clothes on 2nd lawyer, both IA get the same dreds. /datum/job/lawyer - title = "Alliance Representative" + title = "Internal Affairs Agent" flag = LAWYER department = "Civilian" department_flag = CIVILIAN faction = "Station" total_positions = 2 spawn_positions = 2 - supervisors = "the Sol Alliance and Admiral Michael Frost" + supervisors = "company officials and Corporate Regulations" selection_color = "#dddddd" economic_modifier = 7 access = list(access_lawyer, access_sec_doors, access_maint_tunnels, access_heads) minimal_access = list(access_lawyer, access_sec_doors, access_heads) - alt_titles = list("NanoTrasen Internal Affairs Agent") equip(var/mob/living/carbon/human/H) @@ -287,26 +286,13 @@ if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/duffel(H), slot_back) - if (H.mind.role_alt_title) - switch(H.mind.role_alt_title) - if("Alliance Representative") - H.equip_to_slot_or_del(new /obj/item/weapon/melee/telebaton(H), slot_in_backpack) //remove those when the event is over - H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_in_backpack) - H.equip_to_slot_or_del(new /obj/item/weapon/gun/projectile/colt(H), slot_in_backpack) //remove those when the event is over - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/dress/subofficer(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses(H), slot_glasses) - H.equip_to_slot_or_del(new /obj/item/clothing/head/dress/officer(H), slot_head) - H.equip_to_slot_or_del(new /obj/item/weapon/melee/ceremonial_sword(H), slot_belt) - H.implant_loyalty_sol(H) - if("NanoTrasen Internal Affairs Agent") - H.implant_loyalty(H) - H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform) - H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit) - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) - H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses) - H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) - H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) + H.implant_loyalty(H) + H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform) + H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/clothing/glasses/sunglasses/big(H), slot_glasses) + H.equip_to_slot_or_del(new /obj/item/device/pda/lawyer(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) return 1 diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 360b8faac08..7383e1c7bb8 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -54,7 +54,6 @@ var/list/assistant_occupations = list() //Leaving this on one line stops Travis var/list/command_positions = list( "Captain", - "Sol Officer", "Head of Personnel", "Head of Security", "Chief Engineer", @@ -101,7 +100,6 @@ var/list/cargo_positions = list( var/list/civilian_positions = list( "Head of Personnel", "Internal Affairs Agent", - "Alliance Representative", "Bartender", "Gardener", "Chef", @@ -128,7 +126,7 @@ var/list/nonhuman_positions = list( ) /proc/guest_jobbans(var/job) - return ((job in command_positions) || job == "Internal Affairs Agent" || job == "Alliance Representative") + return ((job in command_positions) || job == "Internal Affairs Agent") /proc/get_job_datums() var/list/occupations = list() diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index e1bce814e36..8d3f9d2b897 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -194,11 +194,6 @@ return - // Antag contest shit - if (href_list["contest_action"] && config.antag_contest_enabled) - src.process_contest_topic(href_list) - return - ..() //redirect to hsrc.() /client/proc/handle_spam_prevention(var/message, var/mute_type) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 4dcd2cea189..d355926c873 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -677,28 +677,28 @@ var/global/list/gear_datums = list() path = /obj/item/clothing/accessory/holster/armpit slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") /datum/gear/hip display_name = "holster, hip" path = /obj/item/clothing/accessory/holster/hip slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") /datum/gear/waist display_name = "holster, waist" path = /obj/item/clothing/accessory/holster/waist slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") /datum/gear/thigh display_name = "holster, thigh" path = /obj/item/clothing/accessory/holster/thigh slot = slot_tie cost = 1 - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet","Alliance Representative") + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective","Security Cadet") /datum/gear/tie_blue display_name = "tie, blue" diff --git a/maps/exodus-1.dmm b/maps/exodus-1.dmm index 59ff1526446..390235332cd 100644 --- a/maps/exodus-1.dmm +++ b/maps/exodus-1.dmm @@ -3392,7 +3392,7 @@ "bnl" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) "bnm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) "bnn" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/modular_computer/console/preset/engineering,/turf/simulated/floor/bluegrid{name = "cooled mainframe floor"; temperature = 278},/area/turret_protected/ai) -"bno" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/soll_officer,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bno" = (/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Captain's Intercom"; pixel_x = -27; pixel_y = -3},/obj/structure/closet/secure_closet/captains,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnp" = (/obj/machinery/modular_computer/console/preset/command,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bnq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bnr" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/corner/blue{tag = "icon-corner_white (WEST)"; icon_state = "corner_white"; dir = 8},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) @@ -7373,7 +7373,7 @@ "cML" = (/obj/structure/closet/crate,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cMM" = (/obj/structure/table/rack,/obj/random/loot,/turf/simulated/floor/plating,/area/maintenance/engi_engine) "cMO" = (/obj/structure/closet/crate{name = "engineering mag lock crate"},/obj/item/device/magnetic_lock/engineering,/obj/item/device/magnetic_lock/engineering,/turf/simulated/floor/plating,/area/engineering/storage) - + (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa From 9cb32e06530e28d19f3a7346daf6ea2be293f2f5 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 5 Mar 2017 16:30:34 -0600 Subject: [PATCH 20/55] Lighting fixes (#1886) changes: Fixes directional lights not obeying Face-Direction. LIGHT_SEMI now works properly when a light is facing NORTH or SOUTH. Fixes #1884 --- code/modules/lighting/lighting_source.dm | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/code/modules/lighting/lighting_source.dm b/code/modules/lighting/lighting_source.dm index 3c8987a3287..cba7976654b 100644 --- a/code/modules/lighting/lighting_source.dm +++ b/code/modules/lighting/lighting_source.dm @@ -252,6 +252,7 @@ #define POLAR_TO_CART_X(R,T) ((R) * cos(T)) #define POLAR_TO_CART_Y(R,T) ((R) * sin(T)) #define PSEUDO_WEDGE(A_X,A_Y,B_X,B_Y) ((A_X)*(B_Y) - (A_Y)*(B_X)) +#define MINMAX(NUM) ((NUM) < 0 ? -round(-(NUM)) : round(NUM)) /datum/light_source/proc/update_angle() var/turf/T = get_turf(top_atom) @@ -268,10 +269,14 @@ test_x_offset = cached_origin_x cached_origin_y = T.y test_y_offset = cached_origin_y - old_direction = top_atom.dir + + if (istype(top_atom, /mob) && top_atom:facing_dir) + old_direction = top_atom:facing_dir + else + old_direction = top_atom.dir var/angle = light_angle / 2 - switch (top_atom.dir) + switch (old_direction) if (NORTH) limit_a_t = angle + 90 limit_b_t = -(angle) + 90 @@ -298,9 +303,13 @@ // Convert our angle + range into a vector. limit_a_x = POLAR_TO_CART_X(light_range + 10, limit_a_t) + limit_a_x = MINMAX(limit_a_x) limit_a_y = POLAR_TO_CART_Y(light_range + 10, limit_a_t) // 10 is an arbitrary number, yes. + limit_a_y = MINMAX(limit_a_y) limit_b_x = POLAR_TO_CART_X(light_range + 10, limit_b_t) + limit_b_x = MINMAX(limit_b_x) limit_b_y = POLAR_TO_CART_Y(light_range + 10, limit_b_t) + limit_b_y = MINMAX(limit_b_y) // This won't change unless the origin or dir changes, might as well do it here. targ_sign = PSEUDO_WEDGE(limit_a_x, limit_a_y, limit_b_x, limit_b_y) > 0 @@ -314,15 +323,12 @@ var/tb = PSEUDO_WEDGE(test_x, test_y, limit_b_x, limit_b_y) // if the signs of both at and tb are NOT the same, the point is NOT within the cone. - if ((at > 0) != targ_sign) - return TRUE - - if ((tb > 0) != targ_sign) - return TRUE + return (((at > 0) != targ_sign) || ((tb > 0) != targ_sign)) #undef POLAR_TO_CART_X #undef POLAR_TO_CART_Y #undef PSEUDO_WEDGE +#undef MINMAX // This is the define used to calculate falloff. #define LUM_FALLOFF(C, T) (1 - CLAMP01(sqrt((C.x - T.x) ** 2 + (C.y - T.y) ** 2 + LIGHTING_HEIGHT) / max(1, light_range))) From cb4a941dc103cc0024c10a37d87fec7a500f0cfb Mon Sep 17 00:00:00 2001 From: LordFowl Date: Sun, 5 Mar 2017 17:35:09 -0500 Subject: [PATCH 21/55] Sword Reflection (#1637) Energy swords, shields, and ninja blades can now deflect projectiles. Energy swords have a fairly moderate chance of reflecting energy weapons. Energy shields have a much higher chance of reflecting energy weapons. The ninja blade has the highest chance of reflecting energy weapons. Energy sword and ninja blade can only effectively reflect shots to the groin, chest, and head. Energy shield has full body coverage. Energy sword has less "durability" than shield and blade (Can withstand less shots before shutting off.) Neither sword, shield, nor blade can deflect shots to the back. Only the ablative vest provides full coverage. Probably some other stuff I'm forgetting. --- .../objects/items/weapons/melee/energy.dm | 105 +++++++++++++++--- code/game/objects/items/weapons/shields.dm | 49 +++++++- html/changelogs/LordFowl - 11081998.yml | 36 ++++++ 3 files changed, 174 insertions(+), 16 deletions(-) create mode 100644 html/changelogs/LordFowl - 11081998.yml diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 4b7db053bd8..3c0f7623b63 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -5,9 +5,13 @@ var/active_w_class sharp = 0 edge = 0 - armor_penetration = 50 + armor_penetration = 10 flags = NOBLOODY can_embed = 0//No embedding pls + var/base_reflectchance = 40 + var/base_block_chance = 25 + var/shield_power = 100 + var/can_block_bullets = 0 var/datum/effect_system/sparks/spark_system /obj/item/weapon/melee/energy/New() @@ -56,6 +60,66 @@ add_fingerprint(user) return +/obj/item/weapon/melee/energy/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(active && default_parry_check(user, attacker, damage_source) && prob(50)) + user.visible_message("\The [user] parries [attack_text] with \the [src]!") + + spark_system.queue() + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + return 1 + else + + if(!active) + return 0 //turn it on first! + + if(user.incapacitated()) + return 0 + + //block as long as they are not directly behind us + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + + if(prob(base_block_chance)) + spark_system.queue() + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + shield_power -= round(damage/4) + + if(shield_power <= 0) + visible_message("\The [user]'s [src.name] overloads!") + deactivate() + shield_power = initial(shield_power) + return 0 + + if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) + var/obj/item/projectile/P = damage_source + + var/reflectchance = base_reflectchance - round(damage/3) + if(!(def_zone in list("chest", "groin","head"))) + reflectchance /= 2 + if(P.starting && prob(reflectchance)) + visible_message("\The [user]'s [src.name] reflects [attack_text]!") + + // Find a turf near or on the original location to bounce to + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(user) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, user) + + return PROJECTILE_CONTINUE // complete projectile permutation + else + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + return 1 + + else if(istype(damage_source, /obj/item/projectile/bullet) && can_block_bullets) + var/reflectchance = (base_reflectchance) - round(damage/3) + if(!(def_zone in list("chest", "groin","head"))) + reflectchance /= 2 + if(prob(reflectchance)) + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + return 1 + /obj/item/weapon/melee/energy/glaive name = "energy glaive" desc = "An energized glaive." @@ -74,6 +138,11 @@ sharp = 1 edge = 1 slot_flags = SLOT_BACK + base_reflectchance = 0 + base_block_chance = 0 //cannot be used to block guns + shield_power = 0 + can_block_bullets = 0 + armor_penetration = 20 /obj/item/weapon/melee/energy/glaive/activate(mob/living/user) ..() @@ -108,6 +177,11 @@ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") sharp = 1 edge = 1 + base_reflectchance = 0 + base_block_chance = 0 //cannot be used to block guns + shield_power = 0 + can_block_bullets = 0 + armor_penetration = 35 /obj/item/weapon/melee/energy/axe/activate(mob/living/user) ..() @@ -140,6 +214,7 @@ sharp = 1 edge = 1 var/blade_color + shield_power = 75 /obj/item/weapon/melee/energy/sword/dropped(var/mob/user) ..() @@ -175,19 +250,12 @@ attack_verb = list() icon_state = initial(icon_state) -/obj/item/weapon/melee/energy/sword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - if(active && default_parry_check(user, attacker, damage_source) && prob(50)) - user.visible_message("\The [user] parries [attack_text] with \the [src]!") - - spark_system.queue() - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) - return 1 - return 0 - /obj/item/weapon/melee/energy/sword/pirate name = "energy cutlass" desc = "Arrrr matey." icon_state = "cutlass0" + base_reflectchance = 60 + base_block_chance = 60 /obj/item/weapon/melee/energy/sword/pirate/activate(mob/living/user) ..() @@ -196,13 +264,12 @@ /* *Energy Blade */ - -//Can't be activated or deactivated, so no reason to be a subtype of energy /obj/item/weapon/melee/energy/blade name = "energy blade" desc = "A concentrated beam of energy in the shape of a blade. Very stylish... and lethal." icon_state = "blade" - force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe + force = 40 + active_force = 40 //Normal attacks deal very high damage - about the same as wielded fire axe armor_penetration = 100 sharp = 1 edge = 1 @@ -214,6 +281,12 @@ flags = NOBLOODY attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") var/mob/living/creator + base_reflectchance = 140 + base_block_chance = 75 + shield_power = 150 + can_block_bullets = 1 + active = 1 + armor_penetration = 20 /obj/item/weapon/melee/energy/blade/New() processing_objects |= src @@ -223,10 +296,14 @@ processing_objects -= src ..() -/obj/item/weapon/melee/energy/blade/attack_self(mob/user as mob) +/obj/item/weapon/melee/energy/blade/deactivate(mob/living/user) + if(!active) + return + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) user.drop_from_inventory(src) spawn(1) if(src) qdel(src) + /obj/item/weapon/melee/energy/blade/dropped() spawn(1) if(src) qdel(src) diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index d57d312ab15..45483b8c8f0 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -103,17 +103,62 @@ w_class = 2 origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_ILLEGAL = 4) attack_verb = list("shoved", "bashed") + var/shield_power = 150 var/active = 0 -/obj/item/weapon/shield/energy/handle_shield(mob/user) +/obj/item/weapon/shield/energy/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(!active) return 0 //turn it on first! - . = ..() + if(user.incapacitated()) + return 0 + if(.) spark(user.loc, 5) playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + //block as long as they are not directly behind us + var/bad_arc = reverse_direction(user.dir) //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + + if(prob(get_block_chance(user, damage, damage_source, attacker))) + spark(user.loc, 5) + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + shield_power -= round(damage/4) + + if(shield_power <= 0) + visible_message("\The [user]'s [src.name] overloads!") + active = 0 + force = 3 + update_icon() + w_class = 1 + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + shield_power = initial(shield_power) + return 0 + + if(istype(damage_source, /obj/item/projectile/energy) || istype(damage_source, /obj/item/projectile/beam)) + var/obj/item/projectile/P = damage_source + + var/reflectchance = 80 - round(damage/3) + if(P.starting && prob(reflectchance)) + visible_message("\The [user]'s [src.name] reflects [attack_text]!") + + // Find a turf near or on the original location to bounce to + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(user) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, user) + + return PROJECTILE_CONTINUE // complete projectile permutation + else + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + return 1 + else + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + return 1 + /obj/item/weapon/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) if(istype(damage_source, /obj/item/projectile)) var/obj/item/projectile/P = damage_source diff --git a/html/changelogs/LordFowl - 11081998.yml b/html/changelogs/LordFowl - 11081998.yml new file mode 100644 index 00000000000..03d6d3be098 --- /dev/null +++ b/html/changelogs/LordFowl - 11081998.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: LordFowl + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Energy swords and shields can now reflect energy weapon projectiles. The ninja sword additionally can deflect bullets." From 1426392904e6c5d60ce556ab81031b9050e4c2db Mon Sep 17 00:00:00 2001 From: Werner Date: Mon, 6 Mar 2017 22:56:19 +0100 Subject: [PATCH 22/55] Price Changes requested by Jackboot (#1892) Change the prices as requested by Jackboot --- code/game/machinery/vending.dm | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f5f4016c97c..47df9f9869c 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -722,7 +722,7 @@ vend_power_usage = 85000 //85 kJ to heat a 250 mL cup of coffee products = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 25,/obj/item/weapon/reagent_containers/food/drinks/tea = 25,/obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 25) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/ice = 10) - prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 30, /obj/item/weapon/reagent_containers/food/drinks/tea = 30, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 32) + prices = list(/obj/item/weapon/reagent_containers/food/drinks/coffee = 20, /obj/item/weapon/reagent_containers/food/drinks/tea = 20, /obj/item/weapon/reagent_containers/food/drinks/h_chocolate = 22) @@ -738,10 +738,10 @@ /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 6, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 6, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 3, /obj/item/weapon/reagent_containers/food/snacks/meatsnack = 2, /obj/item/weapon/reagent_containers/food/snacks/maps = 2, /obj/item/weapon/reagent_containers/food/snacks/nathisnack = 2) contraband = list(/obj/item/weapon/reagent_containers/food/snacks/syndicake = 6) - prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 25,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 30,/obj/item/weapon/reagent_containers/food/snacks/chips = 27, - /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 30,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 22,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 25, - /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 25, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 28, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 50, - /obj/item/weapon/reagent_containers/food/snacks/meatsnack = 32, /obj/item/weapon/reagent_containers/food/snacks/maps = 33, /obj/item/weapon/reagent_containers/food/snacks/nathisnack = 34) + prices = list(/obj/item/weapon/reagent_containers/food/snacks/candy = 15,/obj/item/weapon/reagent_containers/food/drinks/dry_ramen = 20,/obj/item/weapon/reagent_containers/food/snacks/chips = 17, + /obj/item/weapon/reagent_containers/food/snacks/sosjerky = 20,/obj/item/weapon/reagent_containers/food/snacks/no_raisin = 12,/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie = 15, + /obj/item/weapon/reagent_containers/food/snacks/cheesiehonkers = 15, /obj/item/weapon/reagent_containers/food/snacks/tastybread = 18, /obj/item/weapon/reagent_containers/food/snacks/skrellsnacks = 40, + /obj/item/weapon/reagent_containers/food/snacks/meatsnack = 22, /obj/item/weapon/reagent_containers/food/snacks/maps = 23, /obj/item/weapon/reagent_containers/food/snacks/nathisnack = 24) /obj/machinery/vending/cola @@ -755,10 +755,10 @@ /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 10,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10) contraband = list(/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko = 5, /obj/item/weapon/reagent_containers/food/snacks/liquidfood = 6) - prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 25,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 21, - /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 26,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 25, - /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 22,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 25, - /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 23,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 26) + prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/cola = 15,/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind = 11, + /obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb = 16,/obj/item/weapon/reagent_containers/food/drinks/cans/starkist = 15, + /obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle = 12,/obj/item/weapon/reagent_containers/food/drinks/cans/space_up = 15, + /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 13,/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 16) idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. //This one's from bay12 @@ -783,7 +783,7 @@ products = list(/obj/item/weapon/storage/fancy/cigarettes = 10,/obj/item/weapon/storage/box/matches = 10,/obj/item/weapon/flame/lighter/random = 4) contraband = list(/obj/item/weapon/flame/lighter/zippo = 4) premium = list(/obj/item/weapon/storage/fancy/cigar = 5,/obj/item/weapon/storage/fancy/cigarettes/killthroat = 5 ) - prices = list(/obj/item/weapon/storage/fancy/cigarettes = 520,/obj/item/weapon/storage/box/matches = 22,/obj/item/weapon/flame/lighter/random = 22) + prices = list(/obj/item/weapon/storage/fancy/cigarettes = 510,/obj/item/weapon/storage/box/matches = 12,/obj/item/weapon/flame/lighter/random = 12) /obj/machinery/vending/medical From 9856e18486d5a1b17bc6a65ef480ae76e04d5077 Mon Sep 17 00:00:00 2001 From: LordFowl Date: Sun, 12 Mar 2017 05:50:18 -0400 Subject: [PATCH 23/55] Fixes internal phoron buzz (#1908) Due to bad code andn stuff, buzz happened every 3 secobds. no more. --- code/modules/organs/organ_internal.dm | 2 +- html/changelogs/LordFowl - 1138.yml | 36 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 html/changelogs/LordFowl - 1138.yml diff --git a/code/modules/organs/organ_internal.dm b/code/modules/organs/organ_internal.dm index 0564b37e479..50ffd360d96 100644 --- a/code/modules/organs/organ_internal.dm +++ b/code/modules/organs/organ_internal.dm @@ -433,7 +433,7 @@ obj/item/organ/vaurca/neuralsocket/process() return null var/tank_pressure = air_contents.return_pressure() - if(tank_pressure < distribute_pressure) + if((tank_pressure < distribute_pressure) && prob(5)) owner << "There is a buzzing in your [parent_organ]." var/moles_needed = distribute_pressure*volume_to_return/(R_IDEAL_GAS_EQUATION*air_contents.temperature) diff --git a/html/changelogs/LordFowl - 1138.yml b/html/changelogs/LordFowl - 1138.yml new file mode 100644 index 00000000000..88ce238d484 --- /dev/null +++ b/html/changelogs/LordFowl - 1138.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: LordFowl + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Fixed chest-buzzers in Vaurca." From cd52c363131f72d681164c83e7b80ad4ff46ac78 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 12 Mar 2017 04:51:07 -0500 Subject: [PATCH 24/55] Lighting fixes part 307 (#1896) changes: Fixes missing icon for powered off night-mode tubes. Nerfs borg floodlight back to sanity. Reduces the light power on red-alert level fire alarms a bit. --- code/__defines/lighting.dm | 2 +- code/game/machinery/floodlight.dm | 8 ++++---- .../modules/mob/living/silicon/robot/robot.dm | 4 ++-- code/modules/power/lighting.dm | 12 +++++++----- icons/obj/lighting.dmi | Bin 35153 -> 34937 bytes 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/code/__defines/lighting.dm b/code/__defines/lighting.dm index 48ec6f22322..e7124ae435b 100644 --- a/code/__defines/lighting.dm +++ b/code/__defines/lighting.dm @@ -80,7 +80,7 @@ // Some brightness/range defines for objects. #define L_WALLMOUNT_POWER 0.4 #define L_WALLMOUNT_RANGE 2 -#define L_WALLMOUNT_HI_POWER 2 // For red/delta alert on fire alarms. +#define L_WALLMOUNT_HI_POWER 1 // For red/delta alert on fire alarms. #define L_WALLMOUNT_HI_RANGE 4 // This controls by how much console sprites are dimmed before being overlayed. #define HOLOSCREEN_ADDITION_FACTOR 1 diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 33eccb5dbfd..bc2f84159c3 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -34,10 +34,10 @@ // If the cell is almost empty rarely "flicker" the light. Aesthetic only. if((cell.percent() < 10) && prob(5)) - set_light(brightness_on/2, brightness_on/4) + set_light(brightness_on/2, 0.5) spawn(20) if(on) - set_light(brightness_on, brightness_on/2) + set_light(brightness_on, 1) cell.use(use*CELLRATE) @@ -50,7 +50,7 @@ return 0 on = 1 - set_light(brightness_on, brightness_on / 2) + set_light(brightness_on, 1) update_icon() if(loud) visible_message("\The [src] turns on.") @@ -58,7 +58,7 @@ /obj/machinery/floodlight/proc/turn_off(var/loud = 0) on = 0 - set_light(0, 0) + set_light(0) update_icon() if(loud) visible_message("\The [src] shuts down.") diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index c71f2aaccbf..1954adaed71 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -22,7 +22,7 @@ var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best var/crisis //Admin-settable for combat module use. var/crisis_override = 0 - var/integrated_light_power = 6 + var/integrated_light_power = 4 var/datum/wires/robot/wires //Icon stuff @@ -423,7 +423,7 @@ /mob/living/silicon/robot/proc/update_robot_light() if(lights_on) if(intenselight) - set_light(integrated_light_power * 2, integrated_light_power) + set_light(integrated_light_power * 2, 1) else set_light(integrated_light_power) else diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index c8c225c68f8..e4c6ce434dc 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -229,13 +229,13 @@ ..() /obj/machinery/light/update_icon() - switch(status) // set icon_states if(LIGHT_OK) - if (supports_nightmode && nightmode) - icon_state = "[base_state][on]_night" + icon_state = "[base_state][on]" + if (supports_nightmode && nightmode && on) + color = "#d2d2d2" else - icon_state = "[base_state][on]" + color = null if(LIGHT_EMPTY) icon_state = "[base_state]-empty" @@ -246,7 +246,9 @@ if(LIGHT_BROKEN) icon_state = "[base_state]-broken" on = 0 - return + + if (!on) + color = null // update the icon_state and luminosity of the light depending on its state /obj/machinery/light/proc/update(var/trigger = 1) diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index c9eb63b99e694cfb771f20fb47223c0d4412a77c..c38aad8025ac889f849eb4c74a30eaadfd5727ee 100644 GIT binary patch literal 34937 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 C*gzHl From ceff4ae424c594eec6c2483788b86fd0dd7002d2 Mon Sep 17 00:00:00 2001 From: NanakoAC Date: Sun, 12 Mar 2017 09:52:33 +0000 Subject: [PATCH 25/55] Tech Fixes: (#1888) Fixes #1790 Fixes #1791 Fixes a number of issues with robot sprites, chem master machine, and surgery steps The issue with borg sprites was caused by duplicate calls to ..() Ive standardised robot module parent calls to the top of the function Fixed the chemmaster not depositing pills in bottles properly. I added a new add_to_storage proc to storage.dm which is just a simple, safe means of putting stuff in stuff. it handles the checking. Fixed some issues with surgery. A few surgery steps had incorrect "open" var ranges defined which was causing organ repair surgery to be interfered with Also removed screwdriver from the list of bone mending tools, and added duct tape instead as the ghetto alternative. And allowed energyswords + chainswords to be used for cutting open ribs. theyre already useable for amputation Fixed an incorrect return var for surgery that was making surgeons able to attack their patients on help intent. Shouldnt happen anymore And also fixed the experimental welder being un-makeable at the protolathe. --- .../objects/items/weapons/storage/storage.dm | 9 ++++ .../modules/mob/living/silicon/robot/login.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 7 ++-- .../mob/living/silicon/robot/robot_modules.dm | 30 ++++++-------- code/modules/reagents/Chemistry-Machinery.dm | 8 ++-- code/modules/research/designs.dm | 2 +- code/modules/surgery/bones.dm | 8 ++-- code/modules/surgery/encased.dm | 8 ++-- code/modules/surgery/robotics.dm | 4 +- code/modules/surgery/surgery.dm | 1 + html/changelogs/Nanako-Techfixes.yml | 41 +++++++++++++++++++ 11 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 html/changelogs/Nanako-Techfixes.yml diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index e1c2f9796d4..c09aef55f4f 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -413,7 +413,16 @@ update_icon() return 1 + //This proc is called when you want to place an item into the storage item. +//Its a safe proc for adding things to the storage that does the necessary checks. Object will not be moved if it fails +/obj/item/weapon/storage/proc/insert_into_storage(obj/item/W as obj, var/prevent_messages = 1) + if(!can_be_inserted(W, prevent_messages)) + return + + return handle_item_insertion(W, prevent_messages) + + /obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob) ..() diff --git a/code/modules/mob/living/silicon/robot/login.dm b/code/modules/mob/living/silicon/robot/login.dm index 9d9117b9330..72493c1617e 100644 --- a/code/modules/mob/living/silicon/robot/login.dm +++ b/code/modules/mob/living/silicon/robot/login.dm @@ -6,5 +6,5 @@ winset(src, null, "mainwindow.macro=borgmacro hotkey_toggle.is-checked=false input.focus=true input.background-color=#D3B5B5") // Forces synths to select an icon relevant to their module - if(!icon_selected) + if(module && !icon_selected) choose_icon(icon_selection_tries, module_sprites) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1954adaed71..b168c5561df 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -254,7 +254,7 @@ if(new_sprites && new_sprites.len) module_sprites = new_sprites.Copy() //Custom_sprite check and entry - + if (custom_sprite == 1) var/list/valid_states = icon_states(CUSTOM_ITEM_SYNTH) if("[ckey]-[modtype]" in valid_states) @@ -268,7 +268,7 @@ else icontype = module_sprites[1] icon_state = module_sprites[icontype] - + updateicon() return module_sprites @@ -463,7 +463,7 @@ /mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj) ..(Proj) - if(prob(75) && Proj.damage > 0) + if(prob(75) && Proj.damage > 0) spark_system.queue() return 2 @@ -1031,6 +1031,7 @@ verbs -= /mob/living/silicon/robot/proc/choose_icon src << "Your icon has been set. You now require a module reset to change it." + /mob/living/silicon/robot/proc/sensor_mode() //Medical/Security HUD controller for borgs set name = "Set Sensor Augmentation" set category = "Robot Commands" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 8879295541c..8e7f6fd35b8 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -173,6 +173,7 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/standard/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/melee/baton/loaded(src) src.modules += new /obj/item/weapon/extinguisher(src) @@ -180,7 +181,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/crowbar(src) src.modules += new /obj/item/device/healthanalyzer(src) src.emag = new /obj/item/weapon/melee/energy/sword(src) - ..() + /obj/item/weapon/robot_module/medical name = "medical robot module" @@ -194,7 +195,7 @@ var/global/list/robot_modules = list( "Heavy" = "heavyMed", "Needles" = "medicalrobot", "Standard" = "surgeon", - "Advanced Droid - Medical" = "droid-surgery", + "Advanced Droid - Medical" = "droid-medical", "Advanced Droid - Chemistry" = "droid-chemistry", "Drone - Medical" = "drone-surgery", "Drone - Chemistry" = "drone-chemistry", @@ -241,7 +242,6 @@ var/global/list/robot_modules = list( src.modules += N src.modules += B - ..() /obj/item/weapon/robot_module/medical/general/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules @@ -307,7 +307,6 @@ var/global/list/robot_modules = list( src.modules += B src.modules += S - ..() /obj/item/weapon/robot_module/medical/rescue/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules @@ -388,6 +387,7 @@ var/global/list/robot_modules = list( src.modules += RG /obj/item/weapon/robot_module/engineering/general/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/extinguisher(src) @@ -450,8 +450,6 @@ var/global/list/robot_modules = list( PL.synths = list(plasteel) src.modules += PL - ..() - /obj/item/weapon/robot_module/security name = "security robot module" channels = list("Security" = 1) @@ -477,6 +475,7 @@ var/global/list/robot_modules = list( supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/security/general/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/sec(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) @@ -485,7 +484,6 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/taperoll/police(src) src.modules += new /obj/item/device/holowarrant(src) src.emag = new /obj/item/weapon/gun/energy/laser/mounted(src) - ..() /obj/item/weapon/robot_module/security/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() @@ -513,6 +511,7 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/janitor/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/soap/nanotrasen(src) src.modules += new /obj/item/weapon/storage/bag/trash(src) @@ -521,7 +520,6 @@ var/global/list/robot_modules = list( src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("lube", 250) src.emag.name = "Lube spray" - ..() /obj/item/weapon/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() @@ -563,6 +561,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/clerical/butler/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/gripper/service(src) src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src) @@ -593,19 +592,18 @@ var/global/list/robot_modules = list( R.my_atom = src.emag R.add_reagent("beer2", 50) src.emag.name = "Mickey Finn's Special Brew" - ..() /obj/item/weapon/robot_module/clerical/general name = "clerical robot module" /obj/item/weapon/robot_module/clerical/general/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) src.modules += new /obj/item/weapon/form_printer(src) src.modules += new /obj/item/weapon/gripper/paperwork(src) src.modules += new /obj/item/weapon/hand_labeler(src) src.emag = new /obj/item/weapon/stamp/denied(src) - ..() /obj/item/weapon/robot_module/general/butler/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() @@ -632,6 +630,7 @@ var/global/list/robot_modules = list( supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/miner/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/material(src) src.modules += new /obj/item/weapon/wrench(src) @@ -643,7 +642,6 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/mining_scanner(src) src.modules += new /obj/item/weapon/crowbar(src) src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) - ..() /obj/item/weapon/robot_module/research name = "research module" @@ -657,6 +655,7 @@ var/global/list/robot_modules = list( ) /obj/item/weapon/robot_module/research/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/portable_destructive_analyzer(src) src.modules += new /obj/item/weapon/gripper/research(src) @@ -687,8 +686,6 @@ var/global/list/robot_modules = list( N.synths = list(nanite) src.modules += N - ..() - /obj/item/weapon/robot_module/syndicate name = "syndicate robot module" languages = list( @@ -733,6 +730,7 @@ var/global/list/robot_modules = list( supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack) /obj/item/weapon/robot_module/combat/New() + ..() src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/hud/sec(src) src.modules += new /obj/item/weapon/gun/energy/laser/mounted(src) @@ -741,7 +739,6 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/borg/combat/mobility(src) src.modules += new /obj/item/weapon/crowbar(src) src.emag = new /obj/item/weapon/gun/energy/lasercannon/mounted(src) - ..() /obj/item/weapon/robot_module/drone name = "drone module" @@ -749,6 +746,7 @@ var/global/list/robot_modules = list( networks = list(NETWORK_ENGINEERING) /obj/item/weapon/robot_module/drone/New(var/mob/living/silicon/robot/robot) + ..() src.modules += new /obj/item/weapon/weldingtool(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) @@ -823,16 +821,14 @@ var/global/list/robot_modules = list( P.synths = list(plastic) src.modules += P - ..() - /obj/item/weapon/robot_module/drone/construction name = "construction drone module" channels = list("Engineering" = 1) languages = list() /obj/item/weapon/robot_module/drone/construction/New() - src.modules += new /obj/item/weapon/rcd/borg(src) ..() + src.modules += new /obj/item/weapon/rcd/borg(src) /obj/item/weapon/robot_module/drone/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) var/obj/item/device/lightreplacer/LR = locate() in src.modules diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 4f8b7304b6f..54007df2d6d 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -184,9 +184,7 @@ P.icon_state = "pill"+pillsprite reagents.trans_to_obj(P,amount_per_pill) if(src.loaded_pill_bottle) - if(loaded_pill_bottle.contents.len < loaded_pill_bottle.max_storage_space) - P.loc = loaded_pill_bottle - src.updateUsrDialog() + loaded_pill_bottle.insert_into_storage(P) else if (href_list["createbottle"]) if(!condi) @@ -243,7 +241,7 @@ if(!beaker) dat = "Please insert beaker.
    " if(src.loaded_pill_bottle) - dat += "
    Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]

    " + dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\]

    " else dat += "No pill bottle inserted.

    " dat += "Close" @@ -251,7 +249,7 @@ var/datum/reagents/R = beaker:reagents dat += "Eject beaker and Clear Buffer
    " if(src.loaded_pill_bottle) - dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.storage_slots]\]

    " + dat += "Eject Pill Bottle \[[loaded_pill_bottle.contents.len]/[loaded_pill_bottle.max_storage_space]\]

    " else dat += "No pill bottle inserted.

    " if(!R.total_volume) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 8b2919c3d4f..f5208bc45cd 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -766,7 +766,7 @@ datum/design/item/experimental_welder name = "Experimental Welding Tool" desc = "A scientifically-enhanced welding tool that uses fuel-producing microbes to gradually replenish its fuel supply" id = "experimental_welder" - req_tech = list(ENGINEERING = 4, TECH_MATERIAL = 4) + req_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4) materials = list(DEFAULT_WALL_MATERIAL = 500) build_path =/obj/item/weapon/weldingtool/experimental sort_string = "VABAJ" diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index 25addbd40a4..1ba5179fd88 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -6,7 +6,7 @@ /datum/surgery_step/glue_bone allowed_tools = list( /obj/item/weapon/bonegel = 100, \ - /obj/item/weapon/screwdriver = 75 + /obj/item/weapon/tape_roll = 60 ) can_infect = 1 blood_level = 1 @@ -18,7 +18,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.stage == 0 + return affected && !(affected.status & ORGAN_ROBOT) && affected.open >= 2 && affected.open < 3 && affected.stage == 0 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) @@ -115,7 +115,7 @@ /datum/surgery_step/finish_bone allowed_tools = list( /obj/item/weapon/bonegel = 100, \ - /obj/item/weapon/screwdriver = 75 + /obj/item/weapon/tape_roll = 60 ) can_infect = 1 blood_level = 1 @@ -127,7 +127,7 @@ if (!hasorgans(target)) return 0 var/obj/item/organ/external/affected = target.get_organ(target_zone) - return affected && affected.open >= 2 && !(affected.status & ORGAN_ROBOT) && affected.stage == 2 + return affected && affected.open >= 2 && affected.open < 3 && !(affected.status & ORGAN_ROBOT) && affected.stage == 2 begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = target.get_organ(target_zone) diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index 762c2b71c46..fbd1e8b8d89 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -17,7 +17,9 @@ /datum/surgery_step/open_encased/saw allowed_tools = list( - /obj/item/weapon/circular_saw = 100, \ + /obj/item/weapon/circular_saw = 100, + /obj/item/weapon/melee/energy = 100, + /obj/item/weapon/melee/chainsword = 70, /obj/item/weapon/material/hatchet = 75 ) @@ -172,7 +174,7 @@ affected.createwound(BRUISE, 20) affected.fracture() - + if(affected.internal_organs && affected.internal_organs.len) if(prob(40)) var/obj/item/organ/O = pick(affected.internal_organs) //TODO weight by organ size @@ -182,7 +184,7 @@ /datum/surgery_step/open_encased/mend allowed_tools = list( /obj/item/weapon/bonegel = 100, \ - /obj/item/weapon/screwdriver = 75 + /obj/item/weapon/tape_roll = 60 ) min_duration = 20 diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index 867e222c3bd..34d34a380ca 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -205,11 +205,11 @@ max_duration = 90 can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - if (!hasorgans(target)) return var/obj/item/organ/external/affected = target.get_organ(target_zone) - if(!affected) return + if(!affected) + return var/is_organ_damaged = 0 for(var/obj/item/organ/I in affected.internal_organs) if(I.damage > 0 && I.robotic >= 2) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index e582d1222f7..30d9e86f8a1 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -110,6 +110,7 @@ proc/do_surgery(mob/living/carbon/M, mob/living/user, obj/item/tool) if (user.a_intent == I_HELP) user << "You can't see any useful way to use [tool] on [M]." + return 1 //Prevents attacking your patient on help intent return 0 proc/sort_surgeries() diff --git a/html/changelogs/Nanako-Techfixes.yml b/html/changelogs/Nanako-Techfixes.yml new file mode 100644 index 00000000000..42faab0d30b --- /dev/null +++ b/html/changelogs/Nanako-Techfixes.yml @@ -0,0 +1,41 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Nanako + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Fixed being unable to repair mechanical organs with nanopaste or screwdriver, these both work now." + - tweak: "Screwdriver can no longer be used as a ghetto alternative to bone gel. Use duct tape instead." + - tweak: "Energy swords and chainswords can be used to cut open ribs in surgery." + - bugfix: "Fixed attacking your patient with tools on help intent when there wasnt a valid surgery step." + - bugfix: "Fixed pillbottle interactions with chemmaster machines." + - bugfix: "Fixed being asked to pick a cyborg sprite multiple times. Also fixed a missing sprite." From a337279c86a03d2c6c7d24c093dc0a746ecbf459 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 12 Mar 2017 05:17:18 -0500 Subject: [PATCH 26/55] Better area animations (#1900) changes: Area lighting effects are now done using animate() calls and color instead of animated sprites. With this change, these effects can be drawn at the client BYOND's native refresh rate. The animations are smoother in-game than they are in the GIFs. --- code/game/area/areas.dm | 43 ++++++++++++++++++------- html/changelogs/lohikar-arealights.yml | 4 +++ icons/turf/areas.dmi | Bin 28422 -> 28441 bytes 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 html/changelogs/lohikar-arealights.yml diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 1bf9801ed73..cd2e7ef32f9 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -9,7 +9,7 @@ blend_mode = BLEND_MULTIPLY /area/New() - icon_state = "" + icon_state = "white" layer = 10 uid = ++global_uid all_areas += src @@ -149,21 +149,40 @@ D.open() return +#define DO_PARTY(COLOR) animate(color = COLOR, time = 0.5 SECONDS, easing = QUAD_EASING) + /area/proc/updateicon() if ((fire || eject || party) && (!requires_power||power_environ) && !istype(src, /area/space))//If it doesn't require power, can still activate this proc. - if(fire && !eject && !party) - icon_state = "blue" - /*else if(atmosalm && !fire && !eject && !party) - icon_state = "bluenew"*/ - else if(!fire && eject && !party) - icon_state = "red" - else if(party && !fire && !eject) - icon_state = "party" + if(fire && !eject && !party) // FIRE + color = "#ff9292" + animate(src) // stop any current animations. + animate(src, color = "#ffa5b2", time = 1 SECOND, loop = -1, easing = SINE_EASING) + animate(color = "#ff9292", time = 1 SECOND, easing = SINE_EASING) + else if(!fire && eject && !party) // EJECT + color = "#ff9292" + animate(src) + animate(src, color = "#bc8a81", time = 1 SECOND, loop = -1, easing = EASE_IN|CUBIC_EASING) + animate(color = "#ff9292", time = 0.5 SECOND, easing = EASE_OUT|CUBIC_EASING) + else if(party && !fire && !eject) // PARTY + color = "#ff728e" + animate(src) + animate(src, color = "#7272ff", time = 0.5 SECONDS, loop = -1, easing = QUAD_EASING) + DO_PARTY("#72aaff") + DO_PARTY("#ffc68e") + DO_PARTY("#72c6ff") + DO_PARTY("#ff72e2") + DO_PARTY("#72ff8e") + DO_PARTY("#ffff8e") + DO_PARTY("#ff728e") else - icon_state = "blue-red" + color = "#ffb2b2" + animate(src) + animate(src, color = "#B3DFFF", time = 0.5 SECOND, loop = -1, easing = SINE_EASING) + animate(color = "#ffb2b2", time = 0.5 SECOND, loop = -1, easing = SINE_EASING) else - // new lighting behaviour with obj lights - icon_state = null + animate(src, color = "#FFFFFF", time = 0.5 SECONDS, easing = QUAD_EASING) // Stop the animation. + +#undef DO_PARTY /* diff --git a/html/changelogs/lohikar-arealights.yml b/html/changelogs/lohikar-arealights.yml new file mode 100644 index 00000000000..59b94b716f5 --- /dev/null +++ b/html/changelogs/lohikar-arealights.yml @@ -0,0 +1,4 @@ +author: Lohikar +delete-after: True +changes: + - tweak: "Smoothed out the animation for area lights such as fire alarms." diff --git a/icons/turf/areas.dmi b/icons/turf/areas.dmi index ed9e6e977cae3f9a9329d5aae6bd616d5f6166a2..3f660705cf3142bc22f64fb63616580e131e96f6 100755 GIT binary patch delta 25639 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 Z*gkjO{t%L%wa@Yc#)jqwxGSy?{ttZOCm;X- delta 25514 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

    ov?pDtAPW3)_(&d)EvOdvdf^ErZ7T=?t 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 VmMYlb8-yAF7mY2ANax({{10Kk^hf{z From 7cc68feeb4bc34cac6e754d59c7f148227e51533 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 12 Mar 2017 05:18:09 -0500 Subject: [PATCH 27/55] Remove holder access (#1906) changes: Mob holders no longer grant that mob's access. Fix bug where wrong task was killed on invalid head in scheduler. Fixes #1785 --- code/controllers/Processes/scheduler.dm | 2 +- code/modules/mob/holder.dm | 15 +-------------- html/changelogs/lohikar-PR-1906.yml | 4 ++++ 3 files changed, 6 insertions(+), 15 deletions(-) create mode 100644 html/changelogs/lohikar-PR-1906.yml diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index bef21d18b77..35146686fcc 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -15,9 +15,9 @@ /datum/controller/process/scheduler/doWork() while (head && !PSCHED_CHECK_TICK) if (head.destroyed) + head.kill() head = head.next tasks -= head - head.kill() continue if (head.trigger_time >= world.time) return // Nothing after this will be ready to fire. diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 689c3f17103..965c777c25c 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -36,23 +36,10 @@ var/list/holder_mob_icon_cache = list() if (contained) contained.examine(user) - -/obj/item/weapon/holder/GetID() - for(var/mob/M in contents) - var/obj/item/I = M.GetIdCard() - if(I) - return I - return null - -/obj/item/weapon/holder/GetAccess() - var/obj/item/I = GetID() - return I ? I.GetAccess() : ..() - /obj/item/weapon/holder/attack_self() for(var/mob/M in contents) M.show_inv(usr) - //Mob specific holders. /obj/item/weapon/holder/diona origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5) @@ -573,4 +560,4 @@ var/list/holder_mob_icon_cache = list() /obj/item/weapon/holder/pai/rabbit icon_state = "rabbit_rest" - item_state = "rabbit" \ No newline at end of file + item_state = "rabbit" diff --git a/html/changelogs/lohikar-PR-1906.yml b/html/changelogs/lohikar-PR-1906.yml new file mode 100644 index 00000000000..89625a8995a --- /dev/null +++ b/html/changelogs/lohikar-PR-1906.yml @@ -0,0 +1,4 @@ +author: Lohikar +delete-after: True +changes: + - rscdel: "Held mobs such as maintenance drones no longer act as ID cards." From 263bb7ab8d4ad0ad779eade01d1f2515784fc854 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 12 Mar 2017 05:18:58 -0500 Subject: [PATCH 28/55] RnD & Cat fixes (#1913) changes: bugfix: "Fixed an issue where some objects could not be deconstructed with RnD." bugfix: "Helmet lights now actually display the powered-on sprite." bugfix: "Cats on heads no longer magically turn invisible." bugfix: "Cyborgs' portable destructive analyzer can no longer steal intercoms or the captain's safe." imageadd: "Duffle (duffel?) bags now have in-hand sprites." Fixes #1158 Fixes #1662 --- .../circuitboards/computer/holodeckcontrol.dm | 2 +- .../objects/items/weapons/material/knives.dm | 2 +- .../objects/items/weapons/material/misc.dm | 4 +-- .../objects/items/weapons/storage/backpack.dm | 28 ++++++++++++++++++ code/game/objects/items/weapons/stunbaton.dm | 2 +- code/game/objects/items/weapons/tools.dm | 6 ++-- code/game/objects/items/weapons/traps.dm | 2 +- code/modules/materials/materials.dm | 2 +- code/modules/mob/holder.dm | 10 +++---- .../mob/living/carbon/human/update_icons.dm | 5 ++-- .../mob/living/silicon/robot/robot_items.dm | 5 +++- code/modules/paperwork/pen.dm | 2 +- .../projectiles/guns/energy/special.dm | 2 +- .../projectiles/guns/projectile/pistol.dm | 2 +- code/modules/telesci/bscrystal.dm | 4 +-- code/modules/telesci/gps.dm | 2 +- code/modules/telesci/telepad.dm | 2 +- html/changelogs/lohikar-misc-fixes.yml | 8 +++++ icons/mob/head.dmi | Bin 139067 -> 140166 bytes icons/mob/items/lefthand_backpacks.dmi | Bin 3445 -> 6186 bytes icons/mob/items/righthand_backpacks.dmi | Bin 3456 -> 6288 bytes 21 files changed, 64 insertions(+), 26 deletions(-) create mode 100644 html/changelogs/lohikar-misc-fixes.yml diff --git a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm b/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm index db11c4de502..e36b147d113 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/holodeckcontrol.dm @@ -5,7 +5,7 @@ /obj/item/weapon/circuitboard/holodeckcontrol name = T_BOARD("holodeck control console") build_path = /obj/machinery/computer/HolodeckControl - origin_tech = "programming=2;bluespace=2" + origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 2) var/last_to_emag var/linkedholodeck_area var/list/supported_programs diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index f78b563917f..f5bc195ead9 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -58,7 +58,7 @@ edge = 1 force_divisor = 0.15 // 9 when wielded with hardness 60 (steel) matter = list(DEFAULT_WALL_MATERIAL = 12000) - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") unbreakable = 1 diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 8cae5642073..ae28d217466 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -18,7 +18,7 @@ w_class = 2 sharp = 1 edge = 1 - origin_tech = "materials=2;combat=1" + origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1) attack_verb = list("chopped", "torn", "cut") applies_material_colour = 0 @@ -61,5 +61,5 @@ throw_range = 3 w_class = 4 slot_flags = SLOT_BACK - origin_tech = "materials=2;combat=2" + origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 2) attack_verb = list("chopped", "sliced", "cut", "reaped") diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 3ca7ce50aa0..633f8285947 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -329,11 +329,19 @@ name = "duffel bag" desc = "A spacious duffel bag." icon_state = "duffel-norm" + item_state_slots = list( + slot_l_hand_str = "duffle", + slot_r_hand_str = "duffle" + ) /obj/item/weapon/storage/backpack/duffel/cap name = "captain's duffel bag" desc = "A rare and special duffel bag for only the most air-headed of Nanotrasen personnel." icon_state = "duffel-captain" + item_state_slots = list( + slot_l_hand_str = "duffle_captain", + slot_r_hand_str = "duffle_captain" + ) /obj/item/weapon/storage/backpack/duffel/hyd name = "botanist's duffel bag" @@ -344,16 +352,28 @@ name = "virology duffel bag" desc = "A sterilized duffel bag suited to those about to unleash pathogenic havoc upon the world." icon_state = "duffel-virology" + item_state_slots = list( + slot_l_hand_str = "duffle_med", + slot_r_hand_str = "duffle_med" + ) /obj/item/weapon/storage/backpack/duffel/med name = "medical duffel bag" desc = "A sterilized duffel bag for the young, upcoming lesbayan." icon_state = "duffel-medical" + item_state_slots = list( + slot_l_hand_str = "duffle_med", + slot_r_hand_str = "duffle_med" + ) /obj/item/weapon/storage/backpack/duffel/eng name = "industrial duffel bag" desc = "A rough and tumble duffel bag for the hard working wrench-monkey of tomorrow." icon_state = "duffel-engineering" + item_state_slots = list( + slot_l_hand_str = "duffle_eng", + slot_r_hand_str = "duffle_eng" + ) /obj/item/weapon/storage/backpack/duffel/tox name = "scientist's duffel bag" @@ -374,11 +394,19 @@ name = "chemistry duffel bag" desc = "Spice up the love life a little." icon_state = "duffel-chemistry" + item_state_slots = list( + slot_l_hand_str = "duffle_med", + slot_r_hand_str = "duffle_med" + ) /obj/item/weapon/storage/backpack/duffel/syndie name = "syndicate duffel bag" desc = "A snazzy black and red duffel bag, perfect for smuggling C4 and Parapens." icon_state = "duffel-syndie" + item_state_slots = list( + slot_l_hand_str = "duffle_syndie", + slot_r_hand_str = "duffle_syndie" + ) /obj/item/weapon/storage/backpack/duffel/wizard name = "wizardly duffel bag" diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 51c60982e46..64a44c1af54 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -208,7 +208,7 @@ item_state = "stunrod" force = 20 baton_color = "#75ACFF" - origin_tech = "combat=4,illegal=2" + origin_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 2) contained_sprite = 1 /obj/item/weapon/melee/baton/stunrod/New() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 95768c20e7c..5cb0fea0e18 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -166,7 +166,7 @@ desc = "A welding tool with an extended-capacity built-in fuel tank, standard issue for engineers." max_fuel = 40 matter = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 60) - origin_tech = "engineering=2" + origin_tech = list(TECH_ENGINEERING = 2) base_iconstate = "ind_welder" @@ -176,7 +176,7 @@ max_fuel = 80 w_class = 2.0 matter = list(DEFAULT_WALL_MATERIAL = 200, "glass" = 120) - origin_tech = "engineering=3" + origin_tech = list(TECH_ENGINEERING = 3) base_iconstate = "adv_welder" @@ -187,7 +187,7 @@ max_fuel = 40 w_class = 2.0 matter = list(DEFAULT_WALL_MATERIAL = 100, "glass" = 120) - origin_tech = "engineering=4;biotech=4" + origin_tech = list(TECH_ENGINEERING = 4, TECH_BIO = 4) base_iconstate = "exp_welder" base_itemstate = "exp_welder" diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 31bcd4a6e72..b2e58cdad5b 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -8,7 +8,7 @@ desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." throwforce = 0 w_class = 3 - origin_tech = "materials=1" + origin_tech = list(TECH_MATERIAL = 1) matter = list(DEFAULT_WALL_MATERIAL = 18750) var/deployed = 0 diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index 5bbd8974f45..18a381ee219 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -466,7 +466,7 @@ var/list/name_to_material tableslam_noise = 'sound/effects/Glasshit.ogg' hardness = 40 weight = 30 - stack_origin_tech = "materials=2" + stack_origin_tech = list(TECH_MATERIAL = 2) composite_material = list(DEFAULT_WALL_MATERIAL = 1875,"glass" = 3750) window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 5) created_window = /obj/structure/window/reinforced diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 965c777c25c..2d406a08877 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -355,19 +355,17 @@ var/list/holder_mob_icon_cache = list() desc_dead = "It used to be a little plant critter." icon_state = "nymph" icon_state_dead = "nymph_dead" - origin_tech = "magnets=3;biotech=5" + origin_tech = list(TECH_MAGNET = 3, TECH_BIO = 5) slot_flags = SLOT_HEAD | SLOT_OCLOTHING w_class = 2 - - /obj/item/weapon/holder/drone name = "maintenance drone" desc = "It's a small maintenance robot." icon_state = "drone" item_state = "drone" - origin_tech = "magnets=3;engineering=5" + origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5) slot_flags = SLOT_HEAD w_class = 4 contained_sprite = 1 @@ -410,7 +408,7 @@ var/list/holder_mob_icon_cache = list() name = "cortical borer" desc = "It's a slimy brain slug. Gross." icon_state = "brainslug" - origin_tech = "biotech=6" + origin_tech = list(TECH_BIO = 6) w_class = 1 /obj/item/weapon/holder/monkey @@ -457,7 +455,7 @@ var/list/holder_mob_icon_cache = list() icon_state_dead = "mouse_brown_dead" slot_flags = SLOT_EARS contained_sprite = 1 - origin_tech = "biotech=2" + origin_tech = list(TECH_BIO = 2) w_class = 1 /obj/item/weapon/holder/mouse/white diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index cd072134433..dd4c8932cd4 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -779,8 +779,9 @@ var/global/list/damage_icon_parts = list() if(istype(head,/obj/item/clothing/head)) var/obj/item/clothing/head/hat = head - if(hat.on && light_overlay_cache["[hat.light_overlay]"]) - standing.overlays |= light_overlay_cache["[hat.light_overlay]"] + var/cache_key = "[hat.light_overlay]_[species.get_bodytype()]" + if(hat.on && light_overlay_cache["[cache_key]"]) + standing.overlays |= light_overlay_cache["[cache_key]"] standing.color = head.color overlays_standing[HEAD_LAYER] = standing diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 2248c7f28cd..43ad839e62e 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -90,7 +90,10 @@ user << "Your [src] already has something inside. Analyze or eject it first." return var/obj/item/I = target - I.loc = src + if (I.anchored) + user << span("notice", "\The [I] is anchored in place.") + return + I.forceMove(src) loaded_item = I for(var/mob/M in viewers()) M.show_message(text("[user] adds the [I] to the [src]."), 1) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index eba0e9df844..14b72bc778e 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -111,7 +111,7 @@ * Parapens */ /obj/item/weapon/pen/reagent/paralysis - origin_tech = "materials=2;syndicate=5" + origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) /obj/item/weapon/pen/reagent/paralysis/New() ..() diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index ac14e200c4a..9da6c2df364 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -373,7 +373,7 @@ icon = 'icons/obj/vaurca_items.dmi' icon_state = "thermaldrill" item_state = "thermaldrill" - origin_tech = "combat=6;phorontech=8," + origin_tech = list(TECH_COMBAT = 6, TECH_PHORON = 8) fire_sound = 'sound/magic/lightningbolt.ogg' slot_flags = SLOT_BACK w_class = 4 diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index c3a58213419..1ab63632c97 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -77,7 +77,7 @@ magazine_type = /obj/item/ammo_magazine/t40 allowed_magazines = list(/obj/item/ammo_magazine/t40) caliber = "10mm" - origin_tech = "combat=3;materials=2" + origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2) fire_sound = 'sound/weapons/Gunshot_light.ogg' load_method = MAGAZINE sel_mode = 1 diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm index 2f06ac3c1bc..e9de80093c6 100644 --- a/code/modules/telesci/bscrystal.dm +++ b/code/modules/telesci/bscrystal.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/telescience.dmi' icon_state = "bluespace_crystal" w_class = 1 - origin_tech = "bluespace=4;materials=3" + origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 3) var/blink_range = 8 // The teleport range when crushed/thrown at someone. @@ -42,5 +42,5 @@ /obj/item/bluespace_crystal/artificial name = "artificial bluespace crystal" desc = "An artificially made bluespace crystal, it looks delicate." - origin_tech = "bluespace=2" + origin_tech = list(TECH_BLUESPACE = 2) blink_range = 4 // Not as good as the organic stuff! diff --git a/code/modules/telesci/gps.dm b/code/modules/telesci/gps.dm index 6271a79a6dd..3ea12461f42 100644 --- a/code/modules/telesci/gps.dm +++ b/code/modules/telesci/gps.dm @@ -6,7 +6,7 @@ var/list/GPS_list = list() icon_state = "gps-c" w_class = 2 slot_flags = SLOT_BELT - origin_tech = "programming=2;engineering=2" + origin_tech = list(TECH_DATA = 2, TECH_ENGINEERING = 2) var/gpstag = "COM0" var/emped = 0 var/turf/locked_location diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index 2317c4775b9..565a67f6f4b 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -94,7 +94,7 @@ icon = 'icons/obj/radio.dmi' icon_state = "beacon" item_state = "signaler" - origin_tech = "bluespace=3" + origin_tech = list(TECH_BLUESPACE = 3) /obj/item/device/telepad_beacon/attack_self(mob/user) if(user) diff --git a/html/changelogs/lohikar-misc-fixes.yml b/html/changelogs/lohikar-misc-fixes.yml new file mode 100644 index 00000000000..c387497bbf3 --- /dev/null +++ b/html/changelogs/lohikar-misc-fixes.yml @@ -0,0 +1,8 @@ +author: Lohikar +delete-after: True +changes: + - bugfix: "Fixed an issue where some objects could not be deconstructed with RnD." + - bugfix: "Helmet lights now actually display the powered-on sprite." + - bugfix: "Cats on heads no longer magically turn invisible." + - bugfix: "Cyborgs' portable destructive analyzer can no longer steal intercoms or the captain's safe." + - imageadd: "Duffle (duffel?) bags now have in-hand sprites." diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 2dbb045480fca546c95f6c385be15d806d1bf98f..bdf12dc34e933b394ebeb893f871fc98d363e74d 100644 GIT binary patch delta 21870 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 BGe!Ua delta 20761 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

0?msU&(Ek9%KJ?$5e7INp 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 R<@W#p002ovPDHLkV1l$Yt|I^d diff --git a/icons/mob/items/lefthand_backpacks.dmi b/icons/mob/items/lefthand_backpacks.dmi index 5e1083f8712d3028b53b8902d39b54bec500348e..18d87dfa781865f6ef4b81cdf1de199cf8618c52 100644 GIT binary patch literal 6186 zcmb_gXH-+&wmku<0zr`u21P}XBGRNIO^_l|qzC~;J_Hn$P68w^i^QJpx}=a)GNYsx{db+)>o zB*|uTp$+aE#=ioKZyCSarV2~=N{j}sPHw}JKhxGECED7x8=r8~eB3uUl0KP9-v0H$HjAooM>)Ns*F42fT&+}Sy*w87 zzOb_C@NpRl0C>d=b+1_lW-O1O9$QY=F|AUxS%*bqkDaNgdsJMgRMNw_V$d;KashKT zytr$Ok0%+!lFz*YYxzP@+1c|a5O`->p+7w{b5=>o`u_Of<`U5XYL=(q(N`QOtvwGn z!boM0yBmArHAmgsU5j(r%4~L%&M5;(?Y~@H!mF3bc(N7lqqTh}CMy}7<

}7`TL+ zi^yA^pRlKgBmNwM7);2=o_-sLQv-6DN(&~ExKRA%f-ResV_w1mXMPH^Y`iLxv@$uvzmz|3-rR&=atS}rl2 z7L_y<8mYnXAx2Bpe~DSjuI73{jOIcAX6?i^cT`?M9?3i!Cj9)C`0Qng=?sjDf7Iml zR^}+SWaZ9G~$IwdtJ-0EwDZHjN04gwq4)I-l7W8pQA4wRLo! zV-OMEjIl{c=gaY?23vNY#e_w{RqsDAFN{(Zw8*S{;;IvQcuzRM_0%T^`&UI1)D+J> zDSyU}zCNCAGCNhhHCp(~aGj63Y+W9A`@xM~60QHa^7g25ew1qDO%?sH#^@@J4!Nf8 zmdvO+(}w=1y@RLm&Cps(%^W|$@o<+^T&=e_#{?UDbH~&0RkK%2=g$L`Gb0{`yka@^ zdP9SutnZgsTDhR=dusA$rVGg$^XbpuBqnYk4sOBWD+?}hs|Zhz`TH?)SsB_RO9rDmmC#LJ#}lWrYKFak7@Hl>+V_Dp6tgRIBWFO6DaPm#ycN97&- zWR^G{-Q3kVd9WUi-(JGU6i^EkAcUH+S^b;dnY0TPZE6e;_CzMMm*M>*J{z8UB8BB~ z?t^rA)up<hOcTz1>eSd+)AJ`mY9%1-38OeKXLC4F-X1{}kr-usELmu-3K=W= zg}>_@CZJ^9P||}Bq*RY1w;H2fM>0)k0+kw2-ldvX0|CPjV0D>#?WcJyb>d5l+ zITQ3#85dMXRv)ASjxBK0%9KZQCq<6g^iYl z*+M0g>sz1k5TH;x{dIsMUi6Bw!;CRPIBxhxm?-||X^$^) zqF`8}hq}3IXgtT!xw$0(y7djN+x3o1$oolz1=aXz2!ya037g}e>~XP>@!ZZDZB1CI z5lq&gyi2#?wX6Lo`Dzt0e!Vv>O(5q)`(Aeikq(W++7V69gOm*zBUnIOZW12Hs8cyg z@w5B4zjdb4w zeGDf`;0v`+vUXFU=fUiZo>p76BqNjRQ~&nIm885L+#l@lf-r^#*aR&L5WW}PE)D4L zk&hS0|-`R|Xu1N+SO@3AxzOrKJ)?d;n7IYaVn-!H|<3 z%_U}P@W#kyZH^vka#EN6ZAFDex&7zY*J1r0@dOW${otPh$RXDMGRlE67J(Cg@Z`xy zI&@i?^uvMjW+ot#SLQb0WXl7*&CNYq8nC{MeM75DmV!6fD33T6okPC&F>Y>dF2!IX zHBootaXiZO7p0|d^Yin!wY34j!@){JhAas)k|RnTARMS7$2$AUC6A{oJ~CebDvQFi5jlt>Au{cd#>5CE2d+ z7L;VS+JWs&5v&|_zoiQf%O%@84^++%cxYV&BqSt)qoSe!M6}lY{5-Rb76O5|7$+bo zn0KRK)edy57=zKVu;5x)SUC5h)XKrZ;lW+~dc3J2)vjw@Q<|{N;`TxExU&UTcQf6P zFCB4Svi&n?vpHyGh;}bfB;}51GR#67!g^-xGBj7?TRPjXqQ=fw?iGnt)%E?ui_W3v zN{WhSMMdewOfv|_ezdY|NZvz!R*B2V`1{u{)2XQ`1CCqi;Lb}jGK75n{m&{ZD;I|N zYnPKett>6KUq?pv?#yI~cC1okR(TVF!~J5{YeIo6C9hU0d&*o;k6;50Wt9!3vloX4 z=>UUAWxf7D?1F-b5I{ZF;CpgrYU--Sv!UZGfQpJrY<&D#MN{D=*}V0iI!D<<6%+Z+lNQCG*2=CQQlk*s1cv9hEaiOtZj)&EG`GfZ{f z`zi)l4Jxc>pJBU}CR$ll?bKv7Buo-WN4Q``OG)9H4*cne0%~i*LRCKoPz_i)2Kb_O z#Z^>QZ&_Qv1oLt<0-R=lW!`c;_NkI5mJh#oy8REV=AYoU^?9yTh~%Afl=&2qMqy#yBqT z`r2q`UQTlHy^`L6fe0(iZFU;hFr=S!>E6H*pQM&)FC6bSSqU=-*9i7{DUQXkiyJf@ zYxR?Cr;Bcku1Gz6THVK^hV!p0LLE>iU_l$3wVRH)q+C2}gG)P4wu|ipcXw@PXVJ8@ zG?2FUcG$~S?ck34zz6qU3GzZO*xjxC;hOoaTjNH`vJjcZxbVXr7h>nd>91ia(J#2U zxi#9$!8|PPG(&-#ScerPV%Zy<_lfdeJQzAG9oMaiaTMd(|G4@6KMiyQ1EKGyM=$u9 z43%S*d3{}`VVDAzoV6$O#X-uChj`VhZ8^0Do{e*L=V)d^8;N24BJg|_xEORV0?@zwAOueBpKFyDg$Q}~l;G>;v-fWo?w8zGdCm|n?UpK1SYBStd-_w_L*cUJz zM%lGb&MgGITl$s~AOCD+#dB(UT5s4BCH!-030s(~JfK+U+T zNT$)xC%E1lp%v+%y2OZIms}3Dy4x0;7Z3wv$DM-s;lqQug&M&;R_j{K!#R|ekqjv) zl<%f0Pm@yzX{{ujhQ)I}(dH0TWV>|x9hx>ANX$|<*s)K>q``fEDv%za*o1LB^-5z$ zNUAvy4h)4kp%QD|VQ^AAmTqnkg;g7M`o40>QaGC<*m~IM^4z6*tl9fLJr~Q#zb(5l zGW4G0Mu+908t6DL#6p7<{$Q(@%-eH+ePEfrzgEAKmBSg@M0D$D)-ENn0Vl2e z9q;0;8=W0E#}&BFuuX8=oy7eGaIzRw#+Ls%5+1S}{CE26fA;9zCxMDc*eSeNT69`6 zy$rQ^S$%QR>bLh;wM?!TD`NKhCXTTpWYV3yG{IyQuW(_bO4r2td4uuXT-6=(t#`0@ zg_vvb3t(wK2~h7Fm$!^*Zz=EJS&;__IqLNgAg|@{lC*F3mvA3fh^~_I9%iSzo>fg1 zvLw4`AFP5{zMYTkBQi67ln`SA3#E>ooj}H@Vm&_18G}*Z`(4xePA)$mxvT=L*w?{b zW=HsTcjs~j;aqZER8cRy;@DTA;=*Klr=}Q~l?rcmG`wD+Lw#{JDS0wAK3-#psos^Q zr7%m(rVM1GY;9A$1$<3GzuOehItnociJfqZBC9(dmNV9cPBvZ4Y=W{U2ZEHS$|lKU z&5cVkGBLHZc0N&fH>Ud0P@%VvPh4VRSZCgKQB6%e(e2Z*dAJ9X+sRUgy(OfUH&4KQ z6_e`~(VO4syD|8FcNcLg1OsetZrXhEEwM3KXg9&?(TnW&{7!gBm$4sAy#6f>&P{19 z$|HG(XCvS~KNW0t_J5aorH8ngVB^`2@H^-SJS5i+Ci^y9KPjGxdquns8B5o+hkd&2 zH?>Uapb?eqNgHW_k{ZG||4U$PQt|fwfNy9ZsV};QQZwWy)E5^Q?v>43tuc#%C`R%> zrmhcJb#Xfiuab}ERYLA8FWkhBa`!gJ87Sa(uZ)$xSNN_WF~ke0Kipx=9kCWW+DW;V zmfzGA+qT!Urngv0PP4__hIm*>p|vC9aAQdQV2zg}_R^}jpWiEg$IRHJsyPaTO>z8Q zYV2CZSI;oV)yUR~?oN*y#`MRgJot19KkGQ}zO;QU`pHWUH`{&15_lw8I1qGf54X<0 z7{-Q8WxmUa{S%fX209wKLZgM@1ek%lX6EL(z}tp~;ZECV!IQX|<)-j+b_Q|pbeT&G zj?SKwhm7a`y8`0If*zxn`$~x@%$u1eM24_1K3~^Fu`9?hdG4LvEqr@ajv-o)CW8R2 z`4@-38DJ?nh4`Y56p2qECBLKsD>Y(O8u$O+5=XA&_MC00~+J@lzsihGc<;{Zg(30I&kk3 zLbX(I5l&b9`V*po1X(#bt|HS+))7&!pJ@sJ8tnfvRQy=qzkd(prf1N4AG*1%EfLA5 zeI&2VZph{%Kqeh&k_7U;@7$tTU%+NsN?bLz{%`}$3a0m?kA9Rn}5$M_8c)+_ zq9eA0PXX@jzjb&E`$kX#GL6|Qp9)D0``b^O4&#i#>eRP|KMW!FRi&MX`6H-$bd{P3Y;Dp9pe#62~G+ff(X2AcW3V8fKqB0S{BwdgFaEN@< zdiBf~j|<8%8Doc0KB1zo{x`Q zd_sZ)SjlIuN@@!qIiSYy0V_Y0u+pW8zhTnsWo~iH%4*uk)U<``rkdOe&VSYg3;Xz-nAziVNn z4R^l8#KeohMH!i`=1Z055I=#-f?iPRb0@SVPBNkg0+El;L{!d2JUoQz505%NUY(tYl${&q1th`ZhYCkVB+4}d=KcYEsjIKb1-7XT3XNvW9Md*oQ3Z~nMm5@bNBm8t}9 zYp-;hE%ud|RrgsQ63XNnbmHFN$|h#Fj05Xr&8n-sg&}_knK>3rKS5@?UhS26(d)?k z63!o`3wJhc{;9pPQKrlM*VVdUt6wzw_oz4)hwTQcF=fHy#SvH3J0?l-{ zrRX1P2d(ECfCX%4K-|V0e^03kvI|HwmG|7J`t(xd6^NrUzVelIl%a&2pzBN$JBazZ zXQsBX%QI_Ge3~iiWwnp(5|*wFAsN59Di$d0w6Ts`1-XxpF1nm+!QD4y!U)U$EN4dLiO(bj&K$JhxgyyPExKE$snK z9G$dWy9XOTF>2G7m6eGs1(6P1EC{FS2VIW{0da%42kkDW4xzI}3RKP0wE^BALEM{j zcY_|Lf9p4Qru}r89shM~v^KpH@rfPV9-?4YplY-8!_UV@vHi8OsgsG=IpqZE6wKbp z*e>;qglAni_BIj;rC;TVr|V`Kc{~+bkcrshqR%jl&3!>VKwYkYg?;Jjwo_kd(K^@1 z3QU5XP9-FO!pvKOUiYg6!kA2pG$VwNl(awm-gac=QdRC|GKyO4?jZ;pQ4{sZg~J^Q z!49ToSsO&0m#61Yf+Ub)dmtiZv7l~1;?ujJ^fPWSFy~K1W&|qjLyVzV^PGfM5&?Si+i}9q=zLoei@Pnt zB9b>ji%%iFQ~ZlDDB%f{aEFZVH5Y4&v_y16x>Jb&=1M5#=_M4U@P zBlPm4#ij(~c#~|4;7rQ!Kxu!kdJwo)i2A8~r;_+tm|29_)B!BDYItdvfN3c2Ff+8X2t zzq(a@bBHZ~c#-8}R#;UsIjO5a)+S|HQk^$5$@qoKGG5qvgw3K=9+i2X8?wbd18?X? zb{^iR4i6lYybYF=;@;xUl1)Ufu5F@27Ci|>hZILz#}c{0feLpKP0m^rcJ2J}?uN&$ zXS2kJQFT7!h33+QQz!i4{>mLYz?&6Ih6S({d$o}9j|6g3s|@yYs;0kfR?h|9tT97R z+Iy5Eww!S^qh?E2cf#Q_hF7)qh~Ws+PsIX13n^78QZb6il5hJT;X-kZXPp{by&+K@YiahqBaLZW zg5t9^p2a_;Hb)u<8k445D&9Q2srQ>n<%Sd=gg51NXMZS`y+;HL=RaxdHs36Udj<2u z<@a)!Zcb5pV-Unp6`S0Nt&cR#S=!U7xG-x9f41p>93Nyu+Tw5c1h%mCy#5{FaeQ@vU~o&o7AFV*K)}=VwZW9X z{^5ZE}C2zK)B_ zuKA|po*oTO0TTNY-PDN@Igh5Hn;IzwOWOXC$E-Bfbi?gu*E71Z!nLSiWsa|p3RL_D zKFmx`>bRN0u#Pm=pNk@JDyPTf{fb2J{6qn0!<-Osg^t)()|BCpn@7iylhKLkF{S-rir7 zPRRHjkJr4)$;o^woS(=>WEidaQ*(zi^pzzt- zuLd{d3l%Hd+ZXTXHfTg*?9_DF^&#)6d*IC7C9c9Z_G3Thdxj>2oDobJMMaP#GdYIX z@kQoWSFDe!K?|5LbTciZNoD#O;gzv{@5h-Gd#Md9ccS*ZD+g2;-~;{b40YMqU$%3M zJdhWuT+c1*#Q4O7WT7Xp>TA{Oi4Mc?HYS{}30YE`80hh(t32R)s}WMx{(k572Cv2Od0)c?4`1u!fIw5E9;uZv#YCG0A(Fteb* z(XBh2(C-)Gzss<%RBXaB3s%D2uGL}Lk5!O?JGR3cnvtR~FO@PpXM927b)6;AzJgtv zD9RqVV`+#;$+5cgJfG4YsWpl9qE;@v^YwXhBh|R#qauz$CWM3(LM~x(U{iH&kSKW;IiNi? zS3=x}I#zLG;6;(-sT-k(7@lclAcPva&h2*c9R2rT!wV=GZAI=CemKLz z`$6VXr4KmYugM1$fxm{YM(C60Gswe-!Sc&;5z;b%OoYezQ#vh9%MaWb5x&$&Dx@TD z^SIKYJ2qnxf=*T*)5I$+)IKjCsCo3{$X|{{^E~fFRetYC;Z75Gml?9&wrH$FjpyQq z<>mq=`UoZEzFs|QIv2?@#8r$`XhNHuius$Oe`;OvHE|VlVt+Rt#!5C4nVnMSf<@e{ zw`EQ2nqac*xzJ__4yV?vJv6x3dO089i=Or=h>3mYt|xZjjmUDVxn?=%cK>$7k0Pa~ zn#&F0(ybs@j>j4#!8#xv_4C>{AV4gzCCGiyxU6p8`r2DurDiLSpM3{6I9kGOuS}pl z&n(qiI<(VW$1$aOe_os3&ExZfW6rTXdYN6lEoSF^zl?BxqVP$^w6s9KL_~;nHkeziq3>q$d@jL+qIIt~`i5gy<2qX{L z?KV==XA=y)#nZfh{mDJP+0%P&2W(#y?q_6apD){PR-a#sxbVYBG=8-}=x(B8ZWM~L zoc}^q{7_fy8WH_DO!_3lf_gtG&4DQAZBJg*&XKeH*VFrO}?ixdm(NohNv)wxc^>o)kk znWYfyM3B>N=*X?F;b|S>5sSv-{`L3p>k*VAWzed;(aS8>ckA`}#dA?arZJ>L1<%OX zs(;%;v3Q$b#3CHKr&leSMnLk5QQPYV9S0#zomYYE{5_R8$9h%cE8AjuI`dh+vVSV& z6yD@=UHE>(HK@qGlDOMRJg#Lu>CE8-zuyu@ zn_y@7w+ir(4Z(xmGdq%-QedtW9WpO1JM-x1tGZ+6 qsNL;XPHS`PR6zjvH#nX%2K)MAt3UG|@m&0)03$tfXq~Qe%)bEjb#WB{ diff --git a/icons/mob/items/righthand_backpacks.dmi b/icons/mob/items/righthand_backpacks.dmi index 0ce40b494173616be53bd2040ea00244ccbe2b1e..1af890a69e2cc3c8bd4ec19a49efc1a1e3b5eecb 100644 GIT binary patch literal 6288 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 Opr)*)RH|V4;{O0C?fw1$ literal 3456 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 Date: Sun, 12 Mar 2017 13:16:57 -0300 Subject: [PATCH 29/55] Nooses (#1805) -ported nooses from hippie They can be build with cable, if you stand on any table or bed. You can tie people, but it takes around 20 secs, and people that are not cuffed or disabled somehow can untie themselves. Also, it will produce some flavor texts while they are being hanged or a body is hanging from one. --- code/modules/power/cable.dm | 194 ++++++++++++++++++++++++++++ html/changelogs/alberky-PR-1805.yml | 6 + icons/obj/noose.dmi | Bin 0 -> 406 bytes sound/effects/noose_idle.ogg | Bin 0 -> 15466 bytes sound/effects/noosed.ogg | Bin 0 -> 21559 bytes 5 files changed, 200 insertions(+) create mode 100644 html/changelogs/alberky-PR-1805.yml create mode 100644 icons/obj/noose.dmi create mode 100644 sound/effects/noose_idle.ogg create mode 100644 sound/effects/noosed.ogg diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 9c82dd32286..9e14206f784 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -873,3 +873,197 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/stack/cable_coil/random/New() color = pick(COLOR_RED, COLOR_BLUE, COLOR_LIME, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN) ..() + +//nooses - all catbeast/ligger/squiggers/synths must hang + +/obj/item/stack/cable_coil/verb/make_noose() + set name = "Make Noose" + set category = "Object" + var/mob/M = usr + + if(ishuman(M) && !M.restrained() && !M.stat && !M.paralysis && ! M.stunned) + if(!istype(usr.loc,/turf)) return + if(!(locate(/obj/item/weapon/stool) in usr.loc) && !(locate(/obj/structure/bed) in usr.loc) && !(locate(/obj/structure/table) in usr.loc) && !(locate(/obj/structure/toilet) in usr.loc)) + usr << "You have to be standing on top of a chair/table/bed to make a noose!" + return 0 + if(src.amount <= 24) + usr << " You need at least 25 lengths to make a noose!" + return + new /obj/structure/noose(usr.loc) + usr << "You wind some cable together to make a noose, tying it to the ceiling." + src.use(25) + else + usr << "You cannot do that." + ..() + +/obj/structure/noose + name = "noose" + desc = "A morbid apparatus." + icon_state = "noose" + buckle_lying = 0 + icon = 'icons/obj/noose.dmi' + anchored = 1 + can_buckle = 1 + layer = 5 + var/image/over = null + var/ticks = 0 + +/obj/structure/noose/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/weapon/wirecutters)) + user.visible_message("[user] cuts the noose.", "You cut the noose.") + if(buckled_mob) + buckled_mob.visible_message("[buckled_mob] falls over and hits the ground!",\ + "You fall over and hit the ground!") + buckled_mob.adjustBruteLoss(10) + buckled_mob.silent = 0 + var/obj/item/stack/cable_coil/C = new(get_turf(src)) + C.amount = 25 + qdel(src) + return + ..() + +/obj/structure/noose/New() + ..() + pixel_y += 16 //Noose looks like it's "hanging" in the air + over = image(icon, "noose_overlay") + over.layer = MOB_LAYER + 0.1 + +/obj/structure/noose/Destroy() + processing_objects -= src + return ..() + +/obj/structure/noose/post_buckle_mob(mob/living/M) + if(M == buckled_mob) + layer = MOB_LAYER + overlays += over + processing_objects |= src + M.pixel_y = initial(M.pixel_y) + 8 //rise them up a bit + M.dir = SOUTH + else + layer = initial(layer) + overlays -= over + processing_objects -= src + pixel_x = initial(pixel_x) + M.pixel_x = initial(M.pixel_x) + M.pixel_y = initial(M.pixel_y) + +/obj/structure/noose/user_unbuckle_mob(mob/living/user) + if(buckled_mob && buckled_mob.buckled == src) + var/mob/living/M = buckled_mob + if(M != user) + user.visible_message("[user] begins to untie the noose over [M]'s neck...",\ + "You begin to untie the noose over [M]'s neck...") + if(do_mob(user, M, 100)) + user.visible_message("[user] unties the noose over [M]'s neck!",\ + "You untie the noose over [M]'s neck!") + else + return + else + M.visible_message(\ + "[M] struggles to untie the noose over their neck!",\ + "You struggle to untie the noose over your neck.") + if(!do_after(M, 150)) + if(M && M.buckled) + M << "You fail to untie yourself!" + return + if(!M.buckled) + return + M.visible_message(\ + "[M] unties the noose over their neck!",\ + "You untie the noose over your neck!") + M.Weaken(3) + unbuckle_mob() + buckled_mob.silent = 0 + add_fingerprint(user) + +/obj/structure/noose/user_buckle_mob(mob/living/carbon/human/M, mob/user) + if(!in_range(user, src) || user.stat || user.restrained() || !istype(M)) + return 0 + + if (ishuman(M)) + var/mob/living/carbon/human/H = M + var/obj/item/organ/external/affecting = H.get_organ("head") + if(!affecting) + user << "They don't have a head." + return + + if(M.loc != src.loc) return 0 //Can only noose someone if they're on the same tile as noose + + add_fingerprint(user) + + if(M == user && buckle_mob(M)) + M.visible_message(\ + "[M] ties \the [src] over their neck!",\ + "You tie \the [src] over your neck!") + playsound(user.loc, 'sound/effects/noosed.ogg', 50, 1, -1) + return 1 + else + M.visible_message(\ + "[user] attempts to tie \the [src] over [M]'s neck!",\ + "[user] ties \the [src] over your neck!") + user << "It will take 20 seconds and you have to stand still." + if(do_after(user, 200)) + if(buckle_mob(M)) + M.visible_message(\ + "[user] ties \the [src] over [M]'s neck!",\ + "[user] ties \the [src] over your neck!") + playsound(user.loc, 'sound/effects/noosed.ogg', 50, 1, -1) + return 1 + else + user.visible_message(\ + "[user] fails to tie \the [src] over [M]'s neck!",\ + "You fail to tie \the [src] over [M]'s neck!") + return 0 + else + user.visible_message(\ + "[user] fails to tie \the [src] over [M]'s neck!",\ + "You fail to tie \the [src] over [M]'s neck!") + return 0 + +/obj/structure/noose/process(mob/living/carbon/human/M, mob/user) + if(!buckled_mob) + processing_objects -= src + buckled_mob.pixel_x = initial(buckled_mob.pixel_x) + pixel_x = initial(pixel_x) + return + + ticks++ + switch(ticks) + if(1) + pixel_x -= 1 + buckled_mob.pixel_x -= 1 + if(2) + pixel_x = initial(pixel_x) + buckled_mob.pixel_x = initial(buckled_mob.pixel_x) + if(3) //Every third tick it plays a sound and RNG's a flavor text + pixel_x += 1 + buckled_mob.pixel_x += 1 + if(buckled_mob) + if (ishuman(buckled_mob)) + var/mob/living/carbon/human/H = buckled_mob + if (H.species && (H.species.flags & NO_BREATHE)) + return + if(prob(15)) + var/flavor_text = list("[buckled_mob]'s legs flail for anything to stand on.",\ + "[buckled_mob]'s hands are desperately clutching the noose.",\ + "[buckled_mob]'s limbs sway back and forth with diminishing strength.") + if(buckled_mob.stat == DEAD) + flavor_text = list("[buckled_mob]'s limbs lifelessly sway back and forth.",\ + "[buckled_mob]'s eyes stare straight ahead.") + buckled_mob.visible_message(pick(flavor_text)) + playsound(buckled_mob.loc, 'sound/effects/noose_idle.ogg', 50, 1, -3) + if(4) + pixel_x = initial(pixel_x) + buckled_mob.pixel_x = initial(buckled_mob.pixel_x) + ticks = 0 + + if(buckled_mob) + if (ishuman(buckled_mob)) + var/mob/living/carbon/human/H = buckled_mob + if (H.species && (H.species.flags & NO_BREATHE)) + return + buckled_mob.adjustOxyLoss(5) + buckled_mob.adjustBrainLoss(1) + buckled_mob.silent = max(buckled_mob.silent, 10) + if(prob(25)) //to reduce gasp spam + buckled_mob.emote("gasp") diff --git a/html/changelogs/alberky-PR-1805.yml b/html/changelogs/alberky-PR-1805.yml new file mode 100644 index 00000000000..54b5d10c5d0 --- /dev/null +++ b/html/changelogs/alberky-PR-1805.yml @@ -0,0 +1,6 @@ +author: Alberyk + +delete-after: True + +changes: + - rscadd: "Added nooses." diff --git a/icons/obj/noose.dmi b/icons/obj/noose.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7b9494d718af7252fe681345611e3493a2acedf7 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQZ-c}5hX6E#mPmP1tppJc?=8{ zbArPPib}tK2`>2f^@*0ZuGYCT=Yuzd8eBAf@JQ#pkLJk$Ajj;{qca|7ea>q%7Ib+F zc?XH+h)((R>2r7R)EySVM%`UNKF>~z%Uwdn!HPK{p&x&yu5`8RoVp`KTYJZ^ofvWF{#oEm>-OpHJzQ>%3Rp4LhZdU$5kmevl*+|58>_4olMKf` zmWy*MTw{=C?SHV5$&6o6M6UWk{Q8CuDGXZ}X7MzLIV|S8Fyr{cOeQDM1%~}zF1tM< zpRWs3|5Vyw`t$glnlBuB)dyzYKipgSrT@m<$_#mji+=>8Rwo$#=MwF0U_1YNHPauV wpHeQ|3r;d*Fq%j*=r*V^FJQd@H~urz%YR0T<}Tl`6X-z(Pgg&ebxsLQ0P1+DNdN!< literal 0 HcmV?d00001 diff --git a/sound/effects/noose_idle.ogg b/sound/effects/noose_idle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f3c76596c2f085d28f44f563901aac2ebe3d4258 GIT binary patch literal 15466 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 literal 0 HcmV?d00001 diff --git a/sound/effects/noosed.ogg b/sound/effects/noosed.ogg new file mode 100644 index 0000000000000000000000000000000000000000..276d7f25a8fe5a28567c1d93f09f4ef235439224 GIT binary patch literal 21559 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 Date: Fri, 17 Mar 2017 19:33:24 -0300 Subject: [PATCH 30/55] Custom items 15/03 (#1925) Items being added: -Tagged brown coat - Leo Wyatt - keinto -Tagged brown hat - Leo Wyatt - keinto Also, fixing some minor issues with some custom items. --- code/modules/customitems/item_defines.dm | 33 ++++++++++++++++++----- icons/obj/custom_items/leo_coat.dmi | Bin 0 -> 2211 bytes 2 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 icons/obj/custom_items/leo_coat.dmi diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 47a336aee2d..222a4d7f77e 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -96,7 +96,7 @@ All custom items with worn sprites must follow the contained sprite system: http /obj/item/clothing/gloves/swat/fluff/hawk_gloves //Sharpshooter gloves - Hawk Silverstone - nebulaflare - name = "\improper sharpshooter gloves" + name = "sharpshooter gloves" desc = "These tactical gloves are tailor made for a marksman." icon = 'icons/obj/custom_items/hawk_gloves.dmi' icon_state = "hawk_gloves" @@ -258,6 +258,7 @@ All custom items with worn sprites must follow the contained sprite system: http name = "ATLAS poster" /obj/item/weapon/contraband/poster/fluff/conservan_poster/New() + ..() serial_number = 59 @@ -341,7 +342,7 @@ All custom items with worn sprites must follow the contained sprite system: http /obj/item/weapon/fluff/moon_baton //Tiger Claw - Zander Moon - omnivac name = "tiger claw" - desc = "A small cerimonial energy dagger given to Golden Tigers." + desc = "A small ceremonial energy dagger given to Golden Tigers." icon = 'icons/obj/custom_items/moon_baton.dmi' icon_state = "tigerclaw" item_state = "tigerclaw" @@ -467,7 +468,7 @@ All custom items with worn sprites must follow the contained sprite system: http contained_sprite = 1 canremove = 0 abstract = 1 - species_restricted = list("Baseline Frame") + species_restricted = list("Machine") /obj/item/weapon/reagent_containers/food/drinks/flask/fluff/barcia_flask //First Shot - Gabriel Barcia - mrgabol100 @@ -618,7 +619,7 @@ All custom items with worn sprites must follow the contained sprite system: http contained_sprite = 1 -/obj/item/sign/fluff/alexis_degree //Xenonuerology Doctorate - Alexis Shaw - Tenenza +/obj/item/sign/fluff/alexis_degree //Xenonuerology Doctorate - Alexis Shaw - tenenza name = "xenonuerology degree" desc = "Certification for a doctorate in Xenonuerology, made out to Alexis Shaw by the St. Grahelm University of Biesel, authenticated by watermarking." icon_state = "alexis_degree" @@ -723,8 +724,8 @@ All custom items with worn sprites must follow the contained sprite system: http w_class = 2 -/obj/item/clothing/accessory/fluff/zahra_pin //Indigo remembrance pin - Zahra Karimi - synnono - name = "Indigo remembrance pin" +/obj/item/clothing/accessory/fluff/zahra_pin //Indigo Remembrance Pin - Zahra Karimi - synnono + name = "indigo remembrance pin" desc = "A small metal pin, worked into the likeness of an indigo iris blossom." icon = 'icons/obj/custom_items/zahra_pin.dmi' icon_state = "zahra_pin" @@ -732,7 +733,7 @@ All custom items with worn sprites must follow the contained sprite system: http contained_sprite = 1 -/obj/item/clothing/accessory/armband/fluff/karl_armband //Medizinercorps armband - Karl Jonson - arrow768 +/obj/item/clothing/accessory/armband/fluff/karl_armband //Medizinercorps Armband - Karl Jonson - arrow768 name = "medizinercorps armband" desc = "A plain black armband with the golden Medizinercorps logo on it." icon = 'icons/obj/custom_items/karl_armband.dmi' @@ -1008,3 +1009,21 @@ All custom items with worn sprites must follow the contained sprite system: http item_state = "ghoz_eyes" contained_sprite = 1 action_button_name = "Toggle Eyelids" + species_restricted = list("Vaurca") //i think this would make sense since those are some kind of vaurca build prothestic + + +/obj/item/clothing/head/det/fluff/leo_hat //Tagged brown hat - Leo Wyatt - keinto + name = "tagged brown hat" + desc = "A worn mid 20th century brown hat. If you look closely at the back, you can see a an embedded tag from the \"Museum of Terran Culture and Technology\"." + icon = 'icons/obj/custom_items/leo_coat.dmi' + icon_state = "leo_hat" + item_state = "leo_hat" + contained_sprite = 1 + +/obj/item/clothing/suit/storage/det_trench/fluff/leo_coat //Tagged brown coat - Leo Wyatt - keinto + name = "tagged brown coat" + desc = "A worn mid 20th century brown trenchcoat. If you look closely at bottom of the back, you can see an embedded tag from the \"Museum of Terran Culture and Technology\"." + icon = 'icons/obj/custom_items/leo_coat.dmi' + icon_state = "leo_coat" + item_state = "leo_coat" + contained_sprite = 1 diff --git a/icons/obj/custom_items/leo_coat.dmi b/icons/obj/custom_items/leo_coat.dmi new file mode 100644 index 0000000000000000000000000000000000000000..569630b8916c11e7d50ed4deb1d5628468144169 GIT binary patch literal 2211 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 literal 0 HcmV?d00001 From 66e6051bc76feb70d966be0e0870a9bdab7dac2e Mon Sep 17 00:00:00 2001 From: skull132 Date: Fri, 17 Mar 2017 17:34:57 -0400 Subject: [PATCH 31/55] Changelogs, 12MAR2017 --- html/changelog.html | 6 +++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/LordFowl - 1138.yml | 36 ----------------------------- 3 files changed, 9 insertions(+), 36 deletions(-) delete mode 100644 html/changelogs/LordFowl - 1138.yml diff --git a/html/changelog.html b/html/changelog.html index 229d3be6c82..3276aed72e8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,12 @@ -->

+

14 March 2017

+

LordFowl updated:

+
    +
  • Fixed chest-buzzers in Vaurca.
  • +
+

05 March 2017

Skull132 updated:

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 C?k)HL diff --git a/sound/weapons/laserdeep.ogg b/sound/weapons/laserdeep.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c4d2fb85fff873e9f64aeb0e79f0afb35c494f7c GIT binary patch literal 14292 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Ð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 literal 0 HcmV?d00001 From 301baf85599308330d68512fff91b86c15ee4401 Mon Sep 17 00:00:00 2001 From: NanakoAC Date: Sat, 18 Mar 2017 22:24:38 +0000 Subject: [PATCH 41/55] Animal Sleeping and Familiars (#1881) A small PR with a couple of effects: Makes simple animal sleeping a bit more robust, and fixes mice never waking up. Also adds napping support for NPC cats. Sadly it doesnt work for kittens as theyre lacking a sleep animation. Napping support can be easily added to any other creatures though many are lacking suitable sprites The rest verb for animals is moved to the abilities tab. its more streamlined to have it there since thats where all their other things are Tweaks a couple of wizard familiars, swaps the mouse and goat role+spells, and reclasses the mouse familiar to inherit from normal mice, so as to preserve base mouse functionality (squeek). Wizard familiars are unreleased content so no changelog And adds a small feature for mice to shift their pixel offset around gradually as they move. So that they dont stack up and look like one when theres many of them, it adds a little more visual variety. --- .../simple_animal/familiars/familiars.dm | 94 +++++------ .../mob/living/simple_animal/friendly/cat.dm | 72 ++++---- .../living/simple_animal/friendly/mouse.dm | 57 +++---- .../mob/living/simple_animal/simple_animal.dm | 158 +++++++++++++----- code/modules/spells/monster_manual.dm | 6 +- html/changelogs/Nanako-Sleepmice.yml | 38 +++++ 6 files changed, 266 insertions(+), 159 deletions(-) create mode 100644 html/changelogs/Nanako-Sleepmice.yml diff --git a/code/modules/mob/living/simple_animal/familiars/familiars.dm b/code/modules/mob/living/simple_animal/familiars/familiars.dm index 65381052111..613a9224fee 100644 --- a/code/modules/mob/living/simple_animal/familiars/familiars.dm +++ b/code/modules/mob/living/simple_animal/familiars/familiars.dm @@ -13,7 +13,7 @@ min_oxy = 1 //still require a /bit/ of air. max_co2 = 0 unsuitable_atoms_damage = 1 - + hunger_enabled = 0 supernatural = 1 @@ -21,7 +21,7 @@ /mob/living/simple_animal/familiar/New() ..() - add_language("Ceti Basic") + add_language(LANGUAGE_TCB) for(var/spell in wizardy_spells) src.add_spell(new spell, "const_spell_ready") @@ -104,26 +104,27 @@ /mob/living/simple_animal/familiar/goat name = "goat" - desc = "An elder looking goat." + desc = "A sprightly looking goat." icon_state = "goat" icon_living = "goat" icon_dead = "goat_dead" speak_emote = list("brays") attacktext = "kicked" - mob_size = MOB_SMALL + health = 80 + maxHealth = 80 - health = 50 - maxHealth = 50 + melee_damage_lower = 8 + melee_damage_upper = 12 + mob_size = 4.5 //weight based on Chanthangi goats + density = 0 + wizardy_spells = list(/spell/aoe_turf/smoke) - wizardy_spells = list(/spell/targeted/heal_target, - /spell/targeted/heal_target/area) /mob/living/simple_animal/familiar/pet //basically variants of normal animals with spells. icon = 'icons/mob/animal.dmi' - var/icon_rest //so that we can have resting little guys. /mob/living/simple_animal/familiar/pet/MouseDrop(atom/over_object) var/mob/living/carbon/H = over_object @@ -135,44 +136,8 @@ else return ..() -/mob/living/simple_animal/familiar/pet/Life() - ..() - if(!icon_rest) - return - if(stat == UNCONSCIOUS || resting) - icon_state = icon_rest -/mob/living/simple_animal/familiar/pet/mouse - name = "mouse" - desc = "A small rodent. It looks very old." - icon_state = "mouse_gray" - icon_living = "mouse_gray" - icon_dead = "mouse_gray_dead" - icon_rest = "mouse_gray_sleep" - speak_emote = list("squeeks") - holder_type = /obj/item/weapon/holder/mouse - pass_flags = PASSTABLE - mob_size = MOB_MINISCULE - - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_NOLIGHTING - - response_harm = "stamps on" - - health = 15 - maxHealth = 15 - melee_damage_lower = 1 - melee_damage_upper = 1 - attacktext = "nibbled" - - wizardy_spells = list(/spell/aoe_turf/smoke) - -/mob/living/simple_animal/familiar/pet/mouse/New() - ..() - - verbs += /mob/living/proc/ventcrawl - verbs += /mob/living/proc/hide /mob/living/simple_animal/familiar/pet/cat name = "black cat" @@ -181,6 +146,7 @@ icon_living = "cat3" icon_dead = "cat3_dead" icon_rest = "cat3_rest" + can_nap = 1 see_in_dark = 8 see_invisible = SEE_INVISIBLE_NOLIGHTING @@ -189,10 +155,44 @@ holder_type = /obj/item/weapon/holder/cat mob_size = MOB_SMALL - health = 25 - maxHealth = 25 + health = 45 + maxHealth = 45 melee_damage_lower = 3 melee_damage_upper = 4 attacktext = "clawed" + density = 0 wizardy_spells = list(/spell/targeted/subjugation) + + +/mob/living/simple_animal/mouse/familiar + name = "ancient mouse" + desc = "A small rodent. It looks very old." + body_color = "gray" + + + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_NOLIGHTING + + + health = 25 + maxHealth = 25 + melee_damage_lower = 1 + melee_damage_upper = 1 + attacktext = "nibbled" + universal_speak = 1 + universal_understand = 1 + + min_oxy = 1 //still require a /bit/ of air. + max_co2 = 0 + unsuitable_atoms_damage = 1 + + supernatural = 1 + +/mob/living/simple_animal/mouse/familiar/New() + ..() + add_spell(new /spell/targeted/heal_target, "const_spell_ready") + add_spell(new /spell/targeted/heal_target/area, "const_spell_ready") + add_language(LANGUAGE_TCB) + name = initial(name) + desc = initial(desc) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 22ec87fc34e..ff32edd1782 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -6,6 +6,8 @@ item_state = "cat2" icon_living = "cat2" icon_dead = "cat2_dead" + icon_rest = "cat2_rest" + can_nap = 1 speak = list("Meow!","Esp!","Purr!","HSSSSS") speak_emote = list("purrs", "meows") emote_hear = list("meows","mews") @@ -38,42 +40,43 @@ ..() - for(var/mob/living/simple_animal/mouse/snack in oview(src,7)) - if(snack.stat != DEAD && prob(65))//The probability allows her to not get stuck target the first mouse, reducing exploits - mousetarget = snack - movement_target = snack - foodtarget = 0//chasing mice takes precedence over eating food - if(prob(15)) - audible_emote(pick("hisses and spits!","mrowls fiercely!","eyes [snack] hungrily.")) - break + if (!stat) + for(var/mob/living/simple_animal/mouse/snack in oview(src,7)) + if(snack.stat != DEAD && prob(65))//The probability allows her to not get stuck target the first mouse, reducing exploits + mousetarget = snack + movement_target = snack + foodtarget = 0//chasing mice takes precedence over eating food + if(prob(15)) + audible_emote(pick("hisses and spits!","mrowls fiercely!","eyes [snack] hungrily.")) + break - if(!stat && !resting && !buckled) - if (turns_since_move > 5 || (flee_target || mousetarget)) + if(!buckled) + if (turns_since_move > 5 || (flee_target || mousetarget)) + walk_to(src,0) + turns_since_move = 0 + + if (flee_target) //fleeing takes precendence + handle_flee_target() + else + handle_movement_target() + + if (!movement_target) walk_to(src,0) - turns_since_move = 0 - if (flee_target) //fleeing takes precendence - handle_flee_target() - else - handle_movement_target() + spawn(2) + attack_mice() - if (!movement_target) - walk_to(src,0) - - spawn(2) - attack_mice() - - if(prob(2)) //spooky - var/mob/dead/observer/spook = locate() in range(src,5) - if(spook) - var/turf/T = spook.loc - var/list/visible = list() - for(var/obj/O in T.contents) - if(!O.invisibility && O.name) - visible += O - if(visible.len) - var/atom/A = pick(visible) - visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].") + if(prob(2)) //spooky + var/mob/dead/observer/spook = locate() in range(src,5) + if(spook) + var/turf/T = spook.loc + var/list/visible = list() + for(var/obj/O in T.contents) + if(!O.invisibility && O.name) + visible += O + if(visible.len) + var/atom/A = pick(visible) + visible_emote("suddenly stops and stares at something unseen[istype(A) ? " near [A]":""].") /mob/living/simple_animal/cat/proc/handle_movement_target() //if our target is neither inside a turf or inside a human(???), stop @@ -240,6 +243,8 @@ item_state = "cat" icon_living = "cat" icon_dead = "cat_dead" + icon_rest = "cat_rest" + can_nap = 1 befriend_job = "Chief Medical Officer" holder_type = /obj/item/weapon/holder/cat/black @@ -254,6 +259,7 @@ item_state = "kitten" icon_living = "kitten" icon_dead = "kitten_dead" + can_nap = 0 //No resting sprite gender = NEUTER holder_type = /obj/item/weapon/holder/cat/kitten @@ -269,6 +275,8 @@ item_state = "cat3" icon_living = "cat3" icon_dead = "cat3_dead" + icon_rest = "cat3_rest" + can_nap = 1 var/friend_name = "Erstatz Vryroxes" holder_type = /obj/item/weapon/holder/cat/black diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 56d8efcbeb4..4b9b3bf0ae5 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -1,12 +1,15 @@ /mob/living/simple_animal/mouse name = "mouse" real_name = "mouse" - desc = "It's a small rodent." + desc = "It's a small rodent, often seen hiding in maintenance areas and making a nuisance of itself." + icon = 'icons/mob/mouse.dmi' icon_state = "mouse_gray" item_state = "mouse_gray" icon_living = "mouse_gray" icon_dead = "mouse_gray_dead" + icon_rest = "mouse_gray_sleep" + can_nap = 1 speak = list("Squeek!","SQUEEK!","Squeek?") speak_emote = list("squeeks","squeeks","squiks") emote_hear = list("squeeks","squeaks","squiks") @@ -53,6 +56,7 @@ kitchen_tag = "rodent" + /mob/living/simple_animal/mouse/Life() if(..()) @@ -73,25 +77,19 @@ squeals++ last_squealgain = world.time - if(!ckey && stat == CONSCIOUS && prob(0.5)) - stat = UNCONSCIOUS - icon_state = "mouse_[body_color]_sleep" - wander = 0 - speak_chance = 0 - //snuffles - else if(stat == UNCONSCIOUS) - if(ckey || prob(1)) - stat = CONSCIOUS - icon_state = "mouse_[body_color]" - wander = 1 - speak_chance = initial(speak_chance) - else if(prob(5)) - audible_emote("snuffles.") else if ((world.time - timeofdeath) > decompose_time) dust() - +//Pixel offsetting as they scamper around +/mob/living/simple_animal/mouse/Move() + if(..()) + if (prob(50)) + pixel_x += rand(-2,2) + pixel_x = Clamp(pixel_x, -10, 10) + else + pixel_y += rand(-2,2) + pixel_y = Clamp(pixel_y, -4, 14) /mob/living/simple_animal/mouse/New() ..() @@ -109,8 +107,8 @@ icon_state = "mouse_[body_color]" item_state = "mouse_[body_color]" icon_living = "mouse_[body_color]" + icon_rest = "mouse_[body_color]_sleep" icon_dead = "mouse_[body_color]_dead" - desc = "It's a small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." if (body_color == "brown") holder_type = /obj/item/weapon/holder/mouse/brown if (body_color == "gray") @@ -144,17 +142,6 @@ if(client) client.time_died_as_mouse = world.time -/mob/living/simple_animal/mouse/MouseDrop(atom/over_object) - - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - - if(H.a_intent == "help") - get_scooped(H, usr) - return - else - return ..() - //Plays a sound. @@ -170,7 +157,7 @@ //Plays a random selection of four sounds, at a low volume //This is triggered randomly periodically by any mouse, or manually /mob/living/simple_animal/mouse/proc/squeak_soft(var/manual = 1) - if (stat == CONSCIOUS) + if (stat != DEAD) //Soft squeaks are allowed while sleeping var/list/new_squeaks = last_softsqueak ? soft_squeaks - last_softsqueak : soft_squeaks var/sound = pick(new_squeaks) @@ -215,6 +202,7 @@ if(!stat) var/mob/M = AM M << "\blue \icon[src] Squeek!" + poke(1) //Wake up if stepped on if (prob(95)) squeak(0) else @@ -233,15 +221,9 @@ /mob/living/simple_animal/mouse/dust() ..(anim = "dust_[body_color]", remains = /obj/effect/decal/remains/mouse, iconfile = 'icons/mob/mouse.dmi') -/mob/living/simple_animal/mouse/lay_down() - set name = "Rest" - set category = "IC" - resting = !resting - icon_state = resting ? "mouse_[body_color]_sleep" : "mouse_[body_color]" - src << "\blue You are now [resting ? "resting" : "getting up"]" - canmove = !resting + /* @@ -251,16 +233,19 @@ /mob/living/simple_animal/mouse/white body_color = "white" icon_state = "mouse_white" + icon_rest = "mouse_white_sleep" holder_type = /obj/item/weapon/holder/mouse/white /mob/living/simple_animal/mouse/gray body_color = "gray" icon_state = "mouse_gray" + icon_rest = "mouse_gray_sleep" holder_type = /obj/item/weapon/holder/mouse/gray /mob/living/simple_animal/mouse/brown body_color = "brown" icon_state = "mouse_brown" + icon_rest = "mouse_brown_sleep" holder_type = /obj/item/weapon/holder/mouse/brown //TOM IS ALIVE! SQUEEEEEEEE~K :) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 33178935f43..092b9e01f59 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -96,6 +96,10 @@ var/kitchen_tag = "animal" //Used for cooking with animals + //Napping + var/can_nap = 0 + var/icon_rest = null + /mob/living/simple_animal/proc/beg(var/atom/thing, var/atom/holder) visible_emote("gazes longingly at [holder]'s [thing]") @@ -115,6 +119,9 @@ reagents = new/datum/reagents(20, src) nutrition = max_nutrition + if (can_nap) + verbs += /mob/living/simple_animal/lay_down + /mob/living/simple_animal/Move(NewLoc, direct) . = ..() if(.) @@ -142,6 +149,8 @@ user << "It looks hungry." else if ((reagents.total_volume > 0 && nutrition > max_nutrition *0.75) || nutrition > max_nutrition *0.9) user << "It looks full and contented." + if (stat == DEAD) + user << "It looks dead." if (health < maxHealth * 0.5) user << "It looks badly wounded." else if (health < maxHealth) @@ -169,51 +178,58 @@ handle_foodscanning() //Movement turns_since_move++ - if(!client && !stop_automated_movement && wander && !anchored) - if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. + if (!client) + if(!stop_automated_movement && wander && !anchored) + if(isturf(src.loc) && !resting && !buckled && canmove) //This is so it only moves if it's not inside a closet, gentics machine, etc. - if(turns_since_move >= turns_per_move) - if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled - var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND - moving_to = pick(cardinal) - dir = moving_to //How about we turn them the direction they are moving, yay. - Move(get_step(src,moving_to)) - turns_since_move = 0 + if(turns_since_move >= turns_per_move) + if(!(stop_automated_movement_when_pulled && pulledby)) //Soma animals don't move when pulled + var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND + moving_to = pick(cardinal) + dir = moving_to //How about we turn them the direction they are moving, yay. + Move(get_step(src,moving_to)) + turns_since_move = 0 - //Speaking - if(!client && speak_chance) - if(rand(0,200) < speak_chance) - if(speak && speak.len) - if((emote_hear && emote_hear.len) || (emote_see && emote_see.len)) - var/length = speak.len - if(emote_hear && emote_hear.len) - length += emote_hear.len - if(emote_see && emote_see.len) - length += emote_see.len - var/randomValue = rand(1,length) - if(randomValue <= speak.len) - say(pick(speak)) + //Speaking + if(speak_chance) + if(rand(0,200) < speak_chance) + if(speak && speak.len) + if((emote_hear && emote_hear.len) || (emote_see && emote_see.len)) + var/length = speak.len + if(emote_hear && emote_hear.len) + length += emote_hear.len + if(emote_see && emote_see.len) + length += emote_see.len + var/randomValue = rand(1,length) + if(randomValue <= speak.len) + say(pick(speak)) + else + randomValue -= speak.len + if(emote_see && randomValue <= emote_see.len) + visible_emote("[pick(emote_see)].") + else + audible_emote("[pick(emote_hear)].") else - randomValue -= speak.len - if(emote_see && randomValue <= emote_see.len) + say(pick(speak)) + else + if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) + visible_emote("[pick(emote_see)].") + if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) + audible_emote("[pick(emote_hear)].") + if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) + var/length = emote_hear.len + emote_see.len + var/pick = rand(1,length) + if(pick <= emote_see.len) visible_emote("[pick(emote_see)].") else audible_emote("[pick(emote_hear)].") - else - say(pick(speak)) - else - if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - visible_emote("[pick(emote_see)].") - if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) - audible_emote("[pick(emote_hear)].") - if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - var/length = emote_hear.len + emote_see.len - var/pick = rand(1,length) - if(pick <= emote_see.len) - visible_emote("[pick(emote_see)].") - else - audible_emote("[pick(emote_hear)].") - speak_audio() + speak_audio() + + if (can_nap) + if (!resting && prob(1)) + fall_asleep() + else if (resting && prob(0.5)) + wake_up() //Atmos @@ -346,16 +362,17 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) /mob/living/simple_animal/attack_hand(mob/living/carbon/human/M as mob) ..() - switch(M.a_intent) if(I_HELP) if (health > 0) M.visible_message("\blue [M] [response_help] \the [src]") + poke() if(I_DISARM) M.visible_message("\blue [M] [response_disarm] \the [src]") M.do_attack_animation(src) + poke(1) //TODO: Push the mob away or something if(I_GRAB) @@ -377,17 +394,20 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) M.visible_message("\red [M] has grabbed [src] passively!") M.do_attack_animation(src) + poke(1) if(I_HURT) apply_damage(harm_intent_damage, BRUTE, used_weapon = "Attack by [M.name]") M.visible_message("\red [M] [response_harm] \the [src]") M.do_attack_animation(src) + poke(1) return /mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user) if(istype(O, /obj/item/weapon/reagent_containers) || istype(O, /obj/item/stack/medical) || istype(O,/obj/item/weapon/gripper/)) ..() + poke() else if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead. if(istype(O, /obj/item/weapon/material/knife) || istype(O, /obj/item/weapon/material/kitchen/utensil/knife )) @@ -400,6 +420,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(!O.force) visible_message("[user] gently taps [src] with \the [O].") + poke() return 0 if(O.force > resistance) @@ -411,8 +432,10 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) purge = 3 apply_damage(damage, O.damtype, used_weapon = "[O.name]") + poke(1) else usr << "This weapon is ineffective, it does no damage." + poke() visible_message("\The [src] has been attacked with the [O] by [user].") user.do_attack_animation(src) @@ -437,6 +460,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) if(statpanel("Status") && show_stat_health) stat(null, "Health: [round((health / maxHealth) * 100)]%") + stat(null, "Nutrition: [nutrition]/[max_nutrition]%") /mob/living/simple_animal/updatehealth() ..() @@ -583,7 +607,7 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) UnarmedAttack(movement_target) if (get_turf(movement_target) == src.loc) set_dir(pick(1,2,4,8,1,1))//Face a random direction when eating, but mostly upwards - else if(ishuman(movement_target.loc) && Adjacent(src, get_turf(movement_target)) && prob(15)) + else if(ishuman(movement_target.loc) && Adjacent(src, get_turf(movement_target)) && prob(10)) beg(movement_target, movement_target.loc) else scan_interval = max(min_scan_interval, min(scan_interval+1, max_scan_interval))//If nothing is happening, ian's scanning frequency slows down to save processing @@ -609,3 +633,55 @@ mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) return /mob/living/simple_animal/ExtinguishMob() return + + + +//I wanted to call this proc alert but it already exists. +//Basically makes the mob pay attention to the world, resets sleep timers, awakens it from a sleeping state sometimes +/mob/living/simple_animal/proc/poke(var/force_wake = 0) + if (stat != DEAD) + scan_interval = min_scan_interval + if (force_wake || (!client && prob(30))) + wake_up() + +//Puts the mob to sleep +/mob/living/simple_animal/proc/fall_asleep() + if (stat != DEAD) + resting = 1 + stat = UNCONSCIOUS + canmove = 0 + wander = 0 + walk_to(src,0) + movement_target = null + foodtarget = 0 + update_icons() + +//Wakes the mob up from sleeping +/mob/living/simple_animal/proc/wake_up() + if (stat != DEAD) + stat = CONSCIOUS + resting = 0 + canmove = 1 + wander = 1 + update_icons() + +/mob/living/simple_animal/update_icons() + if (stat == DEAD) + icon_state = icon_dead + else if ((stat == UNCONSCIOUS || resting) && icon_rest) + icon_state = icon_rest + else if (icon_living) + icon_state = icon_living + +/mob/living/simple_animal/lay_down() + set name = "Rest" + set category = "Abilities" + + if (resting) + wake_up() + else + fall_asleep() + + src << span("notice","You are now [resting ? "resting" : "getting up"]") + + update_icons() diff --git a/code/modules/spells/monster_manual.dm b/code/modules/spells/monster_manual.dm index 9d21d6c3fd6..59c53d1d6b1 100644 --- a/code/modules/spells/monster_manual.dm +++ b/code/modules/spells/monster_manual.dm @@ -9,17 +9,17 @@ var/uses = 1 var/temp = null var/list/monster = list(/mob/living/simple_animal/familiar/pet/cat, - /mob/living/simple_animal/familiar/pet/mouse, + /mob/living/simple_animal/mouse/familiar, /mob/living/simple_animal/familiar/carcinus, /mob/living/simple_animal/familiar/horror, /mob/living/simple_animal/familiar/goat, /mob/living/simple_animal/familiar/pike ) var/list/monster_info = list( "It is well known that the blackest of cats make good familiars.", - "Mice are full of mischief and magic. A simple animal, yes, but one of the wizard's finest.", + "Mice are small but fragile creatures. This one is gifted with unending life, and the ability to renew others.", "A mortal decendant of the original Carcinus, it is said their shells are near impenetrable and their claws as sharp as knives.", "A creature from other plane, its very own presence is enough to shatter the sanity of men.", - "A magical goat known for its healing powers and nearly-pacifist ways.", + "A stubborn and mischievous creature, this goat delights in stirring trouble.", "The more carnivorous and knowledge hungry cousin of the space carp. Keep away from books." ) diff --git a/html/changelogs/Nanako-Sleepmice.yml b/html/changelogs/Nanako-Sleepmice.yml new file mode 100644 index 00000000000..fa6d8a60ad9 --- /dev/null +++ b/html/changelogs/Nanako-Sleepmice.yml @@ -0,0 +1,38 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Nanako + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "Fixed mice never waking up when they went to sleep, and being able to move towards food while sleeping. Also sleeping animals now wake up when interacted with." + - rscadd: "Cats will now take naps." + - tweak: "Mice now alter their pixel offset as they move around." From 2a0353d8f9986cd0a7821ffa9ccc98ab7afa17b7 Mon Sep 17 00:00:00 2001 From: Lohikar Date: Sun, 19 Mar 2017 04:39:23 -0500 Subject: [PATCH 42/55] Progress bar pref (#1938) changes: Players can now toggle progress bars on/off in Preferences. This just adds another flag to the parallax toggles pref to keep things simple. --- code/__defines/misc.dm | 3 ++- code/_helpers/unsorted.dm | 8 ++++---- .../client/preference_setup/global/02_settings.dm | 1 + code/modules/client/preferences.dm | 2 +- code/modules/client/preferences_toggles.dm | 12 ++++++++++++ 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index eaf542868ea..075bdd366fa 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -49,7 +49,8 @@ #define CHAT_NOICONS 0x8000 #define PARALLAX_SPACE 0x1 -#define PARALLAX_DUST 0x2 +#define PARALLAX_DUST 0x2 +#define PROGRESS_BARS 0x4 #define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index d928ce9ab13..6d16d53bfdb 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -654,14 +654,14 @@ proc/GaussRandRound(var/sigma,var/roundto) var/holding = user.get_active_hand() var/delayfraction = round(delay/numticks) var/image/progbar - if(user && user.client && display_progress) + if(user && user.client && (user.client.prefs.parallax_togs & PROGRESS_BARS) && display_progress) if(!progbar) progbar = image(icon = 'icons/effects/doafter_icon.dmi', loc = target, icon_state = "prog_bar_0") progbar.layer = 21 progbar.pixel_z = WORLD_ICON_SIZE progbar.appearance_flags = RESET_TRANSFORM for (var/i = 1 to numticks) - if(user && user.client && progbar && display_progress) + if(user && user.client && (user.client.prefs.parallax_togs & PROGRESS_BARS) && progbar && display_progress) progbar.icon_state = "prog_bar_[round(((i / numticks) * 100), 10)]" user.client.images |= progbar sleep(delayfraction) @@ -706,14 +706,14 @@ proc/GaussRandRound(var/sigma,var/roundto) Location = user.loc var/holding = user.get_active_hand() var/image/progbar - if(user && user.client && act_target && display_progress) + if(user && user.client && (user.client.prefs.parallax_togs & PROGRESS_BARS) && act_target && display_progress) if(!progbar) progbar = image(icon = 'icons/effects/doafter_icon.dmi', loc = act_target, icon_state = "prog_bar_0") progbar.pixel_z = WORLD_ICON_SIZE progbar.layer = 21 progbar.appearance_flags = RESET_COLOR | RESET_TRANSFORM for (var/i = 1 to numticks) - if(user && user.client && act_target && display_progress) + if(user && user.client && (user.client.prefs.parallax_togs & PROGRESS_BARS) && act_target && display_progress) if(!progbar) progbar = image(icon = 'icons/effects/doafter_icon.dmi', loc = act_target, icon_state = "prog_bar_0") progbar.pixel_z = WORLD_ICON_SIZE diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index 04a82b4336f..01e5b3a8665 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -63,6 +63,7 @@ . += "Ghost radio: [(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" . += "Space Parallax: [(pref.parallax_togs & PARALLAX_SPACE) ? "Yes" : "No"]
" . += "Space Dust: [(pref.parallax_togs & PARALLAX_DUST) ? "Yes" : "No"]
" + . += "Progress Bars: [(pref.parallax_togs & PROGRESS_BARS) ? "Yes" : "No"]
" /datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) if(href_list["toggle"]) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 045f2f9398c..349ba8bcc24 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -127,7 +127,7 @@ datum/preferences // SPAAAACE var/parallax_speed = 2 - var/parallax_togs = PARALLAX_SPACE + var/parallax_togs = PARALLAX_SPACE | PROGRESS_BARS var/list/pai = list() // A list for holding pAI related data. diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index 180fd7c6914..1ca3dbd2201 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -189,3 +189,15 @@ if (mob.hud_used) mob.hud_used.update_parallax() + +/client/verb/toggle_progress() + set name = "Show/Hide Progress Bars" + set category = "Preferences" + set desc = "Toggles progress bars on slow actions." + + prefs.parallax_togs ^= PROGRESS_BARS + prefs.save_preferences() + if (prefs.parallax_togs & PROGRESS_BARS) + src << "You will now see progress bars on delayed actions." + else + src << "You will no longer see progress bars on delayed actions." From 9c78f5b4c6486ea0c564948ab3a66e3e6b31e7cb Mon Sep 17 00:00:00 2001 From: skull132 Date: Sun, 19 Mar 2017 21:07:29 +0200 Subject: [PATCH 43/55] Swap memos to be Discord pins instead (#1382) Intent: If using a Discord bot, make it so that the game is able to pull and process pinned messages in specific discord channels as memos. --- ByondPOST.dll | Bin 15872 -> 17408 bytes code/controllers/configuration.dm | 6 + code/datums/discord_bot.dm | 383 ++++++++++++++++++--- code/datums/server_greeting.dm | 126 ++++++- code/game/gamemodes/game_mode.dm | 4 +- code/modules/http/post_request.dm | 55 ++- config/example/discord.txt | 3 + html/changelogs/skull132-discord.yml | 7 + html/templates/welcome_screen.html | 8 +- interface/interface.dm | 19 +- interface/skin.dmf | 490 ++++++++++++++------------- lib/ByondPostDLL/ByondPostDLL.cpp | 74 +++- 12 files changed, 862 insertions(+), 313 deletions(-) create mode 100644 html/changelogs/skull132-discord.yml diff --git a/ByondPOST.dll b/ByondPOST.dll index 93dff79d7f6b0b9f14f8e9505ef45539988f4669..f94ea657653e71227c92546c3133455373a95961 100644 GIT binary patch literal 17408 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 HPkjCp^T*mR literal 15872 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 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 0e110beaa9d..8cfb79a34ab 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -187,6 +187,7 @@ var/list/gamemode_cache = list() var/use_discord_bot = 0 var/discord_bot_host = "localhost" var/discord_bot_port = 0 + var/use_discord_pins = 0 var/python_path = "python" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. var/use_overmap = 0 @@ -652,6 +653,9 @@ var/list/gamemode_cache = list() if("discord_bot_port") config.discord_bot_port = value + if("use_discord_pins") + config.use_discord_pins = 1 + if("python_path") if(value) config.python_path = value @@ -878,6 +882,8 @@ var/list/gamemode_cache = list() discord_bot.active = 1 if ("robust_debug") discord_bot.robust_debug = 1 + if ("subscriber") + discord_bot.subscriber_role = value else log_misc("Unknown setting in discord configuration: '[name]'") diff --git a/code/datums/discord_bot.dm b/code/datums/discord_bot.dm index 1238e3e93e4..1f74fee83b6 100644 --- a/code/datums/discord_bot.dm +++ b/code/datums/discord_bot.dm @@ -1,6 +1,13 @@ #define CHAN_ADMIN "channel_admin" #define CHAN_CCIAA "channel_cciaa" #define CHAN_ANNOUNCE "channel_announce" +#define CHAN_INVITE "channel_invite" + +#define SEND_OK 0 +#define SEND_TIMEOUT 1 +#define ERROR_PROC 2 +#define ERROR_CURL 3 +#define ERROR_HTTP 4 var/datum/discord_bot/discord_bot = null @@ -15,21 +22,34 @@ var/datum/discord_bot/discord_bot = null discord_bot.update_channels() + if (config.use_discord_pins && server_greeting) + server_greeting.update_pins() + return 1 /datum/discord_bot - var/list/channels = list() + var/list/channels_to_group = list() // Group flag -> list of channel datums map. + var/list/channels = list() // Channel ID -> channel datum map. Will ensure that only one datum per channel ID exists. + + var/datum/discord_channel/invite = null // The channel datum where the ingame Join Channel button will link to. var/active = 0 var/auth_token = "" + var/subscriber_role = "" var/robust_debug = 0 // Lazy man's rate limiting vars - var/rate_limited_since = 0 - var/queue_being_pushed = 0 + var/datum/scheduled_task/push_task var/list/queue = list() +/* + * Proc update_channels + * Used to load channels from the database and construct them with the discord API. + * Wipes all current channels and channel maps. + * + * @return num - Error code. 0 upon success. + */ /datum/discord_bot/proc/update_channels() if (!active) return 1 @@ -38,27 +58,56 @@ var/datum/discord_bot/discord_bot = null log_debug("BOREALIS: Failed to update channels due to missing database.") return 2 - channels = list() + // Reset the channel lists. + channels_to_group.Cut() + channels.Cut() - var/DBQuery/channel_query = dbcon.NewQuery("SELECT channel_group, channel_id FROM discord_channels") + var/DBQuery/channel_query = dbcon.NewQuery("SELECT channel_group, channel_id, pin_flag, server_id FROM discord_channels") channel_query.Execute() - var/list/A while (channel_query.NextRow()) - if (isnull(channels[channel_query.item[1]])) - channels[channel_query.item[1]] = list() + // Create the channel map. + if (isnull(channels_to_group[channel_query.item[1]])) + channels_to_group[channel_query.item[1]] = list() - A = channels[channel_query.item[1]] - A += channel_query.item[2] + var/datum/discord_channel/B = channels[channel_query.item[2]] + + // We don't have this channel datum yet. + if (isnull(B)) + B = new(channel_query.item[2], channel_query.item[4], text2num(channel_query.item[3])) + + if (!B) + log_debug("BOREALIS: Bad channel data during update channels. [jointext(channel_query.item, ", ")].") + continue + + channels[channel_query.item[2]] = B + + if (text2num(channel_query.item[3])) + B.pin_flag |= text2num(channel_query.item[3]) + + // Add the channel to the required lists. + channels_to_group[channel_query.item[1]] += B + + if (!isnull(channels_to_group[CHAN_INVITE])) + invite = channels_to_group[CHAN_INVITE][1] + else if (robust_debug) + log_debug("BOREALIS: No invite channel designated.") log_debug("BOREALIS: Channels updated successfully.") return 0 +/* + * Proc send_message + * Used to send a message to a specific channel group. + * + * @param text channel_group - The name of the channel group which to target. + * @param text message - The message to send. + */ /datum/discord_bot/proc/send_message(var/channel_group, var/message) if (!active || !auth_token) return - if (!channel_group || !channels.len || isnull(channels[channel_group])) + if (!channel_group || !channels.len || isnull(channels_to_group[channel_group])) return if (!message) @@ -70,18 +119,18 @@ var/datum/discord_bot/discord_bot = null // Let's run it through the proper JSON encoder, just in case of special characters. message = json_encode(list("content" = message)) - var/list/A = channels[channel_group] + var/list/A = channels_to_group[channel_group] var/list/sent = list() - for (var/channel in A) - if (send_post_request("https://discordapp.com/api/channels/[channel]/messages", message, "Authorization: Bot [auth_token]", "Content-Type: application/json") == 429) + for (var/B in A) + var/datum/discord_channel/channel = B + if (channel.send_message_to(auth_token, message) == SEND_TIMEOUT) // Whoopsies, rate limited. // Set up the queue. - rate_limited_since = world.time - queue.Add(list(message, A - sent)) + queue.Add(list(list(message, A - sent))) // Schedule a push. - spawn (100) - push_queue() + if (!push_task) + push_task = schedule_task_with_source_in(10 SECONDS, src, /datum/discord_bot/proc/push_queue) // And exit. return @@ -89,43 +138,87 @@ var/datum/discord_bot/discord_bot = null sent += channel if (robust_debug) - log_debug("BOEALIS: Message sent to [channel_group]. JSON body: '[message]'") + log_debug("BOREALIS: Message sent to [channel_group]. JSON body: '[message]'") +/* + * Proc retreive_pins + * Used to fetch a list of all pins from the designated channels. + * + * @return list - A multilayered list of flags associated with pins. Structure looks like this: + * list("pin_flag" = list(list("author" = author name, "content" = content), + * list("author" = author name, "content" = content))) + */ +/datum/discord_bot/proc/retreive_pins() + if (!active || !auth_token) + return list() + + if (!channels.len || isnull(channels_to_group["channel_pins"])) + testing("No group.") + return list() + + var/list/output = list() + + for (var/A in channels_to_group["channel_pins"]) + var/datum/discord_channel/channel = A + if (isnull(output["[channel.pin_flag]"])) + output["[channel.pin_flag]"] = list() + + output["[channel.pin_flag]"] += channel.get_pins(auth_token) + + return output + +/* + * Proc retreive_invite + * Used to retreive the invite to the invite channel. + * One will be created if none exist. + * + * @return text - The invite URL to the designated invite channel. + */ +/datum/discord_bot/proc/retreive_invite() + if (!active || !auth_token) + return "" + + if (!invite) + return "" + + var/res = invite.get_invite(auth_token) + return isnum(res) ? "" : res + +/* + * Proc send_to_admin + * Forwards a message to the admin channels. + */ /datum/discord_bot/proc/send_to_admins(message) send_message(CHAN_ADMIN, message) +/* + * Proc send_to_cciaa + * Forwards a message to the CCIAA channels. + */ /datum/discord_bot/proc/send_to_cciaa(message) send_message(CHAN_CCIAA, message) -/datum/discord_bot/proc/send_to_announce(message) +/* + * Proc send_to_announce + * Forwards a message to the announcements channels. + */ +/datum/discord_bot/proc/send_to_announce(message, prepend_role = 0) + if (prepend_role && subscriber_role) + message = "<@&[subscriber_role]> " + message send_message(CHAN_ANNOUNCE, message) +/* + * Proc push_queue + * Handles the queue pushing for the bot. If there is no need to reschedule (all messages get successfully + * pushed), then it deletes push_task and sets it back to null. Otherwise, it simply reschedules it. + */ /datum/discord_bot/proc/push_queue() // What facking queue. - if (!queue.len) + if (!queue || !queue.len) if (robust_debug) log_debug("BOREALIS: Attempted to push a null length queue.") - if (queue_being_pushed) - queue_being_pushed = 0 return - if (queue_being_pushed) - if (robust_debug) - log_debug("BOREALIS: Attempted to initialize a second queue driver.") - return - - if ((world.time - rate_limited_since) < 100) - // Something broke the limit again. Ideally, this wouldn't happen. But sure. - // Use a longer timeout, just in case. - spawn (200) - push_queue() - - queue_being_pushed = 0 - return - - // Async process lock var. No touchy. - queue_being_pushed = 1 - // A[1] - message body. // A[2] - list of channels to send to. var/message @@ -134,22 +227,216 @@ var/datum/discord_bot/discord_bot = null message = A[1] destinations = A[2] - for (var/channel in destinations) - if (send_post_request("https://discordapp.com/api/channels/[channel]/messages", message, "Authorization: Bot [auth_token]", "Content-Type: application/json") == 429) - // Limited again. Reschedule. - rate_limited_since = world.time - spawn (100) - push_queue() + for (var/B in destinations) + var/datum/discord_channel/channel = B + if (channel.send_message_to(auth_token, message) == SEND_TIMEOUT) + // Tasks nuke themselves after use. So just make a new one! What could possibly go wrong! + push_task = schedule_task_with_source_in(10 SECONDS, src, /datum/discord_bot/proc/push_queue) - queue_being_pushed = 0 return else destinations.Remove(channel) queue.Remove(A) - queue_being_pushed = 0 +// A holder class for channels. +/datum/discord_channel + var/id = "" + var/server_id = "" + var/pin_flag = 0 + var/invite_url = "" + +/* + * Constructor + * + * @param text _id - the discord API id of the channel, as a string. + * @param text _sid - the discord API server id for the channel, as a string. + * @param num _pin - the bitflags of admin permissions which have access to the pins from this channel. + */ +/datum/discord_channel/New(var/_id, var/_sid, var/_pin) + id = _id + server_id = _sid + + if (_pin) + pin_flag = _pin + +/* + * Proc send_message_to + * Sends a message to the channel. + * + * @param text token - the authorization token to be used for the requests. + * @param text message - the sanitized message content to be sent. + * @return num - a specific return code for the discord_bot to handle. + */ +/datum/discord_channel/proc/send_message_to(var/token, var/message) + if (!token || !message) + return ERROR_PROC + + var/res = send_post_request("https://discordapp.com/api/channels/[id]/messages", message, "Authorization: Bot [token]", "Content-Type: application/json") + + switch (res) + if (-1) + return ERROR_PROC + + if (200) + return SEND_OK + + if (429) + return SEND_TIMEOUT + + if (0 to 90) + log_debug("BOREALIS: cURL error while forwarding message to Discord API: [res]. Message body: [message].") + return ERROR_CURL + + else + log_debug("BOREALIS: HTTP error while forwarding message to Discord API: [res]. Channel: [id]. Message body: [message].") + return ERROR_HTTP + +/* + * Proc get_pins + * Retreives a list of pinned messages from the channel. + * + * @param text token - the authorization token to be used for the requests. + * @return mixed - 2d array of content upon success, in format: list(list("author" = text, "content" = text)). + * Num upon failure. + */ +/datum/discord_channel/proc/get_pins(var/token) + var/res = send_get_request("https://discordapp.com/api/channels/[id]/pins", "Authorization: Bot [token]") + + // Is a number, so an error code. + if (isnum(res)) + switch (res) + if (-1) + return ERROR_PROC + + if (0 to 90) + log_debug("BOREALIS: cURL error while fetching pins from the Discord API: [res].") + return ERROR_CURL + + if (100 to 600) + log_debug("BOREALIS: HTTP error while fetching pins from the Discord API: [res].") + return ERROR_HTTP + + else + log_debug("BOREALIS: Unknown response code while fetching pins from the Discord API: [res].") + return ERROR_PROC + else + var/list/A = res + var/list/pinned_messages = list() + + // Begin processing the list structure delivered back to us from send_get_request. + for (var/list/B in A) + var/content = B["content"] + + // We have mentions to take care of. + if (!isnull(B["mentions"])) + var/list/mentions = B["mentions"] + + for (var/list/C in mentions) + content = replacetextEx(content, "<@[C["id"]]>", C["username"]) + + // Role mentions are up next. + if (!isnull(B["mention_roles"])) + var/list/mentions = B["mention_roles"] + + for (var/C in mentions) + content = replacetextEx(content, "<@&[C]>", "@SomeRole") + + pinned_messages += list(list("author" = B["author"]["username"], "content" = content)) + + return pinned_messages + +/* + * Proc get_invite + * Retreives (or creates if none found) an invite URL to the specific channel. + * + * @param text token - the authorization token to be used for the requests. + * @return mixed - text upon success, the link to the invite; num upon failure. + */ +/datum/discord_channel/proc/get_invite(var/token) + if (invite_url) + return invite_url + + var/res = send_get_request("https://discordapp.com/api/channels/[id]/invites", "Authorization: Bot [token]") + + // Is a number, so an error code. + if (isnum(res)) + switch (res) + if (-1) + return ERROR_PROC + + if (0 to 90) + log_debug("BOREALIS: cURL error while fetching pins from the Discord API: [res].") + return ERROR_CURL + + if (100 to 600) + log_debug("BOREALIS: HTTP error while fetching pins from the Discord API: [res].") + return ERROR_HTTP + + else + log_debug("BOREALIS: Unknown response code while fetching pins from the Discord API: [res].") + return ERROR_PROC + else + var/list/A = res + + // No length to return data, but a valid 200 return header. + // So we simply have no invites active. Make one! + if (!A || !A.len) + return create_invite(token) + + var/best_age = A[1]["max_age"] + var/code = A[1]["code"] + + // Find the best invite. + // Why? Because round time expires are lame, I guess. + if (best_age != 0) + for (var/i = 2, i < A.len, i++) + if (A[i]["max_age"] == 0) + code = A[i]["code"] + break + + if (best_age < A[i]["max_age"]) + best_age = A[i]["max_age"] + code = A[i]["code"] + + // Sanity check for debug I guess. + if (!code) + log_debug("BOREALIS: Retreived an empty invite. This should not happen. Response object: [json_encode(A)]") + + // Save the URL for later retreival. + invite_url = "https://discord.gg/[code]" + return invite_url + +/* + * Proc create_invite + * Creates a permanent invite to a channel and returns it, under the assumption that + * there are no other invites for this channel. + * + * @param text token - the authorization token to be used for the requests. + * @return mixed - String upon success - the URL of the newly generated invite. + * Num upon failure. + */ +/datum/discord_channel/proc/create_invite(var/token) + var/data = list("max_age" = 0, "max_uses" = 0) + var/res = send_post_request("https://discordapp.com/api/channels/[id]/invites", json_encode(data), "Authorization: Bot [token]", "Content-Type: application/json") + + if (res == 200) + var/list/get_req = send_get_request("https://discordapp.com/api/channels/[id]/invites", "Authorization: Bot [token]") + + if (!istype(get_req) || !get_req.len) + return ERROR_PROC + + // The first index should now exist. So we just use that! + invite_url = "https://discord.gg/[get_req[1]["code"]]" + return invite_url #undef CHAN_ADMIN #undef CHAN_CCIAA #undef CHAN_ANNOUNCE +#undef CHAN_INVITE + +#undef SEND_OK +#undef SEND_TIMEOUT +#undef ERROR_PROC +#undef ERROR_CURL +#undef ERROR_HTTP diff --git a/code/datums/server_greeting.dm b/code/datums/server_greeting.dm index be8bfcee59f..5b7868b07b6 100644 --- a/code/datums/server_greeting.dm +++ b/code/datums/server_greeting.dm @@ -46,8 +46,9 @@ if (F["motd"]) F["motd"] >> motd - if (F["memo"]) - F["memo"] >> memo_list + if (!config.use_discord_pins) + if (F["memo"]) + F["memo"] >> memo_list update_data() @@ -63,18 +64,32 @@ motd = initial(motd) motd_hash = "" - if (memo_list.len) - memo = "" - for (var/ckey in memo_list) - var/data = {"

[ckey] wrote on [memo_list[ckey]["date"]]:
- [memo_list[ckey]["content"]]

"} + if (!config.use_discord_pins) + // The initialization of memos in case use_discord_pins == 1 is done in discord_bot.dm + // Primary reason is to avoid null references when the bot isn't created yet. + if (memo_list.len) + memo = "" + for (var/ckey in memo_list) + var/data = {"

[ckey] wrote on [memo_list[ckey]["date"]]:
+ [memo_list[ckey]["content"]]

"} - memo += data + memo += data - memo_hash = md5(memo) - else - memo = initial(memo) - memo_hash = "" + memo_hash = md5(memo) + else + memo = initial(memo) + memo_hash = "" + +/datum/server_greeting/proc/update_pins() + var/list/temp_list = discord_bot.retreive_pins() + + // A is a number in a string form + // temp_list[A] is a list of lists. + for (var/A in temp_list) + var/list/memos = temp_list[A] + var/flag = text2num(A) + + memo_list += new /datum/memo_datum(memos, flag) /* * Helper to update the MoTD or memo contents. @@ -94,9 +109,15 @@ motd = new_value if ("memo_write") + if (config.use_discord_pins) + return 0 + memo_list[new_value[1]] = list("date" = time2text(world.realtime, "DD-MMM-YYYY"), "content" = new_value[2]) if ("memo_delete") + if (config.use_discord_pins) + return 0 + if (memo_list[new_value]) memo_list -= new_value else @@ -132,7 +153,7 @@ if (motd_hash && user.prefs.motd_hash != motd_hash) outdated_info |= OUTDATED_MOTD - if (user.holder && memo_hash && user.prefs.memo_hash != memo_hash) + if (user.holder && user.prefs.memo_hash != get_memo_hash(user)) outdated_info |= OUTDATED_MEMO if (user.prefs.notifications.len) @@ -185,13 +206,13 @@ else if (outdated_info & OUTDATED_MEMO) data["update"] = 1 - data["changeHash"] = memo_hash + data["changeHash"] = get_memo_hash(user) else data["update"] = 0 data["changeHash"] = null data["div"] = "#memo" - data["content"] = memo + data["content"] = get_memo_content(user) user << output(JS_SANITIZE(data), "greeting.browser:AddContent") if (outdated_info & OUTDATED_MOTD) @@ -216,6 +237,81 @@ if ("request_data") send_to_javascript(C) +/* + * Gets the appropriate memo hash for the memo system in use. + * Args: + * - var/C client + * Returns: + * - string + */ +/datum/server_greeting/proc/get_memo_hash(var/client/C) + if (!C || !C.holder) + return "" + + if (!config.use_discord_pins) + return memo_hash + + var/joint_checksum = "" + for (var/A in memo_list) + var/datum/memo_datum/memo = A + if (C.holder.rights & memo.flag) + joint_checksum += memo.hash + + return md5(joint_checksum) + +/* + * Gets the appropriate memo content for the memo system in use. + * Args: + * - var/C client + * Returns: + * - string if old memo system is used (config.use_discord_pins = 0) + * - list of strings if new memo system is used + */ +/datum/server_greeting/proc/get_memo_content(var/client/C) + if (!C || !C.holder) + return "" + + if (!config.use_discord_pins) + return memo + + var/list/content = list() + for (var/A in memo_list) + var/datum/memo_datum/memo = A + if (C.holder.rights & memo.flag) + content += memo.contents + + return content + +/datum/memo_datum + var/contents + var/hash + var/flag + +/datum/memo_datum/New(var/list/input = list(), var/_flag) + flag = _flag + + // Yes. This is an unfortunately acceptable way of doing it. + // Why? Because you cannot use numbers as indexes in an assoc list without fucking DM. + var/static/list/flags_to_divs = list("[R_ADMIN]" = "danger", + "[R_MOD]" = "warning", + "[(R_MOD|R_ADMIN)]" = "warning", + "[R_CCIAA]" = "info", + "[R_DEV]" = "info") + + if (input.len) + contents = "
" + for (var/i = 1, i <= input.len, i++) + contents += "[input[i]["author"]] wrote:
[nl2br(input[i]["content"])]" + + if (i < input.len) + contents += "
" + + contents += "
" + else + contents = "" + + hash = md5(contents) + #undef OUTDATED_NOTE #undef OUTDATED_MEMO #undef OUTDATED_MOTD diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 71de8a75d2e..c093642416d 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -283,7 +283,7 @@ var/global/list/additional_antag_types = list() /datum/game_mode/proc/declare_completion() var/is_antag_mode = (antag_templates && antag_templates.len) - var/discord_text = "@subscribers A round of **[name]** has ended! \[Game ID: [game_id]\]\n\n" + var/discord_text = "A round of **[name]** has ended! \[Game ID: [game_id]\]\n\n" check_victory() if(is_antag_mode) sleep(10) @@ -298,7 +298,7 @@ var/global/list/additional_antag_types = list() sleep(10) print_ownerless_uplinks() - discord_bot.send_to_announce(discord_text) + discord_bot.send_to_announce(discord_text, 1) discord_text = "" var/clients = 0 diff --git a/code/modules/http/post_request.dm b/code/modules/http/post_request.dm index ffc04a1d872..e7de7a6affe 100644 --- a/code/modules/http/post_request.dm +++ b/code/modules/http/post_request.dm @@ -58,7 +58,7 @@ var/result = call("ByondPOST.dll", "send_post_request")(arglist(args)) if (!result) - log_debug("ByondPOST: No result returned from external library.") + log_debug("ByondPOST POST: No result returned from external library.") return -1 var/list/A = params2list(result) @@ -67,14 +67,61 @@ // Log the proc error. It should be reviewed by coders ASAP. switch (A["proc"]) if ("1") - log_debug("ByondPOST: Proc error: Too few arguments sent to function.") + log_debug("ByondPOST POST: Proc error: Too few arguments sent to function.") if ("2") - log_debug("ByondPOST: Proc error: Unable to initialize curl object.") + log_debug("ByondPOST POST: Proc error: Unable to initialize curl object.") else - log_debug("ByondPOST: Proc error: Unknown error.") + log_debug("ByondPOST POST: Proc error: Unknown error.") return -1 // Curl oriented errors should leave the HTTP response code at 0, as no request was executed. // All HTTP oriented errors will definately return a response code other than 0, so prioritize that. // Fallback is a curl error code (0 - 92). return text2num(A["http"]) != 0 ? text2num(A["http"]) : text2num(A["curl"]) + +/* + * A generic proc for sending a header equipped get requests with the aforementioned .DLL files. + * If you're using this without sending custom headers, please stop. Use world.Export() instead. + * Expected arg structure: + * 1st arg - the url + * 2nd - nth arg - individual headers and their values in format: "headername: value" + * + * @return mixed - Returns list if request was successful, integer (specific cURL or HTTP error) if failed. + * -1 indicates proc or library failure. + * 0 - 92 are curl errors, and are usually accompanied by a HTTP response code of 0 (request was never made). + * 100 - 6xx are HTTP response codes. Curl error code should be 0 in this case, but, in case that it is not, + * the HTTP response code is always returned as long as it is not 0. + * + */ +/proc/send_get_request() + if (args.len < 2) + return -1 + + var/result = call("ByondPOST.dll", "send_get_request")(arglist(args)) + + if (!result) + log_debug("ByondPOST GET: No result returned from external library.") + return -1 + + var/list/A + + // Try to evaluate it as JSON data (successful request) + try + A = json_decode(result) + + return A + catch() + // Nope, we failed. do regular error parsing instead. + A = params2list(result) + + if (!isnull(A["proc"])) + switch (A["proc"]) + if ("1") + log_debug("ByondPOST GET: Proc error: Too few arguments sent to function.") + if ("2") + log_debug("ByondPOST GET: Proc error: Unable to initialize curl object.") + else + log_debug("ByondPOST GET: Proc error: Unknown error.") + return -1 + + return text2num(A["http"]) != 0 ? text2num(A["http"]) : text2num(A["curl"]) diff --git a/config/example/discord.txt b/config/example/discord.txt index c7725c4f755..ea66b2cc9ab 100644 --- a/config/example/discord.txt +++ b/config/example/discord.txt @@ -7,3 +7,6 @@ ## Uncomment this to enable robust debugging. ## This results in more messages being sent via log_debug() during bot operations. # ROBUST_DEBUG + +## The subscriber role ID goes here. +# SUBSCRIBER diff --git a/html/changelogs/skull132-discord.yml b/html/changelogs/skull132-discord.yml new file mode 100644 index 00000000000..7d67e220f2b --- /dev/null +++ b/html/changelogs/skull132-discord.yml @@ -0,0 +1,7 @@ +author: Skull132 + +delete-after: True + +changes: + - rscadd: "Replaced staff memos with directly pulling the Discord memos." + - rscadd: "Added the 'Discord' button to the top right. It will take you to the Discord server if the bot is properly set up!" diff --git a/html/templates/welcome_screen.html b/html/templates/welcome_screen.html index 871b67a5e77..1107122aff9 100644 --- a/html/templates/welcome_screen.html +++ b/html/templates/welcome_screen.html @@ -87,7 +87,13 @@ gotReply = true; } - $(obj.div).append($(obj.content)); + if (obj.content instanceof Array) { + for (var i = 0; i < obj.content.length; i++) { + $(obj.div).append($(obj.content[i])); + } + } else { + $(obj.div).append($(obj.content)); + } if (obj.update == 1 && !$(obj.div + '-tab').hasClass('updated')) { $(obj.div + '-tab').addClass('updated'); diff --git a/interface/interface.dm b/interface/interface.dm index 125b52fd482..8416c20f79c 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -32,7 +32,7 @@ return src << link(config.githuburl + "/issues") else - src << "\red The issue tracker URL is not set in the server configuration." + src << span("warning", "The issue tracker URL is not set in the server configuration.") return #define RULES_FILE "config/rules.html" @@ -175,5 +175,20 @@ Any-Mode: (hotkey doesn't need to be on) return src << link(config.webint_url) else - src << "\red The web interface URL is not set in the server configuration." + src << span("warning", "The web interface URL is not set in the server configuration.") return + +/client/verb/open_discord() + set name = "open_discord" + set desc = "Get a link to the Discord server." + set hidden = 1 + + if (discord_bot && discord_bot.active) + if(alert("This will open Discord in your browser or directly. Are you sure?",, "Yes", "No") == "Yes") + var/url_link = discord_bot.retreive_invite() + if (url_link) + src << link(url_link) + else + src << span("danger", "An error occured retreiving the invite.") + else + src << span("warning", "The serverside Discord bot is not set up.") \ No newline at end of file diff --git a/interface/skin.dmf b/interface/skin.dmf index 2d5c635b721..4ee3988958a 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1,173 +1,173 @@ macro "borghotkeymode" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=borgmacro hotkey_toggle.is-checked=false 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 = "ALT+WEST" command = "westfaceperm" 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 = "ALT+NORTH" command = "northfaceperm" 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 = "ALT+EAST" command = "eastfaceperm" 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 = "ALT+SOUTH" command = "southfaceperm" 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 = "5" command = ".me" 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 = "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 = "J" command = "toggle-gun-mode" is-disabled = false - elem + elem name = "CTRL+J" command = "toggle-gun-mode" 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 + elem name = "R" command = ".southwest" is-disabled = false - elem + elem name = "CTRL+R" command = ".southwest" is-disabled = false @@ -175,11 +175,11 @@ macro "borghotkeymode" 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 @@ -187,475 +187,475 @@ macro "borghotkeymode" 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" command = "ooc" 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 = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Player-Panel-New" 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 "macro" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true\"" 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 = "ALT+WEST" command = "westfaceperm" 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 = "ALT+NORTH" command = "northfaceperm" 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 = "ALT+EAST" command = "eastfaceperm" 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 = "ALT+SOUTH" command = "southfaceperm" 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+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+SHIFT+G" command = ".configure graphics-hwmode on" 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" command = "ooc" 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 = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Player-Panel-New" 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 - elem + elem name = "ALT" command = "set-context-menu-enabled 0" is-disabled = false - elem + elem name = "ALT+UP" command = "set-context-menu-enabled 1" is-disabled = false macro "hotkeymode" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true\"" 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 = "ALT+WEST" command = "westfaceperm" 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 = "ALT+NORTH" command = "northfaceperm" 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 = "ALT+EAST" command = "eastfaceperm" 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 = "ALT+SOUTH" command = "southfaceperm" 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 = "5" command = ".me" 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 = "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 = "holster" is-disabled = false - elem + elem name = "CTRL+H" command = "holster" is-disabled = false - elem + elem name = "J" command = "toggle-gun-mode" is-disabled = false - elem + elem name = "CTRL+J" command = "toggle-gun-mode" 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 @@ -663,11 +663,11 @@ macro "hotkeymode" 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 @@ -675,276 +675,276 @@ macro "hotkeymode" 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" command = "ooc" 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 = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Player-Panel-New" 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 "borgmacro" - elem + elem name = "TAB" command = ".winset \"mainwindow.macro=borghotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true input.background-color=#F0F0F0\"" 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 = "ALT+WEST" command = "westfaceperm" 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 = "ALT+NORTH" command = "northfaceperm" 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 = "ALT+EAST" command = "eastfaceperm" 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 = "ALT+SOUTH" command = "southfaceperm" 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+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 = ".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" command = "ooc" 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 = "F3" command = ".say" is-disabled = false - elem + elem name = "F4" command = ".me" is-disabled = false - elem + elem name = "F5" command = "asay" is-disabled = false - elem + elem name = "F6" command = "Player-Panel-New" 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 = "" @@ -953,7 +953,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quick screenshot\tF2" command = ".screenshot auto" category = "&File" @@ -962,7 +962,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Save screenshot as...\tShift+F2" command = ".screenshot" category = "&File" @@ -971,7 +971,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "" command = "" category = "&File" @@ -980,7 +980,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Quit" command = ".quit" category = "&File" @@ -989,7 +989,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Icons" command = "" category = "" @@ -1034,7 +1034,7 @@ menu "menu" group = "size" is-disabled = false saved-params = "is-checked" - elem + elem name = "" command = "" category = "&Icons" @@ -1052,7 +1052,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Help" command = "" category = "" @@ -1061,7 +1061,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Admin help\tF1" command = "adminhelp" category = "&Help" @@ -1070,7 +1070,7 @@ menu "menu" group = "" is-disabled = false saved-params = "is-checked" - elem + elem name = "&Hotkeys" command = "hotkeys-help" category = "&Help" @@ -2188,6 +2188,16 @@ window "rpane" is-checked = false group = "" button-type = pushbutton + elem "discordb" + type = BUTTON + pos = 544,0 + size = 60x16 + anchor1 = none + anchor2 = none + background-color = none + saved-params = "is-checked" + text = "Discord" + command = "open_discord" elem "textb" type = BUTTON pos = 0,0 diff --git a/lib/ByondPostDLL/ByondPostDLL.cpp b/lib/ByondPostDLL/ByondPostDLL.cpp index 7e70dc7900e..b2807695d9a 100644 --- a/lib/ByondPostDLL/ByondPostDLL.cpp +++ b/lib/ByondPostDLL/ByondPostDLL.cpp @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ - +#include #include extern "C" __declspec(dllexport) char *send_post_request(int argc, char *argv[]) @@ -69,3 +69,75 @@ extern "C" __declspec(dllexport) char *send_post_request(int argc, char *argv[]) return return_value; } + +static std::string getBuffer; + +// Callback function to write into the return string. +static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) +{ + size_t realsize = size * nmemb; + getBuffer.append((char*)contents, realsize); + return realsize; +} + +extern "C" __declspec(dllexport) char *send_get_request(int argc, char *argv[]) +{ + // If you're not using this with at least 1 custom header, why /are/ you using it? + // Use world.Export() instead you dolt. + if (argc < 2) + { + return "proc=1"; + } + + // A lot of code duplication from send_post_request. But. It's like 2AM. + curl_global_init(CURL_GLOBAL_DEFAULT); + CURL *curl = curl_easy_init(); + + if (!curl) + { + return "proc=2"; + } + + // Initialize variables. + getBuffer.clear(); + long http_code = 0; + CURLcode res; + struct curl_slist *chunk = NULL; + + for (int i = 1; i < argc; i++) + { + chunk = curl_slist_append(chunk, argv[i]); + } + + // Set curl options. + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 2L); + curl_easy_setopt(curl, CURLOPT_URL, argv[0]); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &getBuffer); + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk); + + // Save the response. + res = curl_easy_perform(curl); + + // Get the response code and save it to http_code. + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + // Clean up the session info. + curl_global_cleanup(); + + if (res != CURLE_OK || http_code != 200) + { + static char return_value[33] = {0}; + // Create the feedback message. + // Format used is key=value&key=value. + snprintf(return_value, 32, "http=%d&curl=%d", http_code, res); + + return return_value; + } + else + { + // No error, return the body. + return (char *)getBuffer.c_str(); + } +} From da55dc75f8c9142db300ddf7d10dcafd46064d6d Mon Sep 17 00:00:00 2001 From: skull132 Date: Sun, 19 Mar 2017 22:11:19 +0200 Subject: [PATCH 44/55] Fix Lohikar's bad debug logging --- code/modules/client/preference_setup/loadout/loadout.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index bc567f41f44..bbb94611fed 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -47,10 +47,10 @@ var/list/gear_datums = list() /datum/category_item/player_setup_item/loadout/gather_load_query() return list("ss13_characters" = list("vars" = list("gear"), "args" = list("id"))) - + /datum/category_item/player_setup_item/loadout/gather_save_query() return list("ss13_characters" = list("gear", "id" = 1, "ckey" = 1)) - + /datum/category_item/player_setup_item/loadout/gather_save_parameters() return list(":gear" = json_encode(pref.gear), ":id" = pref.current_character, ":ckey" = pref.client.ckey) @@ -73,7 +73,7 @@ var/list/gear_datums = list() try pref.gear = json_decode(pref.gear) catch - log_debug("SQL_CHAR: Unable to load preferences for client [pref.client ? pref.client.ckey : "UNKNOWN"].") + log_debug("SQL CHARACTER LOAD: Unable to load custom loadout for client [pref.client ? pref.client.ckey : "UNKNOWN"].") pref.gear = list() gear_reset = TRUE else @@ -102,7 +102,7 @@ var/list/gear_datums = list() preference_mob << "You cannot afford to take \the [gear_name]" else total_cost += G.cost - + /datum/category_item/player_setup_item/loadout/content() var/total_cost = 0 if(pref.gear && pref.gear.len) From 4666dc5c067ac3becb1747e0ba19c4084cade6c4 Mon Sep 17 00:00:00 2001 From: skull132 Date: Sun, 19 Mar 2017 15:11:49 -0400 Subject: [PATCH 45/55] Changelogs, 19MAR2017 --- html/changelog.html | 195 +++++++++++++++- html/changelogs/.all_changelog.yml | 220 ++++++++++++++++++ html/changelogs/Arrow768-1406.yml | 40 ---- .../Fire and Glory-Fire-and-Glory-dev1.yml | 38 --- html/changelogs/LordFowl - 11081998.yml | 36 --- html/changelogs/Nanako-DionaTweaks.yml | 40 ---- html/changelogs/Nanako-Fixes2.yml | 40 ---- html/changelogs/Nanako-Juggernaut.yml | 36 --- html/changelogs/Nanako-Lasers.yml | 36 --- html/changelogs/Nanako-Nanacooking.yml | 50 ---- html/changelogs/Nanako-Pylons.yml | 38 --- html/changelogs/Nanako-Sleepmice.yml | 38 --- html/changelogs/Nanako-Techfixes.yml | 41 ---- html/changelogs/Nanako-tweaks.yml | 37 --- html/changelogs/Pottedplants.yml | 37 --- html/changelogs/Printer16- SmallChanges.yml | 10 - html/changelogs/VikingPingvin-PR-1626.yml | 37 --- html/changelogs/agentwhatever-PR-1782.yml | 9 - html/changelogs/alberky-PR-1635.yml | 7 - html/changelogs/alberky-PR-1648.yml | 9 - html/changelogs/alberky-PR-1805.yml | 6 - html/changelogs/alberky-PR-1905.yml | 7 - html/changelogs/alberyk-PR-1699.yml | 8 - html/changelogs/alberyk-PR-1765.yml | 12 - html/changelogs/alberyk-PR-386.yml | 8 - html/changelogs/lohikar-PR-1809.yml | 11 - html/changelogs/lohikar-PR-1868.yml | 5 - html/changelogs/lohikar-PR-1906.yml | 4 - html/changelogs/lohikar-PR-1933.yml | 9 - html/changelogs/lohikar-ame.yml | 4 - html/changelogs/lohikar-arealights.yml | 4 - html/changelogs/lohikar-doafter.yml | 4 - html/changelogs/lohikar-ipc-lights.yml | 4 - html/changelogs/lohikar-lighting.yml | 19 -- html/changelogs/lohikar-misc-fixes.yml | 8 - html/changelogs/lohikar-misc.yml | 6 - html/changelogs/lohikar-movement.yml | 4 - html/changelogs/lohikar-nightmode.yml | 4 - html/changelogs/lohikar-paper-planes.yml | 4 - html/changelogs/lohikar-pr-1726.yml | 4 - html/changelogs/lohikar-pr-1744.yml | 4 - html/changelogs/lohikar-shredder.yml | 4 - html/changelogs/lohikar-sml.yml | 4 - html/changelogs/lohikar-sockdrobe.yml | 4 - html/changelogs/lohikar-sparks.yml | 5 - html/changelogs/lohikar-spoopy.yml | 5 - html/changelogs/lordfowl - 1885.yml | 36 --- html/changelogs/skul1l32-voting.yml | 6 - html/changelogs/skull132-discord.yml | 7 - 49 files changed, 406 insertions(+), 798 deletions(-) delete mode 100644 html/changelogs/Arrow768-1406.yml delete mode 100644 html/changelogs/Fire and Glory-Fire-and-Glory-dev1.yml delete mode 100644 html/changelogs/LordFowl - 11081998.yml delete mode 100644 html/changelogs/Nanako-DionaTweaks.yml delete mode 100644 html/changelogs/Nanako-Fixes2.yml delete mode 100644 html/changelogs/Nanako-Juggernaut.yml delete mode 100644 html/changelogs/Nanako-Lasers.yml delete mode 100644 html/changelogs/Nanako-Nanacooking.yml delete mode 100644 html/changelogs/Nanako-Pylons.yml delete mode 100644 html/changelogs/Nanako-Sleepmice.yml delete mode 100644 html/changelogs/Nanako-Techfixes.yml delete mode 100644 html/changelogs/Nanako-tweaks.yml delete mode 100644 html/changelogs/Pottedplants.yml delete mode 100644 html/changelogs/Printer16- SmallChanges.yml delete mode 100644 html/changelogs/VikingPingvin-PR-1626.yml delete mode 100644 html/changelogs/agentwhatever-PR-1782.yml delete mode 100644 html/changelogs/alberky-PR-1635.yml delete mode 100644 html/changelogs/alberky-PR-1648.yml delete mode 100644 html/changelogs/alberky-PR-1805.yml delete mode 100644 html/changelogs/alberky-PR-1905.yml delete mode 100644 html/changelogs/alberyk-PR-1699.yml delete mode 100644 html/changelogs/alberyk-PR-1765.yml delete mode 100644 html/changelogs/alberyk-PR-386.yml delete mode 100644 html/changelogs/lohikar-PR-1809.yml delete mode 100644 html/changelogs/lohikar-PR-1868.yml delete mode 100644 html/changelogs/lohikar-PR-1906.yml delete mode 100644 html/changelogs/lohikar-PR-1933.yml delete mode 100644 html/changelogs/lohikar-ame.yml delete mode 100644 html/changelogs/lohikar-arealights.yml delete mode 100644 html/changelogs/lohikar-doafter.yml delete mode 100644 html/changelogs/lohikar-ipc-lights.yml delete mode 100644 html/changelogs/lohikar-lighting.yml delete mode 100644 html/changelogs/lohikar-misc-fixes.yml delete mode 100644 html/changelogs/lohikar-misc.yml delete mode 100644 html/changelogs/lohikar-movement.yml delete mode 100644 html/changelogs/lohikar-nightmode.yml delete mode 100644 html/changelogs/lohikar-paper-planes.yml delete mode 100644 html/changelogs/lohikar-pr-1726.yml delete mode 100644 html/changelogs/lohikar-pr-1744.yml delete mode 100644 html/changelogs/lohikar-shredder.yml delete mode 100644 html/changelogs/lohikar-sml.yml delete mode 100644 html/changelogs/lohikar-sockdrobe.yml delete mode 100644 html/changelogs/lohikar-sparks.yml delete mode 100644 html/changelogs/lohikar-spoopy.yml delete mode 100644 html/changelogs/lordfowl - 1885.yml delete mode 100644 html/changelogs/skul1l32-voting.yml delete mode 100644 html/changelogs/skull132-discord.yml diff --git a/html/changelog.html b/html/changelog.html index 3276aed72e8..b3abe25e263 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -1,7 +1,7 @@ - + - Baystation 12 Changelog + Aurorastation Changelog