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 65eb17d4f53..15bcdcb949b 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 8645d0dc62b..01612e1dd85 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 e1facd0a59a..7e58853ca44 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 a7df223b95a..d70d0259e5f 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 bba590229f3..9c9700b4b0a 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 ab98821250f..dfc84c4d1e1 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 660729ec18d..91d2086cbee 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 4cb984c2a17..75a8fbfa406 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 1f6248348ab..7b07ce3a8d0 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 3ff5743048a..c05940bf6ab 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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