From 38bae6325160bbd36141cc8ae2b964bea4018b34 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Fri, 6 Mar 2015 18:52:04 +0000 Subject: [PATCH 01/12] Added cybernetic implants and surgery. --- code/datums/hud.dm | 2 + code/modules/mob/mob_defines.dm | 3 +- .../modules/surgery/eye_cybernetic_implant.dm | 31 +++++++++++ .../surgery/organs/cybernetic_implants.dm | 51 ++++++++++++++++++ icons/obj/surgery.dmi | Bin 13681 -> 11902 bytes tgstation.dme | 2 + 6 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 code/modules/surgery/eye_cybernetic_implant.dm create mode 100644 code/modules/surgery/organs/cybernetic_implants.dm diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 39d63400ddb..14e79c51f35 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -20,6 +20,8 @@ var/datum/atom_hud/huds = list( \ var/list/hud_icons = list() //these will be the indexes for the atom's hud_list /datum/atom_hud/proc/remove_hud_from(var/mob/M) + if(locate(src,M.permanent_huds)) + return for(var/atom/A in hudatoms) remove_from_single_hud(M, A) hudusers -= M diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6a4aa3f319f..ab645c61223 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -161,4 +161,5 @@ var/atom/movable/remote_control //Calls relaymove() to whatever it is var/turf/listed_turf = null //the current turf being examined in the stat panel - var/last_movement = 0 // Last world.time the mob actually moved of its own accord. \ No newline at end of file + var/last_movement = 0 // Last world.time the mob actually moved of its own accord. + var/permanent_huds = new /list() \ No newline at end of file diff --git a/code/modules/surgery/eye_cybernetic_implant.dm b/code/modules/surgery/eye_cybernetic_implant.dm new file mode 100644 index 00000000000..31f5e74c552 --- /dev/null +++ b/code/modules/surgery/eye_cybernetic_implant.dm @@ -0,0 +1,31 @@ +/datum/surgery/eye_cybernetic_implant + name = "eye cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + location = "eyes" + +/datum/surgery_step/cybernetic_implant + accept_any_item = 1 + time = 32 + +/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(istype(tool,/obj/item/organ/cybernetic_implant)) + user.visible_message("[user] begins to implant [target] with [tool].") + +/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) + if(tool) + if(!istype(tool, /obj/item/organ/cybernetic_implant/eyes)) + user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") + return 0 + else if(locate(/obj/item/organ/cybernetic_implant/eyes,target.internal_organs)) + user.visible_message("[user] can't seem to add any more implants into [target].") + return 0 + else + user.visible_message("[user] inserts [tool] into [target]'s [target_zone]!") + user.drop_item() + target.internal_organs += tool + tool.loc = target + + var/obj/item/organ/cybernetic_implant/implant = tool + implant.owner = target + implant.function() + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm new file mode 100644 index 00000000000..eee16eaac1e --- /dev/null +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -0,0 +1,51 @@ +/obj/item/organ/cybernetic_implant + name = "cybernetic implant" + desc = "a state-of-the-art implant that improves a baseline's functionality" + var/mob/owner = null + +/obj/item/organ/cybernetic_implant/proc/function() + return + +/obj/item/organ/cybernetic_implant/eyes + name = "cybernetic eyes" + desc = "artificial photoreceptors with specialized functionality" + icon_state = "hudeye" + var/eye_color = "fff" + +/obj/item/organ/cybernetic_implant/eyes/proc/update_eye_color() + if(istype(owner,/mob/living/carbon/human)) + var/mob/living/carbon/human/HMN = owner + HMN.eye_color = eye_color + HMN.regenerate_icons() + +/obj/item/organ/cybernetic_implant/eyes/medical_hud + name = "medical hud implant" + desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." + icon_state = "hudeye" + eye_color = "0ff" + +/obj/item/organ/cybernetic_implant/eyes/medical_hud/function() + if(!owner) + return + + var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] + H.add_hud_to(owner) + owner.permanent_huds |= H + + update_eye_color() + +/obj/item/organ/cybernetic_implant/eyes/security_hud + name = "security hud implant" + desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." + icon_state = "hudeye" + eye_color = "b00" + +/obj/item/organ/cybernetic_implant/eyes/security_hud/function() + if(!owner) + return + + var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] + H.add_hud_to(owner) + owner.permanent_huds |= H + + update_eye_color() \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 28390abff25c460ed6fd3a953c3d46ccdbd18091..ac54bf1759a06717efd82da9f162e47f5f532d26 100644 GIT binary patch literal 11902 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 OASp3<(Q;wK@BbGNY#u@Y diff --git a/tgstation.dme b/tgstation.dme index 89df2df7e99..d6acffeeab7 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1382,6 +1382,7 @@ #include "code\modules\surgery\brain_removal.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" +#include "code\modules\surgery\eye_cybernetic_implant.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gender_reassignment.dm" #include "code\modules\surgery\generic_steps.dm" @@ -1396,6 +1397,7 @@ #include "code\modules\surgery\tools.dm" #include "code\modules\surgery\xenomorph_removal.dm" #include "code\modules\surgery\organs\augments.dm" +#include "code\modules\surgery\organs\cybernetic_implants.dm" #include "code\modules\surgery\organs\helpers.dm" #include "code\modules\surgery\organs\organ.dm" #include "code\modules\telesci\bscrystal.dm" From b1e340b19b801e37cc4a85a1659df4431f79051c Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sun, 8 Mar 2015 17:25:05 +0000 Subject: [PATCH 02/12] Added X-ray implant, implant icon, touched up surgery. --- code/datums/mutations.dm | 2 + .../mob/living/carbon/human/species.dm | 5 ++- code/modules/mob/living/carbon/life.dm | 9 ++-- code/modules/mob/mob_defines.dm | 3 +- .../modules/surgery/eye_cybernetic_implant.dm | 16 +++---- .../surgery/organs/cybernetic_implants.dm | 39 ++++++++++++++++-- icons/obj/surgery.dmi | Bin 11902 -> 11977 bytes 7 files changed, 55 insertions(+), 19 deletions(-) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 566adcedc03..0b17f8d3e21 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -179,6 +179,8 @@ /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return + if(locate(SEE_MOBS|SEE_OBJS|SEE_TURFS,owner.permanent_sight_flags)) + return owner.see_in_dark = initial(owner.see_in_dark) owner.sight = initial(owner.sight) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 61746a85d4e..edfe06f353c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -510,10 +510,11 @@ H.see_in_dark = 8 if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO else - H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,H.permanent_sight_flags)) + H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) + H.see_in_dark = darksight var/see_temp = H.see_invisible H.see_invisible = invis_sight - H.see_in_dark = darksight if(H.seer) H.see_invisible = SEE_INVISIBLE_OBSERVER diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b4181b590a0..852eee42628 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -561,10 +561,11 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO else - sight &= ~SEE_TURFS - sight &= ~SEE_MOBS - sight &= ~SEE_OBJS - see_in_dark = 2 + if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,permanent_sight_flags)) + sight &= ~SEE_TURFS + sight &= ~SEE_MOBS + sight &= ~SEE_OBJS + see_in_dark = 2 see_invisible = SEE_INVISIBLE_LIVING if(see_override) see_invisible = see_override diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index fc400cc87f6..39bced45333 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -157,4 +157,5 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel var/last_movement = 0 // Last world.time the mob actually moved of its own accord. - var/permanent_huds = new /list() + var/permanent_huds = new /list() //any HUDs in this list will be ignored by HUD removing procs + var/permanent_sight_flags = new /list() //any sight flags in this list will be ignored by removing procs \ No newline at end of file diff --git a/code/modules/surgery/eye_cybernetic_implant.dm b/code/modules/surgery/eye_cybernetic_implant.dm index 31f5e74c552..f9d1367753a 100644 --- a/code/modules/surgery/eye_cybernetic_implant.dm +++ b/code/modules/surgery/eye_cybernetic_implant.dm @@ -8,8 +8,7 @@ time = 32 /datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(istype(tool,/obj/item/organ/cybernetic_implant)) - user.visible_message("[user] begins to implant [target] with [tool].") + user.visible_message("[user] begins to implant [target] with [tool].") /datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(tool) @@ -17,15 +16,16 @@ user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") return 0 else if(locate(/obj/item/organ/cybernetic_implant/eyes,target.internal_organs)) - user.visible_message("[user] can't seem to add any more implants into [target].") - return 0 + user.visible_message("[user] can't seem to implant anything else into [target]'s eyes.") + return 1 else user.visible_message("[user] inserts [tool] into [target]'s [target_zone]!") - user.drop_item() - target.internal_organs += tool - tool.loc = target - var/obj/item/organ/cybernetic_implant/implant = tool + var/obj/item/organ/cybernetic_implant/eyes/implant = tool implant.owner = target implant.function() + target.internal_organs |= implant + user.drop_item() + implant.loc = target + return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index eee16eaac1e..79d07c5350b 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -3,14 +3,26 @@ desc = "a state-of-the-art implant that improves a baseline's functionality" var/mob/owner = null +/obj/item/organ/cybernetic_implant/New(var/mob/M = null) + if(M) + owner = M + return ..() + /obj/item/organ/cybernetic_implant/proc/function() return /obj/item/organ/cybernetic_implant/eyes name = "cybernetic eyes" desc = "artificial photoreceptors with specialized functionality" - icon_state = "hudeye" + icon_state = "eye_implant" var/eye_color = "fff" + var/implant_color = "#FFFFFF" + +/obj/item/organ/cybernetic_implant/eyes/New() + var/icon/overlay = new /icon('icons/obj/surgery.dmi',"eye_implant_overlay") + overlay.ColorTone(implant_color) + overlays |= overlay + ..() /obj/item/organ/cybernetic_implant/eyes/proc/update_eye_color() if(istype(owner,/mob/living/carbon/human)) @@ -21,8 +33,9 @@ /obj/item/organ/cybernetic_implant/eyes/medical_hud name = "medical hud implant" desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." - icon_state = "hudeye" + icon_state = "eye_implant" eye_color = "0ff" + implant_color = "#00FFFF" /obj/item/organ/cybernetic_implant/eyes/medical_hud/function() if(!owner) @@ -37,8 +50,9 @@ /obj/item/organ/cybernetic_implant/eyes/security_hud name = "security hud implant" desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." - icon_state = "hudeye" - eye_color = "b00" + icon_state = "eye_implant" + eye_color = "d00" + implant_color = "#CC0000" /obj/item/organ/cybernetic_implant/eyes/security_hud/function() if(!owner) @@ -48,4 +62,21 @@ H.add_hud_to(owner) owner.permanent_huds |= H + update_eye_color() + +/obj/item/organ/cybernetic_implant/eyes/xray + name = "xray implant" + desc = "These cybernetic eyes will enhance your vision with X-Ray. Blinking is futile." + icon_state = "eye_implant" + eye_color = "000" + implant_color = "#000000" + +/obj/item/organ/cybernetic_implant/eyes/xray/function() + if(!owner) + return + + owner.sight |= SEE_MOBS|SEE_OBJS|SEE_TURFS + owner.see_in_dark = 8 + owner.permanent_sight_flags |= SEE_MOBS|SEE_OBJS|SEE_TURFS + update_eye_color() \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index ac54bf1759a06717efd82da9f162e47f5f532d26..40cbe114df7855e28d4aada8805e483a2c11f556 100644 GIT binary patch literal 11977 zcma)ibyOU|w`LFS4ncyuB|vZp5FCO-kl^m_76vD{LxM{nSkU0^65QQA1b5r!_ul@o z=e*ssbIwek?&+$!Rrh}1m8!2w3R37O#3%p&pvy>$tAN+FmoE|m_)E-cwGIFfPA@f0 z7jaW(V<$@o7fX9P0PskUn(DCYWJ3eSoX_zIbPS1Mk7kC{I31z-Kjk*L<0kT*&`SN< zU>AA~`x|H{A~NP=l20n11=F+n$o?ep-s9zjEDx0w*{y^J64%-nIBg-)U&|2S1rQT7 zbg?OGrVe_ID0TI!z2B6+J}o~yq3W(aNDZn?=q`5QEMQ?^5-gOCl?l4YCbBQC{2TaX z%{jb=423D-t>6uYm^BgoV6kGt8eeQHM3Q`Hia3ydnO`*7_26FRmS$^4Eg1&v`rfMA zOEYv*eEjY$R|n=rB_?nD^zo++I9;O_J0VGvlIwN72E2QScaA88m%EP!i!QVnHy0^doljFD&Vs4-B}6v1Pmz-{ z06+oAh<{M?NI%N()Kt~z4E1{j9~hAP2{ji_jo?)x3{~!A_d?}DxH@UdRf)Plw5Ba9 zibda-XqShYJn7|wnFT9rZG6_`o+1GmT@mhAI+~@Z0UxyBa41;@Zl92N5RhU;;y-S9 zW`%}s+3hYZ-LF)yb|D3eDly>MRjl#D;0;Eg;m3-u$42W&K_}eQe}z*3YX=7*@aKhW zI(?zJ@6|+ba~KC+o;&aSQMIje*GC&q2{P`BKEitaTBnN*O$>=ryVj;sPFgzlaB~ii z7Hp8sH?Z^PTPS6w9abb+fupasX046ZQB9HRd^uVd+iw{Ec2Ner_*$~G+#r;n^k_-w zCfn8u936XxSYO3$QoRxav2y!|M(Y5ePsmpUNm)}<(*;f`ubfTK**we$q!`SRNHeiK8 zE+ohyEG%p~UuF8+^Y)g&RZE3$IQ#&y8aEc-=mg8X^xRA`5yu3+vjuIDLcJDP#KR%|Y zr}H@%s8C@2Br};Tl&{uo^=Z(dz|us5gQ;!|jf|SlhaNDJN2oq$+P=a3-5qeNO8i4f zMkeKAg{+Uve!CbcYFo&c-SfF z8hE!IgvH_ZSF_q86A1%D{e5Yj&3xxiKl|{4+Qll<2=&=j7C5z(jd*keq-j&zMJT>Zsae04H6* zJ^JEs788?PNL=+37#QN9*6Wml~Xl6IsC}e-Wnf^H|V80{uI{;cwmQ!TYc|Iy8}Q8C=rc zXyQ&zPA$(1M&5O=_g2v@-G?ZP7J1&h!GLlw9~>N@0Am-cH1IZ>^JnX;yRb?tVe45^ zggUJ!u7s%cw~1(qo;3dcNq&DySuj+2fWlbG=QLmP{knuCwFs|9=?Ay%Rw7Nq70Jz#_?nL zcmD9F5DV@39Q0C;zwCj5fdh~C*Xw`(qUr1F2L{NeWTToMjM@dOZ4SwFHBqzfFXJ_XS=x{Mdo21kb#9%Oyk@UNO zn}Y+}{!|fead9!{FJb2$G!H?&ylvy&$nk?vrIcX&&%Ro!9QgS79rN>ANe7-@UffMB zzfu#S2fD41jO5vg%=DX|6V57sru4mlwZe2dJ>8~dz&!H1lKj-Ak0Bfkgc=V;1~h(T z6qLsF^z_IV#l!eRwLshk7-nYeTv$%Be2I#dl#`2WW<;J=t;c6pH#plGknc6@jU)n~ zJrS=!B4E*kdY)Vs!UEC1XtQE^ZPvA?tadw z)@14JkE31(QI;bXYIHDF-e`G5$#uu3|<<5qv%-r=6bskMs>HL@1Fda0&=nRXpFiJhoufUID09JSQU zy|BZY2mpxrEkMVAdD>3p~?UYDKCp63V6g?onk~+n4S$CR>K!kc6f$`s1qB4LL;l~1r!=)Trj_$zQ;aw$hq$uLz%AG69d;epFWrQbB)a;gHDH6*aO^?Hfb;eg||d%E+`Y>UbM*9pL`EZUWFuqa zPm9}ITbv6Tt4UPo-`I^q)>TCauIThZ?tRT$LH>P)h{SlP@9e3`o*SjQswy7Mp|<0# zFnN$19c+7x$FONklnm(d?u7jOB4;Y{kTsFZ%96JK&dq7sEY&O1rshakhf_;Mw@*$^ z8Zc5!>a9i&Cwa){2%Wf&q~>?MD)9f~Cr17kip7+BaB zDycN?%dM!u;;~yA^Hvpa!mnsK1t+{!J)N~Cz9ga3^8FWkFemrX5#_X!sOn*4S#)J% zn=-_8tuT-tIh)U0R@rDUkFp+$BAw%af)XtD6N-ltssv%g!^nYAVR$VH zpRdFl^q-er!c;6K3h+f+f)mH_O~mPBjL3?((D-Da#?(oz0fn?)j3k-wszV7 zh9=KsCMF~x!PgSyC=I7^6ir{o3bpyYJ{e7c1yGFU*zHa+J){vTiebiiSzXIeM8Hu zp#jvZ*f%jiyh`TV3-Z$kXO-{|w1Pg&Y0dmgs)tAAIzw#C$j;op5-b8UGuk_^n>#Ib z-7j{fjSN5e&DRi7N+LgZ-0R0;3b}O?-zRA{8leLeD+fj6G@Rl$WnNs5Hz~{Gr+$gf zEAxp2CCO6wyLH@TpL5=1)l?OXdyyR8X&E}lA3r5W!2vr8p6IzX-fQ>u(0wD=Gr90U z*F&IdfY6sF9%#R~?xo(IK#xQsM2Wx*dG1of^ut4kv)$66IxIOL8 ztX8lGz1lt!|MK;-TeV2CdtxhV=Iq#^*p#eLqT?rYKuKFQdXGA;I~J#EzRjbgFjZ}t z6jWXprx?6h(22G%-_Sc`LQ$oUcu+B`7Zzdmb=g*+U;@=98ZYM+fw^F~b0C{fbZ_Fq~O*gKqiH8K*Y49eO3Ab8>W zHv&5kVY9vUx5>!Ev{%YWQq~OH_~x^MkCy;MN!CCP4f{(8eCh8h(fwf-mw$)Qg_I^( zQ`_hWNsQG&It2w^W!i*X+)>HPHcIqu=KdiKnXrxp`CZq;8PR9FD#zS!$_P&O?F${a z4iWSiOQ6QxZ3{S|bcU)zuHO^vpMM>n?EEPL7gmOLb)v4<@)EZ4jEh!H?B8nJ>K4Db zx%srYyy)@5?}$CB95t1Yw0Ry%4TdpyC<)neQ(&Q~;`nqyiL9u4>tS8_=4pbJEoK>h zyt#_WQX|O881#jZ{?WG3_(IyfncvzOL8IGEPDccTD9o3{t#pyBnK_*=(3beI_c-H` znAL{X7qF4+ZUG;2EDXnN(1k+a+TAlaZ#VU_e6ychLpbR*tSuNWLA~cE1O*%k5U$gI zl(sE<&BI|2g=SY(;l!Kcpt)VO<2pis?CguLdYi*lEPt8JoV%S=v{fUliFg12A3up9 zMKEwyi3bl~2muhpBcbzgE|`Ws}l3XN15bd(?t){%W<_u@?%TI- z{DlEP`|6czi>>0@&mtjc2M`g))t1m}hvQZ>zvY%$iuvlbvGM~__szSQuhri6f+b3W z*SpK13_hCC_$95}5e4MNV^)wR_q`y9!ia&0!@d#DSiQxJSt8?_)+dzy0=K{B@{9)7 z+s5M>Ooen>)m%Sp*UOu(ISOB~QoI=vO!Db9=_xM%7Ii30*K+6jX+UZ`N*#5sM1%Yy zUIUU$I!>M(=4Fto<+Z@1_K~yHN4Z?Y5<^$QHnnW}RcX+{Dmso5ZUs)UACK8hfkFwq z&pR2uU(zBsTwx!5vA)fYQm>1KmgTSQ?Yf{_<-bG6`@!o7Xx!3i-OEizx<8 zL&F@a_rVi*HE1thSpI+Vy0#(NN;MQ#GgL6ZJIrIVxzU3^g3V2zNLejd8G0wCH{jSiT68;yE}fEQGgd17zH|ft@6ikCMx8*X$S(er|ZFr0BB1s_hIrF3j}3L<^V_^Qf42O@|4z$y)i8Y zi@9II2aB~sWBQJZN{J*LjBCF~a)hH5l+5;5fRaRF)hAqdve*33LsVf&E@kLeO5SI^ z2&-IZ->)*HjK?n#I0r1*4a1|7IX`i^tg*k%T2rXJdh_9+la_%$4GAk?D)?i?^By)J zV&01B^kqKADpzEEUR(_qzVue8p85fQ+KJEVz@#*8h`oHa-HdihOT;-XD@xQd?E3rL z^=fMY55H4UF6FhId4`i-4+zk^$d~(B4~&sgl;!c(qE1EemDglCO{dA56kTnjIDXrN zsB?+AJn!)MRGyHI=tU2@-XvaiFsHr6g{SOqh=q@sJz6)MM|BTuUi486d%{OSfF7l4 zj58V#hBWh#=Zm0p_vC!0l*(a)hXY`dwd)D9p>mRC(MCJ=!cMvDg3>8sY4UXdj&FtEt)cw5!;nMjE zmyv*~^SmBy#$8ER15RX&rsoi@E9UWMzpT+wGn*S9l7Pt=$Kw^g#6P^zoLQXpE%(T9 zT)0S2#XbV*l%{L^4?ndc`rCGba~b}aeQ9_K%0-tjT(*6a?vPq&S#5gcmyzi zziDw`x@FRfxKAhgY1ri7=GzH~bP6mE=zCc#hzf+`mIpw_dh8jB!(eKu1^wT}tj#wF z6yu@H-Jl0^-XhpM9?*R9{gt2sT6^$oxc2b``tP=wpnYEMd(QJsOk{3t;Ok;ep?taF zCvR6#=tM~5X;Zp^g=>><4wf_}=11~U;-4fyYg%Cs+60~?|R;0aM zGjU|sEZFz7~3}W~jeMAw1&3AA;u37UM?ht6yu@Xg2HmDXR*j6wIr#q6d zYcV}lSBz38nqc!W4k>HAZTkb`){N%A2D{YsD#H8PXg%RO3V1ioAr|^9f3%48G)ZdN zQwW`mdHEw<$A0WYD}3X4{p%K^N3wcP&TW!)CL4NED7##A;37ot%EoT3aZ+2BWZV!;07V@2cG-B;t1 zFqlu4gHIVYYel2s?4{1`I^`bWhL$|zJwv3)UAm`#tqAzN8#d>sSzHo_#vSXKWhd=8 zeI2+g^p!{*ocN`HF4-BCn>X%~Fo3waZX|K&3p_S5Cmj{jL*H=g#wsVHGAfUVrP`PI zU>!F7y_QblLRCX? z)^0Wf)cfc`7q?-!j1G*MraA@8)(kNgUj~*o<(#we2sUM+BPjVIBzCU+VwpU+&W2H` z3BZqSxyAi>OeiPlnm>6Jm#(MM+$g2hG2uL5dG@mgX*!AHf$?pK#Xnk~gnQb5`hy~? zm@P_FUeL+9#QBN!O53y&J=ICs{p?==(6l(LC@v-?rgWjuMKTe)QJIfmOFwysDfMq~ zmJo=QTa?O-mlgb^CL&uLcdCw=F6>7p{QU3^_wkD9O!G}yis>}ZYEU`FdmCFe8z^e# zfJy(K;lTV{9MmqJiBl-vxj4TqdF8PI>V8}sJK*4W<^==f8EZJI;N8&qz*ko8)yPWSqqt@E{T1k0RWr?rgb{I|Lgv;c}HTk_HdvOq^J(g*tH z^#3zGx1_aYeTKZG@v1M;K_?~W|CGJ|cbZQJEo>6lr^Jfg-0Yj2W&2J9ZXB&GpVT(9Oy+&g8=atj{wvq2Hb&ce%B?9h-ly6vtMkA zHwi_t5cMz*!PY+Z1fVFVuHa(;ih;3GQL&GnS@xc0|Gp@Q4vsX|S~TBVoNZ;_5Du_u z*@a+St~RnHa6V(m%H9VSK~I-HdSF!|k z6s)7m?*xN;Gr7|PMdV_Oz6^NIlC;^}0q8`WNCX4~42-PsT?~%{LqpbXt05;Ig8e2O zaEOSw#xipq9V9E?48<1w55U*`I(X zFu573b05o-!c0s|B;1CBw09QpWN%~ggKCb0-TTWHc~!!RyKsJ4XTh-gPq)covlm@Q zLAH~e3Y&?EiTFrOO%1L{t@uvJDc@&#aLO#7h71J|#lZ7q%&(ZD9w_lzg-PP39slZU25)Q3v?cw$ufR<>KZ`>s@ z$IAYQO-vD^OzGpJ{$M%1I+Iqqq*5|O zGbEbyDALVopA0(^G=d_3H(#2V7;?oOHD+_)A4OUF#wfFG%CvHyexLzrrp=OA0V5d# zVmV3xU}R*Zq^1^>Cl!-hT8ifB=?M-mEhFPEM<-@!$tYUhf0{2F{-IXs$ehLH7JFAs zBhO+GuavM_t^`3__Wor)k}&ZL#5XN>OsU^Li@ZU!vQjcO{knib%I4IK1m+QeKt)vz z9Pq#Qb9w=mvQmeZ1r!4)3}gGDiQ&{))*IgN9)`~~VT0EJojsT3^lRN;aUsC0LWU$I zEE=&OVRUqKe}BJ{t#OG`yKy&?&M#cdu`(i2^-n)0g?eeInIkGSYa29et}ZB#kIx|kv2s#KtqJN4 z!A1#=`c64zxNRN7NYGP1reU;4J`L6Jy>Q7%eS7gkDP%pE7+cYjG<-M>8JPBHJfS}S z{cldrlI%`}PBsEkVN9f>{YS)Z#ER~|J^vKFt$h@A!QJ6 zSeolh1_(QHArt$MWnChR+estQ{4pdvi>#A=AwmE)|h^r`mU@&kg&cidAkrl{Hcf8ZGl@t3mz zry==(H#fbZZnHqHZ`FxKPSva34WU8@OJzO}QM*m)9N!Pa#NQ~wOup2TCfM7B4wVx7 z2wpS6;4fpDD~Ay6VvHl23P7Vn*qnu2o?h2#d(O#vsI|Hw*@kHZj_#&?;(D)GAIivY z7ZX$Bw1%DaaoZX!xK8)Wd=w)mA*qgM8XWNtcWUFtK5*H2|lb$~QTiQoe zQR>(lGjy4SN?85J%W~<3%DizeCIix#e3gQjD0HxCvkXT=bo9zM$A4Ip-v9W)TV*|! zfTbm!YOnqpjioobFaRDsot2Ivd}*LOWR>O{cuc_T8~;g=cWOc;V!YjQKmsUXrm^>C z)REpC$itG@!=nP=5HfXkALx)cv~K}ZT3p3?#HT<+XVRos;l_D^?5Ex4#I*S^Fkp3` z7JR-bA8+ZlElePkrKrF`wr6Y{D5X*~FJ!Vnt@_puk}Zc$A_@<;wzbvmax@N0PlPFW zd+Pk!)3NrC2vP2r>PY{vdF;Q^poXyY~ zKR<%0{)jx>5MR`iGYnXOb1U@$d$@6NLtOIi!dP9^?{lq@BbKpXSXb0pK0qY&+pwZS zM&}wpq!4hc{jvW`zV=J;iqUJ7`=@28M3wt$;J#6R%Q_Crw;a>0$ zRvy;Py=Q{FcatkE$K#pVx*zV}jgKOMioPxikm@o?O!dC|QKFrZBmQD(86T82^v^K% z&4vCkg~f@d&BS`+3*xdn80P}#=c@UTZ)^l!>{cQ!j)sS(n}%lUN=KdvwK%g>BdlC3 zzLgyGm_M=fL*-O}%rf7S=(K;>9r<6d;8D$}Ks2r)U$05~Py`5lhB?9fFk5&X5iW-% zP8Czw?nZ?90v0KsH$LSo9p=6;*mt(!>ZVjzq}(8wgN~DEPr^ofw$c_2n<7K|HyO<| z=y-@AAeonYkw?+^wjIDLy|BDaI!5q?OxlW60ywVCT_4hes96 zoHGz=pN4sCOlJc9DUlw{;J_95+!i-1@GjDa+&&ZnuV~n0iObC@*TL*g^{LN<_Ah91 z9-Z&e7P~^}myF|W)9EO)!7xlYD=Yf&ruiqhe;l8X+@lvzvXMxa0pZXF+=Q1d*8hGAv#?$XilF~i|a2cEB#AiVq~~}rv^b2uOxJt`oTw( zApSc1P7FZE1aWZ-yxOMLL7 zY@~=E&PPzTNG!v9mkklQUT#)T;t~spg<#mJJW$8$`i2x66H@VCC z@de37hXH)LehIi0px*%bn<~zbZQ7eGItqhZHm|aPo{7Ybsv1pNPTWxrEr%;Kq-W_@ z+W<0Qy$s!_i!f^~$%Q3??(-ugD{nGIyIGxg>VqcF6vPW> zxB-KSk=y#ZD>$##ve(r;J<<*!rGHEO9$t-o+%d}Cx8}Hp3P)qUCL*}dG|RBdw04gC z;d9n)(Pq*V0`N5$fu79(?tu-RwyCD4&HO%u(6QE1kqj||xUJ?e7 zCrrSRfM=|YP_<4%oZ^-94q>=3v;WFK^e(d`;#*e@U@CS;znG=CJDfA&Vn20*#mAh z?cQ@JoV$K?4+GDl*O|W`Qv5JS3+mj7gqXR+t9A2|<_@&Wc1sx{0x_9>r~L_994xHt z$y4oWMd!aOEol|GZTJ70h-17@);_>6ki$d}uud@9WDG&S&f|b0V5Ust8oVDu2N`%o zvN=>=6itHw_lTD8)m4Q0;?=VljBiQ|NX>+xu0U;AphQH~geS^UVi)f@`Rjjue z3mS{u0-yfniQ#C5xpmC174o082_Td`c}ebmy=LOK(?9n1yu)-rx)KEym0II0WH$1p zTrX8eEpi_>jv@YQBpwIqBy=X<1OkD`ndHYB((aruy1k#nD=V5(^v$R(A|DIqFi_R% z_^-qnp$vL5f<{gHy4lchvPrK&k&Y4SG4$!er%43AwUs&SKjtHE-Hllkbjea@R^4?P zah*eBA*AO>nwxTR3j_IZ7A?80dwBv-MCVh*o=$6jOFv|>@Gj#Wr{_2SAk{F>?e#Gc zB(y$n@@Z|epG;@nHZpl>vEbZNUR@N`$*tmx)uwT?gMl%&l!~$^ueR$Xk2oD;dw#|_ z`!)H;3xcbd)qf%n8@|Nbu!&q9HjV}p^42YnSE6xYhHI05xkFf`iU4?we=(@LORM|;T z8-Z8ai-meS%FjZeU0lP!u6ylbZ1`U4)5(Fb``2m~@#H5Bh|q3mjZ1W6cOhXi4Eg;v zk5lRwC%uDzSw+wYHdr-C9?5Ld@>{WxgCoHO_F^;uwaY{a+QkMagNKU%GWhC#%R`^+ z+)2#ftXmBetkW`DHpZ)A3i+HBc9F+Ac5#6htb=g_ta$aOA*Sxx@d_E5A8A!oA}#wt z6JN%e;9mrqzT}UQ20PMI17d>Fd7nGd=1(KKq|#zqSDwhRDlW4lx3Oi%*xR2tHJiGv6D+8 z3m!G>Fhc;r59_BBm0=sjiiY3s47`69muZ!tsob6}lBV9r&`QetbDEab|FNswHa13H z2R*#FH*(UbTy}XuA$SBN8u5QP2=YHs_SrL=lE&KlvQ7$kL>-WkP!RtmY7p?h0L!I) AKmY&$ literal 11902 zcmaKSWmFtdv+dv>90CMLaQ6`0odkDxcMl#yAb9ZL?(Xgu+}+(7bZ~ghch_6b?s`9l zS#(d=sj5@8Yge5PQIL~FLncH9fk0@|QesNL_r}`?5gzzU$Y`|*0zrN9RMBt|Gj%q0 zvUG5-r3KFn15vBr}Nay98!XJX7$4iN{1bPuV_ zIR_ECQx?*1lyxWrTdRNYbpuQYnegwqjp#O#B$i; z$AYu4>k|V48&Ybo>LJ)JAvaC;@1x7wgCBR4CY;T6LO0@BIIl}ivK(%m)*W--wOhL1WAhtt9YcIrg`b8%&s+NLonFg;PG?b|C-3&8NzH7Tl(#G0LY+W$B>fFe z1`bn79Ia33A^=~(1Vh5W?D^$Agi9ywM-$7orvRxy&q#vpgV+ zNcpE~WotAxl$#q}KZ(R7Bob&svk^b_PUXq+Z*Of~*Do~m{>GVrE0nG_&qx!x-C(kS zhm<<`=>8S(@jN_G%$aEj&8EpCjOZs95YU@(UB@C<5+X9JFv_IU{}y8j525(14w|ZOWbu~&7H@su+Od!Yk(v&4vsiC+hypuQr(vN^(Ng{^#m6}W1G@tL28El)!g^_1Z5L%mL$r{Hx*ef zgcGn|1O64wnQWZp-mzGrf=-qci1&|VJn|NFp{M%xL6cU5lJd0fyH{#+$6^Iz>1F%4 zTKIcbk&uW8+`+-YyZif#iH)w(^-AH9zpOvaMw3H!c1*-00@%$)CQv^00vo@Y{hf@B zZOWxeui2%@=%t;fc-ii7Di4p?uK{C1r#(k9a#DqdjZ0zBDMTX>}Pj)tq3~fJI(J&SP0j(Q& z&DK-UVj|NCTw*+tDQx7`A>w^zDczMc%%PcTrezlr$i$pkvr|%RL4?QIiSzsxpls|> z#^5DIuS|)WJlRA~2_R4@sHvS-#-k>4B&vLS;O8pz1>gUcg_q#J2y|w*7Twy~l9H37 z0=E47)gC53zWea_NXnO}>#|p}yAjhVBF>!36L#eSIn()a-K})5v(1qtc9q+sYUnW_ zF%VHt0`B=U$af#tFGP`0+e!ULu785OZ%*A}y$uav5K)K>u9g(*_NG&TZLn%-AzZAp zPNc2w>+cV}A>vd}Lm~WP)Qbpb(1R`**Md>>?Y#lR*b=3&8yPou(@II+-Agn&aZ2=q zq`*@3xZP4M5(}O<3=9lZ;n6H5T&c$5WnzaMY&iAS$~^v(ZhO;J&SJAAdPl~Rv6dal zeRntfc^|&@Tkg7*5W8|5wQZIoD|U^KM|F3L#CrJp`hF1fed^4WjwNxBkvJBTkwFG6 zE-vPqVq#+M&fOeN4^Yg1BfN5TLz;L$GS_5^=>oAv=>y_2MgFxWxv~-}Uj|=QzzgqU zWcS!nf7t2py3wAZM9m(@@BUcq<>E;2>o-{3Tg7>qEcdlgHM5R-1-{!AF=gMA=QjGS z{e4Lro6_^Es~p)xrn|?-*gtHrC^Do-9oU*Klt#@kZovcEi z@+|=n6>@1j;*XHi!|8%3-6=P2C>WTQ8Qy!9nd~erMWZx zzlKLpv5AQTz^*+q>a}|4>*?k^u5BGv7y2LLyWmg3xihKZ0%^ zyif&WZx5CkMnEGpnM5~a3ZtvNuRbyv8XU~>d4%K_;(z#{vkjTsQi4u)zjw;@Hi)BV ze>SMQEc&}1^(~o8NfE5d&K|Y=RX}nkP)%HO9A7+Vk_LbxG9clX*XA@3FK$?5+9J-@cxN1A~I5 zawO3K`%I?`kCmX|;oXX6#`Y2Kha@}t)qLhiZgW&sd%3Vw1q1~JU3gYMXC^i4ETuZB5JLd=e8ejj_IWfLs_lo7}mVNZG_ViVPWhc1ydFJ9ZnT#yzcOsqQUR{ zS!KWkyAe~Je{GE1SYJ$!89s4w{XJW4sWBbK+Z#zTR=(fBgD$q!fb>pbtCX!cNbqLl zO`?B1j{4wbUZ4YeGBdY+cBm>AkDh5ho<2IXgxL2RlN_fm)=iZxL0nX{@3C96#te$( zBgYJdp_mw~Du2ZRkU+3@5}mi}ei>E916bJDJ%Hv?Qc{`j;I*f_?I>6{xahRB(HlH< zDMnU3uIU=r+>Yn^zIE4=g{oSc#TX=Ps!FR_x-da=TC^;)$#gF}GUji-G3e^P`lr?l z{*SIr+*+vcKixNPiigi}xo-x*E%W8ty#HcsM~NC+T){&HubQ^gWV))}_oJMXCF+RM z(q2^*55zC0)$j3GC$ezK#=--R`1M^?a2x>_c(T+lsn_`^Dq`|`-WctdbGe-^^_A~jX8{?cBYFz1g=DXNt%+wUrk2jq2{Vuq`X3EooeZ{xtV z=dKJ>$E$C^^W*LJ#Ds+G`D08G0}Oan&mS1@ffxs9@JkKg&Kqb(5)zX4sPONIc{mD> zL>2jqy&(c!s`u@8Mrh9atu|KsCCE2h8y5Ge5lj6AZWBz_x%jxtFI(H&XoL|Gm?AR^ z?VNTiT%dQPT%Gl0+KMtV!WF?WSTe1A-!uLEAmDZR;RMDD2qeF@HtuSFJT@)Owz!SM zUO?gE`VzXhJg^EjSgi96J-XrF;e%fF&hff49S)6{;Na%Jwef=HDqhQ1jsdIi)JydL z3Fx1-%_!pCbE)N^UJwr1hm z<$^QESy>YQCBg3XU!@`Fj?-Sw#)e^d_(7Wx6~4N<+G4gCH$6T5J!(I)rZsrDbaBlP zQ^8i>({;`owA-w(D#PZ53ug{MTj9OaOeLAWdAg_A{bh=+$nB{cfWL9E;5Q=BaHgBY zyUulDes+ukWtZ|#9kcF7dp?Z^JsyKb=2;j?n)$vO9rVi>yZVtYIlD`#O)$baTzo!J1PFQiI+sW9?xNZ_+Zn3SU59JZOkj%dc;C{ z_i$2!%}|V4N4+QRY_1QR`6TrK6e!RfuIe#c?f?nE_dxLA-M{ssm=U!nz*=xZ0)*ZC*AzG4R6{K|d)f**9#cJDXk+al8lIdHt_ zeD1=te?9JUX^3HQo^0u^F|=$lJta5iK6&)Hoi*CrRP|jvU}Yzcc{wy+!x`^bN%*2Q zZnjkV1+;MDI%|lvMEzxXNnJg+Sx`Zn!Wn`gOCd#?7vT9#La|4DjbzB=gC zYPso%@+*vxrL@5DJR=??PJ!{o7ScR)zO~nyesNI~7S^Rb$#>a}>adk?Rl23#0kWd$RI#I^k!(MG zJxb8_EQs9skmZNF2PXbiHeFHYukN=n_QN>1=~nBLE&fXl)AvHW&zDKcvEJ4K59m?h z#C=_>(p2~P{G7enq*Cz}JXv&3M>9oM^L6&?YuA3NB7WDClHG(zD7EukPEUxQKYzHT zH9NfQAeHO23=s>s|D{mb<-K11#H2@8?=p{<)ut!(FiHL%)e{<;$MI}Mx?HDCq=q*+ zUfM&sT_2rfcWIX_C0`#m5^r4Za9&GjJe5z2pEK@BA2JCMIV%%XKw(Pf`AKKchm7Z3 z?Hp0F`gi!vfnmEPQs10rgF=-$?zY0zqzg6cbwd11i)k2Vow>GIpoM{Qy>zVAT!+4; z1c3uF?dVopwyWk#c9bw^a*4(z#5u7%vw(j665p||m@bjTcVg0q-S}GXGv#h>#b|JW zhz7TqXmQp2xXQ+IY~ ziT(7dhM4+l{uR0ppSpKxGlxNRwH@0gXx71gshgKc-ezr(AKDzxTmf1r3$4QBJaDy= z!jexgW-SU{^i^R?%e?98L!HcGW;K+x@LyVu;xDJ;q_ai6>|?zn zP3EjgX;9WYHEUb<-^F@k9T(R5Giujo<-NdraORSy_omj5Gw{3O9;vC6db3st6(L!R zmuZyN;T8w(flp%;J{MvocetB8l*^UDc~cB>{c;e^kf^nDY;ep&s)q*PLdbku=`!9+vwODkn{dnS=FtqjyE6TkAMIn7LRj-SpS4d z>v^UGW_>2pSQQau4Y=2b`3^B(-2H*DH-@ zlPMMzz^_F&{((gf1`80zzU7suE*Rela0Re`J3wdL3P$J z@_zCkqhH&;rS&VA4!z}K-35afMg^>*120Jw$co-pCNo>Xsj|6uHyQ92??@A zuS^^tK8(K(_|UKQXip>f6Lr&QSFt!eEHiUmcMs#Bz-;LV^gSqr{`!#_wMK6B#NH4$ zVFk5n>&qF^oBG#Lxi>H&P5Qeb9WC=$N^^5EMByP6WzDNq9#C@NE!EZWXFx)tJCzax zD#ttUXviIycJ7##HnvKv!dzr{?6ZtTo&Oo9V2YSh^q((l`L~k8=P%04z+&XQ#^)q6 zDE?W#wzPAJ4zzZpeck@InR+W2@JxND?9W9Rv`mbw62pXrs_bG{QGOev_~{NyJ&I{* z?YX`V;259okFZHCQJWVE)&YFlmjgS0crvh&Uc*J8yb<_?a-jGRU#`V^e?c$Qh8X=! zAHI0R^oL%VNK`VKa309S5c<>cs1EDE{b{kbLxOloEk&*D42t(705 zdeWS`JLyn%C`V1L&@WP^;jor*>smGgdG!}Gn>#6a(+&g0eoWmhx>JS@rEki$VcO-^ zY6o>+x6m1L(auZE5Coqp=a%iPTI2os5ox&ls{vp&ktct|147PpqJyaZ5Sk&2PrKr) zLF?n~PXFMMIa&=Jbh_`}w<^ePJ?yUzbknPxG~nOOf6`dlh9KD7@g_Opr>5T@J*OXD z4Nu}1@FWb{85g~5lclQcL6GnMa8aXp^3S(vTD#)vS^?@EBp?fH^Z@8->Zly?9*GqU zPrDOo(M%BZYC6ZZa_I0HJ@N_-W0uDIe~W4T#D@IVUx$y#3V8&V%$T=VEc|;YG?s4= z)-3o_B46E|eK{quNzTac4#}wH&$fpCGUh_$@`jZwGHD5@?rJU$9UyUCi-!Z@DP%9) zpF&f=`6&?2_}65RfHqDF5Im+>e!u6HT6p=16YcuMkVmXl&3_LcM8u5PJQ+ ztS@m6!nBk z!<@gAPgU1l3_=CV)NtoCoVH?|?)8P#_H=ef(Se;4 zywAgs_oW0mLDKWjFI`KfKeV|0s#f<3!TL!ut|#nqb0p(fMB-2Xh^`3aB_%hpt|e`H zTeFf8i-V~jPaiygA3Tg+TeE@<%S5F*#`5---6B!{5n^Hbc|pc^ z6f{Z=P_`vphxuW6yGu4Ac5vL)&85YZY)$1^)@qk+*Wm~R|zc)y53;OYYW{dJ*F=oibTzz*4@ASAtS z#L2;L$Scd3zGDK>On%^?eAdE)>*hk=Z0hevsVW0M`$qm{?hn4*_nsMDZ|R%K=%p-k zG+PS$r9Q|!dtq|NqSo(&E+qW|${%YEK3(shgj`A2jmf{&l|n~$P%?x=?mW5KzQgj_ zCn9As*Brl`lqV88|Fw(e#9n-!;ej8hh+ztFD)KMAt=MkZj-MQw+*kFw0=6sda!IsHb5&sDA|CGExe@vV<%piXc@ zGIe%z&L;}af-NLV`3n^#DrW2)-ZlBT69in)>A~z)G0j$S)*ooauMfuVm&42*=dM$l%WV64=YG%Dv{Y6rcGk1}*&2ac9HyJ(gF5pc(thlMS&xfC9Fof6Szr+i$7 z(hX!34Gx8CNd#qn(}oe!nh=5eNI|Z}agHvWk!Gev<%kA6EhZ&VdybX_5;BB*x?Z#d z0e8E43UJrj%O>;7qOqDWoP^3zqVZ}Kkfg)#K<%HfJ3F3~6J3{*GlXf2{Qe;xWCxmv zsedP>$;q&G)JC$-&({OgpT3YAl zgYVO-o)E6>65(EXip69-+LP#nCG*DV^3qsS3|Hub=hLc|(2b1RUmryO=h5`)gFWqx zw4khw7~LzXD#3Dxx7)bZUcYnU7*%E@>_U!}f%W>(E~2BOXA^!UGU-}PCbF*w=Ve4o ztq=h85^?Ui{qg+#d_zW$B-H47|75Y|vu{1w+S=NI3lAAN`L7%bn+;MCz=M_7bcK+z zxJHDV`@1iJDVIK%gVZKwX4TI7a?|idMMe2H@NMbr`(u-}mdb=2EONe$Ubk;U>HlZ+ zJQhjJyU=QhJ?xn(!C?slPwe-w1M9x_om#zI$MGLN?D@GR9NtT&PlXTpwGj4edbNID ziUMGTr1-s>_cdlPI;oky5|$t}g@T5L#-S)TH#ZIr&fm4$WAjuFK$|g;%fSSc|6G|i zFv<`9)B$38mD}2k&E$f3t6A4DFiwvX*AUh%X>C2s+-|R9*bUuoM+qvasE7f?TLckD zd^1ts7iy#P2h4|u8+Bx42&Fgk=fYgtIhUWLk z$k*zcnx?faG8SA%B+l@b{!xXDS=pwGteX*e2Y@^u!x%Wp@aR0#_o#>6(r{z zDFlP&fs#NB4$CRnpIxBN{sEVK;UUk^bk|jVjf~;cj1+5wpUE2$aW{ONWE!jL)^BV^rotIJE1wq3n@< z+)$)G*NUKbcCR7B$Sd<@M7GQIl>GdwwGkCvLJI5cC-m6prPe_ctBr=U<{zXVs*FPi zt`En?f@C)$d$Lj;pW^k}JmX6Op)~5Oa1Bbo60n&dqTn$U`XYpO$56`ZKqM12g6Z^B zadCN0;bhnvnrj0iB|@U2DrQg(BkA;g!Zol4$VfvBy}rUY*-lQ2Z?*pm7Fi5lwi0X2 zb$g${fa!0^x4Pnr&3LxJP(*OAKsCtN*3{L!#L)h?P3|DGoh!f2fo4C)@(_<>148=BDTGzEl5d`WS1h7)-`&fkpYiso-_( zFZ;|rS39i5k{YuZ%)Hypc$-mUn6WL--6ghU|B|_}ZB=km#E`>Y=F~}YJOfm9CwHD) z%0=&ToMDl+H3vN&o_ON#leh2sD|%USehXv}Q|*2q&cLFoB2~ME`;5ywy<#tv&s){x zg^6y>TZeZ2dk(x%f%^6?K-WUpRUYT^A}=K=*kgZBk?b*``7_U` zN%X}Lo5TlAiC{;{)~6LHGStz99mfdPmiBo3Ay5AgXq$UadC$jp?fau%-P%Ly=+S5w zW`V)MEvlc}+@EA9&1J3i+M}f>_84gO`NfbeB+RVnY`wi#WV%a}*y9mJ*_nJ^crb&^ z@^^)ypzLn=kJ+1uzJx--!2e!}AfkWXQ|e?}y1V;*1qYYPOe0i~bfQLG0LV3657g9o zcye_~9wejrC}d({Iw*AjidpjzrC`(_Yw>$wmmW@3*J6fa*!C9wG1WhSkY>gf^&8dP zd|)qp@uqC*sOg@MjO|~C)34G}hKA;UGwRJJt0+QtMn>_+dH$w_nCF<$!XhF8+7bxh zyZ9ka%HO#;l1PY%4#QxLbq^0sX1o(U5kJM78#!bRiK)q)1CH2LH31eiw(kQK6s6i< z%*}V}je0tzNLC-L;<03)egMm0&Xo}XIyAJrDkGtz<1fd31Wa>i&+N2iX1j@2^h$v4 zx6r_({fL2qk-6fypJt;R(0F}+TI3afo7{}8j{bJOnHr$oqT!H%&HMTkc=P< z1VgiYm*&V(ZVAwkx*MxH`5lVY9)>sg&+wB~(dK5FaaY6V%}r;q?x?HMhv%7#a3Dti zDAWrAPG@pOouLK}Fo%&mO70Iu*h)z)cntc8zdqW~pg&x1B)JpiOuOvf#1BY)Hy{M{ zL~&4c!GG@{M$~B4sMT;p$Vg9??~nQQ^qe8j(zMLXP`%X%6y31FRY*iXiK%9am+|X3flY|?2olhzc5;4#aw!$ zk__com>JK)LVt(~?qzm*5t5XLr;{qmYw3-UGPqz^`nh*%5)ErzLtLWKc3(rtL zGB#5yWf)#rr69g#Yv!nCI9E05`r#VGTJ`$r*`TgOCxGY4>5@6$w2eJMDge-n|ECBm zrKL;80z5+Vx}p7Pt(kkNkmkk57yAthhScGJ^i*^_m}?I1M{(`#^Ac@6WGN54X^Ud@ zb5gH18>0|8{0VjeYo9HNKJ!VIQR^Nr# z0GwoNdeqmY*#UQ5JWS)d+xLvWYN1wMwOeg`bb!}4FB@`x5vhL|W1GtK$-rU0yxZHC z$9#X^jgpT~$0R?$xXqFUzv?SAoZTFa--IbvnUCj27N6B@?81yuq43kcUjaR>-rlNB zUA=&{h6(w!%m92Ko~$nCC2Q%32uVL@Ga$bqiWrcDfv(5>#O`aF<)S@+Pr^C}0`6Jd zX=uj>G<1^@2Y=)F2oMd+y4zA;bsX+WTq3~1{(hoYSD042+OnEN2go+jpZIu6XlUrT zP#7QA{e{GCqd`P1VDI=&erv>UKiQZfo2TFb7z`CQ#cXSW+*B8(SQkKrFr05y+oeTF5 z@ni-IGeu&pSMO5H#`nsj$xVqSY=ih-BE<#b21gZ1_baCLGAW!(Y&0s&|Cu3v>5pl8 zPchbKOSCl`TT!m=t$jK$Sr`p=>r;*F(3TL=&hQ49vJP8vVU48a^qfLW)9m7+3QM6at+Pi#tEMkDQ?yu^Nq*eveb645Dt zrLwbG=uDuA;3ar+CmW0Di<8~5*@&^Q2Ui;v|0Rn)ZrKg2@4|+A>=P>w7}W&_%XxK` zTdFm@N;b4xomA)1tju-@VuD+H)~eeRu^u=6^XnB3ulgcm$L#FRO26ec8l~0e=}7f= z@2~u;YMeEflXS0~TDI*5^y^`O!^K`kYhg+(b>aU^GXE=B%CRK2^ei|C&CR=t{=fao z|Ix(sT0z0!F_&}DR27>-sC05L3)rK6J4EE`g{#a$W^VPFkj&t}unkDnH_+v_0Tp`&P+P;$YIy-?XryvGJFR849xGgC!vy4Az#)y1 zhYT_=zQDIa`~1}_jPl9fBV%dY9aiz8?Il!vI*3a2jOqv9yhTLPE*)BK1FK{@0cP{o zHcYGMZY1`s$EY+&XHxRpn1j zo_FrJ{3Gh?KRv*qgXiefY;I4}yHhR_eSdpBOC$Y{;`L4Mg0Z1IEadE41bC<2C&_@a zA^|k5tj4P*4@m~vywGKKb3NEa7F_o^jvqdqoX!V^GTb$9GaxpDGhLsVMQv?yMl zVs|-Zd4cF7-b1Cob;#ruN&k{pcb_+lQ^r5Gvu1kV>(N!I2|t99`}c*SzRL>g(fy+A zI*tZV7GFJ$xnV?4bthz?F8=JX)koX;HkWfZVX@ih-(1hG z)^2j`OIki)F@Ha}B-H(xaMEmw!tj_ZQwG?rU9vxP-R0kl+)AER!kph+Pp_PH(a4nl z4*)3|bqWZ?c69K&wyliAfX-olW!~Mnr0;8^aKfVLmxe<@PhDd^v$QNDjd)Hlg7WB~SnnemF4T3ZgQH0u% zBEGhTzX<~5T0myg_}}|f@gv@h2A;F$oBaiLtpJEN-f7=2vqO*!j%1+USE_DY)a+I} zlwAb+6-*X@_vXIEq{@MEVknh+5ONKA*0>z`%$HcaDE&;sb^N%uwPr$Dyi~fSY@%lQ z4Lk33yHaOy%XyZ*CR0Gmr&d1x5<30ELh)eDc?$?9k%H{Gfsu@7l_yo22%&p&K5t#g zCx{-XRBvs^Gqjjgu Date: Sun, 8 Mar 2015 20:19:02 +0000 Subject: [PATCH 03/12] Added Thermals and emp_act(). Tweaked some related code. --- code/datums/mutations.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/examine.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- .../mob/living/carbon/human/species.dm | 11 +++-- code/modules/mob/living/carbon/life.dm | 7 ++- .../surgery/organs/cybernetic_implants.dm | 42 +++++++++++++----- icons/obj/surgery.dmi | Bin 11977 -> 12003 bytes 8 files changed, 49 insertions(+), 19 deletions(-) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 0b17f8d3e21..07999b41ed1 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -179,7 +179,7 @@ /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return - if(locate(SEE_MOBS|SEE_OBJS|SEE_TURFS,owner.permanent_sight_flags)) + if(locate(SEE_MOBS,owner.permanent_sight_flags) && locate(SEE_OBJS,owner.permanent_sight_flags) && locate(SEE_TURFS,owner.permanent_sight_flags)) //Xray flag combo return owner.see_in_dark = initial(owner.see_in_dark) owner.sight = initial(owner.sight) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a9b1f519542..8371b8386aa 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -156,7 +156,7 @@ /mob/living/carbon/proc/eyecheck() - return 0 + return locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 /mob/living/carbon/proc/tintcheck() return 0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 71327284c39..2b626f600f8 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -284,7 +284,7 @@ if(R) msg += "\[Medical evaluation\]
" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(H.internal_organs,/obj/item/organ/cybernetic_implant/eyes/security_hud)) if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/criminal = "None" diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index ccdc5aa956c..b4b04f5a5bf 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -78,7 +78,7 @@ ///eyecheck() ///Returns a number between -1 to 2 /mob/living/carbon/human/eyecheck() - var/number = 0 + var/number = locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item number += HFP.flash_protect diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index edfe06f353c..897583a2104 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -510,9 +510,14 @@ H.see_in_dark = 8 if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,H.permanent_sight_flags)) - H.sight &= ~(SEE_TURFS|SEE_MOBS|SEE_OBJS) - H.see_in_dark = darksight + if(!locate(SEE_TURFS,H.permanent_sight_flags)) + H.sight &= ~SEE_TURFS + if(!locate(SEE_MOBS,H.permanent_sight_flags)) + H.sight &= ~SEE_MOBS + if(!locate(SEE_OBJS,H.permanent_sight_flags)) + H.sight &= ~SEE_OBJS + + H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : darksight var/see_temp = H.see_invisible H.see_invisible = invis_sight diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 852eee42628..8120504ca89 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -561,11 +561,14 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS|SEE_MOBS|SEE_OBJS,permanent_sight_flags)) + if(!locate(SEE_TURFS,permanent_sight_flags)) sight &= ~SEE_TURFS + if(!locate(SEE_MOBS,permanent_sight_flags)) sight &= ~SEE_MOBS + if(!locate(SEE_OBJS,permanent_sight_flags)) sight &= ~SEE_OBJS - see_in_dark = 2 + + see_in_dark = (sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : 2 //Xray flag combo see_invisible = SEE_INVISIBLE_LIVING if(see_override) see_invisible = see_override diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 79d07c5350b..218542fa203 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -33,7 +33,6 @@ /obj/item/organ/cybernetic_implant/eyes/medical_hud name = "medical hud implant" desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." - icon_state = "eye_implant" eye_color = "0ff" implant_color = "#00FFFF" @@ -44,13 +43,11 @@ var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() /obj/item/organ/cybernetic_implant/eyes/security_hud name = "security hud implant" desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." - icon_state = "eye_implant" eye_color = "d00" implant_color = "#CC0000" @@ -61,13 +58,11 @@ var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() /obj/item/organ/cybernetic_implant/eyes/xray name = "xray implant" - desc = "These cybernetic eyes will enhance your vision with X-Ray. Blinking is futile." - icon_state = "eye_implant" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color = "000" implant_color = "#000000" @@ -75,8 +70,35 @@ if(!owner) return - owner.sight |= SEE_MOBS|SEE_OBJS|SEE_TURFS - owner.see_in_dark = 8 - owner.permanent_sight_flags |= SEE_MOBS|SEE_OBJS|SEE_TURFS + owner.sight |= SEE_MOBS + owner.sight |= SEE_OBJS + owner.sight |= SEE_TURFS + owner.permanent_sight_flags |= SEE_MOBS + owner.permanent_sight_flags |= SEE_OBJS + owner.permanent_sight_flags |= SEE_TURFS + update_eye_color() - update_eye_color() \ No newline at end of file +/obj/item/organ/cybernetic_implant/eyes/thermals + name = "thermals implant" + desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." + eye_color = "FC0" + implant_color = "#FFCC00" + +/obj/item/organ/cybernetic_implant/eyes/thermals/function() + if(!owner) + return + + owner.sight |= SEE_MOBS + owner.permanent_sight_flags |= SEE_MOBS + update_eye_color() + +/obj/item/organ/cybernetic_implant/eyes/emp_act(severity) + if(severity > 1) + if(prob(5)) + return + var/save_sight = owner.sight + owner.sight &= 0 + owner.disabilities |= BLIND + spawn(50) + owner.sight |= save_sight + owner.disabilities &= ~BLIND \ No newline at end of file diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index 40cbe114df7855e28d4aada8805e483a2c11f556..da2b249866dd245d44c3318954975d93dc450ef2 100644 GIT binary patch literal 12003 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

LO&_%4Pr<%xHs zimT(ivbzy;{%}oJhL5H`^IN+@*+{XWRYA6-0hY`wOctz4nLTA_ygh8c^3X#DazJL8 z*G{&H2@vnCL@`P5WYOt~5~u|5{U%Ei52r^>ne^M|)!>;bvzkK~+6~#hKRCK}dGyK< ze3`U&&R7vR!>dmtD;oDv2wl^WzjLCQ>=5au_B!Lm12aAbaHmq4uitKjac{&X-HH(w zDVC(_4`+;q0w6&P^N^-w5&2_IAyDN{k8e<5a4J7O`yKqvAXE6Jw6XfWSqpHYFt>;3=V# zy|_G(^zi31;b1!A5wiVifO8Deju*@3?@DMRD9NNe03UJH6yrTgmXCJN>DApNe}zw2 zuAUw2zBKzHZ80tYGRVBp_K=d(TZ4(Vewb%#V^Vxd2Ja`&k@rKv0p89EjL0P8gk7$g~C2s%@L zpe%!5@+%Gt4hitT7j52U?5R5gw7n>jD_W1Qgf-tp?@>uqnKZDbJh5z9h z?rr~q@;DCJYy=jlu0ojs*k8);MrAJec~Mlkdwiwh8JUr!4GwQpy%8O|E6i?fbSjUI zvN?gc<0anH6t?;4(dfKxW+TA$m@G&(FX(}TedV0iqwXk5wh;G|Zy=RiE0$NAuFO=W zZK3*Pj%+CaaoXrUd3^_eL8$!kv%#mB+FE*(UqweTX&tf48xZY5nR(dm1`(QH(8`sw z2gd;;Lg`OVd}vxFdk`4}1>(O#n^17{={>4L<*$I;pK4$J?VV+HiyOaFa;9S^QLF!Mx}^O^wZ(3x-5h8SgGxCqeA!f#YYMit5mk(LJ&l;gEzRVtJ1 z7A5p(?E3IfBR*HE2phwi*h4tr{jvyD)HlI;M+4dWU~5W#9?v;*WX(P+t(>#K_qIs> zgU_j75~7_S0bGYvqdPm{)nSi`l?@X@KRK+oj;+?1wl_SKPN3#A0e{{&;&) zX+m#)ecbHej|qxB}|LpA5pXY;mP;FaBuL3xzZGO_#==F{3NS zeMeV{zh7A6$I<4zuoNwN6a{jQ*WeS01SZ}O?Sy{fBq~%=u265EU%=yCdQjHL2LSwH zJ+V4f|FsQ_ep?%(gGKBq*;f&2Znp0P7)0M|VI+lAy@ZTlj zK%AN^@6UPi4WmW<%h29sF%1YrLy=&EIQ3`$M z9JJFO*m%vkUv8J9teH>4gNz%DuOx#=!6eIp3plnjSG`-l4>x5F$4#;>JIS_(@qF+PFTK#8P{87;35YV^lL2x42>qa-BrbLol0%$vOJBg*V=99=FIjX>0e5oBM-0R%&dFuPqX}pv zi%FKnohTAzym!ZHyFW$8dpJZp)u#TYX2!$49Kuekzkk5d7)zElu-T8lC8}%Sf3r%q z{Q$%NBhG8i?rdj@J-6D%2{;+A@xuYMrdm#_1lPRYB-J&WxeW=lZw>_k>Vi4A@%L+t z6^18ZD z@Xr-Q@u;RUSWH+U{GUVnf7blxbZ-IEYV$3KghFGY$>k`!tc;)MM&Hm0bDYNM2FuDi ztE){1s>b2f#nJsQ;nPt2dShOZ4LiaC(i2w@U|f)v7&solptaBN&WS7dCY=8jSslvN zNzWBEdp8IH66L;&P|F|#wa%yhN&4=``{dLL%TlknX}2+(EX12F5!MqZB!TuNORN?3 ztI|I%))ON+1+_v}2;6GkZ@Oxy;jPcP*bSH_sDFN& z^UX@Yo6*U2g4zl`vIoP2QjN{JZWOjj@d6)sdHEeDv^ir<3~K+aJD$MV)W1AzsP6bl zuhd#~-Qi$*AoP8#nXpH|>Y#6V4bkjN(UI8oY7>9OLhk^wi?xu)WsKx7L63Uv^t$61 z+z+iEE(1IORJQoat<0O5Zb$id7BP<_{<8iCl|HB>}l_Nx5F@O zEG&mwmS3J{7MZOX|Abr@Lqx01CgFBzX4@Yhz*b)HT0AaC)bH%SfB(L2sKAcx3)Ewi za&qF}ObP;(xspI4>Dq$!!<3mZS;SW8(cXXS)aPo^y?z8ZljN_4&$WiG_=Y$7#}y5++V_eB+%V^#f64UxX1fT_l` zdApP8H@k{BJ6FrJQUTg?Zpg0pBB4nXRA|6KCenm+5}_zaRr6wVq3$F7cf+-- zr>pn?aluZ3(@*#A#1UN}Puh~H#eYfa(Pq`@bmJX_llw&;5xG9%;pH`B9RvaAvX_7|Pf-*J7ZMq-os~B- zMj*&n>OrjH7`CQ>JthGN^s2*OxAvkEkn9bDO#+$a$IFTm0+q9e*v9}?5Vo|QS z+HB{!%Dt(Oaga(>=#r_(RL`*M zpP$qd@nMuKusd$>dWGrpT>x$WhJu^f7DiOt^*id%R)iEoTG4BIv+HzhYz**9{q_`$ zt}G=Iv_uGB2HES4*P`v6(p93BEDc3+e&DT@%W@v`j{N~8 z_V)~0F8K*5=#`N+MO&!uT)}-WPpr+c1lD`hTQyM#lmjzrxzDR=Y8X&^sHx?_y|V6W zas7WQ?v4oR>#^*5)mucEm`FpR0AobB^>Mly#CFHnQi@{0%!4jLgbn3KNkRhs-yyxU z8Vn_0UDPJ3FpuWOIQij6jMdEMd_e@bC>RXE4?@u**<&AyEJ zgVZvN1irYQz1GvyV>x|a&$~4LFB)@;&lq9MwkONSqvxv z=AIZL!phoOr|bSWB0aH^z>W1QthRR(Yjgq~9s%@!qov-Y_SBuHfp;lN(l)qyOhQ2J zT(esUyRPi38m0U34lO><&W)kW{?37e8?}p%tznY5nzO~R)Idw=myV1-{vzMoh)w?6 zjhBH`8N&1S{+~Q<$$rovD%*8Y=KJQ>bVuheqw!>^x@66N0R_bJ;3W3pGW_fjyFf3; zcPpWHwoSvyI<%OWuRwUF`9Rh|02butT6jXtjxv45TxTra6EDP_O$;E4bo&GlwGL3A z11R(OA&k}!050S)b>}TPsq8+VL%|m@sae&o50*vnmoY16S~z2rw&%AGvv(xR@&Cls ze+p+gHRzDTUk>0X7=MCmwesc9mVa>M#+;qPiS&CJ$+wTR+Er;!O?2M%dr?Q)$A=Rz z>cspIh7os_0s-Y5chi!(ck*L>!zZzF=GPLM1KFxliCtde>Q98;3vrs*!ggO&Y&=K1K+9jmttmvSkre(Y4{Q>} z{5W?Q>Fl2oIbuiQB#}$Y% zdX498jTLxFa*#c7Vz|G2FGfll@gxw@)$50me`*c-0?mcvB0p%t&L!t+a|~<;t}+}! zZgktgTalNz0nlEeOF0krzYPz#6mTSlVPc|HywYy;Z3|I0b|m@D*(x7|S+hsz|1lNm z{KawneX|2rBw^s%g7l5^6H;BHzQG@X(-Jf|&jEm5xI*21xhh%*`!V<+0b4;^hHSM+8abOv3D}NlE;@zxSM*cUnvF@KCpl z$cr&)wagTXPoJD9`6tVpbq7VEvU_>FXm14f_oc^&(vK-Q0P>%%rCd3y$LU<*ckc~m zRk#UDDJ6FF)1C{sR$;}yPAx^6tu_+3!;LFfXKM4F9-|41GZTj~Y;a720n=sy+uUsO z4`e=@0aUnE-%M*FPr-sq{NlWR(QV@oek2L6g4jm3+<$ehzA7*?1e=8aPjjRHUV@VT z#kT4v(`WpLEcjR?v4`0-eYn2+_e1fY%ohAV{uF)_V;kfr``AjAzU=hp*JRm5(~zCm zCl|5UHs{=E4t9vbkdo9YVT~69o`i6`X60*%@bG>aB`FmXnx#zc@I4k4?i`%aPS3G> zS9}L+s+FCQ?|`yGsW_*f0k^Qe&-Mu)D<*=x8Sy>mq3|wa62m_wwX=z-P>^n39oE-= z4(XS52(&07DQZQ-xILrttyLso(tHkZuH@6jeao&^74WTZOb`I7_f+i#skyaS;Ev>& zG&xUs5-56Y6wZHA){|rstSCq2kU;r@g%SrkjVZU-Q~u@iZ@oRxb~GP#KtY#GX(DF$ zYf=pgIxsWN+?so7YBSq^^}~d%Z<&TRCs#?xEBl=ViNfq$e!^kYYPHQJjL0oWr4Tv2InFu(Nx5 z4%DPSdN@4HyHOCn8^%V~nX)tXc8tfg&7l%EcsG4Ea;E75)*nsJ^Q28LiYK!5RW>1I z9m91#mXbq%{=^iL`^{s6r<5>>`T$jie{lbI%xE!#B9=>x>knYe9Ky8Dovm>8-d71j9Y zsOHHc&j2n8${jtf#JCr&A++W?+AZY}PGBSx%y> z>6cP7?iyEi&d&6W+}w%s(h5DPVc08{*{0_L$B1z86AkPX2Xm&0uGjZ*lACjNwnU7~ z%oEM}eKF*mw<{v&cxYsH3zI@kL3>{~KBI1f0rvUGWNpQeT4l=CE*y64Prwlzw7cbf zj18BU8Yg$wQRA-uWC@-|xYB_AD@((g>;~sk5wGG7$&o;?9+F9J&cDi5ZS3h0DcBU} z!*8LXtFfn*3H`5IzJl%?HhZyJ41PH>vIaRcufUhFbhK2LdEl?{QUmL zNxzU%t$vRwDM&Jl=ZN9Afj%Qh+YGDk`bWmiZr6>hzAVi7A!5l-*7*w4E9$tal9uus znR=0quMu`Z$?YoX3h})x!}~jnbG6nJNk>Hmt>jLtQBd2TuZyh8YkPXU)4lRqX@|g- zu)(1dvWzm?e@C4BiS_j>t3>SMqtgc-ta>hi7yZ|3^4-YSJl!5{oMRLLoW^atwGKzZ zg&eLA(l2p48^tAYK^--{#H~mMS)?o9Z_a0Vkcu807XLBXa*|0B#(DpRLEv8)uc8nb zYH`J$9=&~0P*HK>;t2N}UM<*&aW&VQWljefz}=dK;9PFN=fp^xUen_AUy};C*UdWq z?eD(3&C_$i1a`BINsmUt*xFgyu-^IHnTXnyiJVbkp&Gy5|N5=sH4r)Xq-|DJ>v!w$evRmGiitAE2G!yl zJf6cW>3&0l>y0ivKRN?g?bz8GY7B?-|0#1(Y`33!ODDJ3L4+b5>v5HSZ=u||5Z#=X0Rrw?v&D;2;)&1Xnl61{lP@}nN=%g7iGAYzrRzP57|j;NF`noSOtIySPH}t zkVAM9wGFox<{X5qej$8WC(U4%hxHh79qgsT)`T?hj~UY!yIyHrIV?!D_fv>eCW?0Q zW4>-bR~~v}!@su_i?X8koh=y{Q90b$nG`Y|*?lX6QP>=kp>9X5#@Nnban+8-y`-i= zp@M8jLWt!Mrdfx$D)m|(6FzAlp)mEr!hQ@|{bdc*962Hxx#OA<$Tc=(OdcqUG-%o& z9WGe*Tzd7!5lxl9Wh6|cVJ~R>^B5!CGy8Vgc-P1f0d}k@cEZvbE;ul^(iKkJ4XTCC ztkm1QeEqjdf@_CTYpR2Y&7W)lzX?INwN#yy#!%HX&*Xd z`Anh;9-+khpZ`)t4sa#b(MXCmLoE1ji1x6-k?cV<#~~Q&jsVo3?SXgdYBPa)WpQ4$ zOC2HywLH`pH2F#cib-x94%sU&%rO?-YI>@a9#+sTjrV@_GJUFfF1&nGje~w$z8jUA uP&2S;jDel|{!g>3|6CdQf5Q0_c9+s?o^$yyGVt;`AS0nD{$124;C}%d1B-M3 literal 11977 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 AKmY&$ From 0f01378e7a0fdcc4d126d6877fbd3d8fceb23777 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Mon, 9 Mar 2015 20:29:28 +0000 Subject: [PATCH 04/12] Reworked suggested code, added brain implants, misc additions. Fix missing ')'. DELETE THIS --- code/datums/hud.dm | 2 +- code/datums/mutations.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 6 +- .../mob/living/carbon/human/examine.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 7 +- .../mob/living/carbon/human/species.dm | 6 +- code/modules/mob/living/carbon/life.dm | 6 +- code/modules/mob/mob_defines.dm | 4 +- code/modules/surgery/cybernetic_implants.dm | 44 +++++++ .../modules/surgery/eye_cybernetic_implant.dm | 31 ----- .../surgery/organs/cybernetic_implants.dm | 112 ++++++++++++++---- icons/obj/surgery.dmi | Bin 12003 -> 12582 bytes tgstation.dme | 2 +- 13 files changed, 158 insertions(+), 66 deletions(-) create mode 100644 code/modules/surgery/cybernetic_implants.dm delete mode 100644 code/modules/surgery/eye_cybernetic_implant.dm diff --git a/code/datums/hud.dm b/code/datums/hud.dm index 14e79c51f35..f3315d1cfd6 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -20,7 +20,7 @@ var/datum/atom_hud/huds = list( \ var/list/hud_icons = list() //these will be the indexes for the atom's hud_list /datum/atom_hud/proc/remove_hud_from(var/mob/M) - if(locate(src,M.permanent_huds)) + if(src in M.permanent_huds) return for(var/atom/A in hudatoms) remove_from_single_hud(M, A) diff --git a/code/datums/mutations.dm b/code/datums/mutations.dm index 07999b41ed1..a9576525c13 100644 --- a/code/datums/mutations.dm +++ b/code/datums/mutations.dm @@ -179,7 +179,7 @@ /datum/mutation/human/x_ray/on_losing(mob/living/carbon/human/owner) if(..()) return - if(locate(SEE_MOBS,owner.permanent_sight_flags) && locate(SEE_OBJS,owner.permanent_sight_flags) && locate(SEE_TURFS,owner.permanent_sight_flags)) //Xray flag combo + if((SEE_MOBS in owner.permanent_sight_flags) && (SEE_OBJS in owner.permanent_sight_flags) && (SEE_TURFS in owner.permanent_sight_flags)) //Xray flag combo return owner.see_in_dark = initial(owner.see_in_dark) owner.sight = initial(owner.sight) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 8371b8386aa..bdd77498ee3 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -156,7 +156,11 @@ /mob/living/carbon/proc/eyecheck() - return locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 + for(var/obj/item/I in contents) + if(istype(I,/obj/item/cybernetic_implant/eyes)) + var/obj/item/cybernetic_implant/eyes/EFP = I + return EFP.flash_protect + return 0 /mob/living/carbon/proc/tintcheck() return 0 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 2b626f600f8..f83425b4a26 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -284,7 +284,7 @@ if(R) msg += "\[Medical evaluation\]
" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(H.internal_organs,/obj/item/organ/cybernetic_implant/eyes/security_hud)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(/obj/item/cybernetic_implant/eyes/security_hud,H.internal_organs)) if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/criminal = "None" diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b4b04f5a5bf..2d84986f081 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -78,7 +78,7 @@ ///eyecheck() ///Returns a number between -1 to 2 /mob/living/carbon/human/eyecheck() - var/number = locate(/obj/item/organ/cybernetic_implant/eyes/thermals,internal_organs) ? -1 : 0 + var/number = 0 if(istype(src.head, /obj/item/clothing/head)) //are they wearing something on their head var/obj/item/clothing/head/HFP = src.head //if yes gets the flash protection value from that item number += HFP.flash_protect @@ -88,6 +88,11 @@ if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask var/obj/item/clothing/mask/MFP = src.wear_mask number += MFP.flash_protect + for(var/obj/item/I in contents) + if(istype(I,/obj/item/cybernetic_implant/eyes)) + var/obj/item/cybernetic_implant/eyes/EFP = I + number += EFP.flash_protect + break return number ///tintcheck() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 897583a2104..1f0c0254608 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -510,11 +510,11 @@ H.see_in_dark = 8 if(!H.druggy) H.see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS,H.permanent_sight_flags)) + if(!(SEE_TURFS in H.permanent_sight_flags)) H.sight &= ~SEE_TURFS - if(!locate(SEE_MOBS,H.permanent_sight_flags)) + if(!(SEE_MOBS in H.permanent_sight_flags)) H.sight &= ~SEE_MOBS - if(!locate(SEE_OBJS,H.permanent_sight_flags)) + if(!(SEE_OBJS in H.permanent_sight_flags)) H.sight &= ~SEE_OBJS H.see_in_dark = (H.sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : darksight diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 8120504ca89..763b5f68938 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -561,11 +561,11 @@ see_in_dark = 8 see_invisible = SEE_INVISIBLE_LEVEL_TWO else - if(!locate(SEE_TURFS,permanent_sight_flags)) + if(!(SEE_TURFS in permanent_sight_flags)) sight &= ~SEE_TURFS - if(!locate(SEE_MOBS,permanent_sight_flags)) + if(!(SEE_MOBS in permanent_sight_flags)) sight &= ~SEE_MOBS - if(!locate(SEE_OBJS,permanent_sight_flags)) + if(!(SEE_OBJS in permanent_sight_flags)) sight &= ~SEE_OBJS see_in_dark = (sight == SEE_TURFS|SEE_MOBS|SEE_OBJS) ? 8 : 2 //Xray flag combo diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 39bced45333..5604b19e880 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -157,5 +157,5 @@ var/turf/listed_turf = null //the current turf being examined in the stat panel var/last_movement = 0 // Last world.time the mob actually moved of its own accord. - var/permanent_huds = new /list() //any HUDs in this list will be ignored by HUD removing procs - var/permanent_sight_flags = new /list() //any sight flags in this list will be ignored by removing procs \ No newline at end of file + var/permanent_huds = list() //any HUDs in this list will be ignored by HUD removing procs + var/permanent_sight_flags = list() //any sight flags in this list will be ignored by removing procs \ No newline at end of file diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm new file mode 100644 index 00000000000..35245dfc9ff --- /dev/null +++ b/code/modules/surgery/cybernetic_implants.dm @@ -0,0 +1,44 @@ +#define MAX_BRAIN_IMPLANT 2 + +/datum/surgery/eye_cybernetic_implant/eyes + name = "eye cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + location = "eyes" + +/datum/surgery/eye_cybernetic_implant/brain + name = "brain cybernetic implant" + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/close) + location = "head" + +/datum/surgery_step/cybernetic_implant + implements = list(/obj/item/cybernetic_implant = 100) + time = 32 + +/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) + user.visible_message("[user] begins to implant [target] with [implant].") + +/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) + if(implant) + var/full = 0 + switch(target_zone) + if("eyes") + if(locate(/obj/item/cybernetic_implant/eyes,target.contents)) + full = 1 + if("head") + var/count = 0 + for(var/obj/item/I in target.contents) + if(istype(I,/obj/item/cybernetic_implant/brain)) + count++ + if(count >= MAX_BRAIN_IMPLANT) + full = 1 + + if(full) + user.visible_message("[user] can't seem to implant anything else into the [target]'s [target_zone].") + return 1 + else + user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!") + implant.owner = target + implant.function() + user.drop_item() + implant.loc = target + return 1 \ No newline at end of file diff --git a/code/modules/surgery/eye_cybernetic_implant.dm b/code/modules/surgery/eye_cybernetic_implant.dm deleted file mode 100644 index f9d1367753a..00000000000 --- a/code/modules/surgery/eye_cybernetic_implant.dm +++ /dev/null @@ -1,31 +0,0 @@ -/datum/surgery/eye_cybernetic_implant - name = "eye cybernetic implant" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) - location = "eyes" - -/datum/surgery_step/cybernetic_implant - accept_any_item = 1 - time = 32 - -/datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - user.visible_message("[user] begins to implant [target] with [tool].") - -/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - if(tool) - if(!istype(tool, /obj/item/organ/cybernetic_implant/eyes)) - user.visible_message("[user] can't seem to fit [tool] in [target]'s [target_zone].") - return 0 - else if(locate(/obj/item/organ/cybernetic_implant/eyes,target.internal_organs)) - user.visible_message("[user] can't seem to implant anything else into [target]'s eyes.") - return 1 - else - user.visible_message("[user] inserts [tool] into [target]'s [target_zone]!") - - var/obj/item/organ/cybernetic_implant/eyes/implant = tool - implant.owner = target - implant.function() - target.internal_organs |= implant - user.drop_item() - implant.loc = target - - return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 218542fa203..de2f514f941 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -1,72 +1,78 @@ -/obj/item/organ/cybernetic_implant +/obj/item/cybernetic_implant name = "cybernetic implant" desc = "a state-of-the-art implant that improves a baseline's functionality" + icon = 'icons/obj/surgery.dmi' var/mob/owner = null + var/implant_color = "#FFFFFF" -/obj/item/organ/cybernetic_implant/New(var/mob/M = null) +/obj/item/cybernetic_implant/New(var/mob/M = null) if(M) owner = M return ..() -/obj/item/organ/cybernetic_implant/proc/function() +/obj/item/cybernetic_implant/proc/function() return -/obj/item/organ/cybernetic_implant/eyes +//[[[[EYES]]]] +/obj/item/cybernetic_implant/eyes name = "cybernetic eyes" desc = "artificial photoreceptors with specialized functionality" icon_state = "eye_implant" var/eye_color = "fff" - var/implant_color = "#FFFFFF" -/obj/item/organ/cybernetic_implant/eyes/New() + var/flash_protect = 0 + +/obj/item/cybernetic_implant/eyes/New() var/icon/overlay = new /icon('icons/obj/surgery.dmi',"eye_implant_overlay") overlay.ColorTone(implant_color) overlays |= overlay ..() -/obj/item/organ/cybernetic_implant/eyes/proc/update_eye_color() +/obj/item/cybernetic_implant/eyes/proc/update_eye_color(fluff_message) if(istype(owner,/mob/living/carbon/human)) var/mob/living/carbon/human/HMN = owner HMN.eye_color = eye_color HMN.regenerate_icons() + if(fluff_message) + owner << "[fluff_message]" -/obj/item/organ/cybernetic_implant/eyes/medical_hud +/obj/item/cybernetic_implant/eyes/medical_hud name = "medical hud implant" desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." eye_color = "0ff" implant_color = "#00FFFF" -/obj/item/organ/cybernetic_implant/eyes/medical_hud/function() +/obj/item/cybernetic_implant/eyes/medical_hud/function() if(!owner) return var/datum/atom_hud/H = huds[DATA_HUD_MEDICAL_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() + update_eye_color("You suddenly see health bars floating above people's heads...") -/obj/item/organ/cybernetic_implant/eyes/security_hud +/obj/item/cybernetic_implant/eyes/security_hud name = "security hud implant" desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." eye_color = "d00" implant_color = "#CC0000" -/obj/item/organ/cybernetic_implant/eyes/security_hud/function() +/obj/item/cybernetic_implant/eyes/security_hud/function() if(!owner) return var/datum/atom_hud/H = huds[DATA_HUD_SECURITY_ADVANCED] H.add_hud_to(owner) owner.permanent_huds |= H - update_eye_color() + update_eye_color("Job indicator icons pop up in your vision. That is not a certified surgeon...") -/obj/item/organ/cybernetic_implant/eyes/xray +/obj/item/cybernetic_implant/eyes/xray name = "xray implant" desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." eye_color = "000" implant_color = "#000000" -/obj/item/organ/cybernetic_implant/eyes/xray/function() +/obj/item/cybernetic_implant/eyes/xray/function() if(!owner) return @@ -76,23 +82,24 @@ owner.permanent_sight_flags |= SEE_MOBS owner.permanent_sight_flags |= SEE_OBJS owner.permanent_sight_flags |= SEE_TURFS - update_eye_color() + update_eye_color("Your vision is augmented!") -/obj/item/organ/cybernetic_implant/eyes/thermals +/obj/item/cybernetic_implant/eyes/thermals name = "thermals implant" desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." eye_color = "FC0" implant_color = "#FFCC00" + flash_protect = -1 -/obj/item/organ/cybernetic_implant/eyes/thermals/function() +/obj/item/cybernetic_implant/eyes/thermals/function() if(!owner) return owner.sight |= SEE_MOBS owner.permanent_sight_flags |= SEE_MOBS - update_eye_color() + update_eye_color("You see prey everywhere you look...") -/obj/item/organ/cybernetic_implant/eyes/emp_act(severity) +/obj/item/cybernetic_implant/eyes/emp_act(severity) if(severity > 1) if(prob(5)) return @@ -101,4 +108,67 @@ owner.disabilities |= BLIND spawn(50) owner.sight |= save_sight - owner.disabilities &= ~BLIND \ No newline at end of file + owner.disabilities &= ~BLIND + + +//[[[[BRAIN]]]] + +/obj/item/cybernetic_implant/brain + name = "cybernetic brain implant" + desc = "injectors of extra sub-routines for the brain" + icon_state = "brain_implant" + +/obj/item/cybernetic_implant/brain/New() + var/icon/overlay = new /icon('icons/obj/surgery.dmi',"brain_implant_overlay") + overlay.ColorTone(implant_color) + overlays |= overlay + ..() + +/obj/item/cybernetic_implant/brain/anti_drop + name = "anti-drop implant" + desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." + var/active = 0 + var/l_hand_ignore = 0 + var/r_hand_ignore = 0 + implant_color = "#DE7E00" + +/obj/item/cybernetic_implant/brain/anti_drop/function() + action_button_name = "Toggle Anti-Drop" + +/obj/item/cybernetic_implant/brain/anti_drop/ui_action_click() + active = !active + if(active) + if(owner.l_hand) + if(NODROP in owner.l_hand.flags) + l_hand_ignore = 1 + else + owner.l_hand.flags |= NODROP + l_hand_ignore = 0 + + if(owner.r_hand) + if(NODROP in owner.r_hand.flags) + r_hand_ignore = 1 + else + owner.r_hand.flags |= NODROP + r_hand_ignore = 0 + + if(!owner.r_hand && !owner.l_hand) + owner << "You are not holding any items, your hands relax..." + active = 0 + else + var/noodles = 0 + noodles += !l_hand_ignore && owner.l_hand ? 1 : 0 + noodles += !r_hand_ignore && owner.r_hand ? 2 : 0 + switch(noodles) + if(1) + owner << "Your left hand's grip tightens." + if(2) + owner << "Your right hand's grip tightens." + if(3) + owner << "Both of your hand's grips tighten." + else + if(!l_hand_ignore && owner.l_hand) + owner.l_hand.flags &= ~NODROP + if(!r_hand_ignore && owner.r_hand) + owner.r_hand.flags &= ~NODROP + owner << "Your hands relax..." diff --git a/icons/obj/surgery.dmi b/icons/obj/surgery.dmi index da2b249866dd245d44c3318954975d93dc450ef2..93ebade829d8b8b54225500b975b4fa4965b54ef 100644 GIT binary patch literal 12582 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 literal 12003 zcmZvC1yohh*XMn7BVE!cT~dm~qq`gF?h*u~9^D}+-6;r2qjW3XAq~>qJ(q9R{AcD{ zA8S3{x^V8<_1kgwKH0FR95$svbM4h&%B;~74oo-rx>!So-5w72cd>JIC?U&aeuFvuO-;OBdd z`h$YleW{z`@rKY*05sf$BJ z`|Iz|!^&N~>VoUiS0|Nw$28r1Q=F)#^x+yiR`NQ^>a#`CaWX;YIV6@-+Lt2ijS63; z#Y8MmgOQhwtytE@buO%N?cjIFjLxg&D>yyID`?Ghid)%}ltdjA%o$fOZ9EL^HL>@c z(in7~3SVFQ3td8_e%!XmX5`3~Uk&wz*MYv2>_@78F3MH zkBoy%Pi-}=rM@;I#K3?&4fH&G^%q2mG&Fe=-SgG+5t`&Fmlc}tW3=sA(X6BlrTAOt zRSF#3Z0+mnDk2E~tW9PXuu-L>v$1@~!T3!Rhhi) zC4A*x?}bf^k0z3<+}IJZhoQ{C&ZQ1T3l^Jq$%M%M(P^a#0AN3VBL5r8>~_kej5t(= z379b~ukYmT3qTEsZaM@=1k0aiqp z&SQ&(^w|^2;Zild$!a_h|B6TLwUWj18;q_=6a+ZtTxDt9X2%FLrW}6`P0qNaO2z>M zT4XUg+-hr5c`VVeH+<|PXh4S7IY2FLZEikA2(8N<_n6CtBLz$e;dOT9{vA=m1iehd z+Weq_ZXaEKd`Q%^vtxn4SU=QjBO@b!Gf(F?k09vc(17#LiB@J%uV=tP1JDWLq9ylc zf=OCLL{m`AG2-LdXz1z59v>mIt$QfSWH*;b%QJaLX zeN$MgwyhnvZpMS)hgFg5{hcR*&;7NtZ`s3jVfx} zGNLS>@%Br2bo8r%fdSB@?dkbaw71(TKU{ZIU3VwL>FDXX?C|x#jRRhYO2$&y<1FHJ zbad=SUi=$MCmFhm9-IA~&gVG2bNwL*mUg=M>q{^M{;s3YUF&}2-0y1vMgQ;I3YG5B ziu|Im#&lkLoAkK2oG_4_B_3}3G-`e7U*5S>%~^HwACe?%d71AyoxqI82|0T9GRGl z%MauIX%*9U$(o^bz7HT8wCL&SX%{*mAOt1P$MVBsVkj`Fs7cy4u9nt$Ymn%usUe{7 z$7g3-Y+r!()$O;j}bd?&$l_qJBb# zpqD23oQbKa49HB0J)*+bx6U;1fRx`;%W!bmK_{TzqmyqoC=IH9=BASQ()|x?DKqX< z1IGBg{rcJ(P!f@Mcz6f^_D@5q?YGgalutfvz*IPK>zmH))8IF@9FmV9%2TekT*hSfJo9li>YJ6XpJ$Mq%x<#fugwG(^!C>Ydv^H^}w$X5vg zg&U-cBTf2Dkq3I?ktO2OljW_oY{PrCMG0j;N>+P(UC=k4!^>cnpjIZOso&A<+qZA2 zczKh-ulBAkctu6U7vbUnj87`I7lfdf6s4dn3bomIfefp|EBi7|@tIyMeWM=JE0UKl zwi9zU22kA$bJ=lSz18XKk|#Laspn=ckhL^2z4=^PP#6 z6Aw%wN*Uio`ubBUBY*yU8@RaWDMy%md1@|u10?CaBheyD zij}Al;&nWv3#s__Z^MjCUP!Gr$R_{O20HBv6k;&&JsVzGd9-k2!|d7ha8M8i#|!0> zFwX966*J%T>^5v$b$53&kR~W|b%Nmx1CL(OjvITTNC6&T(QAAGa5ydr45o4+-(4Pb zWxV?s_w{QS4y`1V4%dHVi}w0#M92W`XWu7q zzCK>v-r2Xi_~7aakE+9&%=#e&SlK~ywAS0EWAF>|xr;AjZI($mQRjl@=tROF&) zra5sLf()CKoq&`SA|$MrVWxdC##3b)NJ-cp{xCbrWX`b*1amUJ#_g>Mo?8g)+99{P zMvWfs()rVy&z~=hH{oF&fynM<2efpc9?WJ%=I6!BqeFh*UUZuONrnJ$_xF>yNJvPc z3uh6Z_Gck0o(O-N-I$A%vSUh0806D=F=@V_h=pSHQ2O0Nl$4Y}Yzyq^M%CI(1#^kf zNcCzN?%eAagR31Dn~jGv-p$rn#ttv+$bQJN9$2@AO(w6ekW+w%*Buq(4vlNL?~Efs zoU=cz!aP-{IlkGRceILOcU;^H#GKu_nR;Id2}C4Mul2z>1TZWRT8?B@)aaF}o1AV8 zVA2?YP%|+xQP$QDqm_!usjbCtYHErbFq4*%5s{HW?KQBetPW<)sEBZT%u-QNA?CJv z5kvmI=#2L^Ck7@%v<3m(PqX+svXmMFCW@7E8yit{bW)vMTtrRQ5HFtA)@c4VeI#RK zO!461;ZbJ5rwW3~Bq}qZpr{1AfD2Yd)zabE=3VeQYdwj{bs-((cs*YOrV_l*$N&TH&&C=qo2Y;PmjD zAmgp?OL;fU9A#i?s-(WUcaK(*>eVa6#b!77*gi1@1xyOT&j{h-c@8a;`$9(5_0^D^ z792?;d0fa$CA#Uolp+;yoQ=5$O~l9&U<;7HloxD<2lDb`CvUQol1e|;d~V%P$-HX* zT|BpC8O50#JqD)VHgTWOjHqvo9}TB-t_LEBT6r;iGBP=AhgB0c6>8d4&H}8N&JT<% z$sAqvpAMYY0pK$8JuNRU;eu`72c{(1upSfFqb2g`>1kyq4a^_6(|^u&md$YD4h(Ni z=For=uAp6sc#>}n&zZpZ%)D$N0$Ay~TDEwGKtFa?5Llm(-+W(YqJl@d6uZ`)vKL-u zrUh0C!@Vzz-*2Z!1hAWQg<$Tta`Z2d!I)@zdwXekc{N)Mz;GC7kGaU8nr%H%L?R6L zql*6KlmN%<>CtDjesJ=uu23@evfodUGy(#Gg4l25z7LzghRZwPu*bH{!%j9nAz|$7 z=FHSJq$M4eG&-%RF%lCU-4lXIHW@(jp|{=EnGZdyIjBq5WcS26KsE z%m&fU{@!~9;l^aj@-2lsMC*HjZFF2wQJsFluAG%aU^Nft)G;4Z4#o2#NG*{PBh%oG z0}5LXoGQah(d;deTqhKQIMLM?OjN<0)c;kFmca1QLX{zm_*l9BwFt35`E3xIbgq+h zB%-(8^|eS+U4{Ugx4_5?l00RD*BH2vyK|C&Va3c=uI^Tb#1zy(6m0`9$Ctq-cDRRa zqQ8n9H}_H3Lll>(;Do+`bmhg07|;!q^@3;4D>A~Yw$Ia9bL#Bh>&&!1gzb&4vi+!^ zW*tHf&g05#dmsnbNk~qbC_1>mF}odVCYN!#_QHMd##?ZS#gLf1cDC%R&W@*e_jAlI zQH-y~t@U(}ctzw$riSX%qqg+YyE^@c$GU8-^z&;{exDXZ{Fjee?S8~@iKq8sPsSsL z^o7J4o#1-|dt$#_4W3S?Fe2kQEZ1kco9z`cNAv8Jj2X)X!BR5+IDx2=PatEifg zj)Ys_=BIkM$j)TC<%c0M6kssx97){zs-1EdsVI=VpNj-*k_|qJ-t>G`8V)Q+i6avu zXE<4mUX;%t=cxBj{Q=hhyrta}Jb$#{gbf2QRE^9p#)Ama8NM}JA#bObaDt~12AKuN zG!;37k95(0oS10e)Q0!bd@IqE^SH4=dg;Z#K00J)B997|8*^sP9_=s)tK!{lTHVGJ zMWyk$ha<|j+?hW0q-FdmnS_3+DAEBF# z1j&?xzfEeDwdp1xj{?6k5xt6t@*~A0zOg-I z3Y5E^ANiKLUF}CN_VXv8EMp`a^~JXavAnukWFVTQ_Gl+4P3t{;A?t9YCf4HMYc@7P z6~>fY@)5;{Hld5nKO;kGa$%5Wg)O(Ue+uJ?%Jcn$gOj&S#l^*+voBJ1$OtwGMvkvL z^v`$iye&$y6o;910FD^JQ9S5(I&2B0$ea?UQOhfKMMDGBaB&Qxl-7|6_rucU;Uaya zb5|snGZz(gy`a;yH-SZ!1BnUCT)+##%Oml#mQoJa+abc^og;eZS9|;h%&egwyW4c* zLnV!AvtKI=G&pWud3fEL=?P{RBs-qGH+8-B*S;aeD-*gpT6T0z{r2tKZ5?l}`{7@i z^DoM;S$m@Q$&?wAw&(ibV-FX5C&r7nt!7kMshOASKFl0n%OrjOIgPr*Me@dB38q>K zi*jyAlnJ{tPoh{Yu+&a~7{ft+LNPwhZNLEBRqP@fS0lL?T>*{C8@_Sf6;G^$Y zB%c*h?2#}6v(W<*p#q&m*_;FSv-&1U3BBg2mw@W8{r~nLqF*DZ7tNgRaMpW1HX~XK!D9n0)_;kz$+?j zd_n;vKp>Hr-bb!z4o*`6ANtxe;L}kHyg?;JJA9X1<8>zI;Pg`#4PZ2pdpK#NF~Vdt z(Lty&vTIg3u5AeZ+d<)B)NfZhd%MhK*3aPAQa@Hat3#S{x*Nu{9nPC3uIV^!&$wOwG+r$3t}}EOVAdLN-#Qe-7hvi7 zL9nbXJ`>AmRS(Nts1>6m(&C_M^q@wy(&n+{EJN{-B!|pd^|ekDLeiNjBXjdILd+EE z6YGP(eY-MrIbs`|PA5-Oi6;x2Q8zdaHX?Ojd zEq1I+mD%%r*CQ?9W!1KsZ5~W2a*bY1dOIctk@_bopS3Vf@VTe4t}MuuF$OKn*9Dr+ zXlYQAdJ?B`j%mI4e`TT01pwQ6t#Ulw$7FQQSV0Cp>A;wqc z1sX&Y40w=^?XmnRxZTdV8p~>*yH8AHg%EWp>;2vG(`$2c^FlH{2UiqqZ2AlHKmGks z5s`^}g=V+CB42%FWhi2SRpE`P2;@k${%ms+1e+Nio}ShOqUcE4!T1090#Z7yJu5Omtvgw+<>HLGS0|ECzt!HgfTSQgPQuTcG}-nG)dm z_JQ&R;Nx!Jk%^d{Kk}Wmv1R2W&~7oHkV#kI21P5RP~jqsdw#wCK#D5-7BTfqSga!) zy@XoU?#@lvqIE6gnAW*OlWEL-%L4X7ojD1h-aam(EK8F0-rYvEmzcVJE+SaHKb|9e zrMN6nXBa&)dMg-Jxlk7Ca!;z7%*5~h)R3s9qJk3i~CvzegR+~Pei(2|# zi=ti-j*kDc%va_P2h}jRGfh-_MnvuQNQ0jxgMcEkdoMBTzQF

LO&_%4Pr<%xHs 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 diff --git a/tgstation.dme b/tgstation.dme index cb1378c51aa..4792eef8e46 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1390,7 +1390,7 @@ #include "code\modules\surgery\brain_removal.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" -#include "code\modules\surgery\eye_cybernetic_implant.dm" +#include "code\modules\surgery\cybernetic_implants.dm" #include "code\modules\surgery\eye_surgery.dm" #include "code\modules\surgery\gender_reassignment.dm" #include "code\modules\surgery\generic_steps.dm" From b2baa54a0815f5a3570da051926de0b7f3f1eb9d Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 10 Mar 2015 22:28:53 +0000 Subject: [PATCH 05/12] Added anti-stun brain implant. --- .../surgery/organs/cybernetic_implants.dm | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index de2f514f941..8979c09179a 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -1,8 +1,10 @@ +#define STUN_SET_AMOUNT 2 + /obj/item/cybernetic_implant name = "cybernetic implant" desc = "a state-of-the-art implant that improves a baseline's functionality" icon = 'icons/obj/surgery.dmi' - var/mob/owner = null + var/mob/living/carbon/owner = null var/implant_color = "#FFFFFF" /obj/item/cybernetic_implant/New(var/mob/M = null) @@ -13,7 +15,9 @@ /obj/item/cybernetic_implant/proc/function() return + //[[[[EYES]]]] + /obj/item/cybernetic_implant/eyes name = "cybernetic eyes" desc = "artificial photoreceptors with specialized functionality" @@ -172,3 +176,24 @@ if(!r_hand_ignore && owner.r_hand) owner.r_hand.flags &= ~NODROP owner << "Your hands relax..." + +/obj/item/cybernetic_implant/brain/nerve_restore + name = "CNS restorer implant" + desc = "This implant will automatically give you back control over your central nervous system, reducing down time when stunned." + implant_color = "#FFFF00" + +/obj/item/cybernetic_implant/brain/nerve_restore/function() + SSobj.processing |= src + +/obj/item/cybernetic_implant/brain/nerve_restore/process() + if(!owner) + SSobj.processing.Remove(src) + qdel(src) + return + if(owner.stat == DEAD) + return + + if(owner.stunned > STUN_SET_AMOUNT) + owner.stunned = STUN_SET_AMOUNT + if(owner.weakened > STUN_SET_AMOUNT) + owner.weakened = STUN_SET_AMOUNT From 821a96798687458a81494c1ebb2b48f0603c352a Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 10 Mar 2015 23:39:08 +0000 Subject: [PATCH 06/12] Added Research designs for all implants. Added brain implant emp_act(). --- code/modules/research/designs.dm | 64 +++++++++++++++++++ .../surgery/organs/cybernetic_implants.dm | 33 +++++++--- 2 files changed, 89 insertions(+), 8 deletions(-) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 007621efefd..2401bdea452 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -370,3 +370,67 @@ datum/design/proc/CalcReliability(var/list/temp_techs) materials = list("$metal" = 2000, "$glass" = 1000) build_path = /obj/item/weapon/holosign_creator category = list("Equipement") + +///////////////////////////////////////// +//////////Cybernetic Implants//////////// +///////////////////////////////////////// + +/datum/design/cyberimp_medical_hud + name = "Medical HUD implant" + desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." + id = "ci-medhud" + req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100) + build_path = /obj/item/cybernetic_implant/eyes/medical_hud + category = list("Equipement") + +/datum/design/cyberimp_security_hud + name = "Security HUD implant" + desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." + id = "ci-sechud" + req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300) + build_path = /obj/item/cybernetic_implant/eyes/security_hud + category = list("Equipement") + +/datum/design/cyberimp_xray + name = "X-Ray implant" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + id = "ci-xray" + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) + build_path = /obj/item/cybernetic_implant/eyes/xray + category = list("Equipement") + +/datum/design/cyberimb_thermals + name = "Thermals implant" + desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." + id = "ci-thermals" + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) + build_path = /obj/item/cybernetic_implant/eyes/thermals + category = list("Equipement") + +/datum/design/cyberimb_antidrop + name = "Anti-Drop implant" + desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." + id = "ci-antidrop" + req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 400) + build_path = /obj/item/cybernetic_implant/brain/anti_drop + category = list("Equipement") + +/datum/design/cyberimb_antistun + name = "CNS Rebooter implant" + desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." + id = "ci-antistun" + req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 600) + build_path = /obj/item/cybernetic_implant/brain/anti_stun + category = list("Equipement") diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 8979c09179a..c59e331da07 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -23,7 +23,6 @@ desc = "artificial photoreceptors with specialized functionality" icon_state = "eye_implant" var/eye_color = "fff" - var/flash_protect = 0 /obj/item/cybernetic_implant/eyes/New() @@ -42,7 +41,7 @@ /obj/item/cybernetic_implant/eyes/medical_hud name = "medical hud implant" - desc = "These cybernetic eyes will display a permanent medical HUD over everything you see. Wiggle eyes to control." + desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." eye_color = "0ff" implant_color = "#00FFFF" @@ -57,7 +56,7 @@ /obj/item/cybernetic_implant/eyes/security_hud name = "security hud implant" - desc = "These cybernetic eyes will display a permanent security HUD over everything you see. Wiggle eyes to control." + desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." eye_color = "d00" implant_color = "#CC0000" @@ -128,6 +127,11 @@ overlays |= overlay ..() +/obj/item/cybernetic_implant/brain/emp_act(severity) + var/stun_amount = 5 + (severity-1 ? 0 : 5) + owner.Stun(stun_amount) + return stun_amount + /obj/item/cybernetic_implant/brain/anti_drop name = "anti-drop implant" desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." @@ -177,15 +181,23 @@ owner.r_hand.flags &= ~NODROP owner << "Your hands relax..." -/obj/item/cybernetic_implant/brain/nerve_restore - name = "CNS restorer implant" - desc = "This implant will automatically give you back control over your central nervous system, reducing down time when stunned." +/obj/item/cybernetic_implant/brain/anti_drop/emp_act(severity) + if(prob(50 + (25 * (severity-1 ? 0 : 1)))) + if(!l_hand_ignore && owner.l_hand) + owner.l_hand.flags &= ~NODROP + if(!r_hand_ignore && owner.r_hand) + owner.r_hand.flags &= ~NODROP + ..() + +/obj/item/cybernetic_implant/brain/anti_stun + name = "CNS Rebooter implant" + desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." implant_color = "#FFFF00" -/obj/item/cybernetic_implant/brain/nerve_restore/function() +/obj/item/cybernetic_implant/brain/anti_stun/function() SSobj.processing |= src -/obj/item/cybernetic_implant/brain/nerve_restore/process() +/obj/item/cybernetic_implant/brain/anti_stun/process() if(!owner) SSobj.processing.Remove(src) qdel(src) @@ -197,3 +209,8 @@ owner.stunned = STUN_SET_AMOUNT if(owner.weakened > STUN_SET_AMOUNT) owner.weakened = STUN_SET_AMOUNT + +/obj/item/cybernetic_implant/brain/anti_stun/emp_act(severity) + SSobj.processing.Remove(src) + spawn(..() * 10) + SSobj.processing |= src \ No newline at end of file From a0dc8726bf59e5c6b9d2ace555594ff3d05f38f8 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Tue, 10 Mar 2015 23:46:23 +0000 Subject: [PATCH 07/12] Changelog. --- html/changelogs/xxalpha-cyberimplants.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/xxalpha-cyberimplants.yml diff --git a/html/changelogs/xxalpha-cyberimplants.yml b/html/changelogs/xxalpha-cyberimplants.yml new file mode 100644 index 00000000000..c5848f70bfb --- /dev/null +++ b/html/changelogs/xxalpha-cyberimplants.yml @@ -0,0 +1,6 @@ +author: xxalpha + +delete-after: True + +changes: + - rscadd: "Added Cybernetic Implants." \ No newline at end of file From a9b18759f2ddb3991dcc884734ac68c09cde02c3 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Thu, 19 Mar 2015 19:41:05 +0000 Subject: [PATCH 08/12] Fixed HUD examine features. --- code/modules/mob/living/carbon/human/examine.dm | 8 +++++--- code/modules/research/designs.dm | 4 ++-- code/modules/surgery/cybernetic_implants.dm | 1 + code/modules/surgery/organs/cybernetic_implants.dm | 8 ++++---- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index f83425b4a26..f20afceaaa3 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -266,7 +266,8 @@ if(istype(user, /mob/living/carbon/human)) var/mob/living/carbon/human/H = user - if(istype(H.glasses, /obj/item/clothing/glasses/hud)) + var/obj/item/cybernetic_implant/eyes/hud/CIH = locate(/obj/item/cybernetic_implant/eyes/hud) in internal_organs + if(istype(H.glasses, /obj/item/clothing/glasses/hud) || CIH) var/perpname = get_face_name(get_id_name("")) if(perpname) var/datum/data/record/R = find_record("name", perpname, data_core.general) @@ -274,7 +275,7 @@ msg += "Rank: [R.fields["rank"]]
" msg += "\[Front photo\] " msg += "\[Side photo\]
" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/health)) + if(istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/medical)) if(R) var/health = R.fields["p_stat"] msg += "\[[health]\]" @@ -284,7 +285,8 @@ if(R) msg += "\[Medical evaluation\]
" - if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || locate(/obj/item/cybernetic_implant/eyes/security_hud,H.internal_organs)) + + if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(CIH,/obj/item/cybernetic_implant/eyes/hud/security)) if(!user.stat && user != src) //|| !user.canmove || user.restrained()) Fluff: Sechuds have eye-tracking technology and sets 'arrest' to people that the wearer looks and blinks at. var/criminal = "None" diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 539989f4330..4bfe0723288 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -393,7 +393,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100) - build_path = /obj/item/cybernetic_implant/eyes/medical_hud + build_path = /obj/item/cybernetic_implant/eyes/hud/medical category = list("Equipement") /datum/design/cyberimp_security_hud @@ -403,7 +403,7 @@ datum/design/proc/CalcReliability(var/list/temp_techs) req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2) build_type = PROTOLATHE materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300) - build_path = /obj/item/cybernetic_implant/eyes/security_hud + build_path = /obj/item/cybernetic_implant/eyes/hud/security category = list("Equipement") /datum/design/cyberimp_xray diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm index 35245dfc9ff..9e6c2f1b5e0 100644 --- a/code/modules/surgery/cybernetic_implants.dm +++ b/code/modules/surgery/cybernetic_implants.dm @@ -41,4 +41,5 @@ implant.function() user.drop_item() implant.loc = target + target.internal_organs |= implant return 1 \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index c59e331da07..830ba6b6643 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -39,13 +39,13 @@ if(fluff_message) owner << "[fluff_message]" -/obj/item/cybernetic_implant/eyes/medical_hud +/obj/item/cybernetic_implant/eyes/hud/medical name = "medical hud implant" desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." eye_color = "0ff" implant_color = "#00FFFF" -/obj/item/cybernetic_implant/eyes/medical_hud/function() +/obj/item/cybernetic_implant/eyes/hud/medical/function() if(!owner) return @@ -54,13 +54,13 @@ owner.permanent_huds |= H update_eye_color("You suddenly see health bars floating above people's heads...") -/obj/item/cybernetic_implant/eyes/security_hud +/obj/item/cybernetic_implant/eyes/hud/security name = "security hud implant" desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." eye_color = "d00" implant_color = "#CC0000" -/obj/item/cybernetic_implant/eyes/security_hud/function() +/obj/item/cybernetic_implant/eyes/hud/security/function() if(!owner) return From 69d4536844a99a71310981e706e02b4c15308844 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Fri, 20 Mar 2015 22:57:52 +0000 Subject: [PATCH 09/12] Code tweaks. Designs are now in 'Medical'. --- code/modules/mob/living/carbon/carbon.dm | 7 +- .../mob/living/carbon/human/human_helpers.dm | 8 +-- code/modules/research/designs.dm | 64 ------------------ .../research/designs/medical_designs.dm | 65 +++++++++++++++++++ code/modules/surgery/cybernetic_implants.dm | 65 +++++++++++-------- .../surgery/organs/cybernetic_implants.dm | 42 +++++++----- 6 files changed, 134 insertions(+), 117 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1b6417610f3..e18c7e706f4 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -189,10 +189,9 @@ src << "Something bright flashes in the corner of your vision!" /mob/living/carbon/proc/eyecheck() - for(var/obj/item/I in contents) - if(istype(I,/obj/item/cybernetic_implant/eyes)) - var/obj/item/cybernetic_implant/eyes/EFP = I - return EFP.flash_protect + var/obj/item/cybernetic_implant/eyes/EFP = locate() in src + if(EFP) + return EFP.flash_protect return 0 /mob/living/carbon/proc/tintcheck() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 3082d4e7d80..902cce6896a 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -88,11 +88,9 @@ if(istype(src.wear_mask, /obj/item/clothing/mask)) //mask var/obj/item/clothing/mask/MFP = src.wear_mask number += MFP.flash_protect - for(var/obj/item/I in contents) - if(istype(I,/obj/item/cybernetic_implant/eyes)) - var/obj/item/cybernetic_implant/eyes/EFP = I - number += EFP.flash_protect - break + var/obj/item/cybernetic_implant/eyes/EFP = locate() in src + if(EFP) + number += EFP.flash_protect return number /mob/living/carbon/human/check_ear_prot() diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index 4bfe0723288..1afa12a3d0f 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -381,67 +381,3 @@ datum/design/proc/CalcReliability(var/list/temp_techs) materials = list("$metal" = 2000, "$glass" = 1000) build_path = /obj/item/weapon/holosign_creator category = list("Equipement") - -///////////////////////////////////////// -//////////Cybernetic Implants//////////// -///////////////////////////////////////// - -/datum/design/cyberimp_medical_hud - name = "Medical HUD implant" - desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." - id = "ci-medhud" - req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) - build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100) - build_path = /obj/item/cybernetic_implant/eyes/hud/medical - category = list("Equipement") - -/datum/design/cyberimp_security_hud - name = "Security HUD implant" - desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." - id = "ci-sechud" - req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2) - build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300) - build_path = /obj/item/cybernetic_implant/eyes/hud/security - category = list("Equipement") - -/datum/design/cyberimp_xray - name = "X-Ray implant" - desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." - id = "ci-xray" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) - build_path = /obj/item/cybernetic_implant/eyes/xray - category = list("Equipement") - -/datum/design/cyberimb_thermals - name = "Thermals implant" - desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." - id = "ci-thermals" - req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) - build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) - build_path = /obj/item/cybernetic_implant/eyes/thermals - category = list("Equipement") - -/datum/design/cyberimb_antidrop - name = "Anti-Drop implant" - desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." - id = "ci-antidrop" - req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) - build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 400) - build_path = /obj/item/cybernetic_implant/brain/anti_drop - category = list("Equipement") - -/datum/design/cyberimb_antistun - name = "CNS Rebooter implant" - desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." - id = "ci-antistun" - req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) - build_type = PROTOLATHE - materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 600) - build_path = /obj/item/cybernetic_implant/brain/anti_stun - category = list("Equipement") diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index 1e8e50a3be1..ad60fdd7c8c 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -92,3 +92,68 @@ datum/design/bluespacebodybag reliability = 76 build_path = /obj/item/bodybag/bluespace category = list("Medical Designs") + + +///////////////////////////////////////// +//////////Cybernetic Implants//////////// +///////////////////////////////////////// + +/datum/design/cyberimp_medical_hud + name = "Medical HUD implant" + desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." + id = "ci-medhud" + req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100) + build_path = /obj/item/cybernetic_implant/eyes/hud/medical + category = list("Medical Designs") + +/datum/design/cyberimp_security_hud + name = "Security HUD implant" + desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." + id = "ci-sechud" + req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300) + build_path = /obj/item/cybernetic_implant/eyes/hud/security + category = list("Medical Designs") + +/datum/design/cyberimp_xray + name = "X-Ray implant" + desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." + id = "ci-xray" + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) + build_path = /obj/item/cybernetic_implant/eyes/xray + category = list("Medical Designs") + +/datum/design/cyberimb_thermals + name = "Thermals implant" + desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." + id = "ci-thermals" + req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) + build_path = /obj/item/cybernetic_implant/eyes/thermals + category = list("Medical Designs") + +/datum/design/cyberimb_antidrop + name = "Anti-Drop implant" + desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." + id = "ci-antidrop" + req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 400) + build_path = /obj/item/cybernetic_implant/brain/anti_drop + category = list("Medical Designs") + +/datum/design/cyberimb_antistun + name = "CNS Rebooter implant" + desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." + id = "ci-antistun" + req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) + build_type = PROTOLATHE + materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 600) + build_path = /obj/item/cybernetic_implant/brain/anti_stun + category = list("Medical Designs") \ No newline at end of file diff --git a/code/modules/surgery/cybernetic_implants.dm b/code/modules/surgery/cybernetic_implants.dm index 9e6c2f1b5e0..6d289144127 100644 --- a/code/modules/surgery/cybernetic_implants.dm +++ b/code/modules/surgery/cybernetic_implants.dm @@ -2,44 +2,55 @@ /datum/surgery/eye_cybernetic_implant/eyes name = "eye cybernetic implant" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/cybernetic_implant/eyes, /datum/surgery_step/fix_eyes, /datum/surgery_step/close) location = "eyes" /datum/surgery/eye_cybernetic_implant/brain name = "brain cybernetic implant" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant, /datum/surgery_step/close) + steps = list(/datum/surgery_step/incise, /datum/surgery_step/clamp_bleeders, /datum/surgery_step/retract_skin, /datum/surgery_step/saw, /datum/surgery_step/cybernetic_implant/brain, /datum/surgery_step/close) location = "head" -/datum/surgery_step/cybernetic_implant - implements = list(/obj/item/cybernetic_implant = 100) +/datum/surgery_step/cybernetic_implant/eyes + implements = list(/obj/item/cybernetic_implant/eyes = 100) + time = 32 + +/datum/surgery_step/cybernetic_implant/brain + implements = list(/obj/item/cybernetic_implant/brain = 100) time = 32 /datum/surgery_step/cybernetic_implant/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) user.visible_message("[user] begins to implant [target] with [implant].") -/datum/surgery_step/cybernetic_implant/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/implant, datum/surgery/surgery) +/datum/surgery_step/cybernetic_implant/eyes/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/eyes/implant, datum/surgery/surgery) if(implant) var/full = 0 - switch(target_zone) - if("eyes") - if(locate(/obj/item/cybernetic_implant/eyes,target.contents)) - full = 1 - if("head") - var/count = 0 - for(var/obj/item/I in target.contents) - if(istype(I,/obj/item/cybernetic_implant/brain)) - count++ - if(count >= MAX_BRAIN_IMPLANT) - full = 1 + if(locate(/obj/item/cybernetic_implant/eyes,target.internal_organs)) + full = 1 - if(full) - user.visible_message("[user] can't seem to implant anything else into the [target]'s [target_zone].") - return 1 - else - user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!") - implant.owner = target - implant.function() - user.drop_item() - implant.loc = target - target.internal_organs |= implant - return 1 \ No newline at end of file + insert(user,target,implant,target_zone,full) + return 1 + +/datum/surgery_step/cybernetic_implant/brain/success(mob/user, mob/living/carbon/target, target_zone, obj/item/cybernetic_implant/brain/implant, datum/surgery/surgery) + if(implant) + var/full = 0 + for(var/obj/item/I in target.contents) + if(istype(I,/obj/item/cybernetic_implant/brain)) + full++ + + if(full < MAX_BRAIN_IMPLANT) + full = 0 + + insert(user,target,implant,target_zone,full) + return 1 + + +/datum/surgery_step/cybernetic_implant/proc/insert(mob/user, mob/living/carbon/target, obj/item/cybernetic_implant/implant,target_zone,full) + if(full) + user.visible_message("[user] can't seem to implant anything else into the [target]'s [target_zone].") + else + user.visible_message("[user] inserts [implant] into the [target]'s [target_zone == "head" ? "brain" : target_zone]!") + implant.owner = target + implant.function() + user.drop_item() + implant.loc = target + target.internal_organs |= implant \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 830ba6b6643..1e2e1ede663 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -109,6 +109,7 @@ var/save_sight = owner.sight owner.sight &= 0 owner.disabilities |= BLIND + owner << "Static obfuscates your vision!" spawn(50) owner.sight |= save_sight owner.disabilities &= ~BLIND @@ -130,6 +131,7 @@ /obj/item/cybernetic_implant/brain/emp_act(severity) var/stun_amount = 5 + (severity-1 ? 0 : 5) owner.Stun(stun_amount) + owner << "Your body seizes up!" return stun_amount /obj/item/cybernetic_implant/brain/anti_drop @@ -138,6 +140,8 @@ var/active = 0 var/l_hand_ignore = 0 var/r_hand_ignore = 0 + var/obj/item/l_hand_obj = null + var/obj/item/r_hand_obj = null implant_color = "#DE7E00" /obj/item/cybernetic_implant/brain/anti_drop/function() @@ -146,28 +150,30 @@ /obj/item/cybernetic_implant/brain/anti_drop/ui_action_click() active = !active if(active) - if(owner.l_hand) - if(NODROP in owner.l_hand.flags) + l_hand_obj = owner.l_hand + r_hand_obj = owner.r_hand + if(l_hand_obj) + if(owner.l_hand.flags & NODROP) l_hand_ignore = 1 else owner.l_hand.flags |= NODROP l_hand_ignore = 0 - if(owner.r_hand) - if(NODROP in owner.r_hand.flags) + if(r_hand_obj) + if(owner.r_hand.flags & NODROP) r_hand_ignore = 1 else owner.r_hand.flags |= NODROP r_hand_ignore = 0 - if(!owner.r_hand && !owner.l_hand) + if(!l_hand_obj && !r_hand_obj) owner << "You are not holding any items, your hands relax..." active = 0 else - var/noodles = 0 - noodles += !l_hand_ignore && owner.l_hand ? 1 : 0 - noodles += !r_hand_ignore && owner.r_hand ? 2 : 0 - switch(noodles) + var/msg = 0 + msg += !l_hand_ignore && l_hand_obj ? 1 : 0 + msg += !r_hand_ignore && r_hand_obj ? 2 : 0 + switch(msg) if(1) owner << "Your left hand's grip tightens." if(2) @@ -175,18 +181,20 @@ if(3) owner << "Both of your hand's grips tighten." else - if(!l_hand_ignore && owner.l_hand) - owner.l_hand.flags &= ~NODROP - if(!r_hand_ignore && owner.r_hand) - owner.r_hand.flags &= ~NODROP + if(!l_hand_ignore && owner.l_hand && owner.l_hand == l_hand_obj) + owner.l_hand.flags ^= NODROP + if(!r_hand_ignore && owner.r_hand && owner.r_hand == r_hand_obj) + owner.r_hand.flags ^= NODROP owner << "Your hands relax..." + l_hand_obj = null + r_hand_obj = null /obj/item/cybernetic_implant/brain/anti_drop/emp_act(severity) if(prob(50 + (25 * (severity-1 ? 0 : 1)))) - if(!l_hand_ignore && owner.l_hand) - owner.l_hand.flags &= ~NODROP - if(!r_hand_ignore && owner.r_hand) - owner.r_hand.flags &= ~NODROP + if(!l_hand_ignore && owner.l_hand && owner.l_hand == l_hand_obj) + owner.l_hand.flags ^= NODROP + if(!r_hand_ignore && owner.r_hand && owner.r_hand == r_hand_obj) + owner.r_hand.flags ^= NODROP ..() /obj/item/cybernetic_implant/brain/anti_stun From d9921411b8b183a1a2143e8532f681b9d17053c4 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sat, 21 Mar 2015 00:17:27 +0000 Subject: [PATCH 10/12] Changed anti-drop implant emp_act(). Added designs to mech fabricator. --- .../research/designs/medical_designs.dm | 12 +++++----- .../surgery/organs/cybernetic_implants.dm | 22 ++++++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index ad60fdd7c8c..2c7ae702d64 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -103,7 +103,7 @@ datum/design/bluespacebodybag desc = "These cybernetic eyes will display a medical HUD over everything you see. Wiggle eyes to control." id = "ci-medhud" req_tech = list("materials" = 5, "programming" = 4, "biotech" = 4) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 100) build_path = /obj/item/cybernetic_implant/eyes/hud/medical category = list("Medical Designs") @@ -113,7 +113,7 @@ datum/design/bluespacebodybag desc = "These cybernetic eyes will display a security HUD over everything you see. Wiggle eyes to control." id = "ci-sechud" req_tech = list("materials" = 5, "programming" = 5, "biotech" = 5, "combat" = 2) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 300, "$gold" = 300) build_path = /obj/item/cybernetic_implant/eyes/hud/security category = list("Medical Designs") @@ -123,7 +123,7 @@ datum/design/bluespacebodybag desc = "These cybernetic eyes will give you X-ray vision. Blinking is futile." id = "ci-xray" req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) build_path = /obj/item/cybernetic_implant/eyes/xray category = list("Medical Designs") @@ -133,7 +133,7 @@ datum/design/bluespacebodybag desc = "These cybernetic eyes will give you Thermal vision. Vertical slit pupil included." id = "ci-thermals" req_tech = list("materials" = 7, "programming" = 5, "biotech" = 5, "magnets" = 5, "plasmatech" = 3) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 200, "$gold" = 200, "$plasma" = 200, "$diamond" = 500) build_path = /obj/item/cybernetic_implant/eyes/thermals category = list("Medical Designs") @@ -143,7 +143,7 @@ datum/design/bluespacebodybag desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping. Twitch ear to toggle." id = "ci-antidrop" req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 400) build_path = /obj/item/cybernetic_implant/brain/anti_drop category = list("Medical Designs") @@ -153,7 +153,7 @@ datum/design/bluespacebodybag desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." id = "ci-antistun" req_tech = list("materials" = 6, "programming" = 5, "biotech" = 5) - build_type = PROTOLATHE + build_type = PROTOLATHE | MECHFAB materials = list("$metal" = 200, "$glass" = 200, "$silver" = 400, "$gold" = 600) build_path = /obj/item/cybernetic_implant/brain/anti_stun category = list("Medical Designs") \ No newline at end of file diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 1e2e1ede663..35fe65b097c 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -190,12 +190,24 @@ r_hand_obj = null /obj/item/cybernetic_implant/brain/anti_drop/emp_act(severity) - if(prob(50 + (25 * (severity-1 ? 0 : 1)))) - if(!l_hand_ignore && owner.l_hand && owner.l_hand == l_hand_obj) - owner.l_hand.flags ^= NODROP - if(!r_hand_ignore && owner.r_hand && owner.r_hand == r_hand_obj) - owner.r_hand.flags ^= NODROP + var/range = severity ? 10 : 5 + var/atom/A + var/obj/item/L_item = owner.l_hand + var/obj/item/R_item = owner.r_hand + + if(!l_hand_ignore && owner.l_hand && owner.l_hand == l_hand_obj) + owner.l_hand.flags ^= NODROP + if(!r_hand_ignore && owner.r_hand && owner.r_hand == r_hand_obj) + owner.r_hand.flags ^= NODROP ..() + if(L_item) + A = pick(oview(range)) + L_item.throw_at(A, range, 2) + owner << "Your left arm spasms and throws the [L_item.name]!" + if(R_item) + A = pick(oview(range)) + R_item.throw_at(A, range, 2) + owner << "Your right arm spasms and throws the [R_item.name]!" /obj/item/cybernetic_implant/brain/anti_stun name = "CNS Rebooter implant" From 920f97608a9453bb73c93f7c1548372e97affa57 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sat, 21 Mar 2015 11:53:54 +0000 Subject: [PATCH 11/12] Fixed bugs. --- .../surgery/organs/cybernetic_implants.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/surgery/organs/cybernetic_implants.dm b/code/modules/surgery/organs/cybernetic_implants.dm index 35fe65b097c..5b5a928148b 100644 --- a/code/modules/surgery/organs/cybernetic_implants.dm +++ b/code/modules/surgery/organs/cybernetic_implants.dm @@ -112,7 +112,7 @@ owner << "Static obfuscates your vision!" spawn(50) owner.sight |= save_sight - owner.disabilities &= ~BLIND + owner.disabilities ^= BLIND //[[[[BRAIN]]]] @@ -181,10 +181,7 @@ if(3) owner << "Both of your hand's grips tighten." else - if(!l_hand_ignore && owner.l_hand && owner.l_hand == l_hand_obj) - owner.l_hand.flags ^= NODROP - if(!r_hand_ignore && owner.r_hand && owner.r_hand == r_hand_obj) - owner.r_hand.flags ^= NODROP + release_items() owner << "Your hands relax..." l_hand_obj = null r_hand_obj = null @@ -195,10 +192,7 @@ var/obj/item/L_item = owner.l_hand var/obj/item/R_item = owner.r_hand - if(!l_hand_ignore && owner.l_hand && owner.l_hand == l_hand_obj) - owner.l_hand.flags ^= NODROP - if(!r_hand_ignore && owner.r_hand && owner.r_hand == r_hand_obj) - owner.r_hand.flags ^= NODROP + release_items() ..() if(L_item) A = pick(oview(range)) @@ -209,6 +203,12 @@ R_item.throw_at(A, range, 2) owner << "Your right arm spasms and throws the [R_item.name]!" +/obj/item/cybernetic_implant/brain/anti_drop/proc/release_items() + if(!l_hand_ignore && l_hand_obj in owner.contents) + l_hand_obj.flags ^= NODROP + if(!r_hand_ignore && r_hand_obj in owner.contents) + r_hand_obj.flags ^= NODROP + /obj/item/cybernetic_implant/brain/anti_stun name = "CNS Rebooter implant" desc = "This implant will automatically give you back control over your central nervous system, reducing downtime when stunned." From 207af82c81197ace15fa3c98475ed437398cdca3 Mon Sep 17 00:00:00 2001 From: xxalpha Date: Sat, 21 Mar 2015 11:55:44 +0000 Subject: [PATCH 12/12] Changelog+ --- html/changelogs/xxalpha-cyberimplants.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/xxalpha-cyberimplants.yml b/html/changelogs/xxalpha-cyberimplants.yml index c5848f70bfb..8ec9422fd54 100644 --- a/html/changelogs/xxalpha-cyberimplants.yml +++ b/html/changelogs/xxalpha-cyberimplants.yml @@ -3,4 +3,4 @@ author: xxalpha delete-after: True changes: - - rscadd: "Added Cybernetic Implants." \ No newline at end of file + - rscadd: "Added Cybernetic Implants: Security HUD, Medical HUD, X-Ray, Thermals, Anti-Drop, Anti-Stun. All implants are researchable and produceable by R&D and Robotics." \ No newline at end of file