From 8f921682a0c3347e0d38b0010b055890c91c9154 Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Thu, 22 Oct 2015 13:56:05 +0200 Subject: [PATCH 1/3] Police tape rewrite --- code/game/objects/items/weapons/policetape.dm | 211 +++++++++++++----- icons/policetape.dmi | Bin 2510 -> 3566 bytes 2 files changed, 159 insertions(+), 52 deletions(-) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 50be738ecce..cdb87b4d84f 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -18,6 +18,7 @@ var/list/tape_roll_applications = list() anchored = 1 var/lifted = 0 var/crumpled = 0 + var/tape_dir = 0 var/icon_base /obj/item/tape/New() @@ -32,7 +33,7 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/police name = "police tape" desc = "A roll of police tape used to block off crime scenes from the public." - icon_state = "police_start" + icon_state = "police" tape_type = /obj/item/tape/police icon_base = "police" @@ -45,7 +46,7 @@ var/list/tape_roll_applications = list() /obj/item/taperoll/engineering name = "engineering tape" desc = "A roll of engineering tape used to block off working areas from the public." - icon_state = "engineering_start" + icon_state = "engineering" tape_type = /obj/item/tape/engineering icon_base = "engineering" @@ -55,58 +56,146 @@ var/list/tape_roll_applications = list() req_one_access = list(access_engine,access_atmospherics) icon_base = "engineering" +/obj/item/taperoll/atmos + name = "atmospherics tape" + desc = "A roll of atmospherics tape used to block off working areas from the public." + icon_state = "atmos" + tape_type = /obj/item/tape/atmos + icon_base = "atmos" + +/obj/item/tape/atmos + name = "atmospherics tape" + desc = "A length of atmospherics tape. Better not cross it." + req_one_access = list(access_engine,access_atmospherics) + icon_base = "atmos" + +/obj/item/taperoll/update_icon() + overlays.Cut() + if(ismob(loc)) + if(!start) + overlays += "start" + else + overlays += "stop" + +/obj/item/taperoll/dropped(mob/user) + ..() + update_icon() + +/obj/item/taperoll/pickup(mob/user) + ..() + update_icon() + /obj/item/taperoll/attack_self(mob/user as mob) - if(icon_state == "[icon_base]_start") + if(!start) start = get_turf(src) usr << "You place the first end of \the [src]." - icon_state = "[icon_base]_stop" + update_icon() else - icon_state = "[icon_base]_start" end = get_turf(src) if(start.y != end.y && start.x != end.x || start.z != end.z) + start = null + update_icon() usr << "\The [src] can only be laid horizontally or vertically." return + if(start == end) + // spread tape in all directions, provided there is a wall/window + var/turf/T + var/possible_dirs = 0 + for(var/dir in cardinal) + T = get_step(start, dir) + if(T && T.density) + possible_dirs += dir + else + for(var/obj/structure/window/W in T) + if(W.is_fulltile() || W.dir == reverse_dir[dir]) + possible_dirs += dir + if(!possible_dirs) + start = null + update_icon() + usr << "You can't place \the [src] here." + return + if(possible_dirs & (NORTH|SOUTH)) + var/obj/item/tape/TP = new tape_type(start) + for(var/dir in list(NORTH, SOUTH)) + if (possible_dirs & dir) + TP.tape_dir += dir + TP.icon_state = "[TP.icon_base]_[TP.tape_dir]" + if(possible_dirs & (EAST|WEST)) + var/obj/item/tape/TP = new tape_type(start) + for(var/dir in list(EAST, WEST)) + if (possible_dirs & dir) + TP.tape_dir += dir + TP.icon_state = "[TP.icon_base]_[TP.tape_dir]" + start = null + update_icon() + usr << "You finish placing \the [src]." + return + var/turf/cur = start - var/dir - if (start.x == end.x) - var/d = end.y-start.y - if(d) d = d/abs(d) - end = get_turf(locate(end.x,end.y+d,end.z)) - dir = "v" - else - var/d = end.x-start.x - if(d) d = d/abs(d) - end = get_turf(locate(end.x+d,end.y,end.z)) - dir = "h" + var/orientation = get_dir(start, end) + var/dir = 0 + switch(orientation) + if(NORTH, SOUTH) dir = NORTH|SOUTH // North-South taping + if(EAST, WEST) dir = EAST|WEST // East-West taping var/can_place = 1 - while (cur!=end && can_place) + while (can_place) if(cur.density == 1) can_place = 0 else if (istype(cur, /turf/space)) can_place = 0 else for(var/obj/O in cur) - if(!istype(O, /obj/item/tape) && O.density) + if(O.density) can_place = 0 break + if(cur == end) + break cur = get_step_towards(cur,end) if (!can_place) + start = null + update_icon() usr << "You can't run \the [src] through that!" return cur = start - var/tapetest = 0 - while (cur!=end) - for(var/obj/item/tape/Ptest in cur) - if(Ptest.icon_state == "[Ptest.icon_base]_[dir]") + var/tapetest + var/tape_dir + while (1) + tapetest = 0 + tape_dir = dir + if(cur == start) + var/turf/T = get_step(start, reverse_dir[orientation]) + if(T && !T.density) + tape_dir = orientation + for(var/obj/structure/window/W in T) + if(W.is_fulltile() || W.dir == orientation) + tape_dir = dir + else if(cur == end) + var/turf/T = get_step(end, orientation) + if(T && !T.density) + tape_dir = reverse_dir[orientation] + for(var/obj/structure/window/W in T) + if(W.is_fulltile() || W.dir == reverse_dir[orientation]) + tape_dir = dir + for(var/obj/item/tape/T in cur) + if((T.tape_dir == tape_dir) && (T.icon_base == icon_base)) tapetest = 1 - if(tapetest != 1) - var/obj/item/tape/P = new tape_type(cur) - P.icon_state = "[P.icon_base]_[dir]" + break + if(!tapetest) + var/obj/item/tape/T = new tape_type(cur) + T.icon_state = "[T.icon_base]_[tape_dir]" + T.tape_dir = tape_dir + if(tape_dir & SOUTH) + T.layer += 0.1 // Must always show above other tapes + if(cur == end) + break cur = get_step_towards(cur,end) + start = null + update_icon() usr << "You finish placing \the [src]." + return /obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity) if(!proximity) @@ -149,6 +238,8 @@ var/list/tape_roll_applications = list() add_fingerprint(M) if (!allowed(M)) //only select few learn art of not crumpling the tape M << "You are not supposed to go past [src]..." + if(M.a_intent == I_HELP) + return 0 crumple() return ..(mover) @@ -158,13 +249,45 @@ var/list/tape_roll_applications = list() /obj/item/tape/attack_hand(mob/user as mob) if (user.a_intent == I_HELP && src.allowed(user)) user.show_viewers("\The [user] lifts \the [src], allowing passage.") - crumple() - lifted = 1 - spawn(200) - lifted = 0 + for(var/obj/item/tape/T in gettapeline()) + T.lift(100) //~10 seconds else breaktape(null, user) +/obj/item/tape/proc/lift(time) + lifted = 1 + layer = 8 + spawn(time) + lifted = 0 + layer = initial(layer) + +// Returns a list of all tape objects connected to src, including itself. +/obj/item/tape/proc/gettapeline() + var/list/dirs = list() + if(tape_dir & NORTH) + dirs += NORTH + if(tape_dir & SOUTH) + dirs += SOUTH + if(tape_dir & WEST) + dirs += WEST + if(tape_dir & EAST) + dirs += EAST + + var/list/obj/item/tape/tapeline = list() + for (var/obj/item/tape/T in get_turf(src)) + tapeline += T + for(var/dir in dirs) + var/turf/cur = get_step(src, dir) + var/not_found = 0 + while (!not_found) + not_found = 1 + for (var/obj/item/tape/T in cur) + tapeline += T + not_found = 0 + cur = get_step(cur, dir) + return tapeline + + /obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) @@ -173,27 +296,11 @@ var/list/tape_roll_applications = list() return user.show_viewers("\The [user] breaks \the [src]!") - var/dir[2] - var/icon_dir = src.icon_state - if(icon_dir == "[src.icon_base]_h") - dir[1] = EAST - dir[2] = WEST - if(icon_dir == "[src.icon_base]_v") - dir[1] = NORTH - dir[2] = SOUTH - - for(var/i=1;i<3;i++) - var/N = 0 - var/turf/cur = get_step(src,dir[i]) - while(N != 1) - N = 1 - for (var/obj/item/tape/P in cur) - if(P.icon_state == icon_dir) - N = 0 - qdel(P) - cur = get_step(cur,dir[i]) - - qdel(src) - return - + for (var/obj/item/tape/T in gettapeline()) + if(T == src) + continue + if(T.tape_dir & get_dir(T, src)) + qdel(T) + qdel(src) //TODO: Dropping a trash item holding fibers/fingerprints of all broken tape parts + return \ No newline at end of file diff --git a/icons/policetape.dmi b/icons/policetape.dmi index 841878f73fc671312f5f9cfef852b08a298f5ded..c28822a7ca088982337d3960f78189c1332ab87f 100644 GIT binary patch literal 3566 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 literal 2510 zcmV;<2{HDGP)005u}0{{R3yb+fl0000mP)t-sz`($5 z&I`^93r|k~zrO(C;Q&E6BUe`o!omyU;tK!(0P3j||I9O8UGpz5d%(cJ6A%+i00001 zbW%=J06^y0W&i*H(0Wu@bVOxyV{&P5bZKvH004NLm6S~i!ypia*Ln&`_N9N@Zc0MQ zqPaqlWEuw=4JzsNE478Bg*w^I$oEFyQ_RJ=yi~O)t`(oaIy73G#BsCb?17zEp*ie1 zQ-Hnlv2k8{2xT^!JGRh--ujHQ4y_BzJI-!a4iM{K*o;)RGsdoAo0du|DmalR(l?(7 zDCizFfJNOC^Ia+kA#9@FB#Pr59SMUk`d{iJH5k4Sp6@tva@^`Aw0b8 zLBETL@wr4Y$H80t-PXUp!Ya1B4kBYepN|CrQ$o=X(msg7%N&J9^Y{HHYZ1U30lFm7 zM87WwC!2?025rsXgQIu$a9{AC_mAMA_ecP77K(mfl?3q&)oh|M=Sjx+A1h$L0em1~ zzXE=cz>;=xk%)d8&J0D0WLy$&@sq@fKdZ0Pe@|e=QBd@Uq79TJBWddXu_p8!nq?yP@9;AQj-SN!dbsn*nQ zI?;cFDKly3FJ1{0T4tt={`?2H!GxLi>c>31k%&QXQOdbb4m0&lsZw)xn5l10=B)c` z!_0;u@BMBL{vXYL+zjmS9j*TPM=tOv0<_HeHT#bMD6QKMBBtk;^&cw(TIT$+{$pK0 z%K?`4A7enb3MeWP=KQk$V|~Efq`cUw0M^6dFVHfA)(%6?Z_F@c?|#Kak~`n6xW>WR zD7?Vkn9-jhY*Hk_=dV6ki4f@qlO=Q)D2$+dz6Cm`u|#Nq&S{(_Y#2coK*+!l!*qQ; z4v>K%h5{mUfzW|qyAtt2UIqj{j36F{=vBan5yZp56EaDT{X1x&$7cPL(WjA$1i%J6 zj-v&EQ$he6jPn~1SR~{C5BBfEJLCZe1niPTB)|ayJ1G$vz{kUG`*&9A-{JXM1Q)Q ztvCuIp~;VecMR0b0J9;?3^45hecokn#H0SBv8I4(fAPQ?xh-G?gJomkl)p7#*<_)! zh3Bj9Ul_seuSd|j2sU1ml+UOeuSxzoU|$I6&TlJmUzmf1=j#{v>jQPE*|BfDaxXMD zW2p{UwTo^0VWH#=%t^r4=68aOOt^4zRBd_f}{Bt!0HiP_Wz-b zc=d6och(;RR*xX|HT~WuFJl}W&94D!Tc6U7WbfHMMiYa;e=|A)hj z{XhI`p6S_Wd!HMqm0?Dj5yyaW7RG=}7A}0VhnwjT_+mgMf^M7^su%_tAhe`yvj1;F zLPOdvMUvIGPXW~kO2dpNwBjg;geDzh>K93Vpk@Y`4dL|xW&zZTM84Hc$tR8o_5FW} z6-BVh{y)VI0Oo&Np|u^DEW|s+?=>B;|1w~&0`}jP_~NSWHoLZ}yV0(-K5n#Yt&bb+ zTI=IR`|lTt`UYAOf7|rd#Fvdp;=lD<^h^>LwK}RBlf=`y!u$iq6v^~@WeD#MuUnJE zfUp)8WcEvxTevo6labyyL`G)pFGLIT=Ekq;Oe!9LX;WlYD&xPPVx+FYr-Z2HTG5g-YGA0 z_24c2JD^!wJN`l1zw1&!kai|YFLP~aPxbF$7>ohIoU9&F9<&Ppk;ESA-@$ZdN^%g3 z7Apg*xn>wi-_8bQNoclz$3)OKv_M{jB$-2ER Date: Thu, 22 Oct 2015 13:59:44 +0200 Subject: [PATCH 2/3] Atmos personal locker spawn with atmos tape roll --- .../structures/crates_lockers/closets/secure/engineering.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index d583e775470..9e7fa2975fd 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -148,5 +148,5 @@ new /obj/item/clothing/suit/storage/hazardvest(src) new /obj/item/clothing/mask/gas(src) new /obj/item/weapon/cartridge/atmos(src) - new /obj/item/taperoll/engineering(src) + new /obj/item/taperoll/atmos(src) return From f0fac760a45851bfb1d9a245a8b4b03a7aeb32cd Mon Sep 17 00:00:00 2001 From: Hubblenaut Date: Thu, 22 Oct 2015 14:04:46 +0200 Subject: [PATCH 3/3] Updates Changelog --- html/changelogs/Hubblenaut-tape.yml | 41 +++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 html/changelogs/Hubblenaut-tape.yml diff --git a/html/changelogs/Hubblenaut-tape.yml b/html/changelogs/Hubblenaut-tape.yml new file mode 100644 index 00000000000..fa97c1a036c --- /dev/null +++ b/html/changelogs/Hubblenaut-tape.yml @@ -0,0 +1,41 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Hubblenaut + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Adds tape for atmospherics." + - tweak: "Tape graphics and algorithm changes. Looks a lot more appealing now." + - tweak: "Starting and ending tape on the same turf will connect it to all surrounding walls/windows." + - tweak: "Lifting a part of the tape will lift an entire tape section." + - tweak: "Mobs on help intent do stop for tape." + - bugfix: "Crumpled tape does not affect tape breaking behavior anymore."