From 9efafd39bdaa1fdfde332c726bd335b7fb50f66f Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 12 May 2012 22:16:23 +0300 Subject: [PATCH] Police tape overhaul General purge of copypaste code Framework for easier adding of new tape types Now you only need two sprites of roll and sprites of tape length (H and V) Define them in police_tape.dm To show it off, engineering tape added, passable by engineers and atmos techs Last but not least - ability to lift the tape, allowing passage for pretty much everything. Done by those with access, attack by empty hand on help intent. --- code/WorkInProgress/Ported/policetape.dm | 254 ++++++++---------- code/WorkInProgress/SkyMarshal/wardrobes.dm | 4 +- code/defines/obj.dm | 26 +- code/game/machinery/doors/airlock.dm | 2 +- .../objects/closets/secure/engineering.dm | 1 + code/game/objects/closets/secure/security.dm | 4 +- code/game/objects/storage/belt.dm | 2 +- code/modules/clothing/suits/armor.dm | 6 +- code/modules/clothing/suits/detective.dm | 4 +- code/modules/clothing/suits/heavy.dm | 2 +- icons/policetape.dmi | Bin 1798 -> 2181 bytes 11 files changed, 134 insertions(+), 171 deletions(-) diff --git a/code/WorkInProgress/Ported/policetape.dm b/code/WorkInProgress/Ported/policetape.dm index 65eb17d4f5..15bcdcb949 100644 --- a/code/WorkInProgress/Ported/policetape.dm +++ b/code/WorkInProgress/Ported/policetape.dm @@ -1,97 +1,89 @@ -/obj/item/policetaperoll/attack_self(mob/user as mob) - if(icon_state == "rollstart") - tapestartx = src.loc.x - tapestarty = src.loc.y - tapestartz = src.loc.z - usr << "\blue You place the first end of the police tape." - icon_state = "rollstop" + +/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" + tape_type = /obj/item/tape/police + icon_base = "police" + +/obj/item/tape/police + name = "police tape" + desc = "A length of police tape. Do not cross." + req_access = list(access_security) + icon_base = "police" + +/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" + tape_type = /obj/item/tape/engineering + icon_base = "engineering" + +/obj/item/tape/engineering + name = "engineering tape" + desc = "A length of engineering tape. Better not cross it." + req_one_access = list(access_engine,access_atmospherics) + icon_base = "engineering" + +/obj/item/taperoll/attack_self(mob/user as mob) + if(icon_state == "[icon_base]_start") + start = get_turf(src) + usr << "\blue You place the first end of the [src]." + icon_state = "[icon_base]_stop" else - tapeendx = src.loc.x - tapeendy = src.loc.y - tapeendz = src.loc.z + icon_state = "[icon_base]_start" + end = get_turf(src) + if(start.y != end.y && start.x != end.x || start.z != end.z) + usr << "\blue [src] can only be laid horizontally or vertically." + + 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" + + while (cur!=end) + if(cur.density == 1) + usr << "\blue You can't run [src] through a wall!" + return + cur = get_step_towards(cur,end) + + cur = start var/tapetest = 0 - if(tapestartx == tapeendx && tapestarty > tapeendy && tapestartz == tapeendz) - for(var/Y=tapestarty,Y>=tapeendy,Y--) - var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) - if(T.density == 1) - usr << "\blue You can't run police tape through a wall!" - icon_state = "rollstart" - return - for(var/Y=tapestarty,Y>=tapeendy,Y--) - var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) - for(var/obj/item/policetape/Ptest in T) - if(Ptest.icon_state == "vertical") - tapetest = 1 - if(tapetest != 1) - var/obj/item/policetape/P = new/obj/item/policetape(tapestartx,Y,tapestartz) - P.loc = locate(tapestartx,Y,tapestartz) - P.icon_state = "vertical" - usr << "\blue You finish placing the police tape." //Git Test + while (cur!=end) + for(var/obj/item/tape/Ptest in cur) + if(Ptest.icon_state == "[Ptest.icon_base]_[dir]") + tapetest = 1 + if(tapetest != 1) + var/obj/item/tape/P = new tape_type(cur) + P.icon_state = "[P.icon_base]_[dir]" + cur = get_step_towards(cur,end) + //is_blocked_turf(var/turf/T) + usr << "\blue You finish placing the [src]." //Git Test - if(tapestartx == tapeendx && tapestarty < tapeendy && tapestartz == tapeendz) - for(var/Y=tapestarty,Y<=tapeendy,Y++) - var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) - if(T.density == 1) - usr << "\blue You can't run police tape through a wall!" - icon_state = "rollstart" - return - for(var/Y=tapestarty,Y<=tapeendy,Y++) - var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) - for(var/obj/item/policetape/Ptest in T) - if(Ptest.icon_state == "vertical") - tapetest = 1 - if(tapetest != 1) - var/obj/item/policetape/P = new/obj/item/policetape(tapestartx,Y,tapestartz) - P.loc = locate(tapestartx,Y,tapestartz) - P.icon_state = "vertical" - usr << "\blue You finish placing the police tape." +/obj/item/taperoll/police/afterattack(var/atom/A, mob/user as mob) + if (istype(A, /obj/machinery/door/airlock)) + var/turf/T = get_turf(A) + var/obj/item/tape/P = new tape_type(T.x,T.y,T.z) + P.loc = locate(T.x,T.y,T.z) + P.icon_state = "door" + P.layer = 3.2 + user << "\blue You finish placing the [src]." - if(tapestarty == tapeendy && tapestartx > tapeendx && tapestartz == tapeendz) - for(var/X=tapestartx,X>=tapeendx,X--) - var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) - if(T.density == 1) - usr << "\blue You can't run police tape through a wall!" - icon_state = "rollstart" - return - for(var/X=tapestartx,X>=tapeendx,X--) - var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) - for(var/obj/item/policetape/Ptest in T) - if(Ptest.icon_state == "horizontal") - tapetest = 1 - if(tapetest != 1) - var/obj/item/policetape/P = new/obj/item/policetape(X,tapestarty,tapestartz) - P.loc = locate(X,tapestarty,tapestartz) - P.icon_state = "horizontal" - usr << "\blue You finish placing the police tape." - - if(tapestarty == tapeendy && tapestartx < tapeendx && tapestartz == tapeendz) - for(var/X=tapestartx,X<=tapeendx,X++) - var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) - if(T.density == 1) - usr << "\blue You can't run police tape through a wall!" - icon_state = "rollstart" - return - for(var/X=tapestartx,X<=tapeendx,X++) - var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) - for(var/obj/item/policetape/Ptest in T) - if(Ptest.icon_state == "horizontal") - tapetest = 1 - if(tapetest != 1) - var/obj/item/policetape/P = new/obj/item/policetape(X,tapestarty,tapestartz) - P.loc = locate(X,tapestarty,tapestartz) - P.icon_state = "horizontal" - usr << "\blue You finish placing the police tape." - - if(tapestarty != tapeendy && tapestartx != tapeendx) - usr << "\blue Police tape can only be laid horizontally or vertically." - icon_state = "rollstart" - -/obj/item/policetape/Bumped(M as mob) +/obj/item/tape/Bumped(M as mob) if(src.allowed(M)) var/turf/T = get_turf(src) M:loc = T -/obj/item/policetape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) +/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(!density) return 1 if(air_group || (height==0)) return 1 if ((mover.flags & 2 || istype(mover, /obj/effect/meteor) || mover.throwing == 1) ) @@ -99,78 +91,48 @@ else return 0 -/obj/item/policetape/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/tape/attackby(obj/item/weapon/W as obj, mob/user as mob) breaktape(W, user) -/obj/item/policetape/attack_hand(mob/user as mob) - breaktape(null, user) +/obj/item/tape/attack_hand(mob/user as mob) + if (user.a_intent == "help" && src.allowed(user)) + user.show_viewers("\blue [user] lifts [src], allowing passage.") + src.density = 0 + spawn(200) + src.density = 1 + else + breaktape(null, user) -/obj/item/policetape/attack_paw(mob/user as mob) +/obj/item/tape/attack_paw(mob/user as mob) breaktape(/obj/item/weapon/wirecutters,user) -/obj/item/policetape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) if(user.a_intent == "help" && ((!is_sharp(W) && src.allowed(user)) ||(!is_cut(W) && !src.allowed(user)))) - user << "You can't break the tape with that!" + user << "You can't break the [src] with that!" return - user.show_viewers(text("\blue [] breaks the police tape!", user)) - var/OX = src.x - var/OY = src.y - if(src.icon_state == "horizontal") + user.show_viewers("\blue [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/X = OX + 1 - var/turf/T = src.loc + var/turf/cur = get_step(src,dir[i]) while(N != 1) N = 1 - T = locate(X,T.y,T.z) - for (var/obj/item/policetape/P in T) - N = 0 - if(P.icon_state == "horizontal") + for (var/obj/item/tape/P in cur) + if(P.icon_state == icon_dir) + N = 0 del(P) - X += 1 - - X = OX - 1 - N = 0 - while(N != 1) - N = 1 - T = locate(X,T.y,T.z) - for (var/obj/item/policetape/P in T) - N = 0 - if(P.icon_state == "horizontal") - del(P) - X -= 1 - - if(src.icon_state == "vertical") - var/N = 0 - var/Y = OY + 1 - var/turf/T = src.loc - while(N != 1) - N = 1 - T = locate(T.x,Y,T.z) - for (var/obj/item/policetape/P in T) - N = 0 - if(P.icon_state == "vertical") - del(P) - Y += 1 - - Y = OY - 1 - N = 0 - while(N != 1) - N = 1 - T = locate(T.x,Y,T.z) - for (var/obj/item/policetape/P in T) - N = 0 - if(P.icon_state == "vertical") - del(P) - Y -= 1 + cur = get_step(cur,dir[i]) del(src) return -/obj/item/policetaperoll/afterattack(var/atom/A, mob/user as mob) - if (istype(A, /obj/machinery/door/airlock)) - var/turf/T = get_turf(A) - var/obj/item/policetape/P = new/obj/item/policetape(T.x,T.y,T.z) - P.loc = locate(T.x,T.y,T.z) - P.icon_state = "door" - P.layer = 3.2 - user << "\blue You finish placing the police tape." + diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm index 8645d0dc62..01612e1dd8 100755 --- a/code/WorkInProgress/SkyMarshal/wardrobes.dm +++ b/code/WorkInProgress/SkyMarshal/wardrobes.dm @@ -422,7 +422,7 @@ new /obj/item/weapon/clipboard(src) new /obj/item/weapon/clipboard/notebook(src) new /obj/item/device/detective_scanner(src) - new /obj/item/policetaperoll(src) + new /obj/item/taperoll/police(src) new /obj/item/weapon/storage/box/evidence(src) new /obj/item/device/pda/detective(src) new /obj/item/clothing/suit/det_suit/armor(src) @@ -445,7 +445,7 @@ new /obj/item/weapon/pepperspray(src) new /obj/item/device/flash(src) new /obj/item/weapon/melee/baton(src) - new /obj/item/policetaperoll(src) + new /obj/item/taperoll/police(src) new /obj/item/weapon/flashbang(src) new /obj/item/device/pda/security(src) new /obj/item/clothing/suit/armor/vest(src) diff --git a/code/defines/obj.dm b/code/defines/obj.dm index e1facd0a59..7e58853ca4 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -23,28 +23,28 @@ proc/initialize() -/obj/item/policetaperoll - name = "police tape roll" - desc = "A roll of police tape used to block off crime scenes from the public." +//Define all tape types in policetape.dm +/obj/item/taperoll + name = "tape roll" icon = 'policetape.dmi' icon_state = "rollstart" flags = FPRINT w_class = 1.0 - var/tapestartx = 0 - var/tapestarty = 0 - var/tapestartz = 0 - var/tapeendx = 0 - var/tapeendy = 0 - var/tapeendz = 0 + var + turf/start + turf/end + tape_type = /obj/item/tape + icon_base -/obj/item/policetape - name = "police tape" - desc = "A length of police tape. Do not cross." +/obj/item/tape + name = "tape" icon = 'policetape.dmi' anchored = 1 density = 1 - req_access = list(access_security) + var/icon_base +/* +*/ /obj/structure/signpost icon = 'stationobjs.dmi' icon_state = "signpost" diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index a7df223b95..d70d0259e5 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -362,7 +362,7 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. //world << text("airlock attackby src [] obj [] mob []", src, C, user) if(istype(C, /obj/item/device/detective_scanner)) return - if(istype(C, /obj/item/policetaperoll)) + if(istype(C, /obj/item/taperoll/police)) return if (!istype(usr, /mob/living/silicon)) if (src.isElectrified()) diff --git a/code/game/objects/closets/secure/engineering.dm b/code/game/objects/closets/secure/engineering.dm index bba590229f..9c9700b4b0 100644 --- a/code/game/objects/closets/secure/engineering.dm +++ b/code/game/objects/closets/secure/engineering.dm @@ -32,6 +32,7 @@ new /obj/item/device/multitool(src) new /obj/item/device/flash(src) new /obj/item/clothing/glasses/meson(src) + new /obj/item/taperoll/engineering(src) return diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm index ab98821250..dfc84c4d1e 100644 --- a/code/game/objects/closets/secure/security.dm +++ b/code/game/objects/closets/secure/security.dm @@ -136,7 +136,7 @@ var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) var/obj/item/weapon/storage/box/B = new(BPK) new /obj/item/weapon/pen(B) - new /obj/item/policetaperoll(src) + new /obj/item/taperoll/police(src) new /obj/item/clothing/suit/armor/vest(src) new /obj/item/clothing/suit/storage/gearharness(src) new /obj/item/clothing/head/helmet(src) @@ -174,7 +174,7 @@ new /obj/item/weapon/pen(C) new /obj/item/weapon/clipboard/notebook(src) new /obj/item/device/detective_scanner(src) - new /obj/item/policetaperoll(src) + new /obj/item/taperoll/police(src) new /obj/item/weapon/storage/box/evidence(src) new /obj/item/device/pda/detective(src) new /obj/item/device/radio/headset/headset_sec(src) diff --git a/code/game/objects/storage/belt.dm b/code/game/objects/storage/belt.dm index 660729ec18..91d2086cbe 100644 --- a/code/game/objects/storage/belt.dm +++ b/code/game/objects/storage/belt.dm @@ -153,7 +153,7 @@ "/obj/item/weapon/zippo", "/obj/item/device/taperecorder", "/obj/item/weapon/evidencebag", - "/obj/item/policetaperoll" + "/obj/item/taperoll/police" ) /obj/item/weapon/storage/belt/soulstone diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 4cb984c2a1..75a8fbfa40 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -1,5 +1,5 @@ /obj/item/clothing/suit/armor - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/policetaperoll) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/taperoll/police) body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS flags_inv = HIDEJUMPSUIT @@ -52,7 +52,7 @@ item_state = "gearharness" body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS | ONESIZEFITSALL - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/policetaperoll) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/taperoll/police) flags_inv = 0 /obj/item/clothing/suit/armor/reactive @@ -72,7 +72,7 @@ item_state = "armourrigvest" body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS | ONESIZEFITSALL - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/policetaperoll) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/taperoll/police) armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/suit/armor/reactive/IsShield() diff --git a/code/modules/clothing/suits/detective.dm b/code/modules/clothing/suits/detective.dm index 1f6248348a..7b07ce3a8d 100644 --- a/code/modules/clothing/suits/detective.dm +++ b/code/modules/clothing/suits/detective.dm @@ -12,7 +12,7 @@ icon_state = "detective" item_state = "det_suit" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/cigpacket,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/policetaperoll) + allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/cigpacket,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder,/obj/item/taperoll/police) armor = list(melee = 50, bullet = 10, laser = 25, energy = 10, bomb = 0, bio = 0, rad = 0) @@ -23,7 +23,7 @@ item_state = "armor" flags = FPRINT | TABLEPASS | ONESIZEFITSALL body_parts_covered = UPPER_TORSO|LOWER_TORSO - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/policetaperoll) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/taperoll/police) armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) /obj/item/clothing/under/det/verb/holster() diff --git a/code/modules/clothing/suits/heavy.dm b/code/modules/clothing/suits/heavy.dm index 3ff5743048..c05940bf6a 100644 --- a/code/modules/clothing/suits/heavy.dm +++ b/code/modules/clothing/suits/heavy.dm @@ -75,7 +75,7 @@ item_state = "invisible" body_parts_covered = UPPER_TORSO|LOWER_TORSO flags = FPRINT | TABLEPASS | ONESIZEFITSALL - allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/policetaperoll) + allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/pepperspray,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/taperoll/police) armor = list(melee = 50, bullet = 15, laser = 50, energy = 10, bomb = 25, bio = 0, rad = 0) flags_inv = 0 diff --git a/icons/policetape.dmi b/icons/policetape.dmi index dfa39a146747beac4598c2c56e866c6abd979fc7..533d6cca8a669c3a85a95faeea794a37bf804a90 100644 GIT binary patch literal 2181 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