From 3d8c6c044e065daba9e039e02d7311df96a13aad Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Sat, 14 May 2016 19:29:28 -0400 Subject: [PATCH 01/26] Changes grille sprites to be in-line with broken grilles --- icons/obj/structures.dmi | Bin 118498 -> 118482 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 71f5dd6190885d13430679d13987d0e5c09104d0..219bb139c667d698825c78d37df5caeb30198752 100644 GIT binary patch literal 118482 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�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 z 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%0ACy8bZ{QRA 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

}^!p02LEcK&3E+|5yOG^P{bp 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

NRP9y^YAUZj6 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 Date: Sat, 21 May 2016 23:53:47 +0100 Subject: [PATCH 02/26] fixes choking.dm runtime due to new viruses --- code/datums/diseases/advance/symptoms/choking.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index e5b338728d0..8c8d698baa8 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -43,11 +43,11 @@ Bonus return /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) + var/get_damage = (sqrt(21+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) M.adjustOxyLoss(get_damage) return 1 /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(20+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) + var/get_damage = (sqrt(21+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) M.adjustOxyLoss(get_damage) return 1 \ No newline at end of file From 62bdc2d859335c0f43dc568102aa9af40376ae4e Mon Sep 17 00:00:00 2001 From: Akke Date: Sun, 22 May 2016 22:34:08 +0100 Subject: [PATCH 03/26] changes to (sqrt(21+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*1)) sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()) --- code/datums/diseases/advance/symptoms/choking.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/diseases/advance/symptoms/choking.dm b/code/datums/diseases/advance/symptoms/choking.dm index 8c8d698baa8..ffe25551553 100644 --- a/code/datums/diseases/advance/symptoms/choking.dm +++ b/code/datums/diseases/advance/symptoms/choking.dm @@ -43,11 +43,11 @@ Bonus return /datum/symptom/choking/proc/Choke_stage_3_4(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(21+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth())*1) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()) M.adjustOxyLoss(get_damage) return 1 /datum/symptom/choking/proc/Choke(mob/living/M, datum/disease/advance/A) - var/get_damage = (sqrt(21+A.totalStageSpeed())/2)+(sqrt(16+A.totalStealth()*5)) + var/get_damage = sqrt(21+A.totalStageSpeed()*0.5)+sqrt(16+A.totalStealth()*5) M.adjustOxyLoss(get_damage) return 1 \ No newline at end of file From 11ca987acb96fbf6092ea897ed6429db79cfdf34 Mon Sep 17 00:00:00 2001 From: phil235 Date: Tue, 24 May 2016 01:28:04 +0200 Subject: [PATCH 04/26] Merges Pull and Grab into a single functionality. Pulling someone is now the same as a passive grab. You can start pulling someone with ctrlclick or by using the grab intent with empty hand. Using the grab intent again on the pulled person tries to grab them aggressively, then neck grab, then kill grab. Two mobs can no longer pull the same mob at the same time. Pulling someone break any other pull/grab from other mob on that person. The grab item is gone entirely. You can now only grab one mob at a time, instead of two (one for each hand). Being aggressively grabbed or more now counts as being restrained (like handcuffed). A neck grab or more makes you lie down and prevents you from getting up until the grab is broken. Fixes movement when moving with a grabbed person. Fixes movement when moving a pulled person around you diagonally. Fixes neckgrab moving the victim on your turf even if the turf is dense. --- code/__DEFINES/combat.dm | 9 +- code/__DEFINES/misc.dm | 7 +- code/_onclick/click.dm | 2 +- code/_onclick/hud/screen_objects.dm | 14 -- code/datums/diseases/transformation.dm | 4 - code/datums/martial.dm | 14 +- code/game/atoms_movable.dm | 25 +- .../gamemodes/changeling/powers/absorb.dm | 22 +- code/game/gamemodes/sandbox/h_sandbox.dm | 2 +- code/game/machinery/dna_scanner.dm | 13 - code/game/machinery/washing_machine.dm | 19 +- code/game/objects/items.dm | 2 +- .../items/weapons/implants/implantchair.dm | 19 +- .../objects/items/weapons/storage/backpack.dm | 2 +- .../objects/items/weapons/storage/bags.dm | 4 +- .../objects/items/weapons/storage/storage.dm | 2 + .../objects/items/weapons/storage/wallets.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 57 +++-- code/game/objects/structures/tables_racks.dm | 58 +++-- .../structures/transit_tubes/station.dm | 63 ++--- code/game/objects/structures/watercloset.dm | 103 ++++---- .../food&drinks/kitchen machinery/gibber.dm | 31 ++- .../kitchen machinery/monkeyrecycler.dm | 12 - .../kitchen machinery/processor.dm | 18 +- code/modules/holiday/easter.dm | 2 +- code/modules/holodeck/items.dm | 34 +-- code/modules/mob/interactive.dm | 11 +- code/modules/mob/inventory.dm | 8 +- .../living/carbon/alien/humanoid/humanoid.dm | 20 +- .../mob/living/carbon/alien/larva/larva.dm | 4 +- code/modules/mob/living/carbon/alien/life.dm | 3 +- code/modules/mob/living/carbon/carbon.dm | 57 ++--- .../mob/living/carbon/carbon_defense.dm | 12 + .../mob/living/carbon/carbon_movement.dm | 1 + code/modules/mob/living/carbon/examine.dm | 3 + .../mob/living/carbon/human/examine.dm | 3 + .../mob/living/carbon/human/human_defense.dm | 16 +- .../mob/living/carbon/human/human_helpers.dm | 9 +- .../mob/living/carbon/human/inventory.dm | 1 + .../mob/living/carbon/human/species.dm | 16 -- code/modules/mob/living/carbon/inventory.dm | 3 + code/modules/mob/living/carbon/life.dm | 10 +- code/modules/mob/living/carbon/monkey/life.dm | 2 +- code/modules/mob/living/living.dm | 187 +++++++-------- code/modules/mob/living/living_defense.dm | 61 +++-- code/modules/mob/living/living_defines.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- code/modules/mob/living/silicon/pai/pai.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 4 +- code/modules/mob/living/silicon/silicon.dm | 2 +- .../friendly/drone/interaction.dm | 3 +- .../simple_animal/friendly/drone/inventory.dm | 3 + .../mob/living/simple_animal/hostile/bees.dm | 2 +- .../living/simple_animal/hostile/statue.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 3 + .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/mob/mob.dm | 73 +++--- code/modules/mob/mob_defines.dm | 6 +- code/modules/mob/mob_grab.dm | 223 ------------------ code/modules/mob/mob_movement.dm | 108 ++------- code/modules/vehicles/vehicle.dm | 2 +- tgstation.dme | 1 - 62 files changed, 518 insertions(+), 893 deletions(-) delete mode 100644 code/modules/mob/mob_grab.dm diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index 04e5a8fbf0d..2458519c4e6 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -39,11 +39,10 @@ //Grab levels -#define GRAB_PASSIVE 1 -#define GRAB_AGGRESSIVE 2 -#define GRAB_NECK 3 -#define GRAB_UPGRADING 4 -#define GRAB_KILL 5 +#define GRAB_PASSIVE 0 +#define GRAB_AGGRESSIVE 1 +#define GRAB_NECK 2 +#define GRAB_KILL 3 //Hostile Mob AI Status diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 9b9bc263e6d..0f46088543b 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -150,8 +150,9 @@ #define CLICK_CD_RANGE 4 #define CLICK_CD_BREAKOUT 100 #define CLICK_CD_HANDCUFFED 10 -#define CLICK_CD_TKSTRANGLE 10 #define CLICK_CD_RESIST 20 +#define CLICK_CD_GRABBING 10 + //click cooldowns, in tenths of a second @@ -423,3 +424,7 @@ var/global/list/ghost_others_options = list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE // Shuttle return values #define SHUTTLE_ALREADY_DOCKED 7 + +// Diagonal movement +#define FIRST_DIAG_STEP 1 +#define SECOND_DIAG_STEP 2 \ No newline at end of file diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 826a61fb9ab..756a6a73834 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -77,7 +77,7 @@ CtrlClickOn(A) return - if(stat || paralysis || stunned || weakened || sleeping) + if(incapacitated(ignore_restraints = 1)) return face_atom(A) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 72e5ae3c0f9..4cd7f81ecce 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -159,20 +159,6 @@ /obj/screen/drop/Click() usr.drop_item_v() -/obj/screen/grab - name = "grab" - -/obj/screen/grab/Click() - var/obj/item/weapon/grab/G = master - G.s_click(src) - return 1 - -/obj/screen/grab/attack_hand() - return - -/obj/screen/grab/attackby() - return - /obj/screen/act_intent name = "intent" icon_state = "help" diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 0eedaa98f70..f3054dcaeb3 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -45,10 +45,6 @@ if(affected_mob.notransform) return affected_mob.notransform = 1 - affected_mob.canmove = 0 - affected_mob.icon = null - affected_mob.overlays.Cut() - affected_mob.invisibility = INVISIBILITY_ABSTRACT for(var/obj/item/W in affected_mob) if(istype(W, /obj/item/weapon/implant)) qdel(W) diff --git a/code/datums/martial.dm b/code/datums/martial.dm index 46e18dde7d7..226da8d5e57 100644 --- a/code/datums/martial.dm +++ b/code/datums/martial.dm @@ -323,10 +323,16 @@ add_to_streak("G",D) if(check_streak(A,D)) return 1 - D.grabbedby(A,1) - var/obj/item/weapon/grab/G = A.get_active_hand() - if(G) - G.state = GRAB_AGGRESSIVE //Instant aggressive grab + if(A.grab_state > GRAB_AGGRESSIVE) + D.grabbedby(A, 1) + else + A.start_pulling(D, 1) + if(A.pulling) + D.drop_r_hand() + D.drop_l_hand() + D.stop_pulling() + A.grab_state = GRAB_AGGRESSIVE //Instant aggressive grab + return 1 /datum/martial_art/the_sleeping_carp/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) add_to_streak("H",D) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 63c03c9c2dd..8952ff9b962 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -13,10 +13,12 @@ var/verb_yell = "yells" var/inertia_dir = 0 var/pass_flags = 0 + var/moving_diagonally = 0 //0: not doing a diagonal move. 1 and 2: doing the first/second step of the diagonal move glide_size = 8 appearance_flags = TILE_BOUND + /atom/movable/Move(atom/newloc, direct = 0) if(!loc || !newloc) return 0 var/atom/oldloc = loc @@ -25,28 +27,38 @@ if (!(direct & (direct - 1))) //Cardinal move . = ..() else //Diagonal move, split it into cardinal moves + moving_diagonally = FIRST_DIAG_STEP if (direct & 1) if (direct & 4) if (step(src, NORTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) else if (step(src, EAST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) else if (direct & 8) if (step(src, NORTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) else if (step(src, WEST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, NORTH) else if (direct & 2) if (direct & 4) if (step(src, SOUTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, EAST) else if (step(src, EAST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) else if (direct & 8) if (step(src, SOUTH)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, WEST) else if (step(src, WEST)) + moving_diagonally = SECOND_DIAG_STEP . = step(src, SOUTH) + moving_diagonally = 0 if(!loc || (loc == oldloc && oldloc != newloc)) last_move = 0 @@ -80,10 +92,8 @@ qdel(AM) loc = null invisibility = INVISIBILITY_ABSTRACT - if (pulledby) - if (pulledby.pulling == src) - pulledby.pulling = null - pulledby = null + if(pulledby) + pulledby.stop_pulling() // Previously known as HasEntered() @@ -104,6 +114,8 @@ /atom/movable/proc/forceMove(atom/destination) if(destination) + if(pulledby) + pulledby.stop_pulling() var/atom/oldloc = loc if(oldloc) oldloc.Exited(src, destination) @@ -123,8 +135,6 @@ /mob/living/forceMove(atom/destination) stop_pulling() - if(pulledby) - pulledby.stop_pulling() if(buckled) buckled.unbuckle_mob(src,force=1) if(buckled_mobs.len) @@ -199,6 +209,9 @@ return 0 //use a modified version of Bresenham's algorithm to get from the atom's current position to that of the target + if(pulledby) + pulledby.stop_pulling() + throwing = 1 if(spin) //if we don't want the /atom/movable to spin. SpinAnimation(5, 1) diff --git a/code/game/gamemodes/changeling/powers/absorb.dm b/code/game/gamemodes/changeling/powers/absorb.dm index da36d8f6d96..57f0c27dab5 100644 --- a/code/game/gamemodes/changeling/powers/absorb.dm +++ b/code/game/gamemodes/changeling/powers/absorb.dm @@ -15,23 +15,21 @@ user << "We are already absorbing!" return - var/obj/item/weapon/grab/G = user.get_active_hand() - if(!istype(G)) - user << "We must be grabbing a creature in our active hand to absorb them!" + if(!user.pulling || !iscarbon(user.pulling)) + user << "We must be grabbing a creature to absorb them!" return - if(G.state <= GRAB_NECK) + if(user.grab_state <= GRAB_NECK) user << "We must have a tighter grip to absorb this creature!" return - var/mob/living/carbon/target = G.affecting + var/mob/living/carbon/target = user.pulling return changeling.can_absorb_dna(user,target) /obj/effect/proc_holder/changeling/absorbDNA/sting_action(mob/user) var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/human/target = G.affecting + var/mob/living/carbon/human/target = user.pulling changeling.isabsorbing = 1 for(var/stage = 1, stage<=3, stage++) switch(stage) @@ -122,11 +120,10 @@ /obj/effect/proc_holder/changeling/swap_form/can_sting(mob/living/carbon/user) if(!..()) return - var/obj/item/weapon/grab/G = user.get_active_hand() - if(!istype(G) || (G.state < GRAB_AGGRESSIVE)) - user << "We must have an aggressive grab on creature in our active hand to do this!" + if(!user.pulling || !iscarbon(user.pulling) || user.grab_state < GRAB_AGGRESSIVE) + user << "We must have an aggressive grab on creature to do this!" return - var/mob/living/carbon/target = G.affecting + var/mob/living/carbon/target = user.pulling if((target.disabilities & NOCLONE) || (target.disabilities & HUSK)) user << "DNA of [target] is ruined beyond usability!" return @@ -137,8 +134,7 @@ /obj/effect/proc_holder/changeling/swap_form/sting_action(mob/living/carbon/user) - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/target = G.affecting + var/mob/living/carbon/target = user.pulling var/datum/changeling/changeling = user.mind.changeling user << "We tighen our grip. We must hold still...." diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 748b9f8a3e7..9f61521660c 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -27,7 +27,7 @@ var/hsboxspawn = 1 var/hsbinfo = null //items that shouldn't spawn on the floor because they would bug or act weird var/global/list/spawn_forbidden = list( - /obj/item/weapon/grab, /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you + /obj/item/tk_grab, /obj/item/weapon/implant, // not implanter, the actual thing that is inside you /obj/item/assembly,/obj/item/device/onetankbomb, /obj/item/radio, /obj/item/device/pda/ai, /obj/item/device/uplink, /obj/item/smallDelivery, /obj/item/missile,/obj/item/projectile, /obj/item/borg/sight,/obj/item/borg/stun,/obj/item/weapon/robot_module) diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 45f7b995486..3fee54bb4e0 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -152,19 +152,6 @@ if(default_deconstruction_crowbar(I)) return - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!ismob(G.affecting)) - return - - if(!state_open) - user << "Open the scanner first." - return - - var/mob/M = G.affecting - M.forceMove(loc) - qdel(G) - return return ..() /obj/machinery/dna_scannernew/attack_hand(mob/user) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index eb062334719..f43d5b07698 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -192,14 +192,6 @@ if(default_deconstruction_screwdriver(user, null, null, W)) update_icon() return - else if(istype(W,/obj/item/weapon/grab)) - if(state_open) - var/obj/item/weapon/grab/G = W - if(iscorgi(G.affecting)) - has_corgi = 1 - G.affecting.loc = src - qdel(G) - update_icon() else if(user.a_intent != "harm") @@ -232,6 +224,17 @@ user << "[src] is busy." return + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(L.buckled || L.buckled_mobs.len) + return + if(state_open) + if(iscorgi(L)) + has_corgi = 1 + L.forceMove(src) + update_icon() + return + if(!state_open) open_machine() else diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7c61b5d152f..2839bb1250b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -409,7 +409,7 @@ obj/item/proc/item_action_slot_check(slot, mob/user) set category = "Object" set name = "Pick up" - if(usr.stat || usr.restrained() || !Adjacent(usr) || usr.stunned || usr.weakened || usr.lying) + if(usr.incapacitated() || !Adjacent(usr) || usr.lying) return if(usr.get_active_hand() == null) // Let me know if this has any problems -Yota diff --git a/code/game/objects/items/weapons/implants/implantchair.dm b/code/game/objects/items/weapons/implants/implantchair.dm index 29c3e7af930..fd681c0138e 100644 --- a/code/game/objects/items/weapons/implants/implantchair.dm +++ b/code/game/objects/items/weapons/implants/implantchair.dm @@ -69,24 +69,7 @@ add_implants() ready = 1 - src.updateUsrDialog() - return - - -/obj/machinery/implantchair/attackby(obj/item/weapon/W, mob/user, params) - if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - if(!ismob(G.affecting)) - return - var/mob/M = G.affecting - if(M.buckled_mobs.len) - user << "[M] will not fit into [src] because they have a creature on them!" - return - if(put_mob(M)) - qdel(G) - updateUsrDialog() - else - return ..() + updateUsrDialog() /obj/machinery/implantchair/go_out(mob/M) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index d855441b3ec..adc80abdcc5 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -85,7 +85,7 @@ qdel(src) singulo.process() return - ..() + . = ..() /obj/item/weapon/storage/backpack/holding/proc/failcheck(mob/user) if (prob(src.reliability)) return 1 //No failure diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 876a2816209..af415d016c8 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -198,6 +198,8 @@ if(!S.amount) qdel(S) else + if(S.pulledby) + S.pulledby.stop_pulling() S.loc = src orient2hud(usr) @@ -342,7 +344,7 @@ /obj/item/weapon/storage/bag/tray/handle_item_insertion(obj/item/I, prevent_warning = 0) overlays += image("icon" = I.icon, "icon_state" = I.icon_state, "layer" = -1) - ..() + . = ..() /* diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 88b479e8591..e09e732ddcf 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -301,6 +301,8 @@ return 0 if(silent) prevent_warning = 1 + if(W.pulledby) + W.pulledby.stop_pulling() W.loc = src W.on_enter_storage(src) if(usr) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index d3b45dcf87b..cc861ffaeb6 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -51,7 +51,7 @@ combined_access |= I.access /obj/item/weapon/storage/wallet/handle_item_insertion(obj/item/W, prevent_warning = 0) - . = ..(W, prevent_warning) + . = ..() if(.) if(istype(W, /obj/item/weapon/card/id)) refreshID() diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index fb32d2d03ba..998a6820328 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -50,38 +50,37 @@ qdel(src) else user << "You can't do that while something's on the spike!" - - else if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(istype(G.affecting, /mob/living/)) - if(!buckled_mobs.len) - if(do_mob(user, src, 120)) - if(buckled_mobs.len) //to prevent spam/queing up attacks - return - if(G.affecting.buckled) - return - var/mob/living/H = G.affecting - playsound(src.loc, "sound/effects/splat.ogg", 25, 1) - H.visible_message("[user] slams [G.affecting] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") - H.loc = src.loc - H.emote("scream") - if(istype(H, /mob/living/carbon/human)) //So you don't get human blood when you spike a giant spidere - var/turf/pos = get_turf(H) - pos.add_blood_floor(H) - H.adjustBruteLoss(30) - H.buckled = src - H.dir = 2 - buckle_mob(H, force=1) - var/matrix/m180 = matrix(H.transform) - m180.Turn(180) - animate(H, transform = m180, time = 3) - H.pixel_y = H.get_standard_pixel_y_offset(180) - qdel(G) - return - user << "You can't use that on the spike!" else return ..() +/obj/structure/kitchenspike/attack_hand(mob/user) + if(user.pulling && isliving(user.pulling) && user.a_intent == "grab" && !buckled_mobs.len) + var/mob/living/L = user.pulling + if(do_mob(user, src, 120)) + if(buckled_mobs.len) //to prevent spam/queing up attacks + return + if(L.buckled) + return + playsound(src.loc, "sound/effects/splat.ogg", 25, 1) + L.visible_message("[user] slams [L] onto the meat spike!", "[user] slams you onto the meat spike!", "You hear a squishy wet noise.") + L.loc = src.loc + L.emote("scream") + if(ishuman(L)) //So you don't get human blood when you spike a giant spider + var/turf/pos = get_turf(L) + pos.add_blood_floor(L) + L.adjustBruteLoss(30) + L.buckled = src + L.dir = 2 + buckle_mob(L, force=1) + var/matrix/m180 = matrix(L.transform) + m180.Turn(180) + animate(L, transform = m180, time = 3) + L.pixel_y = L.get_standard_pixel_y_offset(180) + else + ..() + + + /obj/structure/kitchenspike/user_buckle_mob(mob/living/M, mob/living/user) //Don't want them getting put on the rack other than by spiking return diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 199c3ddae49..e3f6df6107c 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -97,6 +97,19 @@ take_damage(rand(180,280), BRUTE, 0) return 1 +/obj/structure/table/attack_hand(mob/living/user) + if(user.a_intent == "grab" && user.pulling && isliving(user.pulling)) + var/mob/living/pushed_mob = user.pulling + if(pushed_mob.buckled) + user << "[pushed_mob] is buckled to [pushed_mob.buckled]!" + return + if(user.grab_state < GRAB_AGGRESSIVE) + user << "You need a better grip to do that!" + return + tablepush(user, pushed_mob) + user.stop_pulling() + else + ..() /obj/structure/table/attack_tk() // no telehulk sorry return @@ -123,39 +136,15 @@ var/atom/movable/mover = caller . = . || mover.checkpass(PASSTABLE) -/obj/structure/table/proc/tablepush(obj/item/I, mob/user) - if(get_dist(src, user) < 2) - var/obj/item/weapon/grab/G = I - if(G.affecting.buckled) - user << "[G.affecting] is buckled to [G.affecting.buckled]!" - return 0 - if(G.state < GRAB_AGGRESSIVE) - user << "You need a better grip to do that!" - return 0 - if(!G.confirm()) - return 0 - G.affecting.loc = src.loc - if(istype(src, /obj/structure/table/optable)) - var/obj/structure/table/optable/OT = src - G.affecting.resting = 1 - G.affecting.update_canmove() - visible_message("[G.assailant] has laid [G.affecting] on [src].") - OT.patient = G.affecting - OT.check_patient() - qdel(I) - return 1 - G.affecting.Weaken(2) - G.affecting.visible_message("[G.assailant] pushes [G.affecting] onto [src].", \ - "[G.assailant] pushes [G.affecting] onto [src].") - add_logs(G.assailant, G.affecting, "pushed") - qdel(I) - return 1 - qdel(I) +/obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) + pushed_mob.loc = src.loc + pushed_mob.Weaken(2) + pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ + "[user] pushes [pushed_mob] onto [src].") + add_logs(user, pushed_mob, "pushed") + /obj/structure/table/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/grab)) - tablepush(I, user) - return if(!(flags & NODECONSTRUCT)) if(istype(I, /obj/item/weapon/screwdriver) && deconstruction_ready) table_deconstruct(user, 1) @@ -375,6 +364,13 @@ computer.table = src break +/obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) + pushed_mob.loc = src.loc + pushed_mob.resting = 1 + pushed_mob.update_canmove() + visible_message("[user] has laid [pushed_mob] on [src].") + check_patient() + /obj/structure/table/optable/proc/check_patient() var/mob/M = locate(/mob/living/carbon/human, loc) if(M) diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index e4bbee8dcf7..0f4e8e3f431 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -60,41 +60,44 @@ /obj/structure/transit_tube/station/attack_hand(mob/user) if(!pod_moving) - for(var/obj/structure/transit_tube_pod/pod in loc) - if(!pod.moving && pod.dir in directions()) - if(icon_state == "closed") - open_animation() + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + if(icon_state == "open") + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.buckled || GM.buckled_mobs.len) + user << "[GM] is attached to something!" + return + for(var/obj/structure/transit_tube_pod/pod in loc) + pod.visible_message("[user] starts putting [GM] into the [pod]!") + if(do_after(user, 15, target = src)) + if(GM && user.grab_state >= GRAB_AGGRESSIVE && user.pulling == GM && !GM.buckled && !GM.buckled_mobs.len) + GM.Weaken(5) + src.Bumped(GM) + break + else + for(var/obj/structure/transit_tube_pod/pod in loc) + if(!pod.moving && pod.dir in directions()) + if(icon_state == "closed") + open_animation() - else if(icon_state == "open") - if(pod.contents.len && user.loc != pod) - user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") - if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail - if(pod.loc == loc) - for(var/atom/movable/AM in pod) - AM.loc = get_turf(user) - if(ismob(AM)) - var/mob/M = AM - M.Weaken(5) + else if(icon_state == "open") + if(pod.contents.len && user.loc != pod) + user.visible_message("[user] starts emptying [pod]'s contents onto the floor.", "You start emptying [pod]'s contents onto the floor...") + if(do_after(user, 10, target = src)) //So it doesn't default to close_animation() on fail + if(pod.loc == loc) + for(var/atom/movable/AM in pod) + AM.loc = get_turf(user) + if(ismob(AM)) + var/mob/M = AM + M.Weaken(5) - else - close_animation() - break + else + close_animation() + break /obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/weapon/grab)) - if(icon_state == "open") - var/obj/item/weapon/grab/G = W - if(ismob(G.affecting) && G.state >= GRAB_AGGRESSIVE) - var/mob/GM = G.affecting - for(var/obj/structure/transit_tube_pod/pod in loc) - pod.visible_message("[user] starts putting [GM] into the [pod]!") - if(do_after(user, 15, target = src) && GM && G && G.affecting == GM) - GM.Weaken(5) - src.Bumped(GM) - qdel(G) - break - else if(istype(W, /obj/item/weapon/crowbar)) + if(istype(W, /obj/item/weapon/crowbar)) for(var/obj/structure/transit_tube_pod/pod in loc) if(pod.contents) user << "Empty the pod first!" diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 509263147b8..6b58d058251 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -22,12 +22,37 @@ playsound(src.loc, "swing_hit", 25, 1) swirlie.visible_message("[user] slams the toilet seat onto [swirlie]'s head!", "[user] slams the toilet seat onto your head!", "You hear reverberating porcelain.") swirlie.adjustBruteLoss(5) - return - if(cistern && !open) + else if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + user.changeNext_move(CLICK_CD_MELEE) + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM] needs to be on [src]!" + return + if(!swirlie) + if(open) + GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") + swirlie = GM + if(do_after(user, 30, 0, target = src)) + GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") + if(iscarbon(GM)) + var/mob/living/carbon/C = GM + if(!C.internal) + C.adjustOxyLoss(5) + else + GM.adjustOxyLoss(5) + swirlie = null + else + playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) + GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams you into [src]!") + GM.adjustBruteLoss(5) + else + user << "You need a tighter grip!" + + else if(cistern && !open) if(!contents.len) user << "The cistern is empty." - return else var/obj/item/I = pick(contents) if(ishuman(user)) @@ -36,10 +61,9 @@ I.loc = get_turf(src) user << "You find [I] in the cistern." w_items -= I.w_class - return - - open = !open - update_icon() + else + open = !open + update_icon() /obj/structure/toilet/update_icon() @@ -54,7 +78,6 @@ user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.") cistern = !cistern update_icon() - return else if(cistern) if(user.a_intent != "harm") @@ -70,7 +93,6 @@ I.loc = src w_items += I.w_class user << "You carefully place [I] into the cistern." - return else if(istype(I, /obj/item/weapon/reagent_containers)) if (!open) @@ -78,39 +100,6 @@ var/obj/item/weapon/reagent_containers/RG = I RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) user << "You fill [RG] from [src]. Gross." - return - - else if(istype(I, /obj/item/weapon/grab)) - user.changeNext_move(CLICK_CD_MELEE) - var/obj/item/weapon/grab/G = I - if(!G.confirm()) - return - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting - if(G.state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - user << "[GM] needs to be on [src]!" - return - if(!swirlie) - if(open) - GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") - swirlie = GM - if(do_after(user, 30, 0, target = src)) - GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") - if(iscarbon(GM)) - var/mob/living/carbon/C = GM - if(!C.internal) - C.adjustOxyLoss(5) - else - GM.adjustOxyLoss(5) - swirlie = null - else - playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) - GM.visible_message("[user] slams [GM.name] into [src]!", "[user] slams you into [src]!") - GM.adjustBruteLoss(5) - else - user << "You need a tighter grip!" - else return ..() @@ -125,24 +114,20 @@ anchored = 1 -/obj/structure/urinal/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!G.confirm()) - return - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting - if(G.state >= GRAB_AGGRESSIVE) - if(GM.loc != get_turf(src)) - user << "[GM.name] needs to be on [src]." - return - user.changeNext_move(CLICK_CD_MELEE) - user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") - GM.adjustBruteLoss(8) - else - user << "You need a tighter grip!" +/obj/structure/urinal/attack_hand(mob/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/GM = user.pulling + if(user.grab_state >= GRAB_AGGRESSIVE) + if(GM.loc != get_turf(src)) + user << "[GM.name] needs to be on [src]." + return + user.changeNext_move(CLICK_CD_MELEE) + user.visible_message("[user] slams [GM] into [src]!", "You slam [GM] into [src]!") + GM.adjustBruteLoss(8) + else + user << "You need a tighter grip!" else - return ..() + ..() /obj/machinery/shower name = "shower" diff --git a/code/modules/food&drinks/kitchen machinery/gibber.dm b/code/modules/food&drinks/kitchen machinery/gibber.dm index 93e3d1799fd..a0e234b94d7 100644 --- a/code/modules/food&drinks/kitchen machinery/gibber.dm +++ b/code/modules/food&drinks/kitchen machinery/gibber.dm @@ -95,16 +95,13 @@ if(operating) user << "It's locked and running." return - else - src.startgibbing(user) -/obj/machinery/gibber/attackby(obj/item/P, mob/user, params) - if(istype(P, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = P - if(!iscarbon(G.affecting)) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(!iscarbon(L)) user << "This item is not suitable for the gibber!" return - var/mob/living/carbon/C = G.affecting + var/mob/living/carbon/C = L if(C.buckled ||C.buckled_mobs.len) user << "[C] is attached to something!" return @@ -112,17 +109,19 @@ user << "Subject may not have abiotic items on." return - user.visible_message("[user] starts to put [G.affecting] into the gibber!") + user.visible_message("[user] starts to put [C] into the gibber!") src.add_fingerprint(user) - if(do_after(user, gibtime, target = src) && G && G.affecting && G.affecting == C && !C.buckled && !C.buckled_mobs.len && !occupant) - user.visible_message("[user] stuffs [G.affecting] into the gibber!") - C.reset_perspective(src) - C.loc = src - occupant = C - qdel(G) - update_icon() + if(do_after(user, gibtime, target = src)) + if(C && user.pulling == C && !C.buckled && !C.buckled_mobs.len && !occupant) + user.visible_message("[user] stuffs [C] into the gibber!") + C.forceMove(src) + occupant = C + update_icon() + else + startgibbing(user) - else if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) +/obj/machinery/gibber/attackby(obj/item/P, mob/user, params) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) return else if(exchange_parts(user, P)) diff --git a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm index a446c16d444..a464c31d2cc 100644 --- a/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm +++ b/code/modules/food&drinks/kitchen machinery/monkeyrecycler.dm @@ -57,18 +57,6 @@ if(stat) //NOPOWER etc return - if(istype(O, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = O - if(!user.Adjacent(G.affecting)) - return - var/grabbed = G.affecting - if(ismonkey(grabbed)) - var/mob/living/carbon/monkey/target = grabbed - stuff_monkey_in(target, user) - user.drop_item() - return - else - user << "The machine only accepts monkeys!" else return ..() diff --git a/code/modules/food&drinks/kitchen machinery/processor.dm b/code/modules/food&drinks/kitchen machinery/processor.dm index f0c41e5f082..797baa35247 100644 --- a/code/modules/food&drinks/kitchen machinery/processor.dm +++ b/code/modules/food&drinks/kitchen machinery/processor.dm @@ -182,22 +182,12 @@ if(default_deconstruction_crowbar(O)) return - var/atom/movable/what = O - if(istype(O, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = O - if(!user.Adjacent(G.affecting)) - return - if(G.affecting.buckled || G.affecting.buckled_mobs.len) - user << "[G.affecting] is attached to somthing!" - return - what = G.affecting - - var/datum/food_processor_process/P = select_recipe(what) + var/datum/food_processor_process/P = select_recipe(O) if(P) - user.visible_message("[user] put [what] into [src].", \ - "You put the [what] into [src].") + user.visible_message("[user] put [O] into [src].", \ + "You put the [O] into [src].") user.drop_item() - what.loc = src + O.loc = src return 1 else if(user.a_intent != "harm") diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm index d233ea1362c..baf31192aa7 100644 --- a/code/modules/holiday/easter.dm +++ b/code/modules/holiday/easter.dm @@ -81,7 +81,7 @@ countEggs() /obj/item/weapon/storage/bag/easterbasket/handle_item_insertion(obj/item/I, prevent_warning = 0) - ..() + . = ..() countEggs() //Bunny Suit diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index dc710200724..18e378d9e5a 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -82,7 +82,7 @@ M.apply_damage(10, STAMINA) if(prob(5)) M.Weaken(3) - visible_message("[M] is knocked right off \his feet!", 3) + visible_message("[M] is knocked right off \his feet!") // // Structures @@ -97,20 +97,22 @@ density = 1 /obj/structure/holohoop/attackby(obj/item/weapon/W as obj, mob/user as mob, params) - if (istype(W, /obj/item/weapon/grab) && get_dist(src,user)<2) - var/obj/item/weapon/grab/G = W - if(G.state < GRAB_AGGRESSIVE) + if(get_dist(src,user)<2) + if(user.drop_item(src)) + visible_message(" [user] dunks [W] into \the [src]!") + +/obj/structure/holohoop/attack_hand(mob/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(user.grab_state < GRAB_AGGRESSIVE) user << "You need a better grip to do that!" return - G.affecting.loc = src.loc - G.affecting.Weaken(5) - visible_message("[G.assailant] dunks [G.affecting] into \the [src]!", 3) - qdel(W) - return - else if (istype(W, /obj/item) && get_dist(src,user)<2) - user.drop_item(src) - visible_message(" [user] dunks [W] into \the [src]!", 3) - return + L.loc = src.loc + L.Weaken(5) + visible_message("[user] dunks [L] into \the [src]!") + user.stop_pulling() + else + ..() /obj/structure/holohoop/CanPass(atom/movable/mover, turf/target, height=0) if (istype(mover,/obj/item) && mover.throwing) @@ -119,12 +121,12 @@ return if(prob(50)) I.loc = src.loc - visible_message(" Swish! \the [I] lands in \the [src].", 3) + visible_message(" Swish! \the [I] lands in \the [src].") else - visible_message(" \the [I] bounces off of \the [src]'s rim!", 3) + visible_message(" \the [I] bounces off of \the [src]'s rim!") return 0 else - return ..(mover, target, height) + return ..() diff --git a/code/modules/mob/interactive.dm b/code/modules/mob/interactive.dm index 6301af936fa..8c1c8ea5149 100644 --- a/code/modules/mob/interactive.dm +++ b/code/modules/mob/interactive.dm @@ -581,12 +581,11 @@ update_icons() update_hands = 0 - if(grabbed_by.len > 0) - for(var/obj/item/weapon/grab/G in grabbed_by) - if(Adjacent(G)) - a_intent = "disarm" - G.assailant.attack_hand(src) - inactivity_period = 10 + if(pulledby) + if(Adjacent(pulledby)) + a_intent = "disarm" + pulledby.attack_hand(src) + inactivity_period = 10 if(buckled) resist() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3a8e0dcaaa6..690124ac2e3 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -31,8 +31,8 @@ l_hand = W W.layer = 20 //TODO: move to equipped? W.equipped(src,slot_l_hand) - if(pulling == W) - stop_pulling() + if(W.pulledby) + W.pulledby.stop_pulling() update_inv_l_hand() W.pixel_x = initial(W.pixel_x) W.pixel_y = initial(W.pixel_y) @@ -49,8 +49,8 @@ r_hand = W W.layer = 20 W.equipped(src,slot_r_hand) - if(pulling == W) - stop_pulling() + if(W.pulledby) + W.pulledby.stop_pulling() update_inv_r_hand() W.pixel_x = initial(W.pixel_x) W.pixel_y = initial(W.pixel_y) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 6dd329ceeb8..f2521cecaaf 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -83,10 +83,8 @@ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to disarm [src]!") -/mob/living/carbon/alien/humanoid/restrained() - if (handcuffed) - return 1 - return 0 +/mob/living/carbon/alien/humanoid/restrained(ignore_grab) + . = handcuffed /mob/living/carbon/alien/humanoid/show_inv(mob/user) @@ -127,6 +125,12 @@ playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free ..(I, cuff_break = 1) +/mob/living/carbon/alien/humanoid/resist_grab(moving_resist) + if(pulledby.grab_state) + visible_message("[src] has broken free of [pulledby]'s grip!") + pulledby.stop_pulling() + . = 0 + /mob/living/carbon/alien/humanoid/get_standard_pixel_y_offset(lying = 0) if(leaping) return -32 @@ -172,4 +176,10 @@ proc/alien_type_present(var/alienpath) /mob/living/carbon/alien/humanoid/check_breath(datum/gas_mixture/breath) if(breath && breath.total_moles() > 0 && !sneaking) playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, 0, -5) - ..() \ No newline at end of file + ..() + +/mob/living/carbon/alien/humanoid/grabbedby(mob/living/carbon/user, supress_message = 0) + if(user == src && pulling && grab_state >= GRAB_AGGRESSIVE && !pulling.anchored && iscarbon(pulling)) + devour_mob(pulling, devour_time = 60) + else + ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index be000619379..46d5bab8fc3 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -70,8 +70,8 @@ return -/mob/living/carbon/alien/larva/restrained() - return 0 +/mob/living/carbon/alien/larva/restrained(ignore_grab) + . = 0 // new damage icon system // now constructs damage icon for each organ from mask * damage field diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 1cfbae231cc..aca51f6cb36 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -8,6 +8,7 @@ return 0 var/toxins_used = 0 + var/tox_detect_threshold = 0.02 var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME var/list/breath_gases = breath.gases @@ -16,7 +17,7 @@ //Partial pressure of the toxins in our breath var/Toxins_pp = (breath_gases["plasma"][MOLES]/breath.total_moles())*breath_pressure - if(Toxins_pp) // Detect toxins in air + if(Toxins_pp > tox_detect_threshold) // Detect toxins in air adjustPlasma(breath_gases["plasma"][MOLES]*250) throw_alert("alien_tox", /obj/screen/alert/alien_tox) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e81fec5df86..cbd45ab3bea 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -208,47 +208,38 @@ throw_mode_off() if(!target || !isturf(loc)) return - if(istype(target, /obj/screen)) return - - var/atom/movable/item = src.get_active_hand() - - if(!item || (item.flags & (NODROP|ABSTRACT))) + if(istype(target, /obj/screen)) return - if(istype(item, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = item - item = G.get_mob_if_throwable() //throw the person instead of the grab - qdel(G) //We delete the grab, as it needs to stay around until it's returned. - if(ismob(item)) - var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors - var/turf/end_T = get_turf(target) - if(start_T && end_T) - var/mob/M = item - var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" - var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" + var/atom/movable/thrown_thing + var/obj/item/I = src.get_active_hand() - add_logs(src, M, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") + if(!I) + if(pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) + var/mob/living/throwable_mob = pulling + if(!throwable_mob.buckled) + thrown_thing = throwable_mob + stop_pulling() + var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors + var/turf/end_T = get_turf(target) + if(start_T && end_T) + var/start_T_descriptor = "tile at [start_T.x], [start_T.y], [start_T.z] in area [get_area(start_T)]" + var/end_T_descriptor = "tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]" + add_logs(src, throwable_mob, "thrown", addition="from [start_T_descriptor] with the target [end_T_descriptor]") - if(!item) return //Grab processing has a chance of returning null - - if(!ismob(item)) //Honk mobs don't have a dropped() proc honk - unEquip(item) - if(src.client) - src.client.screen -= item - - //actually throw it! - if(item) - item.layer = initial(item.layer) - src.visible_message("[src] has thrown [item].") + else if(!(I.flags & (NODROP|ABSTRACT))) + thrown_thing = I + unEquip(I) + if(thrown_thing) + visible_message("[src] has thrown [thrown_thing].") newtonian_move(get_dir(target, src)) + thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) - item.throw_at(target, item.throw_range, item.throw_speed, src) -/mob/living/carbon/restrained() - if (handcuffed) - return 1 - return +/mob/living/carbon/restrained(ignore_grab) + . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) + /mob/living/carbon/proc/canBeHandcuffed() return 0 diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index bde5baef416..56d75b56517 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -94,3 +94,15 @@ adjustFireLoss(M.powerlevel * rand(6,10)) updatehealth() return 1 + +/mob/living/carbon/proc/devour_mob(mob/living/carbon/C, devour_time = 130) + C.visible_message("[src] is attempting to devour [C]!", \ + "[src] is attempting to devour you!") + if(!do_mob(src, C, devour_time)) + return + if(pulling && pulling == C && grab_state >= GRAB_AGGRESSIVE && a_intent == "grab") + C.visible_message("[src] devours [C]!", \ + "[src] devours you!") + C.forceMove(src) + stomach_contents.Add(C) + add_logs(src, C, "devoured") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 2e77a20baa8..5fdfa802698 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -1,5 +1,6 @@ /mob/living/carbon/movement_delay() . = ..() + . += grab_state * 3 if(legcuffed) . += legcuffed.slowdown diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 21f8bdb6cb4..6842d856b03 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -46,6 +46,9 @@ if(fire_stacks < 0) msg += "It's soaked in water.\n" + if(pulledby && pulledby.grab_state) + msg += "It's restrained by [pulledby]'s grip.\n" + if(stat == UNCONSCIOUS) msg += "It isn't responding to anything around it; it seems to be asleep.\n" msg += "" diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index df0e5344f19..80e5574df34 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -236,6 +236,9 @@ msg += "[t_He] looks a little soaked.\n" + if(pulledby && pulledby.grab_state) + msg += "[t_He] [t_is] restrained by [pulledby]'s grip.\n" + if(nutrition < NUTRITION_LEVEL_STARVING - 50) msg += "[t_He] [t_is] severely malnourished.\n" else if(nutrition >= NUTRITION_LEVEL_FAT) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7eab6c1d4f0..84381f3d17b 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -264,11 +264,6 @@ I.acid_act(acidpwr, acid_volume_left) acid_volume_left = max(acid_volume_left - acid_decay, 0) -/mob/living/carbon/human/grabbedby(mob/living/user) - if(w_uniform) - w_uniform.add_fingerprint(user) - ..() - /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) if(..()) @@ -369,3 +364,14 @@ skipcatch = 1 //can't catch the now embedded item return ..() + +/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) + if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (disabilities & FAT) && ismonkey(pulling)) + devour_mob(pulling) + else + ..() + +/mob/living/carbon/human/grippedby(mob/living/user) + if(w_uniform) + w_uniform.add_fingerprint(user) + ..() diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 642f86d9903..6631cdaadb7 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -1,10 +1,7 @@ -/mob/living/carbon/human/restrained() - if (handcuffed) - return 1 - if (wear_suit && wear_suit.breakouttime) - return 1 - return 0 +/mob/living/carbon/human/restrained(ignore_grab) + . = ((wear_suit && wear_suit.breakouttime) || ..()) + /mob/living/carbon/human/canBeHandcuffed() return 1 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 3e0ad9b5b3c..870f2cf032c 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -89,6 +89,7 @@ if(I.flags_inv & HIDEJUMPSUIT) update_inv_w_uniform() if(wear_suit.breakouttime) //when equipping a straightjacket + stop_pulling() //can't pull if restrained update_action_buttons_icon() //certain action buttons will no longer be usable. update_inv_wear_suit() if(slot_w_uniform) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index ec8ae177cfa..10a3a861a7c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -974,22 +974,6 @@ H.visible_message("[M] has broken [H]'s grip on [H.pulling]!") talked = 1 H.stop_pulling() - - //BubbleWrap: Disarming also breaks a grab - this will also stop someone being choked, won't it? - if(istype(H.l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/lgrab = H.l_hand - if(lgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [lgrab.affecting]!") - talked = 1 - spawn(1) - qdel(lgrab) - if(istype(H.r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/rgrab = H.r_hand - if(rgrab.affecting) - H.visible_message("[M] has broken [H]'s grip on [rgrab.affecting]!") - talked = 1 - spawn(1) - qdel(rgrab) //End BubbleWrap if(!talked) //BubbleWrap diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 00efe469b81..8ac3bfc3d66 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -29,6 +29,9 @@ else if(I == r_hand) r_hand = null + if(I.pulledby) + I.pulledby.stop_pulling() + I.screen_loc = null // will get moved if inventory is visible I.loc = src I.equipped(src, slot) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 4084b11b26e..587977a4715 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -17,14 +17,6 @@ for(var/obj/item/organ/O in internal_organs) O.on_life() - //grab processing - if(istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = l_hand - G.process() - if(istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = r_hand - G.process() - //Updates the number of stored chemicals for powers handle_changeling() @@ -54,7 +46,7 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit) + if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL)) losebreath++ //Suffocate diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index cdc9b8350c5..f3e208b6e95 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -13,7 +13,7 @@ ..() if(!client && stat == CONSCIOUS) - if(prob(33) && canmove && isturf(loc) && !pulledby && !grabbed_by.len) + if(prob(33) && canmove && isturf(loc) && !pulledby) step(src, pick(cardinal)) if(prob(1)) emote(pick("scratch","jump","roll","tail")) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a04bb808579..be0c8d59bc5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -105,7 +105,7 @@ Sorry Giacom. Please don't be mad :( //Should stop you pushing a restrained person out of the way if(isliving(M)) var/mob/living/L = M - if((L.pulledby && L.restrained()) || L.grabbed_by.len) + if(L.pulledby && L.pulledby != src && L.restrained()) if(!(world.time % 5)) src << "[L] is restrained, you cannot push past." return 1 @@ -118,32 +118,42 @@ Sorry Giacom. Please don't be mad :( src << "[L] is restraining [P], you cannot push past." return 1 - //switch our position with M - //BubbleWrap: people in handcuffs are always switched around as if they were on 'help' intent to prevent a person being pulled from being seperated from their puller - if((M.a_intent == "help" || M.restrained()) && (a_intent == "help" || restrained()) && M.canmove && canmove && !M.buckled && !M.buckled_mobs.len) // mutual brohugs all around! - if(loc && !loc.Adjacent(M.loc)) - return 1 - now_pushing = 1 - var/oldloc = loc - var/oldMloc = M.loc - - - var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap. - var/src_passmob = (pass_flags & PASSMOB) - M.pass_flags |= PASSMOB - pass_flags |= PASSMOB - - M.Move(oldloc) - Move(oldMloc) - - if(!src_passmob) - pass_flags &= ~PASSMOB - if(!M_passmob) - M.pass_flags &= ~PASSMOB - - now_pushing = 0 + if(moving_diagonally)//no mob swap during diagonal moves. return 1 + if(!M.buckled && !M.buckled_mobs.len) + var/mob_swap + //the puller can always swap with its victim if on grab intent + if(M.pulledby == src && a_intent == "grab") + mob_swap = 1 + //restrained people act if they were on 'help' intent to prevent a person being pulled from being seperated from their puller + else if((M.restrained() || M.a_intent == "help") && (restrained() || a_intent == "help")) + mob_swap = 1 + if(mob_swap) + //switch our position with M + if(loc && !loc.Adjacent(M.loc)) + return 1 + now_pushing = 1 + var/oldloc = loc + var/oldMloc = M.loc + + + var/M_passmob = (M.pass_flags & PASSMOB) // we give PASSMOB to both mobs to avoid bumping other mobs during swap. + var/src_passmob = (pass_flags & PASSMOB) + M.pass_flags |= PASSMOB + pass_flags |= PASSMOB + + M.Move(oldloc) + Move(oldMloc) + + if(!src_passmob) + pass_flags &= ~PASSMOB + if(!M_passmob) + M.pass_flags &= ~PASSMOB + + now_pushing = 0 + return 1 + //okay, so we didn't switch. but should we push? //not if he's not CANPUSH of course if(!(M.status_flags & CANPUSH)) @@ -162,6 +172,8 @@ Sorry Giacom. Please don't be mad :( /mob/living/proc/PushAM(atom/movable/AM) if(now_pushing) return 1 + if(moving_diagonally)// no pushing during diagonal moves. + return 1 if(!client && (mob_size < MOB_SIZE_SMALL)) return if(!AM.anchored) @@ -191,7 +203,7 @@ Sorry Giacom. Please don't be mad :( //same as above /mob/living/pointed(atom/A as mob|obj|turf in view()) - if(src.stat || !src.canmove || src.restrained()) + if(incapacitated()) return 0 if(src.status_flags & FAKEDEATH) return 0 @@ -546,67 +558,29 @@ Sorry Giacom. Please don't be mad :( else return 0 - if (restrained()) + var/atom/movable/pullee = pulling + if(pullee && get_dist(src, pullee) > 1) stop_pulling() - - - var/cuff_dragged = 0 - if (restrained()) - for(var/mob/living/M in range(1, src)) - if (M.pulling == src && !M.incapacitated()) - cuff_dragged = 1 - if (!cuff_dragged && pulling && !throwing && (get_dist(src, pulling) <= 1 || pulling.loc == loc)) - var/turf/T = loc - . = ..() - - if (pulling && pulling.loc) - if(!isturf(pulling.loc)) - stop_pulling() - return - else - if(Debug) - diary <<"pulling disappeared? at [__LINE__] in mob.dm - pulling = [pulling]" - diary <<"REPORT THIS" - - ///// - if(pulling && pulling.anchored) + var/turf/T = loc + . = ..() + if(. && pulling && pulling == pullee) //we were pulling a thing and didn't lose it during our move. + if(pulling.anchored) stop_pulling() return - if (!restrained()) - var/diag = get_dir(src, pulling) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(src, pulling) > 1 || diag)) - if (isliving(pulling)) - var/mob/living/M = pulling - var/pull_ok = 1 - if (M.grabbed_by.len) - if (prob(75)) - var/obj/item/weapon/grab/G = pick(M.grabbed_by) - visible_message("[src] has pulled [G.affecting] from [G.assailant]'s grip.") - qdel(G) - else - pull_ok = 0 - if (M.grabbed_by.len) - pull_ok = 0 - if (pull_ok) - var/atom/movable/t = M.pulling - M.stop_pulling() + var/pull_dir = get_dir(src, pulling) + if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) //puller and pullee more than one tile away or in diagonal position + if(isliving(pulling)) + var/mob/living/M = pulling + if(M.lying && !M.buckled && (prob(M.getBruteLoss() / 2))) + makeTrail(T, M) + pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position + if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up + stop_pulling() + + if(pulledby && moving_diagonally != FIRST_DIAG_STEP && get_dist(src, pulledby) > 1)//separated from our puller and not in the middle of a diagonal move. + pulledby.stop_pulling() - //this is the gay blood on floor shit -- Added back -- Skie - if(M.lying && !M.buckled && (prob(M.getBruteLoss() / 2))) - makeTrail(T, M) - pulling.Move(T, get_dir(pulling, T)) - if(M) - M.start_pulling(t) - else - if (pulling) - pulling.Move(T, get_dir(pulling, T)) - else - stop_pulling() - . = ..() if (s_active && !(s_active in contents) && !(s_active.loc in contents)) // It's ugly. But everything related to inventory/storage is. -- c0 s_active.close(src) @@ -662,34 +636,15 @@ Sorry Giacom. Please don't be mad :( set name = "Resist" set category = "IC" - if(!isliving(src) || next_move > world.time || stat || weakened || stunned || paralysis) + if(!isliving(src) || next_move > world.time || incapacitated(ignore_restraints = 1)) return changeNext_move(CLICK_CD_RESIST) //resisting grabs (as if it helps anyone...) - if(!restrained()) - var/resisting = 0 - for(var/obj/O in requests) - qdel(O) - resisting++ - for(var/X in grabbed_by) - var/obj/item/weapon/grab/G = X - resisting++ - if(G.state == GRAB_PASSIVE) - qdel(G) - else - if(G.state == GRAB_AGGRESSIVE) - if(prob(25)) - visible_message("[src] has broken free of [G.assailant]'s grip!") - qdel(G) - else - if(G.state == GRAB_NECK) - if(prob(5)) - visible_message("[src] has broken free of [G.assailant]'s headlock!") - qdel(G) - if(resisting) - visible_message("[src] resists!") - return + if(!restrained(ignore_grab = 1) && pulledby) + visible_message("[src] resists against [pulledby]'s grip!") + resist_grab() + return //unbuckling yourself if(buckled && last_special <= world.time) @@ -707,6 +662,22 @@ Sorry Giacom. Please don't be mad :( resist_restraints() //trying to remove cuffs. +/mob/proc/resist_grab(moving_resist) + return 1 //returning 0 means we successfully broke free + +/mob/living/resist_grab(moving_resist) + . = 1 + if(pulledby.grab_state) + if(prob(30/pulledby.grab_state)) + visible_message("[src] has broken free of [pulledby]'s grip!") + pulledby.stop_pulling() + return 0 + if(moving_resist && client) //we resisted by trying to move + client.move_delay = world.time + 20 + else + pulledby.stop_pulling() + return 0 + /mob/living/proc/resist_buckle() buckled.user_unbuckle_mob(src,src) @@ -1024,3 +995,7 @@ Sorry Giacom. Please don't be mad :( for(var/datum/objective/sintouched/acedia/A in src.mind.objectives) return 1 return 0 + +/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0) + stop_pulling() + . = ..() \ No newline at end of file diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 773931c8d7d..616609b01a9 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -174,28 +174,51 @@ /mob/living/acid_act(acidpwr, toxpwr, acid_volume) take_organ_damage(min(10*toxpwr, acid_volume * toxpwr)) -/mob/living/proc/grabbedby(mob/living/carbon/user,supress_message = 0) +/mob/living/proc/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src || anchored) return 0 + if(!user.pulling || user.pulling != src) + user.start_pulling(src, supress_message) + return + if(!(status_flags & CANPUSH)) + user << "[src] can't be grabbed more aggressively!" return 0 + grippedby(user) - add_logs(user, src, "grabbed", addition="passively") - - if(anchored || !Adjacent(user)) - return 0 - if(buckled) - user << "You cannot grab [src], \he is buckled in!" - return 0 - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(user, src) - if(!user.put_in_active_hand(G)) //if we can't put the grab in our hand for some reason, we delete it. - qdel(G) - G.synch() - LAssailant = user - - playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if(!supress_message) - visible_message("[user] has grabbed [src] passively!") +//proc to upgrade a simple pull into a more aggressive grab. +/mob/living/proc/grippedby(mob/living/carbon/user) + if(user.grab_state < GRAB_KILL) + user.changeNext_move(CLICK_CD_GRABBING) + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + var/old_grab_state = user.grab_state + var/grab_upgrade_time = 40 + visible_message("[user] starts to tighten \his grip on [src]!", \ + "[user] starts to tighten \his grip on you!") + if(do_mob(user, src, grab_upgrade_time)) + if(user.pulling && user.pulling == src && user.grab_state == old_grab_state && user.a_intent == "grab") + user.grab_state++ + switch(user.grab_state) + if(GRAB_AGGRESSIVE) + add_logs(user, src, "grabbed", addition="aggressively") + visible_message("[user] has grabbed [src] aggressively!", \ + "[user] has grabbed [src] aggressively!") + drop_r_hand() + drop_l_hand() + stop_pulling() + if(GRAB_NECK) + visible_message("[user] has grabbed [src] by the neck!",\ + "[user] has grabbed you by the neck!") + update_canmove() //we fall down + if(!buckled && !density) + Move(user.loc) + if(GRAB_KILL) + visible_message("[user] is strangling [src]!", \ + "[user] is strangling you!") + update_canmove() //we fall down + if(!buckled && !density) + Move(user.loc) + return 1 /mob/living/attack_slime(mob/living/simple_animal/slime/M) @@ -295,8 +318,8 @@ M.do_attack_animation(src) return 1 -/mob/living/incapacitated() - if(stat || paralysis || stunned || weakened || restrained()) +/mob/living/incapacitated(ignore_restraints, ignore_grab) + if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained(ignore_grab))) return 1 //Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs. diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index dab7e893b8a..8e03705663e 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -60,4 +60,4 @@ var/list/butcher_results = null var/hellbound = 0 //People who've signed infernal contracts are unrevivable. - + diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 58d25079b3e..30de1ef4dd9 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -357,8 +357,8 @@ var/list/ai_list = list() return 1 return 0 -/mob/living/silicon/ai/restrained() - return 0 +/mob/living/silicon/ai/restrained(ignore_grab) + . = 0 /mob/living/silicon/ai/emp_act(severity) if (prob(30)) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index ec801c34740..11849bdb578 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -95,8 +95,8 @@ /mob/living/silicon/pai/blob_act(obj/effect/blob/B) return 0 -/mob/living/silicon/pai/restrained() - return 0 +/mob/living/silicon/pai/restrained(ignore_grab) + . = 0 /mob/living/silicon/pai/emp_act(severity) // 20% chance to kill diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3d1ebfaa7cd..3197f34bbd2 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -378,8 +378,8 @@ if(connected_ai) stat("Master AI:", connected_ai.name) -/mob/living/silicon/robot/restrained() - return 0 +/mob/living/silicon/robot/restrained(ignore_grab) + . = 0 /mob/living/silicon/robot/ex_act(severity, target) switch(severity) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 208bd2da166..b5b4f308444 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -467,7 +467,7 @@ if (aicamera) return aicamera.selectpicture(aicamera) -/mob/living/silicon/grabbedby(mob/living/user) +/mob/living/silicon/grippedby(mob/living/user) return /mob/living/silicon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/noise) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index c6b108c951a..0fcb8b953e8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -81,10 +81,9 @@ drop_r_hand() var/obj/item/clothing/head/drone_holder/DH = new /obj/item/clothing/head/drone_holder(src) DH.updateVisualAppearence(src) - DH.contents += src DH.drone = src user.put_in_hands(DH) - src.loc = DH + forceMove(DH) return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index cc56e9382a9..ed54a1e50b8 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -91,6 +91,9 @@ r_hand = null update_inv_hands() + if(I.pulledby) + I.pulledby.stop_pulling() + I.screen_loc = null // will get moved if inventory is visible I.loc = src I.equipped(src, slot) diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 51e6e5f0fa1..3918348a595 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -32,7 +32,7 @@ environment_smash = 0 mouse_opacity = 2 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB - mob_size = MOB_SIZE_SMALL + mob_size = MOB_SIZE_TINY flying = 1 gold_core_spawnable = 1 search_objects = 1 //have to find those plant trays! diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index cd450b1ba34..739a332d653 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -228,7 +228,7 @@ /mob/living/simple_animal/hostile/statue/sentience_act() faction -= "neutral" -/mob/living/simple_animal/hostile/statue/restrained() +/mob/living/simple_animal/hostile/statue/restrained(ignore_grab) . = ..() if(can_be_seen(loc)) return 1 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 40457e167aa..78c877ba366 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -172,6 +172,9 @@ /mob/living/simple_animal/handle_environment(datum/gas_mixture/environment) var/atmos_suitable = 1 + if(pulledby && pulledby.grab_state >= GRAB_KILL && atmos_requirements["min_oxy"]) + atmos_suitable = 0 //getting choked + var/atom/A = src.loc if(isturf(A)) var/turf/T = A diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 5b0ed1aaa8d..74b3e20a378 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -389,7 +389,7 @@ sleep(3) if(user) step_away(src,user,15) - canmove = 1 + update_canmove() /mob/living/simple_animal/slime/pet docile = 1 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e4de12e8ac3..c549cd73a18 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -179,44 +179,10 @@ var/next_mob_id = 0 return r_hand return null -/mob/proc/ret_grab(obj/effect/list_container/mobl/L, flag) - if ((!( istype(l_hand, /obj/item/weapon/grab) ) && !( istype(r_hand, /obj/item/weapon/grab) ))) - if (!( L )) - return null - else - return L.container - else - if (!( L )) - L = new /obj/effect/list_container/mobl( null ) - L.container += src - L.master = src - if (istype(l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = l_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (istype(r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = r_hand - if (!( L.container.Find(G.affecting) )) - L.container += G.affecting - if (G.affecting) - G.affecting.ret_grab(L, 1) - if (!( flag )) - if (L.master == src) - var/list/temp = list( ) - temp += L.container - //L = null - qdel(L) - return temp - else - return L.container +/mob/proc/restrained(ignore_grab) return -/mob/proc/restrained() - return - -/mob/proc/incapacitated() +/mob/proc/incapacitated(ignore_restraints, ignore_grab) return //This proc is called whenever someone clicks an inventory ui slot. @@ -333,12 +299,14 @@ var/next_mob_id = 0 return 1 //this and stop_pulling really ought to be /mob/living procs -/mob/proc/start_pulling(atom/movable/AM) +/mob/proc/start_pulling(atom/movable/AM, supress_message = 0) if(!AM || !src) return if(AM == src || !isturf(AM.loc)) return - if(AM.anchored) + if(AM.anchored || AM.throwing) + return + if(throwing || incapacitated()) return AM.add_fingerprint(src) @@ -350,13 +318,21 @@ var/next_mob_id = 0 return stop_pulling() + changeNext_move(CLICK_CD_GRABBING) + + if(AM.pulledby) + visible_message("[src] has pulled [AM] from [AM.pulledby]'s grip.") + AM.pulledby.stop_pulling() //an object can't be pulled by two mobs at once. + pulling = AM AM.pulledby = src - + playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) update_pull_hud_icon() if(ismob(AM)) var/mob/M = AM + if(!supress_message) + visible_message("[src] has grabbed [M] passively!") if(!iscarbon(src)) M.LAssailant = null else @@ -368,11 +344,15 @@ var/next_mob_id = 0 if(pulling) pulling.pulledby = null + if(ismob(pulling)) + var/mob/M = pulling + M.update_canmove()// mob gets up if it was lyng down in a chokehold pulling = null + grab_state = 0 update_pull_hud_icon() /mob/proc/update_pull_hud_icon() - if(client && hud_used) + if(hud_used) if(hud_used.pull_icon) hud_used.pull_icon.update_icon(src) @@ -677,10 +657,11 @@ var/next_mob_id = 0 //Robots, animals and brains have their own version so don't worry about them /mob/proc/update_canmove() var/ko = weakened || paralysis || stat || (status_flags & FAKEDEATH) + var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK var/buckle_lying = !(buckled && !buckled.buckle_lying) var/has_legs = get_num_legs() var/has_arms = get_num_arms() - if(ko || resting || stunned) + if(ko || resting || stunned || chokehold) drop_r_hand() drop_l_hand() unset_machine() @@ -691,10 +672,12 @@ var/next_mob_id = 0 if(buckled) lying = 90*buckle_lying - else - if((ko || resting || !has_legs) && !lying) - fall(ko) - canmove = !(ko || resting || stunned || buckled || (!has_legs && !has_arms)) + else if(!lying) + if(resting) + fall() + else if(ko || !has_legs || chokehold) + fall(forced = 1) + canmove = !(ko || resting || stunned || chokehold || buckled || (!has_legs && !has_arms)) density = !lying if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 2d8684ded9d..00e480cbcc2 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -32,7 +32,10 @@ var/other_mobs = null var/memory = "" var/disabilities = 0 //Carbon + var/atom/movable/pulling = null + var/grab_state = 0 + var/next_move = null var/notransform = null //Carbon var/hand = null @@ -86,9 +89,6 @@ var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. - var/list/grabbed_by = list( ) - var/list/requests = list( ) - var/list/mapobjs = list() var/in_throw_mode = 0 diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm deleted file mode 100644 index c89cf9ac1a8..00000000000 --- a/code/modules/mob/mob_grab.dm +++ /dev/null @@ -1,223 +0,0 @@ -#define UPGRADE_COOLDOWN 40 -#define UPGRADE_KILL_TIMER 100 - -/obj/item/weapon/grab - name = "grab" - flags = NOBLUDGEON | ABSTRACT - var/obj/screen/grab/hud = null - var/mob/affecting = null - var/mob/assailant = null - var/state = GRAB_PASSIVE - - var/allow_upgrade = 1 - var/last_upgrade = 0 - - layer = 21 - item_state = "nothing" - w_class = 5 - - -/obj/item/weapon/grab/New(mob/user, mob/victim) - ..() - assailant = user - affecting = victim - - hud = new /obj/screen/grab(src) - hud.icon_state = "reinforce" - hud.name = "reinforce grab" - hud.master = src - - affecting.grabbed_by += src - - -/obj/item/weapon/grab/Destroy() - if(affecting) - affecting.grabbed_by -= src - affecting = null - if(assailant) - if(assailant.client) - assailant.client.screen -= hud - assailant = null - qdel(hud) - return ..() - -//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code. -/obj/item/weapon/grab/proc/get_mob_if_throwable() - if(affecting) - if(affecting.buckled) - return null - if(state >= GRAB_AGGRESSIVE) - return affecting - return null - - -//This makes sure that the grab screen object is displayed in the correct hand. -/obj/item/weapon/grab/proc/synch() - if(affecting) - if(assailant.r_hand == src) - hud.screen_loc = ui_rhand - else - hud.screen_loc = ui_lhand - - -/obj/item/weapon/grab/process() - if(!confirm()) - return 0 - - if(assailant.client) - assailant.client.screen -= hud - assailant.client.screen += hud - - if(assailant.pulling == affecting) - assailant.stop_pulling() - - if(state <= GRAB_AGGRESSIVE) - allow_upgrade = 1 - if((assailant.l_hand && assailant.l_hand != src && istype(assailant.l_hand, /obj/item/weapon/grab))) - var/obj/item/weapon/grab/G = assailant.l_hand - if(G.affecting != affecting) - allow_upgrade = 0 - if((assailant.r_hand && assailant.r_hand != src && istype(assailant.r_hand, /obj/item/weapon/grab))) - var/obj/item/weapon/grab/G = assailant.r_hand - if(G.affecting != affecting) - allow_upgrade = 0 - if(state == GRAB_AGGRESSIVE) - var/h = affecting.hand - affecting.hand = 0 - affecting.drop_item() - affecting.hand = 1 - affecting.drop_item() - affecting.hand = h - for(var/X in affecting.grabbed_by) - var/obj/item/weapon/grab/G = X - if(G == src) continue - if(G.state == GRAB_AGGRESSIVE) - allow_upgrade = 0 - if(allow_upgrade) - hud.icon_state = "reinforce" - else - hud.icon_state = "!reinforce" - else - if(!affecting.buckled) - affecting.loc = assailant.loc - - var/breathing_tube = affecting.getorganslot("breathing_tube") - - if(state >= GRAB_NECK) - affecting.Stun(5) //It will hamper your voice, being choked and all. - if(isliving(affecting) && !breathing_tube) - var/mob/living/L = affecting - L.adjustOxyLoss(1) - - if(state >= GRAB_KILL) - affecting.Weaken(5) //Should keep you down unless you get help. - if(!breathing_tube) - affecting.losebreath = min(affecting.losebreath + 2, 3) - -/obj/item/weapon/grab/attack_self(mob/user) - s_click(hud) - -/obj/item/weapon/grab/proc/s_click(obj/screen/S) - if(!affecting) - return - if(state == GRAB_UPGRADING) - return - if(world.time < (last_upgrade + UPGRADE_COOLDOWN)) - return - if(!assailant.canmove || assailant.lying) - qdel(src) - return - - last_upgrade = world.time - - if(state < GRAB_AGGRESSIVE) - if(!allow_upgrade) - return - assailant.visible_message("[assailant] grabs [affecting] aggressively!") - state = GRAB_AGGRESSIVE - icon_state = "grabbed1" - else - if(state < GRAB_NECK) - if(isslime(affecting)) - assailant << "You squeeze [affecting], but nothing interesting happens!" - return - - assailant.visible_message("[assailant] moves \his grip to [affecting]'s neck!") - state = GRAB_NECK - icon_state = "grabbed+1" - if(!affecting.buckled) - affecting.loc = assailant.loc - add_logs(assailant, affecting, "neck-grabbed") - hud.icon_state = "disarm/kill" - hud.name = "disarm/kill" - else - if(state < GRAB_UPGRADING) - assailant.visible_message("[assailant] starts to tighten \his grip on [affecting]'s neck!") - hud.icon_state = "disarm/kill1" - state = GRAB_UPGRADING - if(do_after(assailant, UPGRADE_KILL_TIMER, target = affecting)) - if(state == GRAB_KILL) - return - if(!affecting) - qdel(src) - return - if(!assailant.canmove || assailant.lying) - qdel(src) - return - state = GRAB_KILL - assailant.visible_message("[assailant] tightens \his grip on [affecting]'s neck!") - add_logs(assailant, affecting, "strangled") - - assailant.changeNext_move(CLICK_CD_TKSTRANGLE) - if(!affecting.getorganslot("breathing_tube")) - affecting.losebreath += 1 - else - if(assailant) - assailant.visible_message("[assailant] is unable to tighten \his grip on [affecting]'s neck!") - hud.icon_state = "disarm/kill" - state = GRAB_NECK - - -//This is used to make sure the victim hasn't managed to yackety sax away before using the grab. -/obj/item/weapon/grab/proc/confirm() - if(!assailant || !affecting) - qdel(src) - return 0 - - if(affecting) - if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) ) - qdel(src) - return 0 - - return 1 - - -/obj/item/weapon/grab/attack(mob/M, mob/user) - if(!affecting) - return - - if(M == affecting) - s_click(hud) - return - - if(M == assailant && state >= GRAB_AGGRESSIVE) - if( (ishuman(user) && (user.disabilities & FAT) && ismonkey(affecting) ) || ( isalien(user) && iscarbon(affecting) ) ) - var/mob/living/carbon/attacker = user - user.visible_message("[user] is attempting to devour [affecting]!") - if(istype(user, /mob/living/carbon/alien/humanoid/hunter)) - if(!do_mob(user, affecting, 60)) return - else - if(!do_mob(user, affecting, 130)) return - user.visible_message("[user] devours [affecting]!") - affecting.loc = user - attacker.stomach_contents.Add(affecting) - qdel(src) - - add_logs(user, affecting, "attempted to put", src, "into [M]") - -/obj/item/weapon/grab/dropped() - ..() - qdel(src) - -#undef UPGRADE_COOLDOWN -#undef UPGRADE_KILL_TIMER diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index bb213d051d4..cfba67193ce 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -8,9 +8,6 @@ if(buckled == mover) return 1 if(ismob(mover)) - var/mob/moving_mob = mover - if ((other_mobs && moving_mob.other_mobs)) - return 1 if (mover in buckled_mobs) return 1 return (!mover.density || !density || lying) @@ -114,7 +111,7 @@ Process_Incorpmove(direct) return 0 - if(Process_Grab()) + if(Process_Grab()) //are we restrained by someone's grip? return if(mob.buckled) //if we're buckled to something, tell it we moved. @@ -136,54 +133,10 @@ if(!mob.Process_Spacemove(direct)) return 0 - if(mob.restrained()) //Why being pulled while cuffed prevents you from moving - for(var/mob/M in orange(1, mob)) - if(M.pulling == mob) - if(!M.incapacitated() && mob.Adjacent(M)) - src << "You're restrained! You can't move!" - move_delay = world.time + 10 - return 0 - else - M.stop_pulling() - - //We are now going to move moving = 1 move_delay = mob.movement_delay() + world.time - //Something with pulling things - if(locate(/obj/item/weapon/grab, mob)) - move_delay = max(move_delay, world.time + 7) - var/list/L = mob.ret_grab() - if(istype(L, /list)) - if(L.len == 2) - L -= mob - var/mob/M = L[1] - if(M) - if ((get_dist(mob, M) <= 1 || M.loc == mob.loc)) - . = ..() - if(M)//Mob may get deleted during parent call - if (isturf(M.loc)) - var/diag = get_dir(mob, M) - if ((diag - 1) & diag) - else - diag = null - if ((get_dist(mob, M) > 1 || diag)) - step(M, get_dir(M.loc, mob.loc)) - else - for(var/mob/M in L) - M.other_mobs = 1 - if(mob != M) - M.animate_movement = 3 - for(var/mob/M in L) - spawn( 0 ) - step(M, direct) - return - spawn( 1 ) - M.other_mobs = null - M.animate_movement = 2 - return - if(mob.confused) if(mob.confused > 40) step(mob, pick(cardinal)) @@ -207,39 +160,14 @@ ///Called by client/Move() ///Checks to see if you are being grabbed and if so attemps to break it /client/proc/Process_Grab() - if(mob.grabbed_by.len) - var/list/grabbing = list() + if(mob.pulledby) + if(mob.restrained(ignore_grab = 1)) + move_delay = world.time + 10 + src << "You're restrained! You can't move!" + return 1 + else + return mob.resist_grab(1) - if(istype(mob.l_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = mob.l_hand - grabbing += G.affecting - - if(istype(mob.r_hand, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = mob.r_hand - grabbing += G.affecting - - for(var/X in mob.grabbed_by) - var/obj/item/weapon/grab/G = X - switch(G.state) - - if(GRAB_PASSIVE) - if(!grabbing.Find(G.assailant)) //moving always breaks a passive grab unless we are also grabbing our grabber. - qdel(G) - - if(GRAB_AGGRESSIVE) - move_delay = world.time + 10 - if(!prob(25)) - return 1 - mob.visible_message("[mob] has broken free of [G.assailant]'s grip!") - qdel(G) - - if(GRAB_NECK) - move_delay = world.time + 10 - if(!prob(5)) - return 1 - mob.visible_message("[mob] has broken free of [G.assailant]'s headlock!") - qdel(G) - return 0 ///Process_Incorpmove ///Called by client/Move() @@ -352,27 +280,19 @@ /mob/proc/mob_negates_gravity() return 0 +//moves the mob/object we're pulling /mob/proc/Move_Pulled(atom/A) - if (!canmove || restrained() || !pulling) + if (!pulling) return - if (pulling.anchored) - return - if (!pulling.Adjacent(src)) + if (pulling.anchored || !pulling.Adjacent(src)) + stop_pulling() return if (A == loc && pulling.density) return if (!Process_Spacemove(get_dir(pulling.loc, A))) return - if (ismob(pulling)) - var/mob/M = pulling - var/atom/movable/t = M.pulling - M.stop_pulling() - step(pulling, get_dir(pulling.loc, A)) - if(M) - M.start_pulling(t) - else - step(pulling, get_dir(pulling.loc, A)) - return + step(pulling, get_dir(pulling.loc, A)) + /mob/proc/slip(s_amount, w_amount, obj/O, lube) return diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 2b9890ee8c7..e1539301204 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -109,7 +109,7 @@ /obj/vehicle/Move(NewLoc,Dir=0,step_x=0,step_y=0) - ..() + . = ..() handle_vehicle_layer() handle_vehicle_offsets() diff --git a/tgstation.dme b/tgstation.dme index d2affc0e6c8..b36bbfe8d60 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1229,7 +1229,6 @@ #include "code\modules\mob\mob.dm" #include "code\modules\mob\mob_cleanup.dm" #include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_grab.dm" #include "code\modules\mob\mob_helpers.dm" #include "code\modules\mob\mob_movement.dm" #include "code\modules\mob\mob_transformation_simple.dm" From ab59c4cc782e24564c702904570975df2b95f505 Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Wed, 25 May 2016 12:00:04 -0400 Subject: [PATCH 05/26] Fixes glass tables not producing debris --- code/game/objects/structures/tables_racks.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index a38f9465763..dbd0edf709e 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -297,10 +297,12 @@ /obj/structure/table/glass/proc/table_shatter(mob/M) visible_message("[src] breaks!", "You hear breaking glass.") - playsound(src.loc, "shatter", 50, 1) - for(var/i in debris) - var/atom/movable/AM = i - AM.loc = get_turf(src) + var/turf/T = get_turf(src) + playsound(T, "shatter", 50, 1) + for(var/I in debris) + var/atom/movable/AM = I + AM.forceMove()T + debris -= I if(istype(AM, /obj/item/weapon/shard)) AM.throw_impact(M) M.Weaken(5) From 8f138abaf4576a5f6faf58cb4f74f3291ae319f9 Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Wed, 25 May 2016 12:01:55 -0400 Subject: [PATCH 06/26] INSIDE the parenthesis! augh! --- code/game/objects/structures/tables_racks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index dbd0edf709e..aad8bd813ea 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -301,7 +301,7 @@ playsound(T, "shatter", 50, 1) for(var/I in debris) var/atom/movable/AM = I - AM.forceMove()T + AM.forceMove(T) debris -= I if(istype(AM, /obj/item/weapon/shard)) AM.throw_impact(M) From eeb7d43730e4a6f25b6ed48e69a846e4a8093fad Mon Sep 17 00:00:00 2001 From: Nerd Lord Date: Wed, 25 May 2016 12:05:23 -0400 Subject: [PATCH 07/26] It's a style thing --- code/game/objects/structures/tables_racks.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index aad8bd813ea..2bd12c02740 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -302,7 +302,7 @@ for(var/I in debris) var/atom/movable/AM = I AM.forceMove(T) - debris -= I + debris -= AM if(istype(AM, /obj/item/weapon/shard)) AM.throw_impact(M) M.Weaken(5) From 4b4bbb28cc775e3df20c7ecb6eb2a1da67ba6790 Mon Sep 17 00:00:00 2001 From: phil235 Date: Wed, 25 May 2016 23:22:03 +0200 Subject: [PATCH 08/26] can't choke people with breathing tubes. another tiny fix with tablepush. --- code/game/objects/structures/tables_racks.dm | 4 ++-- code/modules/mob/living/carbon/life.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index e3f6df6107c..2d0a1dbb44e 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -137,7 +137,7 @@ . = . || mover.checkpass(PASSTABLE) /obj/structure/table/proc/tablepush(mob/living/user, mob/living/pushed_mob) - pushed_mob.loc = src.loc + pushed_mob.forceMove(src.loc) pushed_mob.Weaken(2) pushed_mob.visible_message("[user] pushes [pushed_mob] onto [src].", \ "[user] pushes [pushed_mob] onto [src].") @@ -365,7 +365,7 @@ break /obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) - pushed_mob.loc = src.loc + pushed_mob.forceMove(src.loc) pushed_mob.resting = 1 pushed_mob.update_canmove() visible_message("[user] has laid [pushed_mob] on [src].") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 587977a4715..b0024940eca 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -46,7 +46,7 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL)) + if(health <= config.health_threshold_crit) || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) losebreath++ //Suffocate From fdc222830252224a90f83c770148e8c433b1725c Mon Sep 17 00:00:00 2001 From: phil235 Date: Thu, 26 May 2016 00:33:25 +0200 Subject: [PATCH 09/26] Fixes grab uses in Ratvar gamemode and changeling's hivemind link. Also a typo. --- .../game/gamemodes/changeling/powers/linglink.dm | 15 +++++++-------- code/game/gamemodes/clock_cult/clock_objects.dm | 16 ++++++++-------- code/modules/mob/living/carbon/life.dm | 2 +- tgstation.dme | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index 31de5f47be6..5ce526b0cc8 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -10,11 +10,14 @@ if(!..()) return var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/target = G.affecting if(changeling.islinking) user << "We have already formed a link with the victim!" return + if(!user.pulling || !iscarbon(user.pulling)) + user << "We must be grabbing a creature to absorb them!" + return + var/mob/living/carbon/target = user.pulling + if(!target.mind) user << "The victim has no mind to link to!" return @@ -23,19 +26,15 @@ return if(target.mind.changeling) user << "The victim is already a part of the hivemind!" - return - if(!istype(G)) - user << "We must be tightly grabbing a creature in our active hand to link with them!" return - if(G.state <= GRAB_NECK) + if(user.grab_state <= GRAB_NECK) user << "We must have a tighter grip to link with this creature!" return return changeling.can_absorb_dna(user,target) /obj/effect/proc_holder/changeling/linglink/sting_action(mob/user) var/datum/changeling/changeling = user.mind.changeling - var/obj/item/weapon/grab/G = user.get_active_hand() - var/mob/living/carbon/human/target = G.affecting + var/mob/living/carbon/human/target = user.pulling changeling.islinking = 1 for(var/i in 1 to 3) switch(i) diff --git a/code/game/gamemodes/clock_cult/clock_objects.dm b/code/game/gamemodes/clock_cult/clock_objects.dm index e0567ee1af1..da634d756e3 100644 --- a/code/game/gamemodes/clock_cult/clock_objects.dm +++ b/code/game/gamemodes/clock_cult/clock_objects.dm @@ -1374,6 +1374,14 @@ user << "This gateway can only [sender ? "send" : "receive"] objects." /obj/effect/clockwork/spatial_gateway/attack_hand(mob/living/user) + if(user.pulling && user.a_intent == "grab" && isliving(user.pulling)) + var/mob/living/L = user.pulling + if(L.buckled || L.anchored || L.buckled_mobs.len) + return 0 + user.visible_message("[user] shoves [L] into [src]!", "You shove [L] into [src]!") + user.stop_pulling() + pass_through_gateway(L) + return 1 if(!user.canUseTopic(src)) return 0 user.visible_message("[user] climbs through [src]!", "You brace yourself and step through [src]...") @@ -1386,14 +1394,6 @@ qdel(linked_gateway) qdel(src) return 1 - if(istype(I, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = I - if(!G.affecting) - return 0 - user.visible_message("[user] shoves [G.affecting] into [src]!", "You shove [G.affecting] into [src]!") - pass_through_gateway(G.affecting) - qdel(G) - return 1 if(user.drop_item()) pass_through_gateway(I) ..() diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 1d02be1edb9..c055c89375a 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -46,7 +46,7 @@ var/datum/gas_mixture/breath - if(health <= config.health_threshold_crit) || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) + if(health <= config.health_threshold_crit || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) losebreath++ //Suffocate diff --git a/tgstation.dme b/tgstation.dme index e0711e2fae5..54544434c36 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -964,9 +964,9 @@ #include "code\modules\cargo\exports\weapons.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\asset_cache.dm" +#include "code\modules\client\client_colour.dm" #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" -#include "code\modules\client\client_colour.dm" #include "code\modules\client\message.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_savefile.dm" From d9153f61b1e6846cc982254f059b47b4e034a4fa Mon Sep 17 00:00:00 2001 From: phil235 Date: Thu, 26 May 2016 00:42:13 +0200 Subject: [PATCH 10/26] derp --- code/game/gamemodes/changeling/powers/linglink.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/gamemodes/changeling/powers/linglink.dm b/code/game/gamemodes/changeling/powers/linglink.dm index 5ce526b0cc8..3b90ee14bd5 100644 --- a/code/game/gamemodes/changeling/powers/linglink.dm +++ b/code/game/gamemodes/changeling/powers/linglink.dm @@ -13,11 +13,13 @@ if(changeling.islinking) user << "We have already formed a link with the victim!" return - if(!user.pulling || !iscarbon(user.pulling)) - user << "We must be grabbing a creature to absorb them!" + if(!user.pulling) + user << "We must be tightly grabbing a creature to link with them!" + return + if(!iscarbon(user.pulling)) + user << "We cannot link with this creature!" return var/mob/living/carbon/target = user.pulling - if(!target.mind) user << "The victim has no mind to link to!" return From 3ec4b2bf23daca33cd8c2b016d0f7e0dbf37ba95 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Wed, 25 May 2016 18:40:28 -0500 Subject: [PATCH 11/26] Cures zombies --- _maps/RandomRuins/LavaRuins/lavaland_gym.dmm | 53 ----- .../living/simple_animal/hostile/zombie.dm | 202 ------------------ tgstation.dme | 3 +- 3 files changed, 1 insertion(+), 257 deletions(-) delete mode 100644 _maps/RandomRuins/LavaRuins/lavaland_gym.dmm delete mode 100644 code/modules/mob/living/simple_animal/hostile/zombie.dm diff --git a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm b/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm deleted file mode 100644 index c6485f19bd7..00000000000 --- a/_maps/RandomRuins/LavaRuins/lavaland_gym.dmm +++ /dev/null @@ -1,53 +0,0 @@ -"a" = (/turf/closed/mineral/volcanic/lava_land_surface,/area/lavaland/surface/outdoors) -"b" = (/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"c" = (/turf/closed/wall/r_wall,/area/ruin/powered) -"d" = (/obj/structure/closet,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"e" = (/obj/structure/closet,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"f" = (/obj/structure/punching_bag,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"g" = (/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"h" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/item/weapon/shard{icon_state = "medium"},/mob/living/simple_animal/hostile/zombie/gymboss,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"i" = (/obj/structure/window{icon_state = "window";dir = 1},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"j" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"k" = (/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"l" = (/obj/structure/weightlifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"m" = (/obj/structure/window{icon_state = "window";dir = 8},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"n" = (/obj/structure/window{icon_state = "window";dir = 4},/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"o" = (/obj/structure/stacklifter,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"p" = (/obj/structure/window,/obj/structure/window{icon_state = "window";dir = 8},/obj/effect/decal/cleanable/blood,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"q" = (/obj/structure/window,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"r" = (/obj/structure/window,/obj/item/weapon/shard,/mob/living/simple_animal/hostile/zombie/darkholme,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"s" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"t" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (EAST)";icon_state = "splatter6";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTH)";icon_state = "tracks";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-gib3";icon_state = "gib3"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"u" = (/obj/machinery/door/airlock/external,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"v" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)";icon_state = "tracks";dir = 5},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"w" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)";icon_state = "tracks";dir = 6},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"x" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)";icon_state = "tracks";dir = 4},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"y" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter4 (NORTH)";icon_state = "splatter4";dir = 1},/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter6 (NORTH)";icon_state = "splatter6";dir = 1},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"z" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-splatter5";icon_state = "splatter5"},/turf/open/floor/plating/asteroid/basalt/lava_land_surface,/area/lavaland/surface/outdoors) -"A" = (/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"B" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"C" = (/obj/structure/window{icon_state = "window";dir = 1},/obj/machinery/shower,/mob/living/simple_animal/hostile/zombie,/turf/open/floor/plasteel/freezer{baseturf = /turf/open/floor/plating/lava/smooth},/area/ruin/powered) -"D" = (/turf/template_noop,/area/template_noop) - -(1,1,1) = {" -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDccccccccccccDDDDD -DDDcdeddddddedcbDDDD -DDDcfgghiijkglcbaDDD -DDDcfggmgkngglcbbbDD -DDDcfggmggnggocbbbDD -DDDcfggpqqrggocstbbD -DDDcgkgggggggkuvwxbD -DDDcuucccccccccyzbbD -DDDcgAgggggggAcbbbbD -DDDcggggggAgggcbbbDD -DDDcBCBBggBBBBcbbDDD -DDDcgggggggAggcbDDDD -DDDccccccccccccbDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -DDDDDDDDDDDDDDDDDDDD -"} diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm deleted file mode 100644 index cf71e21028e..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ /dev/null @@ -1,202 +0,0 @@ -/mob/living/simple_animal/hostile/zombie - name = "zombie" - desc = "When Observe is full, the dead shall walk the station." - icon = 'icons/mob/human.dmi' - icon_state = "zombie_s" - icon_living = "zombie_s" - icon_dead = "zombie_dead" - turns_per_move = 5 - speak_emote = list("groans") - emote_see = list("groans") - a_intent = "harm" - maxHealth = 120 - health = 120 - speed = 2 - harm_intent_damage = 8 - melee_damage_lower = 20 - melee_damage_upper = 20 - attacktext = "claws" - attack_sound = 'sound/hallucinations/growl1.ogg' - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - maxbodytemp = 350 - unsuitable_atmos_damage = 10 - environment_smash = 1 - robust_searching = 1 - stat_attack = 2 - gold_core_spawnable = 1 - faction = list("zombie") - var/mob/living/carbon/human/stored_corpse = null - butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3) - see_invisible = SEE_INVISIBLE_MINIMUM - see_in_dark = 8 - layer = MOB_LAYER - 0.1 - var/removingairlock = 0 - -/mob/living/simple_animal/hostile/zombie/darkholme //BOY♂NEXT♂RUIN - desc = "This guy seems to have gotten lost on his way to the leather club." - gold_core_spawnable = 0 - -/mob/living/simple_animal/hostile/zombie/darkholme/New() - ..() - name = pick("Leatherman","Leatherhead") - -mob/living/simple_animal/hostile/zombie/gymboss - name = "boss of this gym" - desc = "There seems to be something shiny embedded in his waist." - butcher_results = list(/obj/item/weapon/storage/belt/champion/wrestling = 1) - attacktext = "spanks" - gold_core_spawnable = 0 - - -/mob/living/simple_animal/hostile/zombie/AttackingTarget() - ..() - if(isliving(target)) - var/mob/living/L = target - if(ishuman(L) && L.stat) - var/mob/living/carbon/human/H = L - for(var/mob/living/simple_animal/hostile/zombie/holder/Z in H) //No instant heals for people who are already zombies - src << "They'll be getting up on their own, just give them a minute!" - Z.faction = src.faction //Just in case zombies somehow ended up on different "teams" - H.faction = src.faction - return - Zombify(H) - else if (L.stat) //So they don't get stuck hitting a corpse - L.gib() - visible_message("[src] tears [L] to pieces!") - src << "You feast on [L], restoring your health!" - revive(full_heal = 1) - - if(istype(target, /obj/machinery/door/airlock)) - if(!removingairlock) - var/obj/machinery/door/airlock/A = target - removingairlock = 1 - src << "You start tearing apart the airlock..." - playsound(src.loc, 'sound/machines/airlock_alien_prying.ogg', 100, 1) - spawn(20) - playsound(src.loc, 'sound/hallucinations/growl3.ogg', 50, 1) - if(do_after(src, 160, 0, A, 1)) - playsound(src.loc, 'sound/hallucinations/far_noise.ogg', 50, 1) - var/obj/structure/door_assembly/door = new A.doortype(get_turf(A)) - door.density = 0 - door.anchored = 1 - door.name = "ravaged airlock" - door.desc = "An airlock that has been torn apart. Looks like it won't be keeping much out now." - qdel(A) - removingairlock = 0 - else - src << "You are already tearing an airlock apart!" - -/mob/living/simple_animal/hostile/zombie/death() - ..() - if(stored_corpse) - stored_corpse.loc = loc - if(ckey) - stored_corpse.ckey = src.ckey - stored_corpse << "You're down, but not quite out. You'll be back on your feet within a minute or two." - var/mob/living/simple_animal/hostile/zombie/holder/D = new/mob/living/simple_animal/hostile/zombie/holder(stored_corpse) - D.faction = src.faction - qdel(src) - return - src << "You're down, but not quite out. You'll be back on your feet within a minute or two." - spawn(rand(300,400)) - if(src) - for(var/mob/dead/observer/ghost in player_list) - if(src.real_name == ghost.real_name) - ghost.reenter_corpse() - break - visible_message("[src] staggers to their feet!") - revive(full_heal = 1) - -/mob/living/simple_animal/hostile/zombie/proc/Zombify(mob/living/carbon/human/H) - H.set_species(/datum/species/zombie) - if(H.head) //So people can see they're a zombie - var/obj/item/clothing/helmet = H.head - if(!H.unEquip(helmet)) - qdel(helmet) - if(H.wear_mask) - var/obj/item/clothing/mask = H.wear_mask - if(!H.unEquip(mask)) - qdel(mask) - var/mob/living/simple_animal/hostile/zombie/Z = new /mob/living/simple_animal/hostile/zombie(H.loc) - Z.faction = src.faction - Z.appearance = H.appearance - Z.transform = matrix() - Z.pixel_y = 0 - for(var/mob/dead/observer/ghost in player_list) - if(H.real_name == ghost.real_name) - ghost.reenter_corpse() - break - Z.ckey = H.ckey - H.stat = DEAD - H.butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3) //So now you can carve them up when you kill them. Maybe not a good idea for the human versions. - H.loc = Z - Z.stored_corpse = H - for(var/mob/living/simple_animal/hostile/zombie/holder/D in H) //Dont want to revive them twice - qdel(D) - visible_message("[Z] staggers to their feet!") - Z << "You are now a zombie! Follow your creators lead!" - - -/mob/living/simple_animal/hostile/spawner/zombie - name = "corpse pit" - desc = "A pit full of zombies." - icon_state = "tombstone" - icon_living = "tombstone" - icon = 'icons/mob/nest.dmi' - health = 400 - maxHealth = 400 - list/spawned_mobs = list() - max_mobs = 40 - spawn_time = 100 - mob_type = /mob/living/simple_animal/hostile/zombie - spawn_text = "emerges from" - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - faction = list("zombie") - deathmessage = "collapses, stopping the flow of zombies!" - del_on_death = 1 - -/mob/living/simple_animal/hostile/spawner/zombie/lesser - name = "lesser corpse pit" - desc = "A pit full of less zombies." - max_mobs = 10 - spawn_time = 150 - health = 200 - maxHealth = 200 - -/obj/item/weapon/shovel/cursed - name = "cursed shovel" - desc = "You probably shouldn't use this particular shovel." - var/used = FALSE - force = 15 - -/obj/item/weapon/shovel/cursed/attack_self(mob/living/user) - if(used == FALSE) - visible_message("[user] digs a pit to Hell!") - new /mob/living/simple_animal/hostile/spawner/zombie(get_turf(src.loc)) - used = TRUE - else - user << "The unearthly energies that once powered this shovel are now dormant. Still sharp though." - - -/mob/living/simple_animal/hostile/zombie/holder - name = "infection holder" - icon_state = "none" - icon_living = "none" - icon_dead = "none" - desc = "You shouldn't be seeing this." - invisibility = INVISIBILITY_ABSTRACT - unsuitable_atmos_damage = 0 - stat_attack = 2 - gold_core_spawnable = 0 - AIStatus = AI_OFF - stop_automated_movement = 1 - density = 0 - -/mob/living/simple_animal/hostile/zombie/holder/New() - ..() - spawn(rand(800,1200)) - if(src && istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - Zombify(H) - qdel(src) diff --git a/tgstation.dme b/tgstation.dme index dd4828bf331..62e129aeb49 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -964,9 +964,9 @@ #include "code\modules\cargo\exports\weapons.dm" #include "code\modules\chatter\chatter.dm" #include "code\modules\client\asset_cache.dm" +#include "code\modules\client\client_colour.dm" #include "code\modules\client\client_defines.dm" #include "code\modules\client\client_procs.dm" -#include "code\modules\client\client_colour.dm" #include "code\modules\client\message.dm" #include "code\modules\client\preferences.dm" #include "code\modules\client\preferences_savefile.dm" @@ -1451,7 +1451,6 @@ #include "code\modules\mob\living\simple_animal\hostile\tree.dm" #include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" #include "code\modules\mob\living\simple_animal\hostile\wizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\zombie.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" From 45a13b71797b39320d58e24573ed5b0cc56cd9c2 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Wed, 25 May 2016 21:50:05 -0500 Subject: [PATCH 12/26] Loading Ruins... Ruins Loaded. Loading Ruins... --- code/modules/awaymissions/zlevel.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 2d863a0079e..56dae615dd2 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -94,7 +94,12 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away world.log << "Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])" var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T) - R.Load(ruins,ruin) + + world << "Loading ruins..." + if(R.Load(ruins,ruin)) + world << "Ruins loaded." + else + world << "No ruins found." budget -= ruin.cost if(!ruin.allow_duplicates) ruins -= ruin.name @@ -115,17 +120,15 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away var/datum/map_template/T = potentialRuins[A] if(!T.loaded) possible_ruins += T - world << "Loading ruins..." if(!template && possible_ruins.len) template = safepick(possible_ruins) if(!template) - world << "No ruins found." - return + return 0 for(var/i in template.get_affected_turfs(get_turf(src), 1)) var/turf/T = i for(var/mob/living/simple_animal/monster in T) qdel(monster) template.load(get_turf(src),centered = TRUE) template.loaded++ - world << "Ruins loaded." qdel(src) + return 1 \ No newline at end of file From 7357479bed87ad8685bd78c2ec8a4b94b86d3b20 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Wed, 25 May 2016 22:03:38 -0500 Subject: [PATCH 13/26] worstcoder --- code/modules/awaymissions/zlevel.dm | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 56dae615dd2..4bdfe634ceb 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -64,9 +64,10 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away /proc/seedRuins(z_level = 1, budget = 0, whitelist = /area/space, list/potentialRuins = space_ruins_templates) var/overall_sanity = 100 - var/ruins = potentialRuins.Copy() + world << "Loading ruins..." + while(budget > 0 && overall_sanity > 0) // Pick a ruin var/datum/map_template/ruin/ruin = ruins[pick(ruins)] @@ -77,6 +78,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away // If so, try to place it var/sanity = 100 // And if we can't fit it anywhere, give up, try again + while(sanity > 0) sanity-- var/turf/T = locate(rand(25, world.maxx - 25), rand(25, world.maxy - 25), z_level) @@ -94,12 +96,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away world.log << "Ruin \"[ruin.name]\" placed at ([T.x], [T.y], [T.z])" var/obj/effect/ruin_loader/R = new /obj/effect/ruin_loader(T) - - world << "Loading ruins..." - if(R.Load(ruins,ruin)) - world << "Ruins loaded." - else - world << "No ruins found." + R.Load(ruins,ruin) budget -= ruin.cost if(!ruin.allow_duplicates) ruins -= ruin.name @@ -108,6 +105,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away if(!overall_sanity) world.log << "Ruin loader gave up with [budget] left to spend." + /obj/effect/ruin_loader name = "random ruin" icon = 'icons/obj/weapons.dmi' From b6cd3b0debfb20216930fd557337ae9cc4759115 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Thu, 26 May 2016 00:59:21 -0500 Subject: [PATCH 14/26] Ends Flyman Starvation --- code/modules/mob/living/carbon/carbon.dm | 55 ++++++++++--------- code/modules/mob/living/carbon/human/life.dm | 24 +++----- .../mob/living/carbon/human/species_types.dm | 4 +- 3 files changed, 39 insertions(+), 44 deletions(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 334125e45cd..2dd0cf1f8ee 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -541,40 +541,43 @@ add_abilities_to_panel() -/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1) - if(src.is_muzzled()) - if(message) - src << "The muzzle prevents you from vomiting!" - return 0 - if(stun) - Stun(4) +/mob/living/carbon/proc/vomit(var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0) if(nutrition < 100 && !blood) if(message) visible_message("[src] dry heaves!", \ "You try to throw up, but there's nothing your stomach!") if(stun) Weaken(10) + return 1 + + if(src.is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious + if(message) + visible_message("[src] throws up all over \himself!", \ + "You throw up all over yourself!") + distance = 0 else if(message) - visible_message("[src] throws up!", \ - "You throw up!") - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - var/turf/T = get_turf(src) - for(var/i=0 to distance) - if(blood) - if(T) - T.add_blood_floor(src) - if(stun) - adjustBruteLoss(3) - else - if(T) - T.add_vomit_floor(src) - nutrition -= lost_nutrition - if(stun) - adjustToxLoss(-3) - T = get_step(T, dir) - if (is_blocked_turf(T)) - break + visible_message("[src] throws up!", "You throw up!") + + if(stun) + Stun(4) + + playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) + var/turf/T = get_turf(src) + for(var/i=0 to distance) + if(blood) + if(T) + T.add_blood_floor(src) + if(stun) + adjustBruteLoss(3) + else + if(T) + T.add_vomit_floor(src, 0)//toxic barf looks different + nutrition -= lost_nutrition + adjustToxLoss(-3) + T = get_step(T, dir) + if (is_blocked_turf(T)) + break return 1 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index ad5a44c60b1..3d1635fe0db 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -253,28 +253,17 @@ reagents.metabolize(src, can_overdose=1) dna.species.handle_chemicals_in_body(src) + /mob/living/carbon/human/handle_random_events() - // Puke if toxloss is too high + //Puke if toxloss is too high if(!stat) - if (getToxLoss() >= 45 && nutrition > 20) + if(getToxLoss() >= 45 && nutrition > 20) lastpuke ++ if(lastpuke >= 25) // about 25 second delay I guess - Stun(5) - - visible_message("[src] throws up!", \ - "[src] throws up!") - playsound(loc, 'sound/effects/splat.ogg', 50, 1) - - var/turf/location = loc - if (istype(location, /turf)) - location.add_vomit_floor(src, 1) - - nutrition -= 20 - adjustToxLoss(-3) - - // make it so you can only puke so fast + vomit(20, 0, 1, 0, 1, 1) lastpuke = 0 + /mob/living/carbon/human/has_smoke_protection() if(wear_mask) if(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) @@ -288,6 +277,8 @@ if(NOBREATH in dna.species.specflags) . = 1 return . + + /mob/living/carbon/human/proc/handle_embedded_objects() for(var/X in bodyparts) var/obj/item/bodypart/BP = X @@ -304,6 +295,7 @@ if(!has_embedded_objects()) clear_alert("embeddedobject") + /mob/living/carbon/human/proc/handle_heart() CHECK_DNA_AND_SPECIES(src) var/needs_heart = (!(NOBLOOD in dna.species.specflags)) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index e0672de9cee..669e29e1600 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -397,9 +397,9 @@ /datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(istype(chem,/datum/reagent/consumable)) var/datum/reagent/consumable/nutri_check = chem - if(nutri_check.nutriment_factor >0) + if(nutri_check.nutriment_factor > 0) var/turf/pos = get_turf(H) - H.vomit() + H.vomit(0, 0, 0, 2, 1) playsound(pos, 'sound/effects/splat.ogg', 50, 1) H.visible_message("[H] vomits on the floor!", \ "You throw up on the floor!") From 0664f17c341f322d5d3752cd65e5d0238e857c2d Mon Sep 17 00:00:00 2001 From: Cheridan Date: Thu, 26 May 2016 01:16:28 -0500 Subject: [PATCH 15/26] Makes flies only barf 1 tile ahead 2 tiles was too fun. --- code/modules/mob/living/carbon/human/species_types.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm index 669e29e1600..eb87e5eae71 100644 --- a/code/modules/mob/living/carbon/human/species_types.dm +++ b/code/modules/mob/living/carbon/human/species_types.dm @@ -399,7 +399,7 @@ var/datum/reagent/consumable/nutri_check = chem if(nutri_check.nutriment_factor > 0) var/turf/pos = get_turf(H) - H.vomit(0, 0, 0, 2, 1) + H.vomit(0, 0, 0, 1, 1) playsound(pos, 'sound/effects/splat.ogg', 50, 1) H.visible_message("[H] vomits on the floor!", \ "You throw up on the floor!") From 09a0f00456f27efc574d1f8f18558e7ed9004a15 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Thu, 26 May 2016 04:44:07 -0700 Subject: [PATCH 16/26] Make the github webhook secret required for the webhook processor to avoid security issues I already use this, but it occurred to me that without hooksecret, that somebody could craft a fake event with a "changelog" and a `$payload['pull_request']['base']['repo']['url']` set to a script they controlled, and use that to extract the private key. --- tools/github_webhook_processor.php | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php index 766f0310302..39189c88428 100644 --- a/tools/github_webhook_processor.php +++ b/tools/github_webhook_processor.php @@ -20,7 +20,7 @@ //Github lets you have it sign the message with a secret that you can validate. This prevents people from faking events. //This var should match the secret you configured for this webhook on github. -//set to NULL (no quotes) to disable validation. +//This is required as otherwise somebody could trick the script into leaking the api key. $hookSecret = '08ajh0qj93209qj90jfq932j32r'; //Api key for pushing changelogs. @@ -49,21 +49,22 @@ set_exception_handler(function($e) { die(); }); $rawPost = NULL; -if ($hookSecret !== NULL) { - if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { - throw new \Exception("HTTP header 'X-Hub-Signature' is missing."); - } elseif (!extension_loaded('hash')) { - throw new \Exception("Missing 'hash' extension to check the secret code validity."); - } - list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', ''); - if (!in_array($algo, hash_algos(), TRUE)) { - throw new \Exception("Hash algorithm '$algo' is not supported."); - } - $rawPost = file_get_contents('php://input'); - if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) { - throw new \Exception('Hook secret does not match.'); - } +if (!$hookSecret || $hookSecret == '08ajh0qj93209qj90jfq932j32r') + throw new \Exception("Hook secret is required and can not be default"); +if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { + throw new \Exception("HTTP header 'X-Hub-Signature' is missing."); +} elseif (!extension_loaded('hash')) { + throw new \Exception("Missing 'hash' extension to check the secret code validity."); } +list($algo, $hash) = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE'], 2) + array('', ''); +if (!in_array($algo, hash_algos(), TRUE)) { + throw new \Exception("Hash algorithm '$algo' is not supported."); +} +$rawPost = file_get_contents('php://input'); +if ($hash !== hash_hmac($algo, $rawPost, $hookSecret)) { + throw new \Exception('Hook secret does not match.'); +} + $contenttype = null; //apache and nginx/fastcgi/phpfpm call this two different things. if (!isset($_SERVER['HTTP_CONTENT_TYPE'])) { From a78679a8c43f992e87d08d59d5180653a09f0af6 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 May 2016 14:10:59 -0500 Subject: [PATCH 17/26] Fine keep your damn zombies --- code/datums/ruins/lavaland.dm | 8 - .../living/simple_animal/hostile/zombie.dm | 202 ++++++++++++++++++ 2 files changed, 202 insertions(+), 8 deletions(-) create mode 100644 code/modules/mob/living/simple_animal/hostile/zombie.dm diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index 06b00e1be8f..9a404f07680 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -167,14 +167,6 @@ suffix = "lavaland_fountain_hall.dmm" cost = 5 -/datum/map_template/ruin/lavaland/zombie_gym - name = "Zombie Gym" - id = "zombie-gym" - description = "The patrons at this gym are serious about health, and \ - making sure people work on their cardio." - suffix = "lavaland_gym.dmm" - cost = 10 - /datum/map_template/ruin/lavaland/survivalcapsule name = "Survival Capsule Ruins" id = "survivalcapsule" diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm new file mode 100644 index 00000000000..064df080757 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -0,0 +1,202 @@ +/mob/living/simple_animal/hostile/zombie + name = "zombie" + desc = "When Observe is full, the dead shall walk the station." + icon = 'icons/mob/human.dmi' + icon_state = "zombie_s" + icon_living = "zombie_s" + icon_dead = "zombie_dead" + turns_per_move = 5 + speak_emote = list("groans") + emote_see = list("groans") + a_intent = "harm" + maxHealth = 120 + health = 120 + speed = 2 + harm_intent_damage = 8 + melee_damage_lower = 20 + melee_damage_upper = 20 + attacktext = "claws" + attack_sound = 'sound/hallucinations/growl1.ogg' + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + maxbodytemp = 350 + unsuitable_atmos_damage = 10 + environment_smash = 1 + robust_searching = 1 + stat_attack = 2 + gold_core_spawnable = 0 + faction = list("zombie") + var/mob/living/carbon/human/stored_corpse = null + butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3) + see_invisible = SEE_INVISIBLE_MINIMUM + see_in_dark = 8 + layer = MOB_LAYER - 0.1 + var/removingairlock = 0 + +/mob/living/simple_animal/hostile/zombie/darkholme //BOY?NEXT?RUIN + desc = "This guy seems to have gotten lost on his way to the leather club." + gold_core_spawnable = 0 + +/mob/living/simple_animal/hostile/zombie/darkholme/New() + ..() + name = pick("Leatherman","Leatherhead") + +mob/living/simple_animal/hostile/zombie/gymboss + name = "boss of this gym" + desc = "There seems to be something shiny embedded in his waist." + butcher_results = list(/obj/item/weapon/storage/belt/champion/wrestling = 1) + attacktext = "spanks" + gold_core_spawnable = 0 + + +/mob/living/simple_animal/hostile/zombie/AttackingTarget() + ..() + if(isliving(target)) + var/mob/living/L = target + if(ishuman(L) && L.stat) + var/mob/living/carbon/human/H = L + for(var/mob/living/simple_animal/hostile/zombie/holder/Z in H) //No instant heals for people who are already zombies + src << "They'll be getting up on their own, just give them a minute!" + Z.faction = src.faction //Just in case zombies somehow ended up on different "teams" + H.faction = src.faction + return + Zombify(H) + else if (L.stat) //So they don't get stuck hitting a corpse + L.gib() + visible_message("[src] tears [L] to pieces!") + src << "You feast on [L], restoring your health!" + revive(full_heal = 1) + + if(istype(target, /obj/machinery/door/airlock)) + if(!removingairlock) + var/obj/machinery/door/airlock/A = target + removingairlock = 1 + src << "You start tearing apart the airlock..." + playsound(src.loc, 'sound/machines/airlock_alien_prying.ogg', 100, 1) + spawn(20) + playsound(src.loc, 'sound/hallucinations/growl3.ogg', 50, 1) + if(do_after(src, 160, 0, A, 1)) + playsound(src.loc, 'sound/hallucinations/far_noise.ogg', 50, 1) + var/obj/structure/door_assembly/door = new A.doortype(get_turf(A)) + door.density = 0 + door.anchored = 1 + door.name = "ravaged airlock" + door.desc = "An airlock that has been torn apart. Looks like it won't be keeping much out now." + qdel(A) + removingairlock = 0 + else + src << "You are already tearing an airlock apart!" + +/mob/living/simple_animal/hostile/zombie/death() + ..() + if(stored_corpse) + stored_corpse.loc = loc + if(ckey) + stored_corpse.ckey = src.ckey + stored_corpse << "You're down, but not quite out. You'll be back on your feet within a minute or two." + var/mob/living/simple_animal/hostile/zombie/holder/D = new/mob/living/simple_animal/hostile/zombie/holder(stored_corpse) + D.faction = src.faction + qdel(src) + return + src << "You're down, but not quite out. You'll be back on your feet within a minute or two." + spawn(rand(300,400)) + if(src) + for(var/mob/dead/observer/ghost in player_list) + if(src.real_name == ghost.real_name) + ghost.reenter_corpse() + break + visible_message("[src] staggers to their feet!") + revive(full_heal = 1) + +/mob/living/simple_animal/hostile/zombie/proc/Zombify(mob/living/carbon/human/H) + H.set_species(/datum/species/zombie) + if(H.head) //So people can see they're a zombie + var/obj/item/clothing/helmet = H.head + if(!H.unEquip(helmet)) + qdel(helmet) + if(H.wear_mask) + var/obj/item/clothing/mask = H.wear_mask + if(!H.unEquip(mask)) + qdel(mask) + var/mob/living/simple_animal/hostile/zombie/Z = new /mob/living/simple_animal/hostile/zombie(H.loc) + Z.faction = src.faction + Z.appearance = H.appearance + Z.transform = matrix() + Z.pixel_y = 0 + for(var/mob/dead/observer/ghost in player_list) + if(H.real_name == ghost.real_name) + ghost.reenter_corpse() + break + Z.ckey = H.ckey + H.stat = DEAD + H.butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3) //So now you can carve them up when you kill them. Maybe not a good idea for the human versions. + H.loc = Z + Z.stored_corpse = H + for(var/mob/living/simple_animal/hostile/zombie/holder/D in H) //Dont want to revive them twice + qdel(D) + visible_message("[Z] staggers to their feet!") + Z << "You are now a zombie! Follow your creators lead!" + + +/mob/living/simple_animal/hostile/spawner/zombie + name = "corpse pit" + desc = "A pit full of zombies." + icon_state = "tombstone" + icon_living = "tombstone" + icon = 'icons/mob/nest.dmi' + health = 400 + maxHealth = 400 + list/spawned_mobs = list() + max_mobs = 40 + spawn_time = 100 + mob_type = /mob/living/simple_animal/hostile/zombie + spawn_text = "emerges from" + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + faction = list("zombie") + deathmessage = "collapses, stopping the flow of zombies!" + del_on_death = 1 + +/mob/living/simple_animal/hostile/spawner/zombie/lesser + name = "lesser corpse pit" + desc = "A pit full of less zombies." + max_mobs = 10 + spawn_time = 150 + health = 200 + maxHealth = 200 + +/obj/item/weapon/shovel/cursed + name = "cursed shovel" + desc = "You probably shouldn't use this particular shovel." + var/used = FALSE + force = 15 + +/obj/item/weapon/shovel/cursed/attack_self(mob/living/user) + if(used == FALSE) + visible_message("[user] digs a pit to Hell!") + new /mob/living/simple_animal/hostile/spawner/zombie(get_turf(src.loc)) + used = TRUE + else + user << "The unearthly energies that once powered this shovel are now dormant. Still sharp though." + + +/mob/living/simple_animal/hostile/zombie/holder + name = "infection holder" + icon_state = "none" + icon_living = "none" + icon_dead = "none" + desc = "You shouldn't be seeing this." + invisibility = INVISIBILITY_ABSTRACT + unsuitable_atmos_damage = 0 + stat_attack = 2 + gold_core_spawnable = 0 + AIStatus = AI_OFF + stop_automated_movement = 1 + density = 0 + +/mob/living/simple_animal/hostile/zombie/holder/New() + ..() + spawn(rand(800,1200)) + if(src && istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + Zombify(H) + qdel(src) \ No newline at end of file From 8fc511463e3b71224ba32f353039b2ba438140bf Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 26 May 2016 14:17:27 -0500 Subject: [PATCH 18/26] Readds zombies to dme --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 62e129aeb49..1a1d6369cd9 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1451,6 +1451,7 @@ #include "code\modules\mob\living\simple_animal\hostile\tree.dm" #include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" #include "code\modules\mob\living\simple_animal\hostile\wizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\zombie.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" From ca3cf7475e5afa0685c51ad10d42550f27d96811 Mon Sep 17 00:00:00 2001 From: phil235 Date: Thu, 26 May 2016 22:14:51 +0200 Subject: [PATCH 19/26] Book binder machine is now wrenchable to move it. --- code/modules/library/lib_machines.dm | 42 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index bdad0908afe..56de7282e19 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -512,22 +512,30 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums /obj/machinery/bookbinder/attackby(obj/O, mob/user, params) if(istype(O, /obj/item/weapon/paper)) - if(busy) - user << "The book binder is busy. Please wait for completion of previous operation." - return - if(!user.drop_item()) - return - O.loc = src - user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") - src.visible_message("[src] begins to hum as it warms up its printing drums.") - busy = 1 - sleep(rand(200,400)) - busy = 0 - src.visible_message("[src] whirs as it prints and binds a new book.") - var/obj/item/weapon/book/b = new(src.loc) - b.dat = O:info - b.name = "Print Job #" + "[rand(100, 999)]" - b.icon_state = "book[rand(1,7)]" - qdel(O) + bind_book(user, O) + else if(default_unfasten_wrench(user, O)) + return 1 else return ..() + +/obj/machinery/bookbinder/proc/bind_book(mob/user, obj/item/weapon/paper/P) + if(stat) + return + if(busy) + user << "The book binder is busy. Please wait for completion of previous operation." + return + if(!user.drop_item()) + return + P.loc = src + user.visible_message("[user] loads some paper into [src].", "You load some paper into [src].") + audible_message("[src] begins to hum as it warms up its printing drums.") + busy = 1 + sleep(rand(200,400)) + busy = 0 + if(P && !stat) + visible_message("[src] whirs as it prints and binds a new book.") + var/obj/item/weapon/book/B = new(src.loc) + B.dat = P.info + B.name = "Print Job #" + "[rand(100, 999)]" + B.icon_state = "book[rand(1,7)]" + qdel(P) \ No newline at end of file From c6d55955e77d100cbf82858a1595b5cc64da8cbc Mon Sep 17 00:00:00 2001 From: phil235 Date: Thu, 26 May 2016 22:23:24 +0200 Subject: [PATCH 20/26] let's not have the paper forever stuck in case of power outage. --- code/modules/library/lib_machines.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index 56de7282e19..003bb9ceb26 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -532,10 +532,13 @@ var/global/list/datum/cachedbook/cachedbooks // List of our cached book datums busy = 1 sleep(rand(200,400)) busy = 0 - if(P && !stat) - visible_message("[src] whirs as it prints and binds a new book.") - var/obj/item/weapon/book/B = new(src.loc) - B.dat = P.info - B.name = "Print Job #" + "[rand(100, 999)]" - B.icon_state = "book[rand(1,7)]" - qdel(P) \ No newline at end of file + if(P) + if(!stat) + visible_message("[src] whirs as it prints and binds a new book.") + var/obj/item/weapon/book/B = new(src.loc) + B.dat = P.info + B.name = "Print Job #" + "[rand(100, 999)]" + B.icon_state = "book[rand(1,7)]" + qdel(P) + else + P.loc = loc \ No newline at end of file From 606deb12103db98e94f9859817bf5936f6969cfc Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Thu, 26 May 2016 20:51:48 +0000 Subject: [PATCH 21/26] Automatic changelog generation for PR #17896 --- html/changelogs/AutoChangeLog-pr-17896.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-17896.yml diff --git a/html/changelogs/AutoChangeLog-pr-17896.yml b/html/changelogs/AutoChangeLog-pr-17896.yml new file mode 100644 index 00000000000..1aec622f5dc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-17896.yml @@ -0,0 +1,5 @@ +author: phil235 +delete-after: True +changes: + - tweak: "Pull and Grab are merged together. Pulling stays unchanged. Using an empty hand with grab intent on a mob will pull them. Using an empty hand with grab intent on a mob that you're already pulling will try to upgrade your grip to aggressive grab>neck grab>kill grab. Aggressive grabs no longer stun you, but they act exactly like a handcuff, preventing you from using your hands until you escape the grip. You can break free from the grip by trying to move or using the resist button." + - tweak: "Someone pulling a restrained mob now swap position with them instead of getting blocked by the mob, unable to even push them." From f2edbc01ecdae8a4262acf45bfaa0b8418576dee Mon Sep 17 00:00:00 2001 From: Jack Edge Date: Thu, 26 May 2016 22:46:14 +0100 Subject: [PATCH 22/26] Fixes incorrect docking port on Metastation Fixes #17956. --- _maps/map_files/MetaStation/MetaStation.dmm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 57b2c9c959e..d27566ed208 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -99122,7 +99122,7 @@ /obj/docking_port/stationary{ dheight = 0; dir = 2; - dwidth = 10; + dwidth = 9; height = 25; id = "emergency_home"; name = "MetaStation emergency evac bay"; From fcfa5dff6dd615363d73be3683ca4cd0e1309840 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Thu, 26 May 2016 19:36:57 -0500 Subject: [PATCH 23/26] flag memes --- code/modules/awaymissions/zlevel.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index 4bdfe634ceb..075ef8b3df6 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -121,7 +121,7 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away if(!template && possible_ruins.len) template = safepick(possible_ruins) if(!template) - return 0 + return FALSE for(var/i in template.get_affected_turfs(get_turf(src), 1)) var/turf/T = i for(var/mob/living/simple_animal/monster in T) @@ -129,4 +129,4 @@ var/global/list/potentialRandomZlevels = generateMapList(filename = "config/away template.load(get_turf(src),centered = TRUE) template.loaded++ qdel(src) - return 1 \ No newline at end of file + return TRUE From e92a4bc7449fc6256aba2ef0cd535eff1afa8278 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Fri, 27 May 2016 14:03:22 -0500 Subject: [PATCH 24/26] no src --- code/modules/mob/living/carbon/carbon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 2dd0cf1f8ee..5f7b7b066b0 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -550,7 +550,7 @@ Weaken(10) return 1 - if(src.is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious + if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious if(message) visible_message("[src] throws up all over \himself!", \ "You throw up all over yourself!") From 2e74d742ad4f0a34cdbdc654e4ce618c589319e0 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Fri, 27 May 2016 14:08:47 -0500 Subject: [PATCH 25/26] Themself --- code/modules/mob/living/carbon/carbon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5f7b7b066b0..32664b37eb4 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -552,7 +552,7 @@ if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious if(message) - visible_message("[src] throws up all over \himself!", \ + visible_message("[src] throws up all over themself!", \ "You throw up all over yourself!") distance = 0 else From 2cfb2d8eedb39e36c3b6db9456fb32ba57fbb5ee Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Fri, 27 May 2016 16:16:21 -0400 Subject: [PATCH 26/26] Layers are now defines (#17949) * Layers are now defines * this looks better * GAS_phil_LAYER * no message * remove the three unneeded defines * no message --- code/__DEFINES/layers.dm | 54 +++++++++++++++++++ code/_onclick/hud/blob_overmind.dm | 2 +- code/_onclick/hud/demon.dm | 4 +- code/_onclick/hud/fullscreen.dm | 9 ---- code/_onclick/hud/other_mobs.dm | 4 +- code/_onclick/hud/robot.dm | 2 +- code/_onclick/hud/screen_objects.dm | 14 ++--- code/_onclick/telekinesis.dm | 2 +- code/game/area/Space_Station_13_areas.dm | 2 +- code/game/area/areas.dm | 2 +- code/game/atoms.dm | 2 +- code/game/atoms_movable.dm | 2 +- .../gamemodes/clock_cult/clock_objects.dm | 4 +- .../game/gamemodes/clock_cult/clock_ratvar.dm | 2 +- code/game/gamemodes/cult/cult_items.dm | 2 +- code/game/gamemodes/cult/runes.dm | 2 +- .../gamemodes/demon/true_demon/inventory.dm | 4 +- code/game/gamemodes/gang/dominator.dm | 2 +- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 2 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- code/game/gamemodes/nuclear/nuclearbomb.dm | 2 +- code/game/gamemodes/sandbox/h_sandbox.dm | 8 +-- code/game/machinery/Beacon.dm | 2 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/machinery/doors/door.dm | 10 ++-- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/shutters.dm | 8 +-- code/game/machinery/hologram.dm | 2 +- code/game/machinery/magnet.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- code/game/machinery/overview.dm | 4 +- .../machinery/porta_turret/portable_turret.dm | 6 +-- .../porta_turret/portable_turret_cover.dm | 2 +- code/game/machinery/recycler.dm | 2 +- code/game/machinery/syndicatebeacon.dm | 2 +- code/game/machinery/syndicatebomb.dm | 2 +- code/game/machinery/transformer.dm | 2 +- code/game/machinery/vending.dm | 2 +- code/game/mecha/mecha.dm | 2 +- .../effects/decals/Cleanable/aliens.dm | 2 +- .../effects/decals/Cleanable/humans.dm | 6 +-- .../objects/effects/decals/Cleanable/misc.dm | 26 ++++----- .../effects/decals/Cleanable/robots.dm | 4 +- code/game/objects/effects/decals/crayon.dm | 4 +- code/game/objects/effects/decals/misc.dm | 11 ++-- .../effects/effect_system/effects_foam.dm | 2 +- code/game/objects/effects/glowshroom.dm | 2 +- code/game/objects/effects/mines.dm | 1 - code/game/objects/effects/misc.dm | 9 ---- code/game/objects/effects/overlays.dm | 10 ++-- .../game/objects/effects/spawners/lootdrop.dm | 2 +- code/game/objects/effects/spiders.dm | 2 +- code/game/objects/items/documents.dm | 2 +- .../objects/items/stacks/sheets/leather.dm | 4 +- .../objects/items/stacks/sheets/mineral.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 10 ++-- code/game/objects/structures/aliens.dm | 2 +- .../structures/beds_chairs/alien_nest.dm | 4 +- .../objects/structures/beds_chairs/chair.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 6 ++- code/game/objects/structures/flora.dm | 2 +- code/game/objects/structures/girders.dm | 3 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/lattice.dm | 2 +- code/game/objects/structures/morgue.dm | 2 +- code/game/objects/structures/plasticflaps.dm | 2 +- code/game/objects/structures/reflector.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- code/game/objects/structures/signs.dm | 2 +- code/game/objects/structures/table_frames.dm | 2 +- code/game/objects/structures/tables_racks.dm | 2 +- code/game/objects/structures/target_stake.dm | 2 +- .../structures/transit_tubes/transit_tube.dm | 2 +- .../transit_tube_construction.dm | 2 +- code/game/objects/structures/watercloset.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/closed.dm | 3 +- code/game/turfs/simulated/walls.dm | 3 +- .../atmospherics/environmental/LINDA_fire.dm | 2 +- .../atmospherics/gasmixtures/gas_types.dm | 2 +- .../atmospherics/machinery/atmosmachinery.dm | 1 + .../components/unary_devices/unary_devices.dm | 1 - .../components/unary_devices/vent_pump.dm | 4 +- .../components/unary_devices/vent_scrubber.dm | 4 +- .../atmospherics/machinery/pipes/pipes.dm | 1 - .../awaymissions/mission_code/wildwest.dm | 4 -- code/modules/events/anomaly_bluespace.dm | 2 +- code/modules/events/spacevine.dm | 6 +-- code/modules/flufftext/Hallucination.dm | 4 +- .../kitchen_machinery/icecream_vat.dm | 2 +- .../kitchen_machinery/juicer.dm | 2 +- .../kitchen_machinery/microwave.dm | 2 +- .../kitchen_machinery/monkeyrecycler.dm | 2 +- .../kitchen_machinery/processor.dm | 2 +- .../kitchen_machinery/smartfridge.dm | 2 +- code/modules/hydroponics/hydroponics.dm | 2 +- code/modules/lighting/lighting_system.dm | 3 +- code/modules/mining/equipment_locker.dm | 6 +-- .../mining/lavaland/necropolis_chests.dm | 2 +- code/modules/mining/lavaland/ruins/gym.dm | 4 +- code/modules/mining/lavaland/weather.dm | 4 +- code/modules/mining/lavaland/weather_types.dm | 6 +-- code/modules/mining/mine_items.dm | 6 +-- code/modules/mining/mine_turfs.dm | 6 +-- code/modules/mob/dead/observer/observer.dm | 2 +- code/modules/mob/inventory.dm | 4 +- .../mob/living/carbon/alien/humanoid/queen.dm | 2 +- .../mob/living/carbon/alien/larva/powers.dm | 4 +- .../mob/living/carbon/brain/brain_item.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/carbon/inventory.dm | 2 +- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/say.dm | 8 +-- .../mob/living/silicon/robot/inventory.dm | 6 +-- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../mob/living/simple_animal/bot/mulebot.dm | 4 +- .../mob/living/simple_animal/friendly/cat.dm | 2 +- .../simple_animal/friendly/cockroach.dm | 2 +- .../mob/living/simple_animal/friendly/dog.dm | 2 +- .../simple_animal/friendly/drone/inventory.dm | 2 +- .../friendly/drone/visuals_icons.dm | 4 +- .../simple_animal/guardian/types/lightning.dm | 2 +- .../simple_animal/hostile/megafauna/dragon.dm | 6 +-- .../hostile/megafauna/megafauna.dm | 2 +- .../simple_animal/hostile/mining_mobs.dm | 15 +++--- .../living/simple_animal/hostile/skeleton.dm | 1 - .../simple_animal/hostile/venus_human_trap.dm | 4 +- .../living/simple_animal/hostile/zombie.dm | 1 - .../mob/living/simple_animal/slime/powers.dm | 2 + .../mob/living/simple_animal/slime/slime.dm | 2 - .../mob/living/simple_animal/spawner.dm | 2 +- code/modules/mob/living/ventcrawling.dm | 2 +- code/modules/mob/mob.dm | 4 +- code/modules/mob/mob_defines.dm | 2 +- .../suit/n_suit_verbs/energy_net_nets.dm | 2 +- .../ninja/suit/n_suit_verbs/ninja_net.dm | 1 - code/modules/paperwork/paper.dm | 1 - code/modules/power/cable.dm | 2 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/lighting.dm | 4 +- .../power/singularity/containment_field.dm | 2 +- code/modules/power/singularity/singularity.dm | 2 +- code/modules/power/terminal.dm | 3 +- code/modules/projectiles/projectile.dm | 2 +- .../modules/projectiles/projectile/special.dm | 2 +- .../chemistry/machinery/reagentgrinder.dm | 2 +- code/modules/recycling/disposal-structures.dm | 2 +- .../spells/spell_types/ethereal_jaunt.dm | 2 +- code/modules/surgery/bodyparts/head.dm | 4 +- code/modules/vehicles/atv.dm | 8 +-- code/modules/vehicles/scooter.dm | 2 +- code/modules/vehicles/speedbike.dm | 6 +-- code/modules/vehicles/vehicle.dm | 2 +- tgstation.dme | 3 +- 156 files changed, 296 insertions(+), 280 deletions(-) create mode 100644 code/__DEFINES/layers.dm diff --git a/code/__DEFINES/layers.dm b/code/__DEFINES/layers.dm new file mode 100644 index 00000000000..06c7f4151df --- /dev/null +++ b/code/__DEFINES/layers.dm @@ -0,0 +1,54 @@ +//Defines for atom layers +//KEEP THESE IN A NICE ACSCENDING ORDER, PLEASE + +//#define TURF_LAYER 2 //For easy recordkeeping; this is a byond define +#define ABOVE_OPEN_TURF_LAYER 2.01 +#define CLOSED_TURF_LAYER 2.05 +#define ABOVE_NORMAL_TURF_LAYER 2.08 +#define LATTICE_LAYER 2.2 +#define DISPOSAL_PIPE_LAYER 2.3 +#define GAS_PIPE_LAYER 2.35 +#define WIRE_LAYER 2.4 +#define WIRE_TERMINAL_LAYER 2.45 +#define LOW_OBJ_LAYER 2.5 + +#define OPEN_DOOR_LAYER 2.7 +#define PROJECTILE_HIT_THRESHHOLD_LAYER 2.75 //projectiles won't hit objects at or below this layer if possible +#define TABLE_LAYER 2.8 +#define BELOW_OBJ_LAYER 2.9 +#define LOW_ITEM_LAYER 2.95 +//#define OBJ_LAYER 3 //For easy recordkeeping; this is a byond define +#define CLOSED_DOOR_LAYER 3.1 +#define CLOSED_FIREDOOR_LAYER 3.11 +#define ABOVE_OBJ_LAYER 3.2 +#define SIGN_LAYER 3.4 +#define HIGH_OBJ_LAYER 3.5 + +#define BELOW_MOB_LAYER 3.7 +#define LYING_MOB_LAYER 3.8 +//#define MOB_LAYER 4 //For easy recordkeeping; this is a byond define +#define ABOVE_MOB_LAYER 4.1 +#define WALL_OBJ_LAYER 4.25 +#define EDGED_TURF_LAYER 4.3 +#define ON_EDGED_TURF_LAYER 4.35 +#define LARGE_MOB_LAYER 4.4 +#define ABOVE_ALL_MOB_LAYER 4.5 + +#define SPACEVINE_LAYER 4.8 +#define SPACEVINE_MOB_LAYER 4.9 +//#define FLY_LAYER 5 //For easy recordkeeping; this is a byond define + +#define GHOST_LAYER 6 +#define AREA_LAYER 10 +#define MASSIVE_OBJ_LAYER 11 +#define POINT_LAYER 12 +#define LIGHTING_LAYER 15 + +//HUD layer defines +#define FLASH_LAYER 17.9 +#define FULLSCREEN_LAYER 18 +#define DAMAGE_LAYER 18.1 +#define BLIND_LAYER 18.2 +#define CRIT_LAYER 18.3 +#define HUD_LAYER 19 +#define ABOVE_HUD_LAYER 19.1 diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index 8e3dcd2aa39..66e4e1fd3c4 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -125,7 +125,7 @@ blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health blobpwrdisplay.mouse_opacity = 0 - blobpwrdisplay.layer = 20 + blobpwrdisplay.layer = ABOVE_HUD_LAYER infodisplay += blobpwrdisplay healths = new /obj/screen/healths/blob() diff --git a/code/_onclick/hud/demon.dm b/code/_onclick/hud/demon.dm index fc0d923e080..5ed4f9847b9 100644 --- a/code/_onclick/hud/demon.dm +++ b/code/_onclick/hud/demon.dm @@ -35,7 +35,7 @@ using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand1 - using.layer = 19 + using.layer = HUD_LAYER static_inventory += using using = new /obj/screen/inventory() @@ -43,7 +43,7 @@ using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand2 - using.layer = 19 + using.layer = HUD_LAYER static_inventory += using zone_select = new /obj/screen/zone_sel() diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index a0a74545db8..4831d736969 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,7 +1,3 @@ -#define FULLSCREEN_LAYER 18 -#define DAMAGE_LAYER FULLSCREEN_LAYER + 0.1 -#define BLIND_LAYER DAMAGE_LAYER + 0.1 -#define CRIT_LAYER BLIND_LAYER + 0.1 /mob var/list/screens = list() @@ -110,8 +106,3 @@ icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" - -#undef FULLSCREEN_LAYER -#undef BLIND_LAYER -#undef DAMAGE_LAYER -#undef CRIT_LAYER diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm index e1bacf6922d..2bbc92c7cd4 100644 --- a/code/_onclick/hud/other_mobs.dm +++ b/code/_onclick/hud/other_mobs.dm @@ -31,11 +31,11 @@ name = "Faith" icon_state = "deity_power" screen_loc = ui_deitypower - layer = 20 + layer = HUD_LAYER /obj/screen/deity_follower_display name = "Followers" icon_state = "deity_followers" screen_loc = ui_deityfollowers - layer = 20 + layer = HUD_LAYER diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index b13623a9bfd..7c69ae2a8a9 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -197,7 +197,7 @@ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" else A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = 20 + A.layer = ABOVE_HUD_LAYER x++ if(x == 4) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4cd7f81ecce..8fe5ec01029 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -9,7 +9,7 @@ /obj/screen name = "" icon = 'icons/mob/screen_gen.dmi' - layer = 20 + layer = ABOVE_HUD_LAYER unacidable = 1 appearance_flags = APPEARANCE_UI var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. @@ -29,7 +29,7 @@ maptext_width = 480 /obj/screen/swap_hand - layer = 19 + layer = HUD_LAYER name = "swap hand" /obj/screen/swap_hand/Click() @@ -60,7 +60,7 @@ var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. var/icon_empty // Icon when empty. For now used only by humans. var/icon_full // Icon when contains an item. For now used only by humans. - layer = 19 + layer = HUD_LAYER /obj/screen/inventory/Click() // At this point in client Click() code we have passed the 1/10 sec check and little else @@ -154,7 +154,7 @@ name = "drop" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_drop" - layer = 19 + layer = HUD_LAYER /obj/screen/drop/Click() usr.drop_item_v() @@ -289,7 +289,7 @@ name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" - layer = 19 + layer = HUD_LAYER /obj/screen/resist/Click() if(isliving(usr)) @@ -403,7 +403,7 @@ icon_state = "blank" blend_mode = BLEND_ADD screen_loc = "WEST,SOUTH to EAST,NORTH" - layer = 17 + layer = FLASH_LAYER /obj/screen/damageoverlay icon = 'icons/mob/screen_full.dmi' @@ -412,7 +412,7 @@ blend_mode = BLEND_MULTIPLY screen_loc = "CENTER-7,CENTER-7" mouse_opacity = 0 - layer = 18.1 //The black screen overlay sets layer to 18 to display it, this one has to be just on top. + layer = DAMAGE_LAYER /obj/screen/healths name = "health" diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index a8fbcf17bb9..50438376e89 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -71,7 +71,7 @@ var/const/tk_maxrange = 15 flags = NOBLUDGEON | ABSTRACT //item_state = null w_class = 10 - layer = 20 + layer = ABOVE_HUD_LAYER var/last_throw = 0 var/atom/movable/focus = null diff --git a/code/game/area/Space_Station_13_areas.dm b/code/game/area/Space_Station_13_areas.dm index bb4f8d28ffa..1077f37946c 100644 --- a/code/game/area/Space_Station_13_areas.dm +++ b/code/game/area/Space_Station_13_areas.dm @@ -19,7 +19,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station name = "Space" icon = 'icons/turf/areas.dmi' icon_state = "unknown" - layer = 10 + layer = AREA_LAYER mouse_opacity = 0 invisibility = INVISIBILITY_LIGHTING diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index d556f2a5b2e..2f7d234255b 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -26,7 +26,7 @@ /area/New() icon_state = "" - layer = 10 + layer = AREA_LAYER master = src uid = ++global_uid related = list(src) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 99e5a8205b7..4a2c0a330ee 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,5 +1,5 @@ /atom - layer = 2 + layer = TURF_LAYER var/level = 2 var/flags = 0 var/list/fingerprints diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 8952ff9b962..8d6d5705654 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,5 @@ /atom/movable - layer = 3 + layer = OBJ_LAYER var/last_move = null var/anchored = 0 var/throwing = 0 diff --git a/code/game/gamemodes/clock_cult/clock_objects.dm b/code/game/gamemodes/clock_cult/clock_objects.dm index da634d756e3..ee80c39f8cb 100644 --- a/code/game/gamemodes/clock_cult/clock_objects.dm +++ b/code/game/gamemodes/clock_cult/clock_objects.dm @@ -1317,7 +1317,7 @@ icon = 'icons/effects/96x96.dmi' pixel_x = -30 pixel_y = -30 - layer = 2.01 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/clockwork/judicial_marker/New() ..() @@ -1438,7 +1438,7 @@ desc = "Some big guy." clockwork_desc = "One of Ratvar's generals." alpha = 200 - layer = 10 + layer = MASSIVE_OBJ_LAYER /obj/effect/clockwork/general_marker/New() ..() diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm index c3cbc6f5aac..2d10a958b95 100644 --- a/code/game/gamemodes/clock_cult/clock_ratvar.dm +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -1,7 +1,7 @@ /obj/structure/clockwork/massive //For objects that are typically very large name = "massive construct" desc = "A very large construction." - layer = 10 + layer = MASSIVE_OBJ_LAYER /obj/structure/clockwork/massive/celestial_gateway //The gateway to Reebe, from which Ratvar emerges name = "Gateway to the Celestial Derelict" diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index ebc7070d780..73ec9b1982c 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -189,7 +189,7 @@ /obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands) . = list() if(!isinhands && current_charges) - . += image(layer = MOB_LAYER+0.05, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") + . += image(layer = MOB_LAYER+0.01, icon = 'icons/effects/effects.dmi', icon_state = "shield-cult") /obj/item/clothing/suit/hooded/cultrobes/berserker name = "flagellant's robes" diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index ba4d77b455c..293ccca04ae 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -22,7 +22,7 @@ To draw a rune, use an arcane tome. icon = 'icons/obj/rune.dmi' icon_state = "1" unacidable = 1 - layer = TURF_LAYER + 0.08 + layer = ABOVE_NORMAL_TURF_LAYER color = rgb(255,0,0) var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked. diff --git a/code/game/gamemodes/demon/true_demon/inventory.dm b/code/game/gamemodes/demon/true_demon/inventory.dm index 23035370135..b288fab269c 100644 --- a/code/game/gamemodes/demon/true_demon/inventory.dm +++ b/code/game/gamemodes/demon/true_demon/inventory.dm @@ -20,7 +20,7 @@ hands_overlays += r_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = 20 + r_hand.layer = ABOVE_HUD_LAYER r_hand.screen_loc = ui_rhand client.screen |= r_hand @@ -35,7 +35,7 @@ hands_overlays += l_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = 20 + l_hand.layer = ABOVE_HUD_LAYER l_hand.screen_loc = ui_lhand client.screen |= l_hand if(hands_overlays.len) diff --git a/code/game/gamemodes/gang/dominator.dm b/code/game/gamemodes/gang/dominator.dm index bc1236d7d0e..d53fe91186a 100644 --- a/code/game/gamemodes/gang/dominator.dm +++ b/code/game/gamemodes/gang/dominator.dm @@ -5,7 +5,7 @@ icon_state = "dominator" density = 1 anchored = 1 - layer = 3.6 + layer = HIGH_OBJ_LAYER var/maxhealth = 200 var/health = 200 var/datum/gang/gang diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm index 4aa0633f3be..aac99630f9e 100644 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm @@ -389,7 +389,7 @@ /obj/effect/overlay/temp/swarmer //temporary swarmer visual feedback objects icon = 'icons/mob/swarmer.dmi' - layer = MOB_LAYER + layer = BELOW_MOB_LAYER /obj/effect/overlay/temp/swarmer/disintegration icon_state = "disintegrate" diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 7ca8a800923..8f30a8bfca4 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -18,7 +18,7 @@ invisibility = INVISIBILITY_REVENANT health = INFINITY //Revenants don't use health, they use essence instead maxHealth = INFINITY - layer = 5 + layer = GHOST_LAYER healable = 0 sight = SEE_SELF see_invisible = SEE_INVISIBLE_NOLIGHTING diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 418a878733d..67600b7e11a 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -48,7 +48,7 @@ var/bomb_set icon = 'icons/obj/machines/nuke_terminal.dmi' icon_state = "nuclearbomb_base" anchored = 1 //stops it being moved - layer = 4 + layer = MOB_LAYER /obj/machinery/nuclearbomb/syndicate diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index 9f61521660c..d13a9d588fd 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -145,28 +145,28 @@ var/hsboxspawn = 1 P.wear_suit.layer = initial(P.wear_suit.layer) P.wear_suit = null P.wear_suit = new/obj/item/clothing/suit/space(P) - P.wear_suit.layer = 20 + P.wear_suit.layer = ABOVE_HUD_LAYER P.update_inv_wear_suit() if(P.head) P.head.loc = P.loc P.head.layer = initial(P.head.layer) P.head = null P.head = new/obj/item/clothing/head/helmet/space(P) - P.head.layer = 20 + P.head.layer = ABOVE_HUD_LAYER P.update_inv_head() if(P.wear_mask) P.wear_mask.loc = P.loc P.wear_mask.layer = initial(P.wear_mask.layer) P.wear_mask = null P.wear_mask = new/obj/item/clothing/mask/gas(P) - P.wear_mask.layer = 20 + P.wear_mask.layer = ABOVE_HUD_LAYER P.update_inv_wear_mask() if(P.back) P.back.loc = P.loc P.back.layer = initial(P.back.layer) P.back = null P.back = new/obj/item/weapon/tank/jetpack/oxygen(P) - P.back.layer = 20 + P.back.layer = ABOVE_HUD_LAYER P.update_inv_back() P.internal = P.back P.update_internals_hud_icon(1) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 4121a1baefd..a995968f4f0 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -5,7 +5,7 @@ name = "bluespace gigabeacon" desc = "A device that draws power from bluespace and creates a permanent tracking beacon." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 0 diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index acf294fd25c..e75c9827e14 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -2,7 +2,7 @@ name = "\improper AI liquid dispenser" icon = 'icons/obj/device.dmi' icon_state = "motion3" - layer = 3 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER anchored = 1 var/uses = 20 var/disabled = 1 diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index b916029f14e..5ba7192f8bd 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -10,7 +10,7 @@ use_power = 2 idle_power_usage = 5 active_power_usage = 10 - layer = MOB_LAYER + 0.25 + layer = WALL_OBJ_LAYER var/health = 50 var/list/network = list("SS13") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 5a4292e3e42..b57a640508d 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -986,7 +986,7 @@ var/list/airlock_overlays = list() sleep(5) src.density = 0 sleep(9) - src.layer = 2.7 + src.layer = OPEN_DOOR_LAYER update_icon(AIRLOCK_OPEN, 1) SetOpacity(0) operating = 0 @@ -1023,7 +1023,7 @@ var/list/airlock_overlays = list() return 1 operating = 1 update_icon(AIRLOCK_CLOSING, 1) - src.layer = 3.1 + src.layer = CLOSED_DOOR_LAYER sleep(5) src.density = 1 if(!safe) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 81f3a3af60d..015c78b195a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -6,7 +6,7 @@ anchored = 1 opacity = 1 density = 1 - layer = 2.7 + layer = OPEN_DOOR_LAYER power_channel = ENVIRON var/secondsElectrified = 0 @@ -19,7 +19,7 @@ var/heat_proof = 0 // For rglass-windowed airlocks and firedoors var/emergency = 0 // Emergency access override var/sub_door = 0 // 1 if it's meant to go under another door. - var/closingLayer = 3.1 + var/closingLayer = CLOSED_DOOR_LAYER var/autoclose = 0 //does it automatically close after some time var/safe = 1 //whether the door detects things and mobs in its way and reopen or crushes them. var/locked = 0 //whether the door is bolted or not. @@ -29,9 +29,9 @@ /obj/machinery/door/New() ..() if(density) - layer = 3.1 //Above most items if closed + layer = CLOSED_DOOR_LAYER //Above most items if closed else - layer = 2.7 //Under all objects if opened. 2.7 due to tables being at 2.6 + layer = OPEN_DOOR_LAYER //Under all objects if opened. 2.7 due to tables being at 2.6 update_freelook_sight() air_update_turf(1) airlocks += src @@ -245,7 +245,7 @@ obj/machinery/door/proc/try_to_crowbar(obj/item/I, mob/user) sleep(5) density = 0 sleep(5) - layer = 2.7 + layer = OPEN_DOOR_LAYER update_icon() SetOpacity(0) operating = 0 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index e2d5046c0d3..b94612e7d3f 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -18,7 +18,7 @@ glass = 1 var/nextstate = null sub_door = 1 - closingLayer = 3.11 + closingLayer = CLOSED_FIREDOOR_LAYER /obj/machinery/door/firedoor/Bumped(atom/AM) if(panel_open || operating) diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm index 75fa01a2979..9c114009071 100644 --- a/code/game/machinery/doors/shutters.dm +++ b/code/game/machinery/doors/shutters.dm @@ -3,7 +3,7 @@ name = "shutters" desc = "Heavy duty metal shutters that opens mechanically." icon = 'icons/obj/doors/shutters.dmi' - layer = 3.1 + layer = CLOSED_DOOR_LAYER /obj/machinery/door/poddoor/shutters/preopen icon_state = "open" @@ -15,14 +15,14 @@ /obj/machinery/door/poddoor/shutters/New() ..() - layer = 3.1 //to handle /obj/machinery/door/New() resetting the layer. + layer = CLOSED_DOOR_LAYER //to handle /obj/machinery/door/New() resetting the layer. /obj/machinery/door/poddoor/shutters/open(ignorepower = 0) ..() - layer = 3.1 + layer = CLOSED_DOOR_LAYER /obj/machinery/door/poddoor/shutters/close(ignorepower = 0) ..() - layer = 3.1 \ No newline at end of file + layer = CLOSED_DOOR_LAYER \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 49bf6e7d916..f776b3929fd 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -35,7 +35,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED name = "\improper AI holopad" desc = "It's a floor-mounted device for projecting holographic images. It is activated remotely." icon_state = "holopad0" - layer = 2.1 + layer = LOW_OBJ_LAYER flags = HEAR languages = ROBOT | HUMAN var/list/masters = list()//List of AIs that use the holopad diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index 0eb8c805d4c..56267483da4 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -11,7 +11,7 @@ name = "electromagnetic generator" desc = "A device that uses station power to create points of magnetic energy." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 50 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 0bf936413c2..9b644c909bc 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -8,7 +8,7 @@ name = "navigation beacon" desc = "A radio beacon used for bot navigation." level = 1 // underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER anchored = 1 var/open = 0 // true if cover is open diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index a920d418d14..06c78ba1905 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -178,7 +178,7 @@ qdel(I) qdel(J) H.icon = HI - H.layer = 25 + H.layer = ABOVE_HUD_LAYER usr.mapobjs += H #else @@ -296,7 +296,7 @@ H.icon = I qdel(I) - H.layer = 25 + H.layer = ABOVE_HUD_LAYER usr.mapobjs += H #endif diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index d015bb1a975..6a67e4e3f07 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "grey_target_prism" anchored = 1 - layer = 3 + layer = OBJ_LAYER invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover density = 1 use_power = 1 //this turret uses and requires power @@ -502,7 +502,7 @@ if(cover) cover.icon_state = "openTurretCover" raised = 1 - layer = 4 + layer = MOB_LAYER /obj/machinery/porta_turret/proc/popDown() //pops the turret down if(disabled) @@ -511,7 +511,7 @@ return if(stat & BROKEN) return - layer = 3 + layer = OBJ_LAYER raising = 1 if(cover) flick("popdown", cover) diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm index a65694405a7..bb399096382 100644 --- a/code/game/machinery/porta_turret/portable_turret_cover.dm +++ b/code/game/machinery/porta_turret/portable_turret_cover.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/turrets.dmi' icon_state = "turretCover" anchored = 1 - layer = 3.5 + layer = HIGH_OBJ_LAYER density = 0 var/obj/machinery/porta_turret/parent_turret = null diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index 319ce51d949..4b37378f666 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -5,7 +5,7 @@ var/const/SAFETY_COOLDOWN = 100 desc = "A large crushing machine which is used to recycle small items ineffeciently; there are lights on the side of it." icon = 'icons/obj/recycling.dmi' icon_state = "grinder-o0" - layer = MOB_LAYER+1 // Overhead + layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = 1 density = 1 var/safety_mode = FALSE // Temporarily stops machine if it detects a mob diff --git a/code/game/machinery/syndicatebeacon.dm b/code/game/machinery/syndicatebeacon.dm index c0658a1fdc5..3243e0cf5fb 100644 --- a/code/game/machinery/syndicatebeacon.dm +++ b/code/game/machinery/syndicatebeacon.dm @@ -111,7 +111,7 @@ anchored = 0 density = 1 - layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS stat = 0 var/active = 0 diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index a947c472511..26692706d2a 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -7,7 +7,7 @@ anchored = 0 density = 0 - layer = MOB_LAYER - 0.2 //so people can't hide it and it's REALLY OBVIOUS + layer = BELOW_MOB_LAYER //so people can't hide it and it's REALLY OBVIOUS unacidable = 1 var/timer = 60 diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm index 1b18ea95e3a..3145ab44da8 100644 --- a/code/game/machinery/transformer.dm +++ b/code/game/machinery/transformer.dm @@ -3,7 +3,7 @@ desc = "A large metallic machine with an entrance and an exit. A sign on the side reads, 'human go in, robot come out', human must be lying down and alive. Has to cooldown between each use." icon = 'icons/obj/recycling.dmi' icon_state = "separator-AO1" - layer = MOB_LAYER+1 // Overhead + layer = ABOVE_ALL_MOB_LAYER // Overhead anchored = 1 density = 0 var/transform_dead = 0 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 53800726166..edfe1f58dc8 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -15,7 +15,7 @@ desc = "A generic vending machine." icon = 'icons/obj/vending.dmi' icon_state = "generic" - layer = 2.9 + layer = BELOW_OBJ_LAYER anchored = 1 density = 1 verb_say = "beeps" diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 6c62de01260..afdd7191fa8 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -20,7 +20,7 @@ opacity = 1 ///opaque. Menacing. anchored = 1 //no pulling around. unacidable = 1 //and no deleting hoomans inside - layer = MOB_LAYER - 0.2//icon draw layer + layer = BELOW_MOB_LAYER//icon draw layer infra_luminosity = 15 //byond implementation is bugged. force = 5 flags = HEAR diff --git a/code/game/objects/effects/decals/Cleanable/aliens.dm b/code/game/objects/effects/decals/Cleanable/aliens.dm index 7e358f18fb4..36bf7577bb1 100644 --- a/code/game/objects/effects/decals/Cleanable/aliens.dm +++ b/code/game/objects/effects/decals/Cleanable/aliens.dm @@ -5,7 +5,7 @@ desc = "It's green and acidic. It looks like... blood?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 20c32cca078..e6e90cbde1c 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -3,7 +3,7 @@ desc = "It's red and gooey. Perhaps it's the chef's cooking?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "floor1" random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7") @@ -38,7 +38,7 @@ desc = "Your instincts say you shouldn't be following these." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER random_icon_states = null var/list/existing_dirs = list() blood_DNA = list() @@ -53,7 +53,7 @@ desc = "They look bloody and gruesome." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "gibbl5" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6") diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index b4d66d84595..f7f4f5fe953 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -3,7 +3,7 @@ desc = "Someone should clean that up." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/obj/objects.dmi' icon_state = "shards" @@ -26,7 +26,7 @@ icon_state = "dirt" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER mouse_opacity = 0 /obj/effect/decal/cleanable/flour @@ -34,7 +34,7 @@ desc = "It's still good. Four second rule!" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon_state = "flour" /obj/effect/decal/cleanable/greenglow @@ -42,7 +42,7 @@ desc = "Jeez. I hope that's not for lunch." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER luminosity = 1 icon_state = "greenglow" @@ -53,7 +53,7 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - layer = 3 + layer = OBJ_LAYER icon_state = "cobweb1" burntime = 1 @@ -64,7 +64,7 @@ name = "gooey grey mass" desc = "It looks like a melted... something." density = 0 - layer = 3 + layer = OBJ_LAYER icon = 'icons/obj/chemical.dmi' icon_state = "molten" @@ -72,7 +72,7 @@ name = "cobweb" desc = "Somebody should remove that." density = 0 - layer = 3 + layer = OBJ_LAYER icon_state = "cobweb2" //Vomit (sorry) @@ -81,7 +81,7 @@ desc = "Gosh, how unpleasant." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/blood.dmi' icon_state = "vomit_1" random_icon_states = list("vomit_1", "vomit_2", "vomit_3", "vomit_4") @@ -113,14 +113,14 @@ name = "tomato smudge" desc = "It's red." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("tomato_floor1", "tomato_floor2", "tomato_floor3") /obj/effect/decal/cleanable/plant_smudge name = "plant smudge" density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_plant") @@ -128,7 +128,7 @@ name = "smashed egg" desc = "Seems like this one won't hatch." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_egg1", "smashed_egg2", "smashed_egg3") @@ -136,7 +136,7 @@ name = "smashed pie" desc = "It's pie cream from a cream pie." density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/effects/tomatodecal.dmi' random_icon_states = list("smashed_pie") @@ -153,7 +153,7 @@ icon_state = "shreds" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/cleanable/shreds/New() pixel_x = rand(-5, 5) diff --git a/code/game/objects/effects/decals/Cleanable/robots.dm b/code/game/objects/effects/decals/Cleanable/robots.dm index af2ff562590..e255f497ca2 100644 --- a/code/game/objects/effects/decals/Cleanable/robots.dm +++ b/code/game/objects/effects/decals/Cleanable/robots.dm @@ -5,7 +5,7 @@ desc = "It's a useless heap of junk... or is it?" gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "gib1" random_icon_states = list("gib1", "gib2", "gib3", "gib4", "gib5", "gib6", "gib7") @@ -44,7 +44,7 @@ desc = "It's black and greasy. Looks like Beepsky made another mess." gender = PLURAL density = 0 - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/robots.dmi' icon_state = "floor1" var/viruses = list() diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index 2f5bd9ea000..2948ada90d0 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -3,7 +3,7 @@ desc = "Graffiti. Damn kids." icon = 'icons/effects/crayondecal.dmi' icon_state = "rune1" - layer = 2.1 + layer = ABOVE_NORMAL_TURF_LAYER var/do_icon_rotate = TRUE /obj/effect/decal/cleanable/crayon/examine() @@ -31,7 +31,7 @@ /obj/effect/decal/cleanable/crayon/gang - layer = 3.6 //Harder to hide + layer = HIGH_OBJ_LAYER //Harder to hide do_icon_rotate = FALSE //These are designed to always face south, so no rotation please. var/datum/gang/gang diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 8daf88c6c42..762c702df1c 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -2,7 +2,7 @@ name = "pointer" icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" - layer = 16 + layer = POINT_LAYER duration = 25 /obj/effect/overlay/temp/point/New(atom/target, set_invis = 0) @@ -12,23 +12,18 @@ pixel_y = target.pixel_y invisibility = set_invis -// Used for spray that you spray at walls, tables, hydrovats etc -/obj/effect/decal/spraystill - density = 0 - layer = 50 - //Used by spraybottles. /obj/effect/decal/chempuff name = "chemicals" icon = 'icons/obj/chempuff.dmi' pass_flags = PASSTABLE | PASSGRILLE - layer = 5 + layer = FLY_LAYER /obj/effect/decal/sandeffect name = "sandy tile" icon = 'icons/turf/floors.dmi' icon_state = "sandeffect" - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER /obj/effect/decal/fakelattice name = "lattice" diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 54e57af855e..6dbf2b473e9 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -7,7 +7,7 @@ opacity = 0 anchored = 1 density = 0 - layer = MOB_LAYER + 0.5 + layer = ABOVE_ALL_MOB_LAYER mouse_opacity = 0 var/amount = 3 animate_movement = 0 diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 47dabfaf579..fd07e31986d 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -7,7 +7,7 @@ density = 0 icon = 'icons/obj/lighting.dmi' icon_state = "glowshroom" //replaced in New - layer = 2.1 + layer = ABOVE_NORMAL_TURF_LAYER var/endurance = 30 var/potency = 30 var/delay = 1200 diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index d39257edbcf..8c16eb5533f 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -3,7 +3,6 @@ desc = "Better stay away from that thing." density = 0 anchored = 1 - layer = 3 icon = 'icons/obj/weapons.dmi' icon_state = "uglymine" var/triggered = 0 diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 4d621cf0fdd..712d8c6c59f 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -7,15 +7,6 @@ density = 1 anchored = 0 -/obj/effect/mark - var/mark = "" - icon = 'icons/misc/mark.dmi' - icon_state = "blank" - anchored = 1 - layer = 99 - mouse_opacity = 0 - unacidable = 1//Just to be sure. - /obj/effect/beam name = "beam" unacidable = 1//Just to be sure. diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index c929d74e5ca..79ce9abe797 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -22,7 +22,7 @@ /obj/effect/overlay/temp icon_state = "nothing" anchored = 1 - layer = 4.1 + layer = ABOVE_MOB_LAYER mouse_opacity = 0 var/duration = 10 var/randomdir = 1 @@ -117,7 +117,7 @@ /obj/effect/overlay/temp/cult/door name = "unholy glow" icon_state = "doorglow" - layer = 3.17 //above closed doors + layer = CLOSED_FIREDOOR_LAYER //above closed doors /obj/effect/overlay/temp/cult/door/unruned icon_state = "unruneddoorglow" @@ -125,7 +125,7 @@ /obj/effect/overlay/temp/cult/turf name = "unholy glow" icon_state = "wallglow" - layer = TURF_LAYER + 0.07 + layer = ABOVE_NORMAL_TURF_LAYER /obj/effect/overlay/temp/cult/turf/open/floor icon_state = "floorglow" @@ -179,7 +179,7 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm1" density = 1 - layer = 5 + layer = WALL_OBJ_LAYER anchored = 1 /obj/effect/overlay/palmtree_l @@ -187,7 +187,7 @@ icon = 'icons/misc/beach2.dmi' icon_state = "palm2" density = 1 - layer = 5 + layer = WALL_OBJ_LAYER anchored = 1 /obj/effect/overlay/coconut diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 47c439f0a4e..e4c4ba33fa4 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -94,7 +94,7 @@ /obj/item/stack/rods{amount = 50} = 1, /obj/item/stack/sheet/cardboard = 2, /obj/item/stack/sheet/metal{amount = 20} = 1, - /obj/item/stack/sheet/mineral/plasma{layer = 2.9} = 1, + /obj/item/stack/sheet/mineral/plasma = 1, /obj/item/stack/sheet/rglass = 1, /obj/item/weapon/book/manual/wiki/engineering_construction = 1, /obj/item/weapon/book/manual/wiki/engineering_hacking = 1, diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index b8d0a99bba9..2ed341eca59 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -98,7 +98,7 @@ desc = "It never stays still for long." icon_state = "spiderling" anchored = 0 - layer = 2.75 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER health = 3 var/amount_grown = 0 var/grow_as = null diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index 043fcd80cb0..1fbfb9490a6 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -8,7 +8,7 @@ w_class = 1 throw_range = 1 throw_speed = 1 - layer = 4 + layer = MOB_LAYER pressure_resistance = 1 /obj/item/documents/nanotrasen diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index f2b9bcd472b..22bcc0d2dcb 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -155,7 +155,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ singular_name = "hide plate" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER /obj/item/stack/sheet/animalhide/ashdrake name = "ash drake hide" @@ -165,7 +165,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \ singular_name = "drake plate" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER //Step one - dehairing. diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index 0b5fa01aff8..ca32e2890b7 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -63,7 +63,7 @@ var/global/list/datum/stack_recipe/sandstone_recipes = list ( \ icon_state = "sandbags" singular_name = "sandbag" force = 5 - layer = 2.95 + layer = LOW_ITEM_LAYER throwforce = 5 w_class = 3 throw_speed = 1 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index e09e732ddcf..7947a228a35 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -157,7 +157,7 @@ boxes.screen_loc = "[tx]:,[ty] to [mx],[my]" for(var/obj/O in contents) O.screen_loc = "[cx],[cy]" - O.layer = 20 + O.layer = ABOVE_HUD_LAYER cx++ if(cx > mx) cx = tx @@ -176,7 +176,7 @@ ND.sample_object.mouse_opacity = 2 ND.sample_object.screen_loc = "[cx]:16,[cy]:16" ND.sample_object.maptext = "[(ND.number > 1)? "[ND.number]" : ""]" - ND.sample_object.layer = 20 + ND.sample_object.layer = ABOVE_HUD_LAYER cx++ if(cx > (4+cols)) cx = 4 @@ -186,7 +186,7 @@ O.mouse_opacity = 2 //This is here so storage items that spawn with contents correctly have the "click around item to equip" O.screen_loc = "[cx]:16,[cy]:16" O.maptext = "" - O.layer = 20 + O.layer = ABOVE_HUD_LAYER cx++ if(cx > (4+cols)) cx = 4 @@ -464,11 +464,11 @@ boxes.master = src boxes.icon_state = "block" boxes.screen_loc = "7,7 to 10,8" - boxes.layer = 19 + boxes.layer = HUD_LAYER closer = new /obj/screen/close() closer.master = src closer.icon_state = "backpack_close" - closer.layer = 20 + closer.layer = ABOVE_HUD_LAYER orient2hud() diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index ffe82b4c3c3..be576ce514b 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -162,7 +162,7 @@ desc = "A thick resin surface covers the floor." anchored = 1 density = 0 - layer = TURF_LAYER + 0.09 + layer = TURF_LAYER icon_state = "weeds" health = 15 var/obj/structure/alien/weeds/node/linked_node = null diff --git a/code/game/objects/structures/beds_chairs/alien_nest.dm b/code/game/objects/structures/beds_chairs/alien_nest.dm index 5186309b65e..afa7633b420 100644 --- a/code/game/objects/structures/beds_chairs/alien_nest.dm +++ b/code/game/objects/structures/beds_chairs/alien_nest.dm @@ -14,7 +14,7 @@ var/image/nest_overlay /obj/structure/bed/nest/New() - nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=MOB_LAYER - 0.2) + nest_overlay = image('icons/mob/alien.dmi', "nestoverlay", layer=LYING_MOB_LAYER) return ..() /obj/structure/bed/nest/user_unbuckle_mob(mob/living/buckled_mob, mob/living/user) @@ -73,7 +73,7 @@ if(M in buckled_mobs) M.pixel_y = 0 M.pixel_x = initial(M.pixel_x) + 2 - M.layer = MOB_LAYER - 0.3 + M.layer = BELOW_MOB_LAYER overlays += nest_overlay else M.pixel_x = M.get_standard_pixel_x_offset(M.lying) diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index faf3b4b8cb3..c91e5d5978e 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -162,7 +162,7 @@ /obj/structure/chair/comfy/New() armrest = image("icons/obj/chairs.dmi", "comfychair_armrest") - armrest.layer = MOB_LAYER + 0.1 + armrest.layer = ABOVE_MOB_LAYER return ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 415139938a2..535966a09f8 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -11,7 +11,7 @@ LINEN BINS icon_state = "sheetwhite" item_state = "bedsheet" slot_flags = SLOT_BACK - layer = 4 + layer = MOB_LAYER throwforce = 0 throw_speed = 1 throw_range = 2 @@ -28,9 +28,11 @@ LINEN BINS /obj/item/weapon/bedsheet/attack_self(mob/user) user.drop_item() if(layer == initial(layer)) - layer = 5 + layer = ABOVE_MOB_LAYER + user << "You cover yourself with [src]." else layer = initial(layer) + user << "You smooth [src] out beneath you." add_fingerprint(user) return diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 8bf04d32eea..46d5f54b002 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -8,7 +8,7 @@ anchored = 1 density = 1 pixel_x = -16 - layer = 9 + layer = FLY_LAYER var/cut = FALSE var/log_amount = 10 diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 6d2412589de..ed54a367368 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -9,7 +9,7 @@ icon_state = "girder" anchored = 1 density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/state = GIRDER_NORMAL var/girderpasschance = 20 // percentage chance that a projectile passes through the girder. var/can_displace = TRUE //If the girder can be moved around by wrenching it @@ -291,7 +291,6 @@ anchored = 0 state = GIRDER_DISPLACED girderpasschance = 25 - layer = 2.45 /obj/structure/girder/reinforced name = "reinforced girder" diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 745d27a0e5c..b2b5bf94732 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -7,7 +7,7 @@ anchored = 1 flags = CONDUCT pressure_resistance = 5*ONE_ATMOSPHERE - layer = 2.9 + layer = BELOW_OBJ_LAYER var/health = 10 var/destroyed = 0 var/obj/item/stack/rods/stored diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index c676d5882ce..399253f5a17 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -5,7 +5,7 @@ icon_state = "lattice" density = 0 anchored = 1 - layer = 2.3 //under pipes + layer = LATTICE_LAYER //under pipes var/obj/item/stack/rods/stored canSmoothWith = list(/obj/structure/lattice, /turf/open/floor, diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 03b9f323307..e142ca61091 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -211,7 +211,7 @@ var/global/list/crematoriums = new/list() /obj/structure/tray icon = 'icons/obj/stationobjs.dmi' density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/obj/structure/bodycontainer/connected = null anchored = 1 pass_flags = LETPASSTHROW diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index ee8c28788a9..69603d9c9ed 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -5,7 +5,7 @@ icon_state = "plasticflaps" density = 0 anchored = 1 - layer = 4 + layer = ABOVE_MOB_LAYER /obj/structure/plasticflaps/CanAStarPass(ID, to_dir, caller) if(istype(caller, /mob/living)) diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm index 1fd47bc35e9..ce55d863179 100644 --- a/code/game/objects/structures/reflector.dm +++ b/code/game/objects/structures/reflector.dm @@ -5,7 +5,7 @@ desc = "An angled mirror for reflecting lasers. This one does so at a 90 degree angle." anchored = 0 density = 1 - layer = 2.9 + layer = BELOW_OBJ_LAYER var/finished = 0 var/admin = 0 //Can't be rotated or deconstructed var/framebuildstacktype = /obj/item/stack/sheet/metal diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 51679ceedf2..8cd1b6b101d 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -177,7 +177,7 @@ obj/structure/safe/ex_act(severity, target) icon_state = "floorsafe" density = 0 level = 1 //underfloor - layer = 2.5 + layer = LOW_OBJ_LAYER /obj/structure/safe/floor/initialize() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index 28cc59a701b..df5050da450 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -3,7 +3,7 @@ anchored = 1 opacity = 0 density = 0 - layer = 3.5 + layer = SIGN_LAYER /obj/structure/sign/basic name = "blank sign" diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index c9e6167f88f..7dc62153c5d 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -16,7 +16,7 @@ icon_state = "table_frame" density = 0 anchored = 0 - layer = 2.8 + layer = PROJECTILE_HIT_THRESHHOLD_LAYER var/framestack = /obj/item/stack/rods var/framestackamount = 2 diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index cf16100d401..a4dfb691ee1 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -19,7 +19,7 @@ icon_state = "table" density = 1 anchored = 1 - layer = 2.8 + layer = TABLE_LAYER climbable = TRUE pass_flags = LETPASSTHROW //You can throw objects over this, despite it's density.") var/frame = /obj/structure/table_frame diff --git a/code/game/objects/structures/target_stake.dm b/code/game/objects/structures/target_stake.dm index 0c931eb3b53..0a0d96eac20 100644 --- a/code/game/objects/structures/target_stake.dm +++ b/code/game/objects/structures/target_stake.dm @@ -27,7 +27,7 @@ pinned_target = T T.pinnedLoc = src T.density = 1 - T.layer = OBJ_LAYER + 0.1 + T.layer = OBJ_LAYER + 0.01 T.loc = loc user << "You slide the target into the stake." diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index bb7cc05d07c..5c42bb22445 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "E-W" density = 1 - layer = 3.1 + layer = ABOVE_OBJ_LAYER anchored = 1 var/tube_construction = /obj/structure/c_transit_tube var/list/tube_dirs = null diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm index ffcacef2f4b..8ce01aa0305 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi' icon_state = "E-W" //icon_state decides which tube will be built density = 0 - layer = 3.1 //same as the built tube + layer = ABOVE_OBJ_LAYER //same as the built tube anchored = 0 /obj/structure/c_transit_tube/examine(mob/user) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 58f58411ecb..fea81bd9dcc 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -147,7 +147,7 @@ name = "mist" icon = 'icons/obj/watercloset.dmi' icon_state = "mist" - layer = MOB_LAYER + 1 + layer = FLY_LAYER anchored = 1 mouse_opacity = 0 diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 5b37185a6b2..15f57b2c55e 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -3,7 +3,7 @@ desc = "A window." icon_state = "window" density = 1 - layer = 3.2//Just above doors + layer = ABOVE_OBJ_LAYER //Just above doors pressure_resistance = 4*ONE_ATMOSPHERE anchored = 1 //initially is 0 for tile smoothing flags = ON_BORDER diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 8384ac130e1..69058118212 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -1,6 +1,6 @@ /turf/closed var/thermite = 0 - + layer = CLOSED_TURF_LAYER opacity = 1 density = 1 blocks_air = 1 @@ -9,7 +9,6 @@ name = "wall" icon = 'icons/turf/walls.dmi' explosion_block = 50 - layer = TURF_LAYER + 0.05 /turf/closed/indestructible/splashscreen name = "Space Station 13" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 98c55e9c555..bec463937c6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -5,7 +5,6 @@ icon_state = "wall" var/mineral = "metal" explosion_block = 1 - layer = TURF_LAYER + 0.05 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT heat_capacity = 312500 //a little over 5 cm thick , 312500 for 1 m by 2.5 m by 0.25 m plasteel wall @@ -223,7 +222,7 @@ O.anchored = 1 O.opacity = 1 O.density = 1 - O.layer = 5 + O.layer = FLY_LAYER playsound(src, 'sound/items/Welder.ogg', 100, 1) diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 893df8ead12..8f43cb52da0 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -49,7 +49,7 @@ unacidable = 1//So you can't melt fire with acid. icon = 'icons/effects/fire.dmi' icon_state = "1" - layer = TURF_LAYER + layer = ABOVE_OPEN_TURF_LAYER luminosity = 3 var/volume = 125 diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm index 5188750f085..244f8b1cd71 100644 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ b/code/modules/atmospherics/gasmixtures/gas_types.dm @@ -76,7 +76,7 @@ var/list/hardcoded_gases = list("o2","n2","co2","plasma") //the main four gases, /obj/effect/overlay/gas/ icon = 'icons/effects/tile_effects.dmi' mouse_opacity = 0 - layer = 5 + layer = FLY_LAYER appearance_flags = RESET_COLOR|TILE_BOUND /obj/effect/overlay/gas/New(state) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 7997c832e00..891c4bb1e5d 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -15,6 +15,7 @@ Pipelines + Other Objects -> Pipe network active_power_usage = 0 power_channel = ENVIRON on_blueprints = TRUE + layer = GAS_PIPE_LAYER //under wires var/nodealert = 0 var/can_unwrench = 0 var/initialize_directions = 0 diff --git a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm index f2dfa858d17..807980318e1 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/unary_devices.dm @@ -2,7 +2,6 @@ icon = 'icons/obj/atmospherics/components/unary_devices.dmi' dir = SOUTH initialize_directions = SOUTH - layer = TURF_LAYER+0.1 device_type = UNARY /obj/machinery/atmospherics/components/unary/SetInitDirections() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 55ac2266861..06a369e647e 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -259,7 +259,7 @@ user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) return 0 else return ..() @@ -289,7 +289,7 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the vent", "You hear loud scraping noises.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index b9c727da0a6..5c60897d1dc 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -308,7 +308,7 @@ user.visible_message("[user] unwelds the scrubber.", "You unweld the scrubber.", "You hear welding.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) return 0 else return ..() @@ -329,7 +329,7 @@ user.visible_message("[user] furiously claws at [src]!", "You manage to clear away the stuff blocking the scrubber.", "You hear loud scraping noises.") welded = 0 update_icon() - pipe_vision_img = image(src, loc, layer = 20, dir = dir) + pipe_vision_img = image(src, loc, layer = ABOVE_HUD_LAYER, dir = dir) playsound(loc, 'sound/weapons/bladeslice.ogg', 100, 1) diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 94898fcd009..fc412840ebe 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -3,7 +3,6 @@ var/volume = 0 level = 1 - layer = 2.4 //under wires with their 2.44 use_power = 0 can_unwrench = 1 diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm index 4a744ef7100..460e53bfd1d 100644 --- a/code/modules/awaymissions/mission_code/wildwest.dm +++ b/code/modules/awaymissions/mission_code/wildwest.dm @@ -120,14 +120,10 @@ desc = "What is that thing?" density = 1 anchored = 1 - layer = 3 icon = 'icons/mob/blob.dmi' icon_state = "blobpod" var/triggered = 0 -/obj/effect/meatgrinder/New() - icon_state = "blobpod" - /obj/effect/meatgrinder/Crossed(AM as mob|obj) Bumped(AM) diff --git a/code/modules/events/anomaly_bluespace.dm b/code/modules/events/anomaly_bluespace.dm index bfb574706cc..19b3ac4abfa 100644 --- a/code/modules/events/anomaly_bluespace.dm +++ b/code/modules/events/anomaly_bluespace.dm @@ -65,7 +65,7 @@ blueeffect.screen_loc = "WEST,SOUTH to EAST,NORTH" blueeffect.icon = 'icons/effects/effects.dmi' blueeffect.icon_state = "shieldsparkles" - blueeffect.layer = 17 + blueeffect.layer = FLASH_LAYER blueeffect.mouse_opacity = 0 M.client.screen += blueeffect sleep(20) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 793f267c948..23e4ee960d3 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -327,8 +327,7 @@ /datum/spacevine_mutation/flowering/on_grow(obj/effect/spacevine/holder) if(holder.energy == 2 && prob(severity) && !locate(/obj/structure/alien/resin/flower_bud_enemy) in range(5,holder)) - var/obj/structure/alien/resin/flower_bud_enemy/FBE = new /obj/structure/alien/resin/flower_bud_enemy (get_turf(holder)) - FBE.layer = holder.layer+0.1 + new/obj/structure/alien/resin/flower_bud_enemy(get_turf(holder)) /datum/spacevine_mutation/flowering/on_cross(obj/effect/spacevine/holder, mob/living/crosser) @@ -344,7 +343,7 @@ icon_state = "Light1" anchored = 1 density = 0 - layer = MOB_LAYER + 0.8 + layer = SPACEVINE_LAYER mouse_opacity = 2 //Clicking anywhere on the turf is good enough pass_flags = PASSTABLE | PASSGRILLE var/energy = 0 @@ -532,7 +531,6 @@ src.icon_state = pick("Med1", "Med2", "Med3") energy = 1 SetOpacity(1) - layer = 5 else src.icon_state = pick("Hvy1", "Hvy2", "Hvy3") energy = 2 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 9eca1592029..46998855692 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -227,7 +227,7 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/hallucination/simple/singularity image_icon = 'icons/effects/224x224.dmi' image_state = "singularity_s7" - image_layer = 6 + image_layer = MASSIVE_OBJ_LAYER px = -96 py = -96 @@ -635,7 +635,7 @@ var/list/non_fakeattack_weapons = list(/obj/item/weapon/gun/projectile, /obj/ite if(!H.r_store) slots_free += ui_storage2 if(slots_free.len) halitem.screen_loc = pick(slots_free) - halitem.layer = 50 + halitem.layer = ABOVE_HUD_LAYER switch(rand(1,6)) if(1) //revolver halitem.icon = 'icons/obj/guns/projectile.dmi' diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index e88e4e784cb..48dfb294839 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -13,6 +13,7 @@ density = 1 anchored = 0 use_power = 0 + layer = BELOW_OBJ_LAYER var/list/product_types = list() var/dispense_flavour = ICECREAM_VANILLA var/flavour_name = "vanilla" @@ -180,7 +181,6 @@ desc = "Delicious waffle cone, but no ice cream." icon = 'icons/obj/kitchen.dmi' icon_state = "icecream_cone_waffle" //default for admin-spawned cones, href_list["cone"] should overwrite this all the time - layer = 3.1 var/ice_creamed = 0 var/cone_type bitesize = 3 diff --git a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm index 82f3ba80eb5..19c3112b320 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/juicer.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/juicer.dm @@ -3,7 +3,7 @@ name = "juicer" icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 0 use_power = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm index 5e8171bf0dd..06ca4bd94b4 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm @@ -3,7 +3,7 @@ desc = "Cooks and boils stuff." icon = 'icons/obj/kitchen.dmi' icon_state = "mw" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 use_power = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm index a464c31d2cc..6b2c96d505d 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm @@ -3,7 +3,7 @@ desc = "A machine used for recycling dead monkeys into monkey cubes. It currently produces 1 cube for every 5 monkeys inserted." // except it literally never does icon = 'icons/obj/kitchen.dmi' icon_state = "grinder" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 use_power = 1 diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index 797baa35247..96d32d3902b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -4,7 +4,7 @@ desc = "An industrial grinder used to process meat and other foods. Keep hands clear of intake area while operating." icon = 'icons/obj/kitchen.dmi' icon_state = "processor" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 var/broken = 0 diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index ca330eeddef..afa3d9cead9 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -6,7 +6,7 @@ desc = "Keeps cold things cold and hot things cold." icon = 'icons/obj/vending.dmi' icon_state = "smartfridge" - layer = 2.9 + layer = BELOW_OBJ_LAYER density = 1 anchored = 1 use_power = 1 diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index ce238c7eaa1..0161097ef48 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -278,7 +278,7 @@ else var/t_growthstate = min(round((age / myseed.maturation) * myseed.growthstages), myseed.growthstages) I = image('icons/obj/hydroponics/growing.dmi', icon_state = "[myseed.icon_grow][t_growthstate]") - I.layer = MOB_LAYER + 0.1 + I.layer = OBJ_LAYER + 0.01 overlays += I /obj/machinery/hydroponics/proc/update_icon_lights() diff --git a/code/modules/lighting/lighting_system.dm b/code/modules/lighting/lighting_system.dm index 4cd39bcbf8d..5f9d1048e2e 100644 --- a/code/modules/lighting/lighting_system.dm +++ b/code/modules/lighting/lighting_system.dm @@ -27,7 +27,7 @@ */ #define LIGHTING_CIRCULAR 1 //Comment this out to use old square lighting effects. -#define LIGHTING_LAYER 15 //Drawing layer for lighting +//#define LIGHTING_LAYER 15 //Drawing layer for lighting, moved to layers.dm #define LIGHTING_CAP 10 //The lumcount level at which alpha is 0 and we're fully lit. #define LIGHTING_CAP_FRAC (255/LIGHTING_CAP) //A precal'd variable we'll use in turf/redraw_lighting() #define LIGHTING_ICON 'icons/effects/alphacolors.dmi' @@ -365,7 +365,6 @@ T.init_lighting() T.update_lumcount(0) -#undef LIGHTING_LAYER #undef LIGHTING_CIRCULAR #undef LIGHTING_ICON #undef LIGHTING_ICON_STATE diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 6d89f9d90b0..aefb61aae1e 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -649,7 +649,7 @@ desc = "A resonating field that significantly damages anything inside of it when the field eventually ruptures." icon = 'icons/effects/effects.dmi' icon_state = "shield1" - layer = 4.1 + layer = ABOVE_ALL_MOB_LAYER mouse_opacity = 0 var/resonance_damage = 20 @@ -1035,7 +1035,7 @@ var/client/C = user.client for(var/turf/closed/mineral/M in minerals) var/turf/F = get_turf(M) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = 18) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = F, icon_state = M.scan_state, layer = FLASH_LAYER) C.images += I spawn(30) if(C) @@ -1053,7 +1053,7 @@ C.icon_state = M.scan_state /obj/effect/overlay/temp/mining_overlay - layer = 20 + layer = FLASH_LAYER icon = 'icons/turf/smoothrocks.dmi' anchored = 1 mouse_opacity = 0 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 198f92cdb58..97a8d178266 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -124,7 +124,7 @@ icon_state = "orb" var/obj/item/device/wisp_lantern/home luminosity = 7 - layer = FLY_LAYER - 0.3 + layer = ABOVE_ALL_MOB_LAYER /obj/item/device/warp_cube name = "blue cube" diff --git a/code/modules/mining/lavaland/ruins/gym.dm b/code/modules/mining/lavaland/ruins/gym.dm index 6a538ae54b7..e945319d161 100644 --- a/code/modules/mining/lavaland/ruins/gym.dm +++ b/code/modules/mining/lavaland/ruins/gym.dm @@ -4,7 +4,7 @@ icon = 'goon/icons/obj/fitness.dmi' icon_state = "punchingbag" anchored = 1 - layer = MOB_LAYER+1 // TODO LAYER + layer = WALL_OBJ_LAYER var/list/hit_sounds = list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg',\ 'sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg') @@ -69,7 +69,7 @@ user.Stun(4) user.loc = src.loc var/image/W = image('goon/icons/obj/fitness.dmi',"fitnessweight-w") - W.layer = MOB_LAYER+1 + W.layer = WALL_OBJ_LAYER overlays += W var/bragmessage = pick("pushing it to the limit","going into overdrive","burning with determination","rising up to the challenge", "getting strong now","getting ripped") user.visible_message("[user] is [bragmessage]!") diff --git a/code/modules/mining/lavaland/weather.dm b/code/modules/mining/lavaland/weather.dm index fed8c95c19f..6415b41e024 100644 --- a/code/modules/mining/lavaland/weather.dm +++ b/code/modules/mining/lavaland/weather.dm @@ -22,7 +22,7 @@ var/start_up_overlay = "lava" var/duration_overlay = "lava" - var/overlay_layer = 10 //This is the default area layer, and above everything else. 2 is floors/below walls and mobs. + var/overlay_layer = AREA_LAYER //This is the default area layer, and above everything else. TURF_LAYER is floors/below walls and mobs. var/purely_aesthetic = FALSE //If we just want gentle rain that doesn't hurt people var/list/impacted_areas = list() var/immunity_type = "storm" @@ -95,6 +95,6 @@ if(END_STAGE) N.icon_state = initial(N.icon_state) N.icon = 'icons/turf/areas.dmi' - N.layer = 10 //Just default back to normal area stuff since I assume setting a var is faster than initial + N.layer = AREA_LAYER //Just default back to normal area stuff since I assume setting a var is faster than initial N.invisibility = INVISIBILITY_MAXIMUM N.opacity = 0 \ No newline at end of file diff --git a/code/modules/mining/lavaland/weather_types.dm b/code/modules/mining/lavaland/weather_types.dm index 1f75b7daa07..dc3f35f6d9c 100644 --- a/code/modules/mining/lavaland/weather_types.dm +++ b/code/modules/mining/lavaland/weather_types.dm @@ -16,7 +16,7 @@ start_up_overlay = "lava" duration_overlay = "lava" - overlay_layer = 2 //Covers floors only + overlay_layer = ABOVE_OPEN_TURF_LAYER //Covers floors only immunity_type = "lava" @@ -50,7 +50,7 @@ start_up_overlay = "" duration_overlay = "" - overlay_layer = 10 + overlay_layer = AREA_LAYER /datum/weather/advanced_darkness/update_areas() for(var/area/A in impacted_areas) @@ -80,7 +80,7 @@ start_up_overlay = "light_ash" duration_overlay = "ash_storm" - overlay_layer = 10 + overlay_layer = AREA_LAYER immunity_type = "ash" diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 457554c2300..819766ef3a2 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -36,7 +36,6 @@ /obj/structure/closet/secure_closet/miner/New() ..() - new /obj/item/stack/sheet/mineral/sandbags(src, 5) new /obj/item/weapon/storage/box/emptysandbags(src) new /obj/item/device/radio/headset/headset_cargo(src) new /obj/item/device/t_scanner/adv_mining_scanner/lesser(src) @@ -46,6 +45,7 @@ new /obj/item/weapon/gun/energy/kinetic_accelerator(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/weapon/survivalcapsule(src) + new /obj/item/stack/sheet/mineral/sandbags(src, 5) /**********************Shuttle Computer**************************/ @@ -511,7 +511,7 @@ /obj/structure/fans/tiny name = "tiny fan" desc = "A tiny fan, releasing a thin gust of air." - layer = TURF_LAYER + 0.8 + layer = ABOVE_NORMAL_TURF_LAYER density = 0 icon_state = "fan_tiny" buildstackamount = 2 @@ -547,6 +547,6 @@ icon = 'icons/obj/lavaland/survival_pod.dmi' name = "tubes" anchored = 1 - layer = MOB_LAYER - 0.2 + layer = BELOW_MOB_LAYER density = 0 diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index f9f5ed6caf1..8fe9e12e507 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -12,7 +12,7 @@ opacity = 1 density = 1 blocks_air = 1 - layer = MOB_LAYER + 0.05 + layer = EDGED_TURF_LAYER temperature = TCMB var/environment_type = "asteroid" var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless @@ -179,7 +179,7 @@ /turf/closed/mineral/gibtonite/proc/explosive_reaction(mob/user = null, triggered_by_explosion = 0) if(stage == 0) - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = 4.06) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_active", layer = ON_EDGED_TURF_LAYER) overlays += I activated_image = I name = "gibtonite deposit" @@ -217,7 +217,7 @@ /turf/closed/mineral/gibtonite/proc/defuse() if(stage == 1) overlays -= activated_image - var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = 4.06) + var/image/I = image('icons/turf/smoothrocks.dmi', loc = src, icon_state = "rock_Gibtonite_inactive", layer = ON_EDGED_TURF_LAYER) overlays += I desc = "An inactive gibtonite reserve. The ore can be extracted." stage = 2 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 3c1e42f0166..3d60378e0f4 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -7,7 +7,7 @@ var/list/image/ghost_images_simple = list() //this is a list of all ghost images desc = "It's a g-g-g-g-ghooooost!" //jinkies! icon = 'icons/mob/mob.dmi' icon_state = "ghost" - layer = MOB_LAYER + 1 + layer = GHOST_LAYER stat = DEAD density = 0 canmove = 0 diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 690124ac2e3..065717a47d0 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -29,7 +29,7 @@ if(!l_hand) W.loc = src //TODO: move to equipped? l_hand = W - W.layer = 20 //TODO: move to equipped? + W.layer = ABOVE_HUD_LAYER //TODO: move to equipped? W.equipped(src,slot_l_hand) if(W.pulledby) W.pulledby.stop_pulling() @@ -47,7 +47,7 @@ if(!r_hand) W.loc = src r_hand = W - W.layer = 20 + W.layer = ABOVE_HUD_LAYER W.equipped(src,slot_r_hand) if(W.pulledby) W.pulledby.stop_pulling() diff --git a/code/modules/mob/living/carbon/alien/humanoid/queen.dm b/code/modules/mob/living/carbon/alien/humanoid/queen.dm index c93ad1ead74..49c8ea62f4a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/queen.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/queen.dm @@ -7,7 +7,7 @@ pixel_x = -16 bubble_icon = "alienroyal" mob_size = MOB_SIZE_LARGE - layer = MOB_LAYER + 0.5 //above most mobs, but below speechbubbles + layer = LARGE_MOB_LAYER //above most mobs, but below speechbubbles pressure_resistance = 200 //Because big, stompy xenos should not be blown around like paper. butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/xeno = 20, /obj/item/stack/sheet/animalhide/xeno = 3) diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index d575ba5f4f8..642031e8541 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -9,8 +9,8 @@ if(user.stat != CONSCIOUS) return - if (user.layer != TURF_LAYER+0.2) - user.layer = TURF_LAYER+0.2 + if (user.layer != ABOVE_NORMAL_TURF_LAYER) + user.layer = ABOVE_NORMAL_TURF_LAYER user.visible_message("[user] scurries to the ground!", \ "You are now hiding.") else diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 17584a81feb..c65a6d53df1 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -4,7 +4,7 @@ icon_state = "brain" throw_speed = 3 throw_range = 5 - layer = 4.1 + layer = ABOVE_MOB_LAYER zone = "head" slot = "brain" vital = 1 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b1718b26f9a..ee109955a12 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -919,7 +919,7 @@ for(var/mob/M in viewers(src)) if(M.client) viewing += M.client - flick_overlay(image(icon,src,"electrocuted_generic",MOB_LAYER+1), viewing, anim_duration) + flick_overlay(image(icon,src,"electrocuted_generic",ABOVE_MOB_LAYER), viewing, anim_duration) /mob/living/carbon/human/canUseTopic(atom/movable/M, be_close = 0) if(incapacitated() || lying ) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 8ac3bfc3d66..6ad159851dd 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -35,7 +35,7 @@ I.screen_loc = null // will get moved if inventory is visible I.loc = src I.equipped(src, slot) - I.layer = 20 + I.layer = ABOVE_HUD_LAYER switch(slot) if(slot_back) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 655b939cc99..0209d40b126 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -811,9 +811,9 @@ Sorry Giacom. Please don't be mad :( // What icon do we use for the attack? var/image/I if(hand && l_hand) // Attacked with item in left hand. - I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 1) + I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 0.1) else if(!hand && r_hand) // Attacked with item in right hand. - I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1) + I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 0.1) else // Attacked with a fist? return diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 8ac3547f12b..b95db4d75f0 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -157,7 +157,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) for(var/mob/M in listening) if(M.client) speech_bubble_recipients.Add(M.client) - var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", MOB_LAYER+1) + var/image/I = image('icons/mob/talk.dmi', src, "[bubble_type][say_test(message)]", FLY_LAYER) I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA spawn(0) flick_overlay(I, speech_bubble_recipients, 30) @@ -219,7 +219,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) if(1) if(prob(40)) M << "We can faintly sense an outsider trying to communicate through the hivemind..." - return 1 + return 1 if(2) var/msg = "[mind.changeling.changelingID]: [message]" log_say("[mind.changeling.changelingID]/[src.key] : [message]") @@ -229,7 +229,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) else switch(M.lingcheck()) if(3) - M << msg + M << msg if(2) M << msg if(1) @@ -289,7 +289,7 @@ var/list/crit_allowed_modes = list(MODE_WHISPER,MODE_CHANGELING,MODE_ALIEN) return NOPASS return 0 -/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind. +/mob/living/lingcheck() //1 is ling w/ no hivemind. 2 is ling w/hivemind. 3 is ling victim being linked into hivemind. if(mind && mind.changeling) if(mind.changeling.changeling_speak) return 2 diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm index 91413e2e1ad..4b4a65f12c0 100644 --- a/code/modules/mob/living/silicon/robot/inventory.dm +++ b/code/modules/mob/living/silicon/robot/inventory.dm @@ -48,7 +48,7 @@ if(!module_state_1) O.mouse_opacity = initial(O.mouse_opacity) module_state_1 = O - O.layer = 20 + O.layer = ABOVE_HUD_LAYER O.screen_loc = inv1.screen_loc contents += O if(istype(module_state_1,/obj/item/borg/sight)) @@ -58,7 +58,7 @@ else if(!module_state_2) O.mouse_opacity = initial(O.mouse_opacity) module_state_2 = O - O.layer = 20 + O.layer = ABOVE_HUD_LAYER O.screen_loc = inv2.screen_loc contents += O if(istype(module_state_2,/obj/item/borg/sight)) @@ -68,7 +68,7 @@ else if(!module_state_3) O.mouse_opacity = initial(O.mouse_opacity) module_state_3 = O - O.layer = 20 + O.layer = ABOVE_HUD_LAYER O.screen_loc = inv3.screen_loc contents += O if(istype(module_state_3,/obj/item/borg/sight)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b035b59d825..55de2e3253e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -84,7 +84,7 @@ robot_modules_background = new() robot_modules_background.icon_state = "block" - robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it. + robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it. ident = rand(1, 999) update_icons() diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 1257e7d0ab4..ce5d311e7bf 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -132,7 +132,7 @@ var/global/mulebot_count = 0 if(load && !ismob(load))//buckling handles the mob offsets load.pixel_y = initial(load.pixel_y) + 9 if(load.layer < layer) - load.layer = layer + 0.1 + load.layer = layer + 0.01 overlays += load return @@ -384,7 +384,7 @@ var/global/mulebot_count = 0 if(M in buckled_mobs) //post buckling M.pixel_y = initial(M.pixel_y) + 9 if(M.layer < layer) - M.layer = layer + 0.1 + M.layer = layer + 0.01 else //post unbuckling load = null diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index cdedc564910..45f8b884801 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -207,7 +207,7 @@ if(change) if(change > 0) if(M && stat != DEAD) - flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", MOB_LAYER+1), list(M.client), 20) + flick_overlay(image('icons/mob/animal.dmi', src, "heart-ani2", ABOVE_MOB_LAYER), list(M.client), 20) emote("me", 1, "purrs!") else if(M && stat != DEAD) diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index e9f1c512b42..9d6a9ab7f64 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -53,4 +53,4 @@ icon = 'icons/effects/blood.dmi' icon_state = "xfloor1" random_icon_states = list("xfloor1", "xfloor2", "xfloor3", "xfloor4", "xfloor5", "xfloor6", "xfloor7") - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 7e14553ce1c..43a1ce548b1 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -534,7 +534,7 @@ if(change) if(change > 0) if(M && stat != DEAD) // Added check to see if this mob (the dog) is dead to fix issue 2454 - flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",MOB_LAYER+1), list(M.client), 20) + flick_overlay(image('icons/mob/animal.dmi',src,"heart-ani2",ABOVE_MOB_LAYER), list(M.client), 20) emote("me", 1, "yaps happily!") else if(M && stat != DEAD) // Same check here, even though emote checks it as well (poor form to check it only in the help case) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm index ed54a1e50b8..51bc2316b5b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/inventory.dm @@ -97,7 +97,7 @@ I.screen_loc = null // will get moved if inventory is visible I.loc = src I.equipped(src, slot) - I.layer = 20 + I.layer = ABOVE_HUD_LAYER switch(slot) if(slot_head) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm index 4b3e79d22f3..19d54f72bdd 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/visuals_icons.dm @@ -37,7 +37,7 @@ hands_overlays += r_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - r_hand.layer = 20 + r_hand.layer = ABOVE_HUD_LAYER r_hand.screen_loc = ui_rhand client.screen |= r_hand @@ -54,7 +54,7 @@ hands_overlays += l_hand_image if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) - l_hand.layer = 20 + l_hand.layer = ABOVE_HUD_LAYER l_hand.screen_loc = ui_lhand client.screen |= l_hand diff --git a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm index ca1c4e8d22e..deaef1dbe72 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/lightning.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/lightning.dm @@ -1,7 +1,7 @@ //Beam /obj/effect/ebeam/chain name = "lightning chain" - layer = MOB_LAYER - 0.1 + layer = LYING_MOB_LAYER /mob/living/simple_animal/hostile/guardian/beam melee_damage_lower = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm index 6e5d69f172c..d71a079b733 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/dragon.dm @@ -70,7 +70,7 @@ icon_state = "fireball" name = "fireball" desc = "Get out of the way!" - layer = 6 + layer = FLY_LAYER randomdir = 0 duration = 10 pixel_z = 500 @@ -78,7 +78,7 @@ /obj/effect/overlay/temp/target icon = 'icons/mob/actions.dmi' icon_state = "sniper_zoom" - layer = MOB_LAYER - 0.1 + layer = BELOW_MOB_LAYER luminosity = 2 duration = 10 @@ -87,7 +87,7 @@ desc = "Don't just stand there, move!" icon = 'icons/effects/96x96.dmi' icon_state = "rune_large" - layer = MOB_LAYER - 0.1 + layer = BELOW_MOB_LAYER pixel_x = -32 pixel_y = -32 color = "#FF0000" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index f9ff4a3762d..09c51bde9be 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -12,7 +12,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - layer = MOB_LAYER + 0.5 //Looks weird with them slipping under mineral walls and cameras and shit otherwise + layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise /mob/living/simple_animal/hostile/megafauna/death(gibbed) if(health > 0) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 2cbaff85393..ba2db3344ed 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -77,8 +77,8 @@ aggro_vision_range = 9 idle_vision_range = 2 turns_per_move = 5 - loot = list(/obj/item/weapon/ore/diamond{layer = 4.1}, - /obj/item/weapon/ore/diamond{layer = 4.1}) + loot = list(/obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER}, + /obj/item/weapon/ore/diamond{layer = ABOVE_MOB_LAYER}) /obj/item/projectile/temp/basilisk name = "freezing blast" @@ -463,7 +463,7 @@ mob_size = MOB_SIZE_LARGE var/pre_attack = 0 var/pre_attack_icon = "Goliath_preattack" - loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = 4.1}) + loot = list(/obj/item/stack/sheet/animalhide/goliath_hide{layer = ABOVE_MOB_LAYER}) /mob/living/simple_animal/hostile/asteroid/goliath/Life() ..() @@ -558,7 +558,7 @@ icon_state = "goliath_hide" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER /obj/item/stack/sheet/animalhide/goliath_hide/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag) @@ -629,7 +629,7 @@ environment_smash = 0 var/wumbo = 0 var/inflate_cooldown = 0 - loot = list(/obj/item/asteroid/fugu_gland{layer = 4.1}) + loot = list(/obj/item/asteroid/fugu_gland{layer = ABOVE_MOB_LAYER}) /mob/living/simple_animal/hostile/asteroid/fugu/Life() if(!wumbo) @@ -705,7 +705,7 @@ icon_state = "fugu_gland" flags = NOBLUDGEON w_class = 3 - layer = 4 + layer = MOB_LAYER origin_tech = "biotech=6" var/list/banned_mobs() @@ -1005,7 +1005,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = INFINITY - layer = MOB_LAYER-0.1 loot = list(/obj/effect/collapse, /obj/structure/closet/crate/necropolis/tendril) del_on_death = 1 var/gps = null @@ -1021,7 +1020,7 @@ /obj/effect/collapse name = "collapsing necropolis tendril" desc = "Get clear!" - layer = 2 + layer = ABOVE_OPEN_TURF_LAYER icon = 'icons/mob/nest.dmi' icon_state = "tendril" anchored = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index e550017407c..9d6491c3770 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -29,7 +29,6 @@ faction = list("skeleton") see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 - layer = MOB_LAYER - 0.1 deathmessage = "collapses into a pile of bones!" del_on_death = 1 loot = list(/obj/effect/decal/remains/human) diff --git a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm index 14583cd85fd..7d57ca55b42 100644 --- a/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm +++ b/code/modules/mob/living/simple_animal/hostile/venus_human_trap.dm @@ -5,7 +5,7 @@ desc = "a large pulsating plant..." icon = 'icons/effects/spacevines.dmi' icon_state = "flower_bud" - layer = MOB_LAYER + 0.9 + layer = SPACEVINE_MOB_LAYER opacity = 0 canSmoothWith = list() smooth = SMOOTH_FALSE @@ -49,7 +49,7 @@ name = "venus human trap" desc = "now you know how the fly feels" icon_state = "venus_human_trap" - layer = MOB_LAYER + 0.9 + layer = SPACEVINE_MOB_LAYER health = 50 maxHealth = 50 ranged = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 064df080757..11d2a8704c0 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -30,7 +30,6 @@ butcher_results = list(/obj/item/weapon/reagent_containers/food/snacks/meat/slab/human/mutant/zombie = 3) see_invisible = SEE_INVISIBLE_MINIMUM see_in_dark = 8 - layer = MOB_LAYER - 0.1 var/removingairlock = 0 /mob/living/simple_animal/hostile/zombie/darkholme //BOY?NEXT?RUIN diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm index 5fedf3b3a81..a7498e11397 100644 --- a/code/modules/mob/living/simple_animal/slime/powers.dm +++ b/code/modules/mob/living/simple_animal/slime/powers.dm @@ -79,6 +79,7 @@ /mob/living/simple_animal/slime/proc/Feedon(mob/living/M) M.unbuckle_all_mobs(force=1) //Slimes rip other mobs (eg: shoulder parrots) off (Slimes Vs Slimes is already handled in CanFeedon()) if(M.buckle_mob(src, force=1)) + layer = M.layer+0.01 //appear above the target mob M.visible_message("The [name] has latched onto [M]!", \ "The [name] has latched onto [M]!") else @@ -94,6 +95,7 @@ if(!silent) visible_message("[src] has let go of [buckled]!", \ "I stopped feeding.") + layer = initial(layer) buckled.unbuckle_mob(src,force=1) /mob/living/simple_animal/slime/verb/Evolve() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 61e3230a032..22178caa4bf 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -24,8 +24,6 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange", speak_emote = list("telepathically chirps") bubble_icon = "slime" - layer = 5 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) maxHealth = 150 diff --git a/code/modules/mob/living/simple_animal/spawner.dm b/code/modules/mob/living/simple_animal/spawner.dm index 204d2b400f7..bd01da0b97a 100644 --- a/code/modules/mob/living/simple_animal/spawner.dm +++ b/code/modules/mob/living/simple_animal/spawner.dm @@ -18,7 +18,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 350 - layer = MOB_LAYER-0.1 + layer = BELOW_MOB_LAYER sentience_type = SENTIENCE_BOSS diff --git a/code/modules/mob/living/ventcrawling.dm b/code/modules/mob/living/ventcrawling.dm index d01b00ceaeb..c32a82c7865 100644 --- a/code/modules/mob/living/ventcrawling.dm +++ b/code/modules/mob/living/ventcrawling.dm @@ -92,7 +92,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/components/unary for(var/X in totalMembers) var/obj/machinery/atmospherics/A = X //all elements in totalMembers are necessarily of this type. if(!A.pipe_vision_img) - A.pipe_vision_img = image(A, A.loc, layer = 20, dir = A.dir) + A.pipe_vision_img = image(A, A.loc, layer = ABOVE_HUD_LAYER, dir = A.dir) //20 for being above darkness pipes_shown += A.pipe_vision_img if(client) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 53cc71405c7..d5647ed98dc 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -681,9 +681,9 @@ var/next_mob_id = 0 density = !lying if(lying) if(layer == initial(layer)) //to avoid special cases like hiding larvas. - layer = MOB_LAYER - 0.2 //so mob lying always appear behind standing mobs + layer = LYING_MOB_LAYER //so mob lying always appear behind standing mobs else - if(layer == MOB_LAYER - 0.2) + if(layer == LYING_MOB_LAYER) layer = initial(layer) update_transform() update_action_buttons_icon() diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 00e480cbcc2..e6d1f17a3dc 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -1,6 +1,6 @@ /mob density = 1 - layer = 4 + layer = MOB_LAYER animate_movement = 2 flags = HEAR hud_possible = list(ANTAG_HUD) diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index eee99a59bd5..04c0c796f23 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -13,7 +13,7 @@ It is possible to destroy the net by the occupant or someone else. opacity = 0//Can see through. mouse_opacity = 1//So you can hit it with stuff. anchored = 1//Can't drag/grab the trapped mob. - + layer = ABOVE_ALL_MOB_LAYER var/health = 25//How much health it has. var/mob/living/affecting = null//Who it is currently affecting, if anyone. var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed. diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm index b31d49c1d82..34d47d7e469 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_net.dm @@ -18,7 +18,6 @@ H.Beam(C,"n_beam",,15) H.say("Get over here!") var/obj/effect/energy_net/E = new /obj/effect/energy_net(C.loc) - E.layer = C.layer+1//To have it appear one layer above the mob. H.visible_message("[H] caught [C] with an energy net!","You caught [C] with an energy net!") E.affecting = C E.master = H diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 29d4bc11de5..98065675712 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -14,7 +14,6 @@ w_class = 1 throw_range = 1 throw_speed = 1 - layer = 3 pressure_resistance = 0 slot_flags = SLOT_HEAD body_parts_covered = HEAD diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 341f7cf7e51..51b6eb9558f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -33,7 +33,7 @@ By design, d1 is the smallest direction and d2 is the highest icon_state = "0-1" var/d1 = 0 // cable direction 1 (see above) var/d2 = 1 // cable direction 2 (see above) - layer = 2.44 //Just below unary stuff, which is at 2.45 and above pipes, which are at 2.4 + layer = WIRE_LAYER //Above pipes, which are at GAS_PIPE_LAYER var/cable_color = "red" var/obj/item/stack/cable_coil/stored diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index a9780a6f25e..daebb4850a7 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -146,7 +146,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 middle = part if(count <= 3) // Their sprite is the top part of the generator part.density = 0 - part.layer = MOB_LAYER + 0.1 + part.layer = WALL_OBJ_LAYER part.sprite_number = count part.main_part = src parts += part diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index ba4def1b629..a4b9ae8875c 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -32,7 +32,7 @@ icon = 'icons/obj/lighting.dmi' icon_state = "tube-construct-stage1" anchored = 1 - layer = MOB_LAYER + 0.25 + layer = WALL_OBJ_LAYER var/stage = 1 var/fixture_type = "tube" var/sheets_refunded = 2 @@ -131,7 +131,7 @@ icon_state = "tube1" desc = "A lighting fixture." anchored = 1 - layer = MOB_LAYER + 0.25 + layer = WALL_OBJ_LAYER use_power = 2 idle_power_usage = 2 active_power_usage = 20 diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index 0ddbd973c4a..4dc2e7b65d3 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -10,7 +10,7 @@ unacidable = 1 use_power = 0 luminosity = 4 - layer = OBJ_LAYER + 0.1 + layer = ABOVE_OBJ_LAYER var/obj/machinery/field/generator/FG1 = null var/obj/machinery/field/generator/FG2 = null diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index befe71b8071..d9090686d8d 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -7,7 +7,7 @@ icon_state = "singularity_s1" anchored = 1 density = 1 - layer = 6 + layer = MASSIVE_OBJ_LAYER luminosity = 6 unacidable = 1 //Don't comment this out. var/current_size = 1 diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 229c59f9d03..f3fcb43585b 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -8,10 +8,9 @@ icon_state = "term" desc = "It's an underfloor wiring terminal for power equipment." level = 1 - layer = TURF_LAYER var/obj/machinery/power/master = null anchored = 1 - layer = 2.6 // a bit above wires + layer = WIRE_TERMINAL_LAYER //a bit above wires /obj/machinery/power/terminal/New() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 83d17c7ebfe..a6b0e4c0c7b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -129,7 +129,7 @@ if((!( current ) || loc == current)) current = locate(Clamp(x+xo,1,world.maxx),Clamp(y+yo,1,world.maxy),z) step_towards(src, current) - if(original && (original.layer>=2.75) || ismob(original)) + if(original && (original.layer>=PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(original)) if(loc == get_turf(original)) if(!(original in permutated)) Bump(original, 1) diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 0002f3dbeca..81f9afd7dad 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -162,7 +162,7 @@ name = "kinetic explosion" icon = 'icons/obj/projectiles.dmi' icon_state = "kinetic_blast" - layer = 4.1 + layer = ABOVE_ALL_MOB_LAYER /obj/effect/kinetic_blast/New() spawn(4) diff --git a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm index e71f8a95b48..479a2ea140b 100644 --- a/code/modules/reagents/chemistry/machinery/reagentgrinder.dm +++ b/code/modules/reagents/chemistry/machinery/reagentgrinder.dm @@ -3,7 +3,7 @@ desc = "Used to grind things up into raw materials." icon = 'icons/obj/kitchen.dmi' icon_state = "juicer1" - layer = 2.9 + layer = BELOW_OBJ_LAYER anchored = 1 use_power = 1 idle_power_usage = 5 diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index d5c7403d185..926f2afbb31 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -136,7 +136,7 @@ var/dpdir = 0 // bitmask of pipe directions dir = 0 // dir will contain dominant direction for junction pipes var/health = 10 // health points 0-10 - layer = 2.3 // slightly lower than wires and other pipes + layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map var/obj/structure/disposalconstruct/stored diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index 07623aad297..9afa9929390 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -27,7 +27,7 @@ animation.density = 0 animation.anchored = 1 animation.icon = 'icons/mob/mob.dmi' - animation.layer = 5 + animation.layer = FLY_LAYER animation.master = holder target.ExtinguishMob() if(target.buckled) diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm index 3c45a182304..63fbc29203d 100644 --- a/code/modules/surgery/bodyparts/head.dm +++ b/code/modules/surgery/bodyparts/head.dm @@ -5,7 +5,7 @@ max_damage = 200 body_zone = "head" body_part = HEAD - layer = 4.1 //so it isn't hidden behind some objects when on the floor + layer = ABOVE_MOB_LAYER //so it isn't hidden behind some objects when on the floor w_class = 4 //Quite a hefty load slowdown = 1 //Balancing measure throw_range = 2 //No head bowling @@ -163,4 +163,4 @@ /obj/item/bodypart/head/burn() drop_organs() - ..() \ No newline at end of file + ..() diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 01d440dec03..bf77878eae0 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -14,7 +14,7 @@ ..() if(!atvcover) atvcover = image("icons/obj/vehicles.dmi", "atvcover") - atvcover.layer = MOB_LAYER + 0.1 + atvcover.layer = ABOVE_MOB_LAYER obj/vehicle/atv/post_buckle_mob(mob/living/M) @@ -26,7 +26,7 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M) /obj/vehicle/atv/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER @@ -51,13 +51,13 @@ obj/vehicle/atv/post_buckle_mob(mob/living/M) /obj/vehicle/atv/turret/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER if(turret) if(dir == NORTH) - turret.layer = MOB_LAYER+0.1 + turret.layer = ABOVE_MOB_LAYER else turret.layer = OBJ_LAYER diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index 2e02313105e..e894e3c1c4a 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -15,7 +15,7 @@ /obj/vehicle/scooter/handle_vehicle_layer() if(dir == SOUTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER diff --git a/code/modules/vehicles/speedbike.dm b/code/modules/vehicles/speedbike.dm index 8f374cd6213..7602f9f4356 100644 --- a/code/modules/vehicles/speedbike.dm +++ b/code/modules/vehicles/speedbike.dm @@ -2,7 +2,7 @@ name = "Speedbike" icon = 'icons/obj/bike.dmi' icon_state = "speedbike_blue" - layer = MOB_LAYER - 0.1 + layer = LYING_MOB_LAYER keytype = null vehicle_move_delay = 0 var/overlay_state = "cover_blue" @@ -11,13 +11,13 @@ /obj/vehicle/space/speedbike/New() ..() overlay = image("icons/obj/bike.dmi", overlay_state) - overlay.layer = MOB_LAYER + 0.1 + overlay.layer = ABOVE_MOB_LAYER overlays += overlay /obj/effect/overlay/temp/speedbike_trail name = "speedbike trails" icon_state = "ion_fade" - layer = MOB_LAYER - 0.2 + layer = BELOW_MOB_LAYER duration = 10 randomdir = 0 diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index e1539301204..96582344dfc 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -27,7 +27,7 @@ //APPEARANCE /obj/vehicle/proc/handle_vehicle_layer() if(dir != NORTH) - layer = MOB_LAYER+0.1 + layer = ABOVE_MOB_LAYER else layer = OBJ_LAYER diff --git a/tgstation.dme b/tgstation.dme index 70b5431dda2..fd4a6d24a20 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -33,6 +33,7 @@ #include "code\__DEFINES\genetics.dm" #include "code\__DEFINES\hud.dm" #include "code\__DEFINES\is_helpers.dm" +#include "code\__DEFINES\layers.dm" #include "code\__DEFINES\machines.dm" #include "code\__DEFINES\math.dm" #include "code\__DEFINES\misc.dm" @@ -43,8 +44,8 @@ #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\say.dm" -#include "code\__DEFINES\sight.dm" #include "code\__DEFINES\shuttles.dm" +#include "code\__DEFINES\sight.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\tablecrafting.dm" #include "code\__DEFINES\tgui.dm"