From a05bf99c8f78ac11bad62c421eb3f1d0f5ecc050 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Thu, 22 Oct 2015 22:58:41 -0400 Subject: [PATCH 1/5] New chronosuit teleport mechanics --- .../modules/clothing/spacesuits/chronosuit.dm | 223 +++++++++++++----- icons/mob/actions.dmi | Bin 49427 -> 50550 bytes 2 files changed, 164 insertions(+), 59 deletions(-) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index a8048ec3f6d..6209c4b4006 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -28,17 +28,24 @@ var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun) var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null + var/atom/movable/overlay/phase_underlay = null + var/datum/action/item_action/hands_free/chrono_teleport/teleport_now = new var/activating = 0 var/activated = 0 var/cooldowntime = 50 //deciseconds var/teleporting = 0 +/obj/item/clothing/suit/space/chronos/New() + ..() + teleport_now.chronosuit = src + teleport_now.target = src /obj/item/clothing/suit/space/chronos/proc/new_camera(mob/user) if(camera) qdel(camera) - camera = new /obj/effect/chronos_cam(get_turf(user)) + camera = new /obj/effect/chronos_cam(user) camera.holder = user + camera.chronosuit = src user.remote_control = camera /obj/item/clothing/suit/space/chronos/ui_action_click() @@ -61,20 +68,40 @@ var/mob/living/carbon/human/user = src.loc switch(severity) if(1) - if(user && ishuman(user) && (user.wear_suit == src)) - user << "Elecrtromagnetic pulse detected, shutting down systems to preserve integrity..." - deactivate() + if(activated && user && ishuman(user) && (user.wear_suit == src)) + user << "E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD" + deactivate(1, 1) -/obj/item/clothing/suit/space/chronos/proc/chronowalk(mob/living/carbon/human/user) - if(!teleporting && user && (user.stat == CONSCIOUS)) +/obj/item/clothing/suit/space/chronos/proc/finish_chronowalk(mob/living/carbon/human/user) + user.next_click = world.time - 1 + user.alpha = 255 + user.color = "#ffffff" + user.animate_movement = FORWARD_STEPS + user.notransform = 0 + user.anchored = 0 + teleporting = 0 + if(phase_underlay && !qdeleted(phase_underlay)) + qdel(phase_underlay) + phase_underlay = null + if(camera) + camera.remove_target_ui() + camera.loc = user + if(teleport_now.button) + teleport_now.button.UpdateIcon() + +/obj/item/clothing/suit/space/chronos/proc/chronowalk(mob/living/carbon/human/user, atom/location) + if(!teleporting && user && location && user.loc && location.loc && user.wear_suit == src && user.stat == CONSCIOUS) teleporting = 1 var/turf/from_turf = get_turf(user) - if(!from_turf) //sanity, things happen - teleporting = 0 - return - var/turf/to_turf = from_turf - var/atom/movable/overlay/phaseanim = new(from_turf) - var/obj/holder = new(camera) + var/turf/to_turf = get_turf(location) + var/distance = cheap_hypotenuse(from_turf.x, from_turf.y, to_turf.x, to_turf.y) + var/phase_in_ds = distance*2 + + if(camera) + camera.remove_target_ui() + + if(teleport_now.button) + teleport_now.button.UpdateIcon() var/list/nonsafe_slots = list(slot_belt, slot_back, slot_l_hand, slot_r_hand) for(var/slot in nonsafe_slots) @@ -82,52 +109,60 @@ if(slot_item && !(slot_item.type in chronosafe_items) && user.unEquip(slot_item)) user << "Your [slot_item.name] got left behind." - phaseanim.name = "phasing [user.name]" - phaseanim.icon = 'icons/mob/mob.dmi' - phaseanim.icon_state = "chronostuck" - phaseanim.density = 1 - phaseanim.layer = FLY_LAYER - phaseanim.master = user user.ExtinguishMob() if(user.buckled) user.buckled.unbuckle_mob() - user.loc = holder - flick("chronophase", phaseanim) - spawn(7) - if(user) - if(phaseanim) - if(camera && camera.loc) - to_turf = camera.loc - flick("chronounphase", phaseanim) - else - flick("chronostuck", phaseanim) - phaseanim.loc = to_turf - sleep(7) - if(holder) - if(user && user in holder.contents) + + var/icon/user_icon = getFlatIcon(user) + user_icon.Blend("#ffffff") + phase_underlay = new(user.loc) + phase_underlay.icon = user_icon + phase_underlay.density = 1 + phase_underlay.anchored = 1 + phase_underlay.master = user + phase_underlay.animate_movement = NO_STEPS + phase_underlay.alpha = 0 + phase_underlay.mouse_opacity = 0 + phase_underlay.name = user.name + phase_underlay.transform = user.transform + phase_underlay.pixel_x = user.pixel_x + phase_underlay.pixel_y = user.pixel_y + + user.animate_movement = NO_STEPS + user.next_click = world.time + (8 + phase_in_ds) + user.notransform = 1 + user.anchored = 1 + + animate(user, color = "#00ccee", time = 3) + spawn(3) + if(teleporting && activated && user && !qdeleted(user) && phase_underlay && !qdeleted(phase_underlay)) + animate(user, alpha = 0, time = 2) + animate(phase_underlay, alpha = 255, time = 2) + sleep(2) + if(teleporting && activated && user && !qdeleted(user) && phase_underlay && !qdeleted(phase_underlay)) + phase_underlay.loc = to_turf user.loc = to_turf - if(user.client) - if(camera) - user.client.eye = camera - else - user.client.eye = user - qdel(holder) - else if(user) - user.loc = from_turf - if(phaseanim) - qdel(phaseanim) - teleporting = 0 - if(user && !user.loc) //ubersanity - user.loc = locate(0,0,1) - user.gib() + animate(user, alpha = 255, time = phase_in_ds) + animate(phase_underlay, alpha = 0, time = phase_in_ds) + sleep(phase_in_ds) + if(teleporting && activated && user && !qdeleted(user) && phase_underlay && !qdeleted(phase_underlay)) + animate(user, color = "#ffffff", time = 3) + sleep(3) + if(teleporting && user && !qdeleted(user)) + user.loc = to_turf //this will cover if bad things happen before the teleport, yes it is redundant + finish_chronowalk(user) /obj/item/clothing/suit/space/chronos/process() if(activated) var/mob/living/carbon/human/user = src.loc if(user && ishuman(user) && (user.wear_suit == src)) if(camera && (user.remote_control == camera)) - if(!teleporting && !((camera.x == user.x) && (camera.y == user.y) && (camera.z == user.z))) //cheaper than a couple get_turf calls??? - chronowalk(user) + if(!teleporting) + if(camera.loc != user && ((camera.x != user.x) || (camera.y != user.y) || (camera.z != user.z))) + if(camera.phase_time <= world.time) + chronowalk(user, camera) + else + camera.remove_target_ui() else new_camera(user) else @@ -157,33 +192,41 @@ else user << "\[ fail \] Mounting /dev/helmet" user << "FATAL: Unable to locate /dev/helmet. Aborting..." + teleport_now.Grant(user) cooldown = world.time + cooldowntime activating = 0 return 0 -/obj/item/clothing/suit/space/chronos/proc/deactivate() - if(activated) +/obj/item/clothing/suit/space/chronos/proc/deactivate(force = 0, silent = 0) + if(activated && (!teleporting || force)) activating = 1 var/mob/living/carbon/human/user = src.loc if(user && ishuman(user)) if(user.wear_suit == src) - user << "\nroot@ChronosuitMK4# chronowalk4 --stop\n" + if(!silent) + user << "\nroot@ChronosuitMK4# chronowalk4 --stop\n" if(camera) - user << "\[ ok \] Sending TERM signal to chronowalk4-view" //yes I know they aren't a different color when shutting down, but they were too similar at a glance + if(!silent) + user << "\[ ok \] Sending TERM signal to chronowalk4-view" //yes I know they aren't a different color when shutting down, but they were too similar at a glance qdel(camera) if(helmet) - user << "\[ ok \] Stopping ui display driver" - user << "\[ ok \] Stopping brainwave scanner" - user << "\[ ok \] Unmounting /dev/helmet" + if(!silent) + user << "\[ ok \] Stopping ui display driver" + user << "\[ ok \] Stopping brainwave scanner" + user << "\[ ok \] Unmounting /dev/helmet" helmet.flags &= ~NODROP helmet.suit = null helmet = null - user << "logout" + if(!silent) + user << "logout" + teleport_now.Remove(user) src.flags &= ~NODROP cooldown = world.time + cooldowntime * 1.5 activated = 0 activating = 0 - + if(teleporting && force) + finish_chronowalk(user) + user.electrocute_act(35, src, safety = 1) /obj/effect/chronos_cam name = "Chronosuit View" @@ -193,13 +236,32 @@ opacity = 0 mouse_opacity = 0 var/mob/holder = null + var/phase_time = 0 + var/phase_time_length = 3 + var/obj/screen/chronos_target/target_ui = null + var/obj/item/clothing/suit/space/chronos/chronosuit + +/obj/effect/chronos_cam/proc/create_target_ui() + if(holder && holder.client && chronosuit) + if(target_ui) + remove_target_ui() + target_ui = new(null, holder) + holder.client.screen += target_ui + +/obj/effect/chronos_cam/proc/remove_target_ui() + if(target_ui) + qdel(target_ui) + target_ui = null /obj/effect/chronos_cam/relaymove(var/mob/user, direction) if(holder) if(user == holder) + if(loc == user) + loc = get_turf(user) if(user.client && user.client.eye != src) src.loc = get_turf(user) - user.client.eye = src + user.reset_view(src) + user.set_machine(src) var/step = get_step(src, direction) if(step) if(istype(step, /turf/space)) @@ -207,14 +269,57 @@ src.loc = step else src.loc = step + if((x == holder.x) && (y == holder.y) && (z == holder.z)) + remove_target_ui() + loc = user + else if(!target_ui) + create_target_ui() + phase_time = world.time + phase_time_length else qdel(src) +/obj/effect/chronos_cam/check_eye(mob/user) + if(user == holder) + return 1 + user.unset_machine() + user.reset_view(null) + /obj/effect/chronos_cam/Destroy() if(holder) if(holder.remote_control == src) holder.remote_control = null if(holder.client && (holder.client.eye == src)) - holder.client.eye = holder + holder.unset_machine() + holder.reset_view(null) return ..() +/obj/screen/chronos_target + name = "target display" + screen_loc = "CENTER,CENTER" + color = "#ff3311" + blend_mode = BLEND_SUBTRACT + +/obj/screen/chronos_target/New(loc, var/mob/living/carbon/human/user) + if(user) + var/icon/user_icon = getFlatIcon(user) + icon = user_icon + transform = user.transform + else + qdel(src) + +/datum/action/item_action/hands_free/chrono_teleport + name = "Teleport Now" + button_icon_state = "chrono_phase" + action_type = AB_INNATE + var/obj/item/clothing/suit/space/chronos/chronosuit = null + +/datum/action/item_action/hands_free/chrono_teleport/IsAvailable() + return (!CheckRemoval(owner) && !chronosuit.teleporting) + +/datum/action/item_action/hands_free/chrono_teleport/Activate() + if(IsAvailable()) + if(chronosuit.camera) + chronosuit.chronowalk(owner, chronosuit.camera) + +/datum/action/item_action/hands_free/chrono_teleport/CheckRemoval() + return (..() && !(chronosuit && chronosuit.activated && chronosuit.camera)) \ No newline at end of file diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index d4a903af875f72840882e776fc6265e9ce6fe986..4dac8fd83bd330ce8197d83a658f0138c0527aaa 100644 GIT binary patch delta 8858 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 delta 7730 zcmV-29?jwQiUX5^1CS(t?Rr#LbVOxyV{&P5bZKvH004NLl~>D-BR32@+h5Vxy)J?z zJ6B(VSuEzT`wIeFs%~+tM=!o zq;W07X?XbU_v2ybpm8`2U;jKFB6yB^`O}mX!)f>wFwvUy)A100SlVzJ{x}{cp^VG# zE3U=5cR`T@x}b4()}-U?GUtBCwjd>QR8z=_1tX=@k47{5d=GXI>|DYv<(bxEah#Dt z7lyptO`d99{#$zqZKu1GD{$tquTV+XzLn=v{ki|G6PJFqc~#PWN)qLXJ;ao@FD~&M zwQ!mHp5%Hq%m7J$>4#c#uBCNxf@Mw3G_Xl9^^KtH)_%kdOdV>gtE<%0~ZFE&EmAgNNY*ZsyY9N?vJNcVAg=jYM*8 zJV(RRGSwQq(B9XI7exuK#Z@(#)@;FsV%bK=*#%_7kcu<=f1Uly-QM>M6C29Pl%}#}W&%?K$kHh1Sr{h1{84lRsH^N*1 z03ZOfCj&a50v)BZW24gofA-N)mG{2??3v6bmxGK&$F}VEt#3jB!kI!t*qJe>}Nl}*^`;?e4pp{fATz(XVKj{y{_&p zLs|8+=k2`%IT-rd@$bnds~`)rp^M9pl~J01f*bNW>VNLaU$=glJ1;QDWE>jE@#=i% zc@r~rqrD{&a8{b=x@rNx?#Sbd$6NXD&Ng^+F5Kn-n*%28Im-L*JbRjWlwWN7(V;DXfBJT?Kx(36jK#h{s+C|| z)o3*9f7+mEP@EuRxqs=$4YGUHLl=$S+_!u~(t>QWbhU3#E;X6BZ>Y$9<4*gD`yXKD z#Y*T5V5!nU-+X-Xkp`tYG{9j0kSAcKy+2Pj7#ss$CrSJ5OJi8-LL2FUeV;H^N8V^jzwr_?9b40Y+S@ zJm@fBS^$+)Aj_b08L(%!0>kTq2}71~^mfuef7r)haP3d8(<33_^?UIR`3T6$FRn<3 zlTZj!1VIDC!O^l`%_UZ*$%9Bp7$gIE=J0~!@!fxS3{|JLf1s%WIEFRAi9#y8zT>3; z!~1skTw+(#cJ8UUKgJcQv9DEtqQ90DQ}I7+{n=I@a2)tSc+_V@LxVg7zJTo?P3@fc zf4&WvZL>*@8j?FcXO6$Jp;^A;$KR40ZQqKU{Iu1YXLX(hXNNNF&CkbV(o^bT2ECD7a~_3xMfkkY!!gEOk8gw;fLf$t4QwnJivkjHf@=SuDir0h#zO(F zSysocrtSD|`EQgKUdM8ij$M1Vvu0UcTJ8HU_(Qe>EiRmf|AO+PEYjtYu|Myze^pZZ zU{Tg|i)E!-C;&s&BZ&R*=HzaSS{bKzJgA7$n6L2fRcopy3M zy#%rg`SWEbx}qw)rfGEMmS7ARf0b1j17u|xDV9xFumWV*<7@mlsPuZ2wxpF`5V9wn!nm(-9K5%`?w{eNm(CH3bQTPllvR(HU;dFJ}ZR?B_eJr`d3b;Pf9xoy2p2eOR6 z&_lM#iIi?_Im;O;)^f(XV%p{cd@hY+WmvCK9^BdBXV^1V+jP@eO&EEinVbQ&_PxoGz&5REI~v z9}IIDjt!J$8J|C>7G*i8{tOrmX0nah7z{@G+)2~}Od+mh1sKske_C4_>=zZi%C4sE zEMHv5{$nd~I0#w$+kb2&%NOrUuLA8tB|3w_p!Dw=4tkDjj4=COXn0xfUi#1S`2qco zX)~lAo!;|zIeC@?wG9p4Mw=}}4Q7!g`S2bZf*SiWEy ztu3t>Jvk{+ec|YJIvDc%f_40c_xTXn9sx;0!VkgygSElVe@X_3F5;X{3P3=HfQ;Yg z3n``=jw?lhWs3drTmxKk?KbuwQyd`hDn&)Fs_L((=+!YPzj*A66gL5v%SCt3C0s67 zNc)@3ySRDI?Fre{2lPI@A@IatpIm1&N-O(^hH{#J{mP$je*SsKp*?$4kDVV+9_ag> zNdKWn-jRiTf7(sAYcOE=irwA*MSn@zYeiixgAGcq?@Rt4*8QQ-nI%=21A)eu8)S>^ zyZV{7@8^BWU_qH}y-&v5#Z@EUzo3eNfdNb=6Q=xp26L@AN~dGATFKSv@caF$D3N73 z>CeD~D?k|e7i_Ri@dB%A&#bHgj(tyHv6+z$Ye9)xe+plcBsJC#P;-Y zI#?aXpf{-7V>(?uA;Ht(NVf_b?Zc7L_U)*7y=vc}0u=ef$^QC}WM3gYSiZQ9od<^7 z_a9pcyo$qdAG@0F15mxgskHxQ^DZnFi>mSl1_rQLEEE?`!_pPme(3B$zP|9Dh;d@s zw>E4Xe{e4S-iLj9Z<8@wZ!?-%o2B!2xys8M(bS6yp#R$ta zz9TND{A%$`V@Jau8{QH9^*^ciI6;jiuprO%;(g7F)aOLL-{0_}k2MdCdjDFKmX?yA zpHEIsZ1Iy!1cX4kRbV*Dssz|{{B3Hk`Eugyf88^BmvCq|MiDsp={wvyuZF%p7jiI| zS=91Va(iX91eQ1!1rOAG;NZT&00gJSeo2Q<@&*Z3La)o>;HU3I*iZWYlR&il&vg5u zGBga6o#-o^BDuM_an=7z)c!p+_p_^MyQ==QP?X=W`rFmCJ>^`KVVpW0nD(~=|MKPBiW0P{%VC?=NmTIJAr)e{ixga-4EP- z(m$ar-$kI@wl3d;?!P+Vkdv(cUE1)okdn=*{QQkJMzs6?^zd7JVbRydMFoC(_$~D~ zL;*&7VdIJSPc}`c{fWN+Oto*dS|iG2e~JE9t5q#_psfV0O&J@j{qF8Aii=B-)RVPIe|GQlp-$CkgC_5>^NFt8ZStdSItT)Q94}+-2f@Fe{N%V zI^1Z8HpUbZgWEA2keyc)J3A%be(Av9K2T~Ne({!t<7#)T_}xptna~gDKdgBut}oPu zGv~PJrkkj)t|mV}U;T4Bo$6mpOA8-<_+hZpb9^vLBW`k+c1UHpc@s*2f7tW-q-Lnc zAAdZl_utjk#io~Dk^t7NSrc=Nf6@Ag^HZ3@M8IaVO{o1W0DGT%w0>zpS#GMU?p?X4 zs;Ww;f4{||l3MkgIWhai>T|ibmu^Qy<@G5{VNxMv4RBd?eD&_eirp>AZ{0XnJh*P7 z6}VbF|LvyrAB@m_Tu@b2#rgB+aXFn>^5dI2>U}zc%%)^r!a*{gb)QdBgTe1sYXX{^e=0L zvqhe}V3GRV(P4+K7C8|Te|+FOo8`GP7KJ>2<(F%vpz>P?RDt{)NN*{Ryp-f^q!gC? ze3kqxd3m^l<)&gG+Jc@rJ94upL44xez?AZv!W2}55MV4~8V^)BTjcWD^FrE+W|S!h z36kKu&3{&prS{vB4~8Ez148-rdpzXj=0+tsfzM);z7IzK0N2HyMKy2BrR1i<3&{B#q*j_=;G zuChvrvP>Om_R}L`En;G4=ia?0F&N=jgEG=xR@BtXF=yRtjGOd~n^yTYxGc{;HW1 zjCejhg5(4d=9MTx!0xUta%awr=sVWwukC29EQs%(d%jIye_ubBF12B?6hN@uw(hU; zc#z=oJ6A>($f8{kVJb-R(4j-j`NOrLjsNEfHr3a&W%FkAUk{$UI+qzGvjKQw?FzZF zsx&1;Fxl;=6B(fZ+w!X=OY2E_dR6EY*wNKaQAv4HBq)v__|9h8B=Hp#r^jCa9=`B{ zo3~W{^iYy7e?Mbz@%(wF&zu>d_Ht*=7q9V-M*{oZ$Mvhkn z3iA8vSN|S>t}Z3r$?Nsd-Rw*>WR1{L$x&1j8|1LxKXSP=R~*{wIYo zywp8CJ?M1li|t%~=Sq3$Hy%}=Hy_vrD78IHDl6!^&<5q1)yL58csMDfh#9nzzZ z-Y0L|f4EU?ySlo1__3vB9l)(W+QRzv>)Ehjg9OUdQ4q*jFxl;=6B(fZAsFuR*-5!P zY#N*lLOs4bjY58Z0oYRc(?g#J@-thl%(hw?2x#%ZU6Eg z0l5F|Zvs$JRz{oM9`)Kp5p61KwaieJ-s$6qe*w6BJanV@kmnbm>%umymKiKuyfP^T zsC@Y!l|TIOLoNpIZOi7(90{&}0rWT=JiK--pBz8V#*G_Uzka>EVZ#PVsG+f7vfEEL zGDZOk4D`9lu~_JLxhR@ZhB-G6K0BF^7Z}y!%QFOtPm3#^{GvgSTsYySngov?J4Rt) ze<3|RJ@Dnowpi*g8O*(AkxGO@`86Nd#_8jS<5F|lX>juag$M-+Cc8GcW%Fjv-E|k| zg3o`oC>V0})Ke-6%n4@Q+)V1=_q zE-EQkLtlgn%&}M~pFNM>BOl1_nF~k#f53)%d?U&4^M+`ImrfKG7E)KI)ZDADUkt#q zhm@LfyLazSiH+rVu9W9qqY%s7YZftU_7ZAp7V^}Sik*0gOWRKY9E>G2$Kis~ScqYQWz^^p#L;b;nX|tbBWRwC_DWOV$WBuVNYM9=hy z7qL`eDpKHFE*JCX&7;1)KBT>(tc(*UPmXzft@_iFpFmB`LTYM$!&6T_lyr#8jG1#1 zzP71Jsa09KbSY0i^;C!w>Tx)zUAmN0EiD+0MzuYaU;a$8-?(RwYQO&Af5CCFpDtvK z0(5k>6U_nA?~1;Gkrtzn-&cU=fyc<;DRExju=iA_)8X^^;;Ln+ReRx~FC(q}B^n4V z!eA@~7TWA~D$2?zovxHG@4R@CHoF~*#lm$d3WEtJznU7Q&R?R_U@e3SoMDY!Jtr1w zYHFe$3kV0nC&!PgZIxA}f27I_I@#@~3mKyTfvDc!9E&BMDR7iDHx&WkZ)o;bNEd2r zUzZyj?@suO+1lDlwkDQOk|fM#^N5)s0^v@Mc*rkN2=ZIJ_%03{*uxV~JW73ieTc_* z*|KH)?sq#_y!fu9V*!Qw(~@5*h%X!imp!VzWXBVV2!=yK!jaA|fB$5+pDJXG0yLNl z#yZ4=rMcDCzAkHz6D7f_s;ZC@@`)%wAcFkDkE0>pKxjdJH{4J|cXw#W$&EMO2*5|0 zkcjT?4sN)iCTS8B_=pE3l@(k*-jURpD^{!k;OyD6e7N@`Zo1<})$6$_Y*`>3 z3TU$1PcXP#NjZ3~qh<EQuRlHfXEIFZFtb>Zqy94E6L zI2H(^i=_z1k_zW`yRqBttX{o3Cb_L%y&AjSPFY!5)bpd^wuLvPmG}gP)8-P#EB~^V zC08$@iAZOF)&T(NQ9zU3eyWiX3eY`sq2vZQdRR?`e=DCokM_?_(%aihK|x&WgHNIa zKR*GSA(ZR}gMSGjT+L~Zqmi5FpDGoY2x3izQ|Sx=um^wfg$mTh0ouoq1~(qWC!iEe z*dLKbHxinfny9I%;eqEj1JS?yOP4MM;1|F61(4b}xXErmUC0OpsD(&_11O(8k8+gt zz)@1+e@+D-?*V*(iD5!~QqwQtX|R^mL|d$NzVRkKEz(7PA^@7LizCiy*8lm7eOx@+$O}I?mX^=LWVfGcWP}0~Xv?pbIC@wui{I~Z#Y2Al zcGLRHX!iC9#svl#CPcB=lSh)_Fj~UXuKR_nf4%XZ_QpbZC77|Ix7Www#dqOy^>XA$ z6ZQ4=suy_o?%nkE`qYwG2M$DLC1es7E?ya|BoiObo*iB*{Nav$aa|*(f2k-1HQDW_ z6B(xfQ-N?o6nJpmMmM1<@GJ3*7i~(LF6T$GFk7vF;tYwU{6sB4h(8coTLjhR>c#6- zf7TGSo?j6IC~5-&DGP{B7epvbB4}!A;<3jb>&=36yhwQDsWUaI1;I)Q|%?or0EKP7RnFc+WE8C zy?eJ(5e7v8UORsl$ATd+<5e6rSu`Kme}>r_|6VB@Hf)gAuU{{3+_;e!UU-4ShY$0@ z3oiih+RmL^XjdF|BY8x}g2`?_oya%^XwEfrw&l1|1}nw*?WXm;8WkA6KB%I$_Vug6 znyO>8k9ci(|Hj6<&y03`AP_*W*CPR0Sy?0Y^?JP+jYjnmMh<{3E-H$e5&*3FT(5fAWq-+_BXNd$BZCBZ9&yUrob>v z0`c}u{MAj_p9o~60xT#f2yup_7(xX)Q9@%P(AaqQncCXdR{_5Vb^`yN!1(_j<#>Bz z(;Fa+e|mkeYT&=uEaAzCi;s#+3lwT5fUTaDsZAnHmCwc zNK8a%Ol|G!bAV+)Ww2>^f+m(nIX+ce`+5nmyRq@^sL{7>mrLCkJsHTdfAZrTUiM16 zF?zBwfcM{j7kl^a<+j^yQ(miE$;qh*#{0F|?P}ZCzrKX`-g}Qb?zkf6bj))DeFJ070*MEwfCm{4pHcDLb0^RI>%Y#6ykczlm*Chx zyZ!d)NgiTjbW46de!o9qe*@y0SZQv_mcnXoZf5V^y}Y~X0KB}I_uhLiYCo;g6MZuY zV)}dTv;9d2K~LfHhY$rg5;3J4a|7+N$L$HJ|L1gEN{g*nUSfcE-*wQ{l> zA9rMA(bZ*C$G-jc$R4e&tyEQ2B{h0$Yb(>IPsbYc0-yTilaTX5fAuA^LAu>;=lWo( z9R!I@gD(Y1F1$T_jERPJKM}JvJE`gK6h5EG0w_y^!y!?KDctF!$tBaL3LPDTY}=-6 z>38qFom5nejR4!)jQr_OrRvzR(AwIXv<>aG;nQ5<I?2#M}(s sw(5YK2`Vt$@zHVq9PAYNO+m%~2e3R;LGVtzLI3~&07*qoM6N<$f;7@eg#Z8m From 8e7007a9d48214d855fbaa78b401c8f19bfc6217 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Fri, 23 Oct 2015 16:26:49 -0400 Subject: [PATCH 2/5] Chronosuit uses next_move instead of next_click face_atom doesn't do anything if notransform is nonzero Added Timeline Eradication Agent outfit --- code/_onclick/click.dm | 2 +- code/modules/clothing/outfits/standard.dm | 22 ++++++--- .../modules/clothing/spacesuits/chronosuit.dm | 49 ++++++++++--------- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index ceed0282a97..abb72a37627 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -291,7 +291,7 @@ // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(atom/A) - if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return + if( buckled || notransform || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return var/dx = A.x - x var/dy = A.y - y if(!dx && !dy) // Wall items are graphically shifted but on the floor diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 623edd0775d..cb76ec05eb6 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -12,13 +12,13 @@ var/obj/item/weapon/tank/jetpack/J = H.back J.toggle() J.Topic(null, list("stat" = 1)) - + /datum/outfit/tournament /datum/outfit/tournament/ name = "tournament standard red" - + uniform = /obj/item/clothing/under/color/red shoes = /obj/item/clothing/shoes/sneakers/black suit = /obj/item/clothing/suit/armor/vest @@ -30,7 +30,7 @@ /datum/outfit/tournament/red name = "tournament standard green" - + uniform = /obj/item/clothing/under/color/green /datum/outfit/tournament/gangster @@ -156,7 +156,7 @@ /datum/outfit/assassin/post_equip(mob/living/carbon/human/H) var/obj/item/clothing/under/U = H.w_uniform U.attachTie(new /obj/item/clothing/tie/waistcoat(H)) - + //Could use a type var/obj/item/weapon/storage/secure/briefcase/sec_briefcase = H.l_hand for(var/obj/item/briefcase_item in sec_briefcase) @@ -172,7 +172,7 @@ pda.owner = H.real_name pda.ownjob = "Reaper" pda.update_label() - + var/obj/item/weapon/card/id/syndicate/W = H.wear_id W.access = get_all_accesses() W.assignment = "Reaper" @@ -340,7 +340,7 @@ var/obj/item/device/radio/R = H.ears R.set_frequency(CENTCOM_FREQ) R.freqlock = 1 - + var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)//Here you go Deuryn L.imp_in = H L.implanted = 1 @@ -359,7 +359,15 @@ name = "Death Commando Officer" head = /obj/item/clothing/head/helmet/space/beret +/datum/outfit/chrono_agent + name = "Timeline Eradication Agent" + uniform = /obj/item/clothing/under/color/white + suit = /obj/item/clothing/suit/space/chronos + back = /obj/item/weapon/chrono_eraser + head = /obj/item/clothing/head/helmet/space/chronos + mask = /obj/item/clothing/mask/breath + suit_store = /obj/item/weapon/tank/internals/oxygen + - \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 6209c4b4006..dc292715fbc 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -72,25 +72,28 @@ user << "E:FATAL:RAM_READ_FAIL\nE:FATAL:STACK_EMPTY\nE:FATAL:READ_NULL_POINT\nE:FATAL:PWR_BUS_OVERLOAD" deactivate(1, 1) -/obj/item/clothing/suit/space/chronos/proc/finish_chronowalk(mob/living/carbon/human/user) - user.next_click = world.time - 1 - user.alpha = 255 - user.color = "#ffffff" - user.animate_movement = FORWARD_STEPS - user.notransform = 0 - user.anchored = 0 - teleporting = 0 - if(phase_underlay && !qdeleted(phase_underlay)) - qdel(phase_underlay) - phase_underlay = null - if(camera) - camera.remove_target_ui() - camera.loc = user - if(teleport_now.button) - teleport_now.button.UpdateIcon() +/obj/item/clothing/suit/space/chronos/proc/finish_chronowalk() + var/mob/living/carbon/human/user = src.loc + if(istype(user)) + user.next_move = 1 + user.alpha = 255 + user.color = "#ffffff" + user.animate_movement = FORWARD_STEPS + user.notransform = 0 + user.anchored = 0 + teleporting = 0 + if(phase_underlay && !qdeleted(phase_underlay)) + qdel(phase_underlay) + phase_underlay = null + if(camera) + camera.remove_target_ui() + camera.loc = user + if(teleport_now.button) + teleport_now.button.UpdateIcon() -/obj/item/clothing/suit/space/chronos/proc/chronowalk(mob/living/carbon/human/user, atom/location) - if(!teleporting && user && location && user.loc && location.loc && user.wear_suit == src && user.stat == CONSCIOUS) +/obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location) + var/mob/living/carbon/human/user = src.loc + if(activated && !teleporting && user && istype(user) && location && user.loc && location.loc && user.wear_suit == src && user.stat == CONSCIOUS) teleporting = 1 var/turf/from_turf = get_turf(user) var/turf/to_turf = get_turf(location) @@ -129,7 +132,7 @@ phase_underlay.pixel_y = user.pixel_y user.animate_movement = NO_STEPS - user.next_click = world.time + (8 + phase_in_ds) + user.changeNext_move(8 + phase_in_ds) user.notransform = 1 user.anchored = 1 @@ -150,7 +153,7 @@ sleep(3) if(teleporting && user && !qdeleted(user)) user.loc = to_turf //this will cover if bad things happen before the teleport, yes it is redundant - finish_chronowalk(user) + finish_chronowalk() /obj/item/clothing/suit/space/chronos/process() if(activated) @@ -160,7 +163,7 @@ if(!teleporting) if(camera.loc != user && ((camera.x != user.x) || (camera.y != user.y) || (camera.z != user.z))) if(camera.phase_time <= world.time) - chronowalk(user, camera) + chronowalk(camera) else camera.remove_target_ui() else @@ -224,8 +227,8 @@ cooldown = world.time + cooldowntime * 1.5 activated = 0 activating = 0 + finish_chronowalk() if(teleporting && force) - finish_chronowalk(user) user.electrocute_act(35, src, safety = 1) /obj/effect/chronos_cam @@ -319,7 +322,7 @@ /datum/action/item_action/hands_free/chrono_teleport/Activate() if(IsAvailable()) if(chronosuit.camera) - chronosuit.chronowalk(owner, chronosuit.camera) + chronosuit.chronowalk(chronosuit.camera) /datum/action/item_action/hands_free/chrono_teleport/CheckRemoval() return (..() && !(chronosuit && chronosuit.activated && chronosuit.camera)) \ No newline at end of file From 71be6afe06a921a72c6d78bed9634d1a74952314 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Sun, 25 Oct 2015 20:47:20 -0400 Subject: [PATCH 3/5] Added changelog --- html/changelogs/JJRcop-chronosuit_revisions.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/JJRcop-chronosuit_revisions.yml diff --git a/html/changelogs/JJRcop-chronosuit_revisions.yml b/html/changelogs/JJRcop-chronosuit_revisions.yml new file mode 100644 index 00000000000..2968b532be2 --- /dev/null +++ b/html/changelogs/JJRcop-chronosuit_revisions.yml @@ -0,0 +1,6 @@ +author: JJRcop +delete-after: True +changes: + - tweak: "Chronosuits have had their movement revised, they now take time to teleport depending on how far you've traveled, and don't teleport automatically anymore unless you stop moving for a short moment, or press the new ' + Teleport Now' button." + - rscadd: "Added new outfit that allows admins to dress people up in the chrono equipment easier." \ No newline at end of file From 1c86a632f179780e5c257b85e54bcc177d8dee1a Mon Sep 17 00:00:00 2001 From: JJRcop Date: Thu, 5 Nov 2015 23:57:14 -0500 Subject: [PATCH 4/5] Chronosuit performance/saneness adjustments --- code/_onclick/click.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 57 ++++++++++++------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index abb72a37627..ceed0282a97 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -291,7 +291,7 @@ // Simple helper to face what you clicked on, in case it should be needed in more than one place /mob/proc/face_atom(atom/A) - if( buckled || notransform || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return + if( buckled || stat != CONSCIOUS || !A || !x || !y || !A.x || !A.y ) return var/dx = A.x - x var/dy = A.y - y if(!dx && !dy) // Wall items are graphically shifted but on the floor diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index faa4aa29c44..da7a310752b 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -26,6 +26,7 @@ slowdown = 2 armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun) + var/list/hands_nodrop_states var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null var/atom/movable/overlay/phase_underlay = null @@ -75,6 +76,7 @@ /obj/item/clothing/suit/space/chronos/proc/finish_chronowalk() var/mob/living/carbon/human/user = src.loc if(istype(user)) + user.SetStunned(0) user.next_move = 1 user.alpha = 255 user.color = "#ffffff" @@ -82,6 +84,10 @@ user.notransform = 0 user.anchored = 0 teleporting = 0 + if(user.l_hand && !hands_nodrop_states[1]) + user.l_hand.flags &= ~NODROP + if(user.r_hand && !hands_nodrop_states[2]) + user.r_hand.flags &= ~NODROP if(phase_underlay && !qdeleted(phase_underlay)) qdel(phase_underlay) phase_underlay = null @@ -116,45 +122,58 @@ if(user.buckled) user.buckled.unbuckle_mob() - var/icon/user_icon = getFlatIcon(user) - user_icon.Blend("#ffffff") - phase_underlay = new(user.loc) - phase_underlay.icon = user_icon - phase_underlay.density = 1 - phase_underlay.anchored = 1 - phase_underlay.master = user - phase_underlay.animate_movement = NO_STEPS - phase_underlay.alpha = 0 - phase_underlay.mouse_opacity = 0 - phase_underlay.name = user.name - phase_underlay.transform = user.transform - phase_underlay.pixel_x = user.pixel_x - phase_underlay.pixel_y = user.pixel_y + phase_underlay = create_phase_underlay(user) + + hands_nodrop_states = list(0, 0) + if(user.l_hand) + hands_nodrop_states[1] = user.l_hand.flags & NODROP + user.l_hand.flags |= NODROP + if(user.r_hand) + hands_nodrop_states[2] = user.r_hand.flags & NODROP + user.r_hand.flags |= NODROP user.animate_movement = NO_STEPS user.changeNext_move(8 + phase_in_ds) user.notransform = 1 user.anchored = 1 + user.Stun(INFINITY) animate(user, color = "#00ccee", time = 3) spawn(3) - if(teleporting && activated && user && !qdeleted(user) && phase_underlay && !qdeleted(phase_underlay)) + if(teleporting && activated && user && phase_underlay && !qdeleted(phase_underlay)) animate(user, alpha = 0, time = 2) animate(phase_underlay, alpha = 255, time = 2) sleep(2) - if(teleporting && activated && user && !qdeleted(user) && phase_underlay && !qdeleted(phase_underlay)) + if(teleporting && activated && user && phase_underlay && !qdeleted(phase_underlay)) phase_underlay.loc = to_turf user.loc = to_turf animate(user, alpha = 255, time = phase_in_ds) animate(phase_underlay, alpha = 0, time = phase_in_ds) sleep(phase_in_ds) - if(teleporting && activated && user && !qdeleted(user) && phase_underlay && !qdeleted(phase_underlay)) + if(teleporting && activated && phase_underlay && !qdeleted(phase_underlay)) animate(user, color = "#ffffff", time = 3) sleep(3) if(teleporting && user && !qdeleted(user)) user.loc = to_turf //this will cover if bad things happen before the teleport, yes it is redundant finish_chronowalk() +/obj/item/clothing/suit/space/chronos/proc/create_phase_underlay(var/mob/user) + var/icon/user_icon = getFlatIcon(user) + user_icon.Blend("#ffffff") + var/atom/movable/overlay/phase = new(user.loc) + phase.icon = user_icon + phase.density = 1 + phase.anchored = 1 + phase.master = user + phase.animate_movement = NO_STEPS + phase.alpha = 0 + phase.mouse_opacity = 0 + phase.name = user.name + phase.transform = user.transform + phase.pixel_x = user.pixel_x + phase.pixel_y = user.pixel_y + return phase + /obj/item/clothing/suit/space/chronos/process() if(activated) var/mob/living/carbon/human/user = src.loc @@ -265,9 +284,9 @@ src.loc = get_turf(user) user.reset_view(src) user.set_machine(src) - var/step = get_step(src, direction) + var/atom/step = get_step(src, direction) if(step) - if(istype(step, /turf/space)) + if((step.x <= TRANSITIONEDGE) || (step.x >= (world.maxx - TRANSITIONEDGE - 1)) || (step.y <= TRANSITIONEDGE) || (step.y >= (world.maxy - TRANSITIONEDGE - 1))) if(!src.Move(step)) src.loc = step else From 17e034bf47e809800ea5913397995bcd79f6e11f Mon Sep 17 00:00:00 2001 From: JJRcop Date: Fri, 6 Nov 2015 12:47:25 -0500 Subject: [PATCH 5/5] Changes chronosuit hands_nodrop_states to a bitfield from a list --- code/modules/clothing/spacesuits/chronosuit.dm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 60dc4271ed3..be2da2b3b62 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -25,7 +25,7 @@ action_button_name = "Toggle Chronosuit" armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) var/list/chronosafe_items = list(/obj/item/weapon/chrono_eraser, /obj/item/weapon/gun/energy/chrono_gun) - var/list/hands_nodrop_states + var/hands_nodrop_states var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null var/atom/movable/overlay/phase_underlay = null @@ -83,9 +83,9 @@ user.notransform = 0 user.anchored = 0 teleporting = 0 - if(user.l_hand && !hands_nodrop_states[1]) + if(user.l_hand && !(hands_nodrop_states & 1)) user.l_hand.flags &= ~NODROP - if(user.r_hand && !hands_nodrop_states[2]) + if(user.r_hand && !(hands_nodrop_states & 2)) user.r_hand.flags &= ~NODROP if(phase_underlay && !qdeleted(phase_underlay)) qdel(phase_underlay) @@ -123,12 +123,12 @@ phase_underlay = create_phase_underlay(user) - hands_nodrop_states = list(0, 0) + hands_nodrop_states = 0 if(user.l_hand) - hands_nodrop_states[1] = user.l_hand.flags & NODROP + hands_nodrop_states |= (user.l_hand.flags & NODROP) ? 1 : 0 user.l_hand.flags |= NODROP if(user.r_hand) - hands_nodrop_states[2] = user.r_hand.flags & NODROP + hands_nodrop_states |= (user.r_hand.flags & NODROP) ? 2 : 0 user.r_hand.flags |= NODROP user.animate_movement = NO_STEPS