From 043608d807b5e10fd94c6719f3c7aa8c71781eca Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Mon, 15 Jan 2018 13:30:37 -0500 Subject: [PATCH 1/7] POLARIS: Remove the need for borgs to have HUD items in their module inventory --- code/modules/mob/living/carbon/human/examine.dm | 4 ++-- code/modules/mob/living/silicon/robot/robot_modules/event.dm | 1 - .../mob/living/silicon/robot/robot_modules/station.dm | 3 --- code/modules/mob/living/silicon/silicon.dm | 5 +++-- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 81ea775ab9..08ea8bb2d9 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -475,9 +475,9 @@ var/mob/living/silicon/robot/R = M switch(hudtype) if("security") - return istype(R.module_state_1, /obj/item/borg/sight/hud/sec) || istype(R.module_state_2, /obj/item/borg/sight/hud/sec) || istype(R.module_state_3, /obj/item/borg/sight/hud/sec) + return R.hudmode == "Security" if("medical") - return istype(R.module_state_1, /obj/item/borg/sight/hud/med) || istype(R.module_state_2, /obj/item/borg/sight/hud/med) || istype(R.module_state_3, /obj/item/borg/sight/hud/med) + return R.hudmode == "Medical" else return 0 else diff --git a/code/modules/mob/living/silicon/robot/robot_modules/event.dm b/code/modules/mob/living/silicon/robot/robot_modules/event.dm index 8b2e80c448..cdc15210eb 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/event.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/event.dm @@ -16,7 +16,6 @@ src.modules += new /obj/item/borg/combat/shield(src) // Med - src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/lost(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 7e51f4eef5..fbcd6375a6 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -211,7 +211,6 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/medical/surgeon/New() ..() - src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) src.modules += new /obj/item/weapon/surgical/scalpel/cyborg(src) @@ -273,7 +272,6 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/medical/crisis/New() ..() - src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/reagent_scanner/adv(src) src.modules += new /obj/item/roller_holder(src) @@ -501,7 +499,6 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/security/general/New() ..() - src.modules += new /obj/item/borg/sight/hud/sec(src) src.modules += new /obj/item/weapon/handcuffs/cyborg(src) src.modules += new /obj/item/weapon/melee/baton/robot(src) src.modules += new /obj/item/weapon/gun/energy/taser/mounted/cyborg(src) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index f1554b59a7..689d27dce8 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -25,8 +25,7 @@ var/obj/item/weapon/card/id/idcard var/idcard_type = /obj/item/weapon/card/id/synthetic - #define SEC_HUD 1 //Security HUD mode - #define MED_HUD 2 //Medical HUD mode + var/hudmode = null /mob/living/silicon/New() silicon_mob_list |= src @@ -280,6 +279,8 @@ plane_holder.set_vis(VIS_CH_HEALTH,FALSE) to_chat(src,"Sensor augmentations disabled.") + hudmode = sensor_type //This is checked in examine.dm on humans, so they can see medical/security records depending on mode + /mob/living/silicon/verb/pose() set name = "Set Pose" set desc = "Sets a description which will be shown when someone examines you." From 1de268908429d8523ff29955c42b1f631cdce3a8 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 18 Jan 2018 13:16:04 -0500 Subject: [PATCH 2/7] Changelog for borg huds --- html/changelogs/Arokha - Borghuds.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/Arokha - Borghuds.yml diff --git a/html/changelogs/Arokha - Borghuds.yml b/html/changelogs/Arokha - Borghuds.yml new file mode 100644 index 0000000000..87bd63b6f7 --- /dev/null +++ b/html/changelogs/Arokha - Borghuds.yml @@ -0,0 +1,4 @@ +author: Arokha +delete-after: True +changes: + - tweak: "Remove borg hud items as they have normal huds as their sensor augs now, and can see records with them." From 488c88b348b5e4b7d4fe5dace31816d0ed482f96 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 19 Jan 2018 16:49:30 -0500 Subject: [PATCH 3/7] Added operating manual book for Tesla --- code/game/objects/items/weapons/manuals.dm | 70 +++++++++++++++++++++ html/changelogs/Leshana-tesla-book.yml | 4 ++ icons/obj/library.dmi | Bin 29543 -> 30659 bytes 3 files changed, 74 insertions(+) create mode 100644 html/changelogs/Leshana-tesla-book.yml diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm index 533f5b30aa..0db669545c 100644 --- a/code/game/objects/items/weapons/manuals.dm +++ b/code/game/objects/items/weapons/manuals.dm @@ -147,6 +147,76 @@ "} +// TESLA Engine + +/obj/item/weapon/book/manual/tesla_engine + name = "Tesla Operating Manual" + icon_state ="bookTesla" + author = "Engineering Encyclopedia" + title = "Tesla Engine User's Guide" + dat = {" + + + + +

OPERATING MANUAL FOR MK 2 PROTOTYPE TESLA ENGINE 'EDISON'S BANE'

+
+

OPERATING PRINCIPLES

+

This big floaty ball of pure electricity can only be contained by the containment field. It periodically will discharge energy in the form of an electric shock which can be harvested for energy.

+

When you shoot the energy ball with the Particle Accelerator, it gains energy, and when enough energy is accumulated a mini-energy ball that orbits the big energy ball will be formed. This can happen as many times as you let it, each mini-ball will send off an extra shock when the energy ball pulses. Be warned, the more mini-balls the energy ball has, the more shocks it sends out at once and the further it can travel each move.

+

An energy ball will shoot bolts of electricity off at conductors, which it prioritizes in this order: +

    +
  1. Tesla coils
  2. +
  3. Grounding rods
  4. +
  5. People and animals
  6. +
  7. Machines
  8. +
+

+

Tesla Coils will attract the energy ball's bolts. They will take half the power of the bolt (if they are connected to a wire node), pump it into the powernet it is hooked to, and then will send the other half of the power to the next available conductor, which follows the criteria listed above. Preferably, this will be another coil to harness more of the power and pump it into the grid.

+

Grounding Rods are safety precautions to prevent the tesla bolts from hitting machinery or personnel. If the tesla is loose, being near one will usually keep you safe from direct shocks.

+
+

STARTUP PROCEDURE

+
    +
  1. Bolt and weld down the Field Generators, ensuring they form a complete rectangle.
  2. +
  3. Bolt and weld down the Emitters, ensuring their fire will strike the corner Field Generators
  4. +
  5. Bolt down the Tesla Generator inside the rectangle formed by the Field Generators in a spot where it will be struck by fire from the Particle Accelerator
  6. +
  7. Bolt down Telsa Coils and Grounding Rods
  8. +
  9. Activate the Emitters
  10. +
  11. Activate each of the Field Generators, then wait until the containment field has completely formed.
  12. +
  13. Setup the Particle Accelerator (see our best seller "Particle Accelerator User's Guide"!) and activate it.
  14. +
  15. After a short time the Telsa Generator will create an energy ball, being consumed in the process.
  16. +
+
+

OPERATION AND MAINTENANCE

+
    +
  1. Ensure that electrical protection and meson goggles are worn at all times while working in the engine room.
  2. +
  3. Ensure that Telsa Coils and/or Grounding Rods are placed to safely collect or ground any and all shock.
  4. +
  5. Ensure that all Emitters remain activated and have unobstructed lines of fire to the Field Generators.
  6. +
  7. Do not let the Emitters run out of power.
  8. +
+
+

SHUTDOWN PROCEDURE

+
    +
  1. De-activate the Particle Accelerator. The energy ball will begin to shrink and lose mini-balls.
  2. +
  3. When the energy ball has completely dissipated, the Emitters can be de-activated.
  4. +
+
+

ENERGY BALL ESCAPE PROCEDURE

+
    +
  1. Do not let it escape.
  2. +
  3. Have someone ready to blame when it does escape.
  4. +
  5. Buy our forthcoming manual "Celebrity Grounding Rod Shelters of the Galaxy"
  6. +
+ + "} + //R-UST port /obj/item/weapon/book/manual/rust_engine name = "R-UST Operating Manual" diff --git a/html/changelogs/Leshana-tesla-book.yml b/html/changelogs/Leshana-tesla-book.yml new file mode 100644 index 0000000000..bcae6fc94e --- /dev/null +++ b/html/changelogs/Leshana-tesla-book.yml @@ -0,0 +1,4 @@ +author: Leshana +delete-after: True +changes: + - rscadd: "Added the operating manual book for the Tesla Engine." diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index b548a3fb7347863c2ae882e18951d5cd55cb77b3..d938b6f9d401bb45da3273ca38e066687b4d8939 100644 GIT binary patch delta 11876 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 V&6qGyknWNL1{aNVOSJ7m{ugVEU&sIe delta 10751 zcma)icUTkMx9)_1AT>yf(t@awK+`gPdCJS>I{w4gcx0Kn(x1#$pD z26){vc2%){YUN_%wC=|NWCb{QPBkXyrbDKLnE>V!}$4Ot!m0NjD=35Uo)Glz` z%2QJnl|mT?Z)|pfC#Z5Yc8jbExL^A7OnkUW_o{BZo)Nu9Qpi8C(4~H@y*Zo4*CLjd z_O8^&o7z1|=V>#CW#+38`n-(dtolrh;w<{+6oi>G?YCVo$jp1KU2+LYHQBvmHqdI+ zReH-O2=*+UDQwX&M^MS-Gd?K$&FX>2-O3h2-bN#1G2lmOn$+)}aBtd2v9;mW zd_y&o)4bkt?45KnJ*$cBXDW*~gBs)VUV7~W?0Gu)Y}&-`nGJ?@T&FH6JRI3sy}5Hy zH{3NbM^(Dj(RK;GX8rAiu>31+_!;o~J?18NIzFlfp|AkBw?iI_pAR{ETJz*dlm0tY zo1Wd2vNzd%OiDpI)ScO=$_|&)7s9u+SQQd3{}j8E_-Ioqn#|i{-Ljy@v3>_TXnsjh zx;Jx&*{~{eS>MW$nk`dTgLLm*M$jlHpZU=oxeJpU-63z__(brM;pMp{5zg#aNgVeJ z;vZjs&SE(FlE&DR>Ty}(*ERlzl=LBs31C$3v?P*&y1i!TjMt}gS>P-87u@|m;szyi zXK@sx$dR55e{!A@WwMeR;K$tcucU-)@yUopi`O3H8eL&;uQMk$H>tD!XzlIU`jFH+ z@W#;Q{3?yG#ksWtd(+3|_w>u%?!hm5SPl+^@w@dGxfRDo%C*cm^g5)HD=OZB|4>4b zRlelt@J&VQJQQ6Jee|#+;Tlti&qSe-*|kRu&4BSvA__=nS>NAE}E=S^#`ck%|Cbb=Dsv4BR3-Yg#)mp@e=oGBY->K1s`$8NPV zR5i5P8;SRJw4462mU=~&H04?$( zP00EC+?P5Vs|M9j*d#dWVV8e1zCNf};nyuJhepDem;}Cui!LMn2dJ0yQ}r&@V;a>@ z)Y_@Yw_c^;2R2Gnb!4)y*-!gO&&4xOcNSJM`yi#7)uW@#gCAneo5Ld<)HKGU#`19UngUv*_6RV|_tgTdgfN7PPvCRl z-WIZWUrL$v5S8i3r5}Kw<->~O_xSIpyrXclm{l@1dF{c%dxzPp?0x;t{I9Dt=C6fX zO-_jXbh4W+vtD7FWWmacWJ=Gv054WG{kfN;l=np_J~XFo)Igjk>-kK@ z`=XfCYGI@Js~?gyTVE;N?B7ge7cw`ns50xFYbpf5x+0i|5Wqfqp(0gTitzG zq~daHNup4nDTaxfMiUVl*yX*#*+^K=O?{!;fkT9CAk!8>a*1A2iTQeWepOakq&ZEf zd4SfBFL!TXwqBt@g4XWnDU41iO_r+8K>*_lp$J_NxO(wY03B^WELD>d4_^KhI=G{B zkVK)OQBXUnAROg;aCINC0f}u1o zFO;ne-UNQ(eVK-z?G(nQ)XgRzy1ii(Gk;@QE2^+NCswy1E6;`W7e3|R%#y~#hMB)m zQFw5b9!nA`aMsqTciN(L8opNf+aXYW)Rk72!TGmj3E{~NyHl-uH`?Xf<1e%-Q46<`)w%CibURXMv>a@Cfz>wFB!rPDJZR?^S(-t>j&u)go8857xFpmJ z>sZJ=A;%rg@uG1*919?a>O2gjXXn*vL?j^Z*9YGD70_GzS$Pt6tbqJcLZyfEIwgo) zTUNHTJn7TigrJJB;`k&*SATE(=|MW5+xTNwmrFrnnXuxgMsEuz_(|Ud*xr45N4tuB zth=nMa`CCrC4vA2wV$Y+;fg)Gr1DK75m4Wztm2JHVrqVT!!a7XGv1GW0X&TnZ>&iB0AO_=d8jd57D66#{AhK=zChWPIq6swY=mY)`1$&aa*KwD1kQ zl8BZa)g$ZEwW2=^u6RV#wU|W^iQA`0TB>M8L||MI+^@GOjOIO3jzwAIJFlft??18| z=z+TH%>LJzY5m6QXciCB80!NE->}rp7uD5?BJNJN?=g`p8Z)v2_$lKhnR8-7W}vQ} zom~g0c9U9iL>EDBsfsKdwA~X&K<2n$VKn}t0{Ph9-td!rzH#yQBCqIv0=e^*cea3( z>!MyOx22(>p$^95_CESo7wTwuVE*A2d&?~D3vqXFXL;(QDY40=**p*y_X z{%AeBuX<7(AwNGK|D28vc^c$Yb#xS-???%MIekAOBI@1y3go?{BsyW=dqct^hHyP| zb8ZGCo8RjIbLh@-=g4tx0+hgvk=3q^Rg2pXvVS~+r9*2BY1o?NI?vzUH2_4>2c>0Y z@7}#Tdl7kZB(iB`0?fvklKBlT&sA4dy?hrv>h`VpGy2MQ-rWiW7);O2DwbgqUz0x{ zf4>n>sdM~%;`Jo}TIiOuozn*9GD+#iJe2Rz3c)ui!CFitDbiO)?aEvP;%nOXG_iPS zebf;HDksZP;4tgl36z*=3>ON6fCSuIA?D)up~+?emnKemd3Q!uD1W%IF}(CyW)r<_OsP@+Cbx`-F_!ib6^= zul%F}?LbDX5sU?i7iIkCyi!XPyD4-@IXM zqyaZPWbYW6ALn4mT1|&6@qt=jLyl9R@?VKfg*Mt2Q};(5B&DLlWo!%#n1toMYw+uXc`+Xwjy(Y>yu1C;j8V(xAhz4e=${2? zApY=B{23WUO9W1NKvU@ybi>BS3{VB2E>lwg0Vt|)C72(I>iauA07Vs0#Q&dO<<>A6 z(*@IWYFv9}b4#&2+x!92c=zfLf* zw-@AnK;+E?GZ$A^8%Haj>fbbpi0#&Y&CF(H`&5jYntHlJ|K7ciOLR9D*tl|N6guVi zlQS?`lkpy3Q!(PD!n}k8j$<=}zYlr`07zeRGqcpK($rKgK*7i;eq}S9RWM-Z0D68L z8uoWaLj_dO;GaFl|e_h!{y`g#EXZ-!XF^%^#MNT z_j)eo%Y=hIQ8## zZ+P<}o1Jgyhs;PdzG_t!%0GErnm|@#Ux=pzA|oTUropT4IGQuEvQ#(8WVv()`q}=% zx){?~>9>>ECf)ml?k}^E*z6yZf#J^8W0O)sYwxwSwZ9h0rHHWq<<23_P?+jfbm*UO zA#h|!;pd|*`_I~YLxoigDAOFJf>VE(F+12<=%p%>HKh)!MVp@gqtxqce7U%a`W>IQe0+{ieohW0(AD36 z-W&f;6%0qo)j$Jx-<|zyW+^CuD#VnRmuEsz)cfvTD2|47zF=xIwJ7_mSmbWbD*RV( zPrxyXe-*=@aYY{_o8J9!=bQ?+;JLn5l6X7+nV)Zpf zgLF$9YX|6ku~k`SSNN~}{XYP?2SfhPfCT?9ME)OujCUofb9tUyEmn`>_;C+ZRi)sv zdmJO@VEeS>Jf1i6-|*2$I^Wp%X0y$b1-n5s5;O^cl5o-`a`6GHYr512a`h(>e z0t*X^%|6;?_WJl?KL*5Yj}f#A8{#$U)WglM0Pm}iO`eiyG+B~`6u-5-1$*n zTAK0U0~i)d%)eWzQGRXrPZ;T9`0v{4?}~&BO{SQ?)zgJ@FGv2Qiu`3h(O_x+lTf14 z7=YETEFM#Pq6%|XhB*n!AC9f`$-~2U4Y}>6H=jiR@$%WG`Sv8Swd)gKY+kK+r@BF$ z0RIyy{^f)Q#c?FdUuKhX`y?^*(~;=2uFCBc_!H}ZbNQJlMj25LOR9%SoJkoCwPp-e zW27cW(4WvZz7n=4w#?1pJ9A5Ch}c zUhusqQu2v5VvIg%j6Nv7fjmg@^#UXP2}b%Clb0?B)=$;`AWDxFWbWY>#ORgA9YL9o zsJ_8LO2Ff=kxiU)zqgs&Xq3;MDP|*M9pWQY9a1f`Z1?Zi2%j zBl-)Q78kt*={cl695o(y&3srhS_Xz?_s>KOP%G#7Eo-Uh+w#DYI~~){L~%`L?u@2d z(N-3QA$D?ay7{o;PyNWqIw zc#y=KKCFVyGT*)Sd5H>nMt0d zQXS&2!XBRVY4brAM2cUbU?mr+0iSTl?KcfpbVNt+rwZHiGD7(>3y7Lw*1crp(skH) z7RpVIrl9oR`b1h;pp3l4!$lQINMLt=H!LG3v#RRMJ-}{p5wU;eEENTsrQzT#cNk3= zqZzAW1z*I5sil^1a@2NsN4@zx<$d2;Bs;r-Y?>YL*v{_3sT}7yDS8l!Mjk~OihF@j z*W*0f68q_6v<49>gm(7!?yrqj@?R8cYFXsh2n!dSiLa+7y2@@gFhMmd6oYJR^kpTu z@er<;X1`8u*IgS!uEQG}jXys)3E5fb;b%@x&f^CzDK}c|+eJ9iC>CbhxK^Htk93iu zNpTuZu}DOM%!CRm`f_-0Q;t8Kwwj!{FT!S>`~*TW-u?c(QK=ITJ*WKThXLQC(JTpS zq+6J4pQeqd<#B8Ayc2});_rDU@MeyJq?Hn*kj@kxzJNN^nKNgK94F+-pDQNIdfxQ$ zwX>t8ql5D&b(5>>X9~HK4HE0oS~Zl`*1v9=Mp`w4QIc}TB#gy)VkluZ(qefapNY_8ncn@9zlhdi7%4LIirNynm?*PWJ94!D$c?Ya zZ=(+C`nJBuWB+u6WPS%AR7eH|1-*=Fd!qtYOqjF@&E4W87S1g%?J3^pG;5F4Ip9D;>5N#?Qe*@AI24O~cD~ar9c_ z)7-lZsQ!5KLtaD;Ug;=(JmvZm@VRcyQCt9Y@!zTAGbi-e>KPohN`l_r)d$A8u$7T= z24Ld{Us`%~HM_!P;J`=z@?G*|ZmuAKYr1`O8Mvi}2?A%$%-2&M-fSx@x(%yLu^s)H zVnk7N$7o-4z!g3bZi_-I{T)U9QTZo{>CEujTW$EC)bbCHVAPn~v>33*7MO+W35kLw z`2BJ3GYa@fvscMc-WRkuoo@Ei0RVz{Lq+kHbKOGkk*JE9o7BeE$HHk+fq8UPsLn+6 zI67ptu!j12P)@4khMI^GmS&E9;X9}b6qHanITyV54LT8*v#e(bkGZ}2@*Hc6&(FOi zPUr$3z~i$9)3YZ)L2g2VXyWr~r)W-@Agksm7{F=*!X;eYt-{}*?rK4i0|ifoDmuK!`ne+WfGrEDo^?P`XZ6YTJ*`RmB1dfh(6h%=ed}e%8zwyRJFH_-@0*A z0}Ze1SAI6yp)FPc{^r?Xpf$IW=C%NKZJn~Ub;I$c{*9##oR5Nj>{b*tRTf4tf%NH4 z34((=xW`TfY8~%~S-JtDBf_eW_qt!=I#cODyb=F{pA_0x*K;lH?6l$mRC+c}J*;i+ z`$V=45ylT7$ekI}vkB&{J1pOegiSM%ulq6KR8>5VhZTc_m1aWvHo$DDGjT* zF5q8P3Y^mtzWAdG{_F8$W(0IvrJ8XDP(f07(7g{?eIl+{5Wx5U%Ngg%NRv6^FjeTnSA(eh%c)|!e7At14>bNS{eZM!3IDJ#Bf za4@);%lone)>LxTPlka@<sFdPv0_gEO4T{Y z?;nhw7&S9_++5h9X-D_al629@_>=0ZMj7+L+|8U!Qe(mWy5DMTE0f$IOFy;+ZR=&$ zzw$aTiPk}$qOE5VFg^belUMf4&Fzf*T{Q_LpfIChW}82GUlWu-4pWMVh*-=n{cvO? zv2l$h>{cw7gGFZmmqTR^36C4KXhK&MJIL|I4u@RTEl_HAcMrdZtcLqY5&Bv}Q?Q{4 zX&WB6tvMtYmzugdrG}>F6|jQj<($@Iy`Cdmo~nG|#m%a#^`zFqH70IIXUopt>rI?b z&ypv5JU$Qh8f+<|igyYn2!q(8f{MzzR7TR^ zs?Vusq|XfA4y3OYx{UA$TYmXmZPM66XY)59x)Ta63L<9-UKWq(Y9C6v$1viA9l%uq zkbK@84jiC6NuYe@Q~XgmN%o`db(NOctkdB1-V4LxET%h2JziSBZ#*HMOaVkFL9f|! zh_JCPUUG7YQ9&*?uG6*k0`ZfJ-I+F>!mo*OQu5unyg&rv7yEeQt3K3g;tMTv zYWB4z_HvNznM|72hm-u)wLN7d*IaEZ0x|xL=w;el2ucQxQ#E~_AAh7ql-*EwY%Iv( zR_m;NwAnCY+bydH-0*sFw z@H1=9$-lhr_pDD|`D{bZ7%$$F*47CQmh@L_kJFD{*@SLiWnHzb?!kDy{IDZjE_W*Q z99MyW5&}Vbc}U(@yq!^^6&tW_4V~OVs(w-Y?-b@N7LrgJ~OcP!OS4Z z0iw_V5zRul6R4y!$9qD zsg|OX0#Mi~(P!>wnHuGNG_xm%7Jb)gs6p7HIwV#xtTj4p>=t+SV!}C%3f=~9@`25C z`@yT0JC1AW)~XcL#3}#~v7fuzcln58Lw9qc&_@eh3vyGb{^LIYav%W_bYmi5WQ>fpeYYJej1{C}FY;ri)20`lcO*+bR+VtY2enL_%n& zzJ2rf@cEQ_G*@HJ_*m#j>J+BU*fwG>U(^04SE3?RBqj~uW4=>_%&<7N< z_@{*02EExUDH!0UP=#>%?C(<*cO*69-@GH~p;>)wVM=9)1DDAa@keyKM_{Y(TQPU~ z)+-G0LKho@NxM96#!P9r^f%(+l#Wtw2bVf`7qE_lN4e(n*S%^SjV@<0nrW7%>GMA$ zqcPdQ(QZy0G;jb@#z$Byv(~A!grZ~j%1B6V@4eLAT(mD{y!?Hm`S@QzR{iLw3TV2;VHFd_F z=gix$*IGjK5gm+t2a=u#Gz6+541O-tJ^k6pIzlk|>?BR?eAM9*&n`=YK= zO62nMc6RP&VayQiycn$%H)T?%F?MK4a(NqEV~?v?=x3NorMX^?CX`ZCkV>Onx3iTC zl#TtaOcE$j5Al*jDOM`K=*C!up%Ve|lHwxnb`JC4#ykjB6VG!C3ZevX)H94?lu~Po-U9Usn0z|9%Z zpfX{tz1Vy);#rjcL}z`fQ&kbnKD}dGN6OswYzV5u%$Xi^!t))HGPyG*nwq3#MD9>u zg*Imb*ujEC$R|v=F*6=4WAZ!p+70h3@=eNch^BIJP0Q&RED zaSeK3h10wX4`FRejGoQU3@1MA8u*2cI- zq~|%X@|*kOXr-M_Vaxet%_~p4wM61*)J@j@H}n(4kD1xPgvkCtl-8S8gcjb;qD>Qd5mlA=ZcA ze~}tu(FteCVU|>xt~=phz6c1yG#7qWE*F5+u9Z=@B*7cDK==21#gBH~XGBR_iQp;5 z0KeYZ9d_*|SS@-mx@#H{Kt$=$2Rc$`PBKt9A1(Hud=pkH4m&8^p2F5Q*P6pr(A*T& z!Zo@h*TIb-)WOHhMJ2v>@mm(yrn854eL{uPdL8E%%;$eaL5h!JE#Vpo`5rs5;E!QH z?dIZrm)uqIfsYJ+48aX3R1A{#eFEt50MPwZBe=Y|poH-7m^%d&&ogA~2t4r0OH^8` zS{CY`nTwOEYjBvS4uU;Wa$un$-}D7SdBM+$cJx(z5)pk7f7I_^Caa;0=-jUJY=sSm z&fXyprnMtoI;a31k>)u-9bqYWv$G6!6!W=NtM?P0U7-a{&nF8PERR}FERdeg_Z^#^ za151TsZ}hSQAH|Cx!gBvn)f9#JHZ2U?@wO0=iA8DF;M)vV`S?z*a@WbD=91!4_v{ibSh#k( zX?%b3uz|woEU9XW$Y7%2(x$nFf0%=AP9qTteFKSI(yyg^?JZTF}VEh=!IjYAcapUFHlpRc&?V3if7$NL)+xCC6kb7CDrJrNLw$8zgLdl zp-~n~yL*)m=-SV3UtC?B%3ldZ}fEc_~h2Zk^-bK;e2*IoH{5woZ6HDF)p}%)@ zcYDwlP5^TM2*#AdivlsYG~#eTMK@ZB8$c|xwWtazw5QanBib(e$fpS{fu08Ndhwb@ zcuY#~qiv%%q0zezhaSg+DdD&Y+~^ZpPPs7K!fz4|X&oIpqdwd1RbJ5lpR#lApWgVQ z+6fP#fTL~;02kot2tQjZ5`@&dzbci`l2_8XND(yf}~Gu3FJlC>LpT^FhTt zyzW&_puxEJn$3gS&hlxaxUADfCV;DBh_B>m7aAx?c3QW05px`8OG?D^-)>%g^_Cc( zvBQu{3w&p;y^Fy^SwzXnhr=u42MX#sLa7LV61T$rg`)9Ww{8JlWhgD^m|lpMR-to4 zpk413-)&9wNY40Rj3zb)HnC2U*eI|NsPxRY+^8M3ATq1t&d!F47`n3O5#-L8P zy{o;$kLkH4B#$-=1T1#&{)oWTzM3ud8q8AI>%t$}6g+b&^{ctUi}f>P_hX4U;CCQ?EnA( From a5de13cdb94d87c32c7f275d7f5a64ec1abf9249 Mon Sep 17 00:00:00 2001 From: Cerebulon Date: Sat, 20 Jan 2018 01:53:50 +0000 Subject: [PATCH 4/7] Fixes duplicate tea recipe. Also a bunch of extremely minor drink typos. --- .../Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm | 8 ++++---- code/modules/reagents/Chemistry-Recipes.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 8b94502d40..252060053e 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -2486,13 +2486,13 @@ /datum/reagent/ethanol/euphoria name = "Euphoria" id = "euphoria" - description = "Invented by a Eutopian marketing team, this is one of the most expensive cocktails in existance." + description = "Invented by a Eutopian marketing team, this is one of the most expensive cocktails in existence." taste_description = "impossibly rich alcohol" color = "#614126" strength = 9 glass_name = "Euphoria" - glass_desc = "Invented by a Eutopian marketing team, this is one of the most expensive cocktails in existance." + glass_desc = "Invented by a Eutopian marketing team, this is one of the most expensive cocktails in existence." /datum/reagent/ethanol/xanaducannon name = "Xanadu Cannon" @@ -2580,7 +2580,7 @@ /datum/reagent/ethanol/winebrandy name = "Wine Brandy" id = "winebrandy" - description = "An premium spirit made from distilled wine." + description = "A premium spirit made from distilled wine." taste_description = "very sweet dried fruit with many elegant notes" color = "#4C130B" // rgb(76,19,11) strength = 20 @@ -2732,7 +2732,7 @@ color = "#a0692e" // rgb(160, 105, 46) strength = 20 - glass_name = "Whisker Sour" + glass_name = "Whiskey Sour" glass_desc = "A smokey, refreshing lemoned whiskey." /datum/reagent/ethanol/oldfashioned diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index f7fed5fa76..4e172eb89e 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -1863,7 +1863,7 @@ required_reagents = list("tea" = 5, "limejuice" = 1) result_amount = 6 -/datum/chemical_reaction/drinks/limetea +/datum/chemical_reaction/drinks/orangetea name = "Orange Tea" id = "orangetea" result = "orangetea" From a190ec572543c16f563e9af1c29afa0ecf8e83a3 Mon Sep 17 00:00:00 2001 From: mistyLuminescence <32139558+mistyLuminescence@users.noreply.github.com> Date: Sat, 20 Jan 2018 02:11:28 +0000 Subject: [PATCH 5/7] Allows modkits to be created for any item. (#4450) * Adds modular modkits * Adds explorer suit functionality to voidsuit modkits. --- code/game/objects/items/paintkit.dm | 218 +++++++++++++------ code/modules/clothing/suits/miscellaneous.dm | 44 ++-- code/modules/clothing/suits/toggles.dm | 12 +- code/modules/customitems/item_spawning.dm | 23 +- 4 files changed, 191 insertions(+), 106 deletions(-) diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index 78e42f71a8..259a054c16 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -1,15 +1,18 @@ /obj/item/device/kit icon_state = "modkit" icon = 'icons/obj/device.dmi' - var/new_name = "mech" //What is the variant called? - var/new_desc = "A mech." //How is the new mech described? - var/new_icon = "ripley" //What base icon will the new mech use? + w_class = ITEMSIZE_SMALL + var/new_name = "custom item" + var/new_desc = "A custom item." + var/new_icon var/new_icon_file + var/new_icon_override_file var/uses = 1 // Uses before the kit deletes itself. + var/list/allowed_types = list() /obj/item/device/kit/examine() ..() - usr << "It has [uses] [uses>1?"uses":"use"] left." + to_chat(usr, "It has [uses] use\s left.") /obj/item/device/kit/proc/use(var/amt, var/mob/user) uses -= amt @@ -18,6 +21,42 @@ user.drop_item() qdel(src) +/obj/item/device/kit/proc/can_customize(var/obj/item/I) + return is_type_in_list(I, allowed_types) + +/obj/item/device/kit/proc/set_info(var/kit_name, var/kit_desc, var/kit_icon, var/kit_icon_file = CUSTOM_ITEM_OBJ, var/kit_icon_override_file = CUSTOM_ITEM_MOB, var/additional_data) + new_name = kit_name + new_desc = kit_desc + new_icon = kit_icon + new_icon_file = kit_icon_file + new_icon_override_file = kit_icon_override_file + + for(var/path in splittext(additional_data, ", ")) + allowed_types |= text2path(path) + +/obj/item/device/kit/proc/customize(var/obj/item/I, var/mob/user) + if(can_customize(I)) + I.name = new_name ? new_name : I.name + I.desc = new_desc ? new_desc : I.desc + I.icon = new_icon_file ? new_icon_file : I.icon + I.icon_override = new_icon_override_file ? new_icon_override_file : I.icon_override + if(new_icon) + I.icon_state = new_icon + var/obj/item/clothing/under/U = I + if(istype(U)) + U.worn_state = I.icon_state + U.update_rolldown_status() + use(1, user) + +// Generic use +/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/kit)) + var/obj/item/device/kit/K = W + K.customize(src, user) + return + + ..() + // Root hardsuit kit defines. // Icons for modified hardsuits need to be in the proper .dmis because suit cyclers may cock them up. /obj/item/device/kit/suit @@ -25,88 +64,141 @@ desc = "A kit for modifying a voidsuit." uses = 2 var/new_light_overlay - var/new_mob_icon_file + +/obj/item/device/kit/suit/can_customize(var/obj/item/I) + return istype(I, /obj/item/clothing/head/helmet/space/void) || istype(I, /obj/item/clothing/suit/space/void) || istype(I, /obj/item/clothing/suit/storage/hooded/explorer) + +/obj/item/device/kit/suit/set_info(var/kit_name, var/kit_desc, var/kit_icon, var/kit_icon_file = CUSTOM_ITEM_OBJ, var/kit_icon_override_file = CUSTOM_ITEM_MOB, var/additional_data) + ..() + + new_light_overlay = additional_data + + +/obj/item/device/kit/suit/customize(var/obj/item/I, var/mob/user) + if(can_customize(I)) + if(istype(I, /obj/item/clothing/head/helmet/space/void)) + var/obj/item/clothing/head/helmet/space/void/helmet = I + helmet.name = "[new_name] suit helmet" + helmet.desc = new_desc + helmet.icon_state = "[new_icon]_helmet" + helmet.item_state = "[new_icon]_helmet" + if(new_icon_file) + helmet.icon = new_icon_file + if(new_icon_override_file) + helmet.icon_override = new_icon_override_file + if(new_light_overlay) + helmet.light_overlay = new_light_overlay + to_chat(user, "You set about modifying the helmet into [helmet].") + var/mob/living/carbon/human/H = user + if(istype(H)) + helmet.species_restricted = list(H.species.get_bodytype(H)) + else if(istype(I, /obj/item/clothing/suit/storage/hooded)) + var/obj/item/clothing/suit/storage/hooded/suit = I + suit.name = "[new_name] suit" + suit.desc = new_desc + suit.icon_state = "[new_icon]_suit" + suit.toggleicon = "[new_icon]_suit" + suit.item_state = "[new_icon]_suit" + var/obj/item/clothing/head/hood/S = suit.hood + S.icon_state = "[new_icon]_helmet" + S.item_state = "[new_icon]_helmet" + if(new_icon_file) + suit.icon = new_icon_file + S.icon = new_icon_file + if(new_icon_override_file) + suit.icon_override = new_icon_override_file + S.icon_override = new_icon_override_file + to_chat(user, "You set about modifying the suit into [suit].") + var/mob/living/carbon/human/H = user + if(istype(H)) + suit.species_restricted = list(H.species.get_bodytype(H)) + else + var/obj/item/clothing/suit/space/void/suit = I + suit.name = "[new_name] voidsuit" + suit.desc = new_desc + suit.icon_state = "[new_icon]_suit" + suit.item_state = "[new_icon]_suit" + if(new_icon_file) + suit.icon = new_icon_file + if(new_icon_override_file) + suit.icon_override = new_icon_override_file + to_chat(user, "You set about modifying the suit into [suit].") + var/mob/living/carbon/human/H = user + if(istype(H)) + suit.species_restricted = list(H.species.get_bodytype(H)) + use(1,user) /obj/item/clothing/head/helmet/space/void/attackby(var/obj/item/O, var/mob/user) if(istype(O,/obj/item/device/kit/suit)) var/obj/item/device/kit/suit/kit = O - name = "[kit.new_name] suit helmet" - desc = kit.new_desc - icon_state = "[kit.new_icon]_helmet" - item_state = "[kit.new_icon]_helmet" - if(kit.new_icon_file) - icon = kit.new_icon_file - if(kit.new_mob_icon_file) - icon_override = kit.new_mob_icon_file - if(kit.new_light_overlay) - light_overlay = kit.new_light_overlay - user << "You set about modifying the helmet into [src]." - var/mob/living/carbon/human/H = user - if(istype(H)) - species_restricted = list(H.species.get_bodytype()) - kit.use(1,user) - return 1 + kit.customize(src, user) + return return ..() /obj/item/clothing/suit/space/void/attackby(var/obj/item/O, var/mob/user) if(istype(O,/obj/item/device/kit/suit)) var/obj/item/device/kit/suit/kit = O - name = "[kit.new_name] voidsuit" - desc = kit.new_desc - icon_state = "[kit.new_icon]_suit" - item_state = "[kit.new_icon]_suit" - if(kit.new_icon_file) - icon = kit.new_icon_file - if(kit.new_mob_icon_file) - icon_override = kit.new_mob_icon_file - user << "You set about modifying the suit into [src]." - var/mob/living/carbon/human/H = user - if(istype(H)) - species_restricted = list(H.species.get_bodytype()) - kit.use(1,user) - return 1 + kit.customize(src, user) + return return ..() +/obj/item/clothing/suit/storage/hooded/attackby(var/obj/item/O, var/mob/user) + if(istype(O,/obj/item/device/kit/suit)) + var/obj/item/device/kit/suit/kit = O + kit.customize(src, user) + return + return ..() + + /obj/item/device/kit/paint name = "mecha customisation kit" desc = "A kit containing all the needed tools and parts to repaint a mech." var/removable = null - var/list/allowed_types = list() + +/obj/item/device/kit/paint/can_customize(var/obj/mecha/M) + if(!istype(M)) + return 0 + + for(var/type in allowed_types) + if(type == M.initial_icon) + return 1 + +/obj/item/device/kit/paint/set_info(var/kit_name, var/kit_desc, var/kit_icon, var/kit_icon_file = CUSTOM_ITEM_OBJ, var/kit_icon_override_file = CUSTOM_ITEM_MOB, var/additional_data) + ..() + + allowed_types = splittext(additional_data, ", ") + /obj/item/device/kit/paint/examine() ..() - usr << "This kit will convert an exosuit into: [new_name]." - usr << "This kit can be used on the following exosuit models:" + to_chat(usr, "This kit will convert an exosuit into: [new_name].") + to_chat(usr, "This kit can be used on the following exosuit models:") for(var/exotype in allowed_types) - usr << "- [capitalize(exotype)]" + to_chat(usr, "- [capitalize(exotype)]") + +/obj/item/device/kit/paint/customize(var/obj/mecha/M, var/mob/user) + if(!can_customize(M)) + to_chat(user, "That kit isn't meant for use on this class of exosuit.") + return + + if(M.occupant) + to_chat(user, "You can't customize a mech while someone is piloting it - that would be unsafe!") + return + + user.visible_message("[user] opens [src] and spends some quality time customising [M].") + M.name = new_name + M.desc = new_desc + M.initial_icon = new_icon + if(new_icon_file) + M.icon = new_icon_file + M.reset_icon() + use(1, user) /obj/mecha/attackby(var/obj/item/weapon/W, var/mob/user) if(istype(W, /obj/item/device/kit/paint)) - if(occupant) - user << "You can't customize a mech while someone is piloting it - that would be unsafe!" - return - var/obj/item/device/kit/paint/P = W - var/found = null - - for(var/type in P.allowed_types) - if(type==src.initial_icon) - found = 1 - break - - if(!found) - user << "That kit isn't meant for use on this class of exosuit." - return - - user.visible_message("[user] opens [P] and spends some quality time customising [src].") - src.name = P.new_name - src.desc = P.new_desc - src.initial_icon = P.new_icon - if(P.new_icon_file) - src.icon = P.new_icon_file - src.reset_icon() - P.use(1, user) - return 1 + P.customize(src, user) + return else return ..() diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 4a6326a424..9b88496119 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -665,10 +665,10 @@ obj/item/clothing/suit/storage/toggle/peacoat min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 10, rad = 0) hooded = 1 - hoodtype = /obj/item/clothing/head/winterhood + hoodtype = /obj/item/clothing/head/hood/winter allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency/oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) -/obj/item/clothing/head/winterhood +/obj/item/clothing/head/hood/winter name = "winter hood" desc = "A hood attached to a heavy winter jacket." icon_state = "generic_hood" @@ -682,9 +682,9 @@ obj/item/clothing/suit/storage/toggle/peacoat icon_state = "coatcaptain" item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain") armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) - hoodtype = /obj/item/clothing/head/winterhood/captain + hoodtype = /obj/item/clothing/head/hood/winter/captain -/obj/item/clothing/head/winterhood/captain +/obj/item/clothing/head/hood/winter/captain name = "colony director's winter hood" armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) @@ -693,9 +693,9 @@ obj/item/clothing/suit/storage/toggle/peacoat icon_state = "coatsecurity" item_state_slots = list(slot_r_hand_str = "coatsecurity", slot_l_hand_str = "coatsecurity") armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0) - hoodtype = /obj/item/clothing/head/winterhood/security + hoodtype = /obj/item/clothing/head/hood/winter/security -/obj/item/clothing/head/winterhood/security +/obj/item/clothing/head/hood/winter/security name = "security winter hood" armor = list(melee = 25, bullet = 20, laser = 20, energy = 15, bomb = 20, bio = 0, rad = 0) @@ -704,9 +704,9 @@ obj/item/clothing/suit/storage/toggle/peacoat icon_state = "coatmedical" item_state_slots = list(slot_r_hand_str = "coatmedical", slot_l_hand_str = "coatmedical") armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0) - hoodtype = /obj/item/clothing/head/winterhood/medical + hoodtype = /obj/item/clothing/head/hood/winter/medical -/obj/item/clothing/head/winterhood/medical +/obj/item/clothing/head/hood/winter/medical name = "medical winter hood" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 50, rad = 0) @@ -715,9 +715,9 @@ obj/item/clothing/suit/storage/toggle/peacoat icon_state = "coatscience" item_state_slots = list(slot_r_hand_str = "coatscience", slot_l_hand_str = "coatscience") armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) - hoodtype = /obj/item/clothing/head/winterhood/science + hoodtype = /obj/item/clothing/head/hood/winter/science -/obj/item/clothing/head/winterhood/science +/obj/item/clothing/head/hood/winter/science name = "science winter hood" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 10, bio = 0, rad = 0) @@ -726,9 +726,9 @@ obj/item/clothing/suit/storage/toggle/peacoat icon_state = "coatengineer" item_state_slots = list(slot_r_hand_str = "coatengineer", slot_l_hand_str = "coatengineer") armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) - hoodtype = /obj/item/clothing/head/winterhood/engineering + hoodtype = /obj/item/clothing/head/hood/winter/engineering -/obj/item/clothing/head/winterhood/engineering +/obj/item/clothing/head/hood/winter/engineering name = "engineering winter hood" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 20) @@ -736,27 +736,27 @@ obj/item/clothing/suit/storage/toggle/peacoat name = "atmospherics winter coat" icon_state = "coatatmos" item_state_slots = list(slot_r_hand_str = "coatatmos", slot_l_hand_str = "coatatmos") - hoodtype = /obj/item/clothing/head/winterhood/engineering/atmos + hoodtype = /obj/item/clothing/head/hood/winter/engineering/atmos -/obj/item/clothing/head/winterhood/engineering/atmos +/obj/item/clothing/head/hood/winter/engineering/atmos name = "atmospherics winter hood" /obj/item/clothing/suit/storage/hooded/wintercoat/hydro name = "hydroponics winter coat" icon_state = "coathydro" item_state_slots = list(slot_r_hand_str = "coathydro", slot_l_hand_str = "coathydro") - hoodtype = /obj/item/clothing/head/winterhood/hydro + hoodtype = /obj/item/clothing/head/hood/winter/hydro -/obj/item/clothing/head/winterhood/hydro +/obj/item/clothing/head/hood/winter/hydro name = "hydroponics winter hood" /obj/item/clothing/suit/storage/hooded/wintercoat/cargo name = "cargo winter coat" icon_state = "coatcargo" item_state_slots = list(slot_r_hand_str = "coatcargo", slot_l_hand_str = "coatcargo") - hoodtype = /obj/item/clothing/head/winterhood/cargo + hoodtype = /obj/item/clothing/head/hood/winter/cargo -/obj/item/clothing/head/winterhood/cargo +/obj/item/clothing/head/hood/winter/cargo name = "cargo winter hood" /obj/item/clothing/suit/storage/hooded/wintercoat/miner @@ -764,9 +764,9 @@ obj/item/clothing/suit/storage/toggle/peacoat icon_state = "coatminer" item_state_slots = list(slot_r_hand_str = "coatminer", slot_l_hand_str = "coatminer") armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - hoodtype = /obj/item/clothing/head/winterhood/miner + hoodtype = /obj/item/clothing/head/hood/winter/miner -/obj/item/clothing/head/winterhood/miner +/obj/item/clothing/head/hood/winter/miner name = "mining winter hood" armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) @@ -780,7 +780,7 @@ obj/item/clothing/suit/storage/toggle/peacoat min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE cold_protection = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS hooded = TRUE - hoodtype = /obj/item/clothing/head/explorer + hoodtype = /obj/item/clothing/head/hood/explorer siemens_coefficient = 0.9 armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50) // Inferior to sec vests in bullet/laser but better for environmental protection. allowed = list( @@ -794,7 +794,7 @@ obj/item/clothing/suit/storage/toggle/peacoat /obj/item/weapon/pickaxe ) -/obj/item/clothing/head/explorer +/obj/item/clothing/head/hood/explorer name = "explorer hood" desc = "An armoured hood for exploring harsh environments." icon_state = "explorer" diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 81b433fa27..c3c9a790b6 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -5,9 +5,11 @@ var/hoodtype = null //so the chaplain hoodie or other hoodies can override this var/suittoggled = 0 var/hooded = 0 + var/toggleicon action_button_name = "Toggle Hood" /obj/item/clothing/suit/storage/hooded/New() + toggleicon = "[initial(icon_state)]" MakeHood() ..() @@ -17,7 +19,7 @@ /obj/item/clothing/suit/storage/hooded/proc/MakeHood() if(!hood) - var/obj/item/clothing/head/winterhood/W = new hoodtype(src) + var/obj/item/clothing/head/hood/winter/W = new hoodtype(src) hood = W /obj/item/clothing/suit/storage/hooded/ui_action_click() @@ -29,7 +31,7 @@ ..() /obj/item/clothing/suit/storage/hooded/proc/RemoveHood() - icon_state = "[initial(icon_state)]" + icon_state = toggleicon suittoggled = 0 hood.canremove = TRUE // This shouldn't matter anyways but just incase. if(ishuman(hood.loc)) @@ -46,16 +48,16 @@ if(ishuman(loc)) var/mob/living/carbon/human/H = src.loc if(H.wear_suit != src) - H << "You must be wearing [src] to put up the hood!" + to_chat(H, "You must be wearing [src] to put up the hood!") return if(H.head) - H << "You're already wearing something on your head!" + to_chat(H, "You're already wearing something on your head!") return else H.equip_to_slot_if_possible(hood,slot_head,0,0,1) suittoggled = 1 hood.canremove = FALSE - icon_state = "[initial(icon_state)]_t" + icon_state = "[toggleicon]_t" H.update_inv_wear_suit() else RemoveHood() \ No newline at end of file diff --git a/code/modules/customitems/item_spawning.dm b/code/modules/customitems/item_spawning.dm index ef2333a0af..b87183c385 100644 --- a/code/modules/customitems/item_spawning.dm +++ b/code/modules/customitems/item_spawning.dm @@ -9,11 +9,13 @@ // On-mob icons must be in CUSTOM_ITEM_MOB with state name [item_icon]. // Inhands must be in CUSTOM_ITEM_MOB as [icon_state]_l and [icon_state]_r. -// Kits must have mech icons in CUSTOM_ITEM_OBJ under [kit_icon]. +// Mech kits must have mech icons in CUSTOM_ITEM_OBJ under [kit_icon]. // Broken must be [kit_icon]-broken and open must be [kit_icon]-open. -// Kits must also have hardsuit icons in CUSTOM_ITEM_MOB as [kit_icon]_suit -// and [kit_icon]_helmet, and in CUSTOM_ITEM_OBJ as [kit_icon]. +// Voidsuits and hooded kits must also have hardsuit icons in CUSTOM_ITEM_MOB as [kit_icon]_suit +// and [kit_icon]_helmet, and in CUSTOM_ITEM_OBJ as [kit_icon]_suit. +// If hooded, have [kit_icon]_suit_t in both files for the hood-up version. +// If not using the default overlay, have [kit_icon]_light in both files for custom light overlays. /var/list/custom_items = list() @@ -30,7 +32,7 @@ var/kit_name var/kit_desc var/kit_icon - var/additional_data + var/additional_data //for modular modkits, item path; for mech modkits, allowed mechs; for voidsuit modkits, light overlays /datum/custom_item/proc/spawn_item(var/newloc) var/obj/item/citem = new item_path(newloc) @@ -69,18 +71,7 @@ // Kits are dumb so this is going to have to be hardcoded/snowflake. if(istype(item, /obj/item/device/kit)) var/obj/item/device/kit/K = item - K.new_name = kit_name - K.new_desc = kit_desc - K.new_icon = kit_icon - K.new_icon_file = CUSTOM_ITEM_OBJ - if(istype(item, /obj/item/device/kit/paint)) - var/obj/item/device/kit/paint/kit = item - kit.allowed_types = splittext(additional_data, ", ") - else if(istype(item, /obj/item/device/kit/suit)) - var/obj/item/device/kit/suit/kit = item - kit.new_light_overlay = additional_data - kit.new_mob_icon_file = CUSTOM_ITEM_MOB - + K.set_info(kit_name, kit_desc, kit_icon, additional_data = additional_data) return item /datum/custom_item/proc/apply_inherit_inhands(var/obj/item/item) From ab87edeae90f4b1c5221b1496b64c44736999935 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 19 Jan 2018 23:21:55 -0500 Subject: [PATCH 6/7] Fix construction of HE pipes, Vents, and Scrubbers Plus qdel issues. The initialize() routines of HE pipes, vents an scrubbers need to be atmos_init() after all. If you register yourself with radio controller you need to de-register yourself too. --- .../components/binary_devices/dp_vent_pump.dm | 4 ++++ .../components/binary_devices/passive_gate.dm | 4 ++++ code/ATMOSPHERICS/components/binary_devices/pump.dm | 4 ++++ code/ATMOSPHERICS/components/trinary_devices/filter.dm | 4 ++++ code/ATMOSPHERICS/components/tvalve.dm | 8 ++++++++ code/ATMOSPHERICS/components/unary/outlet_injector.dm | 4 ++++ code/ATMOSPHERICS/components/unary/vent_pump.dm | 2 +- code/ATMOSPHERICS/components/unary/vent_scrubber.dm | 2 +- code/ATMOSPHERICS/components/valve.dm | 4 ++++ code/ATMOSPHERICS/datum_pipeline.dm | 3 ++- code/ATMOSPHERICS/he_pipes.dm | 4 ++-- html/changelogs/Leshana-he-pipes-fix.yml | 4 ++++ 12 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 html/changelogs/Leshana-he-pipes-fix.yml diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 66468a516c..5c5ff50299 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -47,6 +47,10 @@ air2.volume = ATMOS_DEFAULT_VOLUME_PUMP icon = null +/obj/machinery/atmospherics/binary/dp_vent_pump/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/binary/dp_vent_pump/high_volume name = "Large Dual Port Air Vent" diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 4bce44e0b0..4c1863b133 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -29,6 +29,10 @@ air1.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 air2.volume = ATMOS_DEFAULT_VOLUME_PUMP * 2.5 +/obj/machinery/atmospherics/binary/passive_gate/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/binary/passive_gate/update_icon() icon_state = (unlocked && flowing)? "on" : "off" diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index ac5a00e46c..cddd9f9527 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -39,6 +39,10 @@ Thus, the two variables affect pump operation are set in New(): air1.volume = ATMOS_DEFAULT_VOLUME_PUMP air2.volume = ATMOS_DEFAULT_VOLUME_PUMP +/obj/machinery/atmospherics/binary/pump/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/binary/pump/on icon_state = "map_on" use_power = 1 diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index bc9a8d77ee..951e5a03de 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -54,6 +54,10 @@ air2.volume = ATMOS_DEFAULT_VOLUME_FILTER air3.volume = ATMOS_DEFAULT_VOLUME_FILTER +/obj/machinery/atmospherics/trinary/atmos_filter/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/trinary/atmos_filter/update_icon() if(istype(src, /obj/machinery/atmospherics/trinary/atmos_filter/m_filter)) icon_state = "m" diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index e5f0eaaa89..09d2d5e424 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -277,6 +277,10 @@ var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/tvalve/digital/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/tvalve/digital/bypass icon_state = "map_tvalve1" state = 1 @@ -415,6 +419,10 @@ var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/tvalve/mirrored/digital/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/tvalve/mirrored/digital/bypass icon_state = "map_tvalvem1" state = 1 diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 3596d0e8cf..84780da425 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -28,6 +28,10 @@ ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. +/obj/machinery/atmospherics/unary/outlet_injector/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/unary/outlet_injector/update_icon() if(!powered()) icon_state = "off" diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 67476b7f42..a45d3f0860 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -256,7 +256,7 @@ return 1 -/obj/machinery/atmospherics/unary/vent_pump/initialize() +/obj/machinery/atmospherics/unary/vent_pump/atmos_init() ..() //some vents work his own special way diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 0852ea7f74..ad78f5a1f4 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -119,7 +119,7 @@ return 1 -/obj/machinery/atmospherics/unary/vent_scrubber/initialize() +/obj/machinery/atmospherics/unary/vent_scrubber/atmos_init() ..() radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index c95135f889..3cee872f8b 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -229,6 +229,10 @@ var/id = null var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/valve/digital/Destroy() + unregister_radio(src, frequency) + . = ..() + /obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) return src.attack_hand(user) diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 10cd0bec93..74cef7a172 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -16,7 +16,8 @@ datum/pipeline temporarily_store_air() for(var/obj/machinery/atmospherics/pipe/P in members) P.parent = null - + members = null + edges = null . = ..() proc/process()//This use to be called called from the pipe networks diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index aa474a8572..bff838cfdd 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -26,7 +26,7 @@ ..() initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/atmos_init() normalize_dir() var/node1_dir var/node2_dir @@ -135,7 +135,7 @@ initialize_directions_he = WEST -/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/atmos_init() for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) if(target.initialize_directions & get_dir(target,src)) node1 = target diff --git a/html/changelogs/Leshana-he-pipes-fix.yml b/html/changelogs/Leshana-he-pipes-fix.yml new file mode 100644 index 0000000000..e35c1ba33b --- /dev/null +++ b/html/changelogs/Leshana-he-pipes-fix.yml @@ -0,0 +1,4 @@ +author: Leshana +delete-after: True +changes: + - bugfix: "Construction of heat exchange pipes, vents, and scrubbers now works properly again." From 17accf2e28ce7c05fcbde0e5bb5ecfa35053f1e1 Mon Sep 17 00:00:00 2001 From: Atermonera Date: Sat, 20 Jan 2018 11:28:51 -0800 Subject: [PATCH 7/7] Band-aids three runtimes (#4591) * Runtime in dna_modifier.dm,330: Cannot read null.occupant * Runtime in Chemistry-Reagents.dm,47: Cannot execute null.remove reagent(). * Runtime in blood.dm,182: Division by zero * Compiled with the right map this time --- code/game/dna/dna_modifier.dm | 2 +- code/modules/organs/blood.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index e728ab8e50..0dc9b72be7 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -327,7 +327,7 @@ */ /obj/machinery/computer/scan_consolenew/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) - if(user == connected.occupant || user.stat) + if(!connected || user == connected.occupant || user.stat) return // this is the data which will be sent to the ui diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index a3f0d4bba8..9b0bef6aaa 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -141,7 +141,7 @@ var/const/CE_STABLE_THRESHOLD = 0.5 //Bleeding out var/blood_max = 0 - var/blood_loss_divisor = 30 //lower factor = more blood loss + var/blood_loss_divisor = 30.01 //lower factor = more blood loss // Some species bleed out differently blood_loss_divisor /= species.bloodloss_rate diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 6d07fcc159..fe480ed574 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -44,7 +44,8 @@ var/list/glass_special = null // null equivalent to list() /datum/reagent/proc/remove_self(var/amount) // Shortcut - holder.remove_reagent(id, amount) + if(holder) + holder.remove_reagent(id, amount) // This doesn't apply to skin contact - this is for, e.g. extinguishers and sprays. The difference is that reagent is not directly on the mob's skin - it might just be on their clothing. /datum/reagent/proc/touch_mob(var/mob/M, var/amount)