From 42d87af1e0b8b3abfbae8fb0d616c2062d4b7f73 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 15:18:11 +0300 Subject: [PATCH 001/171] d --- code/__DEFINES/subsystems-priority.dm | 1 + code/__DEFINES/subsystems.dm | 1 + code/controllers/subsystems/bullets.dm | 9 +++++++++ 3 files changed, 11 insertions(+) create mode 100644 code/controllers/subsystems/bullets.dm diff --git a/code/__DEFINES/subsystems-priority.dm b/code/__DEFINES/subsystems-priority.dm index ca1b614057..5b574ca99b 100644 --- a/code/__DEFINES/subsystems-priority.dm +++ b/code/__DEFINES/subsystems-priority.dm @@ -15,6 +15,7 @@ var/list/bitflags = list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 #define FIRE_PRIORITY_TIMER 700 #define SS_PRIORITY_TICKER 200 // Gameticker processing. #define FIRE_PRIORITY_TGUI 110 +#define SS_PRIORITY_BULLETS 102 #define SS_PRIORITY_HUMAN 101 // Human Life(). #define SS_PRIORITY_MOB 100 // Non-human Mob Life(). #define SS_PRIORITY_CHAT 100 // Chat subsystem. diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index d5f2908616..fc32de0315 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -115,6 +115,7 @@ #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_STICKY_BAN -10 #define INIT_ORDER_TICKETS -10 +#define INIT_ORDER_BULLES -11 #define INIT_ORDER_LIGHTING -20 #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_SQUEAK -40 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm new file mode 100644 index 0000000000..bd1ec77c38 --- /dev/null +++ b/code/controllers/subsystems/bullets.dm @@ -0,0 +1,9 @@ + +SUBSYSTEM_DEF(Bullets) + name = "Bullets" + wait = 1 + priority = SS_PRIORITY_BULLETS + init_order = INIT_ORDER_BULLETS + + var/list/current_queue = list() + var/list/bullet_queue = list() From 80d495ea913ce307e61c0bbfaf89301bd4105707 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 16:22:47 +0300 Subject: [PATCH 002/171] z --- code/controllers/subsystems/bullets.dm | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index bd1ec77c38..cd59947669 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,9 +1,29 @@ -SUBSYSTEM_DEF(Bullets) +SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 priority = SS_PRIORITY_BULLETS init_order = INIT_ORDER_BULLETS var/list/current_queue = list() + var/list/hitscans = list() var/list/bullet_queue = list() + +/datum/bullet_data + var/obj/item/projectile/referencedBullet = null + var/aimedZone = "" + var/atom/firer = null + var/turf/firedTurf = null + var/atom/target = null + var/turf/targetTurf = null + var/list/targetCoords = list(0,0) + var/turfsPerTick = 0 + var/projectileAccuracy = 0 + var/lifetime = 1 MINUTE + + + +/datum/controller/subsystem/bullets/fire(resumed) + . = ..() + if(length(hitscans)) + From fbab5c034cedbd95c7aa5e7f192065c885cbb85c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 20:53:26 +0300 Subject: [PATCH 003/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 72 ++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index cd59947669..f409b1a62b 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,4 +1,10 @@ - +#define LEVEL_BELOW 0 +#define LEVEL_TURF 1 +#define LEVEL_LYING 2 +#define LEVEL_LOWWALL 3 +#define LEVEL_TABLE 4 +#define LEVEL_STANDING 5 +#define LEVEL_ABOVE 6 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -7,23 +13,81 @@ SUBSYSTEM_DEF(bullets) var/list/current_queue = list() var/list/hitscans = list() - var/list/bullet_queue = list() + var/list/datum/bullet_data/bullet_queue = list() /datum/bullet_data var/obj/item/projectile/referencedBullet = null var/aimedZone = "" var/atom/firer = null var/turf/firedTurf = null + var/firedLevel = 0 var/atom/target = null var/turf/targetTurf = null var/list/targetCoords = list(0,0) + var/turf/currentTurf = null + var/currentCoords = list(0,0) + var/targetLevel = 0 var/turfsPerTick = 0 var/projectileAccuracy = 0 - var/lifetime = 1 MINUTE + var/lifetime = 10 + var/bulletLevel = 0 +/datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) + src.referencedBullet = referencedBullet + src.currentTurf = get_turf(referencedBullet) + src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y) + src.aimedZone = aimedZone + src.firer = firer + src.firedTurf = get_turf(firer) + src.target = target + src.targetTurf = get_turf(target) + src.targetCoords = targetCoords + src.turfsPerTick = turfsPerTick + src.projectileAccuracy = projectileAccuracy + src.lifetime = lifetime + if(ismob(firer)) + if(iscarbon(firer)) + if(firer:lying) + src.firedLevel = LEVEL_LYING + else + src.firedLevel = LEVEL_STANDING + else + src.firedLevel = LEVEL_STANDING + else + src.firedLevel = LEVEL_STANDING + if(ismob(target)) + if(iscarbon(target)) + if(target:lying) + src.targetLevel = LEVEL_LYING + else + src.targetLevel = LEVEL_STANDING + else + src.targetLevel = LEVEL_STANDING + else if(istype(target, /obj/structure/low_wall)) + src.targetLevel = LEVEL_LOWWALL + else if(istype(target, /obj/structure/window)) + src.targetLevel = LEVEL_STANDING + else if(istype(target, /obj/structure/table)) + src.targetLevel = LEVEL_TABLE + else if(iswall(target)) + src.targetLevel = LEVEL_STANDING + else if(isturf(target)) + src.targetLevel = LEVEL_TURF + else if(isitem(target)) + src.targetLevel = LEVEL_TURF + bullet_queue += src +/datum/bullet_data/proc/getShootingAngle() + return ATAN2(firedTurf.x - targetTurf.x, firedTurf.y - targetTurf.y) /datum/controller/subsystem/bullets/fire(resumed) . = ..() - if(length(hitscans)) + +#undef LEVEL_BELOW +#undef LEVEL_TURF +#undef LEVEL_LYING +#undef LEVEL_LOWWALL +#undef LEVEL_TABLE +#undef LEVEL_STANDING +#undef LEVEL_ABOVE From 1679e71e1b4848951c024b51d8f4bc623a1e87d7 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 21:24:40 +0300 Subject: [PATCH 004/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index f409b1a62b..0e7ccf36e8 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -11,7 +11,7 @@ SUBSYSTEM_DEF(bullets) priority = SS_PRIORITY_BULLETS init_order = INIT_ORDER_BULLETS - var/list/current_queue = list() + var/list/datum/bullet_data/current_queue = list() var/list/hitscans = list() var/list/datum/bullet_data/bullet_queue = list() @@ -83,6 +83,7 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) . = ..() + #undef LEVEL_BELOW #undef LEVEL_TURF #undef LEVEL_LYING From 1a615e9ffdf1ecdd6c7feba6b33d125ba2053230 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 23:13:56 +0300 Subject: [PATCH 005/171] j --- code/controllers/subsystems/bullets.dm | 17 +++++++++++++++++ code/modules/projectiles/gun.dm | 10 +++++++++- code/modules/projectiles/projectile.dm | 3 ++- .../projectiles/projectile/bullettypes.dm | 3 +++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 0e7ccf36e8..3ae79dfce8 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -5,6 +5,8 @@ #define LEVEL_TABLE 4 #define LEVEL_STANDING 5 #define LEVEL_ABOVE 6 + +#define PIXELS_PER_TURF 32 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -80,8 +82,23 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/getShootingAngle() return ATAN2(firedTurf.x - targetTurf.x, firedTurf.y - targetTurf.y) +/datum/bullet_data/proc/getCoordinateRatio() + var/x = abs(firedTurf.x - targetTurf.x) * PIXELS_PER_TURF + targetCoords[1] + var/y = abs(firedTurf.y - targetTurf.y) * PIXELS_PER_TURF + targetCoords[2] + var/r = sqrt(X ? X**2 : 0 + Y ? Y**2 : 0) + var/diff = X ? X/R : 0 - Y ? Y/R : 0 + // rounded down to 0.05 to keep it sane + return diff > 0 ? list(round(x * (1 - diff), 0.05), round(y * diff, 0.05)) : list(round(x * diff, 0.05), round(y * (1 - diff), 0.05)) + /datum/controller/subsystem/bullets/fire(resumed) . = ..() + if(!resumed) + current_queue = bullet_queue.Copy() + for(var/datum/bullet_data/bullet in current_queue) + var/list/ratios = bullet.getCoordinateRatio() + var/list/coordinates = list(PIXELS_PER_TURF * ratios[1] + bullet.currentCoords[1], PIXELS_PER_TURF * ratios[2] + bullet.currentCoords[2]) + animate(bullet.referencedBullet, 1 SECOND, pixel_x = coordinates[1]%PIXELS_PER_TURF, pixel_y = coordinates[2]%PIXELS_PER_TURF, x = bullet.referencedBullet.x + round(coordinates[1]/32), y = bullet.referencedBullet.y + round(coordinates[2]/32)) + current_queue -= bullet #undef LEVEL_BELOW diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 41e85a7b82..093d228c1a 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -106,6 +106,15 @@ var/flashlight_attachment = FALSE +/obj/item/gun/debugging + name = "Big chun chun chungus big chungus" + +/obj/item/gun/debugging/afterattack(atom/A, mob/user) + if(!A) + return + + + /obj/item/gun/wield(mob/user) if(!wield_delay) ..() @@ -368,7 +377,6 @@ to_chat(user, SPAN_WARNING("[src] is not ready to fire again!")) return - add_fingerprint(user) if(!special_check(user)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9c98f8df0d..35c8f03bb9 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -216,7 +216,8 @@ check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - Process() + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 1, 1, 50) + //Process() return FALSE diff --git a/code/modules/projectiles/projectile/bullettypes.dm b/code/modules/projectiles/projectile/bullettypes.dm index d8699fb93f..3ce8bafa37 100644 --- a/code/modules/projectiles/projectile/bullettypes.dm +++ b/code/modules/projectiles/projectile/bullettypes.dm @@ -13,6 +13,8 @@ There are important things regarding this file: * Scrap ammunition has less armor divisor and more recoil without impacting raw damage. */ //Low-caliber pistols and SMGs .35 + + /obj/item/projectile/bullet/pistol name = ".35 caliber bullet" damage_types = list(BRUTE = 26) @@ -22,6 +24,7 @@ There are important things regarding this file: style_damage = 20 recoil = 3 + /obj/item/projectile/bullet/pistol/hv armor_divisor = 1.5 step_delay = 0.75 From 672f2673802c0247ec15c5ba63963bf6c673481c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 23:16:20 +0300 Subject: [PATCH 006/171] Update cev_eris.dme --- cev_eris.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/cev_eris.dme b/cev_eris.dme index 0c7e662530..6ff46e7621 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -220,6 +220,7 @@ #include "code\controllers\subsystems\alarm.dm" #include "code\controllers\subsystems\assets.dm" #include "code\controllers\subsystems\atoms.dm" +#include "code\controllers\subsystems\bullets.dm" #include "code\controllers\subsystems\chat.dm" #include "code\controllers\subsystems\chemistry.dm" #include "code\controllers\subsystems\craft.dm" From 893b31663a3d52a5dd4916eff04536183b4e59d6 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 23:23:35 +0300 Subject: [PATCH 007/171] Update subsystems.dm --- code/__DEFINES/subsystems.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index fc32de0315..f436792ec1 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -115,7 +115,7 @@ #define INIT_ORDER_XKEYSCORE -10 #define INIT_ORDER_STICKY_BAN -10 #define INIT_ORDER_TICKETS -10 -#define INIT_ORDER_BULLES -11 +#define INIT_ORDER_BULLETS -11 #define INIT_ORDER_LIGHTING -20 #define INIT_ORDER_SHUTTLE -21 #define INIT_ORDER_SQUEAK -40 From 60e2d6a98fcedc4cdb06e5538da5a7d90d2116ea Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 12 Apr 2023 23:44:14 +0300 Subject: [PATCH 008/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 3ae79dfce8..9b6c47a83e 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -77,7 +77,7 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF else if(isitem(target)) src.targetLevel = LEVEL_TURF - bullet_queue += src + SSbullets.bullet_queue += src /datum/bullet_data/proc/getShootingAngle() return ATAN2(firedTurf.x - targetTurf.x, firedTurf.y - targetTurf.y) @@ -85,13 +85,12 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/getCoordinateRatio() var/x = abs(firedTurf.x - targetTurf.x) * PIXELS_PER_TURF + targetCoords[1] var/y = abs(firedTurf.y - targetTurf.y) * PIXELS_PER_TURF + targetCoords[2] - var/r = sqrt(X ? X**2 : 0 + Y ? Y**2 : 0) - var/diff = X ? X/R : 0 - Y ? Y/R : 0 + var/r = sqrt(x ? x**2 : 0 + y ? y**2 : 0) + var/diff = x ? x/r : 0 - y ? y/r : 0 // rounded down to 0.05 to keep it sane return diff > 0 ? list(round(x * (1 - diff), 0.05), round(y * diff, 0.05)) : list(round(x * diff, 0.05), round(y * (1 - diff), 0.05)) /datum/controller/subsystem/bullets/fire(resumed) - . = ..() if(!resumed) current_queue = bullet_queue.Copy() for(var/datum/bullet_data/bullet in current_queue) From aa5de6e96a8253bb58c683a1f6d8b9abd77c8156 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 13 Apr 2023 03:53:39 +0300 Subject: [PATCH 009/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 37 +++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 9b6c47a83e..2c1b62a0cf 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -87,16 +87,45 @@ SUBSYSTEM_DEF(bullets) var/y = abs(firedTurf.y - targetTurf.y) * PIXELS_PER_TURF + targetCoords[2] var/r = sqrt(x ? x**2 : 0 + y ? y**2 : 0) var/diff = x ? x/r : 0 - y ? y/r : 0 - // rounded down to 0.05 to keep it sane - return diff > 0 ? list(round(x * (1 - diff), 0.05), round(y * diff, 0.05)) : list(round(x * diff, 0.05), round(y * (1 - diff), 0.05)) + if(x && y) + // rounded down to 0.05 to keep it sane + return diff > 0 ? list(round(x * (1 - diff)/100, 0.01), round((y * diff)/100, 0.05)) : list(round((x * abs(diff))/100, 0.05), round(y * (1 - abs(diff))/100, 0.01)) + else if(x) + return list(1,0) + else if(y) + return list(0,1) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() for(var/datum/bullet_data/bullet in current_queue) + current_queue -= bullet + if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet)) + bullet_queue -= bullet + continue var/list/ratios = bullet.getCoordinateRatio() - var/list/coordinates = list(PIXELS_PER_TURF * ratios[1] + bullet.currentCoords[1], PIXELS_PER_TURF * ratios[2] + bullet.currentCoords[2]) - animate(bullet.referencedBullet, 1 SECOND, pixel_x = coordinates[1]%PIXELS_PER_TURF, pixel_y = coordinates[2]%PIXELS_PER_TURF, x = bullet.referencedBullet.x + round(coordinates[1]/32), y = bullet.referencedBullet.y + round(coordinates[2]/32)) + var/list/coordinates = list(round(PIXELS_PER_TURF * ratios[1]) + bullet.currentCoords[1], round(PIXELS_PER_TURF * ratios[2]) + bullet.currentCoords[2]) + if(coordinates[1] > 32 || coordinates[2] > 32) + var/newpx = coordinates[1] > PIXELS_PER_TURF ? PIXELS_PER_TURF : coordinates[1] + var/newpy = coordinates[2] > PIXELS_PER_TURF ? PIXELS_PER_TURF : coordinates[2] + animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 0.5) + bullet.referencedBullet.Move(locate(round(coordinates[1]/PIXELS_PER_TURF), round(coordinates[2]/PIXELS_PER_TURF), bullet.referencedBullet.z)) + bullet.referencedBullet.pixel_x = coordinates[1] > PIXELS_PER_TURF ? PIXELS_PER_TURF - coordinates[1] : coordinates[1] + bullet.referencedBullet.pixel_y = coordinates[2] > PIXELS_PER_TURF ? PIXELS_PER_TURF - coordinates[2] : coordinates[2] + animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 0.5) + bullet.currentCoords[1] = bullet.referencedBullet.pixel_x + bullet.currentCoords[2] = bullet.referencedBullet.pixel_y + else + var/newpx = coordinates[1] + var/newpy = coordinates[2] + animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 1) + bullet.currentCoords[1] = bullet.referencedBullet.pixel_x + bullet.currentCoords[2] = bullet.referencedBullet.pixel_y + + + + + //animate(bullet.referencedBullet, pixel_x = coordinates[1]%PIXELS_PER_TURF, pixel_y = coordinates[2]%PIXELS_PER_TURF, x = bullet.referencedBullet.x + round(coordinates[1]/32), y = bullet.referencedBullet.y + round(coordinates[2]/32), time = 1) current_queue -= bullet From 01e9aa5cf0c6a4835c1884bb35cd539ff53a4237 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 13 Apr 2023 04:31:39 +0300 Subject: [PATCH 010/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 31 +++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 2c1b62a0cf..9532ded934 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -6,7 +6,8 @@ #define LEVEL_STANDING 5 #define LEVEL_ABOVE 6 -#define PIXELS_PER_TURF 32 +/// Pixels per turf +#define PPT 32 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -80,20 +81,21 @@ SUBSYSTEM_DEF(bullets) SSbullets.bullet_queue += src /datum/bullet_data/proc/getShootingAngle() - return ATAN2(firedTurf.x - targetTurf.x, firedTurf.y - targetTurf.y) + return round(ATAN2((firedTurf.x - targetTurf.x) * PPT - targetCoords[1], (firedTurf.y - targetTurf.y)*PPT - targetCoords[2])*180/3.14) /datum/bullet_data/proc/getCoordinateRatio() - var/x = abs(firedTurf.x - targetTurf.x) * PIXELS_PER_TURF + targetCoords[1] - var/y = abs(firedTurf.y - targetTurf.y) * PIXELS_PER_TURF + targetCoords[2] - var/r = sqrt(x ? x**2 : 0 + y ? y**2 : 0) - var/diff = x ? x/r : 0 - y ? y/r : 0 - if(x && y) - // rounded down to 0.05 to keep it sane - return diff > 0 ? list(round(x * (1 - diff)/100, 0.01), round((y * diff)/100, 0.05)) : list(round((x * abs(diff))/100, 0.05), round(y * (1 - abs(diff))/100, 0.01)) - else if(x) - return list(1,0) - else if(y) - return list(0,1) + var/angle = getShootingAngle() + var/bias_x = sin(angle) + var/bias_y = cos(angle) + var/bias_diff = abs(bias_x) - abs(bias_y) + if(bias_diff > 0) + bias_x = bias_diff + bias_y = 1 - bias_diff + else + bias_x = 1 - abs(bias_diff) + bias_y = abs(bias_diff) + message_admins("angle : [angle] , ratio x : [bias_x] , ratio y : [bias_y] , total [bias_x + bias_y]") + return list(bias_x, bias_y) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) @@ -104,6 +106,8 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet continue var/list/ratios = bullet.getCoordinateRatio() + bullet_queue -= bullet + /* var/list/coordinates = list(round(PIXELS_PER_TURF * ratios[1]) + bullet.currentCoords[1], round(PIXELS_PER_TURF * ratios[2]) + bullet.currentCoords[2]) if(coordinates[1] > 32 || coordinates[2] > 32) var/newpx = coordinates[1] > PIXELS_PER_TURF ? PIXELS_PER_TURF : coordinates[1] @@ -121,6 +125,7 @@ SUBSYSTEM_DEF(bullets) animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 1) bullet.currentCoords[1] = bullet.referencedBullet.pixel_x bullet.currentCoords[2] = bullet.referencedBullet.pixel_y + */ From d71edefefc6d58079326e20cfd2cda8047b9b793 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 13 Apr 2023 17:29:33 +0300 Subject: [PATCH 011/171] E --- code/controllers/subsystems/bullets.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 9532ded934..c3d91e6bef 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -81,7 +81,13 @@ SUBSYSTEM_DEF(bullets) SSbullets.bullet_queue += src /datum/bullet_data/proc/getShootingAngle() - return round(ATAN2((firedTurf.x - targetTurf.x) * PPT - targetCoords[1], (firedTurf.y - targetTurf.y)*PPT - targetCoords[2])*180/3.14) + //return TODEGREES(ATAN2((firedTurf.x - targetTurf.x) * PPT - targetCoords[1], (firedTurf.y - targetTurf.y)*PPT - targetCoords[2])) + var/list/coordinates = list(0,0) + coordinates[1] = ((firedTurf.x - targetTurf.x) * PPT - targetCoords[1]) / PPT + 0.0001 + coordinates[2] = ((firedTurf.y - targetTurf.y) * PPT - targetCoords[2]) / PPT + 0.0001 + var/ipotenuse = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) + var/angleX = arcsin(coordinates[1] / ipotenuse) + var/angleY = arccos(coordinates[2] / ipotenuse) /datum/bullet_data/proc/getCoordinateRatio() var/angle = getShootingAngle() From 53c832a9aac45d2322bfe71f70c5eb84e851dc9c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 14 Apr 2023 15:37:07 +0300 Subject: [PATCH 012/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 90 +++++++++++++------------- 1 file changed, 46 insertions(+), 44 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index c3d91e6bef..6ad1aa0424 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -79,29 +79,28 @@ SUBSYSTEM_DEF(bullets) else if(isitem(target)) src.targetLevel = LEVEL_TURF SSbullets.bullet_queue += src - +/* /datum/bullet_data/proc/getShootingAngle() //return TODEGREES(ATAN2((firedTurf.x - targetTurf.x) * PPT - targetCoords[1], (firedTurf.y - targetTurf.y)*PPT - targetCoords[2])) var/list/coordinates = list(0,0) - coordinates[1] = ((firedTurf.x - targetTurf.x) * PPT - targetCoords[1]) / PPT + 0.0001 - coordinates[2] = ((firedTurf.y - targetTurf.y) * PPT - targetCoords[2]) / PPT + 0.0001 + coordinates[1] = ((targetTurf.x -firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 + coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2]) / PPT + 0.0001 var/ipotenuse = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) - var/angleX = arcsin(coordinates[1] / ipotenuse) - var/angleY = arccos(coordinates[2] / ipotenuse) + var/angleX = arcsin(coordinates[1]/ipotenuse) + var/angleY = arccos(coordinates[2]/ipotenuse) + + return 90 +*/ +/// I hate trigonometry /datum/bullet_data/proc/getCoordinateRatio() - var/angle = getShootingAngle() - var/bias_x = sin(angle) - var/bias_y = cos(angle) - var/bias_diff = abs(bias_x) - abs(bias_y) - if(bias_diff > 0) - bias_x = bias_diff - bias_y = 1 - bias_diff - else - bias_x = 1 - abs(bias_diff) - bias_y = abs(bias_diff) - message_admins("angle : [angle] , ratio x : [bias_x] , ratio y : [bias_y] , total [bias_x + bias_y]") - return list(bias_x, bias_y) + var/list/coordinates = list(0,0) + coordinates[1] = ((targetTurf.x -firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 + coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2]) / PPT + 0.0001 + var/ipotenuse = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) + var/coordonate_median = abs(coordinates[1]) + abs(coordinates[2]) + //message_admins("X-ratio [coordinates[1]/coordonate_median], Y-ratio [coordinates[2]/coordonate_median]") + return list(coordinates[1]/coordonate_median, coordinates[2]/coordonate_median) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) @@ -112,34 +111,37 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet continue var/list/ratios = bullet.getCoordinateRatio() - bullet_queue -= bullet - /* - var/list/coordinates = list(round(PIXELS_PER_TURF * ratios[1]) + bullet.currentCoords[1], round(PIXELS_PER_TURF * ratios[2]) + bullet.currentCoords[2]) - if(coordinates[1] > 32 || coordinates[2] > 32) - var/newpx = coordinates[1] > PIXELS_PER_TURF ? PIXELS_PER_TURF : coordinates[1] - var/newpy = coordinates[2] > PIXELS_PER_TURF ? PIXELS_PER_TURF : coordinates[2] - animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 0.5) - bullet.referencedBullet.Move(locate(round(coordinates[1]/PIXELS_PER_TURF), round(coordinates[2]/PIXELS_PER_TURF), bullet.referencedBullet.z)) - bullet.referencedBullet.pixel_x = coordinates[1] > PIXELS_PER_TURF ? PIXELS_PER_TURF - coordinates[1] : coordinates[1] - bullet.referencedBullet.pixel_y = coordinates[2] > PIXELS_PER_TURF ? PIXELS_PER_TURF - coordinates[2] : coordinates[2] - animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 0.5) - bullet.currentCoords[1] = bullet.referencedBullet.pixel_x - bullet.currentCoords[2] = bullet.referencedBullet.pixel_y - else - var/newpx = coordinates[1] - var/newpy = coordinates[2] - animate(bullet.referencedBullet, pixel_x = newpx, pixel_y = newpy, time = 1) - bullet.currentCoords[1] = bullet.referencedBullet.pixel_x - bullet.currentCoords[2] = bullet.referencedBullet.pixel_y - */ - - - - - //animate(bullet.referencedBullet, pixel_x = coordinates[1]%PIXELS_PER_TURF, pixel_y = coordinates[2]%PIXELS_PER_TURF, x = bullet.referencedBullet.x + round(coordinates[1]/32), y = bullet.referencedBullet.y + round(coordinates[2]/32), time = 1) - current_queue -= bullet - + var/px = round(ratios[1] * PPT) + bullet.currentCoords[1] + var/py = round(ratios[2] * PPT) + bullet.currentCoords[2] + if(abs(px) > PPT || abs(py) > PPT) + message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") + var/x_change = round(px/PPT) + var/y_change = round(py/PPT) + if(x_change < -1) + x_change++ + if(y_change < -1) + y_change++ + bullet.referencedBullet.Move(locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z)) + bullet.currentCoords[1] = px + bullet.currentCoords[2] = py + if(bullet.currentCoords[1] > PPT) + bullet.currentCoords[1] -= PPT + else if(bullet.currentCoords[1] < -PPT) + bullet.currentCoords[1] += PPT + if(bullet.currentCoords[2] > PPT) + bullet.currentCoords[2] -= PPT + else if(bullet.currentCoords[2] < -PPT) + bullet.currentCoords[2] += PPT + bullet.referencedBullet.pixel_x = bullet.currentCoords[1] + bullet.referencedBullet.pixel_y = bullet.currentCoords[2] + else + bullet.currentCoords[1] = px + bullet.referencedBullet.pixel_x = px + bullet.currentCoords[2] = py + bullet.referencedBullet.pixel_y = py + if(QDELETED(bullet.referencedBullet)) + bullet_queue -= bullet #undef LEVEL_BELOW #undef LEVEL_TURF #undef LEVEL_LYING From 52d875981161e777d1afbe359ec0e0cb923392f2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 14 Apr 2023 15:48:15 +0300 Subject: [PATCH 013/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 6ad1aa0424..053a2b4649 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -113,25 +113,21 @@ SUBSYSTEM_DEF(bullets) var/list/ratios = bullet.getCoordinateRatio() var/px = round(ratios[1] * PPT) + bullet.currentCoords[1] var/py = round(ratios[2] * PPT) + bullet.currentCoords[2] - if(abs(px) > PPT || abs(py) > PPT) + if(px > PPT/2 || py > PPT/2 || px < PPT/2 || py < PPT/2) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") - var/x_change = round(px/PPT) - var/y_change = round(py/PPT) - if(x_change < -1) - x_change++ - if(y_change < -1) - y_change++ + var/x_change = px > PPT/2 ? 1 : px < -PPT/2 ? -1 : 0 + var/y_change = py > PPT/2 ? 1 : py < -PPT/2 ? -1 : 0 bullet.referencedBullet.Move(locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z)) bullet.currentCoords[1] = px bullet.currentCoords[2] = py - if(bullet.currentCoords[1] > PPT) - bullet.currentCoords[1] -= PPT - else if(bullet.currentCoords[1] < -PPT) - bullet.currentCoords[1] += PPT - if(bullet.currentCoords[2] > PPT) - bullet.currentCoords[2] -= PPT - else if(bullet.currentCoords[2] < -PPT) - bullet.currentCoords[2] += PPT + if(bullet.currentCoords[1] > PPT/2) + bullet.currentCoords[1] -= PPT/2 + else if(bullet.currentCoords[1] < -PPT/2) + bullet.currentCoords[1] += PPT/2 + if(bullet.currentCoords[2] > PPT/2) + bullet.currentCoords[2] -= PPT/2 + else if(bullet.currentCoords[2] < -PPT/2) + bullet.currentCoords[2] += PPT/2 bullet.referencedBullet.pixel_x = bullet.currentCoords[1] bullet.referencedBullet.pixel_y = bullet.currentCoords[2] From 773abe8e3cf73f628db749ae983baae532089f6f Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 14 Apr 2023 16:49:24 +0300 Subject: [PATCH 014/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 56 +++++++++++++++----------- 1 file changed, 33 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 053a2b4649..96403af999 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -97,9 +97,7 @@ SUBSYSTEM_DEF(bullets) var/list/coordinates = list(0,0) coordinates[1] = ((targetTurf.x -firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2]) / PPT + 0.0001 - var/ipotenuse = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) var/coordonate_median = abs(coordinates[1]) + abs(coordinates[2]) - //message_admins("X-ratio [coordinates[1]/coordonate_median], Y-ratio [coordinates[2]/coordonate_median]") return list(coordinates[1]/coordonate_median, coordinates[2]/coordonate_median) /datum/controller/subsystem/bullets/fire(resumed) @@ -113,29 +111,41 @@ SUBSYSTEM_DEF(bullets) var/list/ratios = bullet.getCoordinateRatio() var/px = round(ratios[1] * PPT) + bullet.currentCoords[1] var/py = round(ratios[2] * PPT) + bullet.currentCoords[2] - if(px > PPT/2 || py > PPT/2 || px < PPT/2 || py < PPT/2) + var/x_change = 0 + var/y_change = 0 + while(px > PPT/2 || py > PPT/2 || px < -PPT/2 || py < -PPT/2) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") - var/x_change = px > PPT/2 ? 1 : px < -PPT/2 ? -1 : 0 - var/y_change = py > PPT/2 ? 1 : py < -PPT/2 ? -1 : 0 - bullet.referencedBullet.Move(locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z)) - bullet.currentCoords[1] = px - bullet.currentCoords[2] = py - if(bullet.currentCoords[1] > PPT/2) - bullet.currentCoords[1] -= PPT/2 - else if(bullet.currentCoords[1] < -PPT/2) - bullet.currentCoords[1] += PPT/2 - if(bullet.currentCoords[2] > PPT/2) - bullet.currentCoords[2] -= PPT/2 - else if(bullet.currentCoords[2] < -PPT/2) - bullet.currentCoords[2] += PPT/2 - bullet.referencedBullet.pixel_x = bullet.currentCoords[1] - bullet.referencedBullet.pixel_y = bullet.currentCoords[2] + x_change += px > PPT/2 ? 1 : px < -PPT/2 ? -1 : 0 + y_change += py > PPT/2 ? 1 : py < -PPT/2 ? -1 : 0 + if(px > PPT/2) + px -= PPT/2 + else if(px < -PPT/2) + px += PPT/2 + if(py > PPT/2) + py -= PPT/2 + else if(py < -PPT/2) + py += PPT/2 - else - bullet.currentCoords[1] = px - bullet.referencedBullet.pixel_x = px - bullet.currentCoords[2] = py - bullet.referencedBullet.pixel_y = py + if(x_change > 0) + px = px - PPT/2 + else if(x_change < 0) + px = PPT/2 + px + if(y_change > 0) + py = py - PPT/2 + else if(y_change < 0) + py = PPT/2 + py + + bullet.referencedBullet.Move(locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z)) + bullet.currentCoords[1] = px + bullet.currentCoords[2] = py + bullet.referencedBullet.pixel_x = bullet.currentCoords[1] + bullet.referencedBullet.pixel_y = bullet.currentCoords[2] + /* + bullet.currentCoords[1] = px + bullet.referencedBullet.pixel_x = px + bullet.currentCoords[2] = py + bullet.referencedBullet.pixel_y = py + */ if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet #undef LEVEL_BELOW From d86f0c37c6488cfb0902b57e8687ec94b595cf4c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 16 Apr 2023 07:00:21 +0300 Subject: [PATCH 015/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 96403af999..f102d87f8f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -29,6 +29,7 @@ SUBSYSTEM_DEF(bullets) var/list/targetCoords = list(0,0) var/turf/currentTurf = null var/currentCoords = list(0,0) + var/list/turf/coloreds = list() var/targetLevel = 0 var/turfsPerTick = 0 var/projectileAccuracy = 0 @@ -125,17 +126,20 @@ SUBSYSTEM_DEF(bullets) py -= PPT/2 else if(py < -PPT/2) py += PPT/2 - + /* if(x_change > 0) - px = px - PPT/2 + px = PPT/2 - px else if(x_change < 0) px = PPT/2 + px if(y_change > 0) - py = py - PPT/2 + py = PPT/2 - py else if(y_change < 0) py = PPT/2 + py - - bullet.referencedBullet.Move(locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z)) + */ + var/turf/target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + bullet.coloreds |= target_turf + target_turf.color = "#2fff05ee" + bullet.referencedBullet.Move(target_turf) bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.referencedBullet.pixel_x = bullet.currentCoords[1] @@ -148,6 +152,8 @@ SUBSYSTEM_DEF(bullets) */ if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet + for(var/turf/thing in bullet.coloreds) + thing.color = initial(thing.color) #undef LEVEL_BELOW #undef LEVEL_TURF #undef LEVEL_LYING From 6a0c13ebb503fecccf8f6b02fe5d9e5ec91861a9 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 16 Apr 2023 07:45:28 +0300 Subject: [PATCH 016/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index f102d87f8f..a301dadfaa 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -45,7 +45,8 @@ SUBSYSTEM_DEF(bullets) src.firedTurf = get_turf(firer) src.target = target src.targetTurf = get_turf(target) - src.targetCoords = targetCoords + //src.targetCoords = targetCoords + src.targetCoords = list(8,8) src.turfsPerTick = turfsPerTick src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime @@ -114,8 +115,13 @@ SUBSYSTEM_DEF(bullets) var/py = round(ratios[2] * PPT) + bullet.currentCoords[2] var/x_change = 0 var/y_change = 0 + var/turf/target_turf while(px > PPT/2 || py > PPT/2 || px < -PPT/2 || py < -PPT/2) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") + if(QDELETED(bullet.referencedBullet)) + break + x_change = 0 + y_change = 0 x_change += px > PPT/2 ? 1 : px < -PPT/2 ? -1 : 0 y_change += py > PPT/2 ? 1 : py < -PPT/2 ? -1 : 0 if(px > PPT/2) @@ -126,6 +132,11 @@ SUBSYSTEM_DEF(bullets) py -= PPT/2 else if(py < -PPT/2) py += PPT/2 + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + bullet.referencedBullet.Move(target_turf) + bullet.coloreds |= target_turf + target_turf.color = "#2fff05ee" + /* if(x_change > 0) px = PPT/2 - px @@ -136,10 +147,6 @@ SUBSYSTEM_DEF(bullets) else if(y_change < 0) py = PPT/2 + py */ - var/turf/target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) - bullet.coloreds |= target_turf - target_turf.color = "#2fff05ee" - bullet.referencedBullet.Move(target_turf) bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.referencedBullet.pixel_x = bullet.currentCoords[1] From 251badc4ee7738c1f581f069b4c7e3dc35d94fef Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 16 Apr 2023 23:22:29 +0300 Subject: [PATCH 017/171] z --- code/controllers/subsystems/bullets.dm | 58 ++++++++------------------ code/modules/projectiles/projectile.dm | 2 +- 2 files changed, 19 insertions(+), 41 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index a301dadfaa..8650e6df32 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -18,6 +18,9 @@ SUBSYSTEM_DEF(bullets) var/list/hitscans = list() var/list/datum/bullet_data/bullet_queue = list() +/// You might ask why use a bullet data datum, and not store all the vars on the bullet itself, honestly its to keep track and initialize firing relevant vars only when needed +/// This data is guaranteed to be of temporary use spanning 15-30 seconds or how long the bullet moves for. Putting them on the bullet makes each one take up more ram +/// And ram is not a worry , but its better to initialize less and do the lifting on fire. /datum/bullet_data var/obj/item/projectile/referencedBullet = null var/aimedZone = "" @@ -81,26 +84,16 @@ SUBSYSTEM_DEF(bullets) else if(isitem(target)) src.targetLevel = LEVEL_TURF SSbullets.bullet_queue += src -/* -/datum/bullet_data/proc/getShootingAngle() - //return TODEGREES(ATAN2((firedTurf.x - targetTurf.x) * PPT - targetCoords[1], (firedTurf.y - targetTurf.y)*PPT - targetCoords[2])) - var/list/coordinates = list(0,0) - coordinates[1] = ((targetTurf.x -firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 - coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2]) / PPT + 0.0001 - var/ipotenuse = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) - var/angleX = arcsin(coordinates[1]/ipotenuse) - var/angleY = arccos(coordinates[2]/ipotenuse) - - return 90 -*/ /// I hate trigonometry /datum/bullet_data/proc/getCoordinateRatio() var/list/coordinates = list(0,0) - coordinates[1] = ((targetTurf.x -firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 + // These add 0.0001 so in the case we are firing straight we don't have to handle special cases(division by 0) + // The 0.0001 are meaningless overall considering the scale of calculation. + coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2]) / PPT + 0.0001 - var/coordonate_median = abs(coordinates[1]) + abs(coordinates[2]) - return list(coordinates[1]/coordonate_median, coordinates[2]/coordonate_median) + var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) + return list(coordinates[1]/r, coordinates[2]/r) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) @@ -111,52 +104,37 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet continue var/list/ratios = bullet.getCoordinateRatio() - var/px = round(ratios[1] * PPT) + bullet.currentCoords[1] - var/py = round(ratios[2] * PPT) + bullet.currentCoords[2] + var/px = round(ratios[1] * PPT/2 * bullet.turfsPerTick) + bullet.currentCoords[1] + var/py = round(ratios[2] * PPT/2 * bullet.turfsPerTick) + bullet.currentCoords[2] var/x_change = 0 var/y_change = 0 var/turf/target_turf - while(px > PPT/2 || py > PPT/2 || px < -PPT/2 || py < -PPT/2) + while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") if(QDELETED(bullet.referencedBullet)) break x_change = 0 y_change = 0 - x_change += px > PPT/2 ? 1 : px < -PPT/2 ? -1 : 0 - y_change += py > PPT/2 ? 1 : py < -PPT/2 ? -1 : 0 - if(px > PPT/2) + x_change += px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 + y_change += py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 + if(px >= PPT/2) px -= PPT/2 - else if(px < -PPT/2) + else if(px <= -PPT/2) px += PPT/2 - if(py > PPT/2) + if(py >= PPT/2) py -= PPT/2 - else if(py < -PPT/2) + else if(py <= -PPT/2) py += PPT/2 target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) bullet.referencedBullet.Move(target_turf) bullet.coloreds |= target_turf target_turf.color = "#2fff05ee" - /* - if(x_change > 0) - px = PPT/2 - px - else if(x_change < 0) - px = PPT/2 + px - if(y_change > 0) - py = PPT/2 - py - else if(y_change < 0) - py = PPT/2 + py - */ + bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.referencedBullet.pixel_x = bullet.currentCoords[1] bullet.referencedBullet.pixel_y = bullet.currentCoords[2] - /* - bullet.currentCoords[1] = px - bullet.referencedBullet.pixel_x = px - bullet.currentCoords[2] = py - bullet.referencedBullet.pixel_y = py - */ if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 35c8f03bb9..952bfd16d8 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -216,7 +216,7 @@ check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 1, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 0.2, 1, 50) //Process() return FALSE From f5a848400dd8e21c7cbca4a3ed6c053468b186c3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 16 Apr 2023 23:40:50 +0300 Subject: [PATCH 018/171] dzz --- code/controllers/subsystems/bullets.dm | 18 ++++++++---------- code/modules/projectiles/projectile.dm | 2 +- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 8650e6df32..b974bc3979 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -90,8 +90,8 @@ SUBSYSTEM_DEF(bullets) var/list/coordinates = list(0,0) // These add 0.0001 so in the case we are firing straight we don't have to handle special cases(division by 0) // The 0.0001 are meaningless overall considering the scale of calculation. - coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1]) / PPT + 0.0001 - coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2]) / PPT + 0.0001 + coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - 8) / PPT + 0.0001 + coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - 8) / PPT + 0.0001 var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) return list(coordinates[1]/r, coordinates[2]/r) @@ -104,8 +104,8 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet continue var/list/ratios = bullet.getCoordinateRatio() - var/px = round(ratios[1] * PPT/2 * bullet.turfsPerTick) + bullet.currentCoords[1] - var/py = round(ratios[2] * PPT/2 * bullet.turfsPerTick) + bullet.currentCoords[2] + var/px = ratios[1] * bullet.turfsPerTick + bullet.currentCoords[1] + var/py = ratios[2] * bullet.turfsPerTick + bullet.currentCoords[2] var/x_change = 0 var/y_change = 0 var/turf/target_turf @@ -113,10 +113,8 @@ SUBSYSTEM_DEF(bullets) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") if(QDELETED(bullet.referencedBullet)) break - x_change = 0 - y_change = 0 - x_change += px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 - y_change += py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 + x_change = px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 + y_change = py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 if(px >= PPT/2) px -= PPT/2 else if(px <= -PPT/2) @@ -133,8 +131,8 @@ SUBSYSTEM_DEF(bullets) bullet.currentCoords[1] = px bullet.currentCoords[2] = py - bullet.referencedBullet.pixel_x = bullet.currentCoords[1] - bullet.referencedBullet.pixel_y = bullet.currentCoords[2] + bullet.referencedBullet.pixel_x = round(bullet.currentCoords[1]) + bullet.referencedBullet.pixel_y = round(bullet.currentCoords[2]) if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 952bfd16d8..91312c9a89 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -216,7 +216,7 @@ check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 0.2, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 5, 1, 50) //Process() return FALSE From 833fe01aa11fff93fbf3d24e55eeec76d8e63258 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 17 Apr 2023 03:29:12 +0300 Subject: [PATCH 019/171] proper support for multi-Z shooting + multi-Z angles. --- code/controllers/subsystems/bullets.dm | 79 +++++++++++++++++--------- code/modules/projectiles/projectile.dm | 2 +- 2 files changed, 52 insertions(+), 29 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index b974bc3979..c3afad98b6 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,10 +1,10 @@ #define LEVEL_BELOW 0 -#define LEVEL_TURF 1 -#define LEVEL_LYING 2 -#define LEVEL_LOWWALL 3 -#define LEVEL_TABLE 4 -#define LEVEL_STANDING 5 -#define LEVEL_ABOVE 6 +#define LEVEL_TURF 0.2 +#define LEVEL_LYING 0.3 +#define LEVEL_LOWWALL 0.5 +#define LEVEL_TABLE 0.6 +#define LEVEL_STANDING 0.8 +#define LEVEL_ABOVE 1 /// Pixels per turf #define PPT 32 @@ -15,7 +15,6 @@ SUBSYSTEM_DEF(bullets) init_order = INIT_ORDER_BULLETS var/list/datum/bullet_data/current_queue = list() - var/list/hitscans = list() var/list/datum/bullet_data/bullet_queue = list() /// You might ask why use a bullet data datum, and not store all the vars on the bullet itself, honestly its to keep track and initialize firing relevant vars only when needed @@ -26,14 +25,17 @@ SUBSYSTEM_DEF(bullets) var/aimedZone = "" var/atom/firer = null var/turf/firedTurf = null + var/list/firedCoordinates = list(0,0,0) var/firedLevel = 0 var/atom/target = null var/turf/targetTurf = null - var/list/targetCoords = list(0,0) + var/list/targetCoords = list(0,0,0) var/turf/currentTurf = null - var/currentCoords = list(0,0) + var/currentCoords = list(0,0,0) + var/movementRatios = list(0,0,0,0) var/list/turf/coloreds = list() var/targetLevel = 0 + var/currentLevel = 0 var/turfsPerTick = 0 var/projectileAccuracy = 0 var/lifetime = 10 @@ -83,17 +85,39 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF else if(isitem(target)) src.targetLevel = LEVEL_TURF + src.firedCoordinates[1] = 8 + src.firedCoordinates[2] = 8 + src.firedCoordinates[3] = bullet.referencedBullet.z + updateCoordinateRatio() SSbullets.bullet_queue += src -/// I hate trigonometry -/datum/bullet_data/proc/getCoordinateRatio() - var/list/coordinates = list(0,0) +/// I hate trigonometry, but i hate ATAN2 more. +/datum/bullet_data/proc/updateCoordinateRatio() + var/list/coordinates = list(0,0,0) // These add 0.0001 so in the case we are firing straight we don't have to handle special cases(division by 0) // The 0.0001 are meaningless overall considering the scale of calculation. - coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - 8) / PPT + 0.0001 - coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - 8) / PPT + 0.0001 + coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - firedCoordinates[1]) / PPT + 0.0001 + coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - firedCoordinates[2]) / PPT + 0.0001 var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) - return list(coordinates[1]/r, coordinates[2]/r) + // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio + movementRatios = list(coordinates[1]/r, coordinates[2]/r, (targetCoords[3] - firedLevel[3])/r + firedLevel - targetLevel) + +/datum/bullet_data/proc/updateLevel() + switch(currentCoords[3]) + if(-INFINITY to LEVEL_BELOW) + currentLevel = LEVEL_BELOW + if(LEVEL_BELOW to LEVEL_TURF) + currentLevel = LEVEL_TURF + if(LEVEL_TURF to LEVEL_LYING) + currentLevel = LEVEL_LYING + if(LEVEL_LYING to LEVEL_LOWWALL) + currentLevel = LEVEL_LOWWALL + if(LEVEL_LOWWALL to LEVEL_TABLE) + currentLevel = LEVEL_TABLE + if(LEVEL_TABLE to LEVEL_STANDING) + currentLevel = LEVEL_STANDING + if(LEVEL_STANDING to INFINITY) + currentLevel = LEVEL_ABOVE /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) @@ -103,27 +127,25 @@ SUBSYSTEM_DEF(bullets) if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet)) bullet_queue -= bullet continue - var/list/ratios = bullet.getCoordinateRatio() - var/px = ratios[1] * bullet.turfsPerTick + bullet.currentCoords[1] - var/py = ratios[2] * bullet.turfsPerTick + bullet.currentCoords[2] + var/px = bullet.movementRatios[1] * bullet.turfsPerTick + bullet.currentCoords[1] + var/py = bullet.movementRatios[2] * bullet.turfsPerTick + bullet.currentCoords[2] + var/pz = bullet.movementRatios[3] * bullet.turfsPerTick + bullet.currentCoords[3] var/x_change = 0 var/y_change = 0 + var/z_change = 0 var/turf/target_turf - while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2) + while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz != bullet.currentCoords[3]) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") if(QDELETED(bullet.referencedBullet)) break x_change = px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 y_change = py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 - if(px >= PPT/2) - px -= PPT/2 - else if(px <= -PPT/2) - px += PPT/2 - if(py >= PPT/2) - py -= PPT/2 - else if(py <= -PPT/2) - py += PPT/2 - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + z_change = round(pz) > bullet.currentCoords[3] ? 1 : round(pz) < bullet.currentCoords[3] ? : -1 : 0 + px += -1 * x_change * PPT/2 + py += -1 * y_change * PPT/2 + pz += z_change + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + z_change) + bullet.updateLevel() bullet.referencedBullet.Move(target_turf) bullet.coloreds |= target_turf target_turf.color = "#2fff05ee" @@ -131,6 +153,7 @@ SUBSYSTEM_DEF(bullets) bullet.currentCoords[1] = px bullet.currentCoords[2] = py + bullet.currentCoords[3] = pz bullet.referencedBullet.pixel_x = round(bullet.currentCoords[1]) bullet.referencedBullet.pixel_y = round(bullet.currentCoords[2]) if(QDELETED(bullet.referencedBullet)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 91312c9a89..25599a14d7 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -216,7 +216,7 @@ check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 5, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 16, 1, 50) //Process() return FALSE From 0395ebb4700b963e47611494b103d4cba60d9755 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 17 Apr 2023 03:36:52 +0300 Subject: [PATCH 020/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index c3afad98b6..4511ee0528 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -87,7 +87,7 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF src.firedCoordinates[1] = 8 src.firedCoordinates[2] = 8 - src.firedCoordinates[3] = bullet.referencedBullet.z + src.firedCoordinates[3] = referencedBullet.z updateCoordinateRatio() SSbullets.bullet_queue += src @@ -140,7 +140,10 @@ SUBSYSTEM_DEF(bullets) break x_change = px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 y_change = py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 - z_change = round(pz) > bullet.currentCoords[3] ? 1 : round(pz) < bullet.currentCoords[3] ? : -1 : 0 + if(round(pz) > bullet.currentCoords[3]) + z_change = 1 + else if(round(pz) < round(bullet.currentCoords[3])) + z_change = -1 px += -1 * x_change * PPT/2 py += -1 * y_change * PPT/2 pz += z_change From 57b23dfe0f5b98e5ac88e031ac11cddc7b2096ec Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 17 Apr 2023 22:45:20 +0300 Subject: [PATCH 021/171] z --- code/controllers/subsystems/bullets.dm | 1 + code/game/turfs/simulated/walls.dm | 2 ++ 2 files changed, 3 insertions(+) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 4511ee0528..860f92e293 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -148,6 +148,7 @@ SUBSYSTEM_DEF(bullets) py += -1 * y_change * PPT/2 pz += z_change target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + z_change) + if(iswall(target_turf) && target_turf:projectileBounceCheck()) bullet.updateLevel() bullet.referencedBullet.Move(target_turf) bullet.coloreds |= target_turf diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 513ea1fae0..9e478c92fa 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -99,6 +99,8 @@ update_icon() +/turf/simulated/wall/proc/projectileBounceCheck(obj/item/projectile/incoming) + return TRUE /turf/simulated/wall/Destroy() STOP_PROCESSING(SSturf, src) From fa334bef7d06cc8bc2a43d05a1b0deef1b032b0c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 30 Apr 2023 09:49:52 +0300 Subject: [PATCH 022/171] kk --- code/controllers/subsystems/bullets.dm | 17 +++++++++-------- code/modules/projectiles/projectile.dm | 2 +- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 860f92e293..0e5683a714 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -44,14 +44,14 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) - src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y) + src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, currentTurf.z) src.aimedZone = aimedZone src.firer = firer src.firedTurf = get_turf(firer) src.target = target src.targetTurf = get_turf(target) - //src.targetCoords = targetCoords - src.targetCoords = list(8,8) + src.targetCoords = targetCoords + //src.targetCoords = list(8,8, targetTurf.z) src.turfsPerTick = turfsPerTick src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime @@ -85,9 +85,7 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF else if(isitem(target)) src.targetLevel = LEVEL_TURF - src.firedCoordinates[1] = 8 - src.firedCoordinates[2] = 8 - src.firedCoordinates[3] = referencedBullet.z + src.firedCoordinates = list(8,8, referencedBullet.z) updateCoordinateRatio() SSbullets.bullet_queue += src @@ -99,8 +97,11 @@ SUBSYSTEM_DEF(bullets) coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - firedCoordinates[1]) / PPT + 0.0001 coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - firedCoordinates[2]) / PPT + 0.0001 var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) + coordinates[3] = (targetCoords[3] - firedCoordinates[3])/r + firedLevel - targetLevel + coordinates[1] = coordinates[1]/r + coordinates[2] = coordinates[2]/r // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio - movementRatios = list(coordinates[1]/r, coordinates[2]/r, (targetCoords[3] - firedLevel[3])/r + firedLevel - targetLevel) + movementRatios = coordinates /datum/bullet_data/proc/updateLevel() switch(currentCoords[3]) @@ -148,7 +149,7 @@ SUBSYSTEM_DEF(bullets) py += -1 * y_change * PPT/2 pz += z_change target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + z_change) - if(iswall(target_turf) && target_turf:projectileBounceCheck()) + //if(iswall(target_turf) && target_turf:projectileBounceCheck()) bullet.updateLevel() bullet.referencedBullet.Move(target_turf) bullet.coloreds |= target_turf diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 25599a14d7..7a4744abce 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -216,7 +216,7 @@ check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset), 16, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset + 8, y_offset + 8, target.z), 16, 1, 50) //Process() return FALSE From a6e3ee3a32067ee6a158a6d5fae930c06123300c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 1 May 2023 09:24:07 +0300 Subject: [PATCH 023/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 0e5683a714..43a12f9487 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -120,6 +120,23 @@ SUBSYSTEM_DEF(bullets) if(LEVEL_STANDING to INFINITY) currentLevel = LEVEL_ABOVE +/datum/bullet_data/proc/getLevel(height) + switch(height) + if(-INFINITY to LEVEL_BELOW) + return LEVEL_BELOW + if(LEVEL_BELOW to LEVEL_TURF) + return LEVEL_TURF + if(LEVEL_TURF to LEVEL_LYING) + return LEVEL_LYING + if(LEVEL_LYING to LEVEL_LOWWALL) + return LEVEL_LOWWALL + if(LEVEL_LOWWALL to LEVEL_TABLE) + return LEVEL_TABLE + if(LEVEL_TABLE to LEVEL_STANDING) + return LEVEL_STANDING + if(LEVEL_STANDING to INFINITY) + return LEVEL_ABOVE + /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() @@ -135,8 +152,8 @@ SUBSYSTEM_DEF(bullets) var/y_change = 0 var/z_change = 0 var/turf/target_turf - while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz != bullet.currentCoords[3]) - message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px]") + while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz > 1 || pz < 0) + message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") if(QDELETED(bullet.referencedBullet)) break x_change = px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 From e2b91914fa7522800b0a66e92c127774533816c2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 1 May 2023 11:10:47 +0300 Subject: [PATCH 024/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 43a12f9487..e4cc67e91c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -44,7 +44,7 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) - src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, currentTurf.z) + src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, 0) src.aimedZone = aimedZone src.firer = firer src.firedTurf = get_turf(firer) @@ -86,6 +86,7 @@ SUBSYSTEM_DEF(bullets) else if(isitem(target)) src.targetLevel = LEVEL_TURF src.firedCoordinates = list(8,8, referencedBullet.z) + src.currentCoords[3] += firedLevel updateCoordinateRatio() SSbullets.bullet_queue += src @@ -97,7 +98,7 @@ SUBSYSTEM_DEF(bullets) coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - firedCoordinates[1]) / PPT + 0.0001 coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - firedCoordinates[2]) / PPT + 0.0001 var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) - coordinates[3] = (targetCoords[3] - firedCoordinates[3])/r + firedLevel - targetLevel + coordinates[3] = (targetCoords[3] - firedCoordinates[3] + targetLevel - firedLevel)/r coordinates[1] = coordinates[1]/r coordinates[2] = coordinates[2]/r // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio @@ -147,7 +148,7 @@ SUBSYSTEM_DEF(bullets) continue var/px = bullet.movementRatios[1] * bullet.turfsPerTick + bullet.currentCoords[1] var/py = bullet.movementRatios[2] * bullet.turfsPerTick + bullet.currentCoords[2] - var/pz = bullet.movementRatios[3] * bullet.turfsPerTick + bullet.currentCoords[3] + var/pz = bullet.movementRatios[3] + bullet.currentCoords[3] var/x_change = 0 var/y_change = 0 var/z_change = 0 @@ -158,14 +159,17 @@ SUBSYSTEM_DEF(bullets) break x_change = px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 y_change = py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 - if(round(pz) > bullet.currentCoords[3]) + if(round(pz) > 1) z_change = 1 - else if(round(pz) < round(bullet.currentCoords[3])) + else if(round(pz) < 0) z_change = -1 px += -1 * x_change * PPT/2 py += -1 * y_change * PPT/2 - pz += z_change + pz += -1 * z_change target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + z_change) + if(!target_turf) + bullet_queue -= bullet + break //if(iswall(target_turf) && target_turf:projectileBounceCheck()) bullet.updateLevel() bullet.referencedBullet.Move(target_turf) From c1f41d1b85d77f2b4ab8dd4bad834a930ea16bb7 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 4 May 2023 16:22:49 +0300 Subject: [PATCH 025/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index e4cc67e91c..793e4b29b9 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -172,6 +172,13 @@ SUBSYSTEM_DEF(bullets) break //if(iswall(target_turf) && target_turf:projectileBounceCheck()) bullet.updateLevel() + if(iswall(target_turf)) + var/turf/simulated/wall/the_rock = target_turf + var/angle = TODEGREES(ATAN2(the_rock.x - bullet.referencedBullet.x, the_rock.y - bullet.referencedBullet.y)) + // third quadrant is a lil silly + if(the_rock.x - bullet.referencedBullet.x < 0 && the_rock.y - bullet.referencedBullet.y < 0) + angle = -(180+angle) + bullet.referencedBullet.Move(target_turf) bullet.coloreds |= target_turf target_turf.color = "#2fff05ee" From ee8fab3e3d3a528a8e8bce70cdc341813d43e9a7 Mon Sep 17 00:00:00 2001 From: MLGTASTICa <61350382+MLGTASTICa@users.noreply.github.com> Date: Sat, 3 Jun 2023 02:56:49 +0300 Subject: [PATCH 026/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 30 +++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index e4cc67e91c..2c91e90b4f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -104,6 +104,24 @@ SUBSYSTEM_DEF(bullets) // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio movementRatios = coordinates +/datum/bullet_data/proc/ricochet(atom/wall) + var/list/bCoords = list(bullet.referencedBullet.x, bullet.referencedBullet.y) + var/list/wCoords = list(wall.x, wall.y) + var/list/cCoords = list(abs(bCoords[1] - wCoords[1] + 0.00001), abs(bCoords[2] - wCoords[2] + 0.00001)) + var/list/tCoords = list(0,0) + var/ipothenuse = sqrt(cCoords[1]**2 + cCoords[2]**2) + if(cCoords[1] > cCoords[2]) + var/s = cCoords[1]/ipothenuse + s = 90 - arcsin(s) + if(s < 30) + cCoords[1] = -cCoords[1] + else + var/s = cCoords[2]/ipothenuse + s = 90 - arcsin(s) + if(s < 30) + cCoords[2] = -cCoords[2] + return cCoords + /datum/bullet_data/proc/updateLevel() switch(currentCoords[3]) if(-INFINITY to LEVEL_BELOW) @@ -166,7 +184,15 @@ SUBSYSTEM_DEF(bullets) px += -1 * x_change * PPT/2 py += -1 * y_change * PPT/2 pz += -1 * z_change - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + z_change) + if(z_change) + if(z_change > 1) + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z++) + else + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + target_turf.take_damage(bullet.referencedBullet.get_structure_damage(), BRUTE, FALSE) + else + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + if(!target_turf) bullet_queue -= bullet break @@ -186,6 +212,8 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) thing.color = initial(thing.color) + + #undef LEVEL_BELOW #undef LEVEL_TURF #undef LEVEL_LYING From 3543884781332807748cc27893f9e8b2e19ffe90 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 20 Jan 2024 14:42:10 +0200 Subject: [PATCH 027/171] hhh --- code/controllers/subsystems/bullets.dm | 67 ++++++++++++++++++++++++-- code/game/turfs/simulated/walls.dm | 4 +- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 793e4b29b9..e40a3d31d9 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -17,6 +17,8 @@ SUBSYSTEM_DEF(bullets) var/list/datum/bullet_data/current_queue = list() var/list/datum/bullet_data/bullet_queue = list() + + /// You might ask why use a bullet data datum, and not store all the vars on the bullet itself, honestly its to keep track and initialize firing relevant vars only when needed /// This data is guaranteed to be of temporary use spanning 15-30 seconds or how long the bullet moves for. Putting them on the bullet makes each one take up more ram /// And ram is not a worry , but its better to initialize less and do the lifting on fire. @@ -138,6 +140,10 @@ SUBSYSTEM_DEF(bullets) if(LEVEL_STANDING to INFINITY) return LEVEL_ABOVE +/datum/controller/subsystem/bullets/proc/reset() + current_queue = list() + bullet_queue = list() + /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() @@ -174,14 +180,69 @@ SUBSYSTEM_DEF(bullets) bullet.updateLevel() if(iswall(target_turf)) var/turf/simulated/wall/the_rock = target_turf + /// Calculate coefficients for movement + var/dist_x = (the_rock.x - bullet.firedTurf.x) * PPT/2 + var/dist_y = (the_rock.y - bullet.firedTurf.y) * PPT/2 + if(!dist_x) dist_x++ + if(!dist_y) dist_y++ + /// Adjust for the actual point of contact + var/angle + if(abs(dist_y) > abs(dist_x)) + // Bullet offset + dist_y += bullet.firedCoordinates[2] + // Edge offset + dist_x += dist_x/abs(dist_x) * PPT/2 + // Get the angle , necesarry geometry evil. + angle = arcsin(dist_x/(sqrt(dist_x**2+dist_y**2))) + else + // Bullet offset + dist_x += bullet.firedCoordinates[1] + // Edge offset + dist_y += dist_y/abs(dist_y) * PPT/2 + // Get the angle , necesarry geometry evil.. + angle = arcsin(dist_y/(sqrt(dist_x**2+dist_y**2))) + message_admins("calculated angle is [angle]") + /* + var/x_ratio = the_rock.x - bullet.firedTurf.x + var/y_ratio = the_rock.y - bullet.firedTurf.y + x_ratio += x_ratio != 0 ? x_ratio/abs(x_ratio) : 1 + y_ratio += y_ratio != 0 ? y_ratio/abs(y_ratio) : 1 + x_ratio = x_ratio * 16 + 8 * x_ratio/abs(x_ratio) - bullet.currentCoords[1] + y_ratio = y_ratio * 16 + 8 * y_ratio/abs(y_ratio) - bullet.currentCoords[2] + // This covers anything below 45 to 0 , 135 to 180, -45 to 0 , and -135 to -180 + // (Just take a look at tangent tables) + message_admins("x-ratio : [x_ratio] , y-ratio : [y_ratio]") + var/c_ratio = abs(x_ratio)/abs(y_ratio) + var/s_ratio = abs(y_ratio/abs(x_ratio)) + if(c_ratio > 1.3 && c_ratio < 4 || c_ratio < 0.4 && c_ratio > 0) + if(abs(x_ratio) < abs(y_ratio)) + bullet.movementRatios[1] = -bullet.movementRatios[1] + px = -px + else + bullet.movementRatios[2] = -bullet.movementRatios[2] + py = -py + target_turf = null + */ + + /* var/angle = TODEGREES(ATAN2(the_rock.x - bullet.referencedBullet.x, the_rock.y - bullet.referencedBullet.y)) // third quadrant is a lil silly if(the_rock.x - bullet.referencedBullet.x < 0 && the_rock.y - bullet.referencedBullet.y < 0) angle = -(180+angle) + if(abs(angle) <= 45 || abs(angle) >= 135) + var/opposite_angle + if(angle > 0) + opposite_angle = 180 - angle + else + opposite_angle = -(angle + 180) + */ + + - bullet.referencedBullet.Move(target_turf) - bullet.coloreds |= target_turf - target_turf.color = "#2fff05ee" + if(target_turf) + bullet.referencedBullet.Move(target_turf) + bullet.coloreds |= target_turf + target_turf.color = "#2fff05ee" bullet.currentCoords[1] = px diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 9e478c92fa..c39ca6ef25 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -206,7 +206,8 @@ /turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj) - + return PROJECTILE_CONTINUE + /* if(src.ricochet_id != 0) if(src.ricochet_id == Proj.ricochet_id) src.ricochet_id = 0 @@ -264,6 +265,7 @@ slug.throw_at(get_turf(Proj), 0, 1) take_damage(damage_taken) + */ /turf/simulated/wall/hitby(AM as mob|obj, var/speed=THROWFORCE_SPEED_DIVISOR) ..() From 90b27fc77cb14de41a6aba9b212073d5af33a2b9 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 20 Jan 2024 15:22:16 +0200 Subject: [PATCH 028/171] more fixes --- cev_eris.dme | 1 - code/controllers/subsystems/bullets.dm | 67 ++-------------------- code/game/objects/items/weapons/secdocs.dm | 8 +-- 3 files changed, 9 insertions(+), 67 deletions(-) diff --git a/cev_eris.dme b/cev_eris.dme index 3f3865052d..2f8bc99f2a 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -271,7 +271,6 @@ #include "code\controllers\subsystems\processing\nano.dm" #include "code\controllers\subsystems\processing\objs.dm" #include "code\controllers\subsystems\processing\processing.dm" -#include "code\controllers\subsystems\processing\projectiles.dm" #include "code\controllers\subsystems\processing\turf.dm" #include "code\controllers\subsystems\processing\organs\internal_wounds.dm" #include "code\controllers\subsystems\tickets\mentor_tickets.dm" diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index e40a3d31d9..b311c92ab5 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -158,6 +158,7 @@ SUBSYSTEM_DEF(bullets) var/x_change = 0 var/y_change = 0 var/z_change = 0 + var/turfsTraveled = 0 var/turf/target_turf while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz > 1 || pz < 0) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") @@ -178,78 +179,20 @@ SUBSYSTEM_DEF(bullets) break //if(iswall(target_turf) && target_turf:projectileBounceCheck()) bullet.updateLevel() - if(iswall(target_turf)) - var/turf/simulated/wall/the_rock = target_turf - /// Calculate coefficients for movement - var/dist_x = (the_rock.x - bullet.firedTurf.x) * PPT/2 - var/dist_y = (the_rock.y - bullet.firedTurf.y) * PPT/2 - if(!dist_x) dist_x++ - if(!dist_y) dist_y++ - /// Adjust for the actual point of contact - var/angle - if(abs(dist_y) > abs(dist_x)) - // Bullet offset - dist_y += bullet.firedCoordinates[2] - // Edge offset - dist_x += dist_x/abs(dist_x) * PPT/2 - // Get the angle , necesarry geometry evil. - angle = arcsin(dist_x/(sqrt(dist_x**2+dist_y**2))) - else - // Bullet offset - dist_x += bullet.firedCoordinates[1] - // Edge offset - dist_y += dist_y/abs(dist_y) * PPT/2 - // Get the angle , necesarry geometry evil.. - angle = arcsin(dist_y/(sqrt(dist_x**2+dist_y**2))) - message_admins("calculated angle is [angle]") - /* - var/x_ratio = the_rock.x - bullet.firedTurf.x - var/y_ratio = the_rock.y - bullet.firedTurf.y - x_ratio += x_ratio != 0 ? x_ratio/abs(x_ratio) : 1 - y_ratio += y_ratio != 0 ? y_ratio/abs(y_ratio) : 1 - x_ratio = x_ratio * 16 + 8 * x_ratio/abs(x_ratio) - bullet.currentCoords[1] - y_ratio = y_ratio * 16 + 8 * y_ratio/abs(y_ratio) - bullet.currentCoords[2] - // This covers anything below 45 to 0 , 135 to 180, -45 to 0 , and -135 to -180 - // (Just take a look at tangent tables) - message_admins("x-ratio : [x_ratio] , y-ratio : [y_ratio]") - var/c_ratio = abs(x_ratio)/abs(y_ratio) - var/s_ratio = abs(y_ratio/abs(x_ratio)) - if(c_ratio > 1.3 && c_ratio < 4 || c_ratio < 0.4 && c_ratio > 0) - if(abs(x_ratio) < abs(y_ratio)) - bullet.movementRatios[1] = -bullet.movementRatios[1] - px = -px - else - bullet.movementRatios[2] = -bullet.movementRatios[2] - py = -py - target_turf = null - */ - - /* - var/angle = TODEGREES(ATAN2(the_rock.x - bullet.referencedBullet.x, the_rock.y - bullet.referencedBullet.y)) - // third quadrant is a lil silly - if(the_rock.x - bullet.referencedBullet.x < 0 && the_rock.y - bullet.referencedBullet.y < 0) - angle = -(180+angle) - if(abs(angle) <= 45 || abs(angle) >= 135) - var/opposite_angle - if(angle > 0) - opposite_angle = 180 - angle - else - opposite_angle = -(angle + 180) - */ - - if(target_turf) bullet.referencedBullet.Move(target_turf) bullet.coloreds |= target_turf target_turf.color = "#2fff05ee" + turfsTraveled++ bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = round(bullet.currentCoords[1]) - bullet.referencedBullet.pixel_y = round(bullet.currentCoords[2]) + bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] + bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] + animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) diff --git a/code/game/objects/items/weapons/secdocs.dm b/code/game/objects/items/weapons/secdocs.dm index b10d2a310f..cae445eac0 100644 --- a/code/game/objects/items/weapons/secdocs.dm +++ b/code/game/objects/items/weapons/secdocs.dm @@ -48,10 +48,10 @@ "Psionics, found to be a common trait amongst one-star citizens", "Freezing light using bluespace lasers. Applications for increased-capacity battery cells.", "Interspecies wars, study into why they started.", - "Aster's guild and the link between the new bluespace combat operatives." - "Increase of brain-size correlates with insanity. Empirical study into the link between insanity and high intelligence", - "Mental instability and brain-modifying drugs found to play a crucial part in the acquisition of psionic powers", - ) + "Asters guild and the link between the new bluespace combat operatives.", + "Increase of brain-size correlates with insanity. Empirical study into the link between insanity and high intelligence" + "Mental instability and brain-modifying drugs found to play a crucial part in the acquisition of psionic powers" + ) . = ..() From 467a73ded698d0e58bc0951bdf5278f2335c8b73 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 31 Jan 2024 14:20:51 +0200 Subject: [PATCH 029/171] a --- code/__HELPERS/unsorted.dm | 13 +++++++++++++ code/controllers/subsystems/bullets.dm | 27 ++++++++++++++++---------- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile.dm | 7 ++++--- 4 files changed, 35 insertions(+), 14 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 87032a6320..f9421f409c 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -45,6 +45,19 @@ else if(dx<0) .+=360 +/// First 2 are for the start, last 2 for the end +/proc/getAngleCoordinates(x1,y1,x2,y2) + var/dy = y2-y1 + var/dx = x2-x1 + if(dy == 0) + return (dx >= 0) ? 90 : 270 + . = arctan(dx/dy) + if(dy < 0) + . += 180 + else if(dx < 0) + . += 360 + + //Returns location. Returns null if no location was found. /proc/get_teleport_loc(turf/location, mob/target, distance = 1, density = FALSE, errorx = 0, errory = 0, eoffsetx = 0, eoffsety = 0) /* diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 6b6f456af2..6b1837a5bb 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -40,7 +40,7 @@ SUBSYSTEM_DEF(bullets) var/currentLevel = 0 var/turfsPerTick = 0 var/projectileAccuracy = 0 - var/lifetime = 10 + var/lifetime = 30 var/bulletLevel = 0 /datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) @@ -104,10 +104,15 @@ SUBSYSTEM_DEF(bullets) coordinates[1] = coordinates[1]/r coordinates[2] = coordinates[2]/r // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio + if(referencedBullet) + var/matrix/rotation = matrix() + // we get the angle of the trajectory by incrementing it. + rotation.Turn(getAngleCoordinates(coordinates[1] * 2, coordinates[2] * 2, coordinates[1], coordinates[2])) + referencedBullet.transform = rotation movementRatios = coordinates /datum/bullet_data/proc/ricochet(atom/wall) - var/list/bCoords = list(bullet.referencedBullet.x, bullet.referencedBullet.y) + var/list/bCoords = list(referencedBullet.x, referencedBullet.y) var/list/wCoords = list(wall.x, wall.y) var/list/cCoords = list(abs(bCoords[1] - wCoords[1] + 0.00001), abs(bCoords[2] - wCoords[2] + 0.00001)) var/list/tCoords = list(0,0) @@ -172,7 +177,7 @@ SUBSYSTEM_DEF(bullets) continue var/px = bullet.movementRatios[1] * bullet.turfsPerTick + bullet.currentCoords[1] var/py = bullet.movementRatios[2] * bullet.turfsPerTick + bullet.currentCoords[2] - var/pz = bullet.movementRatios[3] + bullet.currentCoords[3] + var/pz = bullet.movementRatios[3] * bullet.turfsPerTick + bullet.currentCoords[3] var/x_change = 0 var/y_change = 0 var/z_change = 0 @@ -181,19 +186,17 @@ SUBSYSTEM_DEF(bullets) while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz > 1 || pz < 0) message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") if(QDELETED(bullet.referencedBullet)) + bullet_queue -= bullet break - x_change = px >= PPT/2 ? 1 : px <= -PPT/2 ? -1 : 0 - y_change = py >= PPT/2 ? 1 : py <= -PPT/2 ? -1 : 0 - if(round(pz) > 1) - z_change = 1 - else if(round(pz) < 0) - z_change = -1 + x_change = (px >= PPT/2) ? 1 : (px <= -PPT/2 ? -1 : 0) + y_change = (py >= PPT/2) ? 1 : (py <= -PPT/2 ? -1 : 0) + z_change = (pz >= 1) ? 1 : (pz <= 0 ? -1 : 0) px += -1 * x_change * PPT/2 py += -1 * y_change * PPT/2 pz += -1 * z_change if(z_change) if(z_change > 1) - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z++) + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + 1) else target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) target_turf.take_damage(bullet.referencedBullet.get_structure_damage(), BRUTE, FALSE) @@ -203,6 +206,10 @@ SUBSYSTEM_DEF(bullets) if(!target_turf) bullet_queue -= bullet break + bullet.lifetime-- + if(bullet.lifetime < 0) + bullet_queue -= bullet + break //if(iswall(target_turf) && target_turf:projectileBounceCheck()) bullet.updateLevel() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 273db41cd5..5c065c8e62 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -636,7 +636,7 @@ offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, angle_offset = offset) + return !P.launch_from_gun(target, user, src, target_zone, angle_offset = offset, params) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d5f840cff6..f1e59b028b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -286,12 +286,12 @@ GLOBAL_LIST(projectileDamageConstants) return FALSE //called to launch a projectile from a gun -/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset) +/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset, params) if(user == target) //Shooting yourself user.bullet_act(src, target_zone) qdel(src) return FALSE - + params = params2list(params) forceMove(get_turf(user)) var/recoil = 0 @@ -320,7 +320,8 @@ GLOBAL_LIST(projectileDamageConstants) firer = user shot_from = launcher.name silenced = launcher.item_flags & SILENT - + x_offset += params["icon-x"] + y_offset += params["icon-y"] return launch(target, target_zone, x_offset, y_offset, angle_offset, user_recoil = recoil) //Used to change the direction of the projectile in flight. From 1386296ba30a0baab569afcae5f246ba3b4016eb Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 14 Feb 2024 02:22:49 +0200 Subject: [PATCH 030/171] Agony --- code/controllers/subsystems/bullets.dm | 68 +++++++++++++++------- code/game/objects/items/weapons/secdocs.dm | 7 +-- code/modules/projectiles/gun.dm | 6 +- code/modules/projectiles/projectile.dm | 7 +-- 4 files changed, 53 insertions(+), 35 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 6b1837a5bb..b8792b8081 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -44,6 +44,12 @@ SUBSYSTEM_DEF(bullets) var/bulletLevel = 0 /datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) + if(!target) + message_admins("Created bullet without target , [referencedBullet]") + return + if(!firer) + message_admins("Created bullet without firer, [referencedBullet]") + return src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, 0) @@ -97,8 +103,8 @@ SUBSYSTEM_DEF(bullets) var/list/coordinates = list(0,0,0) // These add 0.0001 so in the case we are firing straight we don't have to handle special cases(division by 0) // The 0.0001 are meaningless overall considering the scale of calculation. - coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - firedCoordinates[1]) / PPT + 0.0001 - coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - firedCoordinates[2]) / PPT + 0.0001 + coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - firedCoordinates[1]) / PPT + 0.0000000001 + coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - firedCoordinates[2]) / PPT + 0.0000000001 var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) coordinates[3] = (targetCoords[3] - firedCoordinates[3] + targetLevel - firedLevel)/r coordinates[1] = coordinates[1]/r @@ -107,27 +113,40 @@ SUBSYSTEM_DEF(bullets) if(referencedBullet) var/matrix/rotation = matrix() // we get the angle of the trajectory by incrementing it. - rotation.Turn(getAngleCoordinates(coordinates[1] * 2, coordinates[2] * 2, coordinates[1], coordinates[2])) + rotation.Turn(getAngleCoordinates(targetTurf.x, targetTurf.y, firedTurf.x, firedTurf.y)) referencedBullet.transform = rotation movementRatios = coordinates -/datum/bullet_data/proc/ricochet(atom/wall) - var/list/bCoords = list(referencedBullet.x, referencedBullet.y) +/datum/bullet_data/proc/ricochet(atom/wall, implementation) + var/list/bCoords = list(referencedBullet.x, referencedBullet.y, referencedBullet.pixel_x, referencedBullet.pixel_y) var/list/wCoords = list(wall.x, wall.y) - var/list/cCoords = list(abs(bCoords[1] - wCoords[1] + 0.00001), abs(bCoords[2] - wCoords[2] + 0.00001)) - var/list/tCoords = list(0,0) - var/ipothenuse = sqrt(cCoords[1]**2 + cCoords[2]**2) - if(cCoords[1] > cCoords[2]) - var/s = cCoords[1]/ipothenuse - s = 90 - arcsin(s) - if(s < 30) - cCoords[1] = -cCoords[1] + if(implementation == 1) + var/list/cCoords = list(abs(bCoords[1] - wCoords[1] + 0.00001), abs(bCoords[2] - wCoords[2] + 0.00001)) + var/list/tCoords = list(0,0) + var/ipothenuse = sqrt(cCoords[1]**2 + cCoords[2]**2) + if(cCoords[1] > cCoords[2]) + var/s = cCoords[1]/ipothenuse + s = 90 - arcsin(s) + if(s < 30) + cCoords[1] = -cCoords[1] + else + var/s = cCoords[2]/ipothenuse + s = 90 - arcsin(s) + if(s < 30) + cCoords[2] = -cCoords[2] + return cCoords else - var/s = cCoords[2]/ipothenuse - s = 90 - arcsin(s) - if(s < 30) - cCoords[2] = -cCoords[2] - return cCoords + var/bSlope = (referencedBullet.y + referencedBullet.pixel_y )/(referencedBullet.x + referencedBullet.pixel_x) + var/trueAngle = 0 + if(targetCoords[1] > targetCoords[2]) + trueAngle = arctan(bSlope) + else + trueAngle = 180 - arctan(bSlope) + + message_admins("TRUE ANGLE - [trueAngle]") + + + /datum/bullet_data/proc/updateLevel() switch(currentCoords[3]) @@ -172,7 +191,7 @@ SUBSYSTEM_DEF(bullets) current_queue = bullet_queue.Copy() for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet - if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet)) + if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet) || QDELETED(bullet.referencedBullet)) bullet_queue -= bullet continue var/px = bullet.movementRatios[1] * bullet.turfsPerTick + bullet.currentCoords[1] @@ -184,7 +203,7 @@ SUBSYSTEM_DEF(bullets) var/turfsTraveled = 0 var/turf/target_turf while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz > 1 || pz < 0) - message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") + //message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet break @@ -211,6 +230,9 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet break //if(iswall(target_turf) && target_turf:projectileBounceCheck()) + + if(iswall(target_turf)) + bullet.ricochet(target_turf, 2) bullet.updateLevel() if(target_turf) @@ -223,8 +245,10 @@ SUBSYSTEM_DEF(bullets) bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] + bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - 8 * x_change + bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - 8 * y_change + if(turfsTraveled < 1) + turfsTraveled = 0.5 animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) if(QDELETED(bullet.referencedBullet)) bullet_queue -= bullet diff --git a/code/game/objects/items/weapons/secdocs.dm b/code/game/objects/items/weapons/secdocs.dm index cae445eac0..02f63d409a 100644 --- a/code/game/objects/items/weapons/secdocs.dm +++ b/code/game/objects/items/weapons/secdocs.dm @@ -49,11 +49,8 @@ "Freezing light using bluespace lasers. Applications for increased-capacity battery cells.", "Interspecies wars, study into why they started.", "Asters guild and the link between the new bluespace combat operatives.", - "Increase of brain-size correlates with insanity. Empirical study into the link between insanity and high intelligence" - "Mental instability and brain-modifying drugs found to play a crucial part in the acquisition of psionic powers" - ) - - + "Increase of brain-size correlates with insanity. Empirical study into the link between insanity and high intelligence", + "Mental instability and brain-modifying drugs found to play a crucial part in the acquisition of psionic powers") . = ..() var/mob/living/carbon/human/owner = loc if(istype(owner)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5c065c8e62..2947ee68fd 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -617,8 +617,9 @@ if(params) P.set_clickpoint(params) + + var/list/paramList = params2list(params) var/offset = user.calculate_offset(init_offset_with_brace(user)) -/* var/remainder = offset % 4 offset /= 4 offset = round(offset) @@ -631,12 +632,11 @@ offset += roll(1,5) - 3 if(3) offset += roll(1,7) - 4 -*/ offset = round(offset) offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, angle_offset = offset, params) + return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), offset) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f1e59b028b..233e0492e2 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -280,18 +280,17 @@ GLOBAL_LIST(projectileDamageConstants) check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset + 8, y_offset + 8, target.z), 16, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 16, 1, 50) //Process() return FALSE //called to launch a projectile from a gun -/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset, params) +/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset) if(user == target) //Shooting yourself user.bullet_act(src, target_zone) qdel(src) return FALSE - params = params2list(params) forceMove(get_turf(user)) var/recoil = 0 @@ -320,8 +319,6 @@ GLOBAL_LIST(projectileDamageConstants) firer = user shot_from = launcher.name silenced = launcher.item_flags & SILENT - x_offset += params["icon-x"] - y_offset += params["icon-y"] return launch(target, target_zone, x_offset, y_offset, angle_offset, user_recoil = recoil) //Used to change the direction of the projectile in flight. From acf81967df36e0c7fa7ccac0012d2e32b9339b94 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 14 Feb 2024 14:10:36 +0200 Subject: [PATCH 031/171] a --- code/controllers/subsystems/bullets.dm | 53 +++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index b8792b8081..8cfb10bd1c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -232,7 +232,58 @@ SUBSYSTEM_DEF(bullets) //if(iswall(target_turf) && target_turf:projectileBounceCheck()) if(iswall(target_turf)) - bullet.ricochet(target_turf, 2) + var/list/bulletCoords = list(px,py) + var/list/wallCoords = list(0,0) + var/direction = null + if(x_change > 0) + direction &= EAST + else if(x_change < 0) + direction &= WEST + if(y_change > 0) + direction &= NORTH + else if(y_change < 0) + direction &= SOUTH + switch(direction) + if(NORTH) + wallCoords[1] = 0 + wallCoords[2] = 8 + if(NORTHEAST) + wallCoords[1] = 8 + wallCoords[2] = 8 + if(EAST) + wallCoords[1] = 8 + wallCoords[2] = 0 + if(SOUTHEAST) + wallCoords[1] = 8 + wallCoords[2] = -8 + if(SOUTH) + wallCoords[1] = 0 + wallCoords[2] = -8 + if(SOUTHWEST) + wallCoords[1] = -8 + wallCoords[2] = -8 + if(WEST) + wallCoords[1] = -8 + wallCoords[2] = 0 + if(NORTHWEST) + wallCoords[1] = -8 + wallCoords[2] = 8 + message_admins("Angle for this bullet is said to be [arctan(wallCoords[1] - bulletCoords[1], wallCoords[2] - bulletCoords[2])], reversed : [arctan(bulletCoords[1] - wallCoords[1], bulletCoords[2] - wallCoords[2])]") + /* + var/trueAngle = 0 + var/bSlope = (referencedBullet.y + referencedBullet.pixel_y )/(referencedBullet.x + referencedBullet.pixel_x) + if(x_change > 0) + if(y_change > 0) + /// we get the ratio between the x and y tilt. this will tell if the bullet is coming to hit top right or just right top + //var/ratio = bullet.movementRatios[1]/bullet.movementRatios[2] + if(px < py) + trueAngle = arctan(bSlope) + else + trueAngle = 180 - arctan(bSlope) + else + */ + + bullet.updateLevel() if(target_turf) From 80703fd482ba723bc242f3ff5b56ed8c6a200a6b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 16 Feb 2024 13:58:29 +0200 Subject: [PATCH 032/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 59 +++++++++----------------- 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 8cfb10bd1c..0eeb4b2de1 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -232,56 +232,39 @@ SUBSYSTEM_DEF(bullets) //if(iswall(target_turf) && target_turf:projectileBounceCheck()) if(iswall(target_turf)) - var/list/bulletCoords = list(px,py) - var/list/wallCoords = list(0,0) var/direction = null + var/hypotenuse = sqrt((px+8.000000001)**2 + (py+8.0000000001)**2) + var/angle = 9999 if(x_change > 0) - direction &= EAST + direction |= EAST else if(x_change < 0) - direction &= WEST + direction |= WEST if(y_change > 0) - direction &= NORTH + direction |= NORTH else if(y_change < 0) - direction &= SOUTH + direction |= SOUTH + message_admins("x:[x_change] | y:[y_change]") + message_admins("direction : [direction]") switch(direction) if(NORTH) - wallCoords[1] = 0 - wallCoords[2] = 8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(NORTHEAST) - wallCoords[1] = 8 - wallCoords[2] = 8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(EAST) - wallCoords[1] = 8 - wallCoords[2] = 0 + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) if(SOUTHEAST) - wallCoords[1] = 8 - wallCoords[2] = -8 + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) if(SOUTH) - wallCoords[1] = 0 - wallCoords[2] = -8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(SOUTHWEST) - wallCoords[1] = -8 - wallCoords[2] = -8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(WEST) - wallCoords[1] = -8 - wallCoords[2] = 0 + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) if(NORTHWEST) - wallCoords[1] = -8 - wallCoords[2] = 8 - message_admins("Angle for this bullet is said to be [arctan(wallCoords[1] - bulletCoords[1], wallCoords[2] - bulletCoords[2])], reversed : [arctan(bulletCoords[1] - wallCoords[1], bulletCoords[2] - wallCoords[2])]") - /* - var/trueAngle = 0 - var/bSlope = (referencedBullet.y + referencedBullet.pixel_y )/(referencedBullet.x + referencedBullet.pixel_x) - if(x_change > 0) - if(y_change > 0) - /// we get the ratio between the x and y tilt. this will tell if the bullet is coming to hit top right or just right top - //var/ratio = bullet.movementRatios[1]/bullet.movementRatios[2] - if(px < py) - trueAngle = arctan(bSlope) - else - trueAngle = 180 - arctan(bSlope) - else - */ + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) + + message_admins("THE ANGLE IS [angle]") + bullet.updateLevel() @@ -296,8 +279,8 @@ SUBSYSTEM_DEF(bullets) bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - 8 * x_change - bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - 8 * y_change + bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - PPT/2 * x_change + bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - PPT/2 * y_change if(turfsTraveled < 1) turfsTraveled = 0.5 animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) From 506e53f3b1507f847340868bf7d597a8e5ed8369 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 16 Feb 2024 13:59:31 +0200 Subject: [PATCH 033/171] Revert "Update bullets.dm" This reverts commit 80703fd482ba723bc242f3ff5b56ed8c6a200a6b. --- code/controllers/subsystems/bullets.dm | 59 +++++++++++++++++--------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 0eeb4b2de1..8cfb10bd1c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -232,39 +232,56 @@ SUBSYSTEM_DEF(bullets) //if(iswall(target_turf) && target_turf:projectileBounceCheck()) if(iswall(target_turf)) + var/list/bulletCoords = list(px,py) + var/list/wallCoords = list(0,0) var/direction = null - var/hypotenuse = sqrt((px+8.000000001)**2 + (py+8.0000000001)**2) - var/angle = 9999 if(x_change > 0) - direction |= EAST + direction &= EAST else if(x_change < 0) - direction |= WEST + direction &= WEST if(y_change > 0) - direction |= NORTH + direction &= NORTH else if(y_change < 0) - direction |= SOUTH - message_admins("x:[x_change] | y:[y_change]") - message_admins("direction : [direction]") + direction &= SOUTH switch(direction) if(NORTH) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) + wallCoords[1] = 0 + wallCoords[2] = 8 if(NORTHEAST) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) + wallCoords[1] = 8 + wallCoords[2] = 8 if(EAST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) + wallCoords[1] = 8 + wallCoords[2] = 0 if(SOUTHEAST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) + wallCoords[1] = 8 + wallCoords[2] = -8 if(SOUTH) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) + wallCoords[1] = 0 + wallCoords[2] = -8 if(SOUTHWEST) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) + wallCoords[1] = -8 + wallCoords[2] = -8 if(WEST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) + wallCoords[1] = -8 + wallCoords[2] = 0 if(NORTHWEST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) - - message_admins("THE ANGLE IS [angle]") - + wallCoords[1] = -8 + wallCoords[2] = 8 + message_admins("Angle for this bullet is said to be [arctan(wallCoords[1] - bulletCoords[1], wallCoords[2] - bulletCoords[2])], reversed : [arctan(bulletCoords[1] - wallCoords[1], bulletCoords[2] - wallCoords[2])]") + /* + var/trueAngle = 0 + var/bSlope = (referencedBullet.y + referencedBullet.pixel_y )/(referencedBullet.x + referencedBullet.pixel_x) + if(x_change > 0) + if(y_change > 0) + /// we get the ratio between the x and y tilt. this will tell if the bullet is coming to hit top right or just right top + //var/ratio = bullet.movementRatios[1]/bullet.movementRatios[2] + if(px < py) + trueAngle = arctan(bSlope) + else + trueAngle = 180 - arctan(bSlope) + else + */ bullet.updateLevel() @@ -279,8 +296,8 @@ SUBSYSTEM_DEF(bullets) bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - PPT/2 * x_change - bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - PPT/2 * y_change + bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - 8 * x_change + bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - 8 * y_change if(turfsTraveled < 1) turfsTraveled = 0.5 animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) From 927500c2764d196991e2e3d33b914d63cb75090a Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 16 Feb 2024 14:06:46 +0200 Subject: [PATCH 034/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 8cfb10bd1c..113f78e53e 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -236,13 +236,13 @@ SUBSYSTEM_DEF(bullets) var/list/wallCoords = list(0,0) var/direction = null if(x_change > 0) - direction &= EAST + direction |= EAST else if(x_change < 0) - direction &= WEST + direction |= WEST if(y_change > 0) - direction &= NORTH + direction |= NORTH else if(y_change < 0) - direction &= SOUTH + direction |= SOUTH switch(direction) if(NORTH) wallCoords[1] = 0 From f00f21f6a5574cdc1bb6057dba128773bed93982 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 16 Feb 2024 14:07:23 +0200 Subject: [PATCH 035/171] aaaa --- code/controllers/subsystems/bullets.dm | 52 +++++++++----------------- 1 file changed, 18 insertions(+), 34 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 113f78e53e..0f869356fd 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -232,9 +232,9 @@ SUBSYSTEM_DEF(bullets) //if(iswall(target_turf) && target_turf:projectileBounceCheck()) if(iswall(target_turf)) - var/list/bulletCoords = list(px,py) - var/list/wallCoords = list(0,0) var/direction = null + var/hypotenuse = sqrt((px+8.000000001)**2 + (py+8.0000000001)**2) + var/angle = 9999 if(x_change > 0) direction |= EAST else if(x_change < 0) @@ -243,45 +243,29 @@ SUBSYSTEM_DEF(bullets) direction |= NORTH else if(y_change < 0) direction |= SOUTH + message_admins("x:[x_change] | y:[y_change]") + message_admins("direction : [direction]") + switch(direction) if(NORTH) - wallCoords[1] = 0 - wallCoords[2] = 8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(NORTHEAST) - wallCoords[1] = 8 - wallCoords[2] = 8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(EAST) - wallCoords[1] = 8 - wallCoords[2] = 0 + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) if(SOUTHEAST) - wallCoords[1] = 8 - wallCoords[2] = -8 + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) if(SOUTH) - wallCoords[1] = 0 - wallCoords[2] = -8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(SOUTHWEST) - wallCoords[1] = -8 - wallCoords[2] = -8 + angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) if(WEST) - wallCoords[1] = -8 - wallCoords[2] = 0 + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) if(NORTHWEST) - wallCoords[1] = -8 - wallCoords[2] = 8 - message_admins("Angle for this bullet is said to be [arctan(wallCoords[1] - bulletCoords[1], wallCoords[2] - bulletCoords[2])], reversed : [arctan(bulletCoords[1] - wallCoords[1], bulletCoords[2] - wallCoords[2])]") - /* - var/trueAngle = 0 - var/bSlope = (referencedBullet.y + referencedBullet.pixel_y )/(referencedBullet.x + referencedBullet.pixel_x) - if(x_change > 0) - if(y_change > 0) - /// we get the ratio between the x and y tilt. this will tell if the bullet is coming to hit top right or just right top - //var/ratio = bullet.movementRatios[1]/bullet.movementRatios[2] - if(px < py) - trueAngle = arctan(bSlope) - else - trueAngle = 180 - arctan(bSlope) - else - */ + angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) + + message_admins("THE ANGLE IS [angle]") + bullet.updateLevel() @@ -296,8 +280,8 @@ SUBSYSTEM_DEF(bullets) bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - 8 * x_change - bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - 8 * y_change + bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - PPT/2 * x_change + bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - PPT/2 * y_change if(turfsTraveled < 1) turfsTraveled = 0.5 animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) From dae899c911c2ec2be732369fefbc8ceb5c3195b5 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 20 Feb 2024 23:16:06 +0200 Subject: [PATCH 036/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 62 ++++++++++++++++---------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 0f869356fd..2e03091764 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -233,8 +233,33 @@ SUBSYSTEM_DEF(bullets) if(iswall(target_turf)) var/direction = null - var/hypotenuse = sqrt((px+8.000000001)**2 + (py+8.0000000001)**2) - var/angle = 9999 + // this gets us a approxation of the intersection angle , a proper algorith would also offset the + // "wall vector" towards the direction the bullet came from. + var/npx = abs(bullet.referencedBullet.x) + (abs(px) + 16)/PPT - target_turf.x + var/npy = abs(bullet.referencedBullet.y) + (abs(py) + 16)/PPT - target_turf.y + /// if we have nothing force it to be something , lowest number possible as this approaches 0 . + if(!npx) + npx = 1>>23 + if(!npy) + npy = 1>>23 + var/hypotenuse = sqrt(npx**2 + npy**2) + var/xangle = arctan(npy, npx) + /// angle normalization, all angles get reduced to +90 and 0. + if(xangle > 180) + xangle -= 180 + else if(xangle < 0) + xangle += 180 + if(xangle > 90) + xangle -= 90 + var/yangle = 90 - xangle + if(yangle > 180) + yangle -= 180 + else if(yangle < 0) + yangle += 180 + if(yangle > 90) + yangle -= 90 + if(y_change < 0) + xangle = 90 - yangle if(x_change > 0) direction |= EAST else if(x_change < 0) @@ -243,28 +268,19 @@ SUBSYSTEM_DEF(bullets) direction |= NORTH else if(y_change < 0) direction |= SOUTH - message_admins("x:[x_change] | y:[y_change]") - message_admins("direction : [direction]") + //message_admins("x:[x_change] | y:[y_change]") + //message_admins("direction : [direction]") + message_admins("x-angle:[xangle] | y-angle [yangle]") + //message_admins("npx : [npx] | npy : [npy]") + if(xangle < 35) + message_admins("Ricochet on x-axis") + bullet.movementRatios[1] *= -1 + px *= -1 + else if(yangle < 35) + message_admins("Ricochet on y-axis") + bullet.movementRatios[2] *= -1 + py *= -1 - switch(direction) - if(NORTH) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) - if(NORTHEAST) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) - if(EAST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) - if(SOUTHEAST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) - if(SOUTH) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) - if(SOUTHWEST) - angle = arcsin((abs(py+8)+0.000000001)/hypotenuse) - if(WEST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) - if(NORTHWEST) - angle = arcsin((abs(px+8)+0.000000001)/hypotenuse) - - message_admins("THE ANGLE IS [angle]") From 70ec751fce1caf27181b2bac0844d6142faaa4af Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 21 Feb 2024 04:33:23 +0200 Subject: [PATCH 037/171] iteration numero 4(it works almost proper) --- code/controllers/subsystems/bullets.dm | 258 +++++++++++++++++-------- code/game/turfs/simulated/walls.dm | 3 + 2 files changed, 183 insertions(+), 78 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 2e03091764..fbf7eebf6b 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -28,10 +28,12 @@ SUBSYSTEM_DEF(bullets) var/atom/firer = null var/turf/firedTurf = null var/list/firedCoordinates = list(0,0,0) + var/list/firedPos = list(0,0,0) var/firedLevel = 0 var/atom/target = null var/turf/targetTurf = null var/list/targetCoords = list(0,0,0) + var/list/targetPos = list(0,0,0) var/turf/currentTurf = null var/currentCoords = list(0,0,0) var/movementRatios = list(0,0,0,0) @@ -56,9 +58,11 @@ SUBSYSTEM_DEF(bullets) src.aimedZone = aimedZone src.firer = firer src.firedTurf = get_turf(firer) + src.firedPos = list(firer.x , firer.y , firer.z) src.target = target src.targetTurf = get_turf(target) src.targetCoords = targetCoords + src.targetPos = list(target.x, target.y , target.z) //src.targetCoords = list(8,8, targetTurf.z) src.turfsPerTick = turfsPerTick src.projectileAccuracy = projectileAccuracy @@ -100,21 +104,37 @@ SUBSYSTEM_DEF(bullets) /// I hate trigonometry, but i hate ATAN2 more. /datum/bullet_data/proc/updateCoordinateRatio() - var/list/coordinates = list(0,0,0) - // These add 0.0001 so in the case we are firing straight we don't have to handle special cases(division by 0) - // The 0.0001 are meaningless overall considering the scale of calculation. - coordinates[1] = ((targetTurf.x - firedTurf.x) * PPT + targetCoords[1] - firedCoordinates[1]) / PPT + 0.0000000001 - coordinates[2] = ((targetTurf.y - firedTurf.y) * PPT + targetCoords[2] - firedCoordinates[2]) / PPT + 0.0000000001 + var/list/coordinates = list(0,0,0,0) + coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1]) + coordinates[2] = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2]) + coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) + 1 >> 23 + var/matrix/rotation = matrix() + var/distance = 0 + if(coordinates[1] == 0) + movementRatios = list(0, 1, coordinates[3]/coordinates[2], coordinates[2] > 0 ? 90 : 270) + rotation.Turn(movementRatios[4]) + referencedBullet.transform = rotation + return + if(coordinates[2] == 0) + movementRatios = list(1, 0, coordinates[3]/coordinates[1], coordinates[1] > 0 ? 0 : 180) + rotation.Turn(movementRatios[4]) + referencedBullet.transform = rotation + return + coordinates[1] /= PPT + coordinates[2] /= PPT var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) - coordinates[3] = (targetCoords[3] - firedCoordinates[3] + targetLevel - firedLevel)/r - coordinates[1] = coordinates[1]/r - coordinates[2] = coordinates[2]/r + /// normalize to a representation of 360 degrees + coordinates[4] = ATAN2(coordinates[1], coordinates[2]) + if(coordinates[4] < 0) + coordinates[4] = 360 + coordinates[4] + coordinates[1] /= r + coordinates[2] /= r + coordinates[3] /= r + // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio - if(referencedBullet) - var/matrix/rotation = matrix() - // we get the angle of the trajectory by incrementing it. - rotation.Turn(getAngleCoordinates(targetTurf.x, targetTurf.y, firedTurf.x, firedTurf.y)) - referencedBullet.transform = rotation + // we get the angle of the trajectory by incrementing it. + rotation.Turn(coordinates[4]) + referencedBullet.transform = rotation movementRatios = coordinates /datum/bullet_data/proc/ricochet(atom/wall, implementation) @@ -202,6 +222,7 @@ SUBSYSTEM_DEF(bullets) var/z_change = 0 var/turfsTraveled = 0 var/turf/target_turf + var/updateCoords = FALSE while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz > 1 || pz < 0) //message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") if(QDELETED(bullet.referencedBullet)) @@ -213,75 +234,153 @@ SUBSYSTEM_DEF(bullets) px += -1 * x_change * PPT/2 py += -1 * y_change * PPT/2 pz += -1 * z_change - if(z_change) - if(z_change > 1) - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z + 1) - else - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) - target_turf.take_damage(bullet.referencedBullet.get_structure_damage(), BRUTE, FALSE) - else - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + if(x_change && y_change) + var/y_bias = 0 + var/x_bias = 0 + switch(bullet.movementRatios[4]) + if(0 to 45) + x_bias = 1 + //y_bias = -1 + if(45 to 90) + y_bias = 1 + if(90 to 135) + y_bias = 1 + if(135 to 180) + //y_bias = 0 + x_bias = -1 + if(180 to 225) + x_bias = -1 + //y_bias = 1 + if(225 to 270) + y_bias = -1 + if(270 to 315) + y_bias = -1 + if(315 to 360) + x_bias = 1 + message_admins("bias : [y_bias]") + if(y_bias) + y_change = 0 + if(x_bias) + x_change = 0 + // bullet loop + target_turf = locate(bullet.referencedBullet.x + x_bias, bullet.referencedBullet.y + y_bias, bullet.referencedBullet.z) + bullet.lifetime-- + if(!target_turf || bullet.lifetime < 0) + bullet_queue -= bullet + break + if(iswall(target_turf)) + message_admins("[bullet.movementRatios[4]]") + var/yMod = 0 + var/xMod = 0 + switch(bullet.movementRatios[4]) + if(0 to 15) + if(y_change) + message_admins("deflection on the y-axis") + //y_change *= -1 + //py *= -1 + yMod = -y_change + bullet.targetPos[2] *= -1 + //bullet.updateCoordinateRatio() + if(345 to 360) + if(y_change) + message_admins("deflection on the y-axis") + //y_change *= -1 + //py *= -1 + yMod = -y_change + bullet.targetPos[2] *= -1 + //bullet.updateCoordinateRatio() + if(75 to 105) + if(x_change) + message_admins("deflection on the x-axis") + //x_change *= -1 + //px *= -1 + xMod = -x_change + bullet.targetPos[1] *= -1 + //bullet.updateCoordinateRatio() + if(165 to 195) + if(y_change) + message_admins("deflection on the y-axis") + //y_change *= -1 + //py *= -1 + yMod = -y_change + bullet.targetPos[2] *= -1 + //bullet.updateCoordinateRatio() + if(255 to 285) + if(x_change) + message_admins("deflection on the x-axis") + //x_change *= -1 + //px *= -1 + xMod = -x_change + bullet.targetPos[1] *= -1 + //bullet.updateCoordinateRatio() - if(!target_turf) - bullet_queue -= bullet - break + if(xMod || yMod) + updateCoords = TRUE + target_turf = locate(bullet.referencedBullet.x + xMod, bullet.referencedBullet.y + yMod, bullet.referencedBullet.z) + + bullet.updateLevel() + if(target_turf) + bullet.referencedBullet.Move(target_turf) + bullet.coloreds |= target_turf + target_turf.color = "#2fff05ee" + turfsTraveled++ + // + + // bullet loop + target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) bullet.lifetime-- - if(bullet.lifetime < 0) + if(!target_turf || bullet.lifetime < 0) bullet_queue -= bullet break - //if(iswall(target_turf) && target_turf:projectileBounceCheck()) - if(iswall(target_turf)) - var/direction = null - // this gets us a approxation of the intersection angle , a proper algorith would also offset the - // "wall vector" towards the direction the bullet came from. - var/npx = abs(bullet.referencedBullet.x) + (abs(px) + 16)/PPT - target_turf.x - var/npy = abs(bullet.referencedBullet.y) + (abs(py) + 16)/PPT - target_turf.y - /// if we have nothing force it to be something , lowest number possible as this approaches 0 . - if(!npx) - npx = 1>>23 - if(!npy) - npy = 1>>23 - var/hypotenuse = sqrt(npx**2 + npy**2) - var/xangle = arctan(npy, npx) - /// angle normalization, all angles get reduced to +90 and 0. - if(xangle > 180) - xangle -= 180 - else if(xangle < 0) - xangle += 180 - if(xangle > 90) - xangle -= 90 - var/yangle = 90 - xangle - if(yangle > 180) - yangle -= 180 - else if(yangle < 0) - yangle += 180 - if(yangle > 90) - yangle -= 90 - if(y_change < 0) - xangle = 90 - yangle - if(x_change > 0) - direction |= EAST - else if(x_change < 0) - direction |= WEST - if(y_change > 0) - direction |= NORTH - else if(y_change < 0) - direction |= SOUTH - //message_admins("x:[x_change] | y:[y_change]") - //message_admins("direction : [direction]") - message_admins("x-angle:[xangle] | y-angle [yangle]") - //message_admins("npx : [npx] | npy : [npy]") - if(xangle < 35) - message_admins("Ricochet on x-axis") - bullet.movementRatios[1] *= -1 - px *= -1 - else if(yangle < 35) - message_admins("Ricochet on y-axis") - bullet.movementRatios[2] *= -1 - py *= -1 - + message_admins("[bullet.movementRatios[4]]") + var/yMod = 0 + var/xMod = 0 + switch(bullet.movementRatios[4]) + if(0 to 15) + if(y_change) + message_admins("deflection on the y-axis") + //y_change *= -1 + //py *= -1 + yMod = -y_change + bullet.targetPos[2] *= -1 + //bullet.updateCoordinateRatio() + if(345 to 360) + if(y_change) + message_admins("deflection on the y-axis") + //y_change *= -1 + //py *= -1 + yMod = -y_change + bullet.targetPos[2] *= -1 + //bullet.updateCoordinateRatio() + if(75 to 105) + if(x_change) + message_admins("deflection on the x-axis") + //x_change *= -1 + //px *= -1 + xMod = -x_change + bullet.targetPos[1] *= -1 + //bullet.updateCoordinateRatio() + if(165 to 195) + if(y_change) + message_admins("deflection on the y-axis") + //y_change *= -1 + //py *= -1 + yMod = -y_change + bullet.targetPos[2] *= -1 + //bullet.updateCoordinateRatio() + if(255 to 285) + if(x_change) + message_admins("deflection on the x-axis") + //x_change *= -1 + //px *= -1 + xMod = -x_change + bullet.targetPos[1] *= -1 + //bullet.updateCoordinateRatio() + if(xMod || yMod) + updateCoords = TRUE + target_turf = locate(bullet.referencedBullet.x + xMod, bullet.referencedBullet.y + yMod, bullet.referencedBullet.z) bullet.updateLevel() @@ -291,13 +390,16 @@ SUBSYSTEM_DEF(bullets) bullet.coloreds |= target_turf target_turf.color = "#2fff05ee" turfsTraveled++ + // bullet.currentCoords[1] = px bullet.currentCoords[2] = py bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = -turfsTraveled * bullet.movementRatios[1] - PPT/2 * x_change - bullet.referencedBullet.pixel_y = -turfsTraveled * bullet.movementRatios[2] - PPT/2 * y_change + bullet.referencedBullet.pixel_x = -round(turfsTraveled * bullet.movementRatios[1]) - PPT/2 * x_change + bullet.referencedBullet.pixel_y = -round(turfsTraveled * bullet.movementRatios[2]) - PPT/2 * y_change + if(updateCoords) + bullet.updateCoordinateRatio() if(turfsTraveled < 1) turfsTraveled = 0.5 animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 11db96bcf2..8f115b5fc6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -221,6 +221,7 @@ Proj.on_hit(src) + /* if(Proj.can_ricochet && proj_health != 0 && (src.x != Proj.starting.x) && (src.y != Proj.starting.y)) var/ricochetchance = 1 if(proj_health <= 60) @@ -269,6 +270,8 @@ take_damage(health_taken) + */ + /turf/simulated/wall/hitby(AM as mob|obj, var/speed=THROWFORCE_SPEED_DIVISOR) ..() if(ismob(AM)) From 65c7dcf68404675bc1d63767c640396d094e2cb2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 23 Feb 2024 17:39:24 +0200 Subject: [PATCH 038/171] aaaaaaaaaaaah --- code/controllers/subsystems/bullets.dm | 265 +++++-------------------- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile.dm | 1 + 3 files changed, 57 insertions(+), 211 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index fbf7eebf6b..4d11eb5fcd 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -8,6 +8,7 @@ /// Pixels per turf #define PPT 32 +#define HPPT 16 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -54,7 +55,7 @@ SUBSYSTEM_DEF(bullets) return src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) - src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, 0) + src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, referencedBullet.z) src.aimedZone = aimedZone src.firer = firer src.firedTurf = get_turf(firer) @@ -97,7 +98,7 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF else if(isitem(target)) src.targetLevel = LEVEL_TURF - src.firedCoordinates = list(8,8, referencedBullet.z) + src.firedCoordinates = list(0,0, referencedBullet.z) src.currentCoords[3] += firedLevel updateCoordinateRatio() SSbullets.bullet_queue += src @@ -105,35 +106,17 @@ SUBSYSTEM_DEF(bullets) /// I hate trigonometry, but i hate ATAN2 more. /datum/bullet_data/proc/updateCoordinateRatio() var/list/coordinates = list(0,0,0,0) - coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1]) - coordinates[2] = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2]) - coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) + 1 >> 23 var/matrix/rotation = matrix() - var/distance = 0 - if(coordinates[1] == 0) - movementRatios = list(0, 1, coordinates[3]/coordinates[2], coordinates[2] > 0 ? 90 : 270) - rotation.Turn(movementRatios[4]) - referencedBullet.transform = rotation - return - if(coordinates[2] == 0) - movementRatios = list(1, 0, coordinates[3]/coordinates[1], coordinates[1] > 0 ? 0 : 180) - rotation.Turn(movementRatios[4]) - referencedBullet.transform = rotation - return - coordinates[1] /= PPT - coordinates[2] /= PPT - var/r = sqrt(coordinates[1] ** 2 + coordinates[2] ** 2) - /// normalize to a representation of 360 degrees - coordinates[4] = ATAN2(coordinates[1], coordinates[2]) - if(coordinates[4] < 0) - coordinates[4] = 360 + coordinates[4] - coordinates[1] /= r - coordinates[2] /= r - coordinates[3] /= r - + coordinates[1] = ((targetPos[1] - firedPos[1]) * HPPT + targetCoords[1] - firedCoordinates[1]) + coordinates[2] = ((targetPos[2] - firedPos[2]) * HPPT + targetCoords[2] - firedCoordinates[2]) + coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) + coordinates[4] = ATAN2(coordinates[2], coordinates[1]) + coordinates[1] = sin(coordinates[4]) + coordinates[2] = cos(coordinates[4]) // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio // we get the angle of the trajectory by incrementing it. - rotation.Turn(coordinates[4]) + message_admins("[referencedBullet] -/- [coordinates[4]] , x: [coordinates[1]], y:[coordinates[2]]") + rotation.Turn(coordinates[4] + 180) referencedBullet.transform = rotation movementRatios = coordinates @@ -209,201 +192,63 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() + var/list/bulletRatios + var/list/bulletCoords + var/obj/item/projectile/projectile for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet) || QDELETED(bullet.referencedBullet)) bullet_queue -= bullet continue - var/px = bullet.movementRatios[1] * bullet.turfsPerTick + bullet.currentCoords[1] - var/py = bullet.movementRatios[2] * bullet.turfsPerTick + bullet.currentCoords[2] - var/pz = bullet.movementRatios[3] * bullet.turfsPerTick + bullet.currentCoords[3] - var/x_change = 0 - var/y_change = 0 - var/z_change = 0 - var/turfsTraveled = 0 - var/turf/target_turf - var/updateCoords = FALSE - while(px >= PPT/2 || py >= PPT/2 || px <= -PPT/2 || py <= -PPT/2 || pz > 1 || pz < 0) - //message_admins("Moving [bullet.referencedBullet], y = [round(py/PPT)], py = [py], x = [round(px/PPT)], px = [px], pz = [pz]") - if(QDELETED(bullet.referencedBullet)) + bulletRatios = bullet.movementRatios + bulletCoords = bullet.currentCoords + projectile = bullet.referencedBullet + bulletCoords[1] += bulletRatios[1] * bullet.turfsPerTick/2 + bulletCoords[2] += bulletRatios[2] * bullet.turfsPerTick/2 + bulletCoords[3] += bulletRatios[3] * bullet.turfsPerTick/2 + var/turf/moveTurf = null + var/x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) + var/y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) + var/z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) + var/tx_change + var/ty_change + while(x_change || y_change) + if(QDELETED(projectile)) bullet_queue -= bullet break - x_change = (px >= PPT/2) ? 1 : (px <= -PPT/2 ? -1 : 0) - y_change = (py >= PPT/2) ? 1 : (py <= -PPT/2 ? -1 : 0) - z_change = (pz >= 1) ? 1 : (pz <= 0 ? -1 : 0) - px += -1 * x_change * PPT/2 - py += -1 * y_change * PPT/2 - pz += -1 * z_change - if(x_change && y_change) - var/y_bias = 0 - var/x_bias = 0 - switch(bullet.movementRatios[4]) - if(0 to 45) - x_bias = 1 - //y_bias = -1 - if(45 to 90) - y_bias = 1 - if(90 to 135) - y_bias = 1 - if(135 to 180) - //y_bias = 0 - x_bias = -1 - if(180 to 225) - x_bias = -1 - //y_bias = 1 - if(225 to 270) - y_bias = -1 - if(270 to 315) - y_bias = -1 - if(315 to 360) - x_bias = 1 - message_admins("bias : [y_bias]") - if(y_bias) - y_change = 0 - if(x_bias) - x_change = 0 - // bullet loop - target_turf = locate(bullet.referencedBullet.x + x_bias, bullet.referencedBullet.y + y_bias, bullet.referencedBullet.z) - bullet.lifetime-- - if(!target_turf || bullet.lifetime < 0) - bullet_queue -= bullet - break - if(iswall(target_turf)) - message_admins("[bullet.movementRatios[4]]") - var/yMod = 0 - var/xMod = 0 - switch(bullet.movementRatios[4]) - if(0 to 15) - if(y_change) - message_admins("deflection on the y-axis") - //y_change *= -1 - //py *= -1 - yMod = -y_change - bullet.targetPos[2] *= -1 - //bullet.updateCoordinateRatio() - if(345 to 360) - if(y_change) - message_admins("deflection on the y-axis") - //y_change *= -1 - //py *= -1 - yMod = -y_change - bullet.targetPos[2] *= -1 - //bullet.updateCoordinateRatio() - if(75 to 105) - if(x_change) - message_admins("deflection on the x-axis") - //x_change *= -1 - //px *= -1 - xMod = -x_change - bullet.targetPos[1] *= -1 - //bullet.updateCoordinateRatio() - if(165 to 195) - if(y_change) - message_admins("deflection on the y-axis") - //y_change *= -1 - //py *= -1 - yMod = -y_change - bullet.targetPos[2] *= -1 - //bullet.updateCoordinateRatio() - if(255 to 285) - if(x_change) - message_admins("deflection on the x-axis") - //x_change *= -1 - //px *= -1 - xMod = -x_change - bullet.targetPos[1] *= -1 - //bullet.updateCoordinateRatio() - - if(xMod || yMod) - updateCoords = TRUE - target_turf = locate(bullet.referencedBullet.x + xMod, bullet.referencedBullet.y + yMod, bullet.referencedBullet.z) - - bullet.updateLevel() - if(target_turf) - bullet.referencedBullet.Move(target_turf) - bullet.coloreds |= target_turf - target_turf.color = "#2fff05ee" - turfsTraveled++ - // - - // bullet loop - target_turf = locate(bullet.referencedBullet.x + x_change, bullet.referencedBullet.y + y_change, bullet.referencedBullet.z) + tx_change = 0 + ty_change = 0 + if(x_change) + tx_change = x_change/abs(x_change) + if(y_change) + ty_change = y_change/abs(y_change) + moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) + x_change -= tx_change + y_change -= ty_change + bulletCoords[1] -= HPPT * tx_change + bulletCoords[2] -= HPPT * ty_change + animate(projectile, 2, pixel_x = bulletCoords[1]%HPPT-1, pixel_y = bulletCoords[2]%HPPT-1) + //projectile.pixel_x = bulletCoords[1] % HPPT - 1 + //projectile.pixel_y = bulletCoords[2] % HPPT - 1 bullet.lifetime-- - if(!target_turf || bullet.lifetime < 0) + if(bullet.lifetime < 0) bullet_queue -= bullet break - if(iswall(target_turf)) - message_admins("[bullet.movementRatios[4]]") - var/yMod = 0 - var/xMod = 0 - switch(bullet.movementRatios[4]) - if(0 to 15) - if(y_change) - message_admins("deflection on the y-axis") - //y_change *= -1 - //py *= -1 - yMod = -y_change - bullet.targetPos[2] *= -1 - //bullet.updateCoordinateRatio() - if(345 to 360) - if(y_change) - message_admins("deflection on the y-axis") - //y_change *= -1 - //py *= -1 - yMod = -y_change - bullet.targetPos[2] *= -1 - //bullet.updateCoordinateRatio() - if(75 to 105) - if(x_change) - message_admins("deflection on the x-axis") - //x_change *= -1 - //px *= -1 - xMod = -x_change - bullet.targetPos[1] *= -1 - //bullet.updateCoordinateRatio() - if(165 to 195) - if(y_change) - message_admins("deflection on the y-axis") - //y_change *= -1 - //py *= -1 - yMod = -y_change - bullet.targetPos[2] *= -1 - //bullet.updateCoordinateRatio() - if(255 to 285) - if(x_change) - message_admins("deflection on the x-axis") - //x_change *= -1 - //px *= -1 - xMod = -x_change - bullet.targetPos[1] *= -1 - //bullet.updateCoordinateRatio() - - if(xMod || yMod) - updateCoords = TRUE - target_turf = locate(bullet.referencedBullet.x + xMod, bullet.referencedBullet.y + yMod, bullet.referencedBullet.z) - - bullet.updateLevel() + if(moveTurf) + projectile.Move(moveTurf) + bullet.coloreds |= moveTurf + moveTurf.color = "#2fff05ee" + if(istype(projectile, /obj/item/projectile/bullet/clrifle)) + message_admins("px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") + moveTurf = null - if(target_turf) - bullet.referencedBullet.Move(target_turf) - bullet.coloreds |= target_turf - target_turf.color = "#2fff05ee" - turfsTraveled++ - // - + bullet.currentCoords = bulletCoords - bullet.currentCoords[1] = px - bullet.currentCoords[2] = py - bullet.currentCoords[3] = pz - bullet.referencedBullet.pixel_x = -round(turfsTraveled * bullet.movementRatios[1]) - PPT/2 * x_change - bullet.referencedBullet.pixel_y = -round(turfsTraveled * bullet.movementRatios[2]) - PPT/2 * y_change - if(updateCoords) - bullet.updateCoordinateRatio() - if(turfsTraveled < 1) - turfsTraveled = 0.5 - animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) - if(QDELETED(bullet.referencedBullet)) + //bullet.referencedBullet.pixel_x = -round(turfsTraveled * bullet.movementRatios[1]) - PPT/2 * x_change + //bullet.referencedBullet.pixel_y = -round(turfsTraveled * bullet.movementRatios[2]) - PPT/2 * y_change + //animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) + if(QDELETED(projectile)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) thing.color = initial(thing.color) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 2947ee68fd..2e23377f80 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -636,7 +636,7 @@ offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), offset) + return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"])-16, text2num(paramList["icon-y"])-16, offset) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 233e0492e2..369e413cfb 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -280,6 +280,7 @@ GLOBAL_LIST(projectileDamageConstants) check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory + message_admins("[src] - x-off:[x_offset], y-off:[y_offset]") new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 16, 1, 50) //Process() From 4f9c693ff66cc6cc9de9ce7cee3b1f16886465c4 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 23 Feb 2024 19:27:20 +0200 Subject: [PATCH 039/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 4d11eb5fcd..e2dc6fa4ea 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -203,15 +203,17 @@ SUBSYSTEM_DEF(bullets) bulletRatios = bullet.movementRatios bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet - bulletCoords[1] += bulletRatios[1] * bullet.turfsPerTick/2 - bulletCoords[2] += bulletRatios[2] * bullet.turfsPerTick/2 - bulletCoords[3] += bulletRatios[3] * bullet.turfsPerTick/2 + bulletCoords[1] += (bulletRatios[1] * bullet.turfsPerTick) + bulletCoords[2] += (bulletRatios[2] * bullet.turfsPerTick) + bulletCoords[3] += (bulletRatios[3] * bullet.turfsPerTick) var/turf/moveTurf = null var/x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) var/y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) var/z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) var/tx_change var/ty_change + if(istype(projectile, /obj/item/projectile/bullet/clrifle)) + message_admins("BEFORE - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") while(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet @@ -225,9 +227,9 @@ SUBSYSTEM_DEF(bullets) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change - bulletCoords[1] -= HPPT * tx_change - bulletCoords[2] -= HPPT * ty_change - animate(projectile, 2, pixel_x = bulletCoords[1]%HPPT-1, pixel_y = bulletCoords[2]%HPPT-1) + bulletCoords[1] -= PPT * tx_change + bulletCoords[2] -= PPT * ty_change + animate(projectile, 2, pixel_x = abs(bulletCoords[1])%HPPT * sign(bulletCoords[1]) - 1, pixel_y = abs(bulletCoords[2])%HPPT * sign(bulletCoords[2]) - 1) //projectile.pixel_x = bulletCoords[1] % HPPT - 1 //projectile.pixel_y = bulletCoords[2] % HPPT - 1 bullet.lifetime-- @@ -240,7 +242,7 @@ SUBSYSTEM_DEF(bullets) bullet.coloreds |= moveTurf moveTurf.color = "#2fff05ee" if(istype(projectile, /obj/item/projectile/bullet/clrifle)) - message_admins("px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") + message_admins("AFTER - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") moveTurf = null bullet.currentCoords = bulletCoords From d3ffc378d3e68ffc2100d728f6f550fab8019515 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 24 Feb 2024 18:11:43 +0200 Subject: [PATCH 040/171] aaaaaaaaaaaaah --- code/controllers/subsystems/bullets.dm | 46 ++++++++++++++++++++------ code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile.dm | 1 + 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index e2dc6fa4ea..c9429e4dbd 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -107,8 +107,8 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/updateCoordinateRatio() var/list/coordinates = list(0,0,0,0) var/matrix/rotation = matrix() - coordinates[1] = ((targetPos[1] - firedPos[1]) * HPPT + targetCoords[1] - firedCoordinates[1]) - coordinates[2] = ((targetPos[2] - firedPos[2]) * HPPT + targetCoords[2] - firedCoordinates[2]) + coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) + coordinates[2] = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2] - HPPT) coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) coordinates[4] = ATAN2(coordinates[2], coordinates[1]) coordinates[1] = sin(coordinates[4]) @@ -203,21 +203,34 @@ SUBSYSTEM_DEF(bullets) bulletRatios = bullet.movementRatios bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet - bulletCoords[1] += (bulletRatios[1] * bullet.turfsPerTick) - bulletCoords[2] += (bulletRatios[2] * bullet.turfsPerTick) - bulletCoords[3] += (bulletRatios[3] * bullet.turfsPerTick) + bulletCoords[1] += (bulletRatios[1] * bullet.turfsPerTick/4) + bulletCoords[2] += (bulletRatios[2] * bullet.turfsPerTick/4) + bulletCoords[3] += (bulletRatios[3] * bullet.turfsPerTick/4) var/turf/moveTurf = null var/x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) var/y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) var/z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) var/tx_change var/ty_change - if(istype(projectile, /obj/item/projectile/bullet/clrifle)) - message_admins("BEFORE - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") + var/iterations = 0 + var/sx_change = 0 + var/sy_change = 0 + var/x_mod = 0 + var/y_mod = 0 while(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet break + if(istype(projectile, /obj/item/projectile/bullet/clrifle)) + message_admins("BEFORE - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") + if(x_change && y_change) + if(abs(x_change)/abs(y_change) < 1) + sx_change = x_change + x_change = 0 + else + sy_change = y_change + y_change = 0 + iterations++ tx_change = 0 ty_change = 0 if(x_change) @@ -227,9 +240,12 @@ SUBSYSTEM_DEF(bullets) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change - bulletCoords[1] -= PPT * tx_change - bulletCoords[2] -= PPT * ty_change - animate(projectile, 2, pixel_x = abs(bulletCoords[1])%HPPT * sign(bulletCoords[1]) - 1, pixel_y = abs(bulletCoords[2])%HPPT * sign(bulletCoords[2]) - 1) + bulletCoords[1] -= PPT * tx_change - tx_change + bulletCoords[2] -= PPT * ty_change - tx_change + x_mod -= PPT * tx_change + y_mod -= PPT * ty_change + //animate(projectile, 1, pixel_x = CEILING(abs(bulletCoords[1]), 1)%HPPT * sign(bulletCoords[1]), pixel_y = CEILING(abs(bulletCoords[2]), 1)%HPPT * sign(bulletCoords[2])) + //animate(projectile, 1, pixel_x = abs(bulletCoords[1])%HPPT * sign(bulletCoords[1]) - 1, pixel_y = abs(bulletCoords[2])%HPPT * sign(bulletCoords[2]) - 1) //projectile.pixel_x = bulletCoords[1] % HPPT - 1 //projectile.pixel_y = bulletCoords[2] % HPPT - 1 bullet.lifetime-- @@ -244,7 +260,17 @@ SUBSYSTEM_DEF(bullets) if(istype(projectile, /obj/item/projectile/bullet/clrifle)) message_admins("AFTER - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") moveTurf = null + if(sx_change) + x_change = sx_change + sx_change = 0 + if(sy_change) + y_change = sy_change + sy_change = 0 + + //projectile.pixel_x = bulletCoords[1] - x_mod + //projectile.pixel_y = bulletCoords[2] - y_mod + animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords //bullet.referencedBullet.pixel_x = -round(turfsTraveled * bullet.movementRatios[1]) - PPT/2 * x_change diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 2e23377f80..2947ee68fd 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -636,7 +636,7 @@ offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"])-16, text2num(paramList["icon-y"])-16, offset) + return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), offset) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 369e413cfb..7f75851267 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -22,6 +22,7 @@ GLOBAL_LIST(projectileDamageConstants) spawn_blacklisted = TRUE spawn_frequency = 0 spawn_tags = null + animate_movement = SLIDE_STEPS /// Ammo is heavy weight = 10 var/bumped = FALSE //Prevents it from hitting more than one guy at once From 8a6bc73b6b5f3e9f4ea7dcb15bc3e8fde0932db2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 25 Feb 2024 03:05:47 +0200 Subject: [PATCH 041/171] k --- code/controllers/subsystems/bullets.dm | 1 + code/modules/projectiles/projectile.dm | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index c9429e4dbd..112cc7f5c6 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -270,6 +270,7 @@ SUBSYSTEM_DEF(bullets) //projectile.pixel_x = bulletCoords[1] - x_mod //projectile.pixel_y = bulletCoords[2] - y_mod + //// decrementeaza pe miscare pe fiecare turf miscat. animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 7f75851267..985da4cf83 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -22,7 +22,8 @@ GLOBAL_LIST(projectileDamageConstants) spawn_blacklisted = TRUE spawn_frequency = 0 spawn_tags = null - animate_movement = SLIDE_STEPS + animate_movement = NO_STEPS + glide_size = 8 /// Ammo is heavy weight = 10 var/bumped = FALSE //Prevents it from hitting more than one guy at once From a485db381b019c80e663bfff6c0bee3e2e010887 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 25 Feb 2024 12:50:20 +0200 Subject: [PATCH 042/171] a --- code/controllers/subsystems/bullets.dm | 67 ++++++++++++++------------ code/modules/projectiles/projectile.dm | 2 +- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 112cc7f5c6..01d4bed48d 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -192,9 +192,18 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() + /// Prevent random dealocations and reallocations , just have em up initialized once. var/list/bulletRatios var/list/bulletCoords var/obj/item/projectile/projectile + var/x_change + var/y_change + var/z_change + var/tx_change + var/ty_change + var/sx_change + var/sy_change + var/turf/moveTurf = null for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet) || QDELETED(bullet.referencedBullet)) @@ -203,34 +212,39 @@ SUBSYSTEM_DEF(bullets) bulletRatios = bullet.movementRatios bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet - bulletCoords[1] += (bulletRatios[1] * bullet.turfsPerTick/4) - bulletCoords[2] += (bulletRatios[2] * bullet.turfsPerTick/4) - bulletCoords[3] += (bulletRatios[3] * bullet.turfsPerTick/4) - var/turf/moveTurf = null - var/x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) - var/y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) - var/z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) - var/tx_change - var/ty_change - var/iterations = 0 - var/sx_change = 0 - var/sy_change = 0 - var/x_mod = 0 - var/y_mod = 0 + bulletCoords[1] += (bulletRatios[1] * bullet.turfsPerTick) + bulletCoords[2] += (bulletRatios[2] * bullet.turfsPerTick) + bulletCoords[3] += (bulletRatios[3] * bullet.turfsPerTick) + x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) + y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) + z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) + tx_change = 0 + ty_change = 0 + sx_change = 0 + sy_change = 0 while(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet break if(istype(projectile, /obj/item/projectile/bullet/clrifle)) message_admins("BEFORE - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") + /* if(x_change && y_change) if(abs(x_change)/abs(y_change) < 1) - sx_change = x_change - x_change = 0 + if(x_change > y_change) + sy_change = y_change + y_change = 0 + else + sx_change = x_change + x_change = 0 else - sy_change = y_change - y_change = 0 - iterations++ + if(y_change > x_change) + sx_change = x_change + x_change = 0 + else + sy_change = y_change + y_change = 0 + */ tx_change = 0 ty_change = 0 if(x_change) @@ -242,12 +256,8 @@ SUBSYSTEM_DEF(bullets) y_change -= ty_change bulletCoords[1] -= PPT * tx_change - tx_change bulletCoords[2] -= PPT * ty_change - tx_change - x_mod -= PPT * tx_change - y_mod -= PPT * ty_change - //animate(projectile, 1, pixel_x = CEILING(abs(bulletCoords[1]), 1)%HPPT * sign(bulletCoords[1]), pixel_y = CEILING(abs(bulletCoords[2]), 1)%HPPT * sign(bulletCoords[2])) - //animate(projectile, 1, pixel_x = abs(bulletCoords[1])%HPPT * sign(bulletCoords[1]) - 1, pixel_y = abs(bulletCoords[2])%HPPT * sign(bulletCoords[2]) - 1) - //projectile.pixel_x = bulletCoords[1] % HPPT - 1 - //projectile.pixel_y = bulletCoords[2] % HPPT - 1 + projectile.pixel_x -= PPT * tx_change + projectile.pixel_y -= PPT * ty_change bullet.lifetime-- if(bullet.lifetime < 0) bullet_queue -= bullet @@ -267,16 +277,9 @@ SUBSYSTEM_DEF(bullets) y_change = sy_change sy_change = 0 - - //projectile.pixel_x = bulletCoords[1] - x_mod - //projectile.pixel_y = bulletCoords[2] - y_mod - //// decrementeaza pe miscare pe fiecare turf miscat. animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords - //bullet.referencedBullet.pixel_x = -round(turfsTraveled * bullet.movementRatios[1]) - PPT/2 * x_change - //bullet.referencedBullet.pixel_y = -round(turfsTraveled * bullet.movementRatios[2]) - PPT/2 * y_change - //animate(bullet.referencedBullet, 1/turfsTraveled, pixel_x = round(bullet.currentCoords[1]), pixel_y = round(bullet.currentCoords[2])) if(QDELETED(projectile)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 985da4cf83..d292392ff3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -283,7 +283,7 @@ GLOBAL_LIST(projectileDamageConstants) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory message_admins("[src] - x-off:[x_offset], y-off:[y_offset]") - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 16, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 32, 1, 50) //Process() return FALSE From b75ff6084370e20002e1336549d7f271c886a93c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 25 Feb 2024 13:32:56 +0200 Subject: [PATCH 043/171] AAAAAAAAAAAAAAAAAAJ --- code/controllers/subsystems/bullets.dm | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 01d4bed48d..8f736821fe 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -228,23 +228,6 @@ SUBSYSTEM_DEF(bullets) break if(istype(projectile, /obj/item/projectile/bullet/clrifle)) message_admins("BEFORE - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") - /* - if(x_change && y_change) - if(abs(x_change)/abs(y_change) < 1) - if(x_change > y_change) - sy_change = y_change - y_change = 0 - else - sx_change = x_change - x_change = 0 - else - if(y_change > x_change) - sx_change = x_change - x_change = 0 - else - sy_change = y_change - y_change = 0 - */ tx_change = 0 ty_change = 0 if(x_change) @@ -254,8 +237,8 @@ SUBSYSTEM_DEF(bullets) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change - bulletCoords[1] -= PPT * tx_change - tx_change - bulletCoords[2] -= PPT * ty_change - tx_change + bulletCoords[1] -= PPT * tx_change + bulletCoords[2] -= PPT * ty_change projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.lifetime-- From c6a284a23ac79fccf40fb7a97eba64da74600242 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 26 Feb 2024 03:41:48 +0200 Subject: [PATCH 044/171] Update datum_click_handlers.dm --- code/datums/datum_click_handlers.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/datums/datum_click_handlers.dm b/code/datums/datum_click_handlers.dm index ca52efee27..5f0b2ad4cd 100644 --- a/code/datums/datum_click_handlers.dm +++ b/code/datums/datum_click_handlers.dm @@ -78,6 +78,8 @@ var/time_since_last_init // Time since last start of full auto fire , used to prevent ANGRY smashing of M1 to fire faster. //Todo: Make this work with callbacks var/time_since_last_shot // Keeping track of last shot to determine next one + /// caching params for full auto pixel accuracy + var/storedParams = null /datum/click_handler/fullauto/Click() return TRUE //Doesn't work with normal clicks @@ -90,7 +92,7 @@ reciever.check_safety_cursor(reciever.loc) /datum/click_handler/fullauto/proc/do_fire() - reciever.afterattack(target, owner.mob, FALSE) + reciever.afterattack(target, owner.mob, FALSE, storedParams) /datum/click_handler/fullauto/MouseDown(object, location, control, params) if(!isturf(owner.mob.loc) && !ismech(owner.mob.loc)) // This stops from firing full auto weapons inside closets, in /obj/effect/dummy/chameleon chameleon projector or in a mech @@ -100,6 +102,7 @@ object = resolve_world_target(object) if(object) + storedParams = params target = object time_since_last_shot = world.time shooting_loop() @@ -129,6 +132,7 @@ /datum/click_handler/fullauto/MouseDrag(over_object, src_location, over_location, src_control, over_control, params) src_location = resolve_world_target(src_location) if(src_location) + storedParams = params target = src_location return FALSE return TRUE From 775210c8b8fc19f8e42370814a61cb916f290ef3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 26 Feb 2024 11:02:16 +0200 Subject: [PATCH 045/171] sss --- code/_onclick/click.dm | 13 ++++++++++--- code/controllers/subsystems/bullets.dm | 8 +++----- code/datums/datum_click_handlers.dm | 15 ++++++++++++--- code/modules/projectiles/projectile.dm | 2 +- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 72e9fdbdf8..5181e9a3fd 100755 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -28,15 +28,22 @@ if (CH) if (!CH.MouseUp(object,location,control,params)) return - .=..() -/client/MouseDrag(over_object,src_location,over_location,src_control,over_control,params) +/client/MouseDrag(src_object,over_object,src_location,over_location,src_control,over_control,params) if (CH) - if (!CH.MouseDrag(over_object,src_location,over_location,src_control,over_control,params)) + if (!CH.MouseDrag(src_object,over_object,src_location,over_location,src_control,over_control,params)) + return + .=..() + + +/client/MouseMove(object, location, control, params) + if(CH) + if(!CH.MouseMove(object, location, control, params)) return .=..() + /client/Click(atom/target, location, control, params) var/list/L = params2list(params) //convert params into a list var/dragged = L["drag"] //grab what mouse button they are dragging with, if any. diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 8f736821fe..f526c79ec4 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -47,12 +47,14 @@ SUBSYSTEM_DEF(bullets) var/bulletLevel = 0 /datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) + /* if(!target) message_admins("Created bullet without target , [referencedBullet]") return if(!firer) message_admins("Created bullet without firer, [referencedBullet]") return + */ src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, referencedBullet.z) @@ -115,7 +117,7 @@ SUBSYSTEM_DEF(bullets) coordinates[2] = cos(coordinates[4]) // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio // we get the angle of the trajectory by incrementing it. - message_admins("[referencedBullet] -/- [coordinates[4]] , x: [coordinates[1]], y:[coordinates[2]]") + //message_admins("[referencedBullet] -/- [coordinates[4]] , x: [coordinates[1]], y:[coordinates[2]]") rotation.Turn(coordinates[4] + 180) referencedBullet.transform = rotation movementRatios = coordinates @@ -226,8 +228,6 @@ SUBSYSTEM_DEF(bullets) if(QDELETED(projectile)) bullet_queue -= bullet break - if(istype(projectile, /obj/item/projectile/bullet/clrifle)) - message_admins("BEFORE - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") tx_change = 0 ty_change = 0 if(x_change) @@ -250,8 +250,6 @@ SUBSYSTEM_DEF(bullets) projectile.Move(moveTurf) bullet.coloreds |= moveTurf moveTurf.color = "#2fff05ee" - if(istype(projectile, /obj/item/projectile/bullet/clrifle)) - message_admins("AFTER - px: [bulletCoords[1]], py:[bulletCoords[2]], x:[projectile.x], y:[projectile.y]") moveTurf = null if(sx_change) x_change = sx_change diff --git a/code/datums/datum_click_handlers.dm b/code/datums/datum_click_handlers.dm index 5f0b2ad4cd..1c423fe8f8 100644 --- a/code/datums/datum_click_handlers.dm +++ b/code/datums/datum_click_handlers.dm @@ -38,12 +38,14 @@ /datum/click_handler/proc/MouseDown(object,location,control,params) return TRUE -/datum/click_handler/proc/MouseDrag(over_object,src_location,over_location,src_control,over_control,params) +/datum/click_handler/proc/MouseDrag(src_object,over_object,src_location,over_location,src_control,over_control,params) return TRUE /datum/click_handler/proc/MouseUp(object,location,control,params) return TRUE +/datum/click_handler/proc/MouseMove(object, location, control, params) + return TRUE /datum/click_handler/proc/mob_check(mob/living/carbon/human/user) //Check can mob use a ability return @@ -102,6 +104,7 @@ object = resolve_world_target(object) if(object) + //message_admins("MouseDown - [params]") storedParams = params target = object time_since_last_shot = world.time @@ -122,21 +125,27 @@ if(target) owner.mob.face_atom(target) - while(time_since_last_shot < world.time) + if(time_since_last_shot < world.time) do_fire() time_since_last_shot = world.time + (reciever.fire_delay < GUN_MINIMUM_FIRETIME ? GUN_MINIMUM_FIRETIME : reciever.fire_delay) * min(world.tick_lag, 1) spawn(1) shooting_loop() -/datum/click_handler/fullauto/MouseDrag(over_object, src_location, over_location, src_control, over_control, params) +/datum/click_handler/fullauto/MouseDrag(src_object,over_object,src_location,over_location,src_control,over_control,params) src_location = resolve_world_target(src_location) if(src_location) + //message_admins("MouseDrag - [params]") storedParams = params target = src_location return FALSE return TRUE +/datum/click_handler/fullauto/MouseMove(object, location, control, params) + //message_admins("MouseMove - [params]") + storedParams = params + return TRUE + /datum/click_handler/fullauto/MouseUp(object, location, control, params) stop_firing() return TRUE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d292392ff3..db5fb77c3a 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -282,7 +282,7 @@ GLOBAL_LIST(projectileDamageConstants) check_hit_zone(distance, user_recoil) setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - message_admins("[src] - x-off:[x_offset], y-off:[y_offset]") + //message_admins("[src] - x-off:[x_offset], y-off:[y_offset]") new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 32, 1, 50) //Process() From 9c398af908136c807b2112a1c3b3befdfcefe6fe Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 26 Feb 2024 15:24:52 +0200 Subject: [PATCH 046/171] THE FIX --- code/datums/datum_click_handlers.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/datums/datum_click_handlers.dm b/code/datums/datum_click_handlers.dm index 1c423fe8f8..d688387631 100644 --- a/code/datums/datum_click_handlers.dm +++ b/code/datums/datum_click_handlers.dm @@ -133,11 +133,11 @@ shooting_loop() /datum/click_handler/fullauto/MouseDrag(src_object,over_object,src_location,over_location,src_control,over_control,params) - src_location = resolve_world_target(src_location) - if(src_location) + over_object = resolve_world_target(over_object) + if(over_object) //message_admins("MouseDrag - [params]") storedParams = params - target = src_location + target = over_object return FALSE return TRUE From 090d019cddd033e53be7f64f438efd650557e667 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 27 Feb 2024 09:11:38 +0200 Subject: [PATCH 047/171] h --- code/modules/power/supermatter/supermatter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index ddcac201df..41d9e6c882 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -41,7 +41,7 @@ anchored = FALSE light_range = 4 - price_tag = 10000 + price_tag = 20000 var/gasefficency = 0.25 From ec8cf5e7a5e99d26de8e9fe0c0bbec33202f18ac Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 27 Feb 2024 14:25:06 +0200 Subject: [PATCH 048/171] aaah --- code/controllers/subsystems/bullets.dm | 49 ++++++------------- code/game/turfs/simulated/walls.dm | 67 +++++--------------------- code/modules/projectiles/projectile.dm | 2 + 3 files changed, 28 insertions(+), 90 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index f526c79ec4..f09dde9e08 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -8,7 +8,7 @@ /// Pixels per turf #define PPT 32 -#define HPPT 16 +#define HPPT (PPT/2) SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -45,8 +45,9 @@ SUBSYSTEM_DEF(bullets) var/projectileAccuracy = 0 var/lifetime = 30 var/bulletLevel = 0 + var/lastChanges = list(0,0,0) -/datum/bullet_data/New(atom/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) +/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) /* if(!target) message_admins("Created bullet without target , [referencedBullet]") @@ -55,6 +56,7 @@ SUBSYSTEM_DEF(bullets) message_admins("Created bullet without firer, [referencedBullet]") return */ + referencedBullet.dataRef = src src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, referencedBullet.z) @@ -105,7 +107,12 @@ SUBSYSTEM_DEF(bullets) updateCoordinateRatio() SSbullets.bullet_queue += src -/// I hate trigonometry, but i hate ATAN2 more. +/datum/bullet_data/proc/redirect(list/targetCoordinates, list/firingCoordinates) + src.firedTurf = get_turf(referencedBullet) + src.firedPos = firingCoordinates + src.targetCoords = targetCoordinates + updateCoordinateRatio() + /datum/bullet_data/proc/updateCoordinateRatio() var/list/coordinates = list(0,0,0,0) var/matrix/rotation = matrix() @@ -116,42 +123,11 @@ SUBSYSTEM_DEF(bullets) coordinates[1] = sin(coordinates[4]) coordinates[2] = cos(coordinates[4]) // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio - // we get the angle of the trajectory by incrementing it. //message_admins("[referencedBullet] -/- [coordinates[4]] , x: [coordinates[1]], y:[coordinates[2]]") rotation.Turn(coordinates[4] + 180) referencedBullet.transform = rotation movementRatios = coordinates -/datum/bullet_data/proc/ricochet(atom/wall, implementation) - var/list/bCoords = list(referencedBullet.x, referencedBullet.y, referencedBullet.pixel_x, referencedBullet.pixel_y) - var/list/wCoords = list(wall.x, wall.y) - if(implementation == 1) - var/list/cCoords = list(abs(bCoords[1] - wCoords[1] + 0.00001), abs(bCoords[2] - wCoords[2] + 0.00001)) - var/list/tCoords = list(0,0) - var/ipothenuse = sqrt(cCoords[1]**2 + cCoords[2]**2) - if(cCoords[1] > cCoords[2]) - var/s = cCoords[1]/ipothenuse - s = 90 - arcsin(s) - if(s < 30) - cCoords[1] = -cCoords[1] - else - var/s = cCoords[2]/ipothenuse - s = 90 - arcsin(s) - if(s < 30) - cCoords[2] = -cCoords[2] - return cCoords - else - var/bSlope = (referencedBullet.y + referencedBullet.pixel_y )/(referencedBullet.x + referencedBullet.pixel_x) - var/trueAngle = 0 - if(targetCoords[1] > targetCoords[2]) - trueAngle = arctan(bSlope) - else - trueAngle = 180 - arctan(bSlope) - - message_admins("TRUE ANGLE - [trueAngle]") - - - /datum/bullet_data/proc/updateLevel() switch(currentCoords[3]) @@ -208,6 +184,9 @@ SUBSYSTEM_DEF(bullets) var/turf/moveTurf = null for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet + bullet.lastChanges[1] = 0 + bullet.lastChanges[2] = 0 + bullet.lastChanges[3] = 0 if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet) || QDELETED(bullet.referencedBullet)) bullet_queue -= bullet continue @@ -237,6 +216,8 @@ SUBSYSTEM_DEF(bullets) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change + lastChanges[1] += tx_change + lastChanges[2] += ty_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change projectile.pixel_x -= PPT * tx_change diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 8f115b5fc6..93db988c98 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -206,71 +206,26 @@ return -/turf/simulated/wall/bullet_act(var/obj/item/projectile/Proj) - if(src.ricochet_id != 0) - if(src.ricochet_id == Proj.ricochet_id) - src.ricochet_id = 0 - new /obj/effect/sparks(get_turf(Proj)) - return PROJECTILE_CONTINUE - src.ricochet_id = 0 +/turf/simulated/wall/bullet_act(obj/item/projectile/Proj) var/proj_health = Proj.get_structure_damage() if(istype(Proj,/obj/item/projectile/beam)) burn(500)//TODO : fucking write these two procs not only for plasma (see plasma in materials.dm:283) ~ else if(istype(Proj,/obj/item/projectile/ion)) burn(500) + else if(istype(Proj,/obj/item/projectile/bullet)) + var/list/lastMoves = proj.dataRef.lastChanges + var/angle = proj.dataRef.movementRatios[4] + switch(angle) + if(0 to 25) + if(l) + if(65 to 115) + if(155 to 205) + if(245 to 295) + if(335 to 360) Proj.on_hit(src) - /* - if(Proj.can_ricochet && proj_health != 0 && (src.x != Proj.starting.x) && (src.y != Proj.starting.y)) - var/ricochetchance = 1 - if(proj_health <= 60) - ricochetchance = 2 + round((60 - proj_health) / 5) - ricochetchance = min(ricochetchance * ricochetchance, 100) - // here it is multiplied by 1/2 temporally, changes will be required when new wall system gets implemented - ricochetchance = round(ricochetchance * projectile_reflection(Proj, TRUE) / 2) - - ricochetchance *= Proj.ricochet_ability - ricochetchance = min(max(ricochetchance, 0), 100) - if(prob(ricochetchance)) - // projectile loses up to 50% of its health when it ricochets, depending on situation - var/healthdiff = round(proj_health / 2 + proj_health * ricochetchance / 200) // projectile loses up to 50% of its health when it ricochets, depending on situation - var/list/damageAdjustment= list() - var/dam = Proj.getAllDamType(BRUTE) - damageAdjustment[BRUTE] = round(dam/2 + dam*ricochetchance/200) - dam = Proj.getAllDamType(BURN) - damageAdjustment[BURN] = round(dam/2 + dam*ricochetchance/200) - Proj.adjust_damages(damageAdjustment) - Proj.def_zone = ran_zone() - projectile_reflection(Proj) // Reflect before health, runtimes occur in some cases if health happens first. - visible_message("\The [Proj] ricochets off the surface of wall!") - take_damage(min(proj_health - healthdiff, 100)) - new /obj/effect/sparks(get_turf(Proj)) - return PROJECTILE_CONTINUE // complete projectile permutation - - //cut some projectile health here and not in projectile.dm, because we need not to all things what are using get_str_dam() becomes thin and weak. - //in general, bullets have 35-95 health, and they are plased in ~30 bullets magazines, so 50*30 = 150, but plasteel walls have only 400 hp =| - //but you may also increase materials thickness or etc. - proj_health = round(Proj.get_structure_damage() / 3)//Yo may replace 3 to 5-6 to make walls fucking stronk as a Poland - - //cap the amount of health, so that things like emitters can't destroy walls in one hit. - var/health_taken = 0 - if(Proj.nocap_structures) - health_taken = proj_health * 4 - else - health_taken = min(proj_health, 100) - - create_bullethole(Proj)//Potentially infinite bullet holes but most walls don't last long enough for this to be a problem. - if(Proj.damage_types[BRUTE] && prob(health / maxHealth * 33)) - var/obj/item/trash/material/metal/slug = new(get_turf(Proj)) - slug.matter.Cut() - slug.matter[reinf_material ? reinf_material.name : material.name] = 0.1 - slug.throw_at(get_turf(Proj), 0, 1) - - take_damage(health_taken) - - */ /turf/simulated/wall/hitby(AM as mob|obj, var/speed=THROWFORCE_SPEED_DIVISOR) ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index db5fb77c3a..349ece0ab0 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -103,6 +103,8 @@ GLOBAL_LIST(projectileDamageConstants) var/matrix/effect_transform // matrix to rotate and scale projectile effects - putting it here so it doesn't // have to be recreated multiple times + var/datum/bullet_data/dataRef = null + /// This is done to save a lot of memory from duplicated damage lists. /// The list is also copied whenever PrepareForLaunch is called and modified as needs to be /obj/item/projectile/Initialize() From ec8db240d089e8b72474445b0b3d64d4cb61be52 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Feb 2024 02:17:33 +0200 Subject: [PATCH 049/171] aaaaaaah --- code/controllers/subsystems/bullets.dm | 12 ++++++-- code/game/turfs/simulated/walls.dm | 38 +++++++++++++++++++++----- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index f09dde9e08..131ebe7ed0 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -113,6 +113,14 @@ SUBSYSTEM_DEF(bullets) src.targetCoords = targetCoordinates updateCoordinateRatio() +/datum/bullet_data/proc/tweeeeng() + var/matrix/rotation = matrix() + movementRatios[4] = (abs(movementRatios[90] + 90) * sign(movementRatios[4])%180) + message_admins("Tweeng : [movementRatios[4]]") + movementRatios[1] = sin(movementRatios[4]) + movementRatios[2] = cos(movementRatios[4]) + rotation.Turn(movementRatios[4] + 180) + /datum/bullet_data/proc/updateCoordinateRatio() var/list/coordinates = list(0,0,0,0) var/matrix/rotation = matrix() @@ -216,8 +224,8 @@ SUBSYSTEM_DEF(bullets) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change - lastChanges[1] += tx_change - lastChanges[2] += ty_change + bullet.lastChanges[1] += tx_change + bullet.lastChanges[2] += ty_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change projectile.pixel_x -= PPT * tx_change diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 93db988c98..160cd48625 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -213,15 +213,39 @@ else if(istype(Proj,/obj/item/projectile/ion)) burn(500) else if(istype(Proj,/obj/item/projectile/bullet)) - var/list/lastMoves = proj.dataRef.lastChanges - var/angle = proj.dataRef.movementRatios[4] + var/list/lastMoves = Proj.dataRef.lastChanges + var/angle = Proj.dataRef.movementRatios[4] + var/ricochet = FALSE + message_admins("Bullet hit wall at [angle]") switch(angle) - if(0 to 25) - if(l) + if(-180 to -155) + if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) + dataRef.tweeeeng() + //Proj.dataRef.movementRatios[1] *= -1 + ricochet = TRUE + if(-115 to -65) + if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) + dataRef.tweeeeng() + //Proj.dataRef.movementRatios[2] *= -1 + ricochet = TRUE + if(-25 to 25) + if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) + dataRef.tweeeeng() + //Proj.dataRef.movementRatios[1] *= -1 + ricochet = TRUE if(65 to 115) - if(155 to 205) - if(245 to 295) - if(335 to 360) + if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) + dataRef.tweeeeng() + //Proj.dataRef.movementRatios[2] *= -1 + ricochet = TRUE + if(155 to 180) + if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) + dataRef.tweeeeng() + //Proj.dataRef.movementRatios[1] *= -1 + ricochet = TRUE + if(ricochet) + message_admins("Ricochet!") + return PROJECTILE_CONTINUE Proj.on_hit(src) From 9b67518aefc858f3b6b9652b597e187e6b206546 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Feb 2024 02:51:15 +0200 Subject: [PATCH 050/171] perfect bounces. --- code/controllers/subsystems/bullets.dm | 9 ++++----- code/game/turfs/simulated/walls.dm | 11 +++++------ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 131ebe7ed0..f71d43853a 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -113,13 +113,12 @@ SUBSYSTEM_DEF(bullets) src.targetCoords = targetCoordinates updateCoordinateRatio() -/datum/bullet_data/proc/tweeeeng() +/datum/bullet_data/proc/bounce(bounceAxis, pixelOffset) var/matrix/rotation = matrix() - movementRatios[4] = (abs(movementRatios[90] + 90) * sign(movementRatios[4])%180) - message_admins("Tweeng : [movementRatios[4]]") - movementRatios[1] = sin(movementRatios[4]) - movementRatios[2] = cos(movementRatios[4]) + movementRatios[bounceAxis] *= -1 + movementRatios[4] = arctan(movementRatios[2], movementRatios[1]) rotation.Turn(movementRatios[4] + 180) + referencedBullet.transform = rotation /datum/bullet_data/proc/updateCoordinateRatio() var/list/coordinates = list(0,0,0,0) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 160cd48625..4b532ff762 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -220,27 +220,26 @@ switch(angle) if(-180 to -155) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - dataRef.tweeeeng() - //Proj.dataRef.movementRatios[1] *= -1 + Proj.dataRef.bounce(1) ricochet = TRUE if(-115 to -65) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - dataRef.tweeeeng() + Proj.dataRef.bounce(2) //Proj.dataRef.movementRatios[2] *= -1 ricochet = TRUE if(-25 to 25) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - dataRef.tweeeeng() + Proj.dataRef.bounce(1) //Proj.dataRef.movementRatios[1] *= -1 ricochet = TRUE if(65 to 115) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - dataRef.tweeeeng() + Proj.dataRef.bounce(2) //Proj.dataRef.movementRatios[2] *= -1 ricochet = TRUE if(155 to 180) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - dataRef.tweeeeng() + Proj.dataRef.bounce(1) //Proj.dataRef.movementRatios[1] *= -1 ricochet = TRUE if(ricochet) From 00ba90e822dee48b67ed94edca98127176a08aea Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Feb 2024 12:30:47 +0200 Subject: [PATCH 051/171] e --- code/controllers/subsystems/bullets.dm | 17 +++++++++----- code/modules/projectiles/projectile.dm | 31 +------------------------- 2 files changed, 12 insertions(+), 36 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index f71d43853a..46706ac8bc 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -104,23 +104,28 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF src.firedCoordinates = list(0,0, referencedBullet.z) src.currentCoords[3] += firedLevel - updateCoordinateRatio() + updatePathByPosition() SSbullets.bullet_queue += src /datum/bullet_data/proc/redirect(list/targetCoordinates, list/firingCoordinates) src.firedTurf = get_turf(referencedBullet) src.firedPos = firingCoordinates src.targetCoords = targetCoordinates - updateCoordinateRatio() + updatePathByPosition() -/datum/bullet_data/proc/bounce(bounceAxis, pixelOffset) - var/matrix/rotation = matrix() +/datum/bullet_data/proc/bounce(bounceAxis, angleOffset) movementRatios[bounceAxis] *= -1 - movementRatios[4] = arctan(movementRatios[2], movementRatios[1]) + movementRatios[4] = arctan(movementRatios[2], movementRatios[1]) + angleOffset + updatePathByAngle() + +/datum/bullet_data/proc/updatePathByAngle() + var/matrix/rotation = matrix() + movementRatios[1] = sin(movementRatios[4]) + movementRatios[2] = cos(movementRatios[4]) rotation.Turn(movementRatios[4] + 180) referencedBullet.transform = rotation -/datum/bullet_data/proc/updateCoordinateRatio() +/datum/bullet_data/proc/updatePathByPosition() var/list/coordinates = list(0,0,0,0) var/matrix/rotation = matrix() coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 349ece0ab0..f3cf42543a 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -283,8 +283,7 @@ GLOBAL_LIST(projectileDamageConstants) var/distance = get_dist(curloc, original) check_hit_zone(distance, user_recoil) - setup_trajectory(curloc, targloc, x_offset, y_offset, angle_offset) //plot the initial trajectory - //message_admins("[src] - x-off:[x_offset], y-off:[y_offset]") + muzzle_effect(effect_transform) new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 32, 1, 50) //Process() @@ -326,16 +325,6 @@ GLOBAL_LIST(projectileDamageConstants) silenced = launcher.item_flags & SILENT return launch(target, target_zone, x_offset, y_offset, angle_offset, user_recoil = recoil) -//Used to change the direction of the projectile in flight. -/obj/item/projectile/proc/redirect(new_x, new_y, atom/starting_loc, mob/new_firer) - var/turf/new_target = locate(new_x, new_y, src.z) - - original = new_target - if(new_firer) - firer = src - - setup_trajectory(starting_loc, new_target) - /obj/item/projectile/proc/istargetloc(mob/living/target_mob) if(target_mob && original) var/turf/originalloc @@ -621,24 +610,6 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/before_move() return FALSE -/obj/item/projectile/proc/setup_trajectory(turf/startloc, turf/targloc, x_offset = 0, y_offset = 0, angle_offset) - // setup projectile state - starting = startloc - current = startloc - yo = targloc.y - startloc.y + y_offset - xo = targloc.x - startloc.x + x_offset - - // plot the initial trajectory - trajectory = new() - trajectory.setup(starting, original, pixel_x, pixel_y, angle_offset) - - // generate this now since all visual effects the projectile makes can use it - effect_transform = new() - effect_transform.Scale(trajectory.return_hypotenuse(), 1) - effect_transform.Turn(-trajectory.return_angle()) //no idea why this has to be inverted, but it works - - transform = turn(transform, -(trajectory.return_angle() + 90)) //no idea why 90 needs to be added, but it works - /obj/item/projectile/proc/muzzle_effect(var/matrix/T) //This can happen when firing inside a wall, safety check if (!location) From 415b6a07a9a0aeda7628187de48b5490ad5fb5d9 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Feb 2024 17:47:56 +0200 Subject: [PATCH 052/171] h --- code/game/turfs/simulated/walls.dm | 128 +++--------------- .../modules/projectiles/ammunition/bullets.dm | 7 + .../projectiles/guns/projectile/shotgun.dm | 8 ++ .../modules/projectiles/projectile/bullets.dm | 26 ++++ 4 files changed, 61 insertions(+), 108 deletions(-) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 4b532ff762..c2600b68a6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -116,139 +116,51 @@ if(!radiate()) return PROCESS_KILL -// Extracts angle's tan if ischance = TRUE. -// In other case it just makes bullets and lazorz go where they're supposed to. - -/turf/simulated/wall/proc/projectile_reflection(obj/item/projectile/Proj, var/ischance = FALSE) - if(Proj.starting) - var/ricochet_temp_id = rand(1,1000) - if(!ischance) - Proj.ricochet_id = ricochet_temp_id - var/turf/curloc = get_turf(src) - - var/check_x0 = 32 * curloc.x - var/check_y0 = 32 * curloc.y - var/check_x1 = 32 * Proj.starting.x - var/check_y1 = 32 * Proj.starting.y - var/check_x2 = 32 * Proj.original.x - var/check_y2 = 32 * Proj.original.y - var/corner_x0 = check_x0 - var/corner_y0 = check_y0 - if(check_y0 - check_y1 > 0) - corner_y0 = corner_y0 - 16 - else - corner_y0 = corner_y0 + 16 - if(check_x0 - check_x1 > 0) - corner_x0 = corner_x0 - 16 - else - corner_x0 = corner_x0 + 16 - - // Checks if original is lower or upper than line connecting proj's starting and wall - // In specific coordinate system that has wall as (0,0) and 'starting' as (r, 0), where r > 0. - // So, this checks whether 'original's' y-coordinate is positive or negative in new c.s. - // In order to understand, in which direction bullet will ricochet. - // Actually new_y isn't y-coordinate, but it has the same sign. - var/new_y = (check_y2 - corner_y0) * (check_x1 - corner_x0) - (check_x2 - corner_x0) * (check_y1 - corner_y0) - // Here comes the thing which differs two situations: - // First - bullet comes from north-west or south-east, with negative func value. Second - NE or SW. - var/new_func = (corner_x0 - check_x1) * (corner_y0 - check_y1) - - // Added these wall things because my original code works well with one-tiled walls, but ignores adjacent turfs which in my current opinion was pretty wrong. - var/wallnorth = 0 - var/wallsouth = 0 - var/walleast = 0 - var/wallwest = 0 - for (var/turf/simulated/wall/W in range(2, curloc)) - var/turf/tempwall = get_turf(W) - if (tempwall.x == curloc.x) - if (tempwall.y == (curloc.y - 1)) - wallnorth = 1 - if (!ischance) - W.ricochet_id = ricochet_temp_id - else if (tempwall.y == (curloc.y + 1)) - wallsouth = 1 - if (!ischance) - W.ricochet_id = ricochet_temp_id - if (tempwall.y == curloc.y) - if (tempwall.x == (curloc.x + 1)) - walleast = 1 - if (!ischance) - W.ricochet_id = ricochet_temp_id - else if (tempwall.x == (curloc.x - 1)) - wallwest = 1 - if (!ischance) - W.ricochet_id = ricochet_temp_id - - if((wallnorth || wallsouth) && ((Proj.starting.y - curloc.y)*(wallsouth - wallnorth) >= 0)) - if(!ischance) - Proj.redirect(round(check_x1 / 32), round((2 * check_y0 - check_y1)/32), curloc, src) - return - else - return abs((check_y0 - check_y1) / (check_x0 - check_x1)) - - if((walleast || wallwest) && ((Proj.starting.x - curloc.x)*(walleast-wallwest) >= 0)) - if(!ischance) - Proj.redirect(round((2 * check_x0 - check_x1) / 32), round(check_y1 / 32), curloc, src) - return - else - return abs((check_x0 - check_x1) / (check_y0 - check_y1)) - - if((new_y * new_func) > 0) - if(!ischance) - Proj.redirect(round((2 * check_x0 - check_x1) / 32), round(check_y1 / 32), curloc, src) - else - return abs((check_x0 - check_x1) / (check_y0 - check_y1)) - else - if(!ischance) - Proj.redirect(round(check_x1 / 32), round((2 * check_y0 - check_y1)/32), curloc, src) - else - return abs((check_y0 - check_y1) / (check_x0 - check_x1)) - return - - -/turf/simulated/wall/bullet_act(obj/item/projectile/Proj) - var/proj_health = Proj.get_structure_damage() - if(istype(Proj,/obj/item/projectile/beam)) +/turf/simulated/wall/bullet_act(obj/item/projectile/hittingProjectile) + var/projectileDamage = hittingProjectile.get_structure_damage() + if(istype(hittingProjectile,/obj/item/projectile/beam)) burn(500)//TODO : fucking write these two procs not only for plasma (see plasma in materials.dm:283) ~ - else if(istype(Proj,/obj/item/projectile/ion)) + else if(istype(hittingProjectile,/obj/item/projectile/ion)) burn(500) - else if(istype(Proj,/obj/item/projectile/bullet)) - var/list/lastMoves = Proj.dataRef.lastChanges - var/angle = Proj.dataRef.movementRatios[4] + else if(istype(hittingProjectile,/obj/item/projectile/bullet)) + var/list/lastMoves = hittingProjectile.dataRef.lastChanges + var/angle = hittingProjectile.dataRef.movementRatios[4] var/ricochet = FALSE message_admins("Bullet hit wall at [angle]") switch(angle) if(-180 to -155) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - Proj.dataRef.bounce(1) + hittingProjectile.dataRef.bounce(1) ricochet = TRUE if(-115 to -65) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - Proj.dataRef.bounce(2) - //Proj.dataRef.movementRatios[2] *= -1 + hittingProjectile.dataRef.bounce(2) ricochet = TRUE if(-25 to 25) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - Proj.dataRef.bounce(1) - //Proj.dataRef.movementRatios[1] *= -1 + hittingProjectile.dataRef.bounce(1) ricochet = TRUE if(65 to 115) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - Proj.dataRef.bounce(2) - //Proj.dataRef.movementRatios[2] *= -1 + hittingProjectile.dataRef.bounce(2) ricochet = TRUE if(155 to 180) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - Proj.dataRef.bounce(1) - //Proj.dataRef.movementRatios[1] *= -1 + hittingProjectile.dataRef.bounce(1) ricochet = TRUE if(ricochet) message_admins("Ricochet!") + take_damage(round(projectileDamage * 0.33)) return PROJECTILE_CONTINUE - Proj.on_hit(src) - + take_damage(projectileDamage) + if(health < maxHealth * 0.4 && prob(projectileDamage)) + var/obj/item/trash/material/metal/slug = new(get_turf(hittingProjectile)) + slug.matter.Cut() + slug.matter[reinf_material ? reinf_material.name : material.name] = 0.1 + slug.throw_at(get_turf(hittingProjectile), 0, 1) + hittingProjectile.on_hit(src) /turf/simulated/wall/hitby(AM as mob|obj, var/speed=THROWFORCE_SPEED_DIVISOR) ..() diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index 08b1a14db9..deabe13027 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -336,6 +336,13 @@ sprite_max_rotate = 22 sprite_scale = 0.75 +/obj/item/ammo_casing/shotgun/newBuckshot + name = "12 Gauge buckshot" + desc = "A container filled with 16 pellets of 12 Gauge" + caliber = CAL_SHOTGUN + projectile_type = /obj/item/projectile/bullet/shotgunBuckshot + maxamount = 5 + /obj/item/ammo_casing/shotgun/prespawned amount = 5 diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 80bb050a8f..1c0916deae 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -8,6 +8,8 @@ twohanded = TRUE var/recentpumpmsg = 0 // Variable to prevent chat message spam var/fired_one_handed = FALSE + /// How many pixels large our choke radious can be ? Better shotguns have it lower + var/chokeRandomness = 8 wield_delay = 0 SECOND wield_delay_factor = 0 @@ -17,6 +19,12 @@ fired_one_handed = TRUE return TRUE +/obj/item/gun/projectile/shotgun/process_projectile(obj/item/projectile/P, mob/living/user, atom/target, target_zone, params) + if(istype(P, /obj/item/projectile/bullet/shotgunBuckshot)) + var/obj/item/projectile/bullet/shotgunBuckshot/buck = P + buck.pixelSpread = chokeRandomness + . = ..() + /obj/item/gun/projectile/shotgun/handle_post_fire(var/mob/living/user) ..() if(fired_one_handed) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 4b433a3c36..9129b82f65 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -81,6 +81,32 @@ return 0 +/obj/item/projectile/bullet/shotgunBuckshot + name = "12 Gauge buck pellet" + damage_types = list( + ARMOR_BULLET = list( + DELEM(BRUTE, 12) + ) + ) + /// Wheter we are the initla buckshot pellet that should create the rest or not + var/isInitial = TRUE + /// Amount of pellets to create / replicate + var/pelletCount = 15 + /// How much can we spread ? will be random from 0 to its value. IN PIXELS. Modified by shotguns before launching + var/pixelSpread = 6 + +/obj/item/projectile/bullet/shotgunBuckshot/launch(atom/target, target_zone, x_offset, y_offset, angle_offset, proj_sound, user_recoil) + if(!isInitial) + return ..() + else while(pelletCount) + pelletCount-- + var/obj/item/projectile/bullet/shotgunBuckshot/fellowPellet = new(get_turf(src)) + fellowPellet.isInitial = FALSE + fellowPellet.firer = src.firer + fellowPellet.PrepareForLaunch() + fellowPellet.launch(target, target_zone, x_offset + rand(0, pixelSpread), y_offset + rand(0, pixelSpread), 0) + ..() + //For projectiles that actually represent clouds of projectiles /obj/item/projectile/bullet/pellet name = "shrapnel" //'shrapnel' sounds more dangerous (i.e. cooler) than 'pellet' From 61e96b2dc93f3f4ce63a45125faa658411912271 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Feb 2024 17:50:33 +0200 Subject: [PATCH 053/171] Update projectile.dm --- code/modules/projectiles/projectile.dm | 67 -------------------------- 1 file changed, 67 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f3cf42543a..cf71674f65 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -705,73 +705,6 @@ GLOBAL_LIST(projectileDamageConstants) return damageTotal > 0 ? (damageLeft / damageTotal) :0 -//"Tracing" projectile -/obj/item/projectile/test //Used to see if you can hit them. - invisibility = 101 //Nope! Can't see me! - yo = null - xo = null - var/result = 0 //To pass the message back to the gun. - -/obj/item/projectile/test/Bump(atom/A as mob|obj|turf|area, forced) - if(A == firer) - forceMove(A.loc) - return //cannot shoot yourself - if(istype(A, /obj/item/projectile)) - return - if(isliving(A) || istype(A, /mob/living/exosuit)) - result = 2 //We hit someone, return 1! - return - result = 1 - return - -/obj/item/projectile/test/launch(atom/target, target_zone, x_offset, y_offset, angle_offset, proj_sound, user_recoil) - var/turf/curloc = get_turf(src) - var/turf/targloc = get_turf(target) - if(!curloc || !targloc) - return 0 - - original = target - - //plot the initial trajectory - setup_trajectory(curloc, targloc) - return Process(targloc) - -/obj/item/projectile/test/Process(turf/targloc) - while(src) //Loop on through! - if(result) - return (result - 1) - if((!( targloc ) || loc == targloc)) - targloc = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge - - trajectory.increment() // increment the current location - location = trajectory.return_location(location) // update the locally stored location data - - Move(location.return_turf()) - - var/mob/living/M = locate() in get_turf(src) - if(istype(M)) //If there is someting living... - return 1 //Return 1 - else - M = locate() in get_step(src,targloc) - if(istype(M)) - return 1 - -//Helper proc to check if you can hit them or not. -/proc/check_trajectory(atom/target as mob|obj, atom/firer as mob|obj, var/pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) - if(!istype(target) || !istype(firer)) - return 0 - - var/obj/item/projectile/test/trace = new /obj/item/projectile/test(get_turf(firer)) //Making the test.... - - //Set the flags and pass flags to that of the real projectile... - if(!isnull(flags)) - trace.flags = flags - trace.pass_flags = pass_flags - - var/output = trace.launch(target) //Test it! - qdel(trace) //No need for it anymore - return output //Send it back to the gun! - /proc/get_proj_icon_by_color(var/obj/item/projectile/P, var/color) var/icon/I = new(P.icon, P.icon_state) I.Blend(color) From 7ec42701f7bd851011fa7b888fa4f1b30b46c793 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Feb 2024 20:58:31 +0200 Subject: [PATCH 054/171] ; --- code/controllers/subsystems/bullets.dm | 2 +- code/modules/clothing/spacesuits/void/station.dm | 10 ++-------- code/modules/clothing/suits/armor.dm | 10 ++-------- code/modules/mob/living/silicon/robot/robot.dm | 8 ++------ code/modules/projectiles/projectile.dm | 9 +++++++++ 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 46706ac8bc..37e1df0122 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -69,7 +69,7 @@ SUBSYSTEM_DEF(bullets) src.targetCoords = targetCoords src.targetPos = list(target.x, target.y , target.z) //src.targetCoords = list(8,8, targetTurf.z) - src.turfsPerTick = turfsPerTick + src.turfsPerTick = turfsPerTick * 4 src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime if(ismob(firer)) diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index a874c74dad..e722b14db8 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -421,14 +421,8 @@ reflectchance /= 1.5 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]\'s [name] reflects [attack_text]!")) - - // Find a turf near or on the original location to bounce to - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(user) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, user) + P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + P.dataRef.updatePathByAngle() return PROJECTILE_FORCE_MISS_SILENCED // complete projectile permutation diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 9d34e309f3..69261bb7a3 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -389,14 +389,8 @@ reflectchance /= 2 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]'s [src.name] reflects [attack_text]!")) - - // Find a turf near or on the original location to bounce to - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(user) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, user) + P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + P.dataRef.updatePathByAngle() return PROJECTILE_CONTINUE // complete projectile permutation diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 70969f4225..4087ea307c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -523,12 +523,8 @@ chance = max((chance - B.armor_divisor * 10), 0) if(B.starting && prob(chance)) visible_message(SPAN_DANGER("\The [Proj.name] ricochets off [src]\'s armour!")) - var/multiplier = round(10 / get_dist(B.starting, src)) - var/turf/sourceloc = get_turf_away_from_target_complex(src, B.starting, multiplier) - var/distance = get_dist(sourceloc, src) - var/new_x = sourceloc.x + ( rand(0, distance) * prob(50) ? -1 : 1 ) - var/new_y = sourceloc.y + ( rand(0, distance) * prob(50) ? -1 : 1 ) - B.redirect(new_x, new_y, get_turf(src), src) + B.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + B.dataRef.updatePathByAngle() return PROJECTILE_CONTINUE // complete projectile permutation ..(Proj) if(prob(75) && Proj.get_structure_damage() > 0) spark_system.start() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index cf71674f65..02000b26fd 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -710,3 +710,12 @@ GLOBAL_LIST(projectileDamageConstants) I.Blend(color) return I +/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) + var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) + var/xRatio = sin(angle) + var/yRatio = cos(angle) + return TRUE + + + + From f55c65447cf394849baace6170100fdb16270a7f Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 29 Feb 2024 01:09:07 +0200 Subject: [PATCH 055/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 39 ++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 37e1df0122..3844678485 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -45,6 +45,8 @@ SUBSYSTEM_DEF(bullets) var/projectileAccuracy = 0 var/lifetime = 30 var/bulletLevel = 0 + var/changeDelta = 0 + var/changeAxis = 0 var/lastChanges = list(0,0,0) /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) @@ -130,6 +132,14 @@ SUBSYSTEM_DEF(bullets) var/matrix/rotation = matrix() coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) coordinates[2] = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2] - HPPT) + if(coordinates[1] > coordinates[2]) + changeDelta = round(abs(coordinates[1])/abs(coordinates[2])) + changeAxis = 2 + else + changeDelta = round(abs(coordinates[2])/abs(coordinates[1])) + changeAxis = 1 + if(changeDelta < 1) + changeAxis = 0 coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) coordinates[4] = ATAN2(coordinates[2], coordinates[1]) coordinates[1] = sin(coordinates[4]) @@ -185,6 +195,9 @@ SUBSYSTEM_DEF(bullets) /// Prevent random dealocations and reallocations , just have em up initialized once. var/list/bulletRatios var/list/bulletCoords + var/list/lastChanges + var/changeAxis + var/changeDelta var/obj/item/projectile/projectile var/x_change var/y_change @@ -194,14 +207,18 @@ SUBSYSTEM_DEF(bullets) var/sx_change var/sy_change var/turf/moveTurf = null + var/iteration for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet - bullet.lastChanges[1] = 0 - bullet.lastChanges[2] = 0 - bullet.lastChanges[3] = 0 if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet) || QDELETED(bullet.referencedBullet)) bullet_queue -= bullet continue + iteration = 1 + lastChanges = bullet.lastChanges + movementError = bullet.movementError + lastChanges[1] = 0 + lastChanges[2] = 0 + lastChanges[3] = 0 bulletRatios = bullet.movementRatios bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet @@ -211,20 +228,23 @@ SUBSYSTEM_DEF(bullets) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) + message_admins("Calculated changeRatio : [changeRatio] , axis : [changeAxis]") tx_change = 0 ty_change = 0 sx_change = 0 sy_change = 0 - while(x_change || y_change) + while(x_change || y_change || sx_change || sy_change) if(QDELETED(projectile)) bullet_queue -= bullet break + tx_change = 0 ty_change = 0 if(x_change) tx_change = x_change/abs(x_change) if(y_change) ty_change = y_change/abs(y_change) + moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change @@ -244,20 +264,17 @@ SUBSYSTEM_DEF(bullets) bullet.coloreds |= moveTurf moveTurf.color = "#2fff05ee" moveTurf = null - if(sx_change) - x_change = sx_change - sx_change = 0 - if(sy_change) - y_change = sy_change - sy_change = 0 + iteration++ animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords - + /* if(QDELETED(projectile)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) thing.color = initial(thing.color) + */ + #undef LEVEL_BELOW From f45a0c229640fc46398e86eed694e43653d864ca Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 29 Feb 2024 21:50:16 +0200 Subject: [PATCH 056/171] Revert "Update bullets.dm" This reverts commit f55c65447cf394849baace6170100fdb16270a7f. --- code/controllers/subsystems/bullets.dm | 39 ++++++++------------------ 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 3844678485..37e1df0122 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -45,8 +45,6 @@ SUBSYSTEM_DEF(bullets) var/projectileAccuracy = 0 var/lifetime = 30 var/bulletLevel = 0 - var/changeDelta = 0 - var/changeAxis = 0 var/lastChanges = list(0,0,0) /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) @@ -132,14 +130,6 @@ SUBSYSTEM_DEF(bullets) var/matrix/rotation = matrix() coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) coordinates[2] = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2] - HPPT) - if(coordinates[1] > coordinates[2]) - changeDelta = round(abs(coordinates[1])/abs(coordinates[2])) - changeAxis = 2 - else - changeDelta = round(abs(coordinates[2])/abs(coordinates[1])) - changeAxis = 1 - if(changeDelta < 1) - changeAxis = 0 coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) coordinates[4] = ATAN2(coordinates[2], coordinates[1]) coordinates[1] = sin(coordinates[4]) @@ -195,9 +185,6 @@ SUBSYSTEM_DEF(bullets) /// Prevent random dealocations and reallocations , just have em up initialized once. var/list/bulletRatios var/list/bulletCoords - var/list/lastChanges - var/changeAxis - var/changeDelta var/obj/item/projectile/projectile var/x_change var/y_change @@ -207,18 +194,14 @@ SUBSYSTEM_DEF(bullets) var/sx_change var/sy_change var/turf/moveTurf = null - var/iteration for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet + bullet.lastChanges[1] = 0 + bullet.lastChanges[2] = 0 + bullet.lastChanges[3] = 0 if(!istype(bullet.referencedBullet, /obj/item/projectile/bullet) || QDELETED(bullet.referencedBullet)) bullet_queue -= bullet continue - iteration = 1 - lastChanges = bullet.lastChanges - movementError = bullet.movementError - lastChanges[1] = 0 - lastChanges[2] = 0 - lastChanges[3] = 0 bulletRatios = bullet.movementRatios bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet @@ -228,23 +211,20 @@ SUBSYSTEM_DEF(bullets) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) - message_admins("Calculated changeRatio : [changeRatio] , axis : [changeAxis]") tx_change = 0 ty_change = 0 sx_change = 0 sy_change = 0 - while(x_change || y_change || sx_change || sy_change) + while(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet break - tx_change = 0 ty_change = 0 if(x_change) tx_change = x_change/abs(x_change) if(y_change) ty_change = y_change/abs(y_change) - moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) x_change -= tx_change y_change -= ty_change @@ -264,17 +244,20 @@ SUBSYSTEM_DEF(bullets) bullet.coloreds |= moveTurf moveTurf.color = "#2fff05ee" moveTurf = null - iteration++ + if(sx_change) + x_change = sx_change + sx_change = 0 + if(sy_change) + y_change = sy_change + sy_change = 0 animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords - /* + if(QDELETED(projectile)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) thing.color = initial(thing.color) - */ - #undef LEVEL_BELOW From 32ea58a46d34d07661e4748b158f03f197287596 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 29 Feb 2024 21:51:07 +0200 Subject: [PATCH 057/171] Revert ";" This reverts commit 7ec42701f7bd851011fa7b888fa4f1b30b46c793. --- code/controllers/subsystems/bullets.dm | 2 +- code/modules/clothing/spacesuits/void/station.dm | 10 ++++++++-- code/modules/clothing/suits/armor.dm | 10 ++++++++-- code/modules/mob/living/silicon/robot/robot.dm | 8 ++++++-- code/modules/projectiles/projectile.dm | 9 --------- 5 files changed, 23 insertions(+), 16 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 37e1df0122..46706ac8bc 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -69,7 +69,7 @@ SUBSYSTEM_DEF(bullets) src.targetCoords = targetCoords src.targetPos = list(target.x, target.y , target.z) //src.targetCoords = list(8,8, targetTurf.z) - src.turfsPerTick = turfsPerTick * 4 + src.turfsPerTick = turfsPerTick src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime if(ismob(firer)) diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index e722b14db8..a874c74dad 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -421,8 +421,14 @@ reflectchance /= 1.5 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]\'s [name] reflects [attack_text]!")) - P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) - P.dataRef.updatePathByAngle() + + // Find a turf near or on the original location to bounce to + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(user) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, user) return PROJECTILE_FORCE_MISS_SILENCED // complete projectile permutation diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 69261bb7a3..9d34e309f3 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -389,8 +389,14 @@ reflectchance /= 2 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]'s [src.name] reflects [attack_text]!")) - P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) - P.dataRef.updatePathByAngle() + + // Find a turf near or on the original location to bounce to + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(user) + + // redirect the projectile + P.redirect(new_x, new_y, curloc, user) return PROJECTILE_CONTINUE // complete projectile permutation diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4087ea307c..70969f4225 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -523,8 +523,12 @@ chance = max((chance - B.armor_divisor * 10), 0) if(B.starting && prob(chance)) visible_message(SPAN_DANGER("\The [Proj.name] ricochets off [src]\'s armour!")) - B.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) - B.dataRef.updatePathByAngle() + var/multiplier = round(10 / get_dist(B.starting, src)) + var/turf/sourceloc = get_turf_away_from_target_complex(src, B.starting, multiplier) + var/distance = get_dist(sourceloc, src) + var/new_x = sourceloc.x + ( rand(0, distance) * prob(50) ? -1 : 1 ) + var/new_y = sourceloc.y + ( rand(0, distance) * prob(50) ? -1 : 1 ) + B.redirect(new_x, new_y, get_turf(src), src) return PROJECTILE_CONTINUE // complete projectile permutation ..(Proj) if(prob(75) && Proj.get_structure_damage() > 0) spark_system.start() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 02000b26fd..cf71674f65 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -710,12 +710,3 @@ GLOBAL_LIST(projectileDamageConstants) I.Blend(color) return I -/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) - var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) - var/xRatio = sin(angle) - var/yRatio = cos(angle) - return TRUE - - - - From e44ccfbb65ccc6f9c875c615fe66c058ce6a2dd2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 29 Feb 2024 21:51:13 +0200 Subject: [PATCH 058/171] Revert "Revert ";"" This reverts commit 32ea58a46d34d07661e4748b158f03f197287596. --- code/controllers/subsystems/bullets.dm | 2 +- code/modules/clothing/spacesuits/void/station.dm | 10 ++-------- code/modules/clothing/suits/armor.dm | 10 ++-------- code/modules/mob/living/silicon/robot/robot.dm | 8 ++------ code/modules/projectiles/projectile.dm | 9 +++++++++ 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 46706ac8bc..37e1df0122 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -69,7 +69,7 @@ SUBSYSTEM_DEF(bullets) src.targetCoords = targetCoords src.targetPos = list(target.x, target.y , target.z) //src.targetCoords = list(8,8, targetTurf.z) - src.turfsPerTick = turfsPerTick + src.turfsPerTick = turfsPerTick * 4 src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime if(ismob(firer)) diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index a874c74dad..e722b14db8 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -421,14 +421,8 @@ reflectchance /= 1.5 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]\'s [name] reflects [attack_text]!")) - - // Find a turf near or on the original location to bounce to - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(user) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, user) + P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + P.dataRef.updatePathByAngle() return PROJECTILE_FORCE_MISS_SILENCED // complete projectile permutation diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 9d34e309f3..69261bb7a3 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -389,14 +389,8 @@ reflectchance /= 2 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]'s [src.name] reflects [attack_text]!")) - - // Find a turf near or on the original location to bounce to - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(user) - - // redirect the projectile - P.redirect(new_x, new_y, curloc, user) + P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + P.dataRef.updatePathByAngle() return PROJECTILE_CONTINUE // complete projectile permutation diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 70969f4225..4087ea307c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -523,12 +523,8 @@ chance = max((chance - B.armor_divisor * 10), 0) if(B.starting && prob(chance)) visible_message(SPAN_DANGER("\The [Proj.name] ricochets off [src]\'s armour!")) - var/multiplier = round(10 / get_dist(B.starting, src)) - var/turf/sourceloc = get_turf_away_from_target_complex(src, B.starting, multiplier) - var/distance = get_dist(sourceloc, src) - var/new_x = sourceloc.x + ( rand(0, distance) * prob(50) ? -1 : 1 ) - var/new_y = sourceloc.y + ( rand(0, distance) * prob(50) ? -1 : 1 ) - B.redirect(new_x, new_y, get_turf(src), src) + B.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + B.dataRef.updatePathByAngle() return PROJECTILE_CONTINUE // complete projectile permutation ..(Proj) if(prob(75) && Proj.get_structure_damage() > 0) spark_system.start() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index cf71674f65..02000b26fd 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -710,3 +710,12 @@ GLOBAL_LIST(projectileDamageConstants) I.Blend(color) return I +/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) + var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) + var/xRatio = sin(angle) + var/yRatio = cos(angle) + return TRUE + + + + From 86a92b37379afa9e838861fe5c44714aa942b458 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 29 Feb 2024 23:25:22 +0200 Subject: [PATCH 059/171] AT LAST... --- code/controllers/subsystems/bullets.dm | 115 ++++++++++-------- .../projectiles/guns/projectile/shotgun.dm | 6 +- code/modules/projectiles/projectile.dm | 2 +- .../modules/projectiles/projectile/bullets.dm | 8 +- 4 files changed, 70 insertions(+), 61 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 37e1df0122..ac35b189f4 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -41,13 +41,13 @@ SUBSYSTEM_DEF(bullets) var/list/turf/coloreds = list() var/targetLevel = 0 var/currentLevel = 0 - var/turfsPerTick = 0 + var/pixelsPerTick = 0 var/projectileAccuracy = 0 var/lifetime = 30 var/bulletLevel = 0 var/lastChanges = list(0,0,0) -/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, turfsPerTick, projectileAccuracy, lifetime) +/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick, angleOffset, lifetime) /* if(!target) message_admins("Created bullet without target , [referencedBullet]") @@ -69,7 +69,7 @@ SUBSYSTEM_DEF(bullets) src.targetCoords = targetCoords src.targetPos = list(target.x, target.y , target.z) //src.targetCoords = list(8,8, targetTurf.z) - src.turfsPerTick = turfsPerTick * 4 + src.pixelsPerTick = pixelsPerTick src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime if(ismob(firer)) @@ -104,7 +104,9 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF src.firedCoordinates = list(0,0, referencedBullet.z) src.currentCoords[3] += firedLevel - updatePathByPosition() + movementRatios[4] = getAngleByPosition() + movementRatios[4] += angleOffset + updatePathByAngle() SSbullets.bullet_queue += src /datum/bullet_data/proc/redirect(list/targetCoordinates, list/firingCoordinates) @@ -118,6 +120,11 @@ SUBSYSTEM_DEF(bullets) movementRatios[4] = arctan(movementRatios[2], movementRatios[1]) + angleOffset updatePathByAngle() +/datum/bullet_data/proc/getAngleByPosition() + var/x = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) + var/y = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2] - HPPT) + return ATAN2(y, x) + /datum/bullet_data/proc/updatePathByAngle() var/matrix/rotation = matrix() movementRatios[1] = sin(movementRatios[4]) @@ -128,14 +135,10 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/updatePathByPosition() var/list/coordinates = list(0,0,0,0) var/matrix/rotation = matrix() - coordinates[1] = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) - coordinates[2] = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2] - HPPT) coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) - coordinates[4] = ATAN2(coordinates[2], coordinates[1]) + coordinates[4] = getAngleByPosition() coordinates[1] = sin(coordinates[4]) coordinates[2] = cos(coordinates[4]) - // [1] is X ratio , [2] is Y ratio, [3] is Z-ratio - //message_admins("[referencedBullet] -/- [coordinates[4]] , x: [coordinates[1]], y:[coordinates[2]]") rotation.Turn(coordinates[4] + 180) referencedBullet.transform = rotation movementRatios = coordinates @@ -186,13 +189,13 @@ SUBSYSTEM_DEF(bullets) var/list/bulletRatios var/list/bulletCoords var/obj/item/projectile/projectile + var/pixelsToTravel + var/pixelsThisStep var/x_change var/y_change var/z_change var/tx_change var/ty_change - var/sx_change - var/sy_change var/turf/moveTurf = null for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet @@ -205,59 +208,63 @@ SUBSYSTEM_DEF(bullets) bulletRatios = bullet.movementRatios bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet - bulletCoords[1] += (bulletRatios[1] * bullet.turfsPerTick) - bulletCoords[2] += (bulletRatios[2] * bullet.turfsPerTick) - bulletCoords[3] += (bulletRatios[3] * bullet.turfsPerTick) - x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) - y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) - z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) - tx_change = 0 - ty_change = 0 - sx_change = 0 - sy_change = 0 - while(x_change || y_change) - if(QDELETED(projectile)) - bullet_queue -= bullet - break + pixelsToTravel = bullet.pixelsPerTick + /// We have to break up the movement into steps if its too big(since it leads to erronous steps) , this is preety much continous collision + /// but less performant A more performant version would be to use the same algorithm as throwing for determining which turfs to "intersect" + /// Im using this implementation because im getting skill issued trying to implement the same one as throwing(i had to rewrite this 4 times already) + /// and also because it has.. much more information about the general trajectory stored SPCR - 2024 + while(pixelsToTravel > 0) + pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel + pixelsToTravel -= pixelsThisStep + bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) + bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) + bulletCoords[3] += (bulletRatios[3] * pixelsThisStep) + x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) + y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) + z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) tx_change = 0 ty_change = 0 - if(x_change) - tx_change = x_change/abs(x_change) - if(y_change) - ty_change = y_change/abs(y_change) - moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) - x_change -= tx_change - y_change -= ty_change - bullet.lastChanges[1] += tx_change - bullet.lastChanges[2] += ty_change - bulletCoords[1] -= PPT * tx_change - bulletCoords[2] -= PPT * ty_change - projectile.pixel_x -= PPT * tx_change - projectile.pixel_y -= PPT * ty_change - bullet.lifetime-- - if(bullet.lifetime < 0) - bullet_queue -= bullet - break - bullet.updateLevel() - if(moveTurf) - projectile.Move(moveTurf) - bullet.coloreds |= moveTurf - moveTurf.color = "#2fff05ee" - moveTurf = null - if(sx_change) - x_change = sx_change - sx_change = 0 - if(sy_change) - y_change = sy_change - sy_change = 0 + while(x_change || y_change) + if(QDELETED(projectile)) + bullet_queue -= bullet + break + tx_change = 0 + ty_change = 0 + if(x_change) + tx_change = x_change/abs(x_change) + if(y_change) + ty_change = y_change/abs(y_change) + moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) + x_change -= tx_change + y_change -= ty_change + bullet.lastChanges[1] += tx_change + bullet.lastChanges[2] += ty_change + bulletCoords[1] -= PPT * tx_change + bulletCoords[2] -= PPT * ty_change + projectile.pixel_x -= PPT * tx_change + projectile.pixel_y -= PPT * ty_change + bullet.lifetime-- + if(bullet.lifetime < 0) + bullet_queue -= bullet + break + bullet.updateLevel() + if(moveTurf) + projectile.Move(moveTurf) + /* + bullet.coloreds |= moveTurf + moveTurf.color = "#2fff05ee" + */ + moveTurf = null animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords + /* if(QDELETED(projectile)) bullet_queue -= bullet for(var/turf/thing in bullet.coloreds) thing.color = initial(thing.color) + */ #undef LEVEL_BELOW diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 1c0916deae..53e8039244 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -8,8 +8,8 @@ twohanded = TRUE var/recentpumpmsg = 0 // Variable to prevent chat message spam var/fired_one_handed = FALSE - /// How many pixels large our choke radious can be ? Better shotguns have it lower - var/chokeRandomness = 8 + /// How much angle offset does our shotgun have? + var/angleOffset = 12 wield_delay = 0 SECOND wield_delay_factor = 0 @@ -22,7 +22,7 @@ /obj/item/gun/projectile/shotgun/process_projectile(obj/item/projectile/P, mob/living/user, atom/target, target_zone, params) if(istype(P, /obj/item/projectile/bullet/shotgunBuckshot)) var/obj/item/projectile/bullet/shotgunBuckshot/buck = P - buck.pixelSpread = chokeRandomness + buck.angleOffset = src.angleOffset . = ..() /obj/item/gun/projectile/shotgun/handle_post_fire(var/mob/living/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 02000b26fd..f8fe90ca08 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -284,7 +284,7 @@ GLOBAL_LIST(projectileDamageConstants) check_hit_zone(distance, user_recoil) muzzle_effect(effect_transform) - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 32, 1, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 48, angle_offset, 50) //Process() return FALSE diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 9129b82f65..51681379f4 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -92,8 +92,8 @@ var/isInitial = TRUE /// Amount of pellets to create / replicate var/pelletCount = 15 - /// How much can we spread ? will be random from 0 to its value. IN PIXELS. Modified by shotguns before launching - var/pixelSpread = 6 + /// Angle offset. This is forced by the shotgun if fired from one. If not, then the default is used + var/angleOffset = 24 /obj/item/projectile/bullet/shotgunBuckshot/launch(atom/target, target_zone, x_offset, y_offset, angle_offset, proj_sound, user_recoil) if(!isInitial) @@ -104,7 +104,9 @@ fellowPellet.isInitial = FALSE fellowPellet.firer = src.firer fellowPellet.PrepareForLaunch() - fellowPellet.launch(target, target_zone, x_offset + rand(0, pixelSpread), y_offset + rand(0, pixelSpread), 0) + var/angleBruh = rand(-angleOffset/2,angleOffset/2) + message_admins("Random angle is : [angleBruh]") + fellowPellet.launch(target, target_zone, x_offset , y_offset, angleBruh, null, null) ..() //For projectiles that actually represent clouds of projectiles From a64efeb486bc35795706c5b11e6d774052ad134a Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 1 Mar 2024 13:44:11 +0200 Subject: [PATCH 060/171] AAAAH --- code/modules/projectiles/projectile.dm | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f8fe90ca08..5ac66896aa 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -714,6 +714,44 @@ GLOBAL_LIST(projectileDamageConstants) var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) var/xRatio = sin(angle) var/yRatio = cos(angle) + var/xChange = 0 + var/yChange = 0 + var/tX = 0 + var/tY = 0 + var/turf/check = locate(round(startingCoordinates[1]/32), round(startingCoordinates[2]/32), round(startingCoordinates[3])) + var/turf/targetTurf = locate(round(targetCoordinates[1]/32), round(targetCoordinates[2]/32), round(targetCoordinates[3])) + var/simCoords = list(0,0,0) + while(check != targetTurf) + simCoords[1] += xRatio * 32 + simCoords[2] += yRatio * 32 + xChange = round(abs(simCoords[1])/16) * sign(simCoords[1]) + yChange = round(abs(simCoords[2])/16) * sign(simCoords[2]) + while(xChange || yChange) + if(xChange) + tX = abs(xChange)/xChange + if(yChange) + tY = abs(yChange)/yChange + check = locate(check.x + tX, check.y + tY, check.z) + // collision checks + if(check.density) + return FALSE + for(var/atom/movable/object in check.contents) + if(object.density) + if(istype(object, /obj/structure/window)) + if(!(pass_flags & PASSGLASS)) + return FALSE + else if(istype(object, /obj/structure/table)) + if(!(pass_flags & PASSTABLE)) + return FALSE + else if(istype(object, /obj/structure/grille)) + if(!(pass_flags & PASSGRILLE)) + return FALSE + else + return FALSE + xChange -= tX + yChange -= tY + simCoords[1] -= 32 * tX + simCoords[2] -= 32 * tY return TRUE From da4f28f8d9f2a6916019eeba7c1915fc5ee87f80 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 1 Mar 2024 14:56:17 +0200 Subject: [PATCH 061/171] fixes --- code/game/machinery/excelsior/ex_turret.dm | 2 +- code/game/machinery/portable_turret.dm | 2 +- code/modules/mining/mining_turret.dm | 2 +- code/modules/onestar/os_turret.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile.dm | 12 +++++++++--- code/modules/projectiles/projectile/bullets.dm | 1 - 7 files changed, 14 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/excelsior/ex_turret.dm b/code/game/machinery/excelsior/ex_turret.dm index bfc7c09910..8b21fc5978 100644 --- a/code/game/machinery/excelsior/ex_turret.dm +++ b/code/game/machinery/excelsior/ex_turret.dm @@ -102,7 +102,7 @@ if(get_dist(src, L) > 7) return TURRET_NOT_TARGET - if(!check_trajectory(L, src)) + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 1fd136aef9..c5c62467f9 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -576,7 +576,7 @@ var/list/turret_icons if(get_dist(src, L) > 7) //if it's too far away, why bother? return TURRET_NOT_TARGET - if(!check_trajectory(L, src)) //check if we have true line of sight + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) //check if we have true line of sight return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest diff --git a/code/modules/mining/mining_turret.dm b/code/modules/mining/mining_turret.dm index 5f3e27d43a..d609c3dad8 100644 --- a/code/modules/mining/mining_turret.dm +++ b/code/modules/mining/mining_turret.dm @@ -73,7 +73,7 @@ if(get_dist(src, L) > 7) return TURRET_NOT_TARGET - if(!check_trajectory(L, src)) + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest diff --git a/code/modules/onestar/os_turret.dm b/code/modules/onestar/os_turret.dm index bf34c113dd..016be7c34c 100644 --- a/code/modules/onestar/os_turret.dm +++ b/code/modules/onestar/os_turret.dm @@ -95,7 +95,7 @@ if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var continue - if(!check_trajectory(L, src)) //check if we have true line of sight + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) //check if we have true line of sight continue if(!nearest_valid_target) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 2947ee68fd..6d7996faeb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -508,7 +508,7 @@ return 2 //just assume we can shoot through glass and stuff. No big deal, the player can just choose to not target someone //on the other side of a window if it makes a difference. Or if they run behind a window, too bad. - return check_trajectory(target, user) + return check_trajectory(list(user.x,user.y,user.z), list(target.x, target.y, target.z),null,null) //called if there was no projectile to shoot /obj/item/gun/proc/handle_click_empty(mob/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 5ac66896aa..67611bed94 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -251,7 +251,7 @@ GLOBAL_LIST(projectileDamageConstants) return TRUE /obj/item/projectile/proc/check_fire(atom/target as mob, mob/living/user as mob) //Checks if you can hit them or not. - check_trajectory(target, user, pass_flags, flags) + check_trajectory(list(user.x,user.y,user.z), list(target.x, target.y, target.z),null,null) //sets the click point of the projectile using mouse input params /obj/item/projectile/proc/set_clickpoint(params) @@ -710,8 +710,10 @@ GLOBAL_LIST(projectileDamageConstants) I.Blend(color) return I +#define MAX_ITER 16 /proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) + message_admins("CT angle : [angle]") var/xRatio = sin(angle) var/yRatio = cos(angle) var/xChange = 0 @@ -726,13 +728,15 @@ GLOBAL_LIST(projectileDamageConstants) simCoords[2] += yRatio * 32 xChange = round(abs(simCoords[1])/16) * sign(simCoords[1]) yChange = round(abs(simCoords[2])/16) * sign(simCoords[2]) - while(xChange || yChange) + while((xChange || yChange) && (check != targetTurf)) if(xChange) tX = abs(xChange)/xChange if(yChange) tY = abs(yChange)/yChange check = locate(check.x + tX, check.y + tY, check.z) // collision checks + if(!check) + return FALSE if(check.density) return FALSE for(var/atom/movable/object in check.contents) @@ -746,12 +750,14 @@ GLOBAL_LIST(projectileDamageConstants) else if(istype(object, /obj/structure/grille)) if(!(pass_flags & PASSGRILLE)) return FALSE - else + else if(!istype(object, /obj/structure/railing)) return FALSE xChange -= tX yChange -= tY simCoords[1] -= 32 * tX simCoords[2] -= 32 * tY + tX = 0 + tY = 0 return TRUE diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 51681379f4..e136ba9b23 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -105,7 +105,6 @@ fellowPellet.firer = src.firer fellowPellet.PrepareForLaunch() var/angleBruh = rand(-angleOffset/2,angleOffset/2) - message_admins("Random angle is : [angleBruh]") fellowPellet.launch(target, target_zone, x_offset , y_offset, angleBruh, null, null) ..() From e6343db312bc1ac822b34de4eccf242099817bdf Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 4 Mar 2024 13:13:23 +0200 Subject: [PATCH 062/171] aa --- code/controllers/subsystems/bullets.dm | 89 ++++++++++++++------- code/game/machinery/excelsior/ex_turret.dm | 4 +- code/game/machinery/portable_turret.dm | 4 +- code/game/turfs/simulated/floor_attackby.dm | 15 +++- code/game/turfs/simulated/floor_damage.dm | 6 +- code/modules/mining/mining_turret.dm | 4 +- code/modules/onestar/os_turret.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/projectile.dm | 19 ++--- 9 files changed, 94 insertions(+), 51 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index ac35b189f4..79aa40bd70 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,9 +1,9 @@ -#define LEVEL_BELOW 0 -#define LEVEL_TURF 0.2 -#define LEVEL_LYING 0.3 -#define LEVEL_LOWWALL 0.5 -#define LEVEL_TABLE 0.6 -#define LEVEL_STANDING 0.8 +#define LEVEL_BELOW -1 +#define LEVEL_TURF -0.7 +#define LEVEL_LYING -0.5 +#define LEVEL_LOWWALL 0 +#define LEVEL_TABLE 0.2 +#define LEVEL_STANDING 0.7 #define LEVEL_ABOVE 1 /// Pixels per turf @@ -17,6 +17,19 @@ SUBSYSTEM_DEF(bullets) var/list/datum/bullet_data/current_queue = list() var/list/datum/bullet_data/bullet_queue = list() + // Used for processing bullets. No point in deallocating and reallocating them every MC tick. + var/list/bulletRatios + var/list/bulletCoords + var/obj/item/projectile/projectile + var/pixelsToTravel + var/pixelsThisStep + var/x_change + var/y_change + var/z_change + var/tx_change + var/ty_change + var/tz_change + var/turf/moveTurf = null @@ -37,6 +50,7 @@ SUBSYSTEM_DEF(bullets) var/list/targetPos = list(0,0,0) var/turf/currentTurf = null var/currentCoords = list(0,0,0) + /// [1]=X , [2]=Y, [3]=Z, [4]=Angle var/movementRatios = list(0,0,0,0) var/list/turf/coloreds = list() var/targetLevel = 0 @@ -46,6 +60,8 @@ SUBSYSTEM_DEF(bullets) var/lifetime = 30 var/bulletLevel = 0 var/lastChanges = list(0,0,0) + /// Used to determine wheter a projectile should be allowed to bump a turf or not. + var/isTraversingLevel = FALSE /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick, angleOffset, lifetime) /* @@ -133,15 +149,20 @@ SUBSYSTEM_DEF(bullets) referencedBullet.transform = rotation /datum/bullet_data/proc/updatePathByPosition() - var/list/coordinates = list(0,0,0,0) var/matrix/rotation = matrix() - coordinates[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) - coordinates[4] = getAngleByPosition() - coordinates[1] = sin(coordinates[4]) - coordinates[2] = cos(coordinates[4]) - rotation.Turn(coordinates[4] + 180) + movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel)/(distStartToFinish()) + movementRatios[4] = getAngleByPosition() + movementRatios[1] = sin(movementRatios[4]) + movementRatios[2] = cos(movementRatios[4]) + rotation.Turn(movementRatios[4] + 180) referencedBullet.transform = rotation - movementRatios = coordinates + +/datum/bullet_data/proc/distStartToFinish() + var/x = targetPos[1] - firedPos[1] + var/y = targetPos[2] - firedPos[2] + var/px = targetCoords[1] - firedCoordinates[1] + var/py = targetCoords[2] - firedCoordinates[2] + return sqrt(x**2 + y**2) + sqrt(px**2 + py**2) /datum/bullet_data/proc/updateLevel() @@ -185,18 +206,6 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() - /// Prevent random dealocations and reallocations , just have em up initialized once. - var/list/bulletRatios - var/list/bulletCoords - var/obj/item/projectile/projectile - var/pixelsToTravel - var/pixelsThisStep - var/x_change - var/y_change - var/z_change - var/tx_change - var/ty_change - var/turf/moveTurf = null for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet bullet.lastChanges[1] = 0 @@ -218,29 +227,46 @@ SUBSYSTEM_DEF(bullets) pixelsToTravel -= pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] += (bulletRatios[3] * pixelsThisStep) + bulletCoords[3] += (bulletRatios[3] * pixelsThisStep/PPT) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) - z_change = round(abs(bulletCoords[3]) / HPPT) * sign(bulletCoords[3]) - tx_change = 0 - ty_change = 0 + //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet break - tx_change = 0 - ty_change = 0 + tx_change = ((x_change + (x_change == 0))/abs(x_change + (x_change == 0))) * (x_change != 0) + ty_change = ((y_change + (y_change == 0))/abs(y_change + (y_change == 0))) * (y_change != 0) + //tz_change = ((z_change + (z_change == 0))/abs(z_change + (z_change == 0))) * (z_change != 0) + /* if(x_change) tx_change = x_change/abs(x_change) if(y_change) ty_change = y_change/abs(y_change) + if(z_change) + tz_change = z_change/abs(z_change) + */ moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) + if(tz_change && !istype(moveTurf, /turf/simulated/open)) + if(tz_change <= -1) + if(moveTurf.bullet_act(projectile) == PROJECTILE_CONTINUE) + moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) + else + projectile.onBlockingHit(moveTurf) + else + moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) + if(moveTurf.bullet_act(projectile) != PROJECTILE_CONTINUE) + projectile.onBlockingHit(moveTurf) + x_change -= tx_change y_change -= ty_change + z_change -= tz_change bullet.lastChanges[1] += tx_change bullet.lastChanges[2] += ty_change + bullet.lastChanges[3] += tz_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change + bulletCoords[3] -= tz_change * 1.99 projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.lifetime-- @@ -256,6 +282,7 @@ SUBSYSTEM_DEF(bullets) */ moveTurf = null + bullet.updateLevel() animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords diff --git a/code/game/machinery/excelsior/ex_turret.dm b/code/game/machinery/excelsior/ex_turret.dm index 8b21fc5978..c0ec3e5cd5 100644 --- a/code/game/machinery/excelsior/ex_turret.dm +++ b/code/game/machinery/excelsior/ex_turret.dm @@ -99,10 +99,10 @@ if(L.invisibility >= INVISIBILITY_LEVEL_ONE) return TURRET_NOT_TARGET - if(get_dist(src, L) > 7) + if(get_dist(src, L) > 12) return TURRET_NOT_TARGET - if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null, L)) return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index c5c62467f9..4805e3793a 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -573,10 +573,10 @@ var/list/turret_icons if(L.stat && !emagged) //if the perp is dead/dying, no need to bother really return TURRET_NOT_TARGET //move onto next potential victim! - if(get_dist(src, L) > 7) //if it's too far away, why bother? + if(get_dist(src, L) > 12) //if it's too far away, why bother? return TURRET_NOT_TARGET - if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) //check if we have true line of sight + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null, L)) //check if we have true line of sight return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 35ad609448..ef968d7eea 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -38,7 +38,7 @@ take_damage(calc_damage, BRUTE) else visible_message(SPAN_DANGER("[user] ineffectually hits [src] with [I]")) - user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return TRUE for(var/atom/movable/A in src) @@ -202,3 +202,16 @@ to_chat(user, SPAN_WARNING("This section is too damaged to support anything. Use a welder to fix the damage.")) return 0 return 1 +/* +/turf/simulated/floor/bullet_act(obj/item/projectile/P, def_zone) + if(!P.dataRef) + return PROJECTILE_CONTINUE + else if(!(P.dataRef.isTraversingLevel)) + return PROJECTILE_CONTINUE + if(take_damage(P.get_structure_damage(), BRUTE, FALSE)) + return PROJECTILE_CONTINUE + else + return PROJECTILE_STOP +*/ + + diff --git a/code/game/turfs/simulated/floor_damage.dm b/code/game/turfs/simulated/floor_damage.dm index 2ce4de0f42..96abd89ff8 100644 --- a/code/game/turfs/simulated/floor_damage.dm +++ b/code/game/turfs/simulated/floor_damage.dm @@ -34,11 +34,11 @@ for(var/obj/structure/lattice/L in src) if(damage > 75) L.take_damage(damage) - return + return FALSE damage -= flooring ? flooring.resistance : 0 if(damage <= 0) - return + return FALSE health -= damage @@ -50,6 +50,7 @@ //spawn() //We'll spawn off a new stack in order to damage the next layer, incase it turns into a different turf object damage_floor_at(x, y, z, leftover, damage_type, ignore_resistance) + return TRUE else if(flooring) //Breaking or burning overlays. //A tile can have one of each type @@ -60,6 +61,7 @@ if(!burnt && (damage_type == BURN || damage_type == BLAST) && health < (flooring.health * 0.75)) burnt = TRUE update_icon() + return FALSE /proc/damage_floor_at(x, y, z, damage, damage_type, ignore_resistance) diff --git a/code/modules/mining/mining_turret.dm b/code/modules/mining/mining_turret.dm index d609c3dad8..3d3060a520 100644 --- a/code/modules/mining/mining_turret.dm +++ b/code/modules/mining/mining_turret.dm @@ -70,10 +70,10 @@ if(L.invisibility >= INVISIBILITY_LEVEL_ONE) return TURRET_NOT_TARGET - if(get_dist(src, L) > 7) + if(get_dist(src, L) > 12) return TURRET_NOT_TARGET - if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null, L)) return TURRET_NOT_TARGET if(emagged) // If emagged not even the dead get a rest diff --git a/code/modules/onestar/os_turret.dm b/code/modules/onestar/os_turret.dm index 016be7c34c..1e15bbe1ff 100644 --- a/code/modules/onestar/os_turret.dm +++ b/code/modules/onestar/os_turret.dm @@ -95,7 +95,7 @@ if(L.invisibility >= INVISIBILITY_LEVEL_ONE) // Cannot see him. see_invisible is a mob-var continue - if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null)) //check if we have true line of sight + if(!check_trajectory(list(x,y,z), list(L.x, L.y, L.z),null,null, L)) //check if we have true line of sight continue if(!nearest_valid_target) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6d7996faeb..757e6ceaf5 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -508,7 +508,7 @@ return 2 //just assume we can shoot through glass and stuff. No big deal, the player can just choose to not target someone //on the other side of a window if it makes a difference. Or if they run behind a window, too bad. - return check_trajectory(list(user.x,user.y,user.z), list(target.x, target.y, target.z),null,null) + return check_trajectory(list(user.x,user.y,user.z), list(target.x, target.y, target.z),null,null, target) //called if there was no projectile to shoot /obj/item/gun/proc/handle_click_empty(mob/user) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 67611bed94..903eb9d9ad 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -216,8 +216,8 @@ GLOBAL_LIST(projectileDamageConstants) return /obj/item/projectile/proc/on_hit(atom/target, def_zone = null) - if(!isliving(target)) return 0 - if(isanimal(target)) return 0 + if(!isliving(target)) return FALSE + if(isanimal(target)) return FALSE var/mob/living/L = target L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy) return TRUE @@ -251,7 +251,7 @@ GLOBAL_LIST(projectileDamageConstants) return TRUE /obj/item/projectile/proc/check_fire(atom/target as mob, mob/living/user as mob) //Checks if you can hit them or not. - check_trajectory(list(user.x,user.y,user.z), list(target.x, target.y, target.z),null,null) + check_trajectory(list(user.x,user.y,user.z), list(target.x, target.y, target.z),null,null, target) //sets the click point of the projectile using mouse input params /obj/item/projectile/proc/set_clickpoint(params) @@ -548,15 +548,14 @@ GLOBAL_LIST(projectileDamageConstants) return FALSE //stop flying - on_impact(A) + onBlockingHit(A) + return TRUE +/obj/item/projectile/proc/onBlockingHit(atom/A) + on_impact(A) density = FALSE invisibility = 101 - - qdel(src) - return TRUE - /obj/item/projectile/explosion_act(target_power, explosion_handler/handler) return 0 @@ -711,7 +710,7 @@ GLOBAL_LIST(projectileDamageConstants) return I #define MAX_ITER 16 -/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null) +/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null, mob/targetMob) var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) message_admins("CT angle : [angle]") var/xRatio = sin(angle) @@ -740,6 +739,8 @@ GLOBAL_LIST(projectileDamageConstants) if(check.density) return FALSE for(var/atom/movable/object in check.contents) + if(object == targetMob) + return TRUE if(object.density) if(istype(object, /obj/structure/window)) if(!(pass_flags & PASSGLASS)) From 4836d702fa68628290b62ed426babdee6549f236 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 13 Mar 2024 12:37:26 +0200 Subject: [PATCH 063/171] z --- code/controllers/subsystems/bullets.dm | 14 ++++---------- code/modules/projectiles/projectile.dm | 1 - 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 79aa40bd70..bc33e3cf8d 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -237,16 +237,10 @@ SUBSYSTEM_DEF(bullets) break tx_change = ((x_change + (x_change == 0))/abs(x_change + (x_change == 0))) * (x_change != 0) ty_change = ((y_change + (y_change == 0))/abs(y_change + (y_change == 0))) * (y_change != 0) - //tz_change = ((z_change + (z_change == 0))/abs(z_change + (z_change == 0))) * (z_change != 0) + tz_change = ((z_change + (z_change == 0))/abs(z_change + (z_change == 0))) * (z_change != 0) + moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) + if(tz_change == 1) /* - if(x_change) - tx_change = x_change/abs(x_change) - if(y_change) - ty_change = y_change/abs(y_change) - if(z_change) - tz_change = z_change/abs(z_change) - */ - moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z) if(tz_change && !istype(moveTurf, /turf/simulated/open)) if(tz_change <= -1) if(moveTurf.bullet_act(projectile) == PROJECTILE_CONTINUE) @@ -257,7 +251,7 @@ SUBSYSTEM_DEF(bullets) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) if(moveTurf.bullet_act(projectile) != PROJECTILE_CONTINUE) projectile.onBlockingHit(moveTurf) - + */ x_change -= tx_change y_change -= ty_change z_change -= tz_change diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 903eb9d9ad..531c9cbb1e 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -709,7 +709,6 @@ GLOBAL_LIST(projectileDamageConstants) I.Blend(color) return I -#define MAX_ITER 16 /proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null, mob/targetMob) var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) message_admins("CT angle : [angle]") From ee3669279e5d08448a9a142220e45d1c9cb7ae15 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 3 Apr 2024 12:36:24 +0200 Subject: [PATCH 064/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index bc33e3cf8d..91d12068ba 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -239,7 +239,6 @@ SUBSYSTEM_DEF(bullets) ty_change = ((y_change + (y_change == 0))/abs(y_change + (y_change == 0))) * (y_change != 0) tz_change = ((z_change + (z_change == 0))/abs(z_change + (z_change == 0))) * (z_change != 0) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) - if(tz_change == 1) /* if(tz_change && !istype(moveTurf, /turf/simulated/open)) if(tz_change <= -1) From b20daa9f74b1440023f957045ee10018b2189f94 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 3 Apr 2024 12:43:45 +0200 Subject: [PATCH 065/171] colofull litle parantheses --- code/controllers/subsystems/bullets.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 91d12068ba..7076af5d17 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -235,9 +235,9 @@ SUBSYSTEM_DEF(bullets) if(QDELETED(projectile)) bullet_queue -= bullet break - tx_change = ((x_change + (x_change == 0))/abs(x_change + (x_change == 0))) * (x_change != 0) - ty_change = ((y_change + (y_change == 0))/abs(y_change + (y_change == 0))) * (y_change != 0) - tz_change = ((z_change + (z_change == 0))/abs(z_change + (z_change == 0))) * (z_change != 0) + tx_change = ((x_change + (x_change == 0))/(abs(x_change + (x_change == 0)))) * (x_change != 0) + ty_change = ((y_change + (y_change == 0))/(abs(y_change + (y_change == 0)))) * (y_change != 0) + tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) /* if(tz_change && !istype(moveTurf, /turf/simulated/open)) From 1ebf84d8dedf6932309c199160b672dca33f796b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 3 Apr 2024 13:09:21 +0200 Subject: [PATCH 066/171] shitcode begoneus --- .../living/simple_animal/hostile/hostile.dm | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 62923a730a..c5b0cd741a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -207,23 +207,24 @@ var/list/mydirs = list(NORTH, SOUTH, EAST, WEST, SOUTHWEST, NORTHWEST, NORTHEAST DestroySurroundings() AttackTarget() +/// Rewrite of rapid fire to not use spawn() , meant to be temporary till we get a more generalized system coded in +/// But this is SS13 so that probs won't happen soon unless i give enough of a fuck about it SPCR-2024 +/mob/living/simple_animal/hostile/proc/rapidLoop(mob/target,delay, repeatsLeft) + Shoot(target, loc , src) + if(casingtype) + new casingtype(get_turf(src)) + repeatsLeft-- + if(!repeatsLeft) + return + addtimer(CALLBACK(src, PROC_REF(rapidLoop), target, delay, repeatsLeft), delay) + + /mob/living/simple_animal/hostile/proc/OpenFire(target_mob) var/target = target_mob visible_message("\red [src] [fire_verb] at [target]!", 1) if(rapid) - spawn(1) - Shoot(target, loc, src) - if(casingtype) - new casingtype(get_turf(src)) - spawn(4) - Shoot(target, loc, src) - if(casingtype) - new casingtype(get_turf(src)) - spawn(6) - Shoot(target, loc, src) - if(casingtype) - new casingtype(get_turf(src)) + rapidLoop(target, 0.2 SECONDS, 3) else Shoot(target, loc, src) if(casingtype) @@ -231,7 +232,6 @@ var/list/mydirs = list(NORTH, SOUTH, EAST, WEST, SOUTHWEST, NORTHWEST, NORTHEAST stance = HOSTILE_STANCE_IDLE target_mob = null - return /mob/living/simple_animal/hostile/proc/Shoot(var/target, var/start, var/user, var/bullet = 0) if(target == start) From 62fdb9f11b0c66445c1e0d3085a5ad4c6f80785b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 3 Apr 2024 13:11:58 +0200 Subject: [PATCH 067/171] aaaa --- code/modules/mob/living/simple_animal/hostile/hostile.dm | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index c5b0cd741a..fb6f0e20bb 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -209,14 +209,16 @@ var/list/mydirs = list(NORTH, SOUTH, EAST, WEST, SOUTHWEST, NORTHWEST, NORTHEAST /// Rewrite of rapid fire to not use spawn() , meant to be temporary till we get a more generalized system coded in /// But this is SS13 so that probs won't happen soon unless i give enough of a fuck about it SPCR-2024 -/mob/living/simple_animal/hostile/proc/rapidLoop(mob/target,delay, repeatsLeft) - Shoot(target, loc , src) +/mob/living/simple_animal/hostile/proc/rapidLoop(delay, repeatsLeft) + if(QDELETED(src) || QDELETED(target_mob)) + return + Shoot(target_mob, loc , src) if(casingtype) new casingtype(get_turf(src)) repeatsLeft-- if(!repeatsLeft) return - addtimer(CALLBACK(src, PROC_REF(rapidLoop), target, delay, repeatsLeft), delay) + addtimer(CALLBACK(src, PROC_REF(rapidLoop), delay, repeatsLeft), delay) /mob/living/simple_animal/hostile/proc/OpenFire(target_mob) From c6375ef73baf45f6a44fda2a7f9e9648635179d4 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 3 Apr 2024 13:18:32 +0200 Subject: [PATCH 068/171] Update hostile.dm --- code/modules/mob/living/simple_animal/hostile/hostile.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index fb6f0e20bb..bbd75dfdfc 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -238,6 +238,8 @@ var/list/mydirs = list(NORTH, SOUTH, EAST, WEST, SOUTHWEST, NORTHWEST, NORTHEAST /mob/living/simple_animal/hostile/proc/Shoot(var/target, var/start, var/user, var/bullet = 0) if(target == start) return + if(!target) + return var/obj/item/projectile/A = new projectiletype(user:loc) playsound(user, projectilesound, 100, 1) From 7f67816f69948118b789c0defa79f011b43188fa Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 4 Apr 2024 23:41:15 +0200 Subject: [PATCH 069/171] optimizations for dir blocked --- code/__HELPERS/unsorted.dm | 28 +++++----- code/controllers/subsystems/bullets.dm | 74 +++++++++++++++----------- code/game/objects/structures/window.dm | 15 ------ 3 files changed, 58 insertions(+), 59 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index f9421f409c..6b918632bd 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -171,18 +171,22 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/DirBlocked(turf/loc, var/dir) - for(var/obj/structure/window/D in loc) - if(!D.density) continue - if(D.dir == SOUTHWEST) return 1 - if(D.dir == dir) return 1 - - for(var/obj/machinery/door/D in loc) - if(!D.density) continue - if(istype(D, /obj/machinery/door/window)) - if((dir & SOUTH) && (D.dir & (EAST|WEST))) return 1 - if((dir & EAST ) && (D.dir & (NORTH|SOUTH))) return 1 - else return 1 // it's a real, air blocking door - return 0 + for(var/obj/gameObject in loc) + if(!gameObject.density) + continue + if(istype(gameObject, /obj/structure/window)) + if(gameObject.dir == dir || gameObject.dir == SOUTHWEST) + return TRUE + /// bypass rest of the loop fast, no need to cehck the other type.(unless more are added) SPCR-2024 + continue + if(istype(gameObject, /obj/machinery/door)) + if(!istype(gameObject, /obj/machinery/door/window)) + return TRUE + if((dir & SOUTH) && (gameObject.dir & (EAST|WEST))) + return TRUE + if((dir & EAST) && (gameObject.dir & (NORTH|SOUTH))) + return TRUE + return FALSE /proc/TurfBlockedNonWindow(turf/loc) for(var/obj/O in loc) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 7076af5d17..a721c74d0c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -30,6 +30,7 @@ SUBSYSTEM_DEF(bullets) var/ty_change var/tz_change var/turf/moveTurf = null + var/list/relevantAtoms = list() @@ -76,49 +77,52 @@ SUBSYSTEM_DEF(bullets) src.referencedBullet = referencedBullet src.currentTurf = get_turf(referencedBullet) src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, referencedBullet.z) - src.aimedZone = aimedZone - src.firer = firer - src.firedTurf = get_turf(firer) - src.firedPos = list(firer.x , firer.y , firer.z) - src.target = target - src.targetTurf = get_turf(target) src.targetCoords = targetCoords - src.targetPos = list(target.x, target.y , target.z) - //src.targetCoords = list(8,8, targetTurf.z) + src.aimedZone = aimedZone src.pixelsPerTick = pixelsPerTick src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime - if(ismob(firer)) - if(iscarbon(firer)) - if(firer:lying) - src.firedLevel = LEVEL_LYING + src.firedCoordinates = list(0,0, referencedBullet.z) + if(firer) + src.firer = firer + src.firedTurf = get_turf(firer) + src.firedPos = list(firer.x , firer.y , firer.z) + if(ismob(firer)) + if(iscarbon(firer)) + if(firer:lying) + src.firedLevel = LEVEL_LYING + else + src.firedLevel = LEVEL_STANDING else src.firedLevel = LEVEL_STANDING else src.firedLevel = LEVEL_STANDING - else - src.firedLevel = LEVEL_STANDING - if(ismob(target)) - if(iscarbon(target)) - if(target:lying) - src.targetLevel = LEVEL_LYING + if(target) + src.target = target + src.targetTurf = get_turf(target) + src.targetPos = list(target.x, target.y , target.z) + if(ismob(target)) + if(iscarbon(target)) + if(target:lying) + src.targetLevel = LEVEL_LYING + else + src.targetLevel = LEVEL_STANDING else src.targetLevel = LEVEL_STANDING - else + else if(istype(target, /obj/structure/low_wall)) + src.targetLevel = LEVEL_LOWWALL + else if(istype(target, /obj/structure/window)) src.targetLevel = LEVEL_STANDING - else if(istype(target, /obj/structure/low_wall)) - src.targetLevel = LEVEL_LOWWALL - else if(istype(target, /obj/structure/window)) - src.targetLevel = LEVEL_STANDING - else if(istype(target, /obj/structure/table)) - src.targetLevel = LEVEL_TABLE - else if(iswall(target)) - src.targetLevel = LEVEL_STANDING - else if(isturf(target)) - src.targetLevel = LEVEL_TURF - else if(isitem(target)) - src.targetLevel = LEVEL_TURF - src.firedCoordinates = list(0,0, referencedBullet.z) + else if(istype(target, /obj/structure/table)) + src.targetLevel = LEVEL_TABLE + else if(iswall(target)) + src.targetLevel = LEVEL_STANDING + else if(isturf(target)) + src.targetLevel = LEVEL_TURF + else if(isitem(target)) + src.targetLevel = LEVEL_TURF + else + message_admins(("Created bullet without target , [referencedBullet], from [usr]")) src.currentCoords[3] += firedLevel movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset @@ -230,6 +234,7 @@ SUBSYSTEM_DEF(bullets) bulletCoords[3] += (bulletRatios[3] * pixelsThisStep/PPT) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) + z_change = 0 //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) @@ -267,8 +272,13 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet break bullet.updateLevel() + relevantAtoms = list() if(moveTurf) projectile.Move(moveTurf) + for(var/atom/gameObject as anything in moveTurf.contents) + if(isobj(gameObject)) + relevantAtoms.Add(gameObject) + /* bullet.coloreds |= moveTurf moveTurf.color = "#2fff05ee" diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d3212628ff..639d507f07 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -552,21 +552,6 @@ proc/end_grab_onto(mob/living/user, mob/living/target) if(!is_fulltile()) icon_state = "[basestate]" return - /* - var/list/dirs = list() - if(anchored) - for(var/obj/structure/window/W in orange(src,1)) - if(W.anchored && W.density && W.type == src.type && W.is_fulltile()) //Only counts anchored, not-destroyed fill-tile windows. - dirs += get_dir(src, W) - - for(var/turf/simulated/wall/T in RANGE_TURFS(1, src) - src) - var/T_dir = get_dir(src, T) - dirs |= T_dir - if(propagate) - spawn(0) - T.update_connections() - T.update_icon() - */ //Since fulltile windows can't exist without an underlying wall, we will just copy connections from our wall var/list/connections = list("0", "0", "0", "0") var/obj/structure/low_wall/LW = (locate(/obj/structure/low_wall) in loc) From c211be16116bf5c4ee0862363c2bb5cdf2f8b44a Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 7 Apr 2024 15:24:43 +0200 Subject: [PATCH 070/171] a --- cev_eris.dme | 1 + code/__DEFINES/_bullets.dm | 7 ++ code/controllers/subsystems/bullets.dm | 8 -- code/game/machinery/deployable.dm | 82 +------------------ code/game/objects/structures.dm | 57 ++++++++++++- code/game/objects/structures/displaycase.dm | 4 +- code/game/objects/structures/girders.dm | 4 +- code/game/objects/structures/grille.dm | 4 +- code/game/objects/structures/inflatable.dm | 4 +- code/game/objects/structures/low_wall.dm | 46 +---------- code/game/objects/structures/railing.dm | 4 +- code/game/objects/structures/window.dm | 4 +- code/game/turfs/turf.dm | 15 ++-- code/modules/mining/drilling/golem_burrow.dm | 4 +- .../mob/living/carbon/human/human_movement.dm | 17 ---- code/modules/projectiles/projectile.dm | 4 - code/modules/recycling/disposal.dm | 4 +- code/modules/tables/interactions.dm | 46 ----------- code/modules/tables/tables.dm | 4 +- 19 files changed, 91 insertions(+), 228 deletions(-) create mode 100644 code/__DEFINES/_bullets.dm diff --git a/cev_eris.dme b/cev_eris.dme index e56aab4f93..43ce325c2a 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -16,6 +16,7 @@ #include "code\stylesheet.dm" #include "code\world.dm" #include "code\__DEFINES\__atomFlags.dm" +#include "code\__DEFINES\_bullets.dm" #include "code\__DEFINES\_compile_options.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_hydro_setup.dm" diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm new file mode 100644 index 0000000000..8b1ade7189 --- /dev/null +++ b/code/__DEFINES/_bullets.dm @@ -0,0 +1,7 @@ +#define LEVEL_BELOW -1 +#define LEVEL_TURF -0.7 +#define LEVEL_LYING -0.5 +#define LEVEL_LOWWALL 0 +#define LEVEL_TABLE 0.2 +#define LEVEL_STANDING 0.7 +#define LEVEL_ABOVE 1 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index a721c74d0c..e42b6378d3 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,11 +1,3 @@ -#define LEVEL_BELOW -1 -#define LEVEL_TURF -0.7 -#define LEVEL_LYING -0.5 -#define LEVEL_LOWWALL 0 -#define LEVEL_TABLE 0.2 -#define LEVEL_STANDING 0.7 -#define LEVEL_ABOVE 1 - /// Pixels per turf #define PPT 32 #define HPPT (PPT/2) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 79395c8672..36fdb954c2 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -57,7 +57,7 @@ for reference: density = TRUE health = 100 maxHealth = 100 - explosion_coverage = 0.7 + explosionCoverage = 0.7 var/material/material /obj/structure/barricade/New(newloc, material_name) @@ -116,7 +116,7 @@ for reference: /obj/structure/barricade/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= density ? explosion_coverage : explosion_coverage / 2 + . *= density ? explosionCoverage : explosionCoverage / 2 health -= damage if(health <= 0) dismantle() @@ -142,45 +142,6 @@ for reference: else return FALSE -/obj/structure/barricade/proc/check_cover(obj/item/projectile/P, turf/from) - - if(config.z_level_shooting) - if(P.height == HEIGHT_HIGH) - return TRUE // Bullet is too high to hit - P.height = (P.height == HEIGHT_LOW) ? HEIGHT_LOW : HEIGHT_CENTER - - if (get_dist(P.starting, loc) <= 1) //Cover won't help you if people are THIS close - return TRUE - if(get_dist(loc, P.trajectory.target) > 1 ) // Target turf must be adjacent for it to count as cover - return TRUE - var/valid = FALSE - if(!P.def_zone) - return TRUE // Emitters, or anything with no targeted bodypart will always bypass the cover - - var/targetzone = check_zone(P.def_zone) - if (targetzone in list(BP_R_LEG, BP_L_LEG, BP_GROIN)) - valid = TRUE //The lower body is always concealed - if (ismob(P.original)) - var/mob/M = P.original - if (M.lying) - valid = TRUE //Lying down covers your whole body - - // Bullet is low enough to hit the wall - if(config.z_level_shooting && P.height == HEIGHT_LOW) - valid = TRUE - - if(valid) - var/pierce = P.check_penetrate(src) - health -= P.get_structure_damage()/2 - if (health > 0) - visible_message(SPAN_WARNING("[P] hits \the [src]!")) - return pierce - else - visible_message(SPAN_WARNING("[src] breaks down!")) - qdel(src) - return TRUE - return TRUE - //Actual Deployable machinery stuff /obj/machinery/deployable name = "deployable" @@ -314,45 +275,6 @@ for reference: visible_message(SPAN_WARNING("BZZzZZzZZzZT")) return 1 -/obj/machinery/deployable/barrier/proc/check_cover(obj/item/projectile/P, turf/from) - - if(config.z_level_shooting) - if(P.height == HEIGHT_HIGH) - return TRUE // Bullet is too high to hit - P.height = (P.height == HEIGHT_LOW) ? HEIGHT_LOW : HEIGHT_CENTER - - if (get_dist(P.starting, loc) <= 1) //Cover won't help you if people are THIS close - return 1 - if(get_dist(loc, P.trajectory.target) > 1 ) // Target turf must be adjacent for it to count as cover - return TRUE - var/valid = FALSE - if(!P.def_zone) - return 1 // Emitters, or anything with no targeted bodypart will always bypass the cover - - var/targetzone = check_zone(P.def_zone) - if (targetzone in list(BP_R_LEG, BP_L_LEG, BP_GROIN)) - valid = TRUE //The lower body is always concealed - if (ismob(P.original)) - var/mob/M = P.original - if (M.lying) - valid = TRUE //Lying down covers your whole body - - // Bullet is low enough to hit the wall - if(config.z_level_shooting && P.height == HEIGHT_LOW) - valid = TRUE - - if(valid) - var/pierce = P.check_penetrate(src) - health -= P.get_structure_damage()/2 - if (health > 0) - visible_message(SPAN_WARNING("[P] hits \the [src]!")) - return pierce - else - visible_message(SPAN_WARNING("[src] breaks down!")) - qdel(src) - return 1 - return 1 - /obj/machinery/deployable/barrier/take_damage(damage) health -= damage if(health <= 0) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 19953e50a6..7413b2e203 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -1,3 +1,24 @@ +/** + * Global list for storing the blocking levels for all structures + * format is list(type = number) or list(type = list(list(minimum,maximum), list(minimum,maximum))) + * if its not meant to be continous + */ +GLOBAL_LIST_INIT(structureBlockingLevels, list( \ + /obj/structure = LEVEL_TURF, \ + /obj/structure/barricade = LEVEL_LOWWALL, \ + /obj/structure/low_wall = LEVEL_LOWWALL, \ + /obj/structure/table = list(list(LEVEL_LOWWALL, LEVEL_TABLE)), \ + /// One day i will get around to turning every machinery into a structure. SPCR - 2024 + /obj/machinery/deployable/barrier = LEVEL_TABLE \ + ) \ +) + +/** + * Any projectile under this height will be blocked by this structure. Can be a list if its not meant to be continous + * List format is list(list(minimum, maximum), list(minimum, maximum)) + * Normal format is just the number. + * Blocking lists are stored in the global list structureBlockingLevels. + */ /obj/structure icon = 'icons/obj/structures.dmi' volumeClass = ITEM_SIZE_GARGANTUAN @@ -7,7 +28,7 @@ bad_type = /obj/structure var/health = 100 var/maxHealth = 100 - var/explosion_coverage = 0 + var/explosionCoverage = 0 var/climbable var/breakable var/parts @@ -23,13 +44,43 @@ /obj/structure/proc/take_damage(damage) // Blocked amount . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage health -= damage if(health < 0) qdel(src) return - +/obj/structure/proc/check_cover(obj/item/projectile/P, turf/from) + var/bulletHeight = P.dataRef.currentCoords[3] + var/checkingType = type + var/willBlock = FALSE + while(checkingType) + if(structureBlockingLevels[checkingType]) + break + checkingType = parent_type + // we break when at the very base + if(checkingType == /obj/structure) + break + message_admins("Using blocking datum from structureBlockingLevels[checkingType]") + if(islist(structureBlockingLevels[checkingType])) + for(var/list/coveredSection in structureBlockingLevels[checkingType]) + if(bulletHeight > coveredSection[2]) + continue + if(bulletHeight < coveredSection[1]) + continue + willBlock = TRUE + break + else + willBlock = bulletHeight < structureBlockingLevels[checkingType] + + if(willBlock) + willBlock = P.check_penetrate(src) + take_damage(P.get_structure_damage()) + if (!QDELETED(src)) + visible_message(SPAN_WARNING("[P] hits \the [src]!")) + else + visible_message(SPAN_WARNING("[src] breaks down!")) + return willBlock /** * An overridable proc used by SSfalling to determine whether if the object deals diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 8ff64146e5..47e9ebfdc7 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE unacidable = 1//Dissolving the case would also delete the gun. - explosion_coverage = 0.8 + explosionCoverage = 0.8 health = 60 maxHealth = 60 var/occupied = 1 @@ -23,7 +23,7 @@ /obj/structure/displaycase/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage health -= damage if (health <= 0) if (!(destroyed )) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 80b750bfc8..1e29e06269 100755 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -8,7 +8,7 @@ var/state = 0 var/cover = 50 //how much cover the girder provides against projectiles. // Not a lot of explosion blocking but still there. - explosion_coverage = 0.4 + explosionCoverage = 0.4 var/material/reinf_material var/reinforcing = 0 var/resistance = RESISTANCE_TOUGH @@ -304,7 +304,7 @@ if (!damage || damage <= 0) return . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage health -= damage if (health <= 0) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index fe8b27ea96..8734f251b9 100755 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -8,7 +8,7 @@ flags = CONDUCT layer = BELOW_OBJ_LAYER // Blocks very little , since its just metal rods.. - explosion_coverage = 0.2 + explosionCoverage = 0.2 health = 50 var/destroyed = 0 @@ -158,7 +158,7 @@ /obj/structure/grille/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage if(health <= 0) if(!destroyed) density = FALSE diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 16cab1f9ec..4fee638eb8 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -41,7 +41,7 @@ var/undeploy_path = null health = 30 - explosion_coverage = 1 + explosionCoverage = 1 /obj/structure/inflatable/wall name = "inflatable wall" @@ -57,7 +57,7 @@ /obj/structure/inflatable/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage if(health < 0) deflate(TRUE) playsound(loc, 'sound/effects/Glasshit.ogg', 75, 1) diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index c52e7f15db..567e04fe0f 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -39,7 +39,7 @@ maxHealth = 450 health = 450 // Anything above is far too blocking. - explosion_coverage = 0.2 + explosionCoverage = 0.2 var/hitsound = 'sound/weapons/Genhit.ogg' climbable = TRUE @@ -162,48 +162,6 @@ return ..() - -//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops. -/obj/structure/low_wall/proc/check_cover(obj/item/projectile/P, turf/from) - - if(config.z_level_shooting) - if(P.height == HEIGHT_HIGH) - return TRUE // Bullet is too high to hit - P.height = (P.height == HEIGHT_LOW) ? HEIGHT_LOW : HEIGHT_CENTER - - if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close - return 1 - if(get_dist(loc, P.trajectory.target) > 1 ) // Target turf must be adjacent for it to count as cover - return TRUE - var/valid = FALSE - - if(!P.def_zone) - return 1 // Emitters, or anything with no targeted bodypart will always bypass the cover - var/targetzone = check_zone(P.def_zone) - if (targetzone in list(BP_R_LEG, BP_L_LEG, BP_GROIN)) - valid = TRUE //The lower body is always concealed - if (ismob(P.original)) - var/mob/M = P.original - if (M.lying) - valid = TRUE //Lying down covers your whole body - - // Bullet is low enough to hit the wall - if(config.z_level_shooting && P.height == HEIGHT_LOW) - valid = TRUE - - if(valid) - var/pierce = P.check_penetrate(src) - take_damage(P.get_structure_damage()/2) - if (health > 0) - visible_message(SPAN_WARNING("[P] hits \the [src]!")) - return pierce - else - visible_message(SPAN_WARNING("[src] breaks down!")) - qdel(src) - return 1 - return 1 - - //Icon procs.mostly copied from tables /obj/structure/low_wall/update_icon() overlays.Cut() @@ -496,7 +454,7 @@ /obj/structure/low_wall/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage if(locate(/obj/effect/overlay/wallrot) in src) damage *= 10 health -= damage diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 9c51372024..169547ce5a 100755 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -15,7 +15,7 @@ var/broken = 0 health=70 maxHealth=70 - explosion_coverage = 0 + explosionCoverage = 0 var/check = 0 var/reinforced = FALSE var/reinforcement_security = 0 // extra health from being reinforced, hardcoded to 40 on add @@ -87,7 +87,7 @@ /obj/structure/railing/take_damage(amount) . = health - amount < 0 ? amount - health : amount - . *= explosion_coverage + . *= explosionCoverage if (reinforced) if (reinforcement_security == 0) visible_message(SPAN_WARNING("[src]'s reinforcing rods fall off!")) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 639d507f07..e15f393b5b 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -9,7 +9,7 @@ flags = ON_BORDER maxHealth = 20 health = 20 - explosion_coverage = 1 + explosionCoverage = 1 var/resistance = RESISTANCE_FLIMSY //Incoming damage is reduced by this flat amount before being subtracted from health. Defines found in code\__defines\weapons.dm var/maximal_heat = T0C + 100 // Maximal heat before this window begins taking damage from fire var/damage_per_fire_tick = 2 // Amount of damage per fire tick. Regular windows are not fireproof so they might as well break quickly. @@ -67,7 +67,7 @@ /obj/structure/window/take_damage(damage = 0) var/initialhealth = health . = health - (damage * (1 - silicate / 200) - resistance) < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage damage = damage * (1 - silicate / 200) // up to 50% damage resistance damage -= resistance // then flat resistance from material diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 92f61a66f8..3779b1e1d9 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -92,33 +92,32 @@ ..() if (!mover || !isturf(mover.loc) || isobserver(mover)) - return 1 - + return TRUE //First, check objects to block exit that are not on the border for(var/obj/obstacle in mover.loc) if(!(obstacle.flags & ON_BORDER) && (mover != obstacle) && (forget != obstacle)) if(!obstacle.CheckExit(mover, src)) mover.Bump(obstacle, 1) - return 0 + return FALSE //Now, check objects to block exit that are on the border for(var/obj/border_obstacle in mover.loc) if((border_obstacle.flags & ON_BORDER) && (mover != border_obstacle) && (forget != border_obstacle)) if(!border_obstacle.CheckExit(mover, src)) mover.Bump(border_obstacle, 1) - return 0 + return FALSE //Next, check objects to block entry that are on the border for(var/obj/border_obstacle in src) if(border_obstacle.flags & ON_BORDER) if(!border_obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != border_obstacle)) mover.Bump(border_obstacle, 1) - return 0 + return FALSE //Then, check the turf itself if (!src.CanPass(mover, src)) mover.Bump(src, 1) - return 0 + return FALSE //Finally, check objects/mobs to block entry that are not on the border for(var/atom/movable/obstacle in src) @@ -126,7 +125,7 @@ if(!obstacle.CanPass(mover, mover.loc, 1, 0) && (forget != obstacle)) mover.Bump(obstacle, 1) return 0 - return 1 //Nothing found to block so return success! + return TRUE //Nothing found to block so return success! var/const/enterloopsanity = 100 /turf/Entered(atom/atom as mob|obj) @@ -146,7 +145,7 @@ var/const/enterloopsanity = 100 A.HasProximity(thing, 1) if ((thing && A) && (thing.flags & PROXMOVE)) thing.HasProximity(A, 1) - return + /turf/proc/adjacent_fire_act(turf/simulated/floor/source, temperature, volume) return diff --git a/code/modules/mining/drilling/golem_burrow.dm b/code/modules/mining/drilling/golem_burrow.dm index 6435ce2c71..3c1d72e120 100644 --- a/code/modules/mining/drilling/golem_burrow.dm +++ b/code/modules/mining/drilling/golem_burrow.dm @@ -8,7 +8,7 @@ maxHealth = 50 health = 50 - explosion_coverage = 0.3 + explosionCoverage = 0.3 var/datum/golem_controller/controller /obj/structure/golem_burrow/New(loc, parent) @@ -48,7 +48,7 @@ /obj/structure/golem_burrow/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage health = min(max(health - damage, 0), maxHealth) if(health == 0) qdel(src) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 84ba83eee7..48fb6a8a1c 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -41,23 +41,6 @@ if(blocking) tally += 1 - if(recoil) - var/obj/item/gun/GA = get_active_hand() - var/obj/item/gun/GI = get_inactive_hand() - - var/brace_recoil = 0 - if(istype(GA)) - var/datum/recoil/R = GA.recoil - brace_recoil = R.getRating(RECOIL_TWOHAND) - if(istype(GI)) - var/datum/recoil/R = GI.recoil - brace_recoil = max(brace_recoil, R.getRating(RECOIL_TWOHAND)) - - if(brace_recoil) - tally += CLAMP(round(recoil) / (60 / brace_recoil), 0, 8) // Scales with the size of the gun - bigger guns slow you more - else - tally += CLAMP(round(recoil) / 20, 0, 8) // Lowest possible while holding a gun - var/obj/item/implant/core_implant/cruciform/C = get_core_implant(/obj/item/implant/core_implant/cruciform) if(C && C.active) var/obj/item/cruciform_upgrade/upgrade = C.upgrade diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f08ff03c41..068fef5580 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -522,10 +522,6 @@ GLOBAL_LIST(projectileDamageConstants) else passthrough = (A.bullet_act(src, def_zone) == PROJECTILE_CONTINUE) //backwards compatibility if(isturf(A)) - if(QDELETED(src)) // we don't want bombs to explode once for every time bullet_act is called - on_impact(A) - invisibility = 101 - return TRUE // see that next line? it can overload the server. for(var/obj/O in A) // if src's bullet act spawns more objs, the list will increase, if(O.density) O.bullet_act(src) // causing exponential growth due to the spawned obj spawning itself diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 2663c72589..e7c6d7bf77 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -660,7 +660,7 @@ var/pipe_dir = 0 // bitmask of pipe directions dir = 0 // dir will contain dominant direction for junction pipes health = 10 // health points 0-10 - explosion_coverage = 0 + explosionCoverage = 0 layer = 2.3 // slightly lower than wires and other pipes var/base_icon_state // initial icon state on map var/sortType = list() @@ -836,7 +836,7 @@ // test health for brokenness /obj/structure/disposalpipe/take_damage(damage) . = health - damage < 0 ? damage - (damage - health) : damage - . *= explosion_coverage + . *= explosionCoverage health -= damage if(health <= 0) broken(FALSE) diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index a79f32bafc..163c036d7d 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -19,52 +19,6 @@ return 1 return 0 -//checks if projectile 'P' from turf 'from' can hit whatever is behind the table. Returns 1 if it can, 0 if bullet stops. -/obj/structure/table/proc/check_cover(obj/item/projectile/P, turf/from) - - if(config.z_level_shooting) - if(P.height == HEIGHT_HIGH) - return TRUE // Bullet is too high to hit - P.height = (P.height == HEIGHT_LOW) ? HEIGHT_LOW : HEIGHT_CENTER - - if (get_dist(P.starting, loc) <= 1) //Tables won't help you if people are THIS close - return TRUE - if(get_dist(loc, P.trajectory.target) > 1 ) // Target turf must be adjacent for it to count as cover - return TRUE - var/valid = FALSE - if(!P.def_zone) - return TRUE // Emitters, or anything with no targeted bodypart will always bypass the cover - - var/targetzone = check_zone(P.def_zone) - if (targetzone in list(BP_R_LEG, BP_L_LEG)) - valid = TRUE //The legs are always concealed - if (ismob(P.original)) - var/mob/M = P.original - if (M.lying) - valid = TRUE //Lying down covers your whole body - if(flipped==1) - if(get_dir(loc, from) == dir) //Flipped tables catch mroe bullets - if (targetzone == BP_GROIN) - valid = TRUE - else - valid = FALSE //But only from one side - - // Bullet is low enough to hit the table - if(config.z_level_shooting && P.height == HEIGHT_LOW) - valid = TRUE - - if(valid) - var/pierce = P.check_penetrate(src) - health -= P.get_structure_damage()/2 - if (health > 0) - visible_message(SPAN_WARNING("[P] hits \the [src]!")) - return pierce - else - visible_message(SPAN_WARNING("[src] breaks down!")) - break_to_parts() - return TRUE - return TRUE - /obj/structure/table/CheckExit(atom/movable/O as mob|obj, target as turf) if(istype(O) && O.checkpass(PASSTABLE)) return 1 diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index b665250ff2..cfcd57932f 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -25,7 +25,7 @@ var/list/custom_table_appearance = list( var/flipped = 0 maxHealth = 10 health = 10 - explosion_coverage = 0.1 + explosionCoverage = 0.1 // For racks. var/can_reinforce = 1 @@ -76,7 +76,7 @@ var/list/custom_table_appearance = list( else amount *= TABLE_BRITTLE_MATERIAL_MULTIPLIER . = health - amount < 0 ? amount - health : initialdamage - . *= explosion_coverage + . *= explosionCoverage health -= amount if(health <= 0) visible_message(SPAN_WARNING("\The [src] breaks down!")) From c00ee24fad2fa3075b6a30484a4c775e9d836b49 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 7 Apr 2024 15:27:54 +0200 Subject: [PATCH 071/171] Update deployable.dm --- code/game/machinery/deployable.dm | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 36fdb954c2..ebb9111c53 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -239,6 +239,38 @@ for reference: if(H.checkpass(PASSTABLE) && H.stats?.getPerk(PERK_PARKOUR)) return TRUE +/obj/machinery/deployable/barrier/proc/check_cover(obj/item/projectile/P, turf/from) + var/bulletHeight = P.dataRef.currentCoords[3] + var/checkingType = type + var/willBlock = FALSE + while(checkingType) + if(structureBlockingLevels[checkingType]) + break + checkingType = parent_type + // we break when at the very base + if(checkingType == /obj/structure) + break + message_admins("Using blocking datum from structureBlockingLevels[checkingType]") + if(islist(structureBlockingLevels[checkingType])) + for(var/list/coveredSection in structureBlockingLevels[checkingType]) + if(bulletHeight > coveredSection[2]) + continue + if(bulletHeight < coveredSection[1]) + continue + willBlock = TRUE + break + else + willBlock = bulletHeight < structureBlockingLevels[checkingType] + + if(willBlock) + willBlock = P.check_penetrate(src) + take_damage(P.get_structure_damage()) + if (!QDELETED(src)) + visible_message(SPAN_WARNING("[P] hits \the [src]!")) + else + visible_message(SPAN_WARNING("[src] breaks down!")) + return willBlock + /obj/machinery/deployable/barrier/proc/explode() visible_message(SPAN_DANGER("[src] blows apart!")) From 147c764fb0be43fb25bbab33e930746d976e4d03 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 7 Apr 2024 15:51:25 +0200 Subject: [PATCH 072/171] mj --- code/game/machinery/deployable.dm | 10 ++++----- code/game/objects/structures.dm | 34 ++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index ebb9111c53..c80702b99c 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -244,15 +244,15 @@ for reference: var/checkingType = type var/willBlock = FALSE while(checkingType) - if(structureBlockingLevels[checkingType]) + if(GLOB.structureBlockingLevels[checkingType]) break checkingType = parent_type // we break when at the very base if(checkingType == /obj/structure) break - message_admins("Using blocking datum from structureBlockingLevels[checkingType]") - if(islist(structureBlockingLevels[checkingType])) - for(var/list/coveredSection in structureBlockingLevels[checkingType]) + message_admins("Using blocking datum from GLOB.structureBlockingLevels[checkingType]") + if(islist(GLOB.structureBlockingLevels[checkingType])) + for(var/list/coveredSection in GLOB.structureBlockingLevels[checkingType]) if(bulletHeight > coveredSection[2]) continue if(bulletHeight < coveredSection[1]) @@ -260,7 +260,7 @@ for reference: willBlock = TRUE break else - willBlock = bulletHeight < structureBlockingLevels[checkingType] + willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] if(willBlock) willBlock = P.check_penetrate(src) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 7413b2e203..fbbba1234b 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -3,13 +3,23 @@ * format is list(type = number) or list(type = list(list(minimum,maximum), list(minimum,maximum))) * if its not meant to be continous */ -GLOBAL_LIST_INIT(structureBlockingLevels, list( \ - /obj/structure = LEVEL_TURF, \ - /obj/structure/barricade = LEVEL_LOWWALL, \ - /obj/structure/low_wall = LEVEL_LOWWALL, \ - /obj/structure/table = list(list(LEVEL_LOWWALL, LEVEL_TABLE)), \ +/* +#define LEVEL_BELOW -1 +#define LEVEL_TURF -0.7 +#define LEVEL_LYING -0.5 +#define LEVEL_LOWWALL 0 +#define LEVEL_TABLE 0.2 +#define LEVEL_STANDING 0.7 +#define LEVEL_ABOVE 1 +*/ +/// Byond doesn't like if you try to put defines inside... so just use the numbers. check the latest values at _bullet.dm in _DEFINES folder. SPCR 2024 +GLOBAL_LIST_INIT(structureBlockingLevels, list(\ + /obj/structure = -0.7,\ + /obj/structure/barricade = 0,\ + /obj/structure/low_wall = 0,\ + /obj/structure/table = list(list(0, 0.2)),\ /// One day i will get around to turning every machinery into a structure. SPCR - 2024 - /obj/machinery/deployable/barrier = LEVEL_TABLE \ + /obj/machinery/deployable/barrier = 0.2,\ ) \ ) @@ -17,7 +27,7 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list( \ * Any projectile under this height will be blocked by this structure. Can be a list if its not meant to be continous * List format is list(list(minimum, maximum), list(minimum, maximum)) * Normal format is just the number. - * Blocking lists are stored in the global list structureBlockingLevels. + * Blocking lists are stored in the global list GLOB.structureBlockingLevels. */ /obj/structure icon = 'icons/obj/structures.dmi' @@ -55,15 +65,15 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list( \ var/checkingType = type var/willBlock = FALSE while(checkingType) - if(structureBlockingLevels[checkingType]) + if(GLOB.structureBlockingLevels[checkingType]) break checkingType = parent_type // we break when at the very base if(checkingType == /obj/structure) break - message_admins("Using blocking datum from structureBlockingLevels[checkingType]") - if(islist(structureBlockingLevels[checkingType])) - for(var/list/coveredSection in structureBlockingLevels[checkingType]) + message_admins("Using blocking datum from GLOB.structureBlockingLevels[checkingType]") + if(islist(GLOB.structureBlockingLevels[checkingType])) + for(var/list/coveredSection in GLOB.structureBlockingLevels[checkingType]) if(bulletHeight > coveredSection[2]) continue if(bulletHeight < coveredSection[1]) @@ -71,7 +81,7 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list( \ willBlock = TRUE break else - willBlock = bulletHeight < structureBlockingLevels[checkingType] + willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] if(willBlock) willBlock = P.check_penetrate(src) From 870e55f33e2f077a624cd62879d1a68b860d268f Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 7 Apr 2024 16:29:22 +0200 Subject: [PATCH 073/171] j --- code/controllers/subsystems/bullets.dm | 9 ++++++--- code/game/machinery/deployable.dm | 2 +- code/game/objects/structures.dm | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index e42b6378d3..c95379bfcf 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -115,7 +115,10 @@ SUBSYSTEM_DEF(bullets) src.targetLevel = LEVEL_TURF else message_admins(("Created bullet without target , [referencedBullet], from [usr]")) - src.currentCoords[3] += firedLevel + + message_admins("level set to [firedLevel], towards [targetLevel]") + currentCoords[3] = firedLevel + movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel)/(distStartToFinish()) movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -226,7 +229,7 @@ SUBSYSTEM_DEF(bullets) bulletCoords[3] += (bulletRatios[3] * pixelsThisStep/PPT) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) - z_change = 0 + z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) @@ -256,7 +259,7 @@ SUBSYSTEM_DEF(bullets) bullet.lastChanges[3] += tz_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change - bulletCoords[3] -= tz_change * 1.99 + bulletCoords[3] -= tz_change projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.lifetime-- diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index c80702b99c..85300e19f6 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -260,7 +260,7 @@ for reference: willBlock = TRUE break else - willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] + willBlock = bulletHeight > GLOB.structureBlockingLevels[checkingType] if(willBlock) willBlock = P.check_penetrate(src) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index fbbba1234b..1d6e6dbdb3 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list(\ willBlock = TRUE break else - willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] + willBlock = bulletHeight > GLOB.structureBlockingLevels[checkingType] if(willBlock) willBlock = P.check_penetrate(src) From c38ab2df91df7e1046cafb405d64e8245c3b65aa Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 7 Apr 2024 23:46:27 +0200 Subject: [PATCH 074/171] fix --- code/game/objects/structures.dm | 17 +++++++++-------- code/game/objects/structures/low_wall.dm | 2 +- code/modules/tables/interactions.dm | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1d6e6dbdb3..d7e13c99a9 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -71,19 +71,20 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list(\ // we break when at the very base if(checkingType == /obj/structure) break - message_admins("Using blocking datum from GLOB.structureBlockingLevels[checkingType]") + message_admins("Using blocking datum from GLOB.structureBlockingLevels[checkingType] , bulletLevel at [bulletHeight]") if(islist(GLOB.structureBlockingLevels[checkingType])) + message_admins("Going for lists") for(var/list/coveredSection in GLOB.structureBlockingLevels[checkingType]) - if(bulletHeight > coveredSection[2]) - continue - if(bulletHeight < coveredSection[1]) - continue - willBlock = TRUE - break + message_admins("Checking using list , [coveredSection[1]], [coveredSection[2]]") + if(bulletHeight < coveredSection[2] && bulletHeight > coveredSection[1]) + willBlock = TRUE + break else - willBlock = bulletHeight > GLOB.structureBlockingLevels[checkingType] + message_admins("Going for single value") + willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] if(willBlock) + message_admins("Checking penetrate") willBlock = P.check_penetrate(src) take_damage(P.get_structure_damage()) if (!QDELETED(src)) diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index 567e04fe0f..b15743509f 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -111,7 +111,7 @@ /obj/structure/low_wall/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(istype(mover,/obj/item/projectile)) - return (check_cover(mover,target)) + return !(check_cover(mover,target)) //Its debateable whether its correct to use layer in a logic check like this. diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index 163c036d7d..e74a72dd28 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -7,7 +7,7 @@ return 1 if(air_group || (height==0)) return 1 if(istype(mover,/obj/item/projectile)) - return (check_cover(mover,target)) + return !(check_cover(mover,target)) if (flipped == 1) if (get_dir(loc, target) == dir) return !density From 29af8365e36f77588c3d827eae0d57c349326bb3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 7 Apr 2024 23:50:52 +0200 Subject: [PATCH 075/171] Update structures.dm --- code/game/objects/structures.dm | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index d7e13c99a9..50041bc1cf 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -14,7 +14,7 @@ */ /// Byond doesn't like if you try to put defines inside... so just use the numbers. check the latest values at _bullet.dm in _DEFINES folder. SPCR 2024 GLOBAL_LIST_INIT(structureBlockingLevels, list(\ - /obj/structure = -0.7,\ + /obj/structure = 1,\ /obj/structure/barricade = 0,\ /obj/structure/low_wall = 0,\ /obj/structure/table = list(list(0, 0.2)),\ @@ -71,20 +71,15 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list(\ // we break when at the very base if(checkingType == /obj/structure) break - message_admins("Using blocking datum from GLOB.structureBlockingLevels[checkingType] , bulletLevel at [bulletHeight]") if(islist(GLOB.structureBlockingLevels[checkingType])) - message_admins("Going for lists") for(var/list/coveredSection in GLOB.structureBlockingLevels[checkingType]) - message_admins("Checking using list , [coveredSection[1]], [coveredSection[2]]") if(bulletHeight < coveredSection[2] && bulletHeight > coveredSection[1]) willBlock = TRUE break else - message_admins("Going for single value") willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] if(willBlock) - message_admins("Checking penetrate") willBlock = P.check_penetrate(src) take_damage(P.get_structure_damage()) if (!QDELETED(src)) From f82e002c9a3857a92d5c2b0baaabadcd844aa5d1 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 9 Apr 2024 20:42:40 +0200 Subject: [PATCH 076/171] a --- code/controllers/subsystems/bullets.dm | 18 ++---------------- code/game/objects/structures.dm | 1 + code/game/turfs/simulated/walls.dm | 14 ++++++-------- code/modules/projectiles/projectile.dm | 12 ++++++++++++ 4 files changed, 21 insertions(+), 24 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index c95379bfcf..fd9dde3e66 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -144,6 +144,8 @@ SUBSYSTEM_DEF(bullets) var/matrix/rotation = matrix() movementRatios[1] = sin(movementRatios[4]) movementRatios[2] = cos(movementRatios[4]) + + rotation.Turn(movementRatios[4] + 180) referencedBullet.transform = rotation @@ -239,18 +241,6 @@ SUBSYSTEM_DEF(bullets) ty_change = ((y_change + (y_change == 0))/(abs(y_change + (y_change == 0)))) * (y_change != 0) tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) - /* - if(tz_change && !istype(moveTurf, /turf/simulated/open)) - if(tz_change <= -1) - if(moveTurf.bullet_act(projectile) == PROJECTILE_CONTINUE) - moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) - else - projectile.onBlockingHit(moveTurf) - else - moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) - if(moveTurf.bullet_act(projectile) != PROJECTILE_CONTINUE) - projectile.onBlockingHit(moveTurf) - */ x_change -= tx_change y_change -= ty_change z_change -= tz_change @@ -267,12 +257,8 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet break bullet.updateLevel() - relevantAtoms = list() if(moveTurf) projectile.Move(moveTurf) - for(var/atom/gameObject as anything in moveTurf.contents) - if(isobj(gameObject)) - relevantAtoms.Add(gameObject) /* bullet.coloreds |= moveTurf diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 50041bc1cf..1d88a4a4e2 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -64,6 +64,7 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list(\ var/bulletHeight = P.dataRef.currentCoords[3] var/checkingType = type var/willBlock = FALSE + message_admins("bullet height at [bulletHeight]") while(checkingType) if(GLOB.structureBlockingLevels[checkingType]) break diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 4ae31f7421..60adc5157d 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -126,30 +126,28 @@ var/list/lastMoves = hittingProjectile.dataRef.lastChanges var/angle = hittingProjectile.dataRef.movementRatios[4] var/ricochet = FALSE - message_admins("Bullet hit wall at [angle]") switch(angle) if(-180 to -155) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - hittingProjectile.dataRef.bounce(1) + hittingProjectile.dataRef.bounce(1, rand(-5,5)) ricochet = TRUE if(-115 to -65) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - hittingProjectile.dataRef.bounce(2) + hittingProjectile.dataRef.bounce(2, rand(-5,5)) ricochet = TRUE if(-25 to 25) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - hittingProjectile.dataRef.bounce(1) + hittingProjectile.dataRef.bounce(1, rand(-5,5)) ricochet = TRUE if(65 to 115) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - hittingProjectile.dataRef.bounce(2) + hittingProjectile.dataRef.bounce(2, rand(-5,5)) ricochet = TRUE if(155 to 180) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - hittingProjectile.dataRef.bounce(1) + hittingProjectile.dataRef.bounce(1, rand(-5,5)) ricochet = TRUE if(ricochet) - message_admins("Ricochet!") take_damage(round(projectileDamage * 0.33)) return PROJECTILE_CONTINUE @@ -297,7 +295,7 @@ O.anchored = TRUE O.density = TRUE O.layer = 5 - + thermite = FALSE take_damage((material.integrity*2.5) / material.heat_resistance) // thermite overkills steel immediately but not plasteel diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 068fef5580..8a1017bb3d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -554,6 +554,18 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) density = FALSE + + SSbullets.bullet_queue.Remove(dataRef) + var/list/relevantVars = list(pixel_x, pixel_y) + // no point in using timers for this. + spawn(1) + animate(src, 1, pixel_x = -relevantVars[1], pixel_y = -relevantVars[2]) + spawn(1) + finishDeletion() + + +/// Called to properly delete a bullet after a delay from its impact, ensures the animation for it travelling finishes +/obj/item/projectile/proc/finishDeletion() invisibility = 101 qdel(src) From 94cbcf618832d992a4f290d21138c3c0415481a4 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 12 Apr 2024 20:19:36 +0200 Subject: [PATCH 077/171] improved but still not good --- code/controllers/subsystems/bullets.dm | 28 +++++++++++++++++++------- code/modules/projectiles/projectile.dm | 11 ++-------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index fd9dde3e66..7b8b0dde74 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -23,6 +23,8 @@ SUBSYSTEM_DEF(bullets) var/tz_change var/turf/moveTurf = null var/list/relevantAtoms = list() + // 1 client tick by default , can be increased by impacts + var/bulletWait = 1 @@ -55,6 +57,8 @@ SUBSYSTEM_DEF(bullets) var/lastChanges = list(0,0,0) /// Used to determine wheter a projectile should be allowed to bump a turf or not. var/isTraversingLevel = FALSE + /// Used to animate the ending pixels + var/hasImpacted = FALSE /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick, angleOffset, lifetime) /* @@ -165,7 +169,6 @@ SUBSYSTEM_DEF(bullets) var/py = targetCoords[2] - firedCoordinates[2] return sqrt(x**2 + y**2) + sqrt(px**2 + py**2) - /datum/bullet_data/proc/updateLevel() switch(currentCoords[3]) if(-INFINITY to LEVEL_BELOW) @@ -223,6 +226,7 @@ SUBSYSTEM_DEF(bullets) /// but less performant A more performant version would be to use the same algorithm as throwing for determining which turfs to "intersect" /// Im using this implementation because im getting skill issued trying to implement the same one as throwing(i had to rewrite this 4 times already) /// and also because it has.. much more information about the general trajectory stored SPCR - 2024 + var/double = 1 while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep @@ -259,15 +263,25 @@ SUBSYSTEM_DEF(bullets) bullet.updateLevel() if(moveTurf) projectile.Move(moveTurf) - - /* - bullet.coloreds |= moveTurf - moveTurf.color = "#2fff05ee" - */ + if(projectile.loc != moveTurf && bullet.hasImpacted) + double = 2 + bullet.hasImpacted = FALSE + pixelsToTravel = 0 + x_change = 0 + y_change = 0 + projectile.loc = moveTurf + break + // one more turf for us + /* + if(bullet.hasImpacted && bullet in bullet_queue) + pixelsToTravel += 48 + bullet.hasImpacted = FALSE + bullet_queue.Remove(bullet) + */ moveTurf = null bullet.updateLevel() - animate(projectile, 1, pixel_x =(abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1, pixel_y = (abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1, flags = ANIMATION_END_NOW) + animate(projectile, 1, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1) * double, pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1)*double, flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords /* diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8a1017bb3d..9f7a4e0927 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -554,15 +554,8 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) density = FALSE - - SSbullets.bullet_queue.Remove(dataRef) - var/list/relevantVars = list(pixel_x, pixel_y) - // no point in using timers for this. - spawn(1) - animate(src, 1, pixel_x = -relevantVars[1], pixel_y = -relevantVars[2]) - spawn(1) - finishDeletion() - + dataRef.hasImpacted = TRUE + QDEL_IN_CLIENT_TIME(src, 3) /// Called to properly delete a bullet after a delay from its impact, ensures the animation for it travelling finishes /obj/item/projectile/proc/finishDeletion() From 5cc542d359f389e78a4c35a62795160fa7925faa Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 2 May 2024 23:24:08 +0200 Subject: [PATCH 078/171] a --- code/controllers/subsystems/bullets.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 7b8b0dde74..47b91a75bd 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -264,7 +264,7 @@ SUBSYSTEM_DEF(bullets) if(moveTurf) projectile.Move(moveTurf) if(projectile.loc != moveTurf && bullet.hasImpacted) - double = 2 + double = 2.5 bullet.hasImpacted = FALSE pixelsToTravel = 0 x_change = 0 From 6e4aec86c8d6be1fa5993506f96d783917f84fa1 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 May 2024 00:55:37 +0200 Subject: [PATCH 079/171] aaaah --- code/__DEFINES/__atomFlags.dm | 2 ++ code/controllers/subsystems/bullets.dm | 21 ++++------- code/game/turfs/simulated/walls.dm | 1 + code/game/turfs/turf.dm | 2 ++ code/modules/projectiles/projectile.dm | 49 +++----------------------- 5 files changed, 16 insertions(+), 59 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index d88215cb30..8685a84a81 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -4,3 +4,5 @@ #define AF_LAYER_UPDATE_HANDLED 1<<2 /// This atom's plane shouldn't adjust itself #define AF_PLANE_UPDATE_HANDLED 1<<3 +/// This atom should be able to always move however it wants with no restrictions(used for bullets after they hit.) +#define AF_FREE_MOVE 1<<4 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 47b91a75bd..1c98f18d08 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -226,7 +226,6 @@ SUBSYSTEM_DEF(bullets) /// but less performant A more performant version would be to use the same algorithm as throwing for determining which turfs to "intersect" /// Im using this implementation because im getting skill issued trying to implement the same one as throwing(i had to rewrite this 4 times already) /// and also because it has.. much more information about the general trajectory stored SPCR - 2024 - var/double = 1 while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep @@ -256,21 +255,9 @@ SUBSYSTEM_DEF(bullets) bulletCoords[3] -= tz_change projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change - bullet.lifetime-- - if(bullet.lifetime < 0) - bullet_queue -= bullet - break bullet.updateLevel() if(moveTurf) projectile.Move(moveTurf) - if(projectile.loc != moveTurf && bullet.hasImpacted) - double = 2.5 - bullet.hasImpacted = FALSE - pixelsToTravel = 0 - x_change = 0 - y_change = 0 - projectile.loc = moveTurf - break // one more turf for us /* if(bullet.hasImpacted && bullet in bullet_queue) @@ -280,8 +267,14 @@ SUBSYSTEM_DEF(bullets) */ moveTurf = null + bullet.lifetime-- + if(bullet.lifetime < 0) + bullet.referencedBullet.finishDeletion() + bullet_queue -= bullet + break + bullet.updateLevel() - animate(projectile, 1, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1) * double, pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1)*double, flags = ANIMATION_END_NOW) + animate(projectile, 1, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords /* diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 60adc5157d..8ffa0a8324 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -159,6 +159,7 @@ slug.throw_at(get_turf(hittingProjectile), 0, 1) hittingProjectile.on_hit(src) + return PROJECTILE_STOP /turf/simulated/wall/hitby(AM as mob|obj, var/speed=THROWFORCE_SPEED_DIVISOR) ..() diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 3779b1e1d9..78606e9dd1 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -85,6 +85,8 @@ return TRUE /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) + if(mover.atomFlags & AF_FREE_MOVE) + return TRUE if(movement_disabled && usr.ckey != movement_disabled_exception) to_chat(usr, SPAN_WARNING("Movement is admin-disabled.")) //This is to identify lag problems return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 9f7a4e0927..65c80ae5d8 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -480,6 +480,8 @@ GLOBAL_LIST(projectileDamageConstants) return FALSE /obj/item/projectile/Bump(atom/A as mob|obj|turf|area, forced = FALSE) + if(!density) + return TRUE if(A == src) return FALSE if(A == firer) @@ -553,9 +555,9 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) + atomFlags |= AF_FREE_MOVE density = FALSE - dataRef.hasImpacted = TRUE - QDEL_IN_CLIENT_TIME(src, 3) + dataRef.lifetime = 2 /// Called to properly delete a bullet after a delay from its impact, ensures the animation for it travelling finishes /obj/item/projectile/proc/finishDeletion() @@ -568,49 +570,6 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return TRUE -/obj/item/projectile/Process() - var/first_step = TRUE - - spawn while(src && src.loc) - if(kill_count-- < 1) - on_impact(src.loc) //for any final impact behaviours - qdel(src) - return - if((!( current ) || loc == current)) - current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) - if((x == 1 || x == world.maxx || y == 1 || y == world.maxy)) - qdel(src) - return - - trajectory.increment() // increment the current location - location = trajectory.return_location(location) // update the locally stored location data - - if(!location) - qdel(src) // if it's left the world... kill it - return - - before_move() - Move(location.return_turf()) - pixel_x = location.pixel_x - pixel_y = location.pixel_y - - if(!bumped && !QDELETED(original) && !isturf(original)) - // this used to be loc == get_turf(original) , but this would break incase the original was inside something and hit them without hitting the outside - if(loc == original.loc) - if(!(original in permutated)) - if(Bump(original)) - return - - if(first_step) - muzzle_effect(effect_transform) - first_step = FALSE - else if(!bumped) - tracer_effect(effect_transform) - luminosity_effect() - - if(!hitscan) - sleep(step_delay) //add delay between movement iterations if it's not a hitscan weapon - /obj/item/projectile/proc/before_move() return FALSE From 0345366dccdf40aaa456b05b2d9d339ff51104e2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 May 2024 01:48:08 +0200 Subject: [PATCH 080/171] a --- code/game/atoms_movable.dm | 6 ++++++ code/modules/projectiles/projectile.dm | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 66a7d88b5a..a748c684f7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -399,8 +399,14 @@ GLOBAL_VAR_INIT(Debug,0) var/atom/oldloc = src.loc var/olddir = dir //we can't override this without sacrificing the rest of movable/New() + if(isProjectile(src) && !density) + message_admins("Moving [src] through [loc]") + . = ..() + if(isProjectile(src) && !density) + message_admins("Moved through [loc] with return value being [.]") + if(oldloc) oldloc.recalculateWeights(-weight,src) if(loc) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 65c80ae5d8..3dc4bb0469 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -479,6 +479,10 @@ GLOBAL_LIST(projectileDamageConstants) else return FALSE +/obj/item/projectile/Move(NewLoc, Dir, step_x, step_y, glide_size_override, initiator) + . = ..() + + /obj/item/projectile/Bump(atom/A as mob|obj|turf|area, forced = FALSE) if(!density) return TRUE @@ -555,6 +559,7 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) + message_admins("Bullet has impacted [A] , [src]") atomFlags |= AF_FREE_MOVE density = FALSE dataRef.lifetime = 2 From 4957b420c5884c18aff87f52b4f5cea5d8ba9127 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 May 2024 15:13:21 +0200 Subject: [PATCH 081/171] qa --- code/__DEFINES/__atomFlags.dm | 4 ++-- code/_debugger.dm | 2 +- code/game/atoms_movable.dm | 4 ++-- code/game/turfs/turf.dm | 2 +- code/modules/projectiles/projectile.dm | 21 +++++++++++++++++++-- icons/effects/effects.dmi | Bin 379057 -> 379237 bytes 6 files changed, 25 insertions(+), 8 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index 8685a84a81..d921797da5 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -4,5 +4,5 @@ #define AF_LAYER_UPDATE_HANDLED 1<<2 /// This atom's plane shouldn't adjust itself #define AF_PLANE_UPDATE_HANDLED 1<<3 -/// This atom should be able to always move however it wants with no restrictions(used for bullets after they hit.) -#define AF_FREE_MOVE 1<<4 +/// This atom should be able to always move however it wants with no restrictions(used for bullets after they hit.) It also isn't counted for any interactions regarding crossing , etc. +#define AF_VISUAL_MOVE 1<<4 diff --git a/code/_debugger.dm b/code/_debugger.dm index 65afae08e5..c9491e3ffd 100644 --- a/code/_debugger.dm +++ b/code/_debugger.dm @@ -9,5 +9,5 @@ /datum/debugger/proc/enable_debugger() var/dll = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") if (dll) - call(dll, "auxtools_init")() + call_ext(dll, "auxtools_init")() enable_debugging() diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a748c684f7..efd6081738 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -400,12 +400,12 @@ GLOBAL_VAR_INIT(Debug,0) var/olddir = dir //we can't override this without sacrificing the rest of movable/New() if(isProjectile(src) && !density) - message_admins("Moving [src] through [loc]") + message_admins("Moving [src] through [loc] ") . = ..() if(isProjectile(src) && !density) - message_admins("Moved through [loc] with return value being [.]") + message_admins("Moved through [loc] with return value being [.],current loc is [loc]") if(oldloc) oldloc.recalculateWeights(-weight,src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 78606e9dd1..2311d11412 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -85,7 +85,7 @@ return TRUE /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) - if(mover.atomFlags & AF_FREE_MOVE) + if(mover.atomFlags & AF_VISUAL_MOVE) return TRUE if(movement_disabled && usr.ckey != movement_disabled_exception) to_chat(usr, SPAN_WARNING("Movement is admin-disabled.")) //This is to identify lag problems diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3dc4bb0469..e0cf87e4aa 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -560,12 +560,29 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) message_admins("Bullet has impacted [A] , [src]") - atomFlags |= AF_FREE_MOVE + atomFlags |= AF_VISUAL_MOVE density = FALSE - dataRef.lifetime = 2 + dataRef.lifetime = 4 + +/obj/effect/bullet_sparks + name = "bullet hit" + icon = 'icons/effects/effects.dmi' + icon_state = "bullet_hit" + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/bullet_sparks/Initialize(mapload, ...) + . = ..() + QDEL_IN(src, 3 SECONDS) + /// Called to properly delete a bullet after a delay from its impact, ensures the animation for it travelling finishes /obj/item/projectile/proc/finishDeletion() + var/atom/visEffect = new /obj/effect/bullet_sparks(get_turf(src)) + visEffect.pixel_x = src.pixel_x + visEffect.pixel_y = src.pixel_y + visEffect.transform = src.transform + invisibility = 101 qdel(src) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 644dbc4928c42a4a99945ddb6f3637d0b1b2ab42..a128a0a448aac84dfa670be5dd2b967145ddca01 100644 GIT binary patch delta 15793 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 delta 15622 zcmX||bx<5zu*R_@xNCyD1%kuk?h7nVkOX&k8(f3CySpU8-Q6}ou;A_zoX5TQy|;Cy zYUZD*+U-7lzW(*M+wlZ-aRjl{fQ_e`ma~M3laZr^y|aa#Eewo%W|h{s?b0Vyp+O~z zMok`>BX>oNW>kg{IIF*iA%+}3@U_{g`GoB{#p|V9CFJ)*MC=1%$z$93!G9JI9llPVgot zxW-bk1Wmn2lPx@fH@s?L-8{7vRD4)*;;1{1b!Yd<_IeE2ExkW*JHQaK^;w6~D;9lu z|By(MNSb?<9aix(yCTmr&^gU>=U;5YU;S~sxu{v9ykCzs2@bQRc)-tb(}bt>bQSo( zaK}@McKT(mq&A}V3ufp*d3-}Tw=EYx!C3vMHdJF}`9VYy1~lqgXXa0Zx+hCimKR;g~0rFrowy zJgynSx4@;Y5UvzrKEk@4ZibHIOY9aN?;J&g#!iyRL@v#`nUXNZ0})9y*YQzvH&`YI zV@2}%@4}YkU>q}bStw~TuO2VD=Cs3XPExJwrwpM%SQL)>Z3tz<1p7i5imnTsqaw-+ zi81&11}pO%y%jeJq=VH>Tk<0={A#lW) z5<$PtjM6>gP%kU75ZSs_I;vzJ64m(+nU56Mh72wfFG*dIqt9yJ;C*3W+4;@(c5Ko+ zVtkwp*@J-XdbX-J`CWQ#klx$$Ki&b}iG=WDn}qtxVbtQTDL3HFVzz?xLy7F&QCGiG*~Cr4o0cRF1X3z#-UgaiwgZ>m5OS zxq%wF#EZILmEs3&2y@7Xe-0G{Qyk|-sa$`CVC)h09!y5l!{@S%YPYg;Dwmm9W8&}R zsxM9p%T(}(rt~j@_B)TpUaENmy&r$t<6k(ScM3ngXuK#1ash6Rrgv*=4>iIkR|nss z|H`dn9NhASI`RIyZjJmhDjN92k~bL8w2+KAH@27Dx%%-(5G`>m(yxe53xn9po#S;X zddA_RE;&YYD{ShlvIk~T2gyfVqd!M|oE8U7NQGFFY5zE+C(G>D@^t~x2v_j*DJ=^?3d-9g&U8-dA@f=QNb@3H+#5wacrOZ9D~ zADD|r8B`%gzbaH%$Wf0PmtnSTNlbaYga-)1H&P-s4oz`GdG;~?{7{J(5F?FAbw;66 zqckFtN~aEVT+(nN&iS>FQQw*=X4Z^`^<5R5*(<;h!(~w&;gCQ+xl9gUzCVl5Tqm%5 zHW&#UZ-JgUaymy{&Hhww?R5G#FxZc#tewXryN29fzhIiql?n^RpS>79<@EAp{{MP| z?kkFhX+mJ}rL&q69`}qh>L&H$*G{~Jul#HIm5uTiKkR1wGDv+VWL(om$zndk%YHUB zUr>&uwJ;9C748{jtoZfeV~%G94IprA;LF9(QTlBCU7e|lt|=7y1CIdD_|7UqOCm3t zLxB(embu`xR`q2<_Sp2BY^2o>5@-VL4{aII`os;mg%WWh;{84W}~&CanXI1(gG@RMNng`g>oPv-p zu6@5B=7iNFVwf0vaM0YC5pPRvY_SbS&wTxi)DTAx3{$r19&5+6G@w@@FCa9tfmB?z z7#4~o=(qGV3U!JzSwFNX)$603VJe1H6%4a%uXyURfejB#SUs-TL>h>#Oam}1TyF$W za9op3$r_Ore>;543y|9R8~|Vm8qqn=QKJ8@gpHoA4t0U8N_<*RU*&5f*3k1z@zv}< z&;-4d;P`2#qh@Zqvzm1ZhBj=*G(Q_mJbP(8zI`|*Bdsaie)#|TMQr+Ks)qXRmuP{Y z66<$D`vAk}vp234{zw}8l22TU-eI!8rl~@EEsK}#P?&yw0IKw0@l1)E&5QIpbGsC~p7eo!13NIXRz z6_iSK1t^#9oQaL^Iv_7fU@1D^y}OE&{{Gb_b?429(N{$N#?8u!4tiCi#4tjqnl(b# z-ppi})OPbdCfww+$)kY2XzO|pcSNm_%B&Ftv4hp&IE zV`$_O=~eP2JUFn<*}<4Nk3U;_?Pe7Om{1uSA;8hYBA#wuiS}j`I$_}lrtZ<@YFoWM z!&CLFiXn7Kc806+oTzo~dz#?vQ|6?WDU7(SCl)G#b5`)Blk=sK%ONdKeVCJ0!P^yC zY^Nb(oWR8WR2J$iHP)LbwR3UkJ>=Ipj6cf0$~Vtt30gAR(024j=^bqdR3h-wWvD`X z1W=`Zc<;%(!`GtfBcMq0z>x3HX{Ibj#nuJGQ>M2v#(@fvgFEiCthu3&a)#8kW_G=2 z**p%ah6;tNx$&jFe|x7X<}1O|q&nKTe2sv(2_P9C1)<2T>8( zqA(jfi7!q9#Gv}FVR=N;VyabF;q5k<0!X`D5GO_<>Ra7u#$_9NF;~W#JclnY2}89U zE=o`Q!g9X;m%fLyE`_8UCbIWu!%Bs>nA0`BnMH66`4g~^SOGevo79XaUp{EKR_KbZ-6??49VmDo;uyR0g)>l}G_3D2K23#gN>Thjc-E zQMM_Iake_(j0&-wEq5@aZxhSQDJHBNdD392R+8JlJJA9 z8CzXj6x@bh4LjN`CIN7_W}X`XC#TlSMh4B@xeF91E2wlF@_l<1MrN1<^y{yT$UW~f zPj=JeusNQtg&i^=`8%-ZWZ%RVGm52p-yO@uaU_cncXaZ(JvYHQHY&fLbY&M6gb*%! z&X*WTuXsr&S~rfn|MKNFW-coW=JDW4+kB6QpK9?<^D{Xu<$eqc9AbN}W`T;gYXf5AfLlPQ08^7zoxT!WrzxHG`wbhR zKF9Lz;Dg*0UmExDwb4yWBa#`4`Pf1TAVbiS$VgYG`Oc^87o0uGIj4sozD9h(-_|KI z%HfBsO8oCL;x6PfE3(2lg@JOr9$7O2xu4vF-rmGd8ocJ0DhkPJk(S<3)Yg3`*1Ua3 zWMT;;@HX{S^!MB(OL~$F<(iqDecI&TW;443Nuro@{qmBr(xKU8X}fbGEQ(n?ky+z> zg3JB3#>uNUfN}dYrDG*GolXlM1ZKtQVFi8`D?8y1klV29BX%#i1yalI?HFBEEv@MW&qKAVe0GIlCSwmn7biUcVeao!Mo7bLpYFBbOow}8eY_fVq8g*S$Xu}tf) z!zve@zXjLEdXPH4;isQP(i=5tBWX?6&EAgql&}es&7ky5tZ}D`ig1g;xeALX0kB5{ z$Iju8b}iGnBAJ12?n$wdWDUKBpZo92He^krSf?;#f5B!^l6Om1&$SM@H2=8JUR}=t ziLSZTEvX;M^OaLxAK+>Rr6sfcIu(#6vR-dG`CFt`8`TL#CVK+}g7kVRS>`EOi#3GZ zq|ca1o`pyrxsF$J&D6GyEPs7o0i=it;!b;g<-|o>jP{h_B6;N`G?}RV-#KTXc*vl* zW9TjKie=zx1Ta|?CZVzzu|%mgrm&uF~o{1H82mOB7v-1KH#T9CK@@-Q^p!}THx$E>}t+xym$r(^^*61)a@Zgf!jDPKo zCH7Xs%_ zADZGPk+X|pM88i<0JRa{1*C}8nRoRMQb!%0Yj*8PeV&=mJ(Gc5=sLD--jF}{zLEZR zE72UB&LXu_fT+;$XBii=)35J}=Y}gcVOw-ZJqqo0>0CrEk-ld}t)rcoaRf3J4mD3u z8z@p zwk~MfeUq@_kt>2+`oE%E;|8}|AHe%7d`7+i@NRFK>g z7i-8qXNvm_ef(XB&y5ACKo^fFa>ZlHk=EO&vEa7>6)IU~aN|tAG%aIJNt0o)ZMm`_ z!L|drg9{Z^SD4Z%yHlk;mXyYPC|m|E+2TWv*JTD4;KHoG%|W~E0l|e0fkFmgxEB%B zQ;IdsxQb3Am@=`HSdp3$!QH_XvQqn%tJBK z!hnx+WxwRx0^cml7d`W!Jbiw%%IdC5_lOI;d48{LYma{1XD@ubns3&dATWe^y%pPA zBfGbh#+i4m!HEVldGL2WV!!tj3&lU%j^S9oecc5 z5*Q(7wm<7+_r)Yk2wAV(78F(+gh!n)go2B8I+q*f>Z82mBjnUBUgoRO-UZE;3@`%P zfAgMSX?S)JHE-|4bWpR~HQyDGKEGp)m|8!aH36wqI5gyg8?wF@CuX_eZc6sQswRci zRV^`l$|Ww<+6=~mB^{3L&hrBWH(k|QK2?>`v__5unm?>}z#LKShYyTkK=!VpTP^5R zZD&C3H)+MA!o>f{CN!xa2ymwRbE+f^9j8~0wZP9{wi}1qk?ms#I25W_{Tv$xgKj=FmE}#i+R+SUd$&ov0`I?o^-(CRUK_ zIVWj42|_ccXy0^v6M(Ep##4gNV%ZmZ2F~6xLJzcD*mIm0qvrNM09U-pW>>G-hVQzk zv$IG4rbAijKv4gfA4?HjEWhII$7n)97dyeVbwS^r+so|0v8O|B{Gnm_kcKf=nyv6s zf1X1+<^r#JtD!JBJX)PDP(b!4Fv{TA&U@>}*t45i5a~?$=oNjKF|p;5a>y8=JRBTjFfr<#1 zKjcke{fuDwJ2xdkt-p5|YeycUJBi0J!5^2;s~#qNInPkp08op^=s1}Rcz_JMYSr;l z+UL~AK$uG2aZt_=PJuOmoid*z;R)c-fdg4L*!1nH5v|;4P4}Mv{!nw`{&%oGW5iv0 zNkNi%((ko6LlM-dmNHHVC&FH&ql|h$Mr>(hgZD3=TCD5C?)N`UHx+EK|JMr*mm{X*wu;PoE6U+*L(om*K`LXSnz}P8lwQ zo>0lCC-U*91=zhTG7*f^IqiGwQr=mJ)3UnX5&53_!-hZgujxK4l3Cd3seTXV*AC@X z%nC9!rEa#YJz1OPIT3Ejj&B?b<@1_Y`APiN0!Rm9i{B01(7sjM@a-s2%bvk{T3+ms zdID|xmNaC#9@F@v8i-K*Wti3*qtYe`fDiGY=9@$Q&6`Kc6DN&y_t?raL+_sazCGry z&B}s#Hdm7&_pHkC} ze(ia@(-mcT0xMUn?iQ7Qi9KXE!^@oWeY;l@?$MVpDf$C4@RzqtA6l0fA5J$^dzMLH zT<`8H{J^wPd?hPMyY@0v^=yQdA5{g&0OcTNpL(|F$vypM;R(>3_8gRVCEWKF# z5EiJ>x3r>#1B&H6Lv73`JxkcD|Lc-yM&u=~aK3+vfsJ2Q2(Q7{9TT&m4F*nUrLeS* zD03_g=LV288WsjEG)kQ(3qo+Z`rn^frZ;9&#FuUbY2LR|AL_|DeRM&c63s=AAT*3i zzv39Ib+2`&`#;e94g38Sl^_QHq6bn_zKw%L^y)tIsrCi=n*eMwG{dSHb4X7*T2 z=a$H1Spww~eb_nWfrqZosv<4fjjT(2@n(b@h7YPI8}PApS{k=RT$FE7U%vWq80mA^ zI$wNh6m%5R0X^(15toj5-ETts%4EhR`Lg^ZV%H`r_mKWoK&CilcDxf(^CBG>KMDJ> zFpQj@Tru1@Op z7WGZuWEi^A?b7tLW4}RM>`7M)3$f-;%t8c{r|e~%M(qPd*I+`}F22W*5p94K}* zO;7TSbWE}l-tj~&Pl8t0Kr=vrk8oTKT?Dbxj+dW}f`D)d2*Zqdq2RSCer=Y7;V5-U zJ2HAjnX`n3W<~h^CX{Cp|7A{}1J{uirVwKDhC-hKJXzH81zGAZAjEdz9XS>>C(hDA zLdqC1O6r+PUdu8FPQ!H=ieL&a{_FwtclEAI09EFkt7lW9zDax+n4JN_b(krKMKv3Fcv>L#OvorC@WpD8~9E(6U&swg?fY}a(+Qh!c0SB_%+6_5Ph)) zlsF#R*-gX6?`23B)$7G;=1ifp+sq@*ehOj$w0;7fm^M2s$0Z2+nm+lc8+0VsVv(!l zl-0dB;2wKmU1e3wbz!siWaIWEr!vGuJH4f}zl`piJPBH)zazCN|X$vNBldsYC4 zY7;Se|J$a*r|eX|!{?j;LLnSq-jyH4Mm))WnG;(29>RU!m6(*KzxsDxFpgkrw zVa`6*7CW(`KQll5?c4S-g4l6iAPBP*dwQs#uwkG`s7sV3_ro0Zf^4$JZ7Ij_ZqVjG z$EZG{*RYG=q9`qV;VkA!z9gQA2n81S!ikcYCc%o24p$>ie+q2a9 zj477+z=KM|Xhk3Fie4rqE&GLwO;$?IDXRSafpcCp)l#Pm?49Mh2YS6c{46qXAWuxKGf zeGUF#p<+WI*cH!%XA}@r^3XZ)L|2`J8MQEBkX=RezI~+~Jg5bddqaY`y=w+|=N|aU zS2hz_FC#vFo6N%A!7%SB1h{u6c7L@Bk#MX$8_2`*s80MMq{Hx>ifUgqDGU_k{YWa*!^u*xw037bJ?%iO|r5H19HHh0)5Y^(28FhoJ+NL)%yq* z4{7d}9a`_6Z}jlwD83Jb?sB+NyAzkI|6oR=hd5 zIkvp8{Vi+4z`s&vBD510;{M_GgQw0V!yhd5ph*>?zF3?e^s6XCGdcBqdoGn?A4xs6 zpaQZi+SI@SyV-%x+Xcy}WXzU?XOSaR&(uSvkb{KP?vuPQo!-&Lyc)UdOnEZa(!o3C zLa7~XY*|`^pID=TmD_Ch-h7jLY{{W)E%A}1zi8k0=vkwCYRmd3ywfTDn(^a}oe3!e zb$#@EbjTnOHwpoj6;m`Vhl43InEOZ(x-V8+1$clanJnx4j{>3Up29BNqOoGhOLLpn zpr*->za>iKw82T1x7Eo(YhR}>EzmVU;8AKb2(hWVuYJQoFP%4RGbrz;lWwOP+~~?- zSVCijq<|uh^xO#i$T?jxNae?iuf_4%?*4DZzBK`#`NZT}-|c`UgG+*?uUN=6%ex-M zeY?Q7`jG7I?UaA`RH}tpk53@WleZvy^-D>@@($-tZHn9#+3c2|=xl%VP+2e5wucs8qdnvAZTH8P@S#N)N6O?z{x93z_4)`zRowuo*OHq0TI#X6@k~})40?5vu#bIfi}k%<$isu$r2;0 z4$%_J53J>)rQw|+sL>OD7}~JKzxzy#4o5tIBhC~)Mx(BH#ovRTHAyTi0uZZH@6l@9 zeJtFE)p3s{Hl58!9%Q6uC7#MPG&jO?vT&&cDtVui#Wse2Iia`ZpyDThC6=x^1-B>_ zFm7#hYX;6TT4J4pkPBTGqXJ~tvgN(|0ADK@VxPA6rO81knm&;(qwhkE$t&#q%lr)Q1S-`ROe7AkM z=+KmO@T()GZ_g&@{@Y{_W)>KKCVawgc|o~*=M`vKNapFk(-x!yBI?_-3sgAt|LH5rPN^Y1^>CeTo<3T0cU@bC=uMpr!OQ@XS((DNZvdmP61qQAfV-Gk zoCWVbJ^)!9a5$!#59KYhhI^-DQTi6&f$xS3+q_7D(t9ipWLG>TUl&!fAsr!{uh*HDiY! zEbN77mPM0i7bc;v0K{-%0$or32TwD&UGAqJAQBl$TI^r(`eM$6KG>`;G}_=|5y_C= z4lz1sVP)wWImUNKEo?p<>-M5@$XYc)1Jajk#k) zte^X-?3rD<28TY~r-WzR>5U=S26DtNl5igoO-7#NJ)7gCzM#LLoIC8QN~5TEF=Fci z{Lt|FPD)z^3J`v8j}x!QwDC9G_}-1nQ&+*>q59Cj#+?e@(H%UbtOO0f@$2KHOc**@ z1G^*ANpx@35%22l3}iV@-d>t)l-;N}HTb5IgMH)X;c)*%I8(zg8Ouj8F?I*9mw5MC zErDX3Gki=Tc+cYQg-cG3GaDv5;suZvPDvB`TbF&Rh69O$PH4H}M7h)(%bGDRYWzDj z3cnZ>39`%``qU?SvG6BM4!Zd?;`Fhd#UaNNS6<@bj&4%3W@L|&>yg_=KuOT9ggwlt zY|>~73HAPy!+|EMc$)}C(iSMxQ*Te)c19o46e~26c;Mli>>d$p=#Aq9EXbE(*ayWz zQl_M_qvl$aNp!aQUqMpe6Y)IH@ELQZzE7yJEumath)rW%glW7vZQ31mt!mamqEFeo zQV8*}uYcYdOvZO9r}m-#T-b2xr=+z*f|$IrdGf*QT!IH_&=wSzJ;l4+{1@{Y(Mqd*71e; zvYKS&VGnKTS;+g5Fi{C2B>AtX>_LCrISsZ`#ndnjL&pBW!~MR@SQ zk;kNI66RWA;4406fzW~+9Fwjr1#dWkHo6BBF{h;{6oZIw(YQHOqk~qbuT_BcnvaA6 z#D0NPqZ{#Ro-vpoI{H~~Y=AR>>0jeU`&$@U!MAd_luDJ>+OG0pGs=hEHddavA$QM$5*>Q*MdFC-NNKT+ZbEc&8YJn}`#&=@l<53e$q63G=(HOzJ}*Y9&A8C4xM&lrve#GpMvQy^>QP{g85>Zxr0qtg2la=>bZr zL&xCD$&dHun~a8h^L!nty&d99P2ok2I8&l{f8)0)qaR)z)ue~q{2!i3pqEDJ%_)L_ zt|T*og?~!L2Tp>y=spA59kPP=48f0)P6%(K-!#$5 z6iZ1q9$29MF5v7h8+Um9CVDKF{Cj^A?-!)robIqaeSqpt;)qfXW{D>lCH?W$j2|N> zs0fs*!r*~mPtcqtOrY)p4pmMN<=FP?`PUJKmXm=TIi{(-Ik0)QoSdx zc4`@{d5wI=D*QgHPp6~DtURSt{>5+~vw|JcDM800O?PBZL*4hlC82AgwSPqSqutfa z($|Ms({CyFb^2cnun}qoAd5uV6?{AFGvS2tUDhA2?HI2I8^~&`^KWPmysm(!vKu}U zQ}@jAiXH?b?S`Fxr&b7~jX-%3H5+u9e4{6XUvoS*$Cj=_)XJD6Y*HmgaJd9P(`L?+FvrtW#rR?i}-yP+`H2V)!3c^vB9f~Md{6B z;zw%5*lm3z-3^6t#RP4A+bt2c$sls6AZVjgm`5S+FJV&}ZBVWW@eWF2OBje{9t#Rl z2<35)Jn$LWEe&wC+xoOWrdp))h)1?zm)gawTysF?i7PF0+B$G9CD8nv|9tiJr>;sCvSAVMfCx3Q8cAS150%wn~#}N z_+>q#gn7Y~Qo!Jwt`Nt@dryo)rzbRNgL@(NjWp#|?(!3+QR$y+UgRXctRiM3LwmcQ z%s>yv&h@b!J*Hc`sDwPQ)6RXzVTeb9Ki32~6BL?ovg-go#(F-}JBefP&xu!|h`&hE zzj*cXs``A_{wDUFAimh8jgZcj-5)~@+kTiaij_DC|F4@M0qZNK417ibXMH$?b&mPw z(4l%q08)A`d#p-9F{-_5n2pBWnkaTwG^UbUqAi2`ZcgS8^Quxh>6vGdg@u+RN))Ff znjVm-EYGxSPKVbK;jt?FJ~)CmG#kbh1_||yyreD29n`1~mAmlr$V3MWNLY#^C|&`k zEl67`Dj~J%Jqb;mOT?yKmIAC(5A9%ifGv8tYzhv$2-h{^WfXWCoNhszBCXZm3MKA{ zghwq?Z{06hLP$%z3xjyalSZplWbhSj1IE+RIl>jldK=IVRp~1yw?nWAZ?ZzQOL4V2 zybD;p2xKzpNaLbgO{;g}^aKxjQm?-qT0UI=J%<(5lYsevzrSCC{<+ydx^pk@#Q-wRMf}(wVufTl$_2APh20 zk?tM_p*IJxAD?4S&R_O~UwM)sq1F>F3uX;FwoH$m6E?TG@`~{h7a0c#W^d9ky|*=E zXY&Gm!_P2-ct>XhJHrip{>3wE^r;x9J)IM2LhU9XI~s=QqZ*y16(jeoi2$2G@=7{e zwY0;l#>4lex>@h|{hU*oh4ds0BzJu{eHS|H8%Ai_7&E9dAecZ#{*S5PAL(Zn6h`H| z2bfRs-tFS^`w9sjvB~+Y! z=2#RfQRRDr4&_tqRR2TBKD_Sd>W*%qb0k+ZGbHQTL&_e=tFOR0Ck9}&dq<+`jlYRD zpF(PzEsb(6y-PLyH>%iTD#JmXfQ0XCX?`R% z-pneEXj+`IfE_07$|!%4RI!R%;`r!Jzna7`Vw_OX#c=8Y#s`)45C5ro%&*Dl?t!N? zq8}_a$kc!`H(mlYWR`2@`>VDix@MWnEV&_%HiM{2Gqkm>l#%?PnAl!N^nljJ9Q}K| zkQA@z5kzh2dh|QWc(nuOx3VQUPjd_^DcD8`fl{H@WD>;jifM0GHea1LXxX98VXk($ zNm8blR<9F>7IhO#BR}?Qtls{)a|7c;KJ*7<>@a{P6qQj;p`^3?ebJ|RS4OwmZm;EW zu;p#^`?eHOIc*Wvy2Peg&3$5nabGZ|Qu4if`mQ&|ym@k!VYX)Ih~VI`bD2R&Q-Bx` zZy#g6l>FSL0bdMUIj;2gzp4uFpmP-;*yde3%NwUYI^Q|yK(~uJLImt7_JWM|pkA*- zngf8i{&O?6`GlJt+F%F(N99SiF!FV7|&Dca})I=8vnIuy*H^tBYh8>p{yI4tf!PZ zt|u35wl1Jf(6U^oQ*KH|!Bk3c6SJ?Shqq9|UW%hnk_TBR> zoZG|upzc7A2jf%BsMXfXa59XNEKE!oCD;Y&Y{-nOWnzbIfJ49aGiiH&!P5Kc7j_E% z0}t?4McJ)qzUx4JhZ5yT?nO51Ytp7IR#V} zJaaj=E*|taw8-+6G_d|~QL>Btjj_`=bz27_VC8_O`?IqGR=U=XJpEKupK1*@r7f;A zoP2YRN6UmqiySoCga>w%I4|n7Vvg*BjjJMA17ErCG+;{eHe=)la`QSLDM_$o*Fv4+ zn^yPK$#Lj-$0x?U;;o6Y(nB$B$ag6?N|qN1*0FHG5>{m?!eyFdyDEkH5YuII=7zlm z?pMZM{X!6J@i=&$TVXYZ$n8d^d{{b9RL%_J$7tH**X#m$Vf@F0zn7nwTu53MPex@St($~~RPX}Q#M*P9YVr*?kBaCcA>Gm%AIK2ItRwxCBjHlS07HT9{(D_sz__X`9EYu$ zk%1By*7$%89u6JF@0$yPo46hafo{I^vW2KdBKg|rt$(N~f6Gz!(kUsSycVF)@7g&2 zk0ATx?Q>!bPZl^I_)?LfNc&NrWKqTNaMr$N%Dck4Il!{0hQrt4_SFVx#t^&pt>eOFnc>$^Raa z$iCCj93oTYwkMWyP-Sb>8BuorUL({_l(8g2?Q^AteDEq>s0U@GfinGAuS1 zSrpxB?_zUn_BBeXt+q5g-{?}T*{@`Oo};yQ5$}YYQiXStN7@07%Hf54fpU7XZNL`F zmAK8!;3Id92zW{#TjoYdy~eg?m(umEAT>ytaG*}xivCN*q{^Fd&I+jq&L8M3wtU2#w{8*eSXdUs_1b2V!rik`C{*5wo2m`l=s0YU!l>=Pgp`g zI14el4bTsLa`!OxT z98-WQc(cmQ2Xr$`M}RhAY(0xNKw#i~X5w_n@q#Ic^Z!AQ9cTTdxTP#UggrC-mtDB9 zH+`I8WdqlYJqNyTx=8V06LIiKlTn#OQh%$2Pl3^4%-S}JucyH_^+wYW-qt66cbV|7 zXd60?3!=?b2+WT835|M6Mv%;t*157A&#JX;?7@m;kH+#yX0m*F;o?}j%p!T*TP#Co z^uXt}Ey5PgP@GKpY^GPnLc@tYS~3JUza0ksQSZorXQs=t8ajJ3W+?0rlu3oWQuv-< zskj05aXX$^irrL&UR2EjVr`m`UN>tXfdw>-wwYBVKR3oIQ_$nFTG-ywn zfWed}JP{^~Ghv(}#Xf}vd6YMokY+z6@m3by9=6}uouMQQs>)dxAi7i9{}~ukA(j4~ z$T`bv0KE(tGyC)YBApITo{7e-!ukHtViv*r zQZppsMccnu%Jz*ZU|`?LsP|T7iXeD5BjNMuz4KUt64=oB$CI$s3&;73h2&R*HxuoT z`Zf#pH*6?wvVpA(5wa~cG@F=-Ptfi=0)OKtcn4;8Q*W2jR=fp^ri z+coah!tyw+M7ha+WHY%y$+y!u35-y+0pcuaCXAWBmqA;>t>$h&lz>>t6AgCO9l&CP z7+>YE;_0(o+F@i?RWfE$(>G^>E`1uu_}=v0EYNgD^gPi1^6O!;?m@C ze=*&CcAJS{xmr^~aPZ6R^H6*CKVrL`qJLL`Q2diMU|mZ1Vm-*#w0qMUTKvJ^M>er? z{VLg}LkQ8J0GKsx+q50n`a9{{@|+`!@Qil!Li9lSUjrP@&OsSHjb=%mvNk>F;Tw;x z{;7{ou3#cfUjnuN)ii?Rr9Do(+pL-89SL@w87gQzR2m`=aS!1wcS=1*5yZIKSj^t# z07_rJsNed~%!*anop0I1!N9=H|MRc44Yg166_20GhoJ&Vt#PrY$U`vKuykGF)RtYh zkg99d_sE{+Uo%<))W2rrsN+YrPuE$}W>bX;B3ATSTzQpwUCmQF_z@O0;|{_9d3(D1 z6>VDnJ>CT3Dma;-6wRI1kL3&O2k&U|VBj6mAKGixiQo_fg6R=jR;b(l8=96#eBS}` zmwi;Bp4TCmE84LUMI;w_^RQKFi5yqxDP=+phYZ7Ur5lzom3R)d)UG+d0re;feTj4@ z2QfZwy+11V)Hssa8-rOeT}v`HlwLl=f`UbBP}0^R8%3=OafUMBQ(?}>D^HpvWFX9) zZCiwiJ`O^8V00dT#eh6M^^iBAA6AN=#HTRk#BYWMSho6ONQ%shqVDoI2p z;aOhkeB!L#`S1a}g&(m;*8{MTFKJdpf`vs$4@>Pow(BUM%L|lxZ(O6KTa(;CexkJa z6X%9Xu%1a@OVox)os?+Qy_QE8wyoHNMkbZx#JC+pSHk*5FzUWDWM__GO*O!IFjgXZ zZ2(5lk}8msy*-muR3L>s_no_b?L_HHZK`ATROGHTJ{)awQcLu4IVPL~v&S4kQ=WQ~DULzpXf8#Y}}kP|*1CtqxPPBF-Y#Vf(E z*d{{z^2gYAs#kYtpyAUYIPj|qpJ&eA-UGn-Z8`8SU$2h{xX=?kE|qE0-;*$OThmCzjskF From 73dca5621355000660c2a7c136c71d676ca135e3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 May 2024 19:26:39 +0200 Subject: [PATCH 082/171] visual effecs for hitting and more --- code/controllers/subsystems/bullets.dm | 24 ++++++------------------ code/game/atoms_movable.dm | 6 ------ code/game/objects/structures.dm | 2 +- code/modules/projectiles/projectile.dm | 13 +++++++------ icons/effects/effects.dmi | Bin 379237 -> 379210 bytes 5 files changed, 14 insertions(+), 31 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 1c98f18d08..161417f867 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -120,7 +120,7 @@ SUBSYSTEM_DEF(bullets) else message_admins(("Created bullet without target , [referencedBullet], from [usr]")) - message_admins("level set to [firedLevel], towards [targetLevel]") + //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel)/(distStartToFinish()) movementRatios[4] = getAngleByPosition() @@ -258,31 +258,19 @@ SUBSYSTEM_DEF(bullets) bullet.updateLevel() if(moveTurf) projectile.Move(moveTurf) - // one more turf for us - /* - if(bullet.hasImpacted && bullet in bullet_queue) - pixelsToTravel += 48 - bullet.hasImpacted = FALSE - bullet_queue.Remove(bullet) - */ moveTurf = null bullet.lifetime-- - if(bullet.lifetime < 0) - bullet.referencedBullet.finishDeletion() - bullet_queue -= bullet - break bullet.updateLevel() animate(projectile, 1, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW) bullet.currentCoords = bulletCoords - - /* - if(QDELETED(projectile)) + if(bullet.lifetime < 0) + bullet.referencedBullet.finishDeletion() bullet_queue -= bullet - for(var/turf/thing in bullet.coloreds) - thing.color = initial(thing.color) - */ + + + #undef LEVEL_BELOW diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index efd6081738..66a7d88b5a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -399,14 +399,8 @@ GLOBAL_VAR_INIT(Debug,0) var/atom/oldloc = src.loc var/olddir = dir //we can't override this without sacrificing the rest of movable/New() - if(isProjectile(src) && !density) - message_admins("Moving [src] through [loc] ") - . = ..() - if(isProjectile(src) && !density) - message_admins("Moved through [loc] with return value being [.],current loc is [loc]") - if(oldloc) oldloc.recalculateWeights(-weight,src) if(loc) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 1d88a4a4e2..5162905b8d 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list(\ var/bulletHeight = P.dataRef.currentCoords[3] var/checkingType = type var/willBlock = FALSE - message_admins("bullet height at [bulletHeight]") + //message_admins("bullet height at [bulletHeight]") while(checkingType) if(GLOB.structureBlockingLevels[checkingType]) break diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index e0cf87e4aa..c24e13e85d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -559,32 +559,33 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) - message_admins("Bullet has impacted [A] , [src]") atomFlags |= AF_VISUAL_MOVE density = FALSE - dataRef.lifetime = 4 + dataRef.lifetime = 1 /obj/effect/bullet_sparks name = "bullet hit" icon = 'icons/effects/effects.dmi' - icon_state = "bullet_hit" + icon_state = "nothing" anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT /obj/effect/bullet_sparks/Initialize(mapload, ...) . = ..() + flick("bullet_hit", src) QDEL_IN(src, 3 SECONDS) /// Called to properly delete a bullet after a delay from its impact, ensures the animation for it travelling finishes /obj/item/projectile/proc/finishDeletion() - var/atom/visEffect = new /obj/effect/bullet_sparks(get_turf(src)) + var/atom/visEffect = new /obj/effect/bullet_sparks(loc) + visEffect.layer = ABOVE_ALL_MOB_LAYER visEffect.pixel_x = src.pixel_x visEffect.pixel_y = src.pixel_y visEffect.transform = src.transform + visEffect.update_plane() - invisibility = 101 - qdel(src) + QDEL_IN(src, 2) /obj/item/projectile/explosion_act(target_power, explosion_handler/handler) return 0 diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index a128a0a448aac84dfa670be5dd2b967145ddca01..3f3a954759f9a6ee4c7c7e8e5a470c328228be30 100644 GIT binary patch delta 14254 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 V(|r@5TKVw)lb2QjR!M&G`+tJ;+nxXb delta 14284 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 From 866587b66c30fa4d6a17489da6bb259be5eb43df Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 4 May 2024 17:12:02 +0200 Subject: [PATCH 083/171] a --- code/__DEFINES/_bullets.dm | 14 +++++++------- code/controllers/subsystems/bullets.dm | 6 +++--- code/modules/projectiles/projectile.dm | 2 ++ 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index 8b1ade7189..ba664f5063 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -1,7 +1,7 @@ -#define LEVEL_BELOW -1 -#define LEVEL_TURF -0.7 -#define LEVEL_LYING -0.5 -#define LEVEL_LOWWALL 0 -#define LEVEL_TABLE 0.2 -#define LEVEL_STANDING 0.7 -#define LEVEL_ABOVE 1 +#define LEVEL_BELOW 0 +#define LEVEL_TURF 0.5 +#define LEVEL_LYING 0.7 +#define LEVEL_LOWWALL 1 +#define LEVEL_TABLE 1.2 +#define LEVEL_STANDING 1.7 +#define LEVEL_ABOVE 2 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 161417f867..1a39565949 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -122,7 +122,7 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel)/(distStartToFinish()) + movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -231,10 +231,10 @@ SUBSYSTEM_DEF(bullets) pixelsToTravel -= pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] += (bulletRatios[3] * pixelsThisStep/PPT) + bulletCoords[3] += bulletRatios[3] x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) - z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) + z_change = round(abs(bulletCoords[3])/2) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index c24e13e85d..a6c56bbb61 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -481,6 +481,8 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/Move(NewLoc, Dir, step_x, step_y, glide_size_override, initiator) . = ..() + if(NewLoc == dataRef.targetTurf) + message_admins("[src] reached target with a bulletLevel of [dataRef.currentCoords[3]], and a rate of [dataRef.movementRatios[3]]") /obj/item/projectile/Bump(atom/A as mob|obj|turf|area, forced = FALSE) From b22fe4a348953fde4a868f535fc3d61a777f0294 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 5 May 2024 01:40:06 +0200 Subject: [PATCH 084/171] a --- code/controllers/subsystems/bullets.dm | 15 ++++++++++----- code/game/turfs/simulated/walls.dm | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 1a39565949..de76f0aec5 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -122,7 +122,7 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel) + movementRatios[3] = ((targetPos[3] - firedPos[3]) * PPT + (targetLevel - firedLevel) * HPPT) / (PPT * distStartToFinish()) movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -155,7 +155,7 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/updatePathByPosition() var/matrix/rotation = matrix() - movementRatios[3] = ((targetPos[3] - firedPos[3]) + targetLevel - firedLevel)/(distStartToFinish()) + movementRatios[3] = ((targetPos[3] - firedPos[3]) * PPT + (targetLevel - firedLevel) * HPPT) / (PPT * distStartToFinish()) movementRatios[4] = getAngleByPosition() movementRatios[1] = sin(movementRatios[4]) movementRatios[2] = cos(movementRatios[4]) @@ -163,11 +163,14 @@ SUBSYSTEM_DEF(bullets) referencedBullet.transform = rotation /datum/bullet_data/proc/distStartToFinish() + return DIST_EUCLIDIAN(targetPos[1], targetPos[2], firedPos[1], firedPos[2]) + /* var/x = targetPos[1] - firedPos[1] var/y = targetPos[2] - firedPos[2] var/px = targetCoords[1] - firedCoordinates[1] var/py = targetCoords[2] - firedCoordinates[2] return sqrt(x**2 + y**2) + sqrt(px**2 + py**2) + */ /datum/bullet_data/proc/updateLevel() switch(currentCoords[3]) @@ -231,10 +234,10 @@ SUBSYSTEM_DEF(bullets) pixelsToTravel -= pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] += bulletRatios[3] + bulletCoords[3] += (bulletRatios[3]) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) - z_change = round(abs(bulletCoords[3])/2) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) + z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) @@ -242,7 +245,7 @@ SUBSYSTEM_DEF(bullets) break tx_change = ((x_change + (x_change == 0))/(abs(x_change + (x_change == 0)))) * (x_change != 0) ty_change = ((y_change + (y_change == 0))/(abs(y_change + (y_change == 0)))) * (y_change != 0) - tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) + //tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) x_change -= tx_change y_change -= ty_change @@ -258,6 +261,8 @@ SUBSYSTEM_DEF(bullets) bullet.updateLevel() if(moveTurf) projectile.Move(moveTurf) + moveTurf.color = "#892381" + moveTurf = null bullet.lifetime-- diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 8ffa0a8324..1473fae19d 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -149,6 +149,7 @@ ricochet = TRUE if(ricochet) take_damage(round(projectileDamage * 0.33)) + message_admins("Ricochet at [angle].") return PROJECTILE_CONTINUE take_damage(projectileDamage) From fda01e2f9fa6f629aa30728f9517c6657245ee84 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 5 May 2024 08:14:45 +0200 Subject: [PATCH 085/171] banish bump , force subystem to scan turfs , start hitboxes. --- code/__DEFINES/misc.dm | 8 +++--- code/controllers/subsystems/bullets.dm | 5 ++-- code/game/objects/objs.dm | 4 +++ code/modules/projectiles/hitbox_datums.dm | 4 +++ code/modules/projectiles/projectile.dm | 35 +++++++++++++++++++++++ 5 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 code/modules/projectiles/hitbox_datums.dm diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index f8754b2393..5248fdc3cd 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -157,10 +157,10 @@ // Special return values from bullet_act(). Positive return values are already used to indicate the blocked level of the projectile. -#define PROJECTILE_STOP 1 //if the projectile should stop flying after calling bullet_act() -#define PROJECTILE_CONTINUE -1 //if the projectile should continue flying after calling bullet_act() -#define PROJECTILE_FORCE_MISS -2 //if the projectile should treat the attack as a miss (suppresses attack and admin logs) - only applies to mobs. -#define PROJECTILE_FORCE_MISS_SILENCED -2.5 //if the projectile should do the same thing as above, but not give the miss message +#define PROJECTILE_STOP 1 //if the projectile should stop flying after calling bullet_act() +#define PROJECTILE_CONTINUE 2//if the projectile should continue flying after calling bullet_act() +#define PROJECTILE_FORCE_MISS 4 //if the projectile should treat the attack as a miss (suppresses attack and admin logs) - only applies to mobs. +#define PROJECTILE_FORCE_MISS_SILENCED 8//if the projectile should do the same thing as above, but not give the miss message //Camera capture modes #define CAPTURE_MODE_REGULAR 0 //Regular polaroid camera mode diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index de76f0aec5..4d3747b222 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -259,9 +259,8 @@ SUBSYSTEM_DEF(bullets) projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.updateLevel() - if(moveTurf) - projectile.Move(moveTurf) - moveTurf.color = "#892381" + if(projectile.scanTurf(moveTurf) == PROJECTILE_CONTINUE) + projectile.forceMove(moveTurf) moveTurf = null diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 5514cbceca..4bc38b0db6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,6 +2,7 @@ //Used to store information about the contents of the object. var/list/matter var/list/matter_reagents + var/datum/hitboxDatum/hitbox = var/volumeClass // Size of the object. var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 @@ -13,6 +14,9 @@ var/corporation var/heat = 0 +/obj/Initialize() + . = ..() + /// Used for calculating weight, return value will set the atom's weight /obj/getWeight() var/w = initial(weight) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm new file mode 100644 index 0000000000..322390c837 --- /dev/null +++ b/code/modules/projectiles/hitbox_datums.dm @@ -0,0 +1,4 @@ +/datum/hitboxDatum + var/list/boundingBoxes + +/datum/hitboxDatum/proc/intersects(datum/bullet_data/bulletData) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index a6c56bbb61..56b3005155 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -484,7 +484,41 @@ GLOBAL_LIST(projectileDamageConstants) if(NewLoc == dataRef.targetTurf) message_admins("[src] reached target with a bulletLevel of [dataRef.currentCoords[3]], and a rate of [dataRef.movementRatios[3]]") +/// Has to be ordered with highest-leading typepaths to the left(aka don't put the stairs after obj/structure , since any check on obj/structure will also include the stairs as a subtype) +#define HittingPrioritiesList list(/mob/living = 5,/obj/structure/multiz/stairs/active = 3,/obj/structure = 4, /atom = 2) + + + +/obj/item/projectile/proc/scanTurf(turf/scanning) + if(atomFlags & AF_VISUAL_MOVE) + return PROJECTILE_CONTINUE + if(scanning.bullet_act(src, def_zone) & PROJECTILE_STOP) + onBlockingHit(scanning) + return PROJECTILE_STOP + var/list/hittingList = list() + for(var/atom/thing in scanning.contents) + for(var/i in 1 to length(HittingPrioritiesList)) + if(istype(thing, HittingPrioritiesList[i])) + hittingList[thing] = HittingPrioritiesList[HittingPrioritiesList[i]] + break + + for(var/i in 1 to (length(hittingList) - 1)) + if(hittingList[hittingList[i]] < hittingList[hittingList[i+1]]) + var/temp = hittingList[hittingList[i]] + hittingList[hittingList[i]] = hittingList[hittingList[i+1]] + hittingList[hittingList[i+1]] = temp + i = max(i-2, 1) + + for(var/i in 1 to length(hittingList)) + var/atom/target = hittingList[i] + if(target.bullet_act(src, def_zone) & PROJECTILE_STOP) + onBlockingHit(target) + return PROJECTILE_STOP + + return PROJECTILE_CONTINUE + +/* /obj/item/projectile/Bump(atom/A as mob|obj|turf|area, forced = FALSE) if(!density) return TRUE @@ -558,6 +592,7 @@ GLOBAL_LIST(projectileDamageConstants) //stop flying onBlockingHit(A) return TRUE +*/ /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) From ed906cc4374532e13cbbdbb0a54cc3f05ca3fb6e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 6 May 2024 02:28:12 +0200 Subject: [PATCH 086/171] Update hitbox_datums.dm --- code/modules/projectiles/hitbox_datums.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 322390c837..dc76b6b7fb 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -1,4 +1,8 @@ /datum/hitboxDatum var/list/boundingBoxes -/datum/hitboxDatum/proc/intersects(datum/bullet_data/bulletData) +/datum/hitboxDatum/proc/intersects(list/lineData ownerDirection) + for(var/list/boundingData in boundingBoxes) + + + From cd494f2a3a78fc2234a1b05765010d36e6282844 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 7 May 2024 20:21:27 +0200 Subject: [PATCH 087/171] aa hitbox --- code/game/objects/objs.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4bc38b0db6..7fd4ef4b18 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,7 +2,7 @@ //Used to store information about the contents of the object. var/list/matter var/list/matter_reagents - var/datum/hitboxDatum/hitbox = + var/datum/hitboxDatum/hitbox var/volumeClass // Size of the object. var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index dc76b6b7fb..2d360b885f 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -1,7 +1,11 @@ +#define BBOX(x1,y1,x2,y2,offsetX,offsetY) list(x1,y1,x2,y2,offsetX,offsetY) +#define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) + + /datum/hitboxDatum - var/list/boundingBoxes + var/list/boundingBoxes = list() -/datum/hitboxDatum/proc/intersects(list/lineData ownerDirection) +/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection) for(var/list/boundingData in boundingBoxes) From 0864611791f25c118536931631b276b56a265404 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 7 May 2024 21:57:41 +0200 Subject: [PATCH 088/171] hitboxes & intersection first attempt --- cev_eris.dme | 1 + code/__HELPERS/unsorted.dm | 7 ++++++ code/controllers/subsystems/bullets.dm | 7 +++++- code/game/objects/items.dm | 10 +++++++++ code/game/objects/objs.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 26 ++++++++++++++++++++++ code/modules/projectiles/projectile.dm | 6 +++-- icons/obj/items.dmi | Bin 43234 -> 43273 bytes 8 files changed, 55 insertions(+), 3 deletions(-) diff --git a/cev_eris.dme b/cev_eris.dme index 43ce325c2a..038d56114d 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -2412,6 +2412,7 @@ #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\gun_firemode.dm" #include "code\modules\projectiles\gun_hud_actions.dm" +#include "code\modules\projectiles\hitbox_datums.dm" #include "code\modules\projectiles\projectile.dm" #include "code\modules\projectiles\ammunition\ammo_kits.dm" #include "code\modules\projectiles\ammunition\boxes.dm" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 6b918632bd..4b955ba5c7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -576,6 +576,13 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/between(var/low, var/middle, var/high) return max(min(middle, high), low) +/proc/int_range(value,limit1,limit2) + if(limit1 > limit2) + var/temp = limit2 + limit2 = limit1 + limit1 = temp + return (valuelimit2) + //returns random gauss number proc/GaussRand(var/sigma) var/x, y, rsq diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 4d3747b222..985c0021e6 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -25,6 +25,7 @@ SUBSYSTEM_DEF(bullets) var/list/relevantAtoms = list() // 1 client tick by default , can be increased by impacts var/bulletWait = 1 + var/list/trajectoryData = list(0,0,0,0) @@ -256,10 +257,14 @@ SUBSYSTEM_DEF(bullets) bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change bulletCoords[3] -= tz_change + trajectoryData[1] = projectile.pixel_x + trajectoryData[2] = projectile.pixel_y projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change + trajectoryData[3] = projectile.pixel_x + trajectoryData[4] = projectile.pixel_y bullet.updateLevel() - if(projectile.scanTurf(moveTurf) == PROJECTILE_CONTINUE) + if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) projectile.forceMove(moveTurf) moveTurf = null diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index bd138a4b34..fd28c6a6da 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -122,6 +122,16 @@ GLOBAL_LIST(melleDamagesCache) var/chameleon_type +/obj/item/hitbox_test + name = "hitbox tester" + icon_state = "hitbox" + +/obj/item/hitbox_test/Initialize() + . = ..() + var/datum/hitboxDatum/Selfhitbox = new() + Selfhitbox.boundingBoxes += list(8,8,24,24,0,0) + hitbox = Selfhitbox + /obj/item/blockDamages(list/armorToDam, armorDiv, woundMult, defZone) for(var/armorType in armorToDam) for(var/list/damageElement in armorToDam[armorType]) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 7fd4ef4b18..b897583bf9 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -17,6 +17,7 @@ /obj/Initialize() . = ..() + /// Used for calculating weight, return value will set the atom's weight /obj/getWeight() var/w = initial(weight) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 2d360b885f..990a5411ec 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -1,12 +1,38 @@ #define BBOX(x1,y1,x2,y2,offsetX,offsetY) list(x1,y1,x2,y2,offsetX,offsetY) #define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) +#define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) /datum/hitboxDatum var/list/boundingBoxes = list() + /// global offsets , applied to all bounding boxes equally + var/offsetX = 0 + var/offsetY = 0 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection) + var/lineSlope = TRIGSLOPE(lineData[1], lineData[2], lineData[3],lineData[4]) + var/boxSlopeLeft + var/boxSlopeRight + var/valid = FALSE for(var/list/boundingData in boundingBoxes) + boxSlopeLeft = TRIGSLOPE(boundingData[1], boundingData[2], lineData[1], lineData[2]) + boxSlopeRight= TRIGSLOPE(boundingData[3], boundingData[4], lineData[1], lineData[2]) + // failed heuristic. Skip + if(!int_range(lineSlope, boxSlopeLeft, boxSlopeRight)) + continue + // checking X-axis + valid = max(lineData[1], lineData[3]) > min(boundingData[1], boundingData[3]) + valid &= min(lineData[1], lineData[3]) < max(boundingData[1], boundingData[3]) + // checking Y-axis + valid &= max(lineData[2], lineData[4]) > min(boundingData[2], boundingData[4]) + valid &= min(lineData[2], lineData[4]) < max(boundingData[2], boundingData[4]) + if(!valid) + continue + return TRUE + return FALSE + + + diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 56b3005155..819a25255b 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -489,7 +489,7 @@ GLOBAL_LIST(projectileDamageConstants) -/obj/item/projectile/proc/scanTurf(turf/scanning) +/obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData) if(atomFlags & AF_VISUAL_MOVE) return PROJECTILE_CONTINUE if(scanning.bullet_act(src, def_zone) & PROJECTILE_STOP) @@ -510,7 +510,9 @@ GLOBAL_LIST(projectileDamageConstants) i = max(i-2, 1) for(var/i in 1 to length(hittingList)) - var/atom/target = hittingList[i] + var/obj/target = hittingList[i] + if(istype(target, /obj/item/hitbox_test)) + message_admins("INTERSECTS HITBOX , RETURNED [target.hitbox.intersects(trajectoryData, target.dir)]") if(target.bullet_act(src, def_zone) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index ac771156e0ab965ae3877360a91bde6ad8f0a771..7410428192625257c54b3073e94d74fe18373a4a 100755 GIT binary patch delta 2529 zcmV<72_E+1(E^Fm0+1ws7}ysvuqag@kk@}I`95T88SA@=37r){x%+eDT=9CHnZ`li(qm0 z_X#v(QF9ixs8T6Ma6N{I30>X6O@tr<1dLTwp`kU#?SCvmn9@N8$jJm zhrsmwjsvJSC$n`^Y3L$GS5baQ97ZH^oEW@W@e4;h`ZVp0; zW~k`p_fVPCSl?KG8~qBMXp!^K9gurOnf)NP{w6gzB}>=UgQs+z*l5c2!$63(bX}^a z53nd!R8I-nZ#7uUIH(pJIACHTAmd3qQwW|%-FWvtxEPNV8rU|=W;U5kj+5ioDUy&; z80s}A-p>@DSoKvYtE=tFD^{szl|6aID)p1wlUJ;=Wv{Y-{lqH0ft19CVm-<-85DKQ zP)M0%y&$}TBBJ8Mp~PVLUWi9f1L)QO!}Hb@43S)}XB_G2!kxTa9dCnu!w8=fCGcAIsidiven zMvmlq;nx@q4b($00J$vChRkI-kCQF}qZ9on4Z z3~7-`Chyu9Hu{#0l$*%cyQzL;3mIb2&Bk zHK+8(=9ljFDhE@Dunj<*=4FpEhr36RE6k!%^-lv(;R9pBBbPE5gOTaVfoD~p18z%_ zj87~F0Yu9vAt!umINxO~N-bIg3I(Kuwl(!_zoQYn)imV~?(KVX|NE}F`}HvXA1RCv zR-el!XtP2D$DMzu$^?w#|IrJAD=|a(u=0^&Ix{@V0u~VwF+c?@A|hgdwxSd0Vo9+5b%cEg~YbK~87Do$dd02JdJj3V_$=b$(Ce z^?50+cqpf{gM8%g-1?mL%AZ~WpgY=|^8AZCwpcH{-r&kd{-Wm(TL53b@@!V0({%Fv z7g}89tNni#z>&38mj6PF3!v1q)VgEtJOIvr(yiH?h)9m4{XXDepxjzkRsuk2SzywG zbasSz;^{3(1HJuNCR=~Mi;q5wq#e-5=bw7(6x)V}xp(edzPNrpmOMRddtJFfedA;a#`q zEx&*0%tZiN{~Kc8i4%Mpi7v+mHn-60pyk_+}cK2T*R1@UShxT#wXam5kDPeyV zu!!VS%2m+yq4P-tMqg}%bDd$%b%u%b53y+AD!=&mD2oQJ66qfTNc*!dHsTy(DuciB z&E^B_?FhLx+_l6h-}?ir*tUH)H8o?)*^P~j)YZMrn+NN4)wGDnkC65%=wkQ$8|NXR zH(cZl=zXyf`hYFm&3ixm#~I|){oH@KXBTG<9ZxBgY$)GMe)rlc>zFl)Z)+{St+gCG za*)f-E!-bi1;COeMfg|V3qW1n%g*C=2|rUCoUyZE5s_R=nE?j_<<|N~7SkKP%{dp^ z7aQT>(p9uYBd)e+#MN;1t4R<1+TK@_W?|V% zfK$RBgu(#S)NGzoPQLu@aD!&!B67<}xeD4I{B8EKru}?<=)7y9CCy5&&jOOpVP;GD zX7l%Ugj@jo9uHcr%`MymJh-lk*5>%dU9AbTVf!%{D`eARu^0#UAF$kRH%~pgMYC}c zDQHdsryKljZPAFU((ALb9n^n|-Sek>;g9mo<|nFuyWV+U_u49}b@?({n_IZ&%g@>S zhgY4~jedVAsfbN;yWPCs-p)$DpM(1kSYFRcs()3jA{LQ?

mxxpHyRlac-*=Nw`- zgSkEXf~n8Ily5da6aR%4*X|qJQ~GbrkjJy{4}PXLn3K%uc%Y&JfcJmf+X0B~?@|$q zNI^8!_F-)t&NLDGwf3wl7qc(ro6Wx!+2z`Fy2*lg5kq`w8dSt0Qdm-U!U9q@fk@nm zDcw0r+qup##qRk(>egi&<(to+X};+jumIj|YE63lm(>rlpm^z|pOH4=5RrUJ`(+G? z(#^m!Esf@K*;Dz2kv|h87V*LbMXXu#Qx&j?7&mDFi_8>u5oc4rH;W2bWcE@4ix{K= r7MZ;=pHLJL5s|!6lTV`;7l8i*szh)b4fcYg00000NkvXXu0mjfk45-g delta 2508 zcmV;-2{ZPI(gNbq0+1ws6?#-ybVOxyV{&P5bZKvH004NLt(eJfBR3F+&(c#gX0CFe zWjx45m%vWo!%Xr9L^WC6EQ=esNS2>I2iaOI%dEBx9V7wYUo5g&TYqoK)_f<6&hM&-2TU+rO2hlDn>RKa9KiPvjNo2 zbO>C30533OTQ6kFK0=S81Ve5$RFxyh6}f(>P9bCs2BICR>>{G_gJt*>j8C*?KbwP4 zq8TcB`5r2h8tWT>YolMG6D@Ksx&v~LD6=2L*6*YSr)256dhnF46B|vrei#VRmaa?n z^Z^#dis~sL`>h6R83)yZ0|!h@1Y}%^X9~gds2lIz2N&a!LIc}o*~})h$#HVrIzerLw0w)37 zlM4fCe;iFFg)+nc=;aEtK-Y76#+Ftnw2zDw7(k+gr04Y{vuAGyu(Rm^cs>Na9Rkm$ zgXkfK2YAeAwqo$!U3%$x6p^#Z{&Oy$-AE1Y()%^GmFwiwFLA>9;xek6)=+-F_FPVl zea$JovH7LDy~@E9B5VT?r+L|<%;D}4*P*O2`S{8qRwei&Bf$fI0il+wW+^hpT;W?tkAkcfTIS{{wgR1S@grD=ACM^*^9sCH zA(EJ=NKjE63sZs;F9?e6!-X(toQXrb*|NAfHs(~;7?~P19xuu{Yu9#kuI25v=a-N! z{W#Cq#rx!a&*^)JD`0!MXIYWQ$amzFuYBbz-&DSTB+H}-JHt`u{n;u%6Zx%?u&cuB zb2j0yOVqcxAYmu0vFC{G_dx7w=}gWO$D7dY2t`C@DtkLfNPQ7jF29155Bc#$2qau| zmF@D)m;6*S;B-sVnJzoWQvr*JWaz#-tJ2QUb6I}*k`JRrxOr2#v(00!%Qsd2UFGxX z3`Z|PdVV&kfJH=P!t5e6Req-Pvq1$cA|hfy@)>0j5fRBb6|jhihyf~K5fKpsRKOx4 zA_izHN}18-U3sbLUqM7>D3evAD}PkLA|fINsDQ_DV9$=U_ukCp^{J$5MWto`GyS`W zh|C08y&Yjk+h@+;9SKJO@cO*Y&+)uIFD2!7X7xUf+0H+(XNT2#G{h^fz5qa1q$lC^ z$jK9QvrjIOTvo zHviy<2iY(*#Pzdg@%(LNTJ@W(rXZi;c-g|ENbWZ>O0B>DZfv4$Z zzUb~wd%VuiKb>@biD#kZDSz@ZFfizpaQt)h-^dmK00c})L_t(4U=fk*N!SZI;4iZP zR^2@x_zi%6erP20^XzdCa=N{n1JqMe>gUwqW&lc7S8`xq{kSDCR=WHRLqkUMD{igg z?Kj@xp8Hn;(BFS1?o*fMEWhB;DF9mj4zg|ke!dBZ898?@>2tdSHGeEBEt*vRmQug9 z`lX&Y9pLg=vw!h=Zeq*xo2c9H42ORmVE+dnb0QdGXedNOL&LNvVa>WvOl=$_*|=UZGb;RA>J2Dx|Rqa50`kKX7ot&!Brtz#+QY(9*Z@bYCV+1z)U zV0C~ucWqP)VOMJ;?5aQe;{^}AW9#b)v#?Al-(3D)YlO#K zR{%KW3b7^U>gqMzyCwkOl<U^=mOaGV8Ci=YUWzt_LY^iG{r9NYKfZ-+t0yhA)6MB zM%lUjHOuXG^YD}FG#eL@yyg^es=?pZ8VS29ygn<_LA}sDXTlf$DBo;;ytTw zsI*!ZFMpz?shMkk_>QeFz3#kkNfXJy%6|soqos?HW!{`;Y_U=sMvEOUYy0S6*Qoh;zsmLzZ#*Z5u@V0u~VwG2lP$ W8C|5HA&Kt*0000 Date: Wed, 8 May 2024 07:17:09 +0200 Subject: [PATCH 089/171] a new commit before i go on another system. --- code/__HELPERS/unsorted.dm | 2 +- code/controllers/subsystems/bullets.dm | 8 ++-- code/game/objects/items.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 57 +++++++++++++++++------ 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 4b955ba5c7..b2553b8b2d 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -581,7 +581,7 @@ Turf and target are seperate in case you want to teleport some distance from a t var/temp = limit2 limit2 = limit1 limit1 = temp - return (valuelimit2) + return !(valuelimit2) //returns random gauss number proc/GaussRand(var/sigma) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 985c0021e6..2111670716 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -233,9 +233,13 @@ SUBSYSTEM_DEF(bullets) while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep + trajectoryData[1] = bulletCoords[1] + trajectoryData[2] = bulletCoords[2] bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3]) + trajectoryData[3] = bulletCoords[1] + trajectoryData[4] = bulletCoords[2] x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) @@ -257,12 +261,8 @@ SUBSYSTEM_DEF(bullets) bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change bulletCoords[3] -= tz_change - trajectoryData[1] = projectile.pixel_x - trajectoryData[2] = projectile.pixel_y projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change - trajectoryData[3] = projectile.pixel_x - trajectoryData[4] = projectile.pixel_y bullet.updateLevel() if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) projectile.forceMove(moveTurf) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index fd28c6a6da..cae4a391e5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -129,7 +129,7 @@ GLOBAL_LIST(melleDamagesCache) /obj/item/hitbox_test/Initialize() . = ..() var/datum/hitboxDatum/Selfhitbox = new() - Selfhitbox.boundingBoxes += list(8,8,24,24,0,0) + Selfhitbox.boundingBoxes += list(list(-8,-8,8,8,0,0)) hitbox = Selfhitbox /obj/item/blockDamages(list/armorToDam, armorDiv, woundMult, defZone) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 990a5411ec..67ad0d411c 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -10,22 +10,49 @@ var/offsetY = 0 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection) - var/lineSlope = TRIGSLOPE(lineData[1], lineData[2], lineData[3],lineData[4]) - var/boxSlopeLeft - var/boxSlopeRight - var/valid = FALSE + var/global/lineSlope + /// Left Top , Left Bottom, Right Top , Right Bottom + var/list/boxSlopes = list(0,0,0,0) + var/global/minSlope + var/global/maxSlope + var/global/valid + lineSlope = TRIGSLOPE(lineData[3], lineData[4], lineData[1],lineData[2]) + minSlope = 99999 + maxSlope = -99999 + valid = FALSE + message_admins("lineData: [lineData[1]], [lineData[2]], [lineData[3]], [lineData[4]], slope : [lineSlope]") for(var/list/boundingData in boundingBoxes) - boxSlopeLeft = TRIGSLOPE(boundingData[1], boundingData[2], lineData[1], lineData[2]) - boxSlopeRight= TRIGSLOPE(boundingData[3], boundingData[4], lineData[1], lineData[2]) - // failed heuristic. Skip - if(!int_range(lineSlope, boxSlopeLeft, boxSlopeRight)) - continue - // checking X-axis - valid = max(lineData[1], lineData[3]) > min(boundingData[1], boundingData[3]) - valid &= min(lineData[1], lineData[3]) < max(boundingData[1], boundingData[3]) - // checking Y-axis - valid &= max(lineData[2], lineData[4]) > min(boundingData[2], boundingData[4]) - valid &= min(lineData[2], lineData[4]) < max(boundingData[2], boundingData[4]) + message_admins("boxData: [boundingData[1]], [boundingData[2]], [boundingData[3]], [boundingData[4]]") + boxSlopes[1]= TRIGSLOPE(boundingData[1], boundingData[4], lineData[1], lineData[2]) + boxSlopes[2]= TRIGSLOPE(boundingData[1], boundingData[2], lineData[1], lineData[2]) + boxSlopes[3] = TRIGSLOPE(boundingData[3], boundingData[4], lineData[1], lineData[2]) + boxSlopes[4] = TRIGSLOPE(boundingData[3], boundingData[2], lineData[1], lineData[2]) + for(var/slope in boxSlopes) + if(minSlope > slope) + minSlope = slope + if(maxSlope < slope) + maxSlope = slope + if(!(lineSlope < minSlope || lineSlope > maxSlope)) + // checking X-axis + valid = max(lineData[1], lineData[3]) >= min(boundingData[1], boundingData[3]) + if(valid == 0) + message_admins("Failed at X-axis 1") + continue + valid &= min(lineData[1], lineData[3]) <= max(boundingData[1], boundingData[3]) + if(valid == 0) + message_admins("Failed at X-axis 2") + continue + // checking Y-axis + valid &= max(lineData[2], lineData[4]) >= min(boundingData[2], boundingData[4]) + if(valid == 0) + message_admins("Failed at Y-axis 1") + continue + valid &= min(lineData[2], lineData[4]) <= max(boundingData[2], boundingData[4]) + if(valid == 0) + message_admins("Failed at Y-axis 2") + continue + else + message_admins("Failed at slope check, [lineSlope], [minSlope], [maxSlope]") if(!valid) continue return TRUE From 2824e44b144c8e55fa3aa4ca091cb6d6b707f877 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 8 May 2024 17:20:48 +0200 Subject: [PATCH 090/171] hhh --- code/controllers/subsystems/bullets.dm | 8 +- code/modules/projectiles/hitbox_datums.dm | 94 ++++++++++++----------- 2 files changed, 52 insertions(+), 50 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 2111670716..cf3a069a98 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -233,13 +233,13 @@ SUBSYSTEM_DEF(bullets) while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep - trajectoryData[1] = bulletCoords[1] - trajectoryData[2] = bulletCoords[2] + trajectoryData[1] = ((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1) + trajectoryData[2] = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1) bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3]) - trajectoryData[3] = bulletCoords[1] - trajectoryData[4] = bulletCoords[2] + trajectoryData[3] = ((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1) + trajectoryData[4] = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 67ad0d411c..b67d1e6975 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -9,55 +9,57 @@ var/offsetX = 0 var/offsetY = 0 -/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection) - var/global/lineSlope - /// Left Top , Left Bottom, Right Top , Right Bottom - var/list/boxSlopes = list(0,0,0,0) - var/global/minSlope - var/global/maxSlope - var/global/valid - lineSlope = TRIGSLOPE(lineData[3], lineData[4], lineData[1],lineData[2]) - minSlope = 99999 - maxSlope = -99999 - valid = FALSE - message_admins("lineData: [lineData[1]], [lineData[2]], [lineData[3]], [lineData[4]], slope : [lineSlope]") +/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom) + message_admins("LINEDATA: FirstPoint ([lineData[1]], [lineData[2]]) SecondPoint ([lineData[3]], [lineData[4]])]") for(var/list/boundingData in boundingBoxes) - message_admins("boxData: [boundingData[1]], [boundingData[2]], [boundingData[3]], [boundingData[4]]") - boxSlopes[1]= TRIGSLOPE(boundingData[1], boundingData[4], lineData[1], lineData[2]) - boxSlopes[2]= TRIGSLOPE(boundingData[1], boundingData[2], lineData[1], lineData[2]) - boxSlopes[3] = TRIGSLOPE(boundingData[3], boundingData[4], lineData[1], lineData[2]) - boxSlopes[4] = TRIGSLOPE(boundingData[3], boundingData[2], lineData[1], lineData[2]) - for(var/slope in boxSlopes) - if(minSlope > slope) - minSlope = slope - if(maxSlope < slope) - maxSlope = slope - if(!(lineSlope < minSlope || lineSlope > maxSlope)) - // checking X-axis - valid = max(lineData[1], lineData[3]) >= min(boundingData[1], boundingData[3]) - if(valid == 0) - message_admins("Failed at X-axis 1") - continue - valid &= min(lineData[1], lineData[3]) <= max(boundingData[1], boundingData[3]) - if(valid == 0) - message_admins("Failed at X-axis 2") - continue - // checking Y-axis - valid &= max(lineData[2], lineData[4]) >= min(boundingData[2], boundingData[4]) - if(valid == 0) - message_admins("Failed at Y-axis 1") - continue - valid &= min(lineData[2], lineData[4]) <= max(boundingData[2], boundingData[4]) - if(valid == 0) - message_admins("Failed at Y-axis 2") - continue - else - message_admins("Failed at slope check, [lineSlope], [minSlope], [maxSlope]") - if(!valid) - continue - return TRUE + if(lineIntersect(lineData, list(boundingData[1], boundingData[2], boundingData[1], boundingData[4]))) + return TRUE + if(lineIntersect(lineData, list(boundingData[1], boundingData[2], boundingData[3], boundingData[2]))) + return TRUE + if(lineIntersect(lineData, list(boundingData[1], boundingData[4], boundingData[3], boundingData[4]))) + return TRUE + if(lineIntersect(lineData, list(boundingData[3], boundingData[2], boundingData[3], boundingData[4]))) + return TRUE return FALSE +/* +boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { + + // calculate the distance to intersection point + float uA = ((x4-x3)*(y1-y3) - (y4-y3)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1)); + float uB = ((x2-x1)*(y1-y3) - (y2-y1)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1)); + + // if uA and uB are between 0-1, lines are colliding + if (uA >= 0 && uA <= 1 && uB >= 0 && uB <= 1) { + + // optionally, draw a circle where the lines meet + float intersectionX = x1 + (uA * (x2-x1)); + float intersectionY = y1 + (uA * (y2-y1)); + fill(255,0,0); + noStroke(); + ellipse(intersectionX,intersectionY, 20,20); + + return true; + } + return false; +} +*/ +// Based off the script above. +/datum/hitboxDatum/proc/lineIntersect(list/firstLine , list/secondLine) + var/global/firstRatio + var/global/secondRatio + firstRatio = ((secondLine[3] - secondLine[1]) * (firstLine[2] - secondLine[2]) - (secondLine[4] - secondLine[2]) * (firstLine[1] - secondLine[1])) + firstRatio /= ((secondLine[4] - secondLine[2]) * (firstLine[3] - firstLine[1]) - (secondLine[3] - secondLine[1]) * (firstLine[4] - firstLine[2])) + secondRatio = ((firstLine[3] - firstLine[1]) * (firstLine[2] - secondLine[2]) - (firstLine[4] - firstLine[2]) * (firstLine[1] - secondLine[1])) + secondRatio /= ((secondLine[4] - secondLine[2]) * (firstLine[3] - firstLine[1]) - (secondLine[3] - secondLine[1]) * (firstLine[4] - firstLine[2])) + if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) + //return list(firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]), firstLine[2] + firstRatio * (firstLine[4] - firstLine[2])) + return TRUE + else + return FALSE + + + From 2287906429c5d67c4467a25000082dc263c11ca3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 8 May 2024 20:53:39 +0200 Subject: [PATCH 091/171] aaaaaaaaaaah --- code/controllers/subsystems/bullets.dm | 8 ++++---- code/game/objects/items.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index cf3a069a98..2111670716 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -233,13 +233,13 @@ SUBSYSTEM_DEF(bullets) while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep - trajectoryData[1] = ((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1) - trajectoryData[2] = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1) + trajectoryData[1] = bulletCoords[1] + trajectoryData[2] = bulletCoords[2] bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3]) - trajectoryData[3] = ((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1) - trajectoryData[4] = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1) + trajectoryData[3] = bulletCoords[1] + trajectoryData[4] = bulletCoords[2] x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cae4a391e5..6216096061 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -129,7 +129,7 @@ GLOBAL_LIST(melleDamagesCache) /obj/item/hitbox_test/Initialize() . = ..() var/datum/hitboxDatum/Selfhitbox = new() - Selfhitbox.boundingBoxes += list(list(-8,-8,8,8,0,0)) + Selfhitbox.boundingBoxes += list(list(-8,-8,16,16,0,0)) hitbox = Selfhitbox /obj/item/blockDamages(list/armorToDam, armorDiv, woundMult, defZone) From 40809ef303b6671124f9c77a88c6780c33d0afb6 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 9 May 2024 07:23:23 +0200 Subject: [PATCH 092/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 2111670716..66f675b6ab 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -240,6 +240,7 @@ SUBSYSTEM_DEF(bullets) bulletCoords[3] += (bulletRatios[3]) trajectoryData[3] = bulletCoords[1] trajectoryData[4] = bulletCoords[2] + message_admins("trajectory data for bullet : [trajectoryData[1]] , [trajectoryData[2]] ===== [trajectoryData[3]], [trajectoryData[4]]") x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) From f339e0896fcf3311dabdda946a90ccf4ab6991a7 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 9 May 2024 18:03:31 +0200 Subject: [PATCH 093/171] a --- code/controllers/subsystems/bullets.dm | 8 ++++---- code/modules/projectiles/hitbox_datums.dm | 11 ++++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 66f675b6ab..292d2edb87 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -233,13 +233,13 @@ SUBSYSTEM_DEF(bullets) while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep - trajectoryData[1] = bulletCoords[1] - trajectoryData[2] = bulletCoords[2] + trajectoryData[1] = bulletCoords[1] + projectile.x * 32 + trajectoryData[2] = bulletCoords[2] + projectile.y * 32 bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3]) - trajectoryData[3] = bulletCoords[1] - trajectoryData[4] = bulletCoords[2] + trajectoryData[3] = bulletCoords[1] + projectile.x * 32 + trajectoryData[4] = bulletCoords[2] + projectile.y * 32 message_admins("trajectory data for bullet : [trajectoryData[1]] , [trajectoryData[2]] ===== [trajectoryData[3]], [trajectoryData[4]]") x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index b67d1e6975..a5bbc32c79 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -8,17 +8,18 @@ /// global offsets , applied to all bounding boxes equally var/offsetX = 0 var/offsetY = 0 + var/atom/owner -/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom) +/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner) message_admins("LINEDATA: FirstPoint ([lineData[1]], [lineData[2]]) SecondPoint ([lineData[3]], [lineData[4]])]") for(var/list/boundingData in boundingBoxes) - if(lineIntersect(lineData, list(boundingData[1], boundingData[2], boundingData[1], boundingData[4]))) + if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[1] + owner.x * 32, boundingData[4]))) return TRUE - if(lineIntersect(lineData, list(boundingData[1], boundingData[2], boundingData[3], boundingData[2]))) + if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2], boundingData[3] + owner.x * 32, boundingData[2]))) return TRUE - if(lineIntersect(lineData, list(boundingData[1], boundingData[4], boundingData[3], boundingData[4]))) + if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[4], boundingData[3] + owner.x * 32, boundingData[4]))) return TRUE - if(lineIntersect(lineData, list(boundingData[3], boundingData[2], boundingData[3], boundingData[4]))) + if(lineIntersect(lineData, list(boundingData[3] + owner.x * 32, boundingData[2], boundingData[3] + owner.x * 32, boundingData[4]))) return TRUE return FALSE From 88acaf183289fe5fdc0396f646a1ba184225d0a6 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 11 May 2024 03:31:20 +0200 Subject: [PATCH 094/171] aaaaaaaaah --- code/controllers/subsystems/bullets.dm | 13 ++++++++----- code/game/objects/items.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 13 ++++++++----- code/modules/projectiles/projectile.dm | 2 +- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 292d2edb87..4250728d9f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -233,17 +233,18 @@ SUBSYSTEM_DEF(bullets) while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep - trajectoryData[1] = bulletCoords[1] + projectile.x * 32 - trajectoryData[2] = bulletCoords[2] + projectile.y * 32 + trajectoryData[1] = projectile.x * 32 + projectile.pixel_x + 16 + trajectoryData[2] = projectile.y * 32 + projectile.pixel_y + 16 bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3]) - trajectoryData[3] = bulletCoords[1] + projectile.x * 32 - trajectoryData[4] = bulletCoords[2] + projectile.y * 32 - message_admins("trajectory data for bullet : [trajectoryData[1]] , [trajectoryData[2]] ===== [trajectoryData[3]], [trajectoryData[4]]") + //message_admins("[bulletCoords[1]], [bulletCoords[2]]") + //message_admins("trajectory data for bullet : [trajectoryData[1]] , [trajectoryData[2]] ===== [trajectoryData[3]], [trajectoryData[4]]") x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) + trajectoryData[3] = projectile.x * 32 + bulletRatios[1] * pixelsThisStep + trajectoryData[4] = projectile.y * 32 + bulletRatios[2] * pixelsThisStep //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) @@ -261,6 +262,8 @@ SUBSYSTEM_DEF(bullets) bullet.lastChanges[3] += tz_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change + //trajectoryData[3] += PPT * tx_change + //trajectoryData[4] += PPT * ty_change bulletCoords[3] -= tz_change projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 6216096061..174cbe6800 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -129,7 +129,7 @@ GLOBAL_LIST(melleDamagesCache) /obj/item/hitbox_test/Initialize() . = ..() var/datum/hitboxDatum/Selfhitbox = new() - Selfhitbox.boundingBoxes += list(list(-8,-8,16,16,0,0)) + Selfhitbox.boundingBoxes += list(list(8,8,24,24,0,0)) hitbox = Selfhitbox /obj/item/blockDamages(list/armorToDam, armorDiv, woundMult, defZone) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index a5bbc32c79..8f01e264e8 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -13,18 +13,21 @@ /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner) message_admins("LINEDATA: FirstPoint ([lineData[1]], [lineData[2]]) SecondPoint ([lineData[3]], [lineData[4]])]") for(var/list/boundingData in boundingBoxes) - if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[1] + owner.x * 32, boundingData[4]))) + if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[1] + owner.x * 32, boundingData[4] + owner.y * 32))) + message_admins("checking left line [boundingData[1] + owner.x * 32], [boundingData[2] + owner.y * 32], [boundingData[1] + owner.x * 32], [boundingData[4] + owner.y * 32] ") return TRUE - if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2], boundingData[3] + owner.x * 32, boundingData[2]))) + if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[3] + owner.x * 32, boundingData[2] + owner.y * 32))) return TRUE - if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[4], boundingData[3] + owner.x * 32, boundingData[4]))) + if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[4] + owner.y * 32, boundingData[3] + owner.x * 32, boundingData[4] + owner.y * 32))) return TRUE - if(lineIntersect(lineData, list(boundingData[3] + owner.x * 32, boundingData[2], boundingData[3] + owner.x * 32, boundingData[4]))) + if(lineIntersect(lineData, list(boundingData[3] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[3] + owner.x * 32, boundingData[4] + owner.y * 32))) return TRUE return FALSE /* -boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { +boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) + (float x3, float y3, float x4, float y4) { + // calculate the distance to intersection point float uA = ((x4-x3)*(y1-y3) - (y4-y3)*(x1-x3)) / ((y4-y3)*(x2-x1) - (x4-x3)*(y2-y1)); diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 819a25255b..694042d044 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -512,7 +512,7 @@ GLOBAL_LIST(projectileDamageConstants) for(var/i in 1 to length(hittingList)) var/obj/target = hittingList[i] if(istype(target, /obj/item/hitbox_test)) - message_admins("INTERSECTS HITBOX , RETURNED [target.hitbox.intersects(trajectoryData, target.dir)]") + message_admins("INTERSECTS HITBOX , RETURNED [target.hitbox.intersects(trajectoryData, target.dir, 0, target)]") if(target.bullet_act(src, def_zone) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP From 4b9df0545925cb91225ed19471bd1e93a1235afd Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 11 May 2024 17:21:36 +0200 Subject: [PATCH 095/171] i love hitboxes & trigonometry (!) --- code/controllers/subsystems/bullets.dm | 9 +++++---- code/modules/projectiles/hitbox_datums.dm | 20 +++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 4250728d9f..c57db443d8 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -230,11 +230,13 @@ SUBSYSTEM_DEF(bullets) /// but less performant A more performant version would be to use the same algorithm as throwing for determining which turfs to "intersect" /// Im using this implementation because im getting skill issued trying to implement the same one as throwing(i had to rewrite this 4 times already) /// and also because it has.. much more information about the general trajectory stored SPCR - 2024 + trajectoryData[1] = projectile.x * 32 + projectile.pixel_x + 16 + trajectoryData[2] = projectile.y * 32 + projectile.pixel_y + 16 + trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] + trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel pixelsToTravel -= pixelsThisStep - trajectoryData[1] = projectile.x * 32 + projectile.pixel_x + 16 - trajectoryData[2] = projectile.y * 32 + projectile.pixel_y + 16 bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3]) @@ -243,8 +245,7 @@ SUBSYSTEM_DEF(bullets) x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) - trajectoryData[3] = projectile.x * 32 + bulletRatios[1] * pixelsThisStep - trajectoryData[4] = projectile.y * 32 + bulletRatios[2] * pixelsThisStep + //message_admins("TRAJ : [trajectoryData[3]] [trajectoryData[4]]") //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 8f01e264e8..c24a375673 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -1,4 +1,4 @@ -#define BBOX(x1,y1,x2,y2,offsetX,offsetY) list(x1,y1,x2,y2,offsetX,offsetY) +#define BBOX(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) list(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) #define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) #define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) @@ -10,23 +10,25 @@ var/offsetY = 0 var/atom/owner +/// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner) - message_admins("LINEDATA: FirstPoint ([lineData[1]], [lineData[2]]) SecondPoint ([lineData[3]], [lineData[4]])]") + var/global/worldX + var/global/worldY + worldX = owner.x * 32 + worldY = owner.y * 32 for(var/list/boundingData in boundingBoxes) - if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[1] + owner.x * 32, boundingData[4] + owner.y * 32))) - message_admins("checking left line [boundingData[1] + owner.x * 32], [boundingData[2] + owner.y * 32], [boundingData[1] + owner.x * 32], [boundingData[4] + owner.y * 32] ") + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) return TRUE - if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[3] + owner.x * 32, boundingData[2] + owner.y * 32))) + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) return TRUE - if(lineIntersect(lineData, list(boundingData[1] + owner.x * 32, boundingData[4] + owner.y * 32, boundingData[3] + owner.x * 32, boundingData[4] + owner.y * 32))) + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) return TRUE - if(lineIntersect(lineData, list(boundingData[3] + owner.x * 32, boundingData[2] + owner.y * 32, boundingData[3] + owner.x * 32, boundingData[4] + owner.y * 32))) + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) return TRUE return FALSE /* -boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) - (float x3, float y3, float x4, float y4) { +boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { // calculate the distance to intersection point From 9ffaaf7769314143571d75fb754f25d75491e07c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 13 May 2024 02:32:43 +0200 Subject: [PATCH 096/171] more fixes ,human hitbox and proper visualization --- code/__DEFINES/misc.dm | 4 +++ code/game/atoms_movable.dm | 9 +++++++ code/game/objects/items.dm | 2 ++ code/game/objects/objs.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 16 +++++++++++- code/modules/projectiles/hitbox_datums.dm | 23 +++++++++++++++--- icons/hitbox.dmi | Bin 0 -> 193 bytes icons/obj/items.dmi | Bin 43273 -> 43276 bytes 8 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 icons/hitbox.dmi diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 5248fdc3cd..7bee383e0d 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -367,3 +367,7 @@ #define TTS_SEED_DEFAULT_FEMALE "Female_1" #define TTS_SEED_DEFAULT_MALE "Male_1" #define TTS_SEED_ANNOUNCER "Robot_2" + +#define BBOX(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) list(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) +#define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) +#define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 66a7d88b5a..e27b0b10da 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -15,6 +15,8 @@ GLOBAL_VAR_INIT(Debug,0) var/throw_range = 7 var/moved_recently = 0 var/obj/item/grab/grabbedBy + /// Holds the hitbox datum if theres any + var/datum/hitboxDatum/hitbox var/item_state // Used to specify the item state for the on-mob overlays. var/inertia_dir = 0 var/can_anchor = TRUE @@ -72,6 +74,13 @@ GLOBAL_VAR_INIT(Debug,0) /atom/movable/proc/entered_with_container(var/atom/old_loc) return +/atom/movable/Initialize() + if(ispath(hitbox)) + hitbox = new hitbox() + hitbox.owner = src + . = ..() + + // Gets the top-atom that contains us, doesn't care about how deeply nested a item is // If stopType is defined , it will stop at the first object that is the type of stopType /atom/proc/getContainingAtom(stopType = null) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 174cbe6800..986b3ce15f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -130,6 +130,8 @@ GLOBAL_LIST(melleDamagesCache) . = ..() var/datum/hitboxDatum/Selfhitbox = new() Selfhitbox.boundingBoxes += list(list(8,8,24,24,0,0)) + Selfhitbox.owner = src + Selfhitbox.visualize() hitbox = Selfhitbox /obj/item/blockDamages(list/armorToDam, armorDiv, woundMult, defZone) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b897583bf9..264e1f0656 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -2,7 +2,6 @@ //Used to store information about the contents of the object. var/list/matter var/list/matter_reagents - var/datum/hitboxDatum/hitbox var/volumeClass // Size of the object. var/unacidable = 0 //universal "unacidabliness" var, here so you can use it in any obj. animate_movement = 2 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6227fe86dc..563c7484e8 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -6,12 +6,26 @@ icon_state = "body_m_s" /// everyone is 65 KGs weight = 65000 + hitbox = /datum/hitboxDatum/human var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_lying_buckled_and_verb_status() call. var/using_scope // This is not very good either, because I've copied it. Sorry. +/datum/hitboxDatum/human + boundingBoxes = list( + BBOX(8,10,24,16,0,0,0,0), /// chest + arms + BBOX(9,17,23,19,0,0,0,0), /// upper chest + upper arms + BBOX(11,20,21,21,0,0,0,0), // neck/upper chest + BBOX(12,22,20,25,0,0,0,0), // head + BBOX(13,26,19,27,0,0,0,0), // bald ass head top + BBOX(12,0,15,9,0,0,0,0), // left leg + BBOX(10,0,11,2,0,0,0,0), // left toe + BBOX(17,0,20,9,0,0,0,0), // right leg + BBOX(21,0,21,21,0,0,0,0), // right toe + ) + /mob/living/carbon/human/Initialize(new_loc, new_species) hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100", ON_MOB_HUD_LAYER) hud_list[STATUS_HUD] = image('icons/mob/hud.dmi', src, "hudhealthy", ON_MOB_HUD_LAYER) @@ -1408,7 +1422,7 @@ var/list/rank_prefix = list(\ reset_view(A) /mob/living/carbon/human/proc/resuscitate() - + var/obj/item/organ/internal/vital/heart_organ = random_organ_by_process(OP_HEART) var/obj/item/organ/internal/vital/brain_organ = random_organ_by_process(BP_BRAIN) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index c24a375673..adafee808f 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -1,6 +1,4 @@ -#define BBOX(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) list(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) -#define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) -#define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) + /datum/hitboxDatum @@ -65,6 +63,25 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return FALSE +/datum/hitboxDatum/proc/visualize() + var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_TITANIUM, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_GRAY, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) + var/chosenColor = pick(availableColors) + for(var/list/hitbox in boundingBoxes) + var/icon/Icon = icon('icons/hitbox.dmi', "box") + var/multX = hitbox[3] - hitbox[1] + var/multY = hitbox[4] - hitbox[2] + Icon.Scale(multX, multY) + var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") + newOverlay.color = chosenColor + availableColors.Remove(chosenColor) + chosenColor = pick(availableColors) + newOverlay.pixel_x = hitbox[1] + newOverlay.pixel_y = hitbox[2] + owner.overlays.Add(newOverlay) + + + + diff --git a/icons/hitbox.dmi b/icons/hitbox.dmi new file mode 100644 index 0000000000000000000000000000000000000000..22d38a044b6c33c879df086fd3e2d6263f948c14 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?juK)l4Uw%aT1dy9t6%tY6 zl3JWxlvz-cnV-kNP%$Sste~j$`eA(FRz?(;tj!X(s@YdAa@6_3Cth#xH#3Hq|8iwYghr+@Nz7{h|b26OCl6X_~ m__`6$IxbHa#}JO0$q7I<69eOy!jxq|7K5j&pUXO@geCxH4MRr& literal 0 HcmV?d00001 diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 7410428192625257c54b3073e94d74fe18373a4a..aa1b6e31652be84946eabe446608b043ba02cf3f 100755 GIT binary patch delta 1818 zcmV+#2j%#Q(gKXq0I07BU&8|`qe8BFS?EOp#WrrGra~zunWl_1gHk9U zAtWy9Ov%yEJOHsvF{=DwO6zRFUE}NCa?#-DnAE(hy2x zA(}C56K4Yem-^xV)Bk_Y`J0piwwHTWe^>a7+#{!a(e$4nB8F%NEFvOefC^YdM8p6U zu!x9=0V-e-5fKAaz#<|d2B?5VL_`cw0gH%;7@+%rMP{(5fA;P>J^Lr|Pz)xk( zeFdEzxRJko^DnJee)kdp{qez!=YPFzll9UYEgm=W7r%JG0{HTk=kofT=8_*g+u^BR z9kc)ruC23ze`h;90F}OF*3I+g190Z!e$D1YL<%J9_W_4P)z5B zpWc)<(A$sYviXG_eE4ZB>wrEz|INR>$(HeP?wB`^e}4OI#?Q9UU9RSLosRPSwr2sj zFfy9<+RGE?UH$(9{NbireC@yGy@7$8GA$3K000DYe@R3^RLAQ(_0F90D}Bo>UxlC1 z(J>C*R7UV@hbQ&1QY>J%m!P#3rAX;Yn*oPI)fT||2bKWe0Pw%h+lXGAKjT5p_Y821 z7AmVkoIBA0K;?!yjvZ;4u>_{emA_?t+-QF7PwV;P8-L=#N7e%{GIAm1T{pUxUv~T) z0Gnh~um9^Ta?Le9NpgtJeYG z_bn&9N&M0p~M7T@$Ad3(<$Fm! z;sMz6SlH@p@8CAz-gR|!wkI#{>P(pp+mFFiA)A&+B-pq2RmXG<(tjVC3v>Ov-8UKl))=AelBb*4T3^ZI*PSiUT;&qy0_h=^OVei=imY%{Q2 zOQVHc_Edgxz>%07*qo IM6N<$g24KmPyhe` delta 1815 zcmV+y2k7{W(gKOn0@V0u~VwF+c?@A|hgdwxSd6yU=a}!19Ts-NCpclfA5?2m&0Fa`|y_irWO&& zFU^1_aPsJD6Ar+WJ%20dUR!0^|4jcaA|kUvPG`WK?f-NJ?`R|nfY;}Beoy4}c`2=U zD5tZ7eB|%k`keL3pI!o>JKCG_{EIubSTDWa;L1n-qUR4=0AIiIY*wGsbn^WdT3qF; z{T9HHwN;k?e?p53pwzR}x?}D<0M38Xt=XK2NRFiaKHy-W+*(#v0zhe5VA6whc7%B1 z=`BeEz5Q4wTYtZck3Nf}9ni<;pL**Q+lGg^ckW!ixPCq5XH(#3dChNoFU;?D{1$-A z1A|Ggy*6?wum695zs#w`)BH#N)zg#liXvWx000DVe@R3^RCrzQzBBFoQqNM$Q{rWC zaEK#witt}(aV0)B+Y0z*EJ154N|D(sX$Bk&lv@DnA6X212f+WnY$AMR-h>Ca)X~F9 z8YnFbaPe#l0HqtMIC;Eb!V(xSQ~tK$VWat#Kd6MPzpFnaA;%KHunYgtxSGOheQWdUo$T}wFI6U9^F<;k8Xc$QjgR<8rV z>sdzd@t_6p@h8o6UL2TJWh^3+Ye_TUO0Un_{%b$I;p9`pD^~q5;X!)Cx8d1PufgWNH99$wFV?0I1q z_1kuE_S->D{QWc^gu)CDhiPnVobe^B8L)`tQ_2!_Fi>vw#YQN0&vzd4Eian#fg}Ax zY})=bXAT{wFE&D3H2rexc*-}M4`U^~X7xID_g^AZ6Xef__Hp!R1Hh~)VHL25HDk-!jg5`e)xFG{2kUj!w1~)$koGF*V)y(T=OLjtT;vSs zeX$YxfGyn3dq4cg8RXOb+_`5LXAT`te<_q~DBnze_u4A!m^F%TYc0O5wH!Ngkju?2 z+#gs4z>+0J_*dQwKwaI-&f|6oKT{i=v9nl(;L3cITzX&8{y&7 zRkTGTuC{2z)o}HzNe}$m-dB@mVcAl?x%^|+D8F(21i&d*h%Y(U)NE$c<{*Gmf5IPx z!T{9NY@Sk1zWnWQgJ$C*a?41$3fdn0ZT7OJ{d|4sylbK*%}TG&0+P;QW=r{I^Y?ay zTmbtX4_d9wE!+b^3tqHSX`!N_RWYc1?7zg(su-tApPd&RuvvCnAXifpA z8~kl;(TJ$9>Q)QjEor+nd$fAY=dC#rwD-g#g5+A6Dc`7&CYTe#=T&)NHjSDn|5 zet#*ch)r|5-Mru4&Pu7( zjplOMQ~8CFKNBPt@xlc~tXcC@6|jgHH)#Qj%oKJJXH&j6iwam|_EG_h7^DIgnY}Wf zP!tgnk-Sj>i-?FApaK>V5ivjoEFvOefC^YdM8tsq1FA%D8x8h?4Wj@6002ovPDHLk FV1n@4iW2|; From 6d9e61d10c66fefaa55c9567d0009ac67b3630a1 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 18 May 2024 14:12:47 +0200 Subject: [PATCH 097/171] kk --- code/_compile_options.dm | 2 ++ code/modules/projectiles/hitbox_datums.dm | 2 +- code/modules/projectiles/projectile.dm | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 6a88d4af66..711657d88d 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -48,6 +48,8 @@ // 2 for preloading absolutely everything; //#define LOWMEMORYMODE 1 +#define LOWMEMORYMODE 1 + #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" #endif diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index adafee808f..f1ece13c5c 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -64,7 +64,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/proc/visualize() - var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_TITANIUM, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_GRAY, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) + var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) var/chosenColor = pick(availableColors) for(var/list/hitbox in boundingBoxes) var/icon/Icon = icon('icons/hitbox.dmi', "box") diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 694042d044..799c42ba7c 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -511,8 +511,8 @@ GLOBAL_LIST(projectileDamageConstants) for(var/i in 1 to length(hittingList)) var/obj/target = hittingList[i] - if(istype(target, /obj/item/hitbox_test)) - message_admins("INTERSECTS HITBOX , RETURNED [target.hitbox.intersects(trajectoryData, target.dir, 0, target)]") + if(target.hitbox) + message_admins("hitbox intersection returns [target.hitbox.intersects(trajectoryData, target.dir, 0, target)]") if(target.bullet_act(src, def_zone) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP From f9e17cfe38522a8cec01d679f15a275de8101328 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 18 May 2024 14:14:55 +0200 Subject: [PATCH 098/171] a --- code/_compile_options.dm | 2 -- code/game/turfs/turf.dm | 3 --- 2 files changed, 5 deletions(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 711657d88d..eb60858483 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,8 +46,6 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -//#define LOWMEMORYMODE 1 - #define LOWMEMORYMODE 1 #ifdef LOWMEMORYMODE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 58855476c9..f12820e193 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -84,9 +84,6 @@ /turf/Enter(atom/movable/mover as mob|obj, atom/forget as mob|obj|turf|area) if(mover.atomFlags & AF_VISUAL_MOVE) return TRUE - if(movement_disabled && usr.ckey != movement_disabled_exception) - to_chat(usr, SPAN_WARNING("Movement is admin-disabled.")) //This is to identify lag problems - return ..() From 957c1002d00b21d2486bdbc5b4c04808fab1e61b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 18 May 2024 14:35:09 +0200 Subject: [PATCH 099/171] better hitbox --- code/game/machinery/doors/multi_tile.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 3 ++- code/modules/projectiles/hitbox_datums.dm | 13 ++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index a94c141706..8e770cc56d 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -47,7 +47,7 @@ /obj/machinery/filler_object name = "" icon = 'icons/obj/doors/rapid_pdoor.dmi' - icon_state = "pdoor1" + icon_state = "" density = FALSE anchored = TRUE diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 563c7484e8..560d4b1b5b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -20,10 +20,11 @@ BBOX(11,20,21,21,0,0,0,0), // neck/upper chest BBOX(12,22,20,25,0,0,0,0), // head BBOX(13,26,19,27,0,0,0,0), // bald ass head top + BBOX(15,28,18,28,0,0,0,0), /// balder ass head top BBOX(12,0,15,9,0,0,0,0), // left leg BBOX(10,0,11,2,0,0,0,0), // left toe BBOX(17,0,20,9,0,0,0,0), // right leg - BBOX(21,0,21,21,0,0,0,0), // right toe + BBOX(21,0,22,2,0,0,0,0), // right toe ) /mob/living/carbon/human/Initialize(new_loc, new_species) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index f1ece13c5c..c794a652bd 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -65,18 +65,17 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/proc/visualize() var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) - var/chosenColor = pick(availableColors) + var/chosenColor = pick_n_take(availableColors) for(var/list/hitbox in boundingBoxes) var/icon/Icon = icon('icons/hitbox.dmi', "box") - var/multX = hitbox[3] - hitbox[1] - var/multY = hitbox[4] - hitbox[2] + var/multX = hitbox[3] - hitbox[1] + 1 + var/multY = hitbox[4] - hitbox[2] + 1 Icon.Scale(multX, multY) var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") newOverlay.color = chosenColor - availableColors.Remove(chosenColor) - chosenColor = pick(availableColors) - newOverlay.pixel_x = hitbox[1] - newOverlay.pixel_y = hitbox[2] + chosenColor = pick_n_take(availableColors) + newOverlay.pixel_x = hitbox[1] - 1 + newOverlay.pixel_y = hitbox[2] - 1 owner.overlays.Add(newOverlay) From a94031484e6d9a4b8d2ea2ab577af6550cbc703e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 18 May 2024 15:05:03 +0200 Subject: [PATCH 100/171] aah --- cev_eris.dme | 1 + code/__DEFINES/spawner/___byondbase.dm | 8 +++ code/__DEFINES/subsystems.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 49 +++++++++++++++---- code/modules/projectiles/hitbox_datums.dm | 4 +- 5 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 code/__DEFINES/spawner/___byondbase.dm diff --git a/cev_eris.dme b/cev_eris.dme index 208b454729..9c9c0e8a53 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -93,6 +93,7 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\spawner\___byondbase.dm" #include "code\__DEFINES\spawner\_spawner.dm" #include "code\__DEFINES\spawner\excelsior.dm" #include "code\__DEFINES\spawner\frozen_star.dm" diff --git a/code/__DEFINES/spawner/___byondbase.dm b/code/__DEFINES/spawner/___byondbase.dm new file mode 100644 index 0000000000..4a635cfe47 --- /dev/null +++ b/code/__DEFINES/spawner/___byondbase.dm @@ -0,0 +1,8 @@ +#define NORTH 1 +#define SOUTH 2 +#define EAST 4 +#define WEST 8 +#define LISTNORTH "1" +#define LISTSOUTH "2" +#define LISTEAST "4" +#define LISTWEST "8" diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2b3b5c4b33..dcae2ffc14 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -124,7 +124,6 @@ #define INIT_ORDER_XENOARCH -50 #define INIT_ORDER_PERSISTENCE -100 #define INIT_OPEN_SPACE -150 -#define INIT_ORDER_LIGHTING -160 #define INIT_ORDER_LATELOAD -180 #define INIT_ORDER_CHAT -185 #define INIT_ORDER_SHUTTLE -190 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 560d4b1b5b..ef3bbaab6f 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -15,16 +15,45 @@ /datum/hitboxDatum/human boundingBoxes = list( - BBOX(8,10,24,16,0,0,0,0), /// chest + arms - BBOX(9,17,23,19,0,0,0,0), /// upper chest + upper arms - BBOX(11,20,21,21,0,0,0,0), // neck/upper chest - BBOX(12,22,20,25,0,0,0,0), // head - BBOX(13,26,19,27,0,0,0,0), // bald ass head top - BBOX(15,28,18,28,0,0,0,0), /// balder ass head top - BBOX(12,0,15,9,0,0,0,0), // left leg - BBOX(10,0,11,2,0,0,0,0), // left toe - BBOX(17,0,20,9,0,0,0,0), // right leg - BBOX(21,0,22,2,0,0,0,0), // right toe + LISTNORTH = list( + BBOX(8,10,24,16,0,0,0,0), /// chest + arms + BBOX(9,17,23,19,0,0,0,0), /// upper chest + upper arms + BBOX(11,20,21,21,0,0,0,0), // neck/upper chest + BBOX(12,22,20,25,0,0,0,0), // head + BBOX(13,26,19,27,0,0,0,0), // bald head top + BBOX(15,28,18,28,0,0,0,0), /// balder head top + BBOX(12,0,15,9,0,0,0,0), // left leg + BBOX(10,0,11,2,0,0,0,0), // left toe + BBOX(17,0,20,9,0,0,0,0), // right leg + BBOX(21,0,22,2,0,0,0,0) // right to + ), + LISTSOUTH = list( + BBOX(8,10,24,16,0,0,0,0), /// chest + arms + BBOX(9,17,23,19,0,0,0,0), /// upper chest + upper arms + BBOX(11,20,21,21,0,0,0,0), // neck/upper chest + BBOX(12,22,20,25,0,0,0,0), // head + BBOX(13,26,19,27,0,0,0,0), // bald head top + BBOX(15,28,18,28,0,0,0,0), /// balder head top + BBOX(12,0,15,9,0,0,0,0), // left leg + BBOX(10,0,11,2,0,0,0,0), // left toe + BBOX(17,0,20,9,0,0,0,0), // right leg + BBOX(21,0,22,2,0,0,0,0) // right to + ), + LISTEAST = list( + BBOX(14,1,18,28,0,0,0,0), + BBOX(13,12,13,21,0,0,0,0), + BBOX(12,15,12,20,0,0,0,0), + BBOX(19,1,20,3,0,0,0,0), + BBOX(19,10,20,27,0,0,0,0) + ), + LISTWEST = list( + BBOX(15,1,19,28,0,0,0,0), + BBOX(13,1,14,3,0,0,0,0), + BBOX(20,12,20,21,0,0,0,0), + BBOX(21,15,21,20,0,0,0,0), + BBOX(14,10,14,28,0,0,0,0), + BBOX(13,12,13,27,0,0,0,0) + ) ) /mob/living/carbon/human/Initialize(new_loc, new_species) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index c794a652bd..3fcb8cc759 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -14,7 +14,7 @@ var/global/worldY worldX = owner.x * 32 worldY = owner.y * 32 - for(var/list/boundingData in boundingBoxes) + for(var/list/boundingData in boundingBoxes[num2text(owner.dir)]) if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) return TRUE if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) @@ -66,7 +66,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/proc/visualize() var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) var/chosenColor = pick_n_take(availableColors) - for(var/list/hitbox in boundingBoxes) + for(var/list/hitbox in boundingBoxes[num2text(owner.dir)]) var/icon/Icon = icon('icons/hitbox.dmi', "box") var/multX = hitbox[3] - hitbox[1] + 1 var/multY = hitbox[4] - hitbox[2] + 1 From f62e7520a5374b132110b3c40d92b26879d7298c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 19 May 2024 05:26:16 +0200 Subject: [PATCH 101/171] sss --- cev_eris.dme | 1 - code/__DEFINES/misc.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 62 +++++++++---------- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/cev_eris.dme b/cev_eris.dme index 9c9c0e8a53..208b454729 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -93,7 +93,6 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" -#include "code\__DEFINES\spawner\___byondbase.dm" #include "code\__DEFINES\spawner\_spawner.dm" #include "code\__DEFINES\spawner\excelsior.dm" #include "code\__DEFINES\spawner\frozen_star.dm" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 7bee383e0d..7d1e6ab424 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -368,6 +368,6 @@ #define TTS_SEED_DEFAULT_MALE "Male_1" #define TTS_SEED_ANNOUNCER "Robot_2" -#define BBOX(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) list(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel) +#define BBOX(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel, flags) list(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel, flags) #define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) #define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ef3bbaab6f..f7abf66d08 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -16,43 +16,43 @@ /datum/hitboxDatum/human boundingBoxes = list( LISTNORTH = list( - BBOX(8,10,24,16,0,0,0,0), /// chest + arms - BBOX(9,17,23,19,0,0,0,0), /// upper chest + upper arms - BBOX(11,20,21,21,0,0,0,0), // neck/upper chest - BBOX(12,22,20,25,0,0,0,0), // head - BBOX(13,26,19,27,0,0,0,0), // bald head top - BBOX(15,28,18,28,0,0,0,0), /// balder head top - BBOX(12,0,15,9,0,0,0,0), // left leg - BBOX(10,0,11,2,0,0,0,0), // left toe - BBOX(17,0,20,9,0,0,0,0), // right leg - BBOX(21,0,22,2,0,0,0,0) // right to + BBOX(8,10,24,16,0,0,0,0, null), /// chest + arms + BBOX(9,17,23,19,0,0,0,0, null), /// upper chest + upper arms + BBOX(11,20,21,21,0,0,0,0, null), // neck/upper chest + BBOX(12,22,20,25,0,0,0,0, null), // head + BBOX(13,26,19,27,0,0,0,0, null), // bald head top + BBOX(15,28,18,28,0,0,0,0, null), /// balder head top + BBOX(12,0,15,9,0,0,0,0, null), // left leg + BBOX(10,0,11,2,0,0,0,0, null), // left toe + BBOX(17,0,20,9,0,0,0,0, null), // right leg + BBOX(21,0,22,2,0,0,0,0, null) // right to ), LISTSOUTH = list( - BBOX(8,10,24,16,0,0,0,0), /// chest + arms - BBOX(9,17,23,19,0,0,0,0), /// upper chest + upper arms - BBOX(11,20,21,21,0,0,0,0), // neck/upper chest - BBOX(12,22,20,25,0,0,0,0), // head - BBOX(13,26,19,27,0,0,0,0), // bald head top - BBOX(15,28,18,28,0,0,0,0), /// balder head top - BBOX(12,0,15,9,0,0,0,0), // left leg - BBOX(10,0,11,2,0,0,0,0), // left toe - BBOX(17,0,20,9,0,0,0,0), // right leg - BBOX(21,0,22,2,0,0,0,0) // right to + BBOX(8,10,24,16,0,0,0,0, null), /// chest + arms + BBOX(9,17,23,19,0,0,0,0, null), /// upper chest + upper arms + BBOX(11,20,21,21,0,0,0,0, null), // neck/upper chest + BBOX(12,22,20,25,0,0,0,0, null), // head + BBOX(13,26,19,27,0,0,0,0, null), // bald head top + BBOX(15,28,18,28,0,0,0,0, null), /// balder head top + BBOX(12,0,15,9,0,0,0,0, null), // left leg + BBOX(10,0,11,2,0,0,0,0, null), // left toe + BBOX(17,0,20,9,0,0,0,0, null), // right leg + BBOX(21,0,22,2,0,0,0,0, null) // right to ), LISTEAST = list( - BBOX(14,1,18,28,0,0,0,0), - BBOX(13,12,13,21,0,0,0,0), - BBOX(12,15,12,20,0,0,0,0), - BBOX(19,1,20,3,0,0,0,0), - BBOX(19,10,20,27,0,0,0,0) + BBOX(14,1,18,28,0,0,0,0, null), + BBOX(13,12,13,21,0,0,0,0, null), + BBOX(12,15,12,20,0,0,0,0, null), + BBOX(19,1,20,3,0,0,0,0, null), + BBOX(19,10,20,27,0,0,0,0, null) ), LISTWEST = list( - BBOX(15,1,19,28,0,0,0,0), - BBOX(13,1,14,3,0,0,0,0), - BBOX(20,12,20,21,0,0,0,0), - BBOX(21,15,21,20,0,0,0,0), - BBOX(14,10,14,28,0,0,0,0), - BBOX(13,12,13,27,0,0,0,0) + BBOX(15,1,19,28,0,0,0,0, null), + BBOX(13,1,14,3,0,0,0,0, null), + BBOX(20,12,20,21,0,0,0,0, null), + BBOX(21,15,21,20,0,0,0,0, null), + BBOX(14,10,14,28,0,0,0,0, null), + BBOX(13,12,13,27,0,0,0,0, null) ) ) From 26fc2b1ca1e817546c6a8e07bc09c0a836ece01f Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 19 May 2024 07:01:48 +0200 Subject: [PATCH 102/171] aaa --- code/__DEFINES/maths.dm | 6 +++++- code/controllers/subsystems/bullets.dm | 25 ++++++++++++++++------- code/controllers/subsystems/chunks.dm | 4 ++-- code/controllers/subsystems/jamming.dm | 2 +- code/datums/datum_click_handlers.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 2 +- 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 718bb84af4..f9ce770f6f 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -18,7 +18,11 @@ #define CEILING(x, y) ( -round(-(x) / (y)) * (y) ) -#define DIST_EUCLIDIAN(x1,y1,x2,y2) (sqrt((x1-x2)**2 + (y1-y2)**2)) +#define DIST_EUCLIDIAN_2D(x1,y1,x2,y2) (sqrt((x1-x2)**2 + (y1-y2)**2)) + +#define DIST_EUCLIDIAN_3D(x1,y1,z1,x2,y2,z2) (sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2)) + + // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index c57db443d8..961fca91b8 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,6 +1,7 @@ /// Pixels per turf #define PPT 32 #define HPPT (PPT/2) +#define MAXPIXELS 32 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -123,7 +124,8 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - movementRatios[3] = ((targetPos[3] - firedPos[3]) * PPT + (targetLevel - firedLevel) * HPPT) / (PPT * distStartToFinish()) + movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * MAXPIXELS) + message_admins("calculated movementRatio , [movementRatios[3]] , with maxPixels , [movementRatios[3] * MAXPIXELS]") movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -156,15 +158,22 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/updatePathByPosition() var/matrix/rotation = matrix() - movementRatios[3] = ((targetPos[3] - firedPos[3]) * PPT + (targetLevel - firedLevel) * HPPT) / (PPT * distStartToFinish()) + movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * MAXPIXELS) movementRatios[4] = getAngleByPosition() movementRatios[1] = sin(movementRatios[4]) movementRatios[2] = cos(movementRatios[4]) rotation.Turn(movementRatios[4] + 180) referencedBullet.transform = rotation -/datum/bullet_data/proc/distStartToFinish() - return DIST_EUCLIDIAN(targetPos[1], targetPos[2], firedPos[1], firedPos[2]) +/datum/bullet_data/proc/distStartToFinish2D() + return DIST_EUCLIDIAN_2D((targetPos[1]*PPT +targetCoords[1] + 16)/PPT,(targetPos[2]*PPT + targetCoords[2] + 16)/PPT, (firedPos[1]*PPT +firedCoordinates[1] + 16)/PPT, (firedPos[2]*PPT +firedCoordinates[2] + 16)/PPT) + +/datum/bullet_data/proc/distStartToFinish3D() + return DIST_EUCLIDIAN_3D((targetPos[1]*PPT)/PPT,(targetPos[2]*PPT)/PPT,targetPos[3] + targetLevel ,(firedPos[1]*PPT)/PPT, (firedPos[2]*PPT)/PPT, firedPos[3] + firedLevel) + //return DIST_EUCLIDIAN_3D((targetPos[1]*PPT +targetCoords[1] + 16)/PPT,(targetPos[2]*PPT + targetCoords[2] + 16)/PPT,targetPos[3] + targetLevel ,(firedPos[1]*PPT +firedCoordinates[1] + 16)/PPT, (firedPos[2]*PPT +firedCoordinates[2] + 16)/PPT, firedPos[3] + firedLevel) + + + /* var/x = targetPos[1] - firedPos[1] var/y = targetPos[2] - firedPos[2] @@ -234,12 +243,12 @@ SUBSYSTEM_DEF(bullets) trajectoryData[2] = projectile.y * 32 + projectile.pixel_y + 16 trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] - while(pixelsToTravel > 0) - pixelsThisStep = pixelsToTravel > 32 ? 32 : pixelsToTravel + while(pixelsToTravel > MAXPIXELS) + pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel pixelsToTravel -= pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] += (bulletRatios[3]) + bulletCoords[3] += (bulletRatios[3] * pixelsThisStep) //message_admins("[bulletCoords[1]], [bulletCoords[2]]") //message_admins("trajectory data for bullet : [trajectoryData[1]] , [trajectoryData[2]] ===== [trajectoryData[3]], [trajectoryData[4]]") x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) @@ -271,6 +280,8 @@ SUBSYSTEM_DEF(bullets) bullet.updateLevel() if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) projectile.forceMove(moveTurf) + if(moveTurf == bullet.targetTurf) + message_admins("Reached target with level of [bulletCoords[3]]") moveTurf = null diff --git a/code/controllers/subsystems/chunks.dm b/code/controllers/subsystems/chunks.dm index 87321f01de..95e488763e 100644 --- a/code/controllers/subsystems/chunks.dm +++ b/code/controllers/subsystems/chunks.dm @@ -74,7 +74,7 @@ SUBSYSTEM_DEF(chunks) var/turf/mobTurf = get_turf(mobToCheck) if(!mobTurf) continue - if(DIST_EUCLIDIAN(containerTurf.x, containerTurf.y, mobTurf.x, mobTurf.y) < range) + if(DIST_EUCLIDIAN_2D(containerTurf.x, containerTurf.y, mobTurf.x, mobTurf.y) < range) if(aliveonly && mobToCheck.stat == DEAD) continue if(canseeonly && !can_see(containerTurf, get_turf(mobToCheck), range * 2)) @@ -111,7 +111,7 @@ SUBSYSTEM_DEF(chunks) var/turf/hearerTurf = get_turf(hearerToCheck) if(!hearerTurf) continue - if(DIST_EUCLIDIAN(containerTurf.x, containerTurf.y, hearerTurf.x, hearerTurf.y) < range) + if(DIST_EUCLIDIAN_2D(containerTurf.x, containerTurf.y, hearerTurf.x, hearerTurf.y) < range) if(!can_see(source, get_turf(hearerToCheck), range * 2)) continue returnValue += hearerToCheck diff --git a/code/controllers/subsystems/jamming.dm b/code/controllers/subsystems/jamming.dm index 768c7880ad..e658029d73 100644 --- a/code/controllers/subsystems/jamming.dm +++ b/code/controllers/subsystems/jamming.dm @@ -18,7 +18,7 @@ SUBSYSTEM_DEF(jamming) // blame linters being shit var/datum/component/jamming/jammer = thing var/atom/container = jammer.owner.getContainingAtom() - var/distance = DIST_EUCLIDIAN(container.x, container.y, location.x, location.y) + var/distance = DIST_EUCLIDIAN_2D(container.x, container.y, location.x, location.y) var/radius = jammer.radius - (abs(container.z - location.z) * jammer.z_reduction) // incase its multi-Z jammer with distance reduction if(distance > radius) diff --git a/code/datums/datum_click_handlers.dm b/code/datums/datum_click_handlers.dm index d688387631..09251751ec 100644 --- a/code/datums/datum_click_handlers.dm +++ b/code/datums/datum_click_handlers.dm @@ -183,7 +183,7 @@ var/turf/targetTurf = get_turf(target) if(!targetTurf) return TRUE - if(DIST_EUCLIDIAN(owner.mob.x , owner.mob.y, targetTurf.x , targetTurf.y) < 24) + if(DIST_EUCLIDIAN_2D(owner.mob.x , owner.mob.y, targetTurf.x , targetTurf.y) < 24) // Can't block at such close distance signalStrength = 1000 else diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 3fcb8cc759..26e4ca3fc2 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -14,7 +14,7 @@ var/global/worldY worldX = owner.x * 32 worldY = owner.y * 32 - for(var/list/boundingData in boundingBoxes[num2text(owner.dir)]) + for(var/list/boundingData in boundingBoxes["[owner.dir]"]) if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) return TRUE if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) From 0712a441d2cd4e44e6177158886d0a36c695806e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 19 May 2024 11:19:53 +0200 Subject: [PATCH 103/171] kk --- cev_eris.dme | 1 + code/__DEFINES/{spawner => }/___byondbase.dm | 0 code/__DEFINES/_bullets.dm | 3 ++ code/__DEFINES/misc.dm | 2 +- code/controllers/subsystems/bullets.dm | 16 ++---- code/modules/mob/living/carbon/human/human.dm | 49 +++++++------------ code/modules/projectiles/hitbox_datums.dm | 5 +- code/modules/projectiles/projectile.dm | 7 +-- 8 files changed, 35 insertions(+), 48 deletions(-) rename code/__DEFINES/{spawner => }/___byondbase.dm (100%) diff --git a/cev_eris.dme b/cev_eris.dme index 208b454729..912cab52bd 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -15,6 +15,7 @@ #include "code\hub.dm" #include "code\stylesheet.dm" #include "code\world.dm" +#include "code\__DEFINES\___byondbase.dm" #include "code\__DEFINES\__atomFlags.dm" #include "code\__DEFINES\_bullets.dm" #include "code\__DEFINES\_compile_options.dm" diff --git a/code/__DEFINES/spawner/___byondbase.dm b/code/__DEFINES/___byondbase.dm similarity index 100% rename from code/__DEFINES/spawner/___byondbase.dm rename to code/__DEFINES/___byondbase.dm diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index ba664f5063..3d6fb3aa29 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -1,7 +1,10 @@ +/// These define the MAXIMUM height for a level (as in a standing human height is considered) #define LEVEL_BELOW 0 #define LEVEL_TURF 0.5 #define LEVEL_LYING 0.7 #define LEVEL_LOWWALL 1 #define LEVEL_TABLE 1.2 +#define LEVEL_GROIN 1.3 +#define LEVEL_CHEST 1.5 #define LEVEL_STANDING 1.7 #define LEVEL_ABOVE 2 diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 7d1e6ab424..95d5128b27 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -368,6 +368,6 @@ #define TTS_SEED_DEFAULT_MALE "Male_1" #define TTS_SEED_ANNOUNCER "Robot_2" -#define BBOX(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel, flags) list(x1,y1,x2,y2,offsetX,offsetY, minLevel, maxLevel, flags) +#define BBOX(x1,y1,x2,y2, minLevel, maxLevel, flags) list(x1,y1,x2,y2, minLevel, maxLevel, flags) #define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) #define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 961fca91b8..98c4547699 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -26,7 +26,8 @@ SUBSYSTEM_DEF(bullets) var/list/relevantAtoms = list() // 1 client tick by default , can be increased by impacts var/bulletWait = 1 - var/list/trajectoryData = list(0,0,0,0) + //// x1,y1,x2,y2,z1,z2 + var/list/trajectoryData = list(0,0,0,0,0,0) @@ -243,6 +244,8 @@ SUBSYSTEM_DEF(bullets) trajectoryData[2] = projectile.y * 32 + projectile.pixel_y + 16 trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] + trajectoryData[5] = bulletCoords[3] + trajectoryData[6] = trajectoryData[5] + bulletRatios[3] * pixelsToTravel while(pixelsToTravel > MAXPIXELS) pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel pixelsToTravel -= pixelsThisStep @@ -295,14 +298,3 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet - - - -#undef LEVEL_BELOW -#undef LEVEL_TURF -#undef LEVEL_LYING -#undef LEVEL_LOWWALL -#undef LEVEL_TABLE -#undef LEVEL_STANDING -#undef LEVEL_ABOVE - diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f7abf66d08..b14e2b980e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -16,43 +16,30 @@ /datum/hitboxDatum/human boundingBoxes = list( LISTNORTH = list( - BBOX(8,10,24,16,0,0,0,0, null), /// chest + arms - BBOX(9,17,23,19,0,0,0,0, null), /// upper chest + upper arms - BBOX(11,20,21,21,0,0,0,0, null), // neck/upper chest - BBOX(12,22,20,25,0,0,0,0, null), // head - BBOX(13,26,19,27,0,0,0,0, null), // bald head top - BBOX(15,28,18,28,0,0,0,0, null), /// balder head top - BBOX(12,0,15,9,0,0,0,0, null), // left leg - BBOX(10,0,11,2,0,0,0,0, null), // left toe - BBOX(17,0,20,9,0,0,0,0, null), // right leg - BBOX(21,0,22,2,0,0,0,0, null) // right to + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, null), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, null), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD ), LISTSOUTH = list( - BBOX(8,10,24,16,0,0,0,0, null), /// chest + arms - BBOX(9,17,23,19,0,0,0,0, null), /// upper chest + upper arms - BBOX(11,20,21,21,0,0,0,0, null), // neck/upper chest - BBOX(12,22,20,25,0,0,0,0, null), // head - BBOX(13,26,19,27,0,0,0,0, null), // bald head top - BBOX(15,28,18,28,0,0,0,0, null), /// balder head top - BBOX(12,0,15,9,0,0,0,0, null), // left leg - BBOX(10,0,11,2,0,0,0,0, null), // left toe - BBOX(17,0,20,9,0,0,0,0, null), // right leg - BBOX(21,0,22,2,0,0,0,0, null) // right to + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, null), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, null), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD ), LISTEAST = list( - BBOX(14,1,18,28,0,0,0,0, null), - BBOX(13,12,13,21,0,0,0,0, null), - BBOX(12,15,12,20,0,0,0,0, null), - BBOX(19,1,20,3,0,0,0,0, null), - BBOX(19,10,20,27,0,0,0,0, null) + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, null), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, null), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, null), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD ), LISTWEST = list( - BBOX(15,1,19,28,0,0,0,0, null), - BBOX(13,1,14,3,0,0,0,0, null), - BBOX(20,12,20,21,0,0,0,0, null), - BBOX(21,15,21,20,0,0,0,0, null), - BBOX(14,10,14,28,0,0,0,0, null), - BBOX(13,12,13,27,0,0,0,0, null) + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, null), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, null), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, null), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD ) ) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 26e4ca3fc2..3098a441db 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -9,12 +9,15 @@ var/atom/owner /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner) +/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) var/global/worldX var/global/worldY worldX = owner.x * 32 worldY = owner.y * 32 for(var/list/boundingData in boundingBoxes["[owner.dir]"]) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + continue if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) return TRUE if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 799c42ba7c..b5fbcbb942 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -511,9 +511,10 @@ GLOBAL_LIST(projectileDamageConstants) for(var/i in 1 to length(hittingList)) var/obj/target = hittingList[i] - if(target.hitbox) - message_admins("hitbox intersection returns [target.hitbox.intersects(trajectoryData, target.dir, 0, target)]") - if(target.bullet_act(src, def_zone) & PROJECTILE_STOP) + var/list/arguments = list(src, def_zone) + if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) + return PROJECTILE_CONTINUE + if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP From bbcaf2ea90784f1f3ed6afc9b32fecc4fac7813d Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 19 May 2024 17:19:18 +0200 Subject: [PATCH 104/171] complete implementation . at last.. humans fully hitboxed.. --- .vscode/launch.json | 35 ++++++++++---- code/__DEFINES/_bullets.dm | 14 ++++++ code/controllers/subsystems/bullets.dm | 36 +++++++------- code/game/atoms.dm | 7 ++- code/game/atoms_movable.dm | 5 ++ code/game/gamemodes/events/blob.dm | 2 +- code/game/machinery/atmoalter/canister.dm | 2 +- code/game/machinery/bots/bots.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/computer/computer.dm | 2 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/showcase.dm | 4 +- code/game/machinery/doors/simple.dm | 2 +- code/game/machinery/portable_turret.dm | 2 +- code/game/objects/effects/roaches.dm | 4 +- code/game/objects/effects/spiders.dm | 2 +- code/game/objects/items/shooting_range.dm | 2 +- .../implants/carrion/carrion_spiders.dm | 2 +- code/game/objects/items/weapons/weaponry.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- code/game/objects/structures/curtains.dm | 2 +- code/game/objects/structures/displaycase.dm | 2 +- code/game/objects/structures/girders.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/inflatable.dm | 2 +- code/game/objects/structures/mirror.dm | 2 +- code/game/objects/structures/railing.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/simulated/floor_attackby.dm | 2 +- code/modules/hivemind/machines.dm | 2 +- code/modules/hydroponics/trays/tray.dm | 2 +- code/modules/mining/drilling/deep_drill.dm | 2 +- code/modules/mining/drilling/golem_burrow.dm | 2 +- code/modules/mining/mine_turfs.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 47 ++++++++++++------- .../mob/living/carbon/human/human_defense.dm | 13 ++++- code/modules/mob/living/carbon/slime/slime.dm | 2 +- .../living/carbon/superior_animal/defense.dm | 2 +- .../superior_animal/roach/types/benzin.dm | 2 +- .../superior_animal/roach/types/bluespace.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/mob/living/silicon/silicon.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 6 +-- .../living/simple_animal/friendly/iriska.dm | 4 +- .../living/simple_animal/hostile/stranger.dm | 2 +- .../living/simple_animal/hostile/syndicate.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 2 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- .../computers/modular_computer/damage.dm | 2 +- code/modules/onestar/os_turret.dm | 12 ++--- code/modules/organs/internal/carrion.dm | 2 +- .../overmap/ships/computers/sensors.dm | 2 +- code/modules/power/antimatter/shielding.dm | 2 +- .../power/singularity/field_generator.dm | 2 +- code/modules/power/supermatter/supermatter.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 47 ++++++++++++++++--- code/modules/projectiles/projectile.dm | 3 +- code/modules/reagents/reagent_dispenser.dm | 2 +- code/modules/shield_generators/shield.dm | 14 +++--- code/modules/shieldgen/emergency_shield.dm | 2 +- code/modules/shieldgen/energy_field.dm | 2 +- code/modules/shieldgen/sheldwallgen.dm | 4 +- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/vehicles/cargo_train.dm | 2 +- code/modules/vehicles/vehicle.dm | 2 +- oldcode/shuttles_old/old_shuttle_console.dm | 2 +- 66 files changed, 227 insertions(+), 128 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 3c61a0aea1..c4084e2cb3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,12 +1,31 @@ { - "version": "0.2.0", - "configurations": [ + "version": "0.2.0", + "configurations": [ + { + "type": "byond", + "request": "launch", + "name": "Launch and Build TGUI and DM", + "preLaunchTask": "TGUI Compile", + "dmb": "${workspaceFolder}/${command:CurrentDMB}" + }, + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "c:/Users/MLGTASTIC/Desktop/Eris-SS13/CEV-Eris/tgui/.yarn/unplugged/ttf2woff2-npm-4.0.4-e71f070912/node_modules/ttf2woff2/csrc/woff2", + "program": "c:/Users/MLGTASTIC/Desktop/Eris-SS13/CEV-Eris/tgui/.yarn/unplugged/ttf2woff2-npm-4.0.4-e71f070912/node_modules/ttf2woff2/csrc/woff2/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ { - "type": "byond", - "request": "launch", - "name": "Launch and Build TGUI and DM", - "preLaunchTask": "TGUI Compile", - "dmb": "${workspaceFolder}/${command:CurrentDMB}" + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true } - ] + ] + } + ] } \ No newline at end of file diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index 3d6fb3aa29..5bde073203 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -8,3 +8,17 @@ #define LEVEL_CHEST 1.5 #define LEVEL_STANDING 1.7 #define LEVEL_ABOVE 2 + +// return flags for aimingLevels ,this makes it so it uses the shooter's default aiming level , be it by their current level or def zone they are aiming at. +#define HBF_NOLEVEL -99999 +#define HBF_USEMEDIAN -100000 + + +// return flags for the hitboxDatum , with functionality implemented in bullet_act. passed under hitboxFlags +// these have no excuse to be general , add them for any object you want to add special functonality to with regards to where it is hit. + +/// mob/living/carbon/human and any subtypes +#define HB_HEAD 1<<1 +#define HB_CHESTARMS 1<<2 +#define HB_GROIN 1<<3 +#define HB_LEGS 1<<4 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 98c4547699..6f35c6f4fb 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -100,26 +100,28 @@ SUBSYSTEM_DEF(bullets) src.target = target src.targetTurf = get_turf(target) src.targetPos = list(target.x, target.y , target.z) - if(ismob(target)) - if(iscarbon(target)) - if(target:lying) - src.targetLevel = LEVEL_LYING + src.targetLevel = target.getAimingLevel(firer, aimedZone) + if(targetLevel == HBF_NOLEVEL) + if(ismob(target)) + if(iscarbon(target)) + if(target:lying) + src.targetLevel = LEVEL_LYING + else + src.targetLevel = LEVEL_STANDING else src.targetLevel = LEVEL_STANDING - else + else if(istype(target, /obj/structure/low_wall)) + src.targetLevel = LEVEL_LOWWALL + else if(istype(target, /obj/structure/window)) + src.targetLevel = LEVEL_STANDING + else if(istype(target, /obj/structure/table)) + src.targetLevel = LEVEL_TABLE + else if(iswall(target)) src.targetLevel = LEVEL_STANDING - else if(istype(target, /obj/structure/low_wall)) - src.targetLevel = LEVEL_LOWWALL - else if(istype(target, /obj/structure/window)) - src.targetLevel = LEVEL_STANDING - else if(istype(target, /obj/structure/table)) - src.targetLevel = LEVEL_TABLE - else if(iswall(target)) - src.targetLevel = LEVEL_STANDING - else if(isturf(target)) - src.targetLevel = LEVEL_TURF - else if(isitem(target)) - src.targetLevel = LEVEL_TURF + else if(isturf(target)) + src.targetLevel = LEVEL_TURF + else if(isitem(target)) + src.targetLevel = LEVEL_TURF else message_admins(("Created bullet without target , [referencedBullet], from [usr]")) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 8ca4b617d6..656a74df82 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -48,6 +48,9 @@ /atom/proc/update_icon() return +/atom/proc/getAimingLevel(atom/shooter,defZone) + return HBF_NOLEVEL + /atom/proc/getWeight() return initial(weight) @@ -267,7 +270,7 @@ return -/atom/proc/bullet_act(obj/item/projectile/P, def_zone) +/atom/proc/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) P.on_hit(src, def_zone) . = FALSE @@ -822,7 +825,7 @@ its easier to just keep the beam vertical. return //Bullethole shit. -/atom/proc/create_bullethole(var/obj/item/projectile/Proj) +/atom/proc/create_bullethole(obj/item/projectile/Proj, defZone, hitboxFlags) var/p_x = Proj.p_x + rand(-8,8) // really ugly way of coding "sometimes offset Proj.p_x!" var/p_y = Proj.p_y + rand(-8,8) // Used for bulletholes var/obj/effect/overlay/bmark/BM = new(src) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e27b0b10da..91bf9c136c 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -42,6 +42,11 @@ GLOBAL_VAR_INIT(Debug,0) // testing("GC: [type] was deleted via GC with qdel()") ..() +/atom/movable/getAimingLevel(atom/shooter, defZone) + if(hitbox) + return hitbox.getAimingLevel(shooter, defZone) + else + return ..() /atom/movable/Destroy() var/turf/T = loc diff --git a/code/game/gamemodes/events/blob.dm b/code/game/gamemodes/events/blob.dm index 103040974b..ea2a9b4857 100644 --- a/code/game/gamemodes/events/blob.dm +++ b/code/game/gamemodes/events/blob.dm @@ -458,7 +458,7 @@ ********************/ //Bullets which hit a blob will keep going on through if they kill it -/obj/effect/blob/bullet_act(var/obj/item/projectile/Proj) +/obj/effect/blob/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(!Proj) return diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 332d0ec838..205eeddeb8 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -233,7 +233,7 @@ update_flag return GM.return_pressure() return 0 -/obj/machinery/portable_atmospherics/canister/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/portable_atmospherics/canister/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(Proj.get_structure_damage()) src.health -= round(Proj.get_structure_damage() / 2) healthcheck() diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index d606b66ff1..5a92a7ba46 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -76,7 +76,7 @@ ..() healthcheck() -/obj/machinery/bot/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/bot/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(!Proj.get_structure_damage()) return health -= Proj.get_structure_damage() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 1497be10e3..c2b97e19ae 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -99,7 +99,7 @@ update_coverage() START_PROCESSING(SSmachines, src) -/obj/machinery/camera/bullet_act(var/obj/item/projectile/P) +/obj/machinery/camera/bullet_act(obj/item/projectile/P, defZone, hitboxFlags) take_damage(P.get_structure_damage()) /obj/machinery/camera/explosion_act(target_power, explosion_handler/handler) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 7e5e36a2e6..732dbfb20d 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -43,7 +43,7 @@ set_broken() return 0 -/obj/machinery/computer/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/computer/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(prob(Proj.get_structure_damage())) if(!(stat & BROKEN)) var/datum/effect/effect/system/smoke_spread/S = new/datum/effect/effect/system/smoke_spread() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 9e2d29a410..e41fa9b3d1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -184,7 +184,7 @@ do_animate("deny") return TRUE -/obj/machinery/door/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/door/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) ..() var/damage = Proj.get_structure_damage() diff --git a/code/game/machinery/doors/showcase.dm b/code/game/machinery/doors/showcase.dm index e9ab0efa1b..5c2a727655 100644 --- a/code/game/machinery/doors/showcase.dm +++ b/code/game/machinery/doors/showcase.dm @@ -44,7 +44,7 @@ have_glass = TRUE update_icon() return - + if(dhTotalDamageStrict(I.melleDamages, ALL_ARMOR, list(BRUTE,BURN))) hit(user, I) return @@ -57,7 +57,7 @@ -/obj/machinery/door/blast/shutters/glass/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/door/blast/shutters/glass/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(Proj.get_structure_damage()) take_damage(Proj.get_structure_damage()) ..() diff --git a/code/game/machinery/doors/simple.dm b/code/game/machinery/doors/simple.dm index 839bc850ab..342a595796 100644 --- a/code/game/machinery/doors/simple.dm +++ b/code/game/machinery/doors/simple.dm @@ -44,7 +44,7 @@ /obj/machinery/door/unpowered/simple/get_material_name() return material.name -/obj/machinery/door/unpowered/simple/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/door/unpowered/simple/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/damage = Proj.get_structure_damage() if(damage) //cap projectile damage so that there's still a minimum number of hits required to break the door diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 4805e3793a..f275f58de8 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -472,7 +472,7 @@ var/list/turret_icons if(health <= 0) die() //the death process :( -/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj) +/obj/machinery/porta_turret/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/damage = Proj.get_structure_damage() if(!damage) diff --git a/code/game/objects/effects/roaches.dm b/code/game/objects/effects/roaches.dm index 200d4471f4..843e4490a1 100644 --- a/code/game/objects/effects/roaches.dm +++ b/code/game/objects/effects/roaches.dm @@ -28,7 +28,7 @@ health -= (dhTotalDamageStrict(I.melleDamages, ALL_ARMOR, list(BRUTE,BURN)) / 2) healthcheck() -/obj/item/roach_egg/bullet_act(var/obj/item/projectile/Proj) +/obj/item/roach_egg/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) ..() health -= Proj.get_structure_damage() healthcheck() @@ -61,7 +61,7 @@ . = ..() -/obj/item/roach_egg/Process() +/obj/item/roach_egg/Process() if (isturf(src.loc) || istype(src.loc, /obj/structure/closet) || istype(src.loc, /obj/item/organ/external)) // suppresses hatching when not in a suitable loc if(amount_grown >= 100) var/obj/item/organ/external/O diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index f3d44ff39e..9df3d0c3a4 100755 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -28,7 +28,7 @@ health -= damage healthcheck() -/obj/effect/spider/bullet_act(var/obj/item/projectile/Proj) +/obj/effect/spider/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) ..() health -= Proj.get_structure_damage() healthcheck() diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index f00c544314..c4f0003a7f 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -79,7 +79,7 @@ desc = "A shooting target with a threatening silhouette." hp = 2350 // alium onest too kinda -/obj/item/target/bullet_act(var/obj/item/projectile/Proj) +/obj/item/target/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/p_x = Proj.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!" var/p_y = Proj.p_y + pick(0,0,0,0,0,-1,1) var/decaltype = 1 // 1 - scorch, 2 - bullet diff --git a/code/game/objects/items/weapons/implant/implants/carrion/carrion_spiders.dm b/code/game/objects/items/weapons/implant/implants/carrion/carrion_spiders.dm index 540c2a61b6..512f6cd501 100644 --- a/code/game/objects/items/weapons/implant/implants/carrion/carrion_spiders.dm +++ b/code/game/objects/items/weapons/implant/implants/carrion/carrion_spiders.dm @@ -56,7 +56,7 @@ attack_animation(user) die_from_attack() -/obj/item/implant/carrion_spider/bullet_act(obj/item/projectile/P, def_zone) +/obj/item/implant/carrion_spider/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) ..() die_from_attack() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 144a7927c8..23f28ebfe2 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -91,7 +91,7 @@ countdown-- return -/obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj) +/obj/effect/energy_net/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) health -= Proj.get_structure_damage() healthcheck() return 0 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 59dd20f05b..ac29e1a099 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -330,7 +330,7 @@ if(health <= 0) qdel(src) -/obj/structure/closet/bullet_act(obj/item/projectile/Proj) +/obj/structure/closet/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/proj_damage = Proj.get_structure_damage() if(!proj_damage) return diff --git a/code/game/objects/structures/curtains.dm b/code/game/objects/structures/curtains.dm index 2343d6be11..ba0a12e527 100644 --- a/code/game/objects/structures/curtains.dm +++ b/code/game/objects/structures/curtains.dm @@ -11,7 +11,7 @@ layer = SIGN_LAYER opacity = 0 -/obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone) +/obj/structure/curtain/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) if(!P.nodamage) visible_message(SPAN_WARNING("[P] tears [src] down!")) qdel(src) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 47e9ebfdc7..e4a5a094cc 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -16,7 +16,7 @@ var/absorbed = take_damage(target_power) return absorbed -/obj/structure/displaycase/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/displaycase/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) take_damage(Proj.get_structure_damage()) ..() return diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index 1e29e06269..0a8ac677c5 100755 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -43,7 +43,7 @@ else attack_hand(M) -/obj/structure/girder/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/girder/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) //Girders only provide partial cover. There's a chance that the projectiles will just pass through. (unless you are trying to shoot the girder) if(Proj.original != src && !prob(cover)) return PROJECTILE_CONTINUE //pass through diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 8734f251b9..bd16d6cce4 100755 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -59,7 +59,7 @@ else return !density -/obj/structure/grille/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/grille/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(!Proj) return //Flimsy grilles aren't so great at stopping projectiles. However they can absorb some of the impact diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 4fee638eb8..d352856a66 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -66,7 +66,7 @@ /obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 0 -/obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/inflatable/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/proj_damage = Proj.get_structure_damage() if(!proj_damage) return take_damage(proj_damage) diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 66dd92dde5..799433bd65 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -40,7 +40,7 @@ desc = "Oh no, seven years of bad luck!" -/obj/structure/mirror/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/mirror/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(prob(Proj.get_structure_damage() * 2)) if(!shattered) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 169547ce5a..9786eab431 100755 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -385,7 +385,7 @@ return damage -/obj/structure/railing/bullet_act(obj/item/projectile/P, def_zone) +/obj/structure/railing/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) . = ..() take_damage(P.get_structure_damage()) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e15f393b5b..ccd6219620 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -148,7 +148,7 @@ return -/obj/structure/window/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/window/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(config.z_level_shooting && Proj.height) if(Proj.height == HEIGHT_LOW)// Bullet is too low diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index ef968d7eea..332ae34ae9 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -203,7 +203,7 @@ return 0 return 1 /* -/turf/simulated/floor/bullet_act(obj/item/projectile/P, def_zone) +/turf/simulated/floor/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) if(!P.dataRef) return PROJECTILE_CONTINUE else if(!(P.dataRef.isTraversingLevel)) diff --git a/code/modules/hivemind/machines.dm b/code/modules/hivemind/machines.dm index 97e441778c..623035fb81 100755 --- a/code/modules/hivemind/machines.dm +++ b/code/modules/hivemind/machines.dm @@ -253,7 +253,7 @@ set_light(2, 3, illumination_color) -/obj/machinery/hivemind_machine/bullet_act(obj/item/projectile/Proj) +/obj/machinery/hivemind_machine/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) take_damage(Proj.get_structure_damage()) if(istype(Proj, /obj/item/projectile/ion)) Proj.on_hit(loc) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 028aa4acde..799f25ffcf 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -156,7 +156,7 @@ T?.levelupdate() update_icon() -/obj/machinery/portable_atmospherics/hydroponics/bullet_act(obj/item/projectile/Proj) +/obj/machinery/portable_atmospherics/hydroponics/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) //Don't act on seeds like dionaea that shouldn't change. if(seed && seed.get_trait(TRAIT_IMMUTABLE) > 0) return diff --git a/code/modules/mining/drilling/deep_drill.dm b/code/modules/mining/drilling/deep_drill.dm index 9e17940ec9..729e64b6ff 100644 --- a/code/modules/mining/drilling/deep_drill.dm +++ b/code/modules/mining/drilling/deep_drill.dm @@ -384,7 +384,7 @@ take_damage(damage) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN * 1.5) -/obj/machinery/mining/deep_drill/bullet_act(obj/item/projectile/Proj) +/obj/machinery/mining/deep_drill/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) ..() var/damage = Proj.get_structure_damage() take_damage(damage) diff --git a/code/modules/mining/drilling/golem_burrow.dm b/code/modules/mining/drilling/golem_burrow.dm index 3c1d72e120..31273e2821 100644 --- a/code/modules/mining/drilling/golem_burrow.dm +++ b/code/modules/mining/drilling/golem_burrow.dm @@ -41,7 +41,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN * 1.5) return TRUE -/obj/structure/golem_burrow/bullet_act(obj/item/projectile/Proj) +/obj/structure/golem_burrow/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) ..() // Bullet not really efficient against a pile of rock take_damage(Proj.get_structure_damage() * 0.25) diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 2098b0406e..861f3255ae 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -51,7 +51,7 @@ mined_ore = 1 GetDrilled() -/turf/simulated/mineral/bullet_act(var/obj/item/projectile/Proj) +/turf/simulated/mineral/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) // Emitter blasts if(istype(Proj, /obj/item/projectile/beam/emitter)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b14e2b980e..479d401142 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -16,32 +16,43 @@ /datum/hitboxDatum/human boundingBoxes = list( LISTNORTH = list( - BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, null), // LEGS - BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, null), // GROIN - BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS - BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD ), LISTSOUTH = list( - BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, null), // LEGS - BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, null), // GROIN - BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS - BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, null), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD ), LISTEAST = list( - BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, null), // LEGS - BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, null), // GROIN - BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, null), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD ), LISTWEST = list( - BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, null), // LEGS - BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, null), // GROIN - BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, null), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, null) // HEAD + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD ) ) + defZoneToLevel = list( + BP_EYES = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_MOUTH = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_HEAD = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_CHEST = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_R_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_L_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_GROIN = (LEVEL_GROIN + LEVEL_TABLE)/2, + BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, + BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 + ) /mob/living/carbon/human/Initialize(new_loc, new_species) hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100", ON_MOB_HUD_LAYER) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index d49f92af2e..89394b7e84 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -7,7 +7,18 @@ meteor_act */ -/mob/living/carbon/human/bullet_act(var/obj/item/projectile/P, var/def_zone) +/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + switch(hitboxFlags) + if(HB_HEAD) + def_zone = BP_HEAD + if(HB_CHESTARMS) + if(!(def_zone in list(BP_L_ARM, BP_R_ARM, BP_CHEST))) + def_zone = pick(list(BP_L_ARM, BP_R_ARM, BP_CHEST)) + if(HB_GROIN) + def_zone = BP_GROIN + if(HB_LEGS) + if(!(def_zone in list(BP_L_LEG, BP_R_LEG))) + def_zone = pick(BP_L_LEG, BP_R_LEG) def_zone = check_zone(def_zone) if(!has_organ(def_zone)) return PROJECTILE_FORCE_MISS //if they don't have the organ in question then the projectile just passes by. diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index a38688a38e..6f1811bb5e 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -179,7 +179,7 @@ ..(-abs(amount)) // Heals them return -/mob/living/carbon/slime/bullet_act(var/obj/item/projectile/Proj) +/mob/living/carbon/slime/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) attacked += 10 ..(Proj) return 0 diff --git a/code/modules/mob/living/carbon/superior_animal/defense.dm b/code/modules/mob/living/carbon/superior_animal/defense.dm index 92aa6ee533..40895b86bc 100644 --- a/code/modules/mob/living/carbon/superior_animal/defense.dm +++ b/code/modules/mob/living/carbon/superior_animal/defense.dm @@ -20,7 +20,7 @@ check_AI_act() -/mob/living/carbon/superior_animal/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/carbon/superior_animal/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) . = ..() updatehealth() diff --git a/code/modules/mob/living/carbon/superior_animal/roach/types/benzin.dm b/code/modules/mob/living/carbon/superior_animal/roach/types/benzin.dm index 3fe0fccf47..63e7757130 100644 --- a/code/modules/mob/living/carbon/superior_animal/roach/types/benzin.dm +++ b/code/modules/mob/living/carbon/superior_animal/roach/types/benzin.dm @@ -29,7 +29,7 @@ return -/mob/living/carbon/superior_animal/roach/benzin/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/carbon/superior_animal/roach/benzin/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) . = ..() if(prob(80)) explosion(get_turf(src), -1, -1, 2, 3) diff --git a/code/modules/mob/living/carbon/superior_animal/roach/types/bluespace.dm b/code/modules/mob/living/carbon/superior_animal/roach/types/bluespace.dm index 5a3f06a049..344599b076 100644 --- a/code/modules/mob/living/carbon/superior_animal/roach/types/bluespace.dm +++ b/code/modules/mob/living/carbon/superior_animal/roach/types/bluespace.dm @@ -68,7 +68,7 @@ return FALSE . = ..() -/mob/living/carbon/superior_animal/roach/bluespace/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/carbon/superior_animal/roach/bluespace/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) if(prob(change_tele_to_mob)) var/source = src if(target_mob) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 4087ea307c..eb23da522e 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -513,7 +513,7 @@ /mob/living/silicon/robot/restrained() return FALSE -/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj) +/mob/living/silicon/robot/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(HasTrait(CYBORG_TRAIT_DEFLECTIVE_BALLISTIC_ARMOR) && istype(Proj, /obj/item/projectile/bullet)) var/chance = 90 if(ishuman(Proj.firer)) diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 4c90eba377..9d80dbe28f 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -115,7 +115,7 @@ /mob/living/silicon/IsAdvancedToolUser() return 1 -/mob/living/silicon/bullet_act(var/obj/item/projectile/Proj) +/mob/living/silicon/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if (Proj.is_hot() >= HEAT_MOBIGNITE_THRESHOLD) IgniteMob() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index d7c396fa4f..ee4fac9738 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -127,9 +127,9 @@ return set_flee_target(get_turf(src)) -/mob/living/simple_animal/cat/bullet_act(var/obj/item/projectile/proj) +/mob/living/simple_animal/cat/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) . = ..() - set_flee_target(proj.firer? proj.firer : src.loc) + set_flee_target(Proj.firer? Proj.firer : src.loc) /mob/living/simple_animal/cat/hitby(atom/movable/AM) . = ..() @@ -367,7 +367,7 @@ var/cat_number = 0 /mob/living/simple_animal/cat/runtime/set_flee_target(atom/A) return -/mob/living/simple_animal/cat/runtime/bullet_act(var/obj/item/projectile/proj) +/mob/living/simple_animal/cat/runtime/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) return PROJECTILE_FORCE_MISS /mob/living/simple_animal/cat/runtime/explosion_act(target_power) diff --git a/code/modules/mob/living/simple_animal/friendly/iriska.dm b/code/modules/mob/living/simple_animal/friendly/iriska.dm index 8e98064973..490557fb7c 100644 --- a/code/modules/mob/living/simple_animal/friendly/iriska.dm +++ b/code/modules/mob/living/simple_animal/friendly/iriska.dm @@ -156,9 +156,9 @@ var/list/despised = list() if((M.a_intent == I_HELP) && (M in tolerated)) if(prob(15)) say("PRRRR") -/mob/living/simple_animal/iriska/bullet_act(var/obj/item/projectile/proj) +/mob/living/simple_animal/iriska/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) . = ..() - despise(proj.firer) + despise(Proj.firer) /mob/living/simple_animal/iriska/hitby(atom/movable/AM) . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/stranger.dm b/code/modules/mob/living/simple_animal/hostile/stranger.dm index d0969586ab..90f4372760 100644 --- a/code/modules/mob/living/simple_animal/hostile/stranger.dm +++ b/code/modules/mob/living/simple_animal/hostile/stranger.dm @@ -95,7 +95,7 @@ return FALSE . = ..() -/mob/living/simple_animal/hostile/stranger/bullet_act(obj/item/projectile/P, def_zone) +/mob/living/simple_animal/hostile/stranger/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) if(prob(prob_tele)) var/source = src if(target_mob) diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 9a723a3e4f..b6926dcca5 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -70,7 +70,7 @@ visible_message("\red [user] gently taps [src] with the [O]. ") -/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj) +/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(!Proj) return if(prob(65)) ..() diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index d96a8809d7..85c9a3e3f5 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -246,7 +246,7 @@ return //Bullets -/mob/living/simple_animal/parrot/bullet_act(var/obj/item/projectile/Proj) +/mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) ..() if(!stat && !client) if(parrot_state == PARROT_PERCH) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 6a24009c24..885846c898 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -328,7 +328,7 @@ /mob/living/simple_animal/gib() ..(icon_gib,1) -/mob/living/simple_animal/bullet_act(var/obj/item/projectile/Proj) +/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(!Proj) return diff --git a/code/modules/modular_computers/computers/modular_computer/damage.dm b/code/modules/modular_computers/computers/modular_computer/damage.dm index 93b86e0a21..0d730614f1 100644 --- a/code/modules/modular_computers/computers/modular_computer/damage.dm +++ b/code/modules/modular_computers/computers/modular_computer/damage.dm @@ -49,7 +49,7 @@ // "Stun" weapons can cause minor damage to components (short-circuits?) // "Burn" damage is equally strong against internal components and exterior casing // "Brute" damage mostly damages the casing. -/obj/item/modular_computer/bullet_act(var/obj/item/projectile/P) +/obj/item/modular_computer/bullet_act(obj/item/projectile/P, defZone, hitboxFlags) var/dam = P.getAllDamType(BRUTE) take_damage(dam, dam/2) dam = P.getAllDamType(BURN) diff --git a/code/modules/onestar/os_turret.dm b/code/modules/onestar/os_turret.dm index 1e15bbe1ff..8a8d838a24 100644 --- a/code/modules/onestar/os_turret.dm +++ b/code/modules/onestar/os_turret.dm @@ -136,21 +136,21 @@ stat |= EMPED emp_timer_id = addtimer(CALLBACK(src, PROC_REF(emp_off)), emp_cooldown, TIMER_STOPPABLE) -/obj/machinery/power/os_turret/bullet_act(obj/item/projectile/proj) - var/damage = proj.get_structure_damage() +/obj/machinery/power/os_turret/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) + var/damage = Proj.get_structure_damage() if(!damage) - if(istype(proj, /obj/item/projectile/ion)) - proj.on_hit(loc) + if(istype(Proj, /obj/item/projectile/ion)) + Proj.on_hit(loc) return ..() - take_damage(damage*proj.structure_damage_factor) + take_damage(damage*Proj.structure_damage_factor) if(!returning_fire && !stat) returning_fire = TRUE - var/turf/proj_start_turf = proj.starting + var/turf/proj_start_turf = Proj.starting for(var/obj in proj_start_turf.contents) if(istype(obj, /obj/machinery/power/os_turret)) return // Don't shoot other turrets diff --git a/code/modules/organs/internal/carrion.dm b/code/modules/organs/internal/carrion.dm index 2798d04a58..acfaf1d611 100644 --- a/code/modules/organs/internal/carrion.dm +++ b/code/modules/organs/internal/carrion.dm @@ -592,7 +592,7 @@ visible_message(SPAN_WARNING("\The [src] bursts open!")) qdel(src) -/obj/structure/spider_nest/bullet_act(obj/item/projectile/P, def_zone) +/obj/structure/spider_nest/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) playsound(loc, 'sound/voice/shriek1.ogg', 85, 1, 8, 8) spawn_spider() visible_message(SPAN_WARNING("[src] bursts open!")) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index 13deb3e877..956fb1fa5d 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -167,7 +167,7 @@ description += "\The [src] shows signs of damage!" ..(user, afterDesc = description) -/obj/machinery/shipsensors/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shipsensors/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) take_damage(Proj.get_structure_damage()) ..() diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 4c3de8177b..de13e7cedc 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -93,7 +93,7 @@ check_stability() return 0 -/obj/machinery/am_shielding/bullet_act(obj/item/projectile/Proj) +/obj/machinery/am_shielding/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(Proj.check_armour != ARMOR_BULLET) stability -= dhTotalDamageStrict(Proj.melleDamages, ALL_ARMOR, list(BRUTE,BURN))/2 return FALSE diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 3df5a588ec..10ba54c279 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -154,7 +154,7 @@ field_generator power level display /obj/machinery/field_generator/emp_act() return 0 -/obj/machinery/field_generator/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/field_generator/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(istype(Proj, /obj/item/projectile/beam)) var/damage = Proj.getAllDamType(BURN) power += damage * EMITTER_DAMAGE_POWER_TRANSFER diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 41d9e6c882..f14ef2b06b 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -281,7 +281,7 @@ return 1 -/obj/machinery/power/supermatter/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/power/supermatter/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/turf/L = loc if(!istype(L)) // We don't run process() when we are in space return 0 // This stops people from being able to really power up the supermatter diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 3098a441db..880dbac656 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -6,7 +6,35 @@ /// global offsets , applied to all bounding boxes equally var/offsetX = 0 var/offsetY = 0 + /// stores the median levels to aim when shooting at the owner. + var/list/medianLevels var/atom/owner + /// converts the defZone argument to a specific level. + var/list/defZoneToLevel = list( + BP_EYES = HBF_USEMEDIAN, + BP_MOUTH = HBF_USEMEDIAN, + BP_HEAD = HBF_USEMEDIAN, + BP_CHEST = HBF_USEMEDIAN, + BP_L_LEG = HBF_USEMEDIAN, + BP_R_LEG = HBF_USEMEDIAN, + BP_GROIN = HBF_USEMEDIAN, + BP_R_ARM = HBF_USEMEDIAN, + BP_L_ARM = HBF_USEMEDIAN + ) + +/datum/hitboxDatum/New() + . = ..() + var/median + var/volumeSum + var/calculatedVolume = 0 + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + medianLevels["[direction]"] = median / volumeSum /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) @@ -19,15 +47,27 @@ if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) continue if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] return TRUE if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] return TRUE if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] return TRUE if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] return TRUE return FALSE +/datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone) + if(defZone == null || !defZone in defZoneToLevel) + return medianLevels["[owner.dir]"] + if(defZoneToLevel[defZone] == HBF_USEMEDIAN) + return medianLevels["[owner.dir]"] + message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") + return defZoneToLevel[defZone] + /* boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { @@ -83,10 +123,3 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo - - - - - - - diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index b5fbcbb942..f8a4978905 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -511,7 +511,8 @@ GLOBAL_LIST(projectileDamageConstants) for(var/i in 1 to length(hittingList)) var/obj/target = hittingList[i] - var/list/arguments = list(src, def_zone) + /// third slot reversed for flags passed back by hitbox intersect + var/list/arguments = list(src, def_zone, null) if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) return PROJECTILE_CONTINUE if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index dad45e5338..3281ef02a2 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -191,7 +191,7 @@ return ..() -/obj/structure/reagent_dispensers/fueltank/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(Proj.get_structure_damage()) if(istype(Proj.firer)) message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") diff --git a/code/modules/shield_generators/shield.dm b/code/modules/shield_generators/shield.dm index 3188f50955..a8280f7c9e 100644 --- a/code/modules/shield_generators/shield.dm +++ b/code/modules/shield_generators/shield.dm @@ -244,17 +244,17 @@ Like for example singulo act and whatever. // Projectiles -/obj/effect/shield/bullet_act(obj/item/projectile/proj) +/obj/effect/shield/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) var/totalDam = 0 - var/dam = proj.getAllDamType(BURN) - take_damage(dam, SHIELD_DAMTYPE_HEAT, proj) + var/dam = Proj.getAllDamType(BURN) + take_damage(dam, SHIELD_DAMTYPE_HEAT, Proj) totalDam += dam - dam = proj.getAllDamType(BRUTE) - take_damage(dam, SHIELD_DAMTYPE_PHYSICAL, proj) + dam = Proj.getAllDamType(BRUTE) + take_damage(dam, SHIELD_DAMTYPE_PHYSICAL, Proj) totalDam += dam - dam = proj.get_total_damage() - totalDam + dam = Proj.get_total_damage() - totalDam if(dam > 0) - take_damage(dam, SHIELD_DAMTYPE_EM, proj) + take_damage(dam, SHIELD_DAMTYPE_EM, Proj) // Attacks with hand tools. Blocked by Hyperkinetic flag. diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index 65e2ac7217..809387b50e 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -59,7 +59,7 @@ ..() -/obj/machinery/shield/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shield/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) shieldHealth -= Proj.get_structure_damage() ..() check_failure() diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 669105c1bc..bf38a436d3 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -27,7 +27,7 @@ Stress(0.5 + target_power / 100) return 0 -/obj/effect/energy_field/bullet_act(var/obj/item/projectile/Proj) +/obj/effect/energy_field/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) Stress(Proj.get_structure_damage() / 10) /obj/effect/energy_field/proc/Stress(var/severity) diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 77e0aedc1c..37a7583e73 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -247,7 +247,7 @@ src.cleanup(EAST) . = ..() -/obj/machinery/shieldwallgen/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shieldwallgen/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) storedpower -= 400 * Proj.get_structure_damage() ..() return @@ -315,7 +315,7 @@ gen_secondary.storedpower -= power_usage -/obj/machinery/shieldwall/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/shieldwall/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(needs_power) var/obj/machinery/shieldwallgen/G if(prob(50)) diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 2a8e4d930c..c48ec6a791 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -97,7 +97,7 @@ to_chat(user, "You short out the console's ID checking system. It's now available to everyone!") return 1 -/obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/computer/shuttle_control/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) visible_message("\The [Proj] ricochets off \the [src]!") /obj/machinery/computer/shuttle_control/explosion_act(target_power, explosion_handler/handler) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 09c5ae5b3c..1505d3ce99 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -74,7 +74,7 @@ ..() //cargo trains are open topped, so there is a chance the projectile will hit the mob ridding the train instead -/obj/vehicle/train/cargo/bullet_act(var/obj/item/projectile/Proj) +/obj/vehicle/train/cargo/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) if(buckled_mob && prob(70)) buckled_mob.bullet_act(Proj) return diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index ba9c439989..e7437b165d 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -137,7 +137,7 @@ else ..() -/obj/vehicle/bullet_act(var/obj/item/projectile/Proj) +/obj/vehicle/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) health -= Proj.get_structure_damage() ..() healthcheck() diff --git a/oldcode/shuttles_old/old_shuttle_console.dm b/oldcode/shuttles_old/old_shuttle_console.dm index 34e1135b7b..4c7d15c213 100644 --- a/oldcode/shuttles_old/old_shuttle_console.dm +++ b/oldcode/shuttles_old/old_shuttle_console.dm @@ -92,7 +92,7 @@ user << "You short out the console's ID checking system. It's now available to everyone!" return 1 -/obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) +/obj/machinery/computer/shuttle_control/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) visible_message("\The [Proj] ricochets off \the [src]!") /obj/machinery/computer/shuttle_control/explosion_act(target_power, explosion_handler/handler) From f64a072bb15dd0d85b301d5fa863fb5b3c474567 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 20 May 2024 05:56:15 +0200 Subject: [PATCH 105/171] A --- code/__DEFINES/_bullets.dm | 27 +++++ code/modules/mob/living/carbon/human/human.dm | 54 ++++----- .../mob/living/carbon/human/human_defense.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 105 ++++++++++++------ 4 files changed, 131 insertions(+), 56 deletions(-) diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index 5bde073203..f5a7e3719c 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -13,6 +13,32 @@ #define HBF_NOLEVEL -99999 #define HBF_USEMEDIAN -100000 +// hitbox datum flags +/* List format is expected to be +list( + "[dir1]" = list(boundingBox1, boundingBox2...), + "[dir2]" = list(boundingBox1, boundingBox2...) + ... + ) + +*/ +#define HB_ATOMFORMAT 1<<1 +/* List format is expected to be +* list( + "lying(TRUE)" = list( + "[dir1]" = list(boundingBox1, boundingBox2...), + "[dir2]" = list(boundingBox1, boundingBox2...) + ... + ), + "lying(FALSE)" = list( + "[dir1]" = list(boundingBox1, boundingBox2...), + "[dir2]" = list(boundingBox1, boundingBox2...) + ... + ), + ) +*/ +#define HB_MOBFORMAT 1<<2 + // return flags for the hitboxDatum , with functionality implemented in bullet_act. passed under hitboxFlags // these have no excuse to be general , add them for any object you want to add special functonality to with regards to where it is hit. @@ -22,3 +48,4 @@ #define HB_CHESTARMS 1<<2 #define HB_GROIN 1<<3 #define HB_LEGS 1<<4 +#define HB_AIMED 1<<5 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 479d401142..91c8922eed 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -15,32 +15,35 @@ /datum/hitboxDatum/human boundingBoxes = list( - LISTNORTH = list( - BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + "0" = list( + LISTNORTH = list( + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + ), + LISTSOUTH = list( + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + ), + LISTEAST = list( + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + ), + LISTWEST = list( + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + ) ), - LISTSOUTH = list( - BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD - ), - LISTEAST = list( - BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD - ), - LISTWEST = list( - BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD - ) + "1" = list() ) defZoneToLevel = list( BP_EYES = (LEVEL_STANDING + LEVEL_CHEST)/2, @@ -53,6 +56,7 @@ BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 ) + hbFlags = HB_MOBFORMAT /mob/living/carbon/human/Initialize(new_loc, new_species) hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100", ON_MOB_HUD_LAYER) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 89394b7e84..52ab000e70 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -8,6 +8,7 @@ meteor_act */ /mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + // HB_AIMED is not accounted for since that just means not modifying def zone switch(hitboxFlags) if(HB_HEAD) def_zone = BP_HEAD diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 880dbac656..2fa41364b5 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -21,20 +21,33 @@ BP_R_ARM = HBF_USEMEDIAN, BP_L_ARM = HBF_USEMEDIAN ) + var/hbFlags = HB_ATOMFORMAT /datum/hitboxDatum/New() . = ..() var/median var/volumeSum var/calculatedVolume = 0 - for(var/direction in list(NORTH, SOUTH, EAST , WEST)) - median = 0 - volumeSum = 0 - for(var/list/boundingBox in boundingBoxes["[direction]"]) - calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) - median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume - volumeSum += calculatedVolume - medianLevels["[direction]"] = median / volumeSum + if(hbFlags & HB_ATOMFORMAT) + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + medianLevels["[direction]"] = median / volumeSum + else + for(var/state in boundingBoxes) + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes[state]["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + medianLevels[state]["[direction]"] = median / volumeSum + /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) @@ -42,31 +55,61 @@ var/global/worldY worldX = owner.x * 32 worldY = owner.y * 32 - for(var/list/boundingData in boundingBoxes["[owner.dir]"]) - /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) - continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - return FALSE + if(hbFlags & HB_ATOMFORMAT) + for(var/list/boundingData in boundingBoxes["[owner.dir]"]) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + continue + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + return FALSE + else + var/mob/living/perceivedOwner = src.owner + for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + continue + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + return FALSE + /datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone) - if(defZone == null || !defZone in defZoneToLevel) - return medianLevels["[owner.dir]"] - if(defZoneToLevel[defZone] == HBF_USEMEDIAN) - return medianLevels["[owner.dir]"] - message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") - return defZoneToLevel[defZone] + if(hbFlags & HB_ATOMFORMAT) + if(defZone == null || (!defZone in defZoneToLevel)) + return medianLevels["[owner.dir]"] + if(defZoneToLevel[defZone] == HBF_USEMEDIAN) + return medianLevels["[owner.dir]"] + message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") + return defZoneToLevel[defZone] + else + var/mob/living/perceivedOwner = src.owner + if(defZone == null || (!defZone in defZoneToLevel["[perceivedOwner.lying]"])) + return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] + if(defZoneToLevel[defZone] == HBF_USEMEDIAN) + return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] + message_admins("Returned [defZoneToLevel[perceivedOwner.lying][defZone]] for [defZone]") + return defZoneToLevel["[perceivedOwner.lying]"][defZone] /* boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { From e33346ade9b4970446fd810d2f07f894add83109 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 20 May 2024 16:50:00 +0200 Subject: [PATCH 106/171] aa --- code/__DEFINES/_bullets.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 58 +++++++++++++++---- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index f5a7e3719c..2b81a7a6f2 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -1,6 +1,6 @@ /// These define the MAXIMUM height for a level (as in a standing human height is considered) #define LEVEL_BELOW 0 -#define LEVEL_TURF 0.5 +#define LEVEL_TURF 0.3 #define LEVEL_LYING 0.7 #define LEVEL_LOWWALL 1 #define LEVEL_TABLE 1.2 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 91c8922eed..7e45e1851c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -43,18 +43,56 @@ BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD ) ), - "1" = list() + "1" = list( + LISTNORTH = list( + BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), + BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(23,14,28,20, LEVE_TURF + 0.3, LEVEL_LYING, HB_HEAD) + ), + LISTSOUTH = list( + BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), + BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(23,14,28,20, LEVE_TURF + 0.3, LEVEL_LYING, HB_HEAD) + ), + LISTEAST = list( + BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), + BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) + ), + LISTWEST = list( + BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), + BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) + ) + ) ) defZoneToLevel = list( - BP_EYES = (LEVEL_STANDING + LEVEL_CHEST)/2, - BP_MOUTH = (LEVEL_STANDING + LEVEL_CHEST)/2, - BP_HEAD = (LEVEL_STANDING + LEVEL_CHEST)/2, - BP_CHEST = (LEVEL_CHEST + LEVEL_GROIN)/2, - BP_R_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, - BP_L_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, - BP_GROIN = (LEVEL_GROIN + LEVEL_TABLE)/2, - BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, - BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 + "0" = list( + BP_EYES = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_MOUTH = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_HEAD = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_CHEST = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_R_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_L_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_GROIN = (LEVEL_GROIN + LEVEL_TABLE)/2, + BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, + BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 + ) + "1" = list( + BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, + BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, + BP_HEAD = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, + BP_CHEST = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, + BP_R_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, + BP_L_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, + BP_GROIN = (LEVEL_TURF + 0.1 + LEVEL_TURF + 0.2)/2, + BP_L_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2, + BP_R_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2 + ) ) hbFlags = HB_MOBFORMAT From 0e99fd51a39ba0991ae64026aabf170167cf0e43 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 21 May 2024 14:23:15 +0200 Subject: [PATCH 107/171] aa --- code/modules/mob/living/carbon/human/human.dm | 6 +++--- code/modules/projectiles/hitbox_datums.dm | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7e45e1851c..3a8b2d93c4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -48,13 +48,13 @@ BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVE_TURF + 0.3, LEVEL_LYING, HB_HEAD) + BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) ), LISTSOUTH = list( BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVE_TURF + 0.3, LEVEL_LYING, HB_HEAD) + BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) ), LISTEAST = list( BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), @@ -81,7 +81,7 @@ BP_GROIN = (LEVEL_GROIN + LEVEL_TABLE)/2, BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 - ) + ), "1" = list( BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 2fa41364b5..8c3c1a8f13 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -108,7 +108,7 @@ return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] if(defZoneToLevel[defZone] == HBF_USEMEDIAN) return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] - message_admins("Returned [defZoneToLevel[perceivedOwner.lying][defZone]] for [defZone]") + message_admins("Returned [defZoneToLevel["[perceivedOwner.lying]"][defZone]] for [defZone]") return defZoneToLevel["[perceivedOwner.lying]"][defZone] /* From 46a145145111d2896c2ec133fc9178f48f13cb67 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 21 May 2024 20:07:04 +0200 Subject: [PATCH 108/171] the changez --- code/__DEFINES/_bullets.dm | 42 +-- code/controllers/subsystems/bullets.dm | 17 +- code/game/turfs/simulated/walls.dm | 25 +- code/modules/mob/living/carbon/human/human.dm | 5 +- code/modules/mob/living/carbon/human/life.dm | 3 +- code/modules/projectiles/gun.dm | 3 +- code/modules/projectiles/hitbox_datums.dm | 187 ++++++------ code/modules/projectiles/projectile.dm | 8 +- code/modules/projectiles/projectile/beams.dm | 2 +- .../modules/projectiles/projectile/bullets.dm | 4 +- maps/testmap/test_map.dmm | 273 ++++++++++-------- 11 files changed, 304 insertions(+), 265 deletions(-) diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index 2b81a7a6f2..cb43193694 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -13,39 +13,17 @@ #define HBF_NOLEVEL -99999 #define HBF_USEMEDIAN -100000 -// hitbox datum flags -/* List format is expected to be -list( - "[dir1]" = list(boundingBox1, boundingBox2...), - "[dir2]" = list(boundingBox1, boundingBox2...) - ... - ) - -*/ -#define HB_ATOMFORMAT 1<<1 -/* List format is expected to be -* list( - "lying(TRUE)" = list( - "[dir1]" = list(boundingBox1, boundingBox2...), - "[dir2]" = list(boundingBox1, boundingBox2...) - ... - ), - "lying(FALSE)" = list( - "[dir1]" = list(boundingBox1, boundingBox2...), - "[dir2]" = list(boundingBox1, boundingBox2...) - ... - ), - ) -*/ -#define HB_MOBFORMAT 1<<2 - // return flags for the hitboxDatum , with functionality implemented in bullet_act. passed under hitboxFlags // these have no excuse to be general , add them for any object you want to add special functonality to with regards to where it is hit. - +/// GENERAL +#define HB_AIMED 1<<1 /// mob/living/carbon/human and any subtypes -#define HB_HEAD 1<<1 -#define HB_CHESTARMS 1<<2 -#define HB_GROIN 1<<3 -#define HB_LEGS 1<<4 -#define HB_AIMED 1<<5 +#define HB_HEAD 1<<2 +#define HB_CHESTARMS 1<<3 +#define HB_GROIN 1<<4 +#define HB_LEGS 1<<5 +// barricades and whatever object implements this +#define HB_WEAKPOINT 1<<6 + + diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 6f35c6f4fb..a3b9d52a7d 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -1,7 +1,12 @@ /// Pixels per turf #define PPT 32 #define HPPT (PPT/2) -#define MAXPIXELS 32 +/// the higher you go the higher you risk trajectories becoming wobbly and inaccurate. +/// 16 is the absolute lowest which guarantees maximum accuracy. +/// 20 is a safe bet between 24 and 16 +/// the higher this is ,the more performant the system is , since more of the math is done at once instead of in stages +/// it is also more inaccurate the higher you go.. +#define MAXPIXELS 20 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -62,8 +67,9 @@ SUBSYSTEM_DEF(bullets) var/isTraversingLevel = FALSE /// Used to animate the ending pixels var/hasImpacted = FALSE + //var/list/painted = list() -/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick, angleOffset, lifetime) +/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick,zOffset, angleOffset, lifetime) /* if(!target) message_admins("Created bullet without target , [referencedBullet]") @@ -128,7 +134,8 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * MAXPIXELS) - message_admins("calculated movementRatio , [movementRatios[3]] , with maxPixels , [movementRatios[3] * MAXPIXELS]") + movementRatios[3] += zOffset / MAXPIXELS + message_admins("calculated movementRatio , [movementRatios[3]] , with maxPixels , [movementRatios[3] * MAXPIXELS] - offset [zOffset/MAXPIXELS]") movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -284,6 +291,8 @@ SUBSYSTEM_DEF(bullets) projectile.pixel_y -= PPT * ty_change bullet.updateLevel() if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) + //bullet.painted.Add(moveTurf) + moveTurf.color = COLOR_RED projectile.forceMove(moveTurf) if(moveTurf == bullet.targetTurf) message_admins("Reached target with level of [bulletCoords[3]]") @@ -298,5 +307,7 @@ SUBSYSTEM_DEF(bullets) if(bullet.lifetime < 0) bullet.referencedBullet.finishDeletion() bullet_queue -= bullet + //for(var/turf/painted in bullet.painted) + // painted.color = initial(painted.color) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 1473fae19d..bbe4451598 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -129,24 +129,29 @@ switch(angle) if(-180 to -155) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - hittingProjectile.dataRef.bounce(1, rand(-5,5)) - ricochet = TRUE + if(!get_step(src, ((hittingProjectile.x - x) < 0) ? WEST : EAST)?:density) + hittingProjectile.dataRef.bounce(1, rand(-5,5)) + ricochet = TRUE if(-115 to -65) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - hittingProjectile.dataRef.bounce(2, rand(-5,5)) - ricochet = TRUE + if(!get_step(src, ((hittingProjectile.y - y) < 0) ? SOUTH : NORTH)?:density) + hittingProjectile.dataRef.bounce(2, rand(-5,5)) + ricochet = TRUE if(-25 to 25) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - hittingProjectile.dataRef.bounce(1, rand(-5,5)) - ricochet = TRUE + if(!get_step(src, ((hittingProjectile.x - x) < 0) ? WEST : EAST)?:density) + hittingProjectile.dataRef.bounce(1, rand(-5,5)) + ricochet = TRUE if(65 to 115) if((abs(lastMoves[1]) >= abs(lastMoves[2])) && abs(lastMoves[2])) - hittingProjectile.dataRef.bounce(2, rand(-5,5)) - ricochet = TRUE + if(!get_step(src, ((hittingProjectile.y - y) < 0) ? SOUTH : NORTH)?:density) + hittingProjectile.dataRef.bounce(2, rand(-5,5)) + ricochet = TRUE if(155 to 180) if((abs(lastMoves[2]) >= abs(lastMoves[1])) && abs(lastMoves[1])) - hittingProjectile.dataRef.bounce(1, rand(-5,5)) - ricochet = TRUE + if(!get_step(src, ((hittingProjectile.x - x) < 0) ? WEST : EAST)?:density) + hittingProjectile.dataRef.bounce(1, rand(-5,5)) + ricochet = TRUE if(ricochet) take_damage(round(projectileDamage * 0.33)) message_admins("Ricochet at [angle].") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3a8b2d93c4..58c7ec9757 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -6,14 +6,14 @@ icon_state = "body_m_s" /// everyone is 65 KGs weight = 65000 - hitbox = /datum/hitboxDatum/human + hitbox = /datum/hitboxDatum/mob/human var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_lying_buckled_and_verb_status() call. var/using_scope // This is not very good either, because I've copied it. Sorry. -/datum/hitboxDatum/human +/datum/hitboxDatum/mob/human boundingBoxes = list( "0" = list( LISTNORTH = list( @@ -94,7 +94,6 @@ BP_R_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2 ) ) - hbFlags = HB_MOBFORMAT /mob/living/carbon/human/Initialize(new_loc, new_species) hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100", ON_MOB_HUD_LAYER) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index bc7636e70c..66cbea63cd 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -839,8 +839,7 @@ if(client || sleeping > 3) AdjustSleeping(-1) if( prob(2) && health) - spawn(0) - emote("snore") + emote("snore") //CONSCIOUS else stat = CONSCIOUS diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index cc78ae9a5c..33a415c032 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -619,6 +619,7 @@ var/list/paramList = params2list(params) var/offset = user.calculate_offset(init_offset_with_brace(user)) + var/zOffset = offset/300 * sign(rand(-1,1)) var/remainder = offset % 4 offset /= 4 offset = round(offset) @@ -635,7 +636,7 @@ offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), offset) + return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), zOffset,offset) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 8c3c1a8f13..2a60653fee 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -21,95 +21,12 @@ BP_R_ARM = HBF_USEMEDIAN, BP_L_ARM = HBF_USEMEDIAN ) - var/hbFlags = HB_ATOMFORMAT - -/datum/hitboxDatum/New() - . = ..() - var/median - var/volumeSum - var/calculatedVolume = 0 - if(hbFlags & HB_ATOMFORMAT) - for(var/direction in list(NORTH, SOUTH, EAST , WEST)) - median = 0 - volumeSum = 0 - for(var/list/boundingBox in boundingBoxes["[direction]"]) - calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) - median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume - volumeSum += calculatedVolume - medianLevels["[direction]"] = median / volumeSum - else - for(var/state in boundingBoxes) - for(var/direction in list(NORTH, SOUTH, EAST , WEST)) - median = 0 - volumeSum = 0 - for(var/list/boundingBox in boundingBoxes[state]["[direction]"]) - calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) - median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume - volumeSum += calculatedVolume - medianLevels[state]["[direction]"] = median / volumeSum - /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) - var/global/worldX - var/global/worldY - worldX = owner.x * 32 - worldY = owner.y * 32 - if(hbFlags & HB_ATOMFORMAT) - for(var/list/boundingData in boundingBoxes["[owner.dir]"]) - /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) - continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - return FALSE - else - var/mob/living/perceivedOwner = src.owner - for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) - /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) - continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - return FALSE - /datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone) - if(hbFlags & HB_ATOMFORMAT) - if(defZone == null || (!defZone in defZoneToLevel)) - return medianLevels["[owner.dir]"] - if(defZoneToLevel[defZone] == HBF_USEMEDIAN) - return medianLevels["[owner.dir]"] - message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") - return defZoneToLevel[defZone] - else - var/mob/living/perceivedOwner = src.owner - if(defZone == null || (!defZone in defZoneToLevel["[perceivedOwner.lying]"])) - return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] - if(defZoneToLevel[defZone] == HBF_USEMEDIAN) - return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] - message_admins("Returned [defZoneToLevel["[perceivedOwner.lying]"][defZone]] for [defZone]") - return defZoneToLevel["[perceivedOwner.lying]"][defZone] + /* boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { @@ -164,5 +81,107 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo newOverlay.pixel_y = hitbox[2] - 1 owner.overlays.Add(newOverlay) +/datum/hitboxDatum/atom + +/datum/hitboxDatum/atom/New() + . = ..() + var/median + var/volumeSum + var/calculatedVolume = 0 + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + medianLevels["[direction]"] = median / volumeSum + +/datum/hitboxDatum/atom/getAimingLevel(atom/shooter, defZone) + if(defZone == null || (!defZone in defZoneToLevel)) + return medianLevels["[owner.dir]"] + if(defZoneToLevel[defZone] == HBF_USEMEDIAN) + return medianLevels["[owner.dir]"] + message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") + return defZoneToLevel[defZone] + + /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 +/datum/hitboxDatum/atom/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) + var/global/worldX + var/global/worldY + worldX = owner.x * 32 + worldY = owner.y * 32 + for(var/list/boundingData in boundingBoxes["[owner.dir]"]) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + continue + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + return FALSE + +/datum/hitboxDatum/mob + +/datum/hitboxDatum/mob/New() + . = ..() + var/median + var/volumeSum + var/calculatedVolume = 0 + for(var/state in boundingBoxes) + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes[state]["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + medianLevels[state]["[direction]"] = median / volumeSum + +/datum/hitboxDatum/mob/getAimingLevel(atom/shooter, defZone) + var/mob/living/perceivedOwner = src.owner + if(defZone == null || (!defZone in defZoneToLevel["[perceivedOwner.lying]"])) + return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] + if(defZoneToLevel[defZone] == HBF_USEMEDIAN) + return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] + message_admins("Returned [defZoneToLevel["[perceivedOwner.lying]"][defZone]] for [defZone]") + return defZoneToLevel["[perceivedOwner.lying]"][defZone] + +/datum/hitboxDatum/mob/intersects(list/lineData, ownerDirection, turf/incomingFrom, atom/owner, list/arguments) + . = ..() + var/global/worldX + var/global/worldY + worldX = owner.x * 32 + worldY = owner.y * 32 + var/mob/living/perceivedOwner = src.owner + for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + continue + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + return FALSE + + + + diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index f8a4978905..1a0fbb2d63 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -262,7 +262,7 @@ GLOBAL_LIST(projectileDamageConstants) p_y = text2num(mouse_control["icon-y"]) //called to launch a projectile -/obj/item/projectile/proc/launch(atom/target, target_zone, x_offset = 0, y_offset = 0, angle_offset = 0, proj_sound, user_recoil = 0) +/obj/item/projectile/proc/launch(atom/target, target_zone, x_offset = 0, y_offset = 0,zOffset = 0, angle_offset = 0, proj_sound, user_recoil = 0) var/turf/curloc = get_turf(src) var/turf/targloc = get_turf(target) if (!istype(targloc) || !istype(curloc)) @@ -284,13 +284,13 @@ GLOBAL_LIST(projectileDamageConstants) check_hit_zone(distance, user_recoil) muzzle_effect(effect_transform) - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 48, angle_offset, 50) + new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 48,zOffset, angle_offset, 50) //Process() return FALSE //called to launch a projectile from a gun -/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset) +/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, zOffset=0, angle_offset) if(user == target) //Shooting yourself user.bullet_act(src, target_zone) qdel(src) @@ -323,7 +323,7 @@ GLOBAL_LIST(projectileDamageConstants) firer = user shot_from = launcher.name silenced = launcher.item_flags & SILENT - return launch(target, target_zone, x_offset, y_offset, angle_offset, user_recoil = recoil) + return launch(target, target_zone, x_offset, y_offset,zOffset, angle_offset, user_recoil = recoil) /obj/item/projectile/proc/istargetloc(mob/living/target_mob) if(target_mob && original) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index ec40c9e142..5bf0ec16d2 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -116,7 +116,7 @@ tracer_type = /obj/effect/projectile/psychic_laser_heavy/tracer impact_type = /obj/effect/projectile/psychic_laser_heavy/impact -/obj/item/projectile/beam/psychic/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset) +/obj/item/projectile/beam/psychic/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0,zOffset, angle_offset) holder = launcher if(holder && holder.contractor) contractor = holder.contractor diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 7fa1594986..c17d6b8eed 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -125,8 +125,8 @@ wounding_mult = WOUNDING_SMALL matter = list(MATERIAL_STEEL = 0.4) -/obj/item/projectile/bullet/pellet/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, angle_offset) - for(var/entry in matter) // this allows for the projectile in the casing having the correct matter +/obj/item/projectile/bullet/pellet/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0,zOffset, angle_offset) + for(var/entry in matter) // this allows for the projectile in the casing having the correct matter matter[entry] /= pellets // yet disallows for pellet shrapnel created on impact multiplying the matter count . = ..() diff --git a/maps/testmap/test_map.dmm b/maps/testmap/test_map.dmm index e1f92085c6..396a868920 100644 --- a/maps/testmap/test_map.dmm +++ b/maps/testmap/test_map.dmm @@ -483,6 +483,9 @@ }, /turf/simulated/floor, /area/testing/first) +"ep" = ( +/turf/simulated/wall/r_wall, +/area/testing/first) "fA" = ( /obj/item/storage/toolbox/mechanical, /turf/simulated/floor, @@ -499,6 +502,14 @@ /obj/item/implantcase/excelsior, /turf/simulated/floor, /area/testing/first) +"hf" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/item/ammo_magazine/c10x24, +/obj/item/ammo_magazine/c10x24, +/turf/simulated/floor, +/area/testing/first) "id" = ( /obj/machinery/conveyor/northeast/ccw, /turf/simulated/floor, @@ -554,6 +565,10 @@ /obj/item/mine, /turf/simulated/floor, /area/testing/first) +"qb" = ( +/obj/item/gun/projectile/automatic/dallas, +/turf/simulated/floor, +/area/testing/first) "qi" = ( /obj/structure/cable{ d1 = 4; @@ -604,6 +619,9 @@ }, /turf/simulated/floor, /area/testing/first) +"AD" = ( +/turf/simulated/wall/r_wall, +/area/space) "AG" = ( /obj/item/stock_parts/micro_laser/high, /obj/item/stock_parts/micro_laser/high, @@ -646,6 +664,10 @@ }, /turf/simulated/floor, /area/testing/first) +"Pq" = ( +/obj/structure/table/reinforced, +/turf/simulated/floor, +/area/testing/first) "QE" = ( /obj/item/implanter/excelsior, /turf/simulated/floor, @@ -660,6 +682,11 @@ /obj/landmark/join/late/cryo, /turf/simulated/floor, /area/testing/first) +"Sh" = ( +/obj/item/ammo_magazine/c10x24, +/obj/item/ammo_magazine/c10x24, +/turf/simulated/floor, +/area/testing/first) "SM" = ( /obj/machinery/conveyor/northwest, /turf/simulated/floor, @@ -1308,18 +1335,18 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +AD +AD +AD +AD +AD +AD +AD +AD +AD +AD +AD +AD ab ab ab @@ -1410,19 +1437,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +ep +ep +ep +ep +ep +ep +ep +ep +ep +ep +ae af an he @@ -1512,19 +1539,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +an +Vb +an +an +an +an +an +Vb +an +an +an an he he @@ -1614,19 +1641,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +an +aF +an +an +an +an +Pq +Sh +qb +ep +ae ah an QE @@ -1716,19 +1743,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +an +aF +an +an +an +an +Pq +Sh +qb +ep +ae ai Tb RE @@ -1818,19 +1845,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +an +aF +an +an +an +an +Pq +Sh +qb +ep +ae aj jn av @@ -1920,19 +1947,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +an +aF +an +an +an +an +Pq +Sh +qb +ep +ae ak ar aw @@ -2022,19 +2049,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +an +bo +an +an +an +an +Pq +hf +qb +ep +ae al an ax @@ -2124,19 +2151,19 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -ab +AD +ep +ep +ep +ep +ep +ep +ep +ep +ep +ep +ep +ae Xr Ze TG @@ -2226,13 +2253,13 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa +AD +AD +AD +AD +AD +AD +AD ab ab ab From 3b41ee42ad8d196974572f3d70b6de94a0ee474a Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 22 May 2024 11:48:20 +0200 Subject: [PATCH 109/171] aaaa --- code/__DEFINES/_bullets.dm | 19 ++++++++----- code/controllers/subsystems/bullets.dm | 26 ++++++++--------- code/game/objects/structures.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 28 +++++++++---------- 4 files changed, 40 insertions(+), 35 deletions(-) diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index cb43193694..55d65fe5a1 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -1,13 +1,18 @@ /// These define the MAXIMUM height for a level (as in a standing human height is considered) #define LEVEL_BELOW 0 #define LEVEL_TURF 0.3 -#define LEVEL_LYING 0.7 -#define LEVEL_LOWWALL 1 -#define LEVEL_TABLE 1.2 -#define LEVEL_GROIN 1.3 -#define LEVEL_CHEST 1.5 -#define LEVEL_STANDING 1.7 -#define LEVEL_ABOVE 2 +#define LEVEL_LYING 0.6 +#define LEVEL_LOWWALL 0.8 +#define LEVEL_TABLE 1 +#define LEVEL_LEGS 1 +#define LEVEL_GROIN 1.1 +#define LEVEL_CHEST 1.8 +#define LEVEL_HEAD 2.1 +#define LEVEL_ABOVE 3 + +// update these , using max() on defines wont give you constants +#define LEVEL_MAX 3 +#define LEVEL_MIN 0 // return flags for aimingLevels ,this makes it so it uses the shooter's default aiming level , be it by their current level or def zone they are aiming at. #define HBF_NOLEVEL -99999 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index a3b9d52a7d..1ffbd2d541 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -97,11 +97,11 @@ SUBSYSTEM_DEF(bullets) if(firer:lying) src.firedLevel = LEVEL_LYING else - src.firedLevel = LEVEL_STANDING + src.firedLevel = LEVEL_HEAD else - src.firedLevel = LEVEL_STANDING + src.firedLevel = LEVEL_HEAD else - src.firedLevel = LEVEL_STANDING + src.firedLevel = LEVEL_HEAD if(target) src.target = target src.targetTurf = get_turf(target) @@ -113,17 +113,17 @@ SUBSYSTEM_DEF(bullets) if(target:lying) src.targetLevel = LEVEL_LYING else - src.targetLevel = LEVEL_STANDING + src.targetLevel = LEVEL_HEAD else - src.targetLevel = LEVEL_STANDING + src.targetLevel = LEVEL_HEAD else if(istype(target, /obj/structure/low_wall)) src.targetLevel = LEVEL_LOWWALL else if(istype(target, /obj/structure/window)) - src.targetLevel = LEVEL_STANDING + src.targetLevel = LEVEL_HEAD else if(istype(target, /obj/structure/table)) src.targetLevel = LEVEL_TABLE else if(iswall(target)) - src.targetLevel = LEVEL_STANDING + src.targetLevel = LEVEL_HEAD else if(isturf(target)) src.targetLevel = LEVEL_TURF else if(isitem(target)) @@ -204,9 +204,9 @@ SUBSYSTEM_DEF(bullets) currentLevel = LEVEL_LOWWALL if(LEVEL_LOWWALL to LEVEL_TABLE) currentLevel = LEVEL_TABLE - if(LEVEL_TABLE to LEVEL_STANDING) - currentLevel = LEVEL_STANDING - if(LEVEL_STANDING to INFINITY) + if(LEVEL_TABLE to LEVEL_HEAD) + currentLevel = LEVEL_HEAD + if(LEVEL_HEAD to INFINITY) currentLevel = LEVEL_ABOVE /datum/bullet_data/proc/getLevel(height) @@ -221,9 +221,9 @@ SUBSYSTEM_DEF(bullets) return LEVEL_LOWWALL if(LEVEL_LOWWALL to LEVEL_TABLE) return LEVEL_TABLE - if(LEVEL_TABLE to LEVEL_STANDING) - return LEVEL_STANDING - if(LEVEL_STANDING to INFINITY) + if(LEVEL_TABLE to LEVEL_HEAD) + return LEVEL_HEAD + if(LEVEL_HEAD to INFINITY) return LEVEL_ABOVE /datum/controller/subsystem/bullets/proc/reset() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 5162905b8d..c2407ec8d9 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -9,7 +9,7 @@ #define LEVEL_LYING -0.5 #define LEVEL_LOWWALL 0 #define LEVEL_TABLE 0.2 -#define LEVEL_STANDING 0.7 +#define LEVEL_HEAD 0.7 #define LEVEL_ABOVE 1 */ /// Byond doesn't like if you try to put defines inside... so just use the numbers. check the latest values at _bullet.dm in _DEFINES folder. SPCR 2024 diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 58c7ec9757..3259c80875 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -21,26 +21,26 @@ BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD ), LISTSOUTH = list( BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD ), LISTEAST = list( BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD ), LISTWEST = list( BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_STANDING, HB_HEAD) // HEAD + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD ) ), "1" = list( @@ -48,33 +48,33 @@ BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) + BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) ), LISTSOUTH = list( BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) + BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) ), LISTEAST = list( BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) + BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) ), LISTWEST = list( BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_LYING, HB_HEAD) + BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) ) ) ) defZoneToLevel = list( "0" = list( - BP_EYES = (LEVEL_STANDING + LEVEL_CHEST)/2, - BP_MOUTH = (LEVEL_STANDING + LEVEL_CHEST)/2, - BP_HEAD = (LEVEL_STANDING + LEVEL_CHEST)/2, + BP_EYES = (LEVEL_HEAD + LEVEL_CHEST)/2, + BP_MOUTH = (LEVEL_HEAD + LEVEL_CHEST)/2, + BP_HEAD = (LEVEL_HEAD + LEVEL_CHEST)/2, BP_CHEST = (LEVEL_CHEST + LEVEL_GROIN)/2, BP_R_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, BP_L_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, @@ -83,9 +83,9 @@ BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 ), "1" = list( - BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, - BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, - BP_HEAD = (LEVEL_TURF + 0.3 + LEVEL_LYING)/2, + BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, + BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, + BP_HEAD = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, BP_CHEST = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, BP_R_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, BP_L_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, From 25d03832c6c4146368a4822f30a688dc1e4cd944 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 23 May 2024 07:06:49 +0200 Subject: [PATCH 110/171] aa --- code/__DEFINES/_bullets.dm | 7 ++++ code/controllers/subsystems/bullets.dm | 56 ++++++++++++++------------ code/modules/projectiles/gun.dm | 2 +- 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index 55d65fe5a1..bc2005bcc2 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -18,6 +18,13 @@ #define HBF_NOLEVEL -99999 #define HBF_USEMEDIAN -100000 +#define PIXEL_FUDGE (1/1024) + +proc/snapNum(n) + . = n + n = round(n,1) + if(abs(.-n) < PIXEL_FUDGE) . = n + // return flags for the hitboxDatum , with functionality implemented in bullet_act. passed under hitboxFlags // these have no excuse to be general , add them for any object you want to add special functonality to with regards to where it is hit. diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 1ffbd2d541..d8e8dc0be8 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -67,7 +67,8 @@ SUBSYSTEM_DEF(bullets) var/isTraversingLevel = FALSE /// Used to animate the ending pixels var/hasImpacted = FALSE - //var/list/painted = list() + var/list/painted = list() + var/traveled /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick,zOffset, angleOffset, lifetime) /* @@ -97,9 +98,9 @@ SUBSYSTEM_DEF(bullets) if(firer:lying) src.firedLevel = LEVEL_LYING else - src.firedLevel = LEVEL_HEAD + src.firedLevel = LEVEL_CHEST else - src.firedLevel = LEVEL_HEAD + src.firedLevel = LEVEL_CHEST else src.firedLevel = LEVEL_HEAD if(target) @@ -133,9 +134,10 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * MAXPIXELS) - movementRatios[3] += zOffset / MAXPIXELS - message_admins("calculated movementRatio , [movementRatios[3]] , with maxPixels , [movementRatios[3] * MAXPIXELS] - offset [zOffset/MAXPIXELS]") + message_admins("Distance to target is [distStartToFinish2D()] , startingLevel [firedLevel] , targetLevel [targetLevel]") + movementRatios[3] = (targetLevel - firedLevel) / distStartToFinish2D() + //movementRatios[3] += zOffset / MAXPIXELS + message_admins("calculated movementRatio , [movementRatios[3]]") movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -153,8 +155,8 @@ SUBSYSTEM_DEF(bullets) updatePathByAngle() /datum/bullet_data/proc/getAngleByPosition() - var/x = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1] - HPPT) - var/y = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2] - HPPT) + var/x = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1]) + var/y = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2]) return ATAN2(y, x) /datum/bullet_data/proc/updatePathByAngle() @@ -168,7 +170,7 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/updatePathByPosition() var/matrix/rotation = matrix() - movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * MAXPIXELS) + movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * PPT) movementRatios[4] = getAngleByPosition() movementRatios[1] = sin(movementRatios[4]) movementRatios[2] = cos(movementRatios[4]) @@ -176,11 +178,15 @@ SUBSYSTEM_DEF(bullets) referencedBullet.transform = rotation /datum/bullet_data/proc/distStartToFinish2D() - return DIST_EUCLIDIAN_2D((targetPos[1]*PPT +targetCoords[1] + 16)/PPT,(targetPos[2]*PPT + targetCoords[2] + 16)/PPT, (firedPos[1]*PPT +firedCoordinates[1] + 16)/PPT, (firedPos[2]*PPT +firedCoordinates[2] + 16)/PPT) + var/x1 = ((targetPos[1])*PPT + targetCoords[1] + 16) + var/y1 = ((targetPos[2])*PPT + targetCoords[2] + 16) + var/x2 = ((firedPos[1])*PPT + firedCoordinates[1] + 16) + var/y2 = ((firedPos[2])*PPT + firedCoordinates[2] + 16) + return DIST_EUCLIDIAN_2D(x1,y1,x2,y2) /datum/bullet_data/proc/distStartToFinish3D() - return DIST_EUCLIDIAN_3D((targetPos[1]*PPT)/PPT,(targetPos[2]*PPT)/PPT,targetPos[3] + targetLevel ,(firedPos[1]*PPT)/PPT, (firedPos[2]*PPT)/PPT, firedPos[3] + firedLevel) - //return DIST_EUCLIDIAN_3D((targetPos[1]*PPT +targetCoords[1] + 16)/PPT,(targetPos[2]*PPT + targetCoords[2] + 16)/PPT,targetPos[3] + targetLevel ,(firedPos[1]*PPT +firedCoordinates[1] + 16)/PPT, (firedPos[2]*PPT +firedCoordinates[2] + 16)/PPT, firedPos[3] + firedLevel) + return DIST_EUCLIDIAN_3D((targetPos[1]-1)*PPT + 16 + targetCoords[1],(targetPos[2]-1)*PPT + 16 + targetCoords[2],targetPos[3] + targetLevel ,(firedPos[1]*PPT)/PPT, (firedPos[2]*PPT)/PPT, firedPos[3] + firedLevel) + //return DIST_EUCLIDIAN_3D((targetPos[1]*PPT +targetCoords[1] + 16)/PPT,(targetPos[2]*PPT + targetCoords[2] + 16)/PPT,targetPos[3] + targetLevel ,(firedPos[1]*PPT +firedCoordinates[1] + 16)/PPT, (firedPos[2]*PPT +firedCoordinates[2] + 16)/PPT, firedPos[3] + firedLevel) @@ -255,19 +261,17 @@ SUBSYSTEM_DEF(bullets) trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] trajectoryData[5] = bulletCoords[3] trajectoryData[6] = trajectoryData[5] + bulletRatios[3] * pixelsToTravel - while(pixelsToTravel > MAXPIXELS) + while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel pixelsToTravel -= pixelsThisStep + bullet.traveled += pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) bulletCoords[3] += (bulletRatios[3] * pixelsThisStep) - //message_admins("[bulletCoords[1]], [bulletCoords[2]]") - //message_admins("trajectory data for bullet : [trajectoryData[1]] , [trajectoryData[2]] ===== [trajectoryData[3]], [trajectoryData[4]]") - x_change = round(abs(bulletCoords[1]) / HPPT) * sign(bulletCoords[1]) - y_change = round(abs(bulletCoords[2]) / HPPT) * sign(bulletCoords[2]) + //message_admins("added [(bulletRatios[3] * pixelsThisStep)] , pixels [pixelsThisStep] , curSum [bulletCoords[3]]") + x_change = trunc(bulletCoords[1] / HPPT) + y_change = trunc(bulletCoords[2] / HPPT) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) - //message_admins("TRAJ : [trajectoryData[3]] [trajectoryData[4]]") - //z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) while(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet @@ -284,18 +288,18 @@ SUBSYSTEM_DEF(bullets) bullet.lastChanges[3] += tz_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change - //trajectoryData[3] += PPT * tx_change - //trajectoryData[4] += PPT * ty_change bulletCoords[3] -= tz_change projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.updateLevel() if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) - //bullet.painted.Add(moveTurf) + bullet.painted.Add(moveTurf) moveTurf.color = COLOR_RED projectile.forceMove(moveTurf) - if(moveTurf == bullet.targetTurf) - message_admins("Reached target with level of [bulletCoords[3]]") + if(moveTurf != bullet.targetTurf) + message_admins("level of [bulletCoords[3]], [trajectoryData[6]], pixels : [bullet.traveled],") + else + message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled]") moveTurf = null @@ -307,7 +311,7 @@ SUBSYSTEM_DEF(bullets) if(bullet.lifetime < 0) bullet.referencedBullet.finishDeletion() bullet_queue -= bullet - //for(var/turf/painted in bullet.painted) - // painted.color = initial(painted.color) + for(var/turf/painted in bullet.painted) + painted.color = initial(painted.color) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 33a415c032..6391a841f9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -636,7 +636,7 @@ offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), zOffset,offset) + return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]) - 16, text2num(paramList["icon-y"]) - 16, zOffset,offset) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) From 639fffe8eb1d4ce4574e0ed3a9c739e75d4f3fcd Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 23 May 2024 07:30:51 +0200 Subject: [PATCH 111/171] k --- code/controllers/subsystems/bullets.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index d8e8dc0be8..b65ecf461c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -6,7 +6,7 @@ /// 20 is a safe bet between 24 and 16 /// the higher this is ,the more performant the system is , since more of the math is done at once instead of in stages /// it is also more inaccurate the higher you go.. -#define MAXPIXELS 20 +#define MAXPIXELS 16 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -272,7 +272,7 @@ SUBSYSTEM_DEF(bullets) x_change = trunc(bulletCoords[1] / HPPT) y_change = trunc(bulletCoords[2] / HPPT) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) - while(x_change || y_change) + if(x_change || y_change) if(QDELETED(projectile)) bullet_queue -= bullet break @@ -299,9 +299,14 @@ SUBSYSTEM_DEF(bullets) if(moveTurf != bullet.targetTurf) message_admins("level of [bulletCoords[3]], [trajectoryData[6]], pixels : [bullet.traveled],") else - message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled]") + message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]]") moveTurf = null + else + if(get_turf(projectile) == bullet.targetTurf) + message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]]") + else + message_admins("level of [bulletCoords[3]], [trajectoryData[6]], pixels : [bullet.traveled],") bullet.lifetime-- From 6d122e4157042c1387cae20852fab94fda79cef0 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 25 May 2024 09:04:16 +0200 Subject: [PATCH 112/171] AAAAAA --- code/controllers/subsystems/bullets.dm | 50 ++++++++++++++++++-------- code/game/machinery/deployable.dm | 31 +--------------- code/game/objects/structures.dm | 38 +------------------- code/modules/projectiles/projectile.dm | 2 ++ 4 files changed, 39 insertions(+), 82 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index b65ecf461c..e0c79bf1ec 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -54,6 +54,9 @@ SUBSYSTEM_DEF(bullets) var/turf/currentTurf = null var/currentCoords = list(0,0,0) /// [1]=X , [2]=Y, [3]=Z, [4]=Angle + /// Note : MovementRatios[3] aka Zratio is not used because i couldn't figure out + /// how to properly translate it to pixels travelled , main issue resides in dist_euclidian2D not being 1:1 with + /// actual amount of pixels to travel at other angles var/movementRatios = list(0,0,0,0) var/list/turf/coloreds = list() var/targetLevel = 0 @@ -69,6 +72,7 @@ SUBSYSTEM_DEF(bullets) var/hasImpacted = FALSE var/list/painted = list() var/traveled + var/trajSum /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick,zOffset, angleOffset, lifetime) /* @@ -134,10 +138,14 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - message_admins("Distance to target is [distStartToFinish2D()] , startingLevel [firedLevel] , targetLevel [targetLevel]") - movementRatios[3] = (targetLevel - firedLevel) / distStartToFinish2D() + trajSum = currentCoords[3] + /// These use LERP until a way can be figured out to calculate a level for amount of pixels traversed + //message_admins("Distance to target is [distStartToFinish2D()] , startingLevel [firedLevel] , targetLevel [targetLevel]") + //movementRatios[3] = (targetLevel - firedLevel) / (distStartToFinish2D() * PPT) + + targetLevel += zOffset * (distStartToFinish2D() / PPT) //movementRatios[3] += zOffset / MAXPIXELS - message_admins("calculated movementRatio , [movementRatios[3]]") + //message_admins("calculated movementRatio , [movementRatios[3]], offset is [zOffset * (distStartToFinish2D()/ PPT)]") movementRatios[4] = getAngleByPosition() movementRatios[4] += angleOffset updatePathByAngle() @@ -170,7 +178,7 @@ SUBSYSTEM_DEF(bullets) /datum/bullet_data/proc/updatePathByPosition() var/matrix/rotation = matrix() - movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * PPT) + //movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * PPT) movementRatios[4] = getAngleByPosition() movementRatios[1] = sin(movementRatios[4]) movementRatios[2] = cos(movementRatios[4]) @@ -178,10 +186,10 @@ SUBSYSTEM_DEF(bullets) referencedBullet.transform = rotation /datum/bullet_data/proc/distStartToFinish2D() - var/x1 = ((targetPos[1])*PPT + targetCoords[1] + 16) - var/y1 = ((targetPos[2])*PPT + targetCoords[2] + 16) - var/x2 = ((firedPos[1])*PPT + firedCoordinates[1] + 16) - var/y2 = ((firedPos[2])*PPT + firedCoordinates[2] + 16) + var/x1 = ((targetPos[1] - 1)*PPT + targetCoords[1] + 16) + var/y1 = ((targetPos[2]- 1)*PPT + targetCoords[2] + 16) + var/x2 = ((firedPos[1] - 1)*PPT + firedCoordinates[1] + 16) + var/y2 = ((firedPos[2] - 1)*PPT + firedCoordinates[2] + 16) return DIST_EUCLIDIAN_2D(x1,y1,x2,y2) /datum/bullet_data/proc/distStartToFinish3D() @@ -239,6 +247,7 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() + var/turf/leaving for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet bullet.lastChanges[1] = 0 @@ -260,19 +269,23 @@ SUBSYSTEM_DEF(bullets) trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] trajectoryData[5] = bulletCoords[3] - trajectoryData[6] = trajectoryData[5] + bulletRatios[3] * pixelsToTravel + trajectoryData[6] = trajectoryData[5] + LERP(bullet.firedLevel, bullet.targetLevel,(bullet.traveled + pixelsToTravel)/bullet.distStartToFinish2D()) + bullet.trajSum += bulletRatios[3] * pixelsToTravel while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel pixelsToTravel -= pixelsThisStep bullet.traveled += pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] += (bulletRatios[3] * pixelsThisStep) + bulletCoords[3] = LERP(bullet.firedLevel, bullet.targetLevel, bullet.traveled/bullet.distStartToFinish2D()) //message_admins("added [(bulletRatios[3] * pixelsThisStep)] , pixels [pixelsThisStep] , curSum [bulletCoords[3]]") x_change = trunc(bulletCoords[1] / HPPT) y_change = trunc(bulletCoords[2] / HPPT) z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) - if(x_change || y_change) + while(x_change || y_change) + leaving = get_turf(projectile) + if(projectile.scanTurf(leaving, trajectoryData) != PROJECTILE_CONTINUE) + break if(QDELETED(projectile)) bullet_queue -= bullet break @@ -292,26 +305,33 @@ SUBSYSTEM_DEF(bullets) projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.updateLevel() + if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) bullet.painted.Add(moveTurf) moveTurf.color = COLOR_RED projectile.forceMove(moveTurf) + /* if(moveTurf != bullet.targetTurf) message_admins("level of [bulletCoords[3]], [trajectoryData[6]], pixels : [bullet.traveled],") else - message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]]") - + message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]] , sum [bullet.trajSum]") + */ moveTurf = null + /* else if(get_turf(projectile) == bullet.targetTurf) - message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]]") + message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]], sum [bullet.trajSum]") else message_admins("level of [bulletCoords[3]], [trajectoryData[6]], pixels : [bullet.traveled],") + */ bullet.lifetime-- bullet.updateLevel() - animate(projectile, 1, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW) + var/levelRatio = 1 - trunc(bulletCoords[3])/LEVEL_MAX + message_admins("[levelRatio]") + var/animationColor = gradient(list("#ffffff", "#888888"), levelRatio) + animate(projectile, SSbullets.wait, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW, color = animationColor) bullet.currentCoords = bulletCoords if(bullet.lifetime < 0) bullet.referencedBullet.finishDeletion() diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 85300e19f6..6baa77a141 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -240,36 +240,7 @@ for reference: return TRUE /obj/machinery/deployable/barrier/proc/check_cover(obj/item/projectile/P, turf/from) - var/bulletHeight = P.dataRef.currentCoords[3] - var/checkingType = type - var/willBlock = FALSE - while(checkingType) - if(GLOB.structureBlockingLevels[checkingType]) - break - checkingType = parent_type - // we break when at the very base - if(checkingType == /obj/structure) - break - message_admins("Using blocking datum from GLOB.structureBlockingLevels[checkingType]") - if(islist(GLOB.structureBlockingLevels[checkingType])) - for(var/list/coveredSection in GLOB.structureBlockingLevels[checkingType]) - if(bulletHeight > coveredSection[2]) - continue - if(bulletHeight < coveredSection[1]) - continue - willBlock = TRUE - break - else - willBlock = bulletHeight > GLOB.structureBlockingLevels[checkingType] - - if(willBlock) - willBlock = P.check_penetrate(src) - take_damage(P.get_structure_damage()) - if (!QDELETED(src)) - visible_message(SPAN_WARNING("[P] hits \the [src]!")) - else - visible_message(SPAN_WARNING("[src] breaks down!")) - return willBlock + return TRUE /obj/machinery/deployable/barrier/proc/explode() diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index c2407ec8d9..6ff6124e4f 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -12,16 +12,6 @@ #define LEVEL_HEAD 0.7 #define LEVEL_ABOVE 1 */ -/// Byond doesn't like if you try to put defines inside... so just use the numbers. check the latest values at _bullet.dm in _DEFINES folder. SPCR 2024 -GLOBAL_LIST_INIT(structureBlockingLevels, list(\ - /obj/structure = 1,\ - /obj/structure/barricade = 0,\ - /obj/structure/low_wall = 0,\ - /obj/structure/table = list(list(0, 0.2)),\ - /// One day i will get around to turning every machinery into a structure. SPCR - 2024 - /obj/machinery/deployable/barrier = 0.2,\ - ) \ -) /** * Any projectile under this height will be blocked by this structure. Can be a list if its not meant to be continous @@ -61,33 +51,7 @@ GLOBAL_LIST_INIT(structureBlockingLevels, list(\ return /obj/structure/proc/check_cover(obj/item/projectile/P, turf/from) - var/bulletHeight = P.dataRef.currentCoords[3] - var/checkingType = type - var/willBlock = FALSE - //message_admins("bullet height at [bulletHeight]") - while(checkingType) - if(GLOB.structureBlockingLevels[checkingType]) - break - checkingType = parent_type - // we break when at the very base - if(checkingType == /obj/structure) - break - if(islist(GLOB.structureBlockingLevels[checkingType])) - for(var/list/coveredSection in GLOB.structureBlockingLevels[checkingType]) - if(bulletHeight < coveredSection[2] && bulletHeight > coveredSection[1]) - willBlock = TRUE - break - else - willBlock = bulletHeight < GLOB.structureBlockingLevels[checkingType] - - if(willBlock) - willBlock = P.check_penetrate(src) - take_damage(P.get_structure_damage()) - if (!QDELETED(src)) - visible_message(SPAN_WARNING("[P] hits \the [src]!")) - else - visible_message(SPAN_WARNING("[src] breaks down!")) - return willBlock + return TRUE /** * An overridable proc used by SSfalling to determine whether if the object deals diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1a0fbb2d63..329c83915d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -511,6 +511,8 @@ GLOBAL_LIST(projectileDamageConstants) for(var/i in 1 to length(hittingList)) var/obj/target = hittingList[i] + if(target == firer) + continue /// third slot reversed for flags passed back by hitbox intersect var/list/arguments = list(src, def_zone, null) if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) From 5006a67adcd8254b7823388db66079b520e807de Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 25 May 2024 10:32:38 +0200 Subject: [PATCH 113/171] even more sutfff --- code/__DEFINES/projectile_defines.dm | 4 --- code/controllers/subsystems/bullets.dm | 29 ++++++++++++--------- code/game/objects/structures/window.dm | 10 ------- code/game/turfs/simulated/floor_attackby.dm | 23 +++++++++------- code/modules/admin/admin.dm | 15 ----------- code/modules/mob/living/living_defense.dm | 10 ------- code/modules/multiz/turf.dm | 10 ------- code/modules/projectiles/projectile.dm | 11 -------- 8 files changed, 30 insertions(+), 82 deletions(-) diff --git a/code/__DEFINES/projectile_defines.dm b/code/__DEFINES/projectile_defines.dm index a8b430a965..ed2395eb38 100644 --- a/code/__DEFINES/projectile_defines.dm +++ b/code/__DEFINES/projectile_defines.dm @@ -41,7 +41,3 @@ #define SLOT_UNDERBARREL "underbarrel" #define SLOT_MECHANICS "mechanics" #define SLOT_BAYONET "bayonet slot" - -#define HEIGHT_LOW 1 -#define HEIGHT_CENTER 0 -#define HEIGHT_HIGH 2 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index e0c79bf1ec..8751c8f3ab 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -138,7 +138,8 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - trajSum = currentCoords[3] + firedLevel += firedPos[3] * LEVEL_MAX + targetLevel += targetCoords[3] * LEVEL_MAX /// These use LERP until a way can be figured out to calculate a level for amount of pixels traversed //message_admins("Distance to target is [distStartToFinish2D()] , startingLevel [firedLevel] , targetLevel [targetLevel]") //movementRatios[3] = (targetLevel - firedLevel) / (distStartToFinish2D() * PPT) @@ -269,7 +270,7 @@ SUBSYSTEM_DEF(bullets) trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] trajectoryData[5] = bulletCoords[3] - trajectoryData[6] = trajectoryData[5] + LERP(bullet.firedLevel, bullet.targetLevel,(bullet.traveled + pixelsToTravel)/bullet.distStartToFinish2D()) + trajectoryData[6] = trajectoryData[5] + LERP(bullet.firedLevel, bullet.targetLevel,(bullet.traveled + pixelsToTravel)/bullet.distStartToFinish2D()) - projectile.z * LEVEL_MAX bullet.trajSum += bulletRatios[3] * pixelsToTravel while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel @@ -277,12 +278,13 @@ SUBSYSTEM_DEF(bullets) bullet.traveled += pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] = LERP(bullet.firedLevel, bullet.targetLevel, bullet.traveled/bullet.distStartToFinish2D()) + bulletCoords[3] = LERP(bullet.firedLevel, bullet.targetLevel, bullet.traveled/bullet.distStartToFinish2D()) - projectile.z * LEVEL_MAX + message_admins(bulletCoords[3]) //message_admins("added [(bulletRatios[3] * pixelsThisStep)] , pixels [pixelsThisStep] , curSum [bulletCoords[3]]") x_change = trunc(bulletCoords[1] / HPPT) y_change = trunc(bulletCoords[2] / HPPT) - z_change = round(abs(bulletCoords[3])) * sign(bulletCoords[3]) - (bulletCoords[3] < 0) - while(x_change || y_change) + z_change = -(bulletCoords[3] < 0) + (bulletCoords[3] > LEVEL_MAX) + while(x_change || y_change || z_change) leaving = get_turf(projectile) if(projectile.scanTurf(leaving, trajectoryData) != PROJECTILE_CONTINUE) break @@ -291,7 +293,9 @@ SUBSYSTEM_DEF(bullets) break tx_change = ((x_change + (x_change == 0))/(abs(x_change + (x_change == 0)))) * (x_change != 0) ty_change = ((y_change + (y_change == 0))/(abs(y_change + (y_change == 0)))) * (y_change != 0) - //tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) + tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) + if(tz_change) + message_admins("tz change [tz_change]") moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) x_change -= tx_change y_change -= ty_change @@ -301,14 +305,13 @@ SUBSYSTEM_DEF(bullets) bullet.lastChanges[3] += tz_change bulletCoords[1] -= PPT * tx_change bulletCoords[2] -= PPT * ty_change - bulletCoords[3] -= tz_change + bulletCoords[3] -= tz_change * LEVEL_MAX projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.updateLevel() - if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) bullet.painted.Add(moveTurf) - moveTurf.color = COLOR_RED + //moveTurf.color = COLOR_RED projectile.forceMove(moveTurf) /* if(moveTurf != bullet.targetTurf) @@ -328,15 +331,15 @@ SUBSYSTEM_DEF(bullets) bullet.lifetime-- bullet.updateLevel() - var/levelRatio = 1 - trunc(bulletCoords[3])/LEVEL_MAX + var/levelRatio = 1 - (trunc(bulletCoords[3])/LEVEL_MAX) message_admins("[levelRatio]") - var/animationColor = gradient(list("#ffffff", "#888888"), levelRatio) + var/animationColor = gradient(list("#ffffff", "#cbcbcb"), levelRatio) animate(projectile, SSbullets.wait, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW, color = animationColor) bullet.currentCoords = bulletCoords if(bullet.lifetime < 0) bullet.referencedBullet.finishDeletion() bullet_queue -= bullet - for(var/turf/painted in bullet.painted) - painted.color = initial(painted.color) + //for(var/turf/painted in bullet.painted) + // painted.color = initial(painted.color) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index ccd6219620..7fecca0cf3 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -150,16 +150,6 @@ /obj/structure/window/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) - if(config.z_level_shooting && Proj.height) - if(Proj.height == HEIGHT_LOW)// Bullet is too low - return PROJECTILE_STOP - else if(Proj.height == HEIGHT_HIGH) // Guaranteed hit - var/proj_damage = Proj.get_structure_damage() - if(proj_damage) - hit(proj_damage) - ..() - return PROJECTILE_STOP - . = PROJECTILE_CONTINUE var/targetzone = check_zone(Proj.def_zone) if(targetzone in list(BP_CHEST, BP_HEAD, BP_L_ARM, BP_R_ARM)) diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index 332ae34ae9..b6c734d4d9 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -202,16 +202,21 @@ to_chat(user, SPAN_WARNING("This section is too damaged to support anything. Use a welder to fix the damage.")) return 0 return 1 -/* + /turf/simulated/floor/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) - if(!P.dataRef) - return PROJECTILE_CONTINUE - else if(!(P.dataRef.isTraversingLevel)) - return PROJECTILE_CONTINUE - if(take_damage(P.get_structure_damage(), BRUTE, FALSE)) - return PROJECTILE_CONTINUE - else + if(P.dataRef.currentCoords[3] < 0) + if(take_damage(P.get_structure_damage(), BRUTE, FALSE)) + var/turf/theDeep = GetBelow(src) + if(!theDeep) + return PROJECTILE_STOP + return PROJECTILE_CONTINUE + return PROJECTILE_STOP + else if(P.dataRef.currentCoords[3] > LEVEL_MAX) + var/turf/theSkies = GetAbove(src) + if(!theSkies) + return PROJECTILE_STOP + if(theSkies.take_damage(P.get_structure_damage(), BRUTE, FALSE)) + return PROJECTILE_CONTINUE return PROJECTILE_STOP -*/ diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 6092da0d49..9664a5c1bc 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -1189,18 +1189,3 @@ ADMIN_VERB_ADD(/datum/admins/proc/paralyze_mob, R_ADMIN, FALSE) return 0 return 1 return 0 - -ADMIN_VERB_ADD(/datum/admins/proc/z_level_shooting, R_SERVER, FALSE) -/datum/admins/proc/z_level_shooting() - set category = "Server" - set name = "Toggle shooting between z-levels" - - if(!check_rights(R_ADMIN)) - return - - config.z_level_shooting = !(config.z_level_shooting) - if (config.z_level_shooting) - to_chat(world, "Shooting between z-levels has been globally enabled! Use the lookup verb to shoot up, click on empty spaces to shoot down!") - else - to_chat(world, "Shooting between z-levels has been globally disabled!") - log_and_message_admins("toggled z_level_shooting.") diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 8caa11f856..dca97fa09b 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -154,16 +154,6 @@ armorType defines the armorType that will block all the damTypes that it has ass if (P.is_hot() >= HEAT_MOBIGNITE_THRESHOLD) IgniteMob() - if(config.z_level_shooting && P.height) // If the bullet came from above or below, limit what bodyparts can be hit for consistency - if(resting || lying) - return PROJECTILE_CONTINUE // Bullet flies overhead - - switch(P.height) - if(HEIGHT_HIGH) - def_zone_hit = pick(list(BP_CHEST, BP_HEAD, BP_L_ARM, BP_R_ARM)) - if(HEIGHT_LOW) - def_zone_hit = pick(list(BP_CHEST, BP_GROIN, BP_L_LEG, BP_R_LEG)) - //Being hit while using a deadman switch if(istype(get_active_hand(),/obj/item/device/assembly/signaler)) var/obj/item/device/assembly/signaler/signaler = get_active_hand() diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 155537e780..0042c5f734 100755 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -107,16 +107,6 @@ see multiz/movement.dm for some info. /turf/simulated/open/fallThrough(var/atom/movable/mover) - // If the target is open space or a shadow, the projectile traverses down - if( config.z_level_shooting && istype(mover,/obj/item/projectile) ) - var/obj/item/projectile/P = mover - if(isnull(P.height) && ( istype(P.original, /turf/simulated/open) || (istype(mover, /mob/shadow)) ) && get_dist(P.starting, P.original) <= get_dist(P.starting, src)) - P.Move(below) // We want proc/Enter to get called on the turf, so we can't use forceMove() - P.trajectory.loc_z = below.z - P.bumped = FALSE - P.height = HEIGHT_LOW // We are shooting from above, this protects windows from damage - return // We are done here - for(var/atom/A in contents) if(A.can_prevent_fall(FALSE, mover)) return diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 329c83915d..d81708c6aa 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -39,7 +39,6 @@ GLOBAL_LIST(projectileDamageConstants) var/atom/original = null // the target clicked (not necessarily where the projectile is headed). Should probably be renamed to 'target' or something. var/turf/starting = null // the projectile's starting turf var/list/permutated = list() // we've passed through these atoms, don't try to hit them again - var/height // starts undefined, used for Zlevel shooting var/p_x = 16 var/p_y = 16 // the pixel location of the tile that the player clicked. Default is the center @@ -309,12 +308,6 @@ GLOBAL_LIST(projectileDamageConstants) forceMove(get_turf(H.client.eye)) if(!(loc.Adjacent(target))) forceMove(get_turf(H)) - if(config.z_level_shooting && H.client.eye == H.shadow && !height) // Player is watching a higher zlevel - var/newTurf = get_turf(H.shadow) - if(!(locate(/obj/structure/catwalk) in newTurf)) // Can't shoot through catwalks - forceMove(newTurf) - height = HEIGHT_HIGH // We are shooting from below, this protects resting players at the expense of windows - original = get_turf(original) // Aim at turfs instead of mobs, to ensure we don't hit players // Special case for mechs, in a ideal world this should always go for the top-most atom. if(istype(launcher.loc, /obj/item/mech_equipment)) @@ -384,10 +377,6 @@ GLOBAL_LIST(projectileDamageConstants) var/result = PROJECTILE_CONTINUE - if(config.z_level_shooting && height == HEIGHT_HIGH) - if(target_mob.resting == TRUE || target_mob.stat == TRUE) - return FALSE // Bullet flies overhead - if(target_mob != original) // If mob was not clicked on / is not an NPC's target, checks if the mob is concealed by cover var/turf/cover_loc = get_step(get_turf(target_mob), get_dir(get_turf(target_mob), starting)) for(var/obj/O in cover_loc) From 62302e7f4630e2830b46e5e5b05cc3664e39d5ca Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 25 May 2024 20:07:00 +0200 Subject: [PATCH 114/171] the endless fight to get this shit done. nothing escapes the churn... --- code/controllers/hooks.dm | 2 +- code/controllers/subsystems/bullets.dm | 15 +++++++------ code/game/atoms_movable.dm | 6 ++--- code/game/objects/items.dm | 1 - code/game/turfs/space/space.dm | 3 +++ code/modules/multiz/turf.dm | 3 +++ code/modules/projectiles/hitbox_datums.dm | 25 +++++++++++++-------- code/modules/tables/tables.dm | 27 +++++++++++++++++++++++ 8 files changed, 60 insertions(+), 22 deletions(-) diff --git a/code/controllers/hooks.dm b/code/controllers/hooks.dm index 255866a7a2..bca75b7286 100644 --- a/code/controllers/hooks.dm +++ b/code/controllers/hooks.dm @@ -32,7 +32,7 @@ var/caller = new hook_path var/status = 1 for(var/P in typesof("[hook_path]/proc")) - world.log<<"Calling from hooks , [P]" + world.log<<"Calling from hooks [P]" if(!call(caller, P)(arglist(args))) error("Hook '[P]' failed or runtimed.") status = 0 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 8751c8f3ab..266ee43b1b 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -138,8 +138,7 @@ SUBSYSTEM_DEF(bullets) //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel - firedLevel += firedPos[3] * LEVEL_MAX - targetLevel += targetCoords[3] * LEVEL_MAX + targetLevel += (targetCoords[3] - firedPos[3])* LEVEL_MAX /// These use LERP until a way can be figured out to calculate a level for amount of pixels traversed //message_admins("Distance to target is [distStartToFinish2D()] , startingLevel [firedLevel] , targetLevel [targetLevel]") //movementRatios[3] = (targetLevel - firedLevel) / (distStartToFinish2D() * PPT) @@ -270,7 +269,8 @@ SUBSYSTEM_DEF(bullets) trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] trajectoryData[4] = bulletRatios[2] * pixelsToTravel + trajectoryData[2] trajectoryData[5] = bulletCoords[3] - trajectoryData[6] = trajectoryData[5] + LERP(bullet.firedLevel, bullet.targetLevel,(bullet.traveled + pixelsToTravel)/bullet.distStartToFinish2D()) - projectile.z * LEVEL_MAX + /// Yes this is inaccurate for multi-Z transitions somewhat , if someone wants to create a proper equation for pseudo 3D they're welcome to. + trajectoryData[6] = trajectoryData[5] + LERP(bullet.firedLevel, bullet.targetLevel,(bullet.traveled + pixelsToTravel)/bullet.distStartToFinish2D()) - (projectile.z - bullet.firedPos[3] * LEVEL_MAX) bullet.trajSum += bulletRatios[3] * pixelsToTravel while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel @@ -278,8 +278,8 @@ SUBSYSTEM_DEF(bullets) bullet.traveled += pixelsThisStep bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) - bulletCoords[3] = LERP(bullet.firedLevel, bullet.targetLevel, bullet.traveled/bullet.distStartToFinish2D()) - projectile.z * LEVEL_MAX - message_admins(bulletCoords[3]) + bulletCoords[3] = LERP(bullet.firedLevel, bullet.targetLevel, bullet.traveled/bullet.distStartToFinish2D()) - (projectile.z - bullet.firedPos[3]) * LEVEL_MAX + //message_admins(bulletCoords[3]) //message_admins("added [(bulletRatios[3] * pixelsThisStep)] , pixels [pixelsThisStep] , curSum [bulletCoords[3]]") x_change = trunc(bulletCoords[1] / HPPT) y_change = trunc(bulletCoords[2] / HPPT) @@ -294,8 +294,8 @@ SUBSYSTEM_DEF(bullets) tx_change = ((x_change + (x_change == 0))/(abs(x_change + (x_change == 0)))) * (x_change != 0) ty_change = ((y_change + (y_change == 0))/(abs(y_change + (y_change == 0)))) * (y_change != 0) tz_change = ((z_change + (z_change == 0))/(abs(z_change + (z_change == 0)))) * (z_change != 0) - if(tz_change) - message_admins("tz change [tz_change]") + //if(tz_change) + // message_admins("tz change [tz_change]") moveTurf = locate(projectile.x + tx_change, projectile.y + ty_change, projectile.z + tz_change) x_change -= tx_change y_change -= ty_change @@ -310,6 +310,7 @@ SUBSYSTEM_DEF(bullets) projectile.pixel_y -= PPT * ty_change bullet.updateLevel() if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) + message_admins("[bulletCoords[3]], [trajectoryData[6]]" ) bullet.painted.Add(moveTurf) //moveTurf.color = COLOR_RED projectile.forceMove(moveTurf) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 91bf9c136c..2fbf15d2d7 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -44,7 +44,7 @@ GLOBAL_VAR_INIT(Debug,0) /atom/movable/getAimingLevel(atom/shooter, defZone) if(hitbox) - return hitbox.getAimingLevel(shooter, defZone) + return hitbox.getAimingLevel(shooter, defZone, src) else return ..() @@ -80,9 +80,7 @@ GLOBAL_VAR_INIT(Debug,0) return /atom/movable/Initialize() - if(ispath(hitbox)) - hitbox = new hitbox() - hitbox.owner = src + hitbox = getHitbox(hitbox) . = ..() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 986b3ce15f..096ee9db37 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -130,7 +130,6 @@ GLOBAL_LIST(melleDamagesCache) . = ..() var/datum/hitboxDatum/Selfhitbox = new() Selfhitbox.boundingBoxes += list(list(8,8,24,24,0,0)) - Selfhitbox.owner = src Selfhitbox.visualize() hitbox = Selfhitbox diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 5e244fdd9b..167e96da10 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -18,6 +18,9 @@ update_starlight() ..() +/turf/space/take_damage(target_power, damage_type) + return TRUE + /turf/space/update_plane() return diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 0042c5f734..fc06fc7017 100755 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -50,6 +50,9 @@ see multiz/movement.dm for some info. var/tmp/list/climbers = list() +/turf/simulated/open/take_damage(target_power, damage_type) + return TRUE + /turf/simulated/open/New() icon_state = "transparentclickable" ..() diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 2a60653fee..5b062b98c2 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -1,5 +1,13 @@ +GLOBAL_LIST_EMPTY(hitboxPrototypes) +/hook/startup/proc/initializeHitboxes() + for(var/type in subtypesof(/datum/hitboxDatum)) + GLOB.hitboxPrototypes[type] = new type() +/proc/getHitbox(path) + if(!GLOB.hitboxPrototypes[path]) + return null + return GLOB.hitboxPrototypes[path] /datum/hitboxDatum var/list/boundingBoxes = list() @@ -8,7 +16,6 @@ var/offsetY = 0 /// stores the median levels to aim when shooting at the owner. var/list/medianLevels - var/atom/owner /// converts the defZone argument to a specific level. var/list/defZoneToLevel = list( BP_EYES = HBF_USEMEDIAN, @@ -25,7 +32,7 @@ /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) -/datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone) +/datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone, atom/owner) /* @@ -66,7 +73,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return FALSE -/datum/hitboxDatum/proc/visualize() +/datum/hitboxDatum/proc/visualize(atom/owner) var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) var/chosenColor = pick_n_take(availableColors) for(var/list/hitbox in boundingBoxes[num2text(owner.dir)]) @@ -97,8 +104,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo volumeSum += calculatedVolume medianLevels["[direction]"] = median / volumeSum -/datum/hitboxDatum/atom/getAimingLevel(atom/shooter, defZone) - if(defZone == null || (!defZone in defZoneToLevel)) +/datum/hitboxDatum/atom/getAimingLevel(atom/shooter, defZone, atom/owner) + if(defZone == null || (!(defZone in defZoneToLevel))) return medianLevels["[owner.dir]"] if(defZoneToLevel[defZone] == HBF_USEMEDIAN) return medianLevels["[owner.dir]"] @@ -146,9 +153,9 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo volumeSum += calculatedVolume medianLevels[state]["[direction]"] = median / volumeSum -/datum/hitboxDatum/mob/getAimingLevel(atom/shooter, defZone) - var/mob/living/perceivedOwner = src.owner - if(defZone == null || (!defZone in defZoneToLevel["[perceivedOwner.lying]"])) +/datum/hitboxDatum/mob/getAimingLevel(atom/shooter, defZone, atom/owner) + var/mob/living/perceivedOwner = owner + if(defZone == null || (!(defZone in defZoneToLevel["[perceivedOwner.lying]"]))) return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] if(defZoneToLevel[defZone] == HBF_USEMEDIAN) return medianLevels["[perceivedOwner.lying]"]["[owner.dir]"] @@ -161,7 +168,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/global/worldY worldX = owner.x * 32 worldY = owner.y * 32 - var/mob/living/perceivedOwner = src.owner + var/mob/living/perceivedOwner = owner for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) /// basic AABB but only for the Z-axis. if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index cfcd57932f..18dadcbce5 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -22,6 +22,7 @@ var/list/custom_table_appearance = list( layer = PROJECTILE_HIT_THRESHHOLD_LAYER throwpass = 1 matter = list(MATERIAL_STEEL = 2) + hitbox = /datum/hitboxDatum/atom/table var/flipped = 0 maxHealth = 10 health = 10 @@ -41,6 +42,32 @@ var/list/custom_table_appearance = list( var/list/connections = list("nw0", "ne0", "sw0", "se0") +/datum/hitboxDatum/atom/table + boundingBoxes = list( + LISTNORTH = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)), + LISTSOUTH = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)), + LISTEAST = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)), + LISTWEST = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)) + ) + +/datum/hitboxDatum/atom/table/reinforced + boundingBoxes = list( + LISTNORTH = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)), + LISTSOUTH = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)), + LISTEAST = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)), + LISTWEST = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)) + ) + +// No table friends to connect with :( +/datum/hitboxDatum/atom/table/flipped_alone + boundingBoxes = list( + LISTNORTH = list(BBOX(4,1,29,19,LEVEL_TURF, LEVEL_TABLE + 0.1, null)), + LISTSOUTH = list(BBOX(4,14,29,32,LEVEL_TURF, LEVEL_TABLE + 0.1, null)), + LISTEAST = list(BBOX(14,2,32,22,LEVEL_TURF, LEVEL_TABLE + 0.1, null)), + LISTWEST = list(BBOX(1,2,19,22,LEVEL_TURF, LEVEL_TABLE + 0.1, null)) + ) + + /obj/structure/table/get_matter() var/list/matter = ..() . = matter.Copy() From 1fd720a31f969e15a8aaf340fa027de08adf9950 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 29 Jun 2024 00:10:04 +0300 Subject: [PATCH 115/171] a --- code/modules/projectiles/hitbox_datums.dm | 258 ++++++++++++++++++++++ 1 file changed, 258 insertions(+) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 5b062b98c2..6e73c00828 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -136,6 +136,264 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return TRUE return FALSE + +/// This subtype is dedicated especially to tables. Their building system changes shape depending on adjaency. So this reflects that +/// List format is unconventional and based off the the way connections are done + +// Also.. holy mother of lists... yes there is a LOT of data to store for all the permutations.. +// each corner has 8 possible states , all of them have 4 directions , so this is 4 x 8 x 4 aka 256 permutations. +// some of this could be cut down with some smart flipping ,but for some cases it doesn't work. + +/datum/hitboxDatum/atom/table + boundingBoxes = list( + 1 = list( + 1 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 2 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 3 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 4 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 5 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 6 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 7 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 8 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ) + ), + 2 = list( + 1 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 2 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 3 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 4 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 5 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 6 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 7 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 8 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ) + ), + 3 = list( + 1 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 2 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 3 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 4 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 5 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 6 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 7 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 8 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ) + ), + 4 = list( + 1 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 2 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 3 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 4 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 5 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 6 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 7 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ), + 8 = list( + LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), + LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), + LISTEAST = list(BBOX(0,0,0,0,0,0,null)), + LISTWEST = list(BBOX(0,0,0,0,0,0,null)) + ) + ) + ) + +/datum/hitboxDatum/atom/table/New() + . = ..() + var/median + var/volumeSum + var/calculatedVolume = 0 + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + medianLevels["[direction]"] = median / volumeSum + +/datum/hitboxDatum/atom/table/getAimingLevel(atom/shooter, defZone, atom/owner) + if(defZone == null || (!(defZone in defZoneToLevel))) + return medianLevels["[owner.dir]"] + if(defZoneToLevel[defZone] == HBF_USEMEDIAN) + return medianLevels["[owner.dir]"] + message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") + return defZoneToLevel[defZone] + + /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 +/datum/hitboxDatum/atom/table/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) + var/global/worldX + var/global/worldY + worldX = owner.x * 32 + worldY = owner.y * 32 + for(var/list/boundingData in boundingBoxes["[owner.dir]"]) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + continue + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + return FALSE + /datum/hitboxDatum/mob /datum/hitboxDatum/mob/New() From 551e8d34eddc3986de9623393f66a85e080f9274 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 12 Jul 2024 14:02:01 +0300 Subject: [PATCH 116/171] aaa --- code/controllers/subsystems/explosions.dm | 20 +++++++++++++++---- .../objects/effects/explosion_particles.dm | 4 ---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/code/controllers/subsystems/explosions.dm b/code/controllers/subsystems/explosions.dm index a2ce544fa6..90d56c969c 100644 --- a/code/controllers/subsystems/explosions.dm +++ b/code/controllers/subsystems/explosions.dm @@ -9,6 +9,9 @@ #define HASH_MODULO (world.maxx + world.maxx*world.maxy) #define EXPLO_HASH(x,y) (round((x+y*world.maxx)%HASH_MODULO)) +/// the max length of the visuals list , used for queueing deletions in a efficient manner +#define EXPLOSION_VIS_LEN 500 + /* A subsystem for handling explosions in a tick-based manner Basic functioning @@ -49,12 +52,18 @@ SUBSYSTEM_DEF(explosions) priority = FIRE_PRIORITY_EXPLOSIONS init_order = INIT_ORDER_EXPLOSIONS flags = SS_KEEP_TIMING - var/list/explode_queue = list() - var/list/current_run = list() - var/list/throwing_queue = list() + var/list/explode_queue + var/list/current_run + var/list/throwing_queue var/list/available_hash_lists + var/list/visualsToDelete + var/visualIndex = 0 /datum/controller/subsystem/explosions/Initialize(timeoftheworld) + explode_queue = list() + current_run = list() + throwing_queue = list() + visualsToDelete = new /list(EXPLOSION_VIS_LEN) // Each hashed list is extremly huge , as it stands today each one would be // 0.250~ MB(roughly 2 million bits) // As long as this doesnt go over 12 MB , it should be fine as it still fits in CPU caches @@ -113,7 +122,7 @@ SUBSYSTEM_DEF(explosions) target_power -= target.explosion_act(target_power, explodey) + explodey.falloff if(explodey.flags & EFLAG_HALVEFALLOFF) target_power /= 2 - new /obj/effect/explosion_fire(target) + visualsToDelete[(visualIndex++) * (visualIndex Date: Sun, 14 Jul 2024 01:51:32 +0300 Subject: [PATCH 117/171] mroe fun mechanics --- code/controllers/subsystems/bullets.dm | 4 +- code/game/atoms.dm | 2 +- code/game/machinery/alarm.dm | 4 +- code/game/machinery/machinery.dm | 3 + code/modules/lighting/lighting_overlay.dm | 5 + code/modules/mob/living/carbon/human/human.dm | 81 ---- code/modules/power/lighting.dm | 2 + code/modules/projectiles/hitbox_datums.dm | 450 +++++++++--------- code/modules/projectiles/projectile.dm | 14 + code/modules/tables/tables.dm | 26 - 10 files changed, 246 insertions(+), 345 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 266ee43b1b..a471bb7f7f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -310,7 +310,7 @@ SUBSYSTEM_DEF(bullets) projectile.pixel_y -= PPT * ty_change bullet.updateLevel() if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) - message_admins("[bulletCoords[3]], [trajectoryData[6]]" ) + //message_admins("[bulletCoords[3]], [trajectoryData[6]]" ) bullet.painted.Add(moveTurf) //moveTurf.color = COLOR_RED projectile.forceMove(moveTurf) @@ -333,7 +333,7 @@ SUBSYSTEM_DEF(bullets) bullet.updateLevel() var/levelRatio = 1 - (trunc(bulletCoords[3])/LEVEL_MAX) - message_admins("[levelRatio]") + //message_admins("[levelRatio]") var/animationColor = gradient(list("#ffffff", "#cbcbcb"), levelRatio) animate(projectile, SSbullets.wait, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW, color = animationColor) bullet.currentCoords = bulletCoords diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 656a74df82..899cb7f3eb 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -272,7 +272,7 @@ /atom/proc/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) P.on_hit(src, def_zone) - . = FALSE + . = PROJECTILE_STOP /atom/proc/block_bullet(mob/user, var/obj/item/projectile/damage_source, def_zone) return 0 diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 52c8e7eef6..eb4969e793 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -17,6 +17,7 @@ active_power_usage = 3000 //For heating/cooling rooms. 1000 joules equates to about 1 degree every 2 seconds for a single tile of air. power_channel = STATIC_ENVIRON req_one_access = list(access_atmospherics, access_engine_equip) + hitbox = /datum/hitboxDatum/atom/airAlarm var/alarm_id = null var/breach_detection = 1 // Whether to use automatic breach detection or not var/frequency = 1439 @@ -924,6 +925,7 @@ FIRE ALARM desc = "\"Pull this in case of emergency\". Thus, keep pulling it forever." icon = 'icons/obj/monitors.dmi' icon_state = "fire0" + hitbox = /datum/hitboxDatum/atom/fireAlarm var/detecting = 1 var/working = 1 var/time = 10 @@ -985,7 +987,7 @@ FIRE ALARM /obj/machinery/firealarm/bullet_act() alarm() - return PROJECTILE_CONTINUE + . = ..() /obj/machinery/firealarm/emp_act(severity) if(prob(50/severity)) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 97dde151d9..22ebd7463d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -119,6 +119,9 @@ var/commonLore = "" matter = list(MATERIAL_STEEL = 8) +/obj/machinery/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + take_damage(P.get_structure_damage()) + return PROJECTILE_STOP /obj/machinery/Initialize(mapload, d=0) . = ..() diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index adfd42f7d8..2e8d766621 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -18,6 +18,11 @@ var/needs_update = FALSE +/// More efficient to have the proc return bullet_continue ,avoiding another check for every object on a turf SPCR 2024 +/atom/movable/lighting_overlay/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + return PROJECTILE_CONTINUE + + /atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE) . = ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 3259c80875..7ee675ff82 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -13,87 +13,6 @@ var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_lying_buckled_and_verb_status() call. var/using_scope // This is not very good either, because I've copied it. Sorry. -/datum/hitboxDatum/mob/human - boundingBoxes = list( - "0" = list( - LISTNORTH = list( - BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD - ), - LISTSOUTH = list( - BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS - BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD - ), - LISTEAST = list( - BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD - ), - LISTWEST = list( - BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS - BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN - BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST - BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD - ) - ), - "1" = list( - LISTNORTH = list( - BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), - BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) - ), - LISTSOUTH = list( - BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), - BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) - ), - LISTEAST = list( - BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), - BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) - ), - LISTWEST = list( - BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), - BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) - ) - ) - ) - defZoneToLevel = list( - "0" = list( - BP_EYES = (LEVEL_HEAD + LEVEL_CHEST)/2, - BP_MOUTH = (LEVEL_HEAD + LEVEL_CHEST)/2, - BP_HEAD = (LEVEL_HEAD + LEVEL_CHEST)/2, - BP_CHEST = (LEVEL_CHEST + LEVEL_GROIN)/2, - BP_R_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, - BP_L_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, - BP_GROIN = (LEVEL_GROIN + LEVEL_TABLE)/2, - BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, - BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 - ), - "1" = list( - BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, - BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, - BP_HEAD = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, - BP_CHEST = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, - BP_R_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, - BP_L_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, - BP_GROIN = (LEVEL_TURF + 0.1 + LEVEL_TURF + 0.2)/2, - BP_L_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2, - BP_R_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2 - ) - ) /mob/living/carbon/human/Initialize(new_loc, new_species) hud_list[HEALTH_HUD] = image('icons/mob/hud.dmi', src, "hudhealth100", ON_MOB_HUD_LAYER) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index a2f05f29a8..8dabf5951b 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -162,6 +162,7 @@ desc = "A lighting fixture." anchored = TRUE layer = WALL_OBJ_LAYER + hitbox = /datum/hitboxDatum/atom/fixtureLightTube use_power = ACTIVE_POWER_USE idle_power_usage = 2 active_power_usage = 20 @@ -198,6 +199,7 @@ brightness_range = 3 brightness_power = 1 desc = "A small lighting fixture." + hitbox = /datum/hitboxDatum/atom/fixtureBulb light_type = /obj/item/light/bulb /obj/machinery/light/small/autoattach diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 6e73c00828..83b740d52a 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -89,12 +89,22 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo owner.overlays.Add(newOverlay) /datum/hitboxDatum/atom + boundingBoxes = list( + LISTNORTH = list(BBOX(16,16,24,24,1,2,null)), + LISTSOUTH = list(BBOX(16,16,24,24,1,2,null)), + LISTEAST = list(BBOX(16,16,24,24,1,2,null)), + LISTWEST = list(BBOX(16,16,24,24,1,2,null)) + ) /datum/hitboxDatum/atom/New() . = ..() var/median var/volumeSum var/calculatedVolume = 0 + // dont bother calculating if already defined. + if(length(medianLevels)) + return + medianLevels = list() for(var/direction in list(NORTH, SOUTH, EAST , WEST)) median = 0 volumeSum = 0 @@ -102,7 +112,10 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume volumeSum += calculatedVolume - medianLevels["[direction]"] = median / volumeSum + if(volumeSum == 0) + medianLevels["[direction]"] = LEVEL_TABLE + else + medianLevels["[direction]"] = median / volumeSum /datum/hitboxDatum/atom/getAimingLevel(atom/shooter, defZone, atom/owner) if(defZone == null || (!(defZone in defZoneToLevel))) @@ -141,259 +154,142 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// List format is unconventional and based off the the way connections are done // Also.. holy mother of lists... yes there is a LOT of data to store for all the permutations.. -// each corner has 8 possible states , all of them have 4 directions , so this is 4 x 8 x 4 aka 256 permutations. -// some of this could be cut down with some smart flipping ,but for some cases it doesn't work. +// each corner has 8 possible states , all of them have 4 directions , so this is 4 x 8 aka 32 permutations. +// some of this could be cut down with some smart flipping ,but for some cases it doesn't work or its not worth the CPU usage - SPCR 2024 /datum/hitboxDatum/atom/table + // this boundingBoxes just stores each corner's hitbox depending on its connections ,the actual hitbox is formed when doing actual hit checks boundingBoxes = list( 1 = list( - 1 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 2 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 3 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 4 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 5 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 6 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 7 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 8 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ) + LISTNORTH = list(BBOX(5,17,16,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,2,28,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,28,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(5,2,16,16,LEVEL_TURF,LEVEL_TABLE,null)) ), 2 = list( - 1 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 2 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 3 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 4 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 5 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 6 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 7 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 8 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ) + LISTNORTH = list(BBOX(1,17,16,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,4,32,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,28,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(5,1,16,16,LEVEL_TURF,LEVEL_TABLE,null)) ), 3 = list( - 1 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 2 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 3 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 4 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 5 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 6 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 7 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 8 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ) + LISTNORTH = list(BBOX(5,17,16,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,2,28,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,28,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(5,2,16,16,LEVEL_TURF,LEVEL_TABLE,null)) ), 4 = list( - 1 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 2 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 3 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 4 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 5 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 6 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 7 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ), - 8 = list( - LISTNORTH = list(BBOX(0,0,0,0,0,0,null)), - LISTSOUTH = list(BBOX(0,0,0,0,0,0,null)), - LISTEAST = list(BBOX(0,0,0,0,0,0,null)), - LISTWEST = list(BBOX(0,0,0,0,0,0,null)) - ) + LISTNORTH = list(BBOX(1,17,16,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,4,32,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,28,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(5,1,16,16,LEVEL_TURF,LEVEL_TABLE,null)) + ), + 5 = list( + LISTNORTH = list(BBOX(5,17,16,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,1,28,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,32,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(1,4,16,16,LEVEL_TURF,LEVEL_TABLE,null)) + ), + 6 = list( + LISTNORTH = list(BBOX(1,17,16,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,1,32,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,32,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(1,1,16,16,LEVEL_TURF,LEVEL_TABLE,null)) + ), + 7 = list( + LISTNORTH = list(BBOX(5,17,16,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,1,28,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,32,30,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(1,4,16,16,LEVEL_TURF,LEVEL_TABLE,null)) + ), + 8 = list( + LISTNORTH = list(BBOX(1,17,16,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTSOUTH = list(BBOX(17,1,32,16,LEVEL_TURF,LEVEL_TABLE,null)), + LISTEAST = list(BBOX(17,17,32,32,LEVEL_TURF,LEVEL_TABLE,null)), + LISTWEST = list(BBOX(1,1,16,16,LEVEL_TURF,LEVEL_TABLE,null)) ) ) - -/datum/hitboxDatum/atom/table/New() - . = ..() - var/median - var/volumeSum - var/calculatedVolume = 0 - for(var/direction in list(NORTH, SOUTH, EAST , WEST)) - median = 0 - volumeSum = 0 - for(var/list/boundingBox in boundingBoxes["[direction]"]) - calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) - median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume - volumeSum += calculatedVolume - medianLevels["[direction]"] = median / volumeSum + medianLevels = list( + LISTNORTH = (LEVEL_TURF+LEVEL_TABLE)/2, + LISTSOUTH = (LEVEL_TURF+LEVEL_TABLE)/2, + LISTEAST = (LEVEL_TURF+LEVEL_TABLE)/2, + LISTWEST = (LEVEL_TURF+LEVEL_TABLE)/2 + ) /datum/hitboxDatum/atom/table/getAimingLevel(atom/shooter, defZone, atom/owner) - if(defZone == null || (!(defZone in defZoneToLevel))) - return medianLevels["[owner.dir]"] - if(defZoneToLevel[defZone] == HBF_USEMEDIAN) - return medianLevels["[owner.dir]"] - message_admins("Returned [defZoneToLevel[defZone]] for [defZone]") - return defZoneToLevel[defZone] + return medianLevels["[owner.dir]"] - /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/atom/table/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) +/// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 +/datum/hitboxDatum/atom/table/intersects(list/lineData,ownerDirection, turf/incomingFrom, obj/structure/table/owner, list/arguments) var/global/worldX var/global/worldY worldX = owner.x * 32 worldY = owner.y * 32 - for(var/list/boundingData in boundingBoxes["[owner.dir]"]) - /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) - continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) - arguments[3] = boundingData[7] - return TRUE + var/list/boundingList + for(var/i = 1 to 4) + // 1<<(i-1) , clever way to convert from index to direction + // i=1 ==> north + // i=2 ==> south + // i=3 ==> east + // i=4 ==> west + // i dont get why owner connections is text.. but it is what it is + var/direct = "[(1<<(i-1))]" + var/conn = text2num(owner.connections[i]) + boundingList = boundingBoxes[text2num(owner.connections[i])+1]["[(1<<(i-1))]"] + for(var/list/boundingData in boundingList) + /// basic AABB but only for the Z-axis. + if(boundingData[5] > max(lineData[5],lineData[6]) && boundingData[6] > min(lineData[6],lineData[5])) + continue + if(boundingData[5] < max(lineData[5], lineData[6]) && boundingData[6] < min(lineData[6],lineData[5])) + continue + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE + if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + arguments[3] = boundingData[7] + return TRUE return FALSE +/datum/hitboxDatum/atom/fixtureLightTube + boundingBoxes = list( + LISTNORTH = list(BBOX(4,29,29,32,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), + LISTSOUTH = list(BBOX(4,1,29,4,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), + LISTEAST = list(BBOX(29,4,32,29,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), + LISTWEST = list(BBOX(1,4,4,29,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)) + ) + +/datum/hitboxDatum/atom/fixtureBulb + boundingBoxes = list( + LISTNORTH = list(BBOX(14,25,19,32,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), + LISTSOUTH = list(BBOX(14,1,20,8,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), + LISTEAST = list(BBOX(25,14,32,19,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), + LISTWEST = list(BBOX(1,14,8,19,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)) + ) + +/datum/hitboxDatum/atom/fireAlarm + boundingBoxes = list( + LISTNORTH = list(BBOX(13,10,20,22,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)), + LISTSOUTH = list(BBOX(13,11,20,23,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)), + LISTEAST = list(BBOX(10,13,22,20,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)), + LISTWEST = list(BBOX(11,13,23,20,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)) + ) + +/datum/hitboxDatum/atom/airAlarm + boundingBoxes = list( + LISTNORTH = list(BBOX(8,10,24,23,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)), + LISTSOUTH = list(BBOX(8,10,24,23,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)), + LISTEAST = list(BBOX(10,8,23,24,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)), + LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)) + ) + + + /datum/hitboxDatum/mob /datum/hitboxDatum/mob/New() @@ -401,7 +297,11 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/median var/volumeSum var/calculatedVolume = 0 + if(length(medianLevels)) + return + medianLevels = list() for(var/state in boundingBoxes) + medianLevels[state] = list() for(var/direction in list(NORTH, SOUTH, EAST , WEST)) median = 0 volumeSum = 0 @@ -409,7 +309,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume volumeSum += calculatedVolume - medianLevels[state]["[direction]"] = median / volumeSum + medianLevels[state]["[direction]"] = median / volumeSum /datum/hitboxDatum/mob/getAimingLevel(atom/shooter, defZone, atom/owner) var/mob/living/perceivedOwner = owner @@ -445,6 +345,88 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return TRUE return FALSE +/datum/hitboxDatum/mob/human + boundingBoxes = list( + "0" = list( + LISTNORTH = list( + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD + ), + LISTSOUTH = list( + BBOX(11,1,21,8,LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(11,9,21,11,LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(9,12,23,20, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(11,12,21,22, LEVEL_GROIN, LEVEL_CHEST, HB_CHESTARMS), // CHEST + ARMS + BBOX(13,23,19,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD + ), + LISTEAST = list( + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD + ), + LISTWEST = list( + BBOX(14,1,19,9, LEVEL_TURF, LEVEL_TABLE, HB_LEGS), // LEGS + BBOX(14,10,21,12, LEVEL_TABLE, LEVEL_GROIN, HB_GROIN), // GROIN + BBOX(13,12,21,22, LEVEL_GROIN , LEVEL_CHEST, HB_CHESTARMS), // ARMS AND CHEST + BBOX(13,12,20,28, LEVEL_CHEST, LEVEL_HEAD, HB_HEAD) // HEAD + ) + ), + "1" = list( + LISTNORTH = list( + BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), + BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + ), + LISTSOUTH = list( + BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), + BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + ), + LISTEAST = list( + BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), + BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + ), + LISTWEST = list( + BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), + BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), + BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), + BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + ) + ) + ) + defZoneToLevel = list( + "0" = list( + BP_EYES = (LEVEL_HEAD + LEVEL_CHEST)/2, + BP_MOUTH = (LEVEL_HEAD + LEVEL_CHEST)/2, + BP_HEAD = (LEVEL_HEAD + LEVEL_CHEST)/2, + BP_CHEST = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_R_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_L_ARM = (LEVEL_CHEST + LEVEL_GROIN)/2, + BP_GROIN = (LEVEL_GROIN + LEVEL_TABLE)/2, + BP_L_LEG = (LEVEL_TURF + LEVEL_TABLE)/2, + BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 + ), + "1" = list( + BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, + BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, + BP_HEAD = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, + BP_CHEST = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, + BP_R_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, + BP_L_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, + BP_GROIN = (LEVEL_TURF + 0.1 + LEVEL_TURF + 0.2)/2, + BP_L_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2, + BP_R_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2 + ) + ) + diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d81708c6aa..26af68dc5f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -104,6 +104,20 @@ GLOBAL_LIST(projectileDamageConstants) var/datum/bullet_data/dataRef = null +/// Fun interaction time - 2 bullets colliding mid air ! SPCR 2024 +/obj/item/projectile/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + // yep , it checks itself , more efficient to handle it here.. + if(P == src) + return PROJECTILE_CONTINUE + if(!abs(abs(P.dataRef.currentCoords[3]) - abs(dataRef.currentCoords[3])) < 0.1) + return PROJECTILE_CONTINUE + if(!(abs(abs(P.pixel_x)-abs(pixel_x)) < 2)) + return PROJECTILE_CONTINUE + if(!(abs(abs(P.pixel_y)-abs(pixel_y)) < 2)) + return PROJECTILE_CONTINUE + // congratulations , you have 2 intersecting bullets... + return PROJECTILE_STOP + /// This is done to save a lot of memory from duplicated damage lists. /// The list is also copied whenever PrepareForLaunch is called and modified as needs to be /obj/item/projectile/Initialize() diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 18dadcbce5..b9ca2d4406 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -42,32 +42,6 @@ var/list/custom_table_appearance = list( var/list/connections = list("nw0", "ne0", "sw0", "se0") -/datum/hitboxDatum/atom/table - boundingBoxes = list( - LISTNORTH = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)), - LISTSOUTH = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)), - LISTEAST = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)), - LISTWEST = list(BBOX(6,2,27,29,LEVEL_TURF + 0.2, LEVEL_TABLE, null)) - ) - -/datum/hitboxDatum/atom/table/reinforced - boundingBoxes = list( - LISTNORTH = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)), - LISTSOUTH = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)), - LISTEAST = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)), - LISTWEST = list(BBOX(6,2,27,29,LEVEL_TURF, LEVEL_TABLE, null)) - ) - -// No table friends to connect with :( -/datum/hitboxDatum/atom/table/flipped_alone - boundingBoxes = list( - LISTNORTH = list(BBOX(4,1,29,19,LEVEL_TURF, LEVEL_TABLE + 0.1, null)), - LISTSOUTH = list(BBOX(4,14,29,32,LEVEL_TURF, LEVEL_TABLE + 0.1, null)), - LISTEAST = list(BBOX(14,2,32,22,LEVEL_TURF, LEVEL_TABLE + 0.1, null)), - LISTWEST = list(BBOX(1,2,19,22,LEVEL_TURF, LEVEL_TABLE + 0.1, null)) - ) - - /obj/structure/table/get_matter() var/list/matter = ..() . = matter.Copy() From 172d0e6a965c0259eea47811013ef9b2f5730b68 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 16 Jul 2024 01:19:13 +0300 Subject: [PATCH 118/171] aa --- code/game/objects/items.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 096ee9db37..0b7decc74d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -122,6 +122,10 @@ GLOBAL_LIST(melleDamagesCache) var/chameleon_type +/// OBJECTS that are relevant will implement their own logic for being hit. +/obj/item/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + return PROJECTILE_CONTINUE + /obj/item/hitbox_test name = "hitbox tester" icon_state = "hitbox" From 92b7fcfeb9a4f2643628e0124839ccbd8b5468c0 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 16 Jul 2024 14:45:13 +0300 Subject: [PATCH 119/171] aaaaaaaaaaafawfa --- code/game/atoms.dm | 1 + code/game/objects/effects/effect_system.dm | 3 +++ code/game/objects/landmarks/landmark.dm | 3 +++ 3 files changed, 7 insertions(+) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 899cb7f3eb..79708e1497 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -272,6 +272,7 @@ /atom/proc/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) P.on_hit(src, def_zone) + message_admins("Bullet stopped by [src]") . = PROJECTILE_STOP /atom/proc/block_bullet(mob/user, var/obj/item/projectile/damage_source, def_zone) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index b59e5cfac5..3723fd83fc 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -10,6 +10,9 @@ would spawn and follow the beaker, even if it is carried or thrown. var/random_offset = 0 weight = 0 +/obj/effect/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + return PROJECTILE_CONTINUE + /obj/effect/effect name = "effect" icon = 'icons/effects/effects.dmi' diff --git a/code/game/objects/landmarks/landmark.dm b/code/game/objects/landmarks/landmark.dm index 723063775d..1538c140ae 100644 --- a/code/game/objects/landmarks/landmark.dm +++ b/code/game/objects/landmarks/landmark.dm @@ -10,6 +10,9 @@ weight = 0 var/delete_me = FALSE +/obj/landmark/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + return PROJECTILE_CONTINUE + /obj/landmark/New() ..() GLOB.landmarks_list += src From e4f6c3e22b461c540724f346c85e219a14f66990 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 17 Jul 2024 00:52:16 +0300 Subject: [PATCH 120/171] aa --- code/game/atoms_movable.dm | 24 ++++++++++++++++++++++++ code/game/turfs/simulated.dm | 25 ++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2fbf15d2d7..39f4a2d1fa 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -17,6 +17,8 @@ GLOBAL_VAR_INIT(Debug,0) var/obj/item/grab/grabbedBy /// Holds the hitbox datum if theres any var/datum/hitboxDatum/hitbox + /// A associative list , each index represents the thing we are attached to, the value of the index represents attachment flags that define behaviour + var/list/attached var/item_state // Used to specify the item state for the on-mob overlays. var/inertia_dir = 0 var/can_anchor = TRUE @@ -32,6 +34,28 @@ GLOBAL_VAR_INIT(Debug,0) var/spawn_blacklisted = FALSE // Generally for niche objects, atoms blacklisted can spawn if enabled by spawner. Examples include exoplanet loot tables you don't want spawning within the player starting area. var/bad_type // Use path Ex:(bad_type = obj/item). Generally for abstract code objects, atoms with a set bad_type can never be selected by spawner. Examples include parent objects which should only exist within the code, or deployable embedded items. +/atom/movable/proc/attach(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) + if(!(ismovable(thing) || isturf(thing))) + return FALSE + if(!length(attached)) + attached = list() + attached[thing] = attachmentFlagsSupport + thing.attached[src] = attachmentFlagsAttachable + return TRUE + +/atom/movable/proc/detach(atom/thing) + if(!(thing in attached)) + return -1 + if(length(attached) == 1) + del(attached) + else + attached -= thing + if(src in thing.attached) + if(length(thing.attached > 1)) + thing.attached -= src + return TRUE + del(thing.attached) + return TRUE /atom/movable/Del() if(isnull(gc_destroyed) && loc) testing("GC: -- [type] was deleted via del() rather than qdel() --") diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 5fd1b9b26b..9362d8c82a 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -14,7 +14,30 @@ var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to - + var/list/attached + +/turf/simulated/proc/attach(atom/movable/thing, attachmentFlagsSupport, attachmentFlagsAttachable) + if(!istype(thing)) + return FALSE + if(!length(attached)) + attached = list() + attached[thing] = attachmentFlagsSupport + thing.attached[src] = attachmentFlagsAttachable + return TRUE + +/turf/simulated/proc/detach(atom/movable/thing) + if(!(thing in attached)) + return -1 + if(length(attached) == 1) + del(attached) + else + attached -= thing + if(src in thing.attached) + if(length(thing.attached > 1)) + thing.attached -= src + return TRUE + del(thing.attached) + return TRUE /turf/simulated/New() ..() From dfbaad553b97a41932caaf4f02e0ecdc21249e93 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 21 Jul 2024 20:55:42 +0300 Subject: [PATCH 121/171] Update _compile_options.dm --- code/_compile_options.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index eb60858483..6a88d4af66 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,7 +46,7 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -#define LOWMEMORYMODE 1 +//#define LOWMEMORYMODE 1 #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" From 4d101fd13299721c2ffe71ff368b1bd9f2f66f41 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 27 Jul 2024 20:10:34 +0300 Subject: [PATCH 122/171] Stuff --- cev_eris.dme | 1 + code/__DEFINES/dcs/_attachmentFlags.dm | 17 +++++++++ code/__HELPERS/_lists.dm | 38 +++++++++++++++++++ code/game/atoms_movable.dm | 25 +++++------- code/game/objects/items/devices/powersink.dm | 12 +++--- code/game/objects/structures/medical_stand.dm | 36 +++++++++--------- code/modules/shieldgen/sheldwallgen.dm | 2 +- 7 files changed, 91 insertions(+), 40 deletions(-) create mode 100644 code/__DEFINES/dcs/_attachmentFlags.dm diff --git a/cev_eris.dme b/cev_eris.dme index 912cab52bd..324e13ec64 100644 --- a/cev_eris.dme +++ b/cev_eris.dme @@ -91,6 +91,7 @@ #include "code\__DEFINES\verb_manager.dm" #include "code\__DEFINES\weapons.dm" #include "code\__DEFINES\ZAS.dm" +#include "code\__DEFINES\dcs\_attachmentFlags.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" diff --git a/code/__DEFINES/dcs/_attachmentFlags.dm b/code/__DEFINES/dcs/_attachmentFlags.dm new file mode 100644 index 0000000000..76f246b189 --- /dev/null +++ b/code/__DEFINES/dcs/_attachmentFlags.dm @@ -0,0 +1,17 @@ +/// ATFS - Attachment flags for the supporting atom +/// If the supporter is marked for deletion/deleted , also delete the attached atoms. Default behaviour +#define ATFS_DELETE_RECURSIVE (1<<0) +/// Will detach all attached atoms and drop them on the turf +#define ATFS_DROP_ATTACHED (1<<1) + +/// ATFA - Attachment flags for the attached atom +/// We can be detached from the wall(either through a interaction or verb) +#define ATFA_DETACHABLE (1<<0) +/// This is embedded into the wall , removeable using surgical clamps or pliers, and not by normal means. +#define ATFA_EMBEDDED (1<<1) +/// The player must be next to the wall to interact with the attached +#define ATFA_CLOSE_INTERACTIVE (1<<2) +/// Player has to be near the turf the attached is facing to interact with it. Default behaviour +#define ATFA_EASY_INTERACTIVE (1<<3) + + diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index a345b27d0c..dd6551235e 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -27,6 +27,44 @@ #define SANITIZE_LIST(L) ( islist(L) ? L : list() ) #define reverseList(L) reverseRange(L.Copy()) +/// L - List, I - Item , K = Key . For associative lists +#define ASSLADD(L, I, K) \ + if(!length(L))\ + L = list();\ + L[K] = I;\ + +/// L - List, K = Key . For associative lists +#define ASSLREMOVE(L, K)\ + if(length(L)){\ + L -= K;\ + if(length(L) == 0){\ + del(L);};\ + }; + +/// L - List, I - Item , K = Key . For lists indexed by associative +#define ASSLLADD(L, I, K) \ + if(length(L)){\ + if(!length(L[K])){\ + L[K] = list(I);}\ + else{\ + L[K] += I;};\ + }\ + else\ + L = list();\ + L[K] = list(I);\ + +/// L - List, I - Item , K = Key . For lists indexed by associtive +#define ASSLLREMOVE(L, I, K)\ + if(length(L))\ + if(length(L[K]) > 1)\ + L[K] -= I;\ + else\ + L -= K;\ + if(length(L) == 0)\ + del(L);\ + + + //Sets the value of a key in an assoc list #define LAZYSET(L,K,V) if(!L) { L = list(); } L[K] = V; diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 39f4a2d1fa..0f76debe7e 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -34,28 +34,23 @@ GLOBAL_VAR_INIT(Debug,0) var/spawn_blacklisted = FALSE // Generally for niche objects, atoms blacklisted can spawn if enabled by spawner. Examples include exoplanet loot tables you don't want spawning within the player starting area. var/bad_type // Use path Ex:(bad_type = obj/item). Generally for abstract code objects, atoms with a set bad_type can never be selected by spawner. Examples include parent objects which should only exist within the code, or deployable embedded items. -/atom/movable/proc/attach(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) +/// Attaches the argument(thing) to src +/atom/movable/proc/attachGameMovable(atom/movable/thing, attachmentFlagsSupport, attachmentFlagsAttachable) if(!(ismovable(thing) || isturf(thing))) return FALSE - if(!length(attached)) - attached = list() - attached[thing] = attachmentFlagsSupport - thing.attached[src] = attachmentFlagsAttachable + ASSLADD(attached, attachmentFlagsSupport, thing) + ASSLADD(thing.attached, attachmentFlagsAttachable, src) return TRUE -/atom/movable/proc/detach(atom/thing) +/// Detaches the argument(thing) from src +/atom/movable/proc/detachGameMovable(atom/movable/thing) if(!(thing in attached)) return -1 - if(length(attached) == 1) - del(attached) - else - attached -= thing - if(src in thing.attached) - if(length(thing.attached > 1)) - thing.attached -= src - return TRUE - del(thing.attached) + ASSLREMOVE(attached ,thing) + ASSLREMOVE(thing.attached, src) + /// adauga functionalitate aicea return TRUE + /atom/movable/Del() if(isnull(gc_destroyed) && loc) testing("GC: -- [type] was deleted via del() rather than qdel() --") diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index b5a215424e..fcfd51915a 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -25,7 +25,7 @@ var/drained_this_tick = 0 // This is unfortunately necessary to ensure we process powersinks BEFORE other machinery such as APCs. var/datum/powernet/PN // Our powernet - var/obj/structure/cable/attached // the attached cable + var/obj/structure/cable/power_supply // the power_supply cable /obj/item/device/powersink/Initialize(mapload) . = ..() @@ -36,8 +36,8 @@ if(mode == 0) var/turf/T = loc if(isturf(T) && !!T.is_plating()) - attached = locate() in T - if(!attached) + power_supply = locate() in T + if(!power_supply) to_chat(user, "No exposed cable here to attach to.") return else @@ -81,7 +81,7 @@ STOP_PROCESSING(SSmachines, src) /obj/item/device/powersink/pwr_drain() - if(!attached) + if(!power_supply) return 0 if(drained_this_tick) @@ -124,7 +124,7 @@ explosion(get_turf(src), 1500, 100) qdel(src) return - if(attached && attached.powernet) - PN = attached.powernet + if(power_supply && power_supply.powernet) + PN = power_supply.powernet else PN = null diff --git a/code/game/objects/structures/medical_stand.dm b/code/game/objects/structures/medical_stand.dm index 29aa09301e..e730182de2 100644 --- a/code/game/objects/structures/medical_stand.dm +++ b/code/game/objects/structures/medical_stand.dm @@ -16,7 +16,7 @@ var/is_loosen = TRUE var/valve_opened = FALSE //blood stuff - var/mob/living/carbon/attached + var/mob/living/carbon/pacient var/mode = 1 // 1 is injecting, 0 is taking blood. var/obj/item/reagent_containers/beaker var/list/transfer_amounts = list(REM, 1, 2) @@ -54,7 +54,7 @@ if(beaker) overlays += "beaker" - if(attached) + if(pacient) overlays += "line_active" else overlays += "line" @@ -89,7 +89,7 @@ contained = null breather = null - attached = null + pacient = null qdel(beaker) beaker = null return ..() @@ -149,11 +149,11 @@ START_PROCESSING(SSobj,src) return if("Drip needle") - if(attached) + if(pacient) if(!do_mob(usr, target, 10)) return - visible_message("\The [attached] is taken off \the [src]") - attached = null + visible_message("\The [pacient] is taken off \the [src]") + pacient = null else if(ishuman(target)) usr.visible_message(SPAN_NOTICE("\The [usr] begins inserting needle into [target]'s vein."), SPAN_NOTICE("You begin inserting needle into [target]'s vein.")) @@ -164,7 +164,7 @@ return usr.visible_message(SPAN_NOTICE("\The [usr] hooks \the [target] up to \the [src]."), SPAN_NOTICE("You hook \the [target] up to \the [src].")) - attached = target + pacient = target START_PROCESSING(SSobj,src) update_icon() @@ -350,10 +350,10 @@ description += "The IV drip is [mode ? "injecting" : "taking blood"]. \n" description += "It is set to transfer [transfer_amount]u of chemicals per cycle. \n" if(beaker.reagents && beaker.reagents.total_volume) - description += SPAN_NOTICE("Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid. \n") + description += SPAN_NOTICE("pacient is \a [beaker] with [beaker.reagents.total_volume] units of liquid. \n") else - description += SPAN_NOTICE("Attached is an empty [beaker]. \n") - description += SPAN_NOTICE("[attached ? attached : "No one"] is hooked up to it. \n") + description += SPAN_NOTICE("pacient is an empty [beaker]. \n") + description += SPAN_NOTICE("[pacient ? pacient : "No one"] is hooked up to it. \n") else description += SPAN_NOTICE("There is no vessel. \n") @@ -399,17 +399,17 @@ environment.merge(removed) //Reagent Stuff - if(attached) - if(!Adjacent(attached)) - visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") - attached.apply_damage(3, BRUTE, pick(BP_R_ARM, BP_L_ARM), used_weapon = "Drip needle") - attached = null + if(pacient) + if(!Adjacent(pacient)) + visible_message("The needle is ripped out of [src.pacient], doesn't that hurt?") + pacient.apply_damage(3, BRUTE, pick(BP_R_ARM, BP_L_ARM), used_weapon = "Drip needle") + pacient = null update_icon() if(beaker) if(mode) // Give blood if(beaker.volume > 0) - beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_BLOOD) + beaker.reagents.trans_to_mob(pacient, transfer_amount, CHEM_BLOOD) update_icon() else // Take blood var/amount = beaker.reagents.maximum_volume - beaker.reagents.total_volume @@ -419,7 +419,7 @@ if(prob(5)) visible_message("\The [src] pings.") return - var/mob/living/carbon/human/H = attached + var/mob/living/carbon/human/H = pacient if(!istype(H)) return // if(NOCLONE in H.mutations) @@ -441,7 +441,7 @@ beaker.reagents.handle_reactions() update_icon() - if ((!valve_opened || tank.distribute_pressure == 0) && !breather && !attached) + if ((!valve_opened || tank.distribute_pressure == 0) && !breather && !pacient) return PROCESS_KILL /obj/structure/medical_stand/anesthetic diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 37a7583e73..b9e5487674 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -20,7 +20,7 @@ var/destroyed = 0 var/directwired = 1 // var/maxshieldload = 200 - var/obj/structure/cable/attached // the attached cable + var/obj/structure/cable/powerSupply // the powerSupply cable var/storedpower = 0 flags = CONDUCT //There have to be at least two posts, so these are effectively doubled From ce43d97435c1c07eb0b3fb0aac07015cd4aa60c3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 29 Jul 2024 19:53:29 +0300 Subject: [PATCH 123/171] Soul-draining work of fixing physics , aeough --- code/__DEFINES/dcs/_attachmentFlags.dm | 22 ++++++++++++++-------- code/game/atoms_movable.dm | 3 ++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/dcs/_attachmentFlags.dm b/code/__DEFINES/dcs/_attachmentFlags.dm index 76f246b189..4239254e05 100644 --- a/code/__DEFINES/dcs/_attachmentFlags.dm +++ b/code/__DEFINES/dcs/_attachmentFlags.dm @@ -1,17 +1,23 @@ /// ATFS - Attachment flags for the supporting atom +/// This denotes that we are a supporting atom to the thing attached to us +#define ATFS_SUPPORTER (1<<0) /// If the supporter is marked for deletion/deleted , also delete the attached atoms. Default behaviour -#define ATFS_DELETE_RECURSIVE (1<<0) +#define ATFS_DELETE_RECURSIVE (1<<1) /// Will detach all attached atoms and drop them on the turf -#define ATFS_DROP_ATTACHED (1<<1) +#define ATFS_DROP_ATTACHED (1<<2) +/// The supporting atom shall relay signals to all its attached atoms +#define ATFS_RELAY_SIGNALS (1<<3) /// ATFA - Attachment flags for the attached atom +/// This denotes that we are holding onto the supporting atom. +#define ATFA_HOLDING (1<<4) /// We can be detached from the wall(either through a interaction or verb) -#define ATFA_DETACHABLE (1<<0) +#define ATFA_DETACHABLE (1<<5) /// This is embedded into the wall , removeable using surgical clamps or pliers, and not by normal means. -#define ATFA_EMBEDDED (1<<1) +#define ATFA_EMBEDDED (1<<6) /// The player must be next to the wall to interact with the attached -#define ATFA_CLOSE_INTERACTIVE (1<<2) +#define ATFA_CLOSE_INTERACTIVE (1<<7) /// Player has to be near the turf the attached is facing to interact with it. Default behaviour -#define ATFA_EASY_INTERACTIVE (1<<3) - - +#define ATFA_EASY_INTERACTIVE (1<<8) +/// This can only be hit if the bullets come from the direction it is facing or if they are penetrating ,but otherwise not. +#define ATFA_DIRECTIONAL_HITTABLE (1<<9) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0f76debe7e..9accb91236 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -14,10 +14,11 @@ GLOBAL_VAR_INIT(Debug,0) var/throw_speed = 2 var/throw_range = 7 var/moved_recently = 0 + /// I yearn , for the day i can remove this variable , for it will set me free of shit-code (i just need a excuse to be lazy as fuck , this shit is here for convenience). SPCR 2024 var/obj/item/grab/grabbedBy /// Holds the hitbox datum if theres any var/datum/hitboxDatum/hitbox - /// A associative list , each index represents the thing we are attached to, the value of the index represents attachment flags that define behaviour + /// A associative list , each key represents the thing we are attached to, the value of the key represents attachment flags that define behaviour var/list/attached var/item_state // Used to specify the item state for the on-mob overlays. var/inertia_dir = 0 From b6fa227f8e3556a3238334933b65abed57f82b6e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 2 Aug 2024 00:33:40 +0300 Subject: [PATCH 124/171] attachment Framework part 1 --- code/__DEFINES/dcs/_attachmentFlags.dm | 25 +++++++--- code/game/atoms.dm | 39 ++++++++++++++-- code/game/turfs/simulated.dm | 27 ----------- code/modules/projectiles/projectile.dm | 64 ++++++++++++++------------ 4 files changed, 89 insertions(+), 66 deletions(-) diff --git a/code/__DEFINES/dcs/_attachmentFlags.dm b/code/__DEFINES/dcs/_attachmentFlags.dm index 4239254e05..c45efc86f4 100644 --- a/code/__DEFINES/dcs/_attachmentFlags.dm +++ b/code/__DEFINES/dcs/_attachmentFlags.dm @@ -1,23 +1,34 @@ -/// ATFS - Attachment flags for the supporting atom + +/// This denotes that we are attached to a supporting atom +#define ATFA_ATTACHED (0<<0) /// This denotes that we are a supporting atom to the thing attached to us #define ATFS_SUPPORTER (1<<0) + +/// ATFS - Attachment flags for the supporting atom +/// DEPENDING on wheter its an attached or a supporter, the bitflags change meaning /// If the supporter is marked for deletion/deleted , also delete the attached atoms. Default behaviour #define ATFS_DELETE_RECURSIVE (1<<1) /// Will detach all attached atoms and drop them on the turf #define ATFS_DROP_ATTACHED (1<<2) /// The supporting atom shall relay signals to all its attached atoms #define ATFS_RELAY_SIGNALS (1<<3) +/// This will cause all attached atoms to be checked first for hitbox collisions instead of us +#define ATFS_PRIORITIZE_ATTACHED_FOR_HITS (1<<4) +/// This will make all bullets ignore the attached atom +#define ATFS_IGNORE_HITS (1<<5) /// ATFA - Attachment flags for the attached atom /// This denotes that we are holding onto the supporting atom. -#define ATFA_HOLDING (1<<4) +#define ATFA_HOLDING (1<<1) /// We can be detached from the wall(either through a interaction or verb) -#define ATFA_DETACHABLE (1<<5) +#define ATFA_DETACHABLE (1<<2) /// This is embedded into the wall , removeable using surgical clamps or pliers, and not by normal means. -#define ATFA_EMBEDDED (1<<6) +#define ATFA_EMBEDDED (1<<3) /// The player must be next to the wall to interact with the attached -#define ATFA_CLOSE_INTERACTIVE (1<<7) +#define ATFA_CLOSE_INTERACTIVE (1<<4) /// Player has to be near the turf the attached is facing to interact with it. Default behaviour -#define ATFA_EASY_INTERACTIVE (1<<8) +#define ATFA_EASY_INTERACTIVE (1<<5) /// This can only be hit if the bullets come from the direction it is facing or if they are penetrating ,but otherwise not. -#define ATFA_DIRECTIONAL_HITTABLE (1<<9) +#define ATFA_DIRECTIONAL_HITTABLE_STRICT (1<<6) +/// The bullet can come from any axis that shares a direction bit-flag with ourselves +#define ATFA_DIRECTIONAL_HITTABLE (1<<7) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 79708e1497..fe87614057 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -15,7 +15,6 @@ var/last_bumped = 0 var/pass_flags = 0 var/throwpass = 0 - var/simulated = TRUE //filter for actions - used by lighting overlays var/fluorescent // Shows up under a UV light. var/allow_spin = TRUE // prevents thrown atoms from spinning when disabled on thrown or target var/used_now = FALSE //For tools system, check for it should forbid to work on atom for more than one user at time @@ -45,6 +44,42 @@ */ var/list/atom_colours + var/list/attached + +/atom/proc/attach(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) + if(!istype(thing)) + return FALSE + if(!length(attached)) + attached = list() + attached[thing] = attachmentFlagsSupport | ATFS_SUPPORTER + thing.attached[src] = attachmentFlagsAttachable | ATFA_SUPPORTER + afterAttach(thing, TRUE, attachmentFlagsSupport, attachmentFlagsAttachable) + thing.afterAttach(src, FALSE, attachmentFlagsSupport, attachmentFlagsAttachable) + return TRUE + +/atom/proc/detach(atom/thing) + if(!(thing in attached)) + return -1 + if(length(attached) == 1) + del(attached) + else + attached -= thing + if(src in thing.attached) + if(length(thing.attached > 1)) + thing.attached -= src + else + del(thing.attached) + afterDetach(thing, TRUE) + thing.afterDetach(src, FALSE) + return TRUE + +/atom/proc/afterAttach(atom/thing, isSupporter, attachmentFlagsSupport, attachmentFlagsAttachable) + return + +/atom/proc/afterDetach(atom/thing, isSupporter) + return + + /atom/proc/update_icon() return @@ -674,8 +709,6 @@ its easier to just keep the beam vertical. this.icon_state = "vomittox_[pick(1, 4)]" /atom/proc/clean_blood() - if(!simulated) - return fluorescent = 0 if(istype(blood_DNA, /list)) blood_DNA = null diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 9362d8c82a..87ab562bfa 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -14,37 +14,10 @@ var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to - var/list/attached - -/turf/simulated/proc/attach(atom/movable/thing, attachmentFlagsSupport, attachmentFlagsAttachable) - if(!istype(thing)) - return FALSE - if(!length(attached)) - attached = list() - attached[thing] = attachmentFlagsSupport - thing.attached[src] = attachmentFlagsAttachable - return TRUE - -/turf/simulated/proc/detach(atom/movable/thing) - if(!(thing in attached)) - return -1 - if(length(attached) == 1) - del(attached) - else - attached -= thing - if(src in thing.attached) - if(length(thing.attached > 1)) - thing.attached -= src - return TRUE - del(thing.attached) - return TRUE - /turf/simulated/New() ..() levelupdate() - - /turf/simulated/Entered(atom/A, atom/OL) if (isliving(A)) var/mob/living/M = A diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 26af68dc5f..21759fd3f9 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -487,42 +487,48 @@ GLOBAL_LIST(projectileDamageConstants) if(NewLoc == dataRef.targetTurf) message_admins("[src] reached target with a bulletLevel of [dataRef.currentCoords[3]], and a rate of [dataRef.movementRatios[3]]") -/// Has to be ordered with highest-leading typepaths to the left(aka don't put the stairs after obj/structure , since any check on obj/structure will also include the stairs as a subtype) -#define HittingPrioritiesList list(/mob/living = 5,/obj/structure/multiz/stairs/active = 3,/obj/structure = 4, /atom = 2) - - +/// The lower the index , the higher the priority. If you add new paths to the list , make sure to increase the amount of lists in scanTurf below. +#define HittingPrioritiesList list(/mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) /obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData) if(atomFlags & AF_VISUAL_MOVE) return PROJECTILE_CONTINUE - if(scanning.bullet_act(src, def_zone) & PROJECTILE_STOP) - onBlockingHit(scanning) - return PROJECTILE_STOP var/list/hittingList = list() - for(var/atom/thing in scanning.contents) - for(var/i in 1 to length(HittingPrioritiesList)) - if(istype(thing, HittingPrioritiesList[i])) - hittingList[thing] = HittingPrioritiesList[HittingPrioritiesList[i]] - break - - for(var/i in 1 to (length(hittingList) - 1)) - if(hittingList[hittingList[i]] < hittingList[hittingList[i+1]]) - var/temp = hittingList[hittingList[i]] - hittingList[hittingList[i]] = hittingList[hittingList[i+1]] - hittingList[hittingList[i+1]] = temp - i = max(i-2, 1) + hittingList[1] = list() + hittingList[2] = list() + hittingList[3] = list() + hittingList[4] = list() + var/list/sortingList = scanning.contents.Copy() + sortingList.Add(scanning) + for(var/atom/thing as anything in scanning.contents) + for(var/index=1 to length(HittingPrioritiesList)) + if(istype(thing, HittingPrioritiesList[index])) + hittingList[index] += thing + if(length(thing.attached)) + for(var/atom/possibleTarget in thing.attached) + if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) + continue + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(dir & reverse_dir[possibleTarget.dir])) + continue + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(dir == reverse_dir[possibleTarget.dir])) + continue + if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) + hittingList[index][length(hittingList[index])] = possibleTarget + hittingList[index] += thing + else + hittingList[index] += possibleTarget for(var/i in 1 to length(hittingList)) - var/obj/target = hittingList[i] - if(target == firer) - continue - /// third slot reversed for flags passed back by hitbox intersect - var/list/arguments = list(src, def_zone, null) - if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) - return PROJECTILE_CONTINUE - if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) - onBlockingHit(target) - return PROJECTILE_STOP + for(var/atom/target as anything in hittingList[i]) + if(target == firer) + continue + /// third slot rezerved for flags passed back by hitbox intersect + var/list/arguments = list(src, def_zone, null) + if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) + return PROJECTILE_CONTINUE + if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) + onBlockingHit(target) + return PROJECTILE_STOP return PROJECTILE_CONTINUE From 35cc46f83a636396d4ae0d147cb4f70671bf1dea Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 2 Aug 2024 00:50:35 +0300 Subject: [PATCH 125/171] Finish removal of simulated --- code/ZAS/Airflow.dm | 2 +- code/__HELPERS/turfs.dm | 3 +- code/__HELPERS/unsorted.dm | 1 - code/controllers/subsystems/explosions.dm | 9 ++---- code/game/atoms.dm | 2 +- code/game/atoms_movable.dm | 19 ----------- code/game/objects/effects/chem/chemsmoke.dm | 2 +- code/game/objects/effects/chem/water.dm | 2 +- .../items/devices/scanners/scanners.dm | 2 +- code/game/objects/landmarks/landmark.dm | 1 - .../structures/crates_lockers/largecrate.dm | 2 +- code/game/objects/structures/watercloset.dm | 2 +- code/modules/client/preferences_toggle.dm | 1 - code/modules/dungeons/asteroid.dm | 1 - code/modules/dungeons/crawler/dungeon_gen.dm | 1 - code/modules/dungeons/junk_tractor_beam.dm | 1 - code/modules/lighting/lighting_overlay.dm | 1 - code/modules/mechs/equipment/utility.dm | 4 +-- code/modules/mechs/mech_interaction.dm | 2 +- .../modules/mining/drilling/cave_generator.dm | 1 - code/modules/mob/living/silicon/subsystems.dm | 1 - code/modules/mob/observer/observer.dm | 1 - .../hardware/scanners/scanner_atmos.dm | 8 ++--- code/modules/overmap/_defines.dm | 2 +- code/modules/overmap/exoplanets/helpers.dm | 3 +- code/modules/power/singularity/act.dm | 11 +++---- code/modules/projectiles/hitbox_datums.dm | 2 -- code/modules/projectiles/projectile.dm | 32 ++++++++++--------- code/modules/random_map/drop/droppod.dm | 2 +- code/modules/random_map/drop/droppod_doors.dm | 6 +--- code/modules/reagents/holder.dm | 14 ++++---- code/modules/shuttles/landmarks.dm | 1 - code/modules/shuttles/shuttle.dm | 2 -- 33 files changed, 50 insertions(+), 94 deletions(-) diff --git a/code/ZAS/Airflow.dm b/code/ZAS/Airflow.dm index 5cf615c32a..8f3a186200 100644 --- a/code/ZAS/Airflow.dm +++ b/code/ZAS/Airflow.dm @@ -242,6 +242,6 @@ obj/item/check_airflow_movable(n) . = list() for(var/turf/T in contents) for(var/atom/movable/A in T) - if(!A.simulated || A.anchored || istype(A, /obj/effect) || isobserver(A)) + if(A.anchored || istype(A, /obj/effect) || isobserver(A)) continue . += A diff --git a/code/__HELPERS/turfs.dm b/code/__HELPERS/turfs.dm index 7eb9642197..fbecfca2ed 100644 --- a/code/__HELPERS/turfs.dm +++ b/code/__HELPERS/turfs.dm @@ -101,8 +101,7 @@ new_turf.transport_properties_from(source) for(var/obj/O in source) - if(O.simulated) - O.forceMove(new_turf) + O.forceMove(new_turf) for(var/mob/M in source) if(isEye(M)) continue // If we need to check for more mobs, I'll add a variable diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index b2553b8b2d..b4697a0667 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1275,7 +1275,6 @@ var/list/FLOORITEMS = list( density = FALSE anchored = TRUE - simulated = FALSE see_in_dark = 1e6 diff --git a/code/controllers/subsystems/explosions.dm b/code/controllers/subsystems/explosions.dm index 90d56c969c..93c43bc5db 100644 --- a/code/controllers/subsystems/explosions.dm +++ b/code/controllers/subsystems/explosions.dm @@ -209,12 +209,9 @@ SUBSYSTEM_DEF(explosions) /turf/explosion_act(target_power, explosion_handler/handler) var/power_reduction = 0 for(var/atom/movable/thing as anything in contents) - if(QDELETED(handler)) - break - if(thing.simulated) - power_reduction += thing.explosion_act(target_power, handler) - if(!QDELETED(thing) && isobj(thing) && !thing.anchored) - thing.throw_at(get_turf_away_from_target_simple(src, islist(handler.epicenter ? handler.epicenter[1] : handler.epicenter)), round(target_power / 30)) + power_reduction += thing.explosion_act(target_power, handler) + if(!QDELETED(thing) && isobj(thing) && !thing.anchored) + thing.throw_at(get_turf_away_from_target_simple(src, islist(handler.epicenter ? handler.epicenter[1] : handler.epicenter)), round(target_power / 30)) var/turf/to_propagate = GetAbove(src) if(to_propagate && target_power - EXPLOSION_ZTRANSFER_MINIMUM_THRESHOLD > EXPLOSION_ZTRANSFER_MINIMUM_THRESHOLD) to_propagate.take_damage(target_power - EXPLOSION_ZTRANSFER_MINIMUM_THRESHOLD, BLAST) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index fe87614057..98b100c775 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -52,7 +52,7 @@ if(!length(attached)) attached = list() attached[thing] = attachmentFlagsSupport | ATFS_SUPPORTER - thing.attached[src] = attachmentFlagsAttachable | ATFA_SUPPORTER + thing.attached[src] = attachmentFlagsAttachable | ATFA_ATTACHED afterAttach(thing, TRUE, attachmentFlagsSupport, attachmentFlagsAttachable) thing.afterAttach(src, FALSE, attachmentFlagsSupport, attachmentFlagsAttachable) return TRUE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 9accb91236..884fc559a5 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -18,8 +18,6 @@ GLOBAL_VAR_INIT(Debug,0) var/obj/item/grab/grabbedBy /// Holds the hitbox datum if theres any var/datum/hitboxDatum/hitbox - /// A associative list , each key represents the thing we are attached to, the value of the key represents attachment flags that define behaviour - var/list/attached var/item_state // Used to specify the item state for the on-mob overlays. var/inertia_dir = 0 var/can_anchor = TRUE @@ -35,23 +33,6 @@ GLOBAL_VAR_INIT(Debug,0) var/spawn_blacklisted = FALSE // Generally for niche objects, atoms blacklisted can spawn if enabled by spawner. Examples include exoplanet loot tables you don't want spawning within the player starting area. var/bad_type // Use path Ex:(bad_type = obj/item). Generally for abstract code objects, atoms with a set bad_type can never be selected by spawner. Examples include parent objects which should only exist within the code, or deployable embedded items. -/// Attaches the argument(thing) to src -/atom/movable/proc/attachGameMovable(atom/movable/thing, attachmentFlagsSupport, attachmentFlagsAttachable) - if(!(ismovable(thing) || isturf(thing))) - return FALSE - ASSLADD(attached, attachmentFlagsSupport, thing) - ASSLADD(thing.attached, attachmentFlagsAttachable, src) - return TRUE - -/// Detaches the argument(thing) from src -/atom/movable/proc/detachGameMovable(atom/movable/thing) - if(!(thing in attached)) - return -1 - ASSLREMOVE(attached ,thing) - ASSLREMOVE(thing.attached, src) - /// adauga functionalitate aicea - return TRUE - /atom/movable/Del() if(isnull(gc_destroyed) && loc) testing("GC: -- [type] was deleted via del() rather than qdel() --") diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index 3598c2a930..6f0c3f5902 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -171,7 +171,7 @@ if(!internals && !gasmask) chemholder.reagents.trans_to_mob(H, 5, CHEM_INGEST, copy = TRUE) chemholder.reagents.trans_to_mob(H, 5, CHEM_BLOOD, copy = TRUE) - else if(isobj(A) && !A.simulated) + else if(isobj(A)) chemholder.reagents.touch_obj(A) var/color = chemholder.reagents.get_color() //build smoke icon diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index deae005838..636c6473bc 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -28,7 +28,7 @@ for (var/atom/A in T) if (ismob(A)) affected_mobs |= A - else if (A.simulated) + else reagents.touch(A) for (var/mob/M in affected_mobs) diff --git a/code/game/objects/items/devices/scanners/scanners.dm b/code/game/objects/items/devices/scanners/scanners.dm index ad7785fa09..567b7a6ae9 100644 --- a/code/game/objects/items/devices/scanners/scanners.dm +++ b/code/game/objects/items/devices/scanners/scanners.dm @@ -68,7 +68,7 @@ if(!can_use(user)) return - if(is_valid_scan_target(A) && A.simulated) + if(is_valid_scan_target(A)) if(!is_virtual) user.visible_message(SPAN_NOTICE("[user] runs \the [src] over \the [A]."), range = 2) if(scan_sound) diff --git a/code/game/objects/landmarks/landmark.dm b/code/game/objects/landmarks/landmark.dm index 1538c140ae..023200bc7d 100644 --- a/code/game/objects/landmarks/landmark.dm +++ b/code/game/objects/landmarks/landmark.dm @@ -4,7 +4,6 @@ alpha = 64 //Or else they cover half of the map anchored = TRUE unacidable = TRUE - simulated = FALSE invisibility = 101 layer = MID_LANDMARK_LAYER weight = 0 diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 1af34320b3..d630d6677f 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -16,7 +16,7 @@ drop_materials(drop_location()) var/turf/T = get_turf(src) for(var/atom/movable/AM in contents) - if(AM.simulated) AM.forceMove(T) + AM.forceMove(T) user.visible_message(SPAN_NOTICE("[user] pries \the [src] open."), \ SPAN_NOTICE("You pry open \the [src]."), \ SPAN_NOTICE("You hear splitting wood.")) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 26cb82ca96..bb173514ae 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -320,7 +320,7 @@ for(var/thing in loc) var/atom/movable/AM = thing var/mob/living/L = thing - if(istype(AM) && AM.simulated) + if(istype(AM)) wash(AM) if(istype(L)) process_heat(L) diff --git a/code/modules/client/preferences_toggle.dm b/code/modules/client/preferences_toggle.dm index aa40f96392..2cb58008cc 100644 --- a/code/modules/client/preferences_toggle.dm +++ b/code/modules/client/preferences_toggle.dm @@ -36,7 +36,6 @@ var/list/client_preference_stats_ /stat_client_preference parent_type = /atom/movable - simulated = FALSE var/datum/client_preference/client_preference /stat_client_preference/New(var/loc, var/preference) diff --git a/code/modules/dungeons/asteroid.dm b/code/modules/dungeons/asteroid.dm index d89bcd5563..9899e99440 100644 --- a/code/modules/dungeons/asteroid.dm +++ b/code/modules/dungeons/asteroid.dm @@ -167,7 +167,6 @@ alpha = 120 anchored = TRUE unacidable = 1 - simulated = FALSE invisibility = 101 var/delay = 2 diff --git a/code/modules/dungeons/crawler/dungeon_gen.dm b/code/modules/dungeons/crawler/dungeon_gen.dm index 20aa1894b1..33f677cb7e 100644 --- a/code/modules/dungeons/crawler/dungeon_gen.dm +++ b/code/modules/dungeons/crawler/dungeon_gen.dm @@ -6,7 +6,6 @@ alpha = 120 anchored = TRUE unacidable = 1 - simulated = FALSE invisibility = 101 weight = 0 var/max_x = 8 //if we ever make more than 4x4 dungeon run map, instead of making new procs for generation, we can just edit those vars - edit 16 x 16 diff --git a/code/modules/dungeons/junk_tractor_beam.dm b/code/modules/dungeons/junk_tractor_beam.dm index b2165e5d03..5f99c4690e 100644 --- a/code/modules/dungeons/junk_tractor_beam.dm +++ b/code/modules/dungeons/junk_tractor_beam.dm @@ -50,7 +50,6 @@ alpha = 120 anchored = TRUE unacidable = 1 - simulated = FALSE invisibility = 101 var/delay = 2 diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 2e8d766621..db99ad724a 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -9,7 +9,6 @@ layer = LIGHTING_LAYER invisibility = INVISIBILITY_LIGHTING - simulated = FALSE anchored = TRUE blend_mode = BLEND_OVERLAY diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index 3db0080bc5..d6d283ab8d 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -265,7 +265,7 @@ if(CATAPULT_SINGLE) if(!locked) var/atom/movable/AM = target - if(!istype(AM) || AM.anchored || !AM.simulated) + if(!istype(AM) || AM.anchored) to_chat(user, SPAN_NOTICE("Unable to lock on [target].")) return locked = AM @@ -292,7 +292,7 @@ else atoms = orange(target,3) for(var/atom/movable/A in atoms) - if(A.anchored || !A.simulated) continue + if(A.anchored) continue var/dist = 5-get_dist(A,target) A.throw_at(get_edge_target_turf(A,get_dir(target, A)),dist,0.7) diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index 0098887f4b..adf7956040 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -100,7 +100,7 @@ A = null while(LAZYLEN(other_atoms)) var/atom/picked = pick_n_take(other_atoms) - if(istype(picked) && picked.simulated) + if(istype(picked)) A = picked break if(!A) diff --git a/code/modules/mining/drilling/cave_generator.dm b/code/modules/mining/drilling/cave_generator.dm index ede16cd8cc..710d6ed4de 100644 --- a/code/modules/mining/drilling/cave_generator.dm +++ b/code/modules/mining/drilling/cave_generator.dm @@ -38,7 +38,6 @@ alpha = 120 anchored = TRUE unacidable = 1 - simulated = FALSE invisibility = 0 // 101 var/status = CAVE_CLOSED // Status of the cave generator diff --git a/code/modules/mob/living/silicon/subsystems.dm b/code/modules/mob/living/silicon/subsystems.dm index 4cbae9ef8d..e0c2a8b436 100644 --- a/code/modules/mob/living/silicon/subsystems.dm +++ b/code/modules/mob/living/silicon/subsystems.dm @@ -114,7 +114,6 @@ /stat_silicon_subsystem parent_type = /atom/movable - simulated = FALSE var/ui_state var/datum/nano_module/subsystem diff --git a/code/modules/mob/observer/observer.dm b/code/modules/mob/observer/observer.dm index 18bdd349b9..fa618684ae 100644 --- a/code/modules/mob/observer/observer.dm +++ b/code/modules/mob/observer/observer.dm @@ -9,7 +9,6 @@ var/const/GHOST_IMAGE_ALL = ~GHOST_IMAGE_NONE layer = FLY_LAYER see_invisible = SEE_INVISIBLE_OBSERVER sight = SEE_TURFS|SEE_MOBS|SEE_OBJS|SEE_SELF - simulated = FALSE stat = DEAD status_flags = GODMODE var/ghost_image_flag = GHOST_IMAGE_DARKNESS diff --git a/code/modules/modular_computers/hardware/scanners/scanner_atmos.dm b/code/modules/modular_computers/hardware/scanners/scanner_atmos.dm index 0e3e0b0190..4c0e603db6 100644 --- a/code/modules/modular_computers/hardware/scanners/scanner_atmos.dm +++ b/code/modules/modular_computers/hardware/scanners/scanner_atmos.dm @@ -1,14 +1,12 @@ /obj/item/computer_hardware/scanner/atmos name = "atmospheric scanner module" desc = "An atmospheric scanner module. It can scan the surroundings and report the composition of gases." - can_run_scan = 1 + can_run_scan = TRUE /obj/item/computer_hardware/scanner/atmos/can_use_scanner(mob/user, atom/target, proximity = TRUE) if(!..()) - return 0 - if(!target.simulated) - return 0 - return 1 + return FALSE + return TRUE /obj/item/computer_hardware/scanner/atmos/run_scan(mob/user, datum/computer_file/program/scanner/program) if(..()) diff --git a/code/modules/overmap/_defines.dm b/code/modules/overmap/_defines.dm index bfabebd56f..f9dc03db97 100644 --- a/code/modules/overmap/_defines.dm +++ b/code/modules/overmap/_defines.dm @@ -49,7 +49,7 @@ var/global/list/map_sectors = list() for(var/turf/space/T in spaceturfs) T.icon_state = "speedspace_[gen_dir]_[rand(1,15)]" for(var/atom/movable/AM in T) - if (AM.simulated && !AM.anchored) + if (!AM.anchored) AM.throw_at(get_step(T,reverse_direction(direction)), 5, 1) CHECK_TICK CHECK_TICK diff --git a/code/modules/overmap/exoplanets/helpers.dm b/code/modules/overmap/exoplanets/helpers.dm index 2f115dd7ab..cec4ac18e6 100644 --- a/code/modules/overmap/exoplanets/helpers.dm +++ b/code/modules/overmap/exoplanets/helpers.dm @@ -126,7 +126,6 @@ GLOBAL_LIST_EMPTY(banned_ruin_ids) icon_state = "x2" anchored = 1.0 unacidable = 1 - simulated = 0 invisibility = 101 var/delete_me = 0 @@ -153,7 +152,7 @@ GLOBAL_LIST_EMPTY(banned_ruin_ids) /obj/effect/landmark/ruin/automatic/clearing/New(loc, my_ruin_template, ruin_radius) . = ..(loc, my_ruin_template) - radius = ruin_radius + radius = ruin_radius /obj/effect/landmark/ruin/automatic/clearing/Initialize() ..() diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm index bc569b1e33..32c8d90a18 100644 --- a/code/modules/power/singularity/act.dm +++ b/code/modules/power/singularity/act.dm @@ -27,14 +27,13 @@ ..() /obj/singularity_act() - if(simulated) - explosion_act(1000, null) - if(src) - qdel(src) - return 2 + explosion_act(1000, null) + if(!QDELETED(src)) + qdel(src) + return 2 /obj/singularity_pull(S, current_size) - if(simulated && !anchored) + if(!anchored) step_towards(src, S) /obj/effect/beam/singularity_pull() diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 83b740d52a..e2b6db3e8a 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -233,8 +233,6 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo // i=3 ==> east // i=4 ==> west // i dont get why owner connections is text.. but it is what it is - var/direct = "[(1<<(i-1))]" - var/conn = text2num(owner.connections[i]) boundingList = boundingBoxes[text2num(owner.connections[i])+1]["[(1<<(i-1))]"] for(var/list/boundingData in boundingList) /// basic AABB but only for the Z-axis. diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 21759fd3f9..0d3175ce6f 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -502,21 +502,23 @@ GLOBAL_LIST(projectileDamageConstants) sortingList.Add(scanning) for(var/atom/thing as anything in scanning.contents) for(var/index=1 to length(HittingPrioritiesList)) - if(istype(thing, HittingPrioritiesList[index])) - hittingList[index] += thing - if(length(thing.attached)) - for(var/atom/possibleTarget in thing.attached) - if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) - continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(dir & reverse_dir[possibleTarget.dir])) - continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(dir == reverse_dir[possibleTarget.dir])) - continue - if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) - hittingList[index][length(hittingList[index])] = possibleTarget - hittingList[index] += thing - else - hittingList[index] += possibleTarget + if(!istype(thing, HittingPrioritiesList[index])) + continue + hittingList[index] += thing + if(!length(thing.attached)) + continue + for(var/atom/possibleTarget as anything in thing.attached) + if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) + continue + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(dir & reverse_dir[possibleTarget.dir])) + continue + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(dir == reverse_dir[possibleTarget.dir])) + continue + if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) + hittingList[index][length(hittingList[index])] = possibleTarget + hittingList[index] += thing + else + hittingList[index] += possibleTarget for(var/i in 1 to length(hittingList)) for(var/atom/target as anything in hittingList[i]) diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index a96bb42f4c..fbbf1d762f 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -117,7 +117,7 @@ // Splatter anything under us that survived the explosion. if(value != SD_EMPTY_TILE && T.contents.len) for(var/atom/movable/AM in T) - if(AM.simulated && !isobserver(AM)) + if(!isobserver(AM)) AM.explosion_act(700, null) // Also spawn doors and loot. diff --git a/code/modules/random_map/drop/droppod_doors.dm b/code/modules/random_map/drop/droppod_doors.dm index 6c7a6a18d7..020b78c53e 100644 --- a/code/modules/random_map/drop/droppod_doors.dm +++ b/code/modules/random_map/drop/droppod_doors.dm @@ -57,12 +57,8 @@ // Destroy turf contents. for(var/obj/O in origin) - if(!O.simulated) - continue qdel(O) //crunch for(var/obj/O in T) - if(!O.simulated) - continue qdel(O) //crunch // Hurl the mobs away. @@ -80,4 +76,4 @@ door_bottom.density = FALSE door_bottom.set_opacity(FALSE) door_bottom.dir = src.dir - door_bottom.icon_state = "rampbottom" \ No newline at end of file + door_bottom.icon_state = "rampbottom" diff --git a/code/modules/reagents/holder.dm b/code/modules/reagents/holder.dm index 3baec901dc..a53f98dc43 100644 --- a/code/modules/reagents/holder.dm +++ b/code/modules/reagents/holder.dm @@ -425,7 +425,7 @@ remove_any(amount) //If we don't do this, then only the spill amount above is removed, and someone can keep splashing with the same beaker endlessly /datum/reagents/proc/trans_id_to(atom/target, id, amount = 1, ignore_isinjectable = FALSE) - if (!target || !target.reagents || !target.simulated) + if (!target || !target.reagents) return amount = min(amount, get_reagent_amount(id)) @@ -454,7 +454,7 @@ return /datum/reagents/proc/touch_mob(mob/target) - if(!target || !istype(target) || !target.simulated) + if(!target || !istype(target)) return for(var/datum/reagent/current in reagent_list) @@ -463,7 +463,7 @@ update_total() /datum/reagents/proc/touch_turf(turf/target) - if(!target || !istype(target) || !target.simulated) + if(!target || !istype(target)) return if(istype(target, /turf/simulated/open)) var/turf/simulated/open/T = target @@ -478,7 +478,7 @@ return handled /datum/reagents/proc/touch_obj(obj/target) - if(!target || !istype(target) || !target.simulated) + if(!target || !istype(target)) return for(var/datum/reagent/current in reagent_list) @@ -497,7 +497,7 @@ return trans_to_mob(target, amount, CHEM_TOUCH, multiplier, copy) /datum/reagents/proc/trans_to_mob(mob/target, amount = 1, type = CHEM_BLOOD, multiplier = 1, copy = 0) // Transfer after checking into which holder... - if(!target || !istype(target) || !target.simulated) + if(!target || !istype(target)) return if(iscarbon(target)) var/mob/living/carbon/C = target @@ -520,7 +520,7 @@ R.touch_mob(target) /datum/reagents/proc/trans_to_turf(turf/target, amount = 1, multiplier = 1, copy = 0) // Turfs don't have any reagents (at least, for now). Just touch it. - if(!target || !target.simulated) + if(!target) return var/datum/reagents/R = new /datum/reagents(amount * multiplier) @@ -543,7 +543,7 @@ return /datum/reagents/proc/trans_to_obj(obj/target, amount = 1, multiplier = 1, copy = 0) // Objects may or may not; if they do, it's probably a beaker or something and we need to transfer properly; otherwise, just touch. - if(!target || !target.simulated) + if(!target) return if(!target.reagents) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index e91da9a57e..4ae3ea4620 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -6,7 +6,6 @@ alpha = 120 anchored = TRUE unacidable = 1 - simulated = FALSE invisibility = 101 var/landmark_tag diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 096d714927..7a63234dd3 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -144,8 +144,6 @@ var/turf/dst_turf = turf_translation[src_turf] if(src_turf.is_solid_structure()) //in case someone put a hole in the shuttle and you were lucky enough to be under it for(var/atom/movable/AM in dst_turf) - if(!AM.simulated) - continue if(isliving(AM)) var/mob/living/bug = AM bug.gib() From 373f9408827e18dd0f51d8cf10180c930b7040fc Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 2 Aug 2024 00:56:54 +0300 Subject: [PATCH 126/171] Move hitboxes to all atoms and remove redundant var --- code/game/atoms.dm | 32 ++++++++++++++++++++++++++++++-- code/game/atoms_movable.dm | 13 ------------- 2 files changed, 30 insertions(+), 15 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 98b100c775..9cbf893511 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -26,8 +26,8 @@ var/reagent_flags = NONE var/datum/reagents/reagents - //Detective Work, used for the duplicate data points kept in the scanners - var/list/original_atom + /// Holds the hitbox datum if theres any + var/datum/hitboxDatum/hitbox var/auto_init = TRUE @@ -46,6 +46,26 @@ var/list/attached +/// Attaches the argument(thing) to src +/atom/proc/attachGameMovable(atom/movable/thing, attachmentFlagsSupport, attachmentFlagsAttachable) + if(!(ismovable(thing) || isturf(thing))) + return FALSE + ASSLADD(attached, attachmentFlagsSupport | ATFS_SUPPORTER, thing) + ASSLADD(thing.attached, attachmentFlagsAttachable | ATFA_ATTACHED , src) + afterAttach(thing, TRUE, attachmentFlagsSupport, attachmentFlagsAttachable) + thing.afterAttach(src, FALSE, attachmentFlagsSupport, attachmentFlagsAttachable) + return TRUE + +/// Detaches the argument(thing) from src +/atom/proc/detachGameMovable(atom/movable/thing) + if(!(thing in attached)) + return -1 + ASSLREMOVE(attached ,thing) + ASSLREMOVE(thing.attached, src) + afterDetach(thing, TRUE) + thing.afterDetach(src, FALSE) + return TRUE +/* /atom/proc/attach(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) if(!istype(thing)) return FALSE @@ -72,6 +92,7 @@ afterDetach(thing, TRUE) thing.afterDetach(src, FALSE) return TRUE +*/ /atom/proc/afterAttach(atom/thing, isSupporter, attachmentFlagsSupport, attachmentFlagsAttachable) return @@ -79,6 +100,11 @@ /atom/proc/afterDetach(atom/thing, isSupporter) return +/atom/getAimingLevel(atom/shooter, defZone) + if(hitbox) + return hitbox.getAimingLevel(shooter, defZone, src) + else + return ..() /atom/proc/update_icon() return @@ -186,6 +212,8 @@ update_plane() + hitbox = getHitbox(hitbox) + if(preloaded_reagents) if(!reagents) var/volume = 0 diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 884fc559a5..149793883d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -16,8 +16,6 @@ GLOBAL_VAR_INIT(Debug,0) var/moved_recently = 0 /// I yearn , for the day i can remove this variable , for it will set me free of shit-code (i just need a excuse to be lazy as fuck , this shit is here for convenience). SPCR 2024 var/obj/item/grab/grabbedBy - /// Holds the hitbox datum if theres any - var/datum/hitboxDatum/hitbox var/item_state // Used to specify the item state for the on-mob overlays. var/inertia_dir = 0 var/can_anchor = TRUE @@ -43,12 +41,6 @@ GLOBAL_VAR_INIT(Debug,0) // testing("GC: [type] was deleted via GC with qdel()") ..() -/atom/movable/getAimingLevel(atom/shooter, defZone) - if(hitbox) - return hitbox.getAimingLevel(shooter, defZone, src) - else - return ..() - /atom/movable/Destroy() var/turf/T = loc if(opacity && istype(T)) @@ -80,11 +72,6 @@ GLOBAL_VAR_INIT(Debug,0) /atom/movable/proc/entered_with_container(var/atom/old_loc) return -/atom/movable/Initialize() - hitbox = getHitbox(hitbox) - . = ..() - - // Gets the top-atom that contains us, doesn't care about how deeply nested a item is // If stopType is defined , it will stop at the first object that is the type of stopType /atom/proc/getContainingAtom(stopType = null) From 67d1dad4762e5c3f65b29022e1547ed0f38c5456 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 2 Aug 2024 06:21:01 +0300 Subject: [PATCH 127/171] Map fixed , eris saved. --- code/game/atoms.dm | 8 +- code/game/machinery/alarm.dm | 28 +++- code/modules/power/apc.dm | 21 +-- code/modules/projectiles/projectile.dm | 2 +- maps/CEVEris/_CEV_Eris.dmm | 173 +++++++++++++------------ 5 files changed, 131 insertions(+), 101 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 9cbf893511..e6536e7ea3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -47,7 +47,7 @@ var/list/attached /// Attaches the argument(thing) to src -/atom/proc/attachGameMovable(atom/movable/thing, attachmentFlagsSupport, attachmentFlagsAttachable) +/atom/proc/attachGameAtom(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) if(!(ismovable(thing) || isturf(thing))) return FALSE ASSLADD(attached, attachmentFlagsSupport | ATFS_SUPPORTER, thing) @@ -57,7 +57,7 @@ return TRUE /// Detaches the argument(thing) from src -/atom/proc/detachGameMovable(atom/movable/thing) +/atom/proc/detachGameAtom(atom/thing) if(!(thing in attached)) return -1 ASSLREMOVE(attached ,thing) @@ -258,7 +258,9 @@ if(statverbs) statverbs.Cut() - //post_buckle_mob(.) + for(var/atom/thing as anything in attached) + detachGameAtom(thing) + if(reagents) QDEL_NULL(reagents) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index eb4969e793..70fc8b2d40 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -82,14 +82,14 @@ wires = null return ..() -/obj/machinery/alarm/New(loc, dir, building = 0) +/obj/machinery/alarm/New(loc, dir, building = FALSE) GLOB.alarm_list += src if(building) if(dir) src.set_dir(dir) buildstage = 0 - wiresexposed = 1 + wiresexposed = TRUE pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 update_icon() @@ -126,6 +126,16 @@ if(buildstage == 2 && !master_is_operating()) elect_master() + var/turf/toAttach = get_step(loc, reverse_dir[dir]) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + + /obj/machinery/alarm/fire_act() return @@ -1200,12 +1210,24 @@ FIRE ALARM if(building) buildstage = 0 - wiresexposed = 1 + wiresexposed = TRUE pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 GLOB.firealarm_list += src +/obj/machinery/firealarm/Initialize(mapload, d) + . = ..() + var/turf/toAttach = get_step(loc, reverse_dir[dir]) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + + /obj/machinery/firealarm/Destroy() GLOB.firealarm_list -= src ..() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 52b6814685..6be7d7c8ce 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -90,7 +90,6 @@ var/locked = 1 var/coverlocked = 1 var/aidisabled = 0 - var/tdir = null var/obj/machinery/power/terminal/terminal var/lastused_light = 0 var/lastused_equip = 0 @@ -119,8 +118,6 @@ var/global/list/status_overlays_equipment var/global/list/status_overlays_lighting var/global/list/status_overlays_environ - /// Offsets the object by APC_PIXEL_OFFSET (defined in apc_defines.dm) pixels in the direction we want it placed in. This allows the APC to be embedded in a wall, yet still inside an area (like mapping). - var/offset_old /obj/machinery/power/apc/updateDialog() if (stat & (BROKEN|MAINT)) @@ -182,23 +179,18 @@ addtimer(CALLBACK(src, PROC_REF(update)), 5) set_dir(ndir) - /* +/obj/machinery/power/apc/set_dir() + . = ..() switch(dir) if(NORTH) - offset_old = pixel_y pixel_y = 28 if(SOUTH) - offset_old = pixel_y pixel_y = -28 if(EAST) - offset_old = pixel_x pixel_x = 28 if(WEST) - offset_old = pixel_x pixel_x = -28 - */ - tdir = dir // to fix Vars bug /obj/machinery/power/apc/Initialize(mapload) . = ..() @@ -229,6 +221,15 @@ log_mapping("Duplicate APC created at [AREACOORD(src)]. Original at [AREACOORD(area.apc)].") area.apc = src + var/turf/toAttach = get_step(loc, dir) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + update_icon() make_terminal() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0d3175ce6f..aa5341e024 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -493,7 +493,7 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData) if(atomFlags & AF_VISUAL_MOVE) return PROJECTILE_CONTINUE - var/list/hittingList = list() + var/list/hittingList = new/list(length(HittingPrioritiesList)) hittingList[1] = list() hittingList[2] = list() hittingList[3] = list() diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 8cc28b8560..c0e57f4540 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -419,7 +419,7 @@ icon_state = "1-2" }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/dark, @@ -1262,7 +1262,7 @@ /area/eris/security/prison) "add" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /turf/simulated/floor/tiled/dark, @@ -1663,7 +1663,7 @@ "aed" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /obj/machinery/light/small{ @@ -1737,7 +1737,7 @@ dir = 8 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/dark, @@ -2271,7 +2271,7 @@ /area/eris/security/prisoncells) "afG" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/camera/network/security{ @@ -3582,7 +3582,7 @@ dir = 8 }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/dark, @@ -3600,7 +3600,7 @@ /obj/structure/table/standard, /obj/item/storage/toolbox/mechanical, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/camera/network/security{ @@ -9581,7 +9581,7 @@ /area/eris/maintenance/section3deck2starboard) "axg" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/steel, @@ -17574,7 +17574,7 @@ /area/eris/hallway/side/eschangara) "aRK" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -18543,7 +18543,7 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /turf/simulated/floor/tiled/dark, @@ -20100,7 +20100,7 @@ name = "Evidence Closet" }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/dark, @@ -20900,7 +20900,7 @@ "aZf" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/dark, @@ -23966,7 +23966,7 @@ /area/eris/maintenance/section3deck1central) "bff" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/dark, @@ -24000,7 +24000,7 @@ /area/eris/rnd/robotics) "bfj" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/spawner/flora/low_chance, @@ -24106,7 +24106,7 @@ /area/eris/crew_quarters/sleep/cryo) "bfB" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/steel, @@ -24135,7 +24135,7 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/item/device/radio/intercom{ @@ -25939,7 +25939,7 @@ /area/eris/crew_quarters/sleep) "bjO" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/item/device/radio/intercom{ @@ -28325,7 +28325,7 @@ pixel_y = 2 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/dark, @@ -29274,7 +29274,7 @@ /area/eris/maintenance/section2deck4central) "brG" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -29629,7 +29629,7 @@ /area/eris/crew_quarters/sleep/cryo) "bsH" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/steel, @@ -32019,7 +32019,7 @@ dir = 8 }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/light{ @@ -38418,7 +38418,7 @@ /area/eris/security/lobby) "bMT" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -39607,7 +39607,7 @@ /area/eris/crew_quarters/hydroponics) "bPB" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /obj/machinery/light/small, @@ -40808,7 +40808,7 @@ "bSM" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/structure/table/standard, @@ -41673,7 +41673,7 @@ /obj/item/storage/toolbox/mechanical, /obj/structure/table/standard, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/item/paper_bin, @@ -42222,7 +42222,7 @@ /area/eris/command/courtroom) "bWr" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/computer/message_monitor{ @@ -42809,7 +42809,7 @@ /area/eris/security/lobby) "bXP" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -43398,9 +43398,6 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/biogenerator) "bZo" = ( -/obj/machinery/firealarm{ - pixel_y = 28 - }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 @@ -43572,7 +43569,7 @@ "bZG" = ( /obj/machinery/atmospherics/unary/freezer, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/light{ @@ -43799,7 +43796,7 @@ icon_state = "2-8" }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/camera/network/third_section{ @@ -44901,7 +44898,7 @@ /area/eris/rnd/mixing) "cdh" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/light{ @@ -46568,7 +46565,7 @@ "cgL" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/steel/techfloor, @@ -49165,7 +49162,7 @@ "cnu" = ( /obj/structure/cyberplant, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/structure/disposalpipe/segment, @@ -49369,7 +49366,7 @@ /obj/structure/table/standard, /obj/item/hand_tele, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/white/gray_platform, @@ -49397,14 +49394,14 @@ /area/eris/neotheology/storage) "cnZ" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "coa" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -49444,7 +49441,7 @@ /area/eris/command/meo) "coj" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/structure/cable/green{ @@ -50861,7 +50858,7 @@ /area/eris/maintenance/section3deck4starboard) "crM" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/light{ @@ -51158,7 +51155,7 @@ dir = 1 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/steel/gray_platform, @@ -51688,7 +51685,7 @@ /area/eris/neotheology/biogenerator) "cuk" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/light{ @@ -52256,7 +52253,7 @@ /area/eris/engineering/post) "cvV" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/light{ @@ -55219,7 +55216,7 @@ /obj/structure/table/standard, /obj/item/device/aicard, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /turf/simulated/floor/tiled/steel/gray_platform, @@ -56861,7 +56858,7 @@ /area/eris/maintenance/section3deck4central) "cGV" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -58929,7 +58926,7 @@ /area/eris/maintenance/section4deck3port) "cMl" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/camera/network/engineering{ @@ -59176,7 +59173,7 @@ /area/eris/rnd/research) "cNc" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/light{ @@ -60745,7 +60742,7 @@ /area/eris/crew_quarters/sleep/cryo) "cRN" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -65868,7 +65865,7 @@ "def" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /turf/simulated/floor/wood, @@ -66014,7 +66011,7 @@ }) "dez" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/wood, @@ -66469,7 +66466,7 @@ /obj/item/clothing/suit/space/captain, /obj/item/clothing/head/space/capspace, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -67407,7 +67404,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -68016,7 +68013,7 @@ /area/eris/command/tcommsat/computer) "diX" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/camera/network/engineering{ @@ -68026,7 +68023,7 @@ /area/eris/hallway/side/atmosphericshallway) "diY" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/white/danger, @@ -68171,7 +68168,7 @@ /area/eris/rnd/xenobiology) "djm" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/camera/network/research{ @@ -70920,7 +70917,7 @@ /area/eris/engineering/foyer) "dpr" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/structure/table/rack, @@ -71195,7 +71192,7 @@ dir = 8 }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/white, @@ -72312,7 +72309,7 @@ /area/eris/command/mbo/quarters) "dsR" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -73366,7 +73363,7 @@ /area/eris/medical/psych) "dvo" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/white/brown_perforated, @@ -73427,7 +73424,7 @@ dir = 4 }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /obj/item/modular_computer/console/preset/engineering/alarms{ @@ -74798,7 +74795,7 @@ name = "Armoury showcase" }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -76653,7 +76650,7 @@ /area/eris/engineering/starboardhallway) "dDl" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/light{ @@ -76694,7 +76691,7 @@ /area/eris/command/bridge) "dDq" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 24 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -76702,7 +76699,7 @@ /area/eris/command/bridge) "dDs" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -76780,7 +76777,7 @@ "dDC" = ( /obj/structure/medical_stand, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/white/brown_perforated, @@ -77156,7 +77153,7 @@ /area/eris/medical/medbay/organs) "dEu" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/structure/disposalpipe/trunk{ @@ -77551,7 +77548,7 @@ /area/eris/maintenance/section3deck3starboard) "dFs" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/steel, @@ -77797,7 +77794,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/steel, @@ -78466,7 +78463,7 @@ pixel_y = 32 }, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/steel/orangecorner, @@ -78664,7 +78661,7 @@ /area/eris/hallway/side/atmosphericshallway) "dIf" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -79602,7 +79599,7 @@ /area/eris/engineering/propulsion/left) "dKd" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/structure/cable/green{ @@ -81459,7 +81456,7 @@ "dPI" = ( /obj/structure/table/standard, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -24 }, /turf/simulated/floor/tiled/steel/gray_perforated, @@ -84432,7 +84429,7 @@ /area/eris/rnd/research) "dXo" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/white, @@ -84488,7 +84485,7 @@ "dXv" = ( /obj/structure/disposalpipe/junction, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/light{ @@ -86376,7 +86373,7 @@ "ecA" = ( /obj/structure/disposalpipe/segment, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -97490,7 +97487,7 @@ /area/eris/medical/paramedic) "eCG" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/white/gray_perforated, @@ -97579,7 +97576,7 @@ /area/eris/engineering/gravity_generator) "eCV" = ( /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /turf/simulated/floor/tiled/steel/gray_perforated, @@ -99831,7 +99828,7 @@ }, /obj/machinery/light, /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/carpet/bcarpet, @@ -101733,7 +101730,8 @@ /obj/spawner/rations, /obj/spawner/rations, /obj/machinery/firealarm{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) @@ -103846,7 +103844,7 @@ /area/holodeck/alphadeck) "oXE" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /turf/simulated/floor/tiled/dark/golden, @@ -105255,6 +105253,13 @@ /obj/spawner/lathe_disk/low_chance, /turf/simulated/floor/tiled/techmaint_perforated, /area/eris/maintenance/section4deck3port) +"snI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/turf/simulated/floor/bluegrid, +/area/turret_protected/ai) "snT" = ( /obj/landmark/join/start/janitor, /turf/simulated/floor/tiled/dark/golden, @@ -106416,7 +106421,7 @@ /area/eris/security/armory) "uIm" = ( /obj/machinery/firealarm{ - dir = 4; + dir = 8; pixel_x = 28 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -106471,7 +106476,7 @@ pixel_y = 32 }, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -107407,7 +107412,7 @@ /obj/spawner/medical/low_chance, /obj/structure/table/rack/shelf, /obj/machinery/firealarm{ - dir = 8; + dir = 4; pixel_x = -28 }, /obj/item/storage/box/njoy/blue, @@ -213735,7 +213740,7 @@ bZT bZU caW cbC -bZq +snI caW bZU cbC From 11112a0137f288e925298e0d2b400b5ed4637fbf Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 2 Aug 2024 12:43:21 +0300 Subject: [PATCH 128/171] Special flag. --- code/__DEFINES/__atomFlags.dm | 10 ++++++---- code/__DEFINES/dcs/_attachmentFlags.dm | 2 ++ code/game/atoms.dm | 16 +++++++++++++--- code/modules/projectiles/hitbox_datums.dm | 13 +++++++++++-- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index d921797da5..f2f1af0e46 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -1,8 +1,10 @@ /// This ATOM gets its proper icon after update icon / new has been called . This makes path2icon instantiate it and grab it from there -#define AF_ICONGRABNEEDSINSTANTATION 1<<1 +#define AF_ICONGRABNEEDSINSTANTATION (1<<1) /// This atom's layer shouldn't adjust itself -#define AF_LAYER_UPDATE_HANDLED 1<<2 +#define AF_LAYER_UPDATE_HANDLED (1<<2) /// This atom's plane shouldn't adjust itself -#define AF_PLANE_UPDATE_HANDLED 1<<3 +#define AF_PLANE_UPDATE_HANDLED (1<<3) /// This atom should be able to always move however it wants with no restrictions(used for bullets after they hit.) It also isn't counted for any interactions regarding crossing , etc. -#define AF_VISUAL_MOVE 1<<4 +#define AF_VISUAL_MOVE (1<<4) +/// Our hitbox is offset by an attachment. +#define AF_HITBOX_OFFSET_BY_ATTACHMENT (1<<5) diff --git a/code/__DEFINES/dcs/_attachmentFlags.dm b/code/__DEFINES/dcs/_attachmentFlags.dm index c45efc86f4..e7d85e1b2f 100644 --- a/code/__DEFINES/dcs/_attachmentFlags.dm +++ b/code/__DEFINES/dcs/_attachmentFlags.dm @@ -32,3 +32,5 @@ #define ATFA_DIRECTIONAL_HITTABLE_STRICT (1<<6) /// The bullet can come from any axis that shares a direction bit-flag with ourselves #define ATFA_DIRECTIONAL_HITTABLE (1<<7) +/// Will force any hit-checking to be relatively offset by our position compared to the supporting atom. +#define ATFA_CENTER_ON_SUPPORTER (1<<8) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e6536e7ea3..690ca7bd8c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -60,11 +60,12 @@ /atom/proc/detachGameAtom(atom/thing) if(!(thing in attached)) return -1 + afterDetach(thing, TRUE, attached[thing], thing.attached[src]) + thing.afterDetach(src, FALSE ,attached[thing], thing.attached[src]) ASSLREMOVE(attached ,thing) ASSLREMOVE(thing.attached, src) - afterDetach(thing, TRUE) - thing.afterDetach(src, FALSE) return TRUE + /* /atom/proc/attach(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) if(!istype(thing)) @@ -95,9 +96,18 @@ */ /atom/proc/afterAttach(atom/thing, isSupporter, attachmentFlagsSupport, attachmentFlagsAttachable) + if(isSupporter) + else + if(attachmentFlagsAttachable & ATFA_CENTER_ON_SUPPORTER) + atomFlags |= AF_HITBOX_OFFSET_BY_ATTACHMENT return -/atom/proc/afterDetach(atom/thing, isSupporter) +/atom/proc/afterDetach(atom/thing, isSupporter, attachmentFlagsSupport, attachmentFlagsAttachable) + if(isSupporter) + else + if(attachmentFlagsAttachable & ATFA_CENTER_ON_SUPPORTER) + atomFlags &= ~AF_HITBOX_OFFSET_BY_ATTACHMENT + return return /atom/getAimingLevel(atom/shooter, defZone) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index e2b6db3e8a..85ddb785f1 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -129,8 +129,17 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) var/global/worldX var/global/worldY - worldX = owner.x * 32 - worldY = owner.y * 32 + worldX = owner.x + worldY = owner.y + if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) + for(var/atom/thing as anything in owner.attached) + if(!(owner.attached[thing] & ATFS_SUPPORTER)) + continue + worldX += thing.x - owner.x + worldY += thing.y - owner.y + break + worldX *= 32 + worldY *= 32 for(var/list/boundingData in boundingBoxes["[owner.dir]"]) /// basic AABB but only for the Z-axis. if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) From b81a2c34205381ff6041970dd40bfa5ba5bfe72f Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 3 Aug 2024 05:18:52 +0300 Subject: [PATCH 129/171] copin and trying --- code/ATMOSPHERICS/atmospherics.dm | 5 +++++ code/game/atoms.dm | 2 -- code/game/machinery/alarm.dm | 2 +- code/modules/power/cable.dm | 4 ++++ code/modules/projectiles/hitbox_datums.dm | 2 +- code/modules/recycling/disposal.dm | 3 +++ 6 files changed, 14 insertions(+), 4 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 99ff2a29df..de28f060a0 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -33,6 +33,11 @@ Pipelines + Other Objects -> Pipe network var/obj/machinery/atmospherics/node1 var/obj/machinery/atmospherics/node2 +/// Pending a full implementation of hitbox for every atom +/obj/structure/atmospherics/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + . = ..() + return PROJECTILE_CONTINUE + /obj/machinery/atmospherics/Initialize(mapload, d) if(!icon_manager) icon_manager = new() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 690ca7bd8c..ad70b69487 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -48,8 +48,6 @@ /// Attaches the argument(thing) to src /atom/proc/attachGameAtom(atom/thing, attachmentFlagsSupport, attachmentFlagsAttachable) - if(!(ismovable(thing) || isturf(thing))) - return FALSE ASSLADD(attached, attachmentFlagsSupport | ATFS_SUPPORTER, thing) ASSLADD(thing.attached, attachmentFlagsAttachable | ATFA_ATTACHED , src) afterAttach(thing, TRUE, attachmentFlagsSupport, attachmentFlagsAttachable) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 70fc8b2d40..edb1f38b03 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1221,7 +1221,7 @@ FIRE ALARM var/turf/toAttach = get_step(loc, reverse_dir[dir]) if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE | ATFA_CENTER_ON_SUPPORTER) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 805ac0c13f..2f39b37864 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -48,6 +48,10 @@ var/list/possible_cable_coil_colours = list( color = COLOR_RED_LIGHT var/obj/machinery/power/breakerbox/breaker_box +/obj/structure/cable/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + . = ..() + return invisibility == 101 ? PROJECTILE_CONTINUE : PROJECTILE_STOP + /obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0) if(drain_check) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 85ddb785f1..7afe62293f 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -133,7 +133,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) for(var/atom/thing as anything in owner.attached) - if(!(owner.attached[thing] & ATFS_SUPPORTER)) + if(!(thing.attached[owner] & ATFS_SUPPORTER)) continue worldX += thing.x - owner.x worldY += thing.y - owner.y diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index e7c6d7bf77..266bd156fc 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -671,6 +671,9 @@ base_icon_state = icon_state return +/obj/structure/disposalpipe/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + . = ..() + return PROJECTILE_CONTINUE // pipe is deleted // ensure if holder is present, it is expelled From 2b3f1650c839250c8ec77491113932ff3b1b8fdb Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 3 Aug 2024 11:14:32 +0300 Subject: [PATCH 130/171] agony and bugs --- code/__DEFINES/__atomFlags.dm | 1 + code/controllers/subsystems/bullets.dm | 5 +++++ code/game/atoms.dm | 5 ++--- code/modules/power/cable.dm | 3 +-- code/modules/projectiles/projectile.dm | 8 +++++--- code/modules/recycling/disposal.dm | 1 - maps/testmap/test_map.dmm | 8 ++++++-- 7 files changed, 20 insertions(+), 11 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index f2f1af0e46..3c442dfc08 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -8,3 +8,4 @@ #define AF_VISUAL_MOVE (1<<4) /// Our hitbox is offset by an attachment. #define AF_HITBOX_OFFSET_BY_ATTACHMENT (1<<5) +#define AF_IGNORE_ON_BULLETSCAN (1<<6) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index a471bb7f7f..d9870d3b52 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -136,6 +136,11 @@ SUBSYSTEM_DEF(bullets) else message_admins(("Created bullet without target , [referencedBullet], from [usr]")) + if(abs(target.pixel_x) > PPT/2) + targetPos[1] += round((target.pixel_x - PPT/2 )/ PPT) + 1 * sign(target.pixel_x) + if(abs(target.pixel_y) > PPT/2) + targetPos[2] += round((target.pixel_y - PPT/2) / PPT) + 1 * sign(target.pixel_y) + //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel targetLevel += (targetCoords[3] - firedPos[3])* LEVEL_MAX diff --git a/code/game/atoms.dm b/code/game/atoms.dm index ad70b69487..2fa3e91037 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -97,15 +97,14 @@ if(isSupporter) else if(attachmentFlagsAttachable & ATFA_CENTER_ON_SUPPORTER) - atomFlags |= AF_HITBOX_OFFSET_BY_ATTACHMENT + atomFlags |= AF_HITBOX_OFFSET_BY_ATTACHMENT | AF_IGNORE_ON_BULLETSCAN return /atom/proc/afterDetach(atom/thing, isSupporter, attachmentFlagsSupport, attachmentFlagsAttachable) if(isSupporter) else if(attachmentFlagsAttachable & ATFA_CENTER_ON_SUPPORTER) - atomFlags &= ~AF_HITBOX_OFFSET_BY_ATTACHMENT - return + atomFlags &= ~(AF_HITBOX_OFFSET_BY_ATTACHMENT | AF_IGNORE_ON_BULLETSCAN) return /atom/getAimingLevel(atom/shooter, defZone) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 2f39b37864..293230f8ed 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -49,8 +49,7 @@ var/list/possible_cable_coil_colours = list( var/obj/machinery/power/breakerbox/breaker_box /obj/structure/cable/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) - . = ..() - return invisibility == 101 ? PROJECTILE_CONTINUE : PROJECTILE_STOP + return PROJECTILE_CONTINUE /obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index aa5341e024..d86666aefb 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -500,7 +500,9 @@ GLOBAL_LIST(projectileDamageConstants) hittingList[4] = list() var/list/sortingList = scanning.contents.Copy() sortingList.Add(scanning) - for(var/atom/thing as anything in scanning.contents) + for(var/atom/thing as anything in sortingList) + if(thing.atomFlags & AF_IGNORE_ON_BULLETSCAN) + continue for(var/index=1 to length(HittingPrioritiesList)) if(!istype(thing, HittingPrioritiesList[index])) continue @@ -510,9 +512,9 @@ GLOBAL_LIST(projectileDamageConstants) for(var/atom/possibleTarget as anything in thing.attached) if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(dir & reverse_dir[possibleTarget.dir])) + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(dir & reverse_dir[(get_dir(src, thing))])) continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(dir == reverse_dir[possibleTarget.dir])) + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(dir == reverse_dir[(get_dir(src, thing))])) continue if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) hittingList[index][length(hittingList[index])] = possibleTarget diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 266bd156fc..fd34211508 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -672,7 +672,6 @@ return /obj/structure/disposalpipe/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) - . = ..() return PROJECTILE_CONTINUE // pipe is deleted diff --git a/maps/testmap/test_map.dmm b/maps/testmap/test_map.dmm index 396a868920..291a7f3e2e 100644 --- a/maps/testmap/test_map.dmm +++ b/maps/testmap/test_map.dmm @@ -639,6 +639,10 @@ /obj/effect/window_lwall_spawn/reinforced, /turf/simulated/floor/plating, /area/space) +"Fe" = ( +/obj/machinery/firealarm, +/turf/simulated/wall, +/area/space) "Gc" = ( /obj/item/reagent_containers/glass/beaker/tungsten, /obj/item/tool/screwdriver, @@ -2464,7 +2468,7 @@ aa aa aa aa -ab +Fe an an an @@ -2872,7 +2876,7 @@ aa aa aa aa -ab +Fe an an an From c7accadf4c2b7a87581fd9271b1db5d1900c0c3e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 4 Aug 2024 14:04:16 +0300 Subject: [PATCH 131/171] the grind continues --- code/ATMOSPHERICS/atmospherics.dm | 2 +- code/_compile_options.dm | 2 +- code/controllers/subsystems/bullets.dm | 32 +++++++--- code/game/objects/structures.dm | 7 +++ code/game/turfs/simulated/walls.dm | 1 + code/modules/lighting/lighting_overlay.dm | 2 + code/modules/mob/inventory/slots.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 74 +++++++++++++++++------ code/modules/projectiles/projectile.dm | 9 +-- 9 files changed, 97 insertions(+), 34 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index de28f060a0..e46d229349 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -34,7 +34,7 @@ Pipelines + Other Objects -> Pipe network var/obj/machinery/atmospherics/node2 /// Pending a full implementation of hitbox for every atom -/obj/structure/atmospherics/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) +/obj/machinery/atmospherics/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) . = ..() return PROJECTILE_CONTINUE diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 6a88d4af66..eb60858483 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,7 +46,7 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -//#define LOWMEMORYMODE 1 +#define LOWMEMORYMODE 1 #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index d9870d3b52..aa0326d05b 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -32,7 +32,8 @@ SUBSYSTEM_DEF(bullets) // 1 client tick by default , can be increased by impacts var/bulletWait = 1 //// x1,y1,x2,y2,z1,z2 - var/list/trajectoryData = list(0,0,0,0,0,0) + var/list/trajectoryData = list(0,0,0,0,0,0,0) + var/distanceToTravelForce @@ -252,7 +253,9 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() - var/turf/leaving + var/global/turf/leaving + var/global/pixelXdist + var/global/pixelYdist for(var/datum/bullet_data/bullet in current_queue) current_queue -= bullet bullet.lastChanges[1] = 0 @@ -262,13 +265,14 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet continue bulletRatios = bullet.movementRatios - bulletCoords = bullet.currentCoords projectile = bullet.referencedBullet pixelsToTravel = bullet.pixelsPerTick + bulletCoords = bullet.currentCoords /// We have to break up the movement into steps if its too big(since it leads to erronous steps) , this is preety much continous collision /// but less performant A more performant version would be to use the same algorithm as throwing for determining which turfs to "intersect" /// Im using this implementation because im getting skill issued trying to implement the same one as throwing(i had to rewrite this 4 times already) /// and also because it has.. much more information about the general trajectory stored SPCR - 2024 + bulletCoords = bullet.currentCoords trajectoryData[1] = projectile.x * 32 + projectile.pixel_x + 16 trajectoryData[2] = projectile.y * 32 + projectile.pixel_y + 16 trajectoryData[3] = bulletRatios[1] * pixelsToTravel + trajectoryData[1] @@ -277,12 +281,16 @@ SUBSYSTEM_DEF(bullets) /// Yes this is inaccurate for multi-Z transitions somewhat , if someone wants to create a proper equation for pseudo 3D they're welcome to. trajectoryData[6] = trajectoryData[5] + LERP(bullet.firedLevel, bullet.targetLevel,(bullet.traveled + pixelsToTravel)/bullet.distStartToFinish2D()) - (projectile.z - bullet.firedPos[3] * LEVEL_MAX) bullet.trajSum += bulletRatios[3] * pixelsToTravel + forceLoop: while(pixelsToTravel > 0) pixelsThisStep = pixelsToTravel > MAXPIXELS ? MAXPIXELS : pixelsToTravel pixelsToTravel -= pixelsThisStep bullet.traveled += pixelsThisStep - bulletCoords[1] += (bulletRatios[1] * pixelsThisStep) - bulletCoords[2] += (bulletRatios[2] * pixelsThisStep) + pixelXdist = (bulletRatios[1] * pixelsThisStep) + pixelYdist = (bulletRatios[2] * pixelsThisStep) + trajectoryData[7] = (EAST*(pixelXdist>0)) | (WEST*(pixelXdist<0)) | (NORTH*(pixelYdist>0)) | (SOUTH*(pixelYdist<0)) + bulletCoords[1] += pixelXdist + bulletCoords[2] += pixelYdist bulletCoords[3] = LERP(bullet.firedLevel, bullet.targetLevel, bullet.traveled/bullet.distStartToFinish2D()) - (projectile.z - bullet.firedPos[3]) * LEVEL_MAX //message_admins(bulletCoords[3]) //message_admins("added [(bulletRatios[3] * pixelsThisStep)] , pixels [pixelsThisStep] , curSum [bulletCoords[3]]") @@ -291,8 +299,10 @@ SUBSYSTEM_DEF(bullets) z_change = -(bulletCoords[3] < 0) + (bulletCoords[3] > LEVEL_MAX) while(x_change || y_change || z_change) leaving = get_turf(projectile) - if(projectile.scanTurf(leaving, trajectoryData) != PROJECTILE_CONTINUE) - break + if(projectile.scanTurf(leaving, trajectoryData, &distanceToTravelForce) != PROJECTILE_CONTINUE) + pixelsToTravel = DIST_EUCLIDIAN_2D(trajectoryData[1], trajectoryData[2],trajectoryData[3],trajectoryData[4]) - (bullet.pixelsPerTick - pixelsToTravel) - round(distanceToTravelForce) + message_admins("dist set to [pixelsToTravel]") + goto forceLoop if(QDELETED(projectile)) bullet_queue -= bullet break @@ -314,7 +324,7 @@ SUBSYSTEM_DEF(bullets) projectile.pixel_x -= PPT * tx_change projectile.pixel_y -= PPT * ty_change bullet.updateLevel() - if(projectile.scanTurf(moveTurf, trajectoryData) == PROJECTILE_CONTINUE) + if(projectile.scanTurf(moveTurf, trajectoryData, &distanceToTravelForce) == PROJECTILE_CONTINUE) //message_admins("[bulletCoords[3]], [trajectoryData[6]]" ) bullet.painted.Add(moveTurf) //moveTurf.color = COLOR_RED @@ -325,6 +335,10 @@ SUBSYSTEM_DEF(bullets) else message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]] , sum [bullet.trajSum]") */ + else + pixelsToTravel = DIST_EUCLIDIAN_2D(trajectoryData[1], trajectoryData[2],trajectoryData[3],trajectoryData[4]) - (bullet.pixelsPerTick - pixelsToTravel) - round(distanceToTravelForce) + message_admins("dist set to [pixelsToTravel]") + goto forceLoop moveTurf = null /* else @@ -342,7 +356,7 @@ SUBSYSTEM_DEF(bullets) var/animationColor = gradient(list("#ffffff", "#cbcbcb"), levelRatio) animate(projectile, SSbullets.wait, pixel_x =((abs(bulletCoords[1]))%HPPT * sign(bulletCoords[1]) - 1), pixel_y = ((abs(bulletCoords[2]))%HPPT * sign(bulletCoords[2]) - 1), flags = ANIMATION_END_NOW, color = animationColor) bullet.currentCoords = bulletCoords - if(bullet.lifetime < 0) + if(bullet.lifetime < 1) bullet.referencedBullet.finishDeletion() bullet_queue -= bullet //for(var/turf/painted in bullet.painted) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 6ff6124e4f..7570b586b3 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -99,6 +99,13 @@ var/absorbed = take_damage(target_power) return absorbed +/obj/structure/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + . = ..() + take_damage(P.get_structure_damage()) + if(QDELETED(src)) + return PROJECTILE_CONTINUE + + /obj/structure/New() ..() if(climbable) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index bbe4451598..d68ea4008a 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -11,6 +11,7 @@ blocks_air = 1 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 + hitbox = /datum/hitboxDatum/atom/wall var/ricochet_id = 0 var/health = 0 diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index db99ad724a..3cb0556a0e 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -15,6 +15,8 @@ weight = 0 + atomFlags = AF_IGNORE_ON_BULLETSCAN + var/needs_update = FALSE /// More efficient to have the proc return bullet_continue ,avoiding another check for every object on a turf SPCR 2024 diff --git a/code/modules/mob/inventory/slots.dm b/code/modules/mob/inventory/slots.dm index c6926434e6..3c3bc63cf8 100644 --- a/code/modules/mob/inventory/slots.dm +++ b/code/modules/mob/inventory/slots.dm @@ -248,7 +248,7 @@ /datum/inventory_slot/in_backpack/can_equip(obj/item/I, mob/living/carbon/human/owner, disable_warning) var/obj/item/storage/back = owner.get_equipped_item(slot_back) - return istype(back) && back.can_be_inserted(src,1) + return istype(back) && back.can_be_inserted(I,1) /datum/inventory_slot/accessory diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 7afe62293f..04e98a2755 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -58,16 +58,21 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return false; } */ -// Based off the script above. +// Based off the script above. Optimized based off github comments relating to code above. /datum/hitboxDatum/proc/lineIntersect(list/firstLine , list/secondLine) var/global/firstRatio var/global/secondRatio - firstRatio = ((secondLine[3] - secondLine[1]) * (firstLine[2] - secondLine[2]) - (secondLine[4] - secondLine[2]) * (firstLine[1] - secondLine[1])) - firstRatio /= ((secondLine[4] - secondLine[2]) * (firstLine[3] - firstLine[1]) - (secondLine[3] - secondLine[1]) * (firstLine[4] - firstLine[2])) - secondRatio = ((firstLine[3] - firstLine[1]) * (firstLine[2] - secondLine[2]) - (firstLine[4] - firstLine[2]) * (firstLine[1] - secondLine[1])) - secondRatio /= ((secondLine[4] - secondLine[2]) * (firstLine[3] - firstLine[1]) - (secondLine[3] - secondLine[1]) * (firstLine[4] - firstLine[2])) + var/denominator = ((secondLine[4] - secondLine[2]) * (firstLine[3] - firstLine[1]) - (secondLine[3] - secondLine[1]) * (firstLine[4] - firstLine[2])) + if(denominator == 0) + return FALSE + firstRatio = ((secondLine[3] - secondLine[1]) * (firstLine[2] - secondLine[2]) - (secondLine[4] - secondLine[2]) * (firstLine[1] - secondLine[1])) / denominator + secondRatio = ((firstLine[3] - firstLine[1]) * (firstLine[2] - secondLine[2]) - (firstLine[4] - firstLine[2]) * (firstLine[1] - secondLine[1])) / denominator if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) + /// Distance to intersection of point + return DIST_EUCLIDIAN_2D(firstLine[1],firstLine[2],firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]),firstLine[2] + firstRatio * (firstLine[4] - firstLine[2]) ) //return list(firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]), firstLine[2] + firstRatio * (firstLine[4] - firstLine[2])) + //message_admins("X-collision : [firstLine[1] + firstRatio * (firstLine[3] - firstLine[1])] Y-collision : [firstLine[2] + firstRatio * (firstLine[4] - firstLine[2])]") + //message_admins("Distance between points : [DIST_EUCLIDIAN_2D(firstLine[1],firstLine[2],firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]),firstLine[2] + firstRatio * (firstLine[4] - firstLine[2]) )]") return TRUE else return FALSE @@ -129,6 +134,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) var/global/worldX var/global/worldY + var/global/functionReturn worldX = owner.x worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) @@ -144,17 +150,25 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// basic AABB but only for the Z-axis. if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE return FALSE @@ -232,6 +246,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/table/intersects(list/lineData,ownerDirection, turf/incomingFrom, obj/structure/table/owner, list/arguments) var/global/worldX var/global/worldY + var/global/functionReturn worldX = owner.x * 32 worldY = owner.y * 32 var/list/boundingList @@ -249,17 +264,25 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo continue if(boundingData[5] < max(lineData[5], lineData[6]) && boundingData[6] < min(lineData[6],lineData[5])) continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE return FALSE @@ -295,7 +318,13 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)) ) - +/datum/hitboxDatum/atom/wall + boundingBoxes = list( + LISTNORTH = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)), + LISTSOUTH = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)), + LISTEAST = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)), + LISTWEST = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)) + ) /datum/hitboxDatum/mob @@ -331,6 +360,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo . = ..() var/global/worldX var/global/worldY + var/global/functionReturn worldX = owner.x * 32 worldY = owner.y * 32 var/mob/living/perceivedOwner = owner @@ -338,17 +368,25 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// basic AABB but only for the Z-axis. if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) continue - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE - if(lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY))) + functionReturn = lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(functionReturn) arguments[3] = boundingData[7] + arguments[4] = functionReturn return TRUE return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d86666aefb..d54c261dee 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -490,7 +490,7 @@ GLOBAL_LIST(projectileDamageConstants) /// The lower the index , the higher the priority. If you add new paths to the list , make sure to increase the amount of lists in scanTurf below. #define HittingPrioritiesList list(/mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) -/obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData) +/obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData, dpDistanceToTravel) if(atomFlags & AF_VISUAL_MOVE) return PROJECTILE_CONTINUE var/list/hittingList = new/list(length(HittingPrioritiesList)) @@ -512,9 +512,9 @@ GLOBAL_LIST(projectileDamageConstants) for(var/atom/possibleTarget as anything in thing.attached) if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(dir & reverse_dir[(get_dir(src, thing))])) + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(possibleTarget.dir & reverse_dir[trajectoryData[7]])) continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(dir == reverse_dir[(get_dir(src, thing))])) + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(possibleTarget.dir == reverse_dir[trajectoryData[7]])) continue if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) hittingList[index][length(hittingList[index])] = possibleTarget @@ -527,9 +527,10 @@ GLOBAL_LIST(projectileDamageConstants) if(target == firer) continue /// third slot rezerved for flags passed back by hitbox intersect - var/list/arguments = list(src, def_zone, null) + var/list/arguments = list(src, def_zone, null, null) if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) return PROJECTILE_CONTINUE + *dpDistanceToTravel = arguments[4] if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP From ff0b3204ed2977e7fc3caed12a94daa0fcf62465 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 6 Aug 2024 15:36:49 +0300 Subject: [PATCH 132/171] fuck i have to rewrite all of this crap --- code/controllers/subsystems/bullets.dm | 6 ++++-- code/game/turfs/simulated/walls.dm | 1 + code/modules/projectiles/projectile.dm | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index aa0326d05b..b688a1bb95 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -74,6 +74,7 @@ SUBSYSTEM_DEF(bullets) var/list/painted = list() var/traveled var/trajSum + var/list/cannotHit = list() /datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick,zOffset, angleOffset, lifetime) /* @@ -300,7 +301,8 @@ SUBSYSTEM_DEF(bullets) while(x_change || y_change || z_change) leaving = get_turf(projectile) if(projectile.scanTurf(leaving, trajectoryData, &distanceToTravelForce) != PROJECTILE_CONTINUE) - pixelsToTravel = DIST_EUCLIDIAN_2D(trajectoryData[1], trajectoryData[2],trajectoryData[3],trajectoryData[4]) - (bullet.pixelsPerTick - pixelsToTravel) - round(distanceToTravelForce) + pixelsToTravel = distanceToTravelForce + //pixelsToTravel = min(bullet.pixelsPerTick - pixelsToTravel, distanceToTravelForce) message_admins("dist set to [pixelsToTravel]") goto forceLoop if(QDELETED(projectile)) @@ -336,7 +338,7 @@ SUBSYSTEM_DEF(bullets) message_admins("reached target with level of [bulletCoords[3]] , pixels : [bullet.traveled], diff : [bullet.distStartToFinish2D() - bullet.traveled] , traj [trajectoryData[6]] , sum [bullet.trajSum]") */ else - pixelsToTravel = DIST_EUCLIDIAN_2D(trajectoryData[1], trajectoryData[2],trajectoryData[3],trajectoryData[4]) - (bullet.pixelsPerTick - pixelsToTravel) - round(distanceToTravelForce) + pixelsToTravel = distanceToTravelForce message_admins("dist set to [pixelsToTravel]") goto forceLoop moveTurf = null diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index d68ea4008a..b8dabc407a 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -155,6 +155,7 @@ ricochet = TRUE if(ricochet) take_damage(round(projectileDamage * 0.33)) + hittingProjectile.dataRef.cannotHit += src message_admins("Ricochet at [angle].") return PROJECTILE_CONTINUE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index d54c261dee..92bfb6b831 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -491,6 +491,7 @@ GLOBAL_LIST(projectileDamageConstants) #define HittingPrioritiesList list(/mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) /obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData, dpDistanceToTravel) + . = PROJECTILE_CONTINUE if(atomFlags & AF_VISUAL_MOVE) return PROJECTILE_CONTINUE var/list/hittingList = new/list(length(HittingPrioritiesList)) @@ -503,6 +504,8 @@ GLOBAL_LIST(projectileDamageConstants) for(var/atom/thing as anything in sortingList) if(thing.atomFlags & AF_IGNORE_ON_BULLETSCAN) continue + if(thing in dataRef.cannotHit) + continue for(var/index=1 to length(HittingPrioritiesList)) if(!istype(thing, HittingPrioritiesList[index])) continue From 9dd2162b923e3e121cafb05b860d946c80d5b104 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 6 Aug 2024 15:57:46 +0300 Subject: [PATCH 133/171] save progress --- code/controllers/subsystems/bullets.dm | 51 ++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index b688a1bb95..f1a7413973 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -42,7 +42,18 @@ SUBSYSTEM_DEF(bullets) /// And ram is not a worry , but its better to initialize less and do the lifting on fire. /datum/bullet_data var/obj/item/projectile/referencedBullet = null + // var/aimedZone = "" + var/globalX = 0 + var/globalY = 0 + var/globalZ = 0 + var/pixelSpeed = 0 + var/ratioX = 0 + var/ratioY = 0 + var/ratioZ = 0 + // + + var/atom/firer = null var/turf/firedTurf = null var/list/firedCoordinates = list(0,0,0) @@ -251,6 +262,46 @@ SUBSYSTEM_DEF(bullets) current_queue = list() bullet_queue = list() +/datum/controller/subsystem/bullets/proc/realFire() + current_queue = bullet_queue.Copy() + var/global/turf/movementTurf + var/global/currentX + var/global/currentY + var/global/currentZ + var/global/pixelTotal + var/global/pixelStep + var/global/bulletDir + var/global/stepX + var/global/stepY + var/global/stepZ + var/global/atom/projectile + for(var/datum/bullet_data/dataReference in current_queue) + current_queue.Remove(dataReference) + projectile = dataReference.referencedBullet + currentX = dataReference.globalX + currentY = dataReference.globalY + currentZ = dataReference.globalZ + bulletDir = (EAST*(ratioX>0)) | (WEST*(ratioX<0)) | (NORTH*(ratioY>0)) | (SOUTH*(ratioY<0)) + pixelTotal = dataReference.pixelSpeed + while(pixelTotal > 0) + pixelStep = min(pixelTotal, (PPT/2)) + stepX = dataReference.ratioX * pixelStep + stepY = dataReference.ratioY * pixelStep + stepZ = dataReference.ratioZ * pixelStep + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ + projectile.pixel_x -= stepX + projectile.pixel_y -= stepY + projectile.pixel_z -= stepZ + movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) + if(projectile.scanTurf(movementTurf,)) + + + + + + /datum/controller/subsystem/bullets/fire(resumed) if(!resumed) current_queue = bullet_queue.Copy() From 926833752454cb157f95fc5e7dfd4fbe1be6332b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 6 Aug 2024 16:15:54 +0300 Subject: [PATCH 134/171] more code --- code/controllers/subsystems/bullets.dm | 27 ++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index f1a7413973..ad0293643d 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -265,6 +265,7 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/proc/realFire() current_queue = bullet_queue.Copy() var/global/turf/movementTurf + var/global/turf/currentTurf var/global/currentX var/global/currentY var/global/currentZ @@ -275,27 +276,41 @@ SUBSYSTEM_DEF(bullets) var/global/stepY var/global/stepZ var/global/atom/projectile + var/global/canContinue for(var/datum/bullet_data/dataReference in current_queue) current_queue.Remove(dataReference) projectile = dataReference.referencedBullet currentX = dataReference.globalX currentY = dataReference.globalY currentZ = dataReference.globalZ - bulletDir = (EAST*(ratioX>0)) | (WEST*(ratioX<0)) | (NORTH*(ratioY>0)) | (SOUTH*(ratioY<0)) + bulletDir = (EAST*(dataReference.ratioX>0)) | (WEST*(dataReference.ratioX<0)) | (NORTH*(dataReference.ratioY>0)) | (SOUTH*(dataReference.ratioY<0)) | (UP*(dataReference.ratioZ>0)) | (DOWN*(dataReference.ratioZ<0)) pixelTotal = dataReference.pixelSpeed while(pixelTotal > 0) pixelStep = min(pixelTotal, (PPT/2)) stepX = dataReference.ratioX * pixelStep stepY = dataReference.ratioY * pixelStep stepZ = dataReference.ratioZ * pixelStep - dataReference.globalX += stepX - dataReference.globalY += stepY - dataReference.globalZ += stepZ + currentTurf = get_turf(projectile) + movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) + if(movementTurf == currentTurf) + canContinue = projectile.scanTurf(currentTurf, bulletDir, &stepX, &stepY, &step) + else + canContinue = projectile.scanTurf(currentTurf, bulletDir, &stepX, &stepY, &step) + if(canContinue == PROJECTILE_CONTINUE) + canContinue = projectile.scanTurf(movementTurf, bulletDir, &stepX, &stepY, &stepZ) + if(canContinue == PROJECTILE_CONTINUE) + stepX -= ((bulletDir & EAST) - (bulletDir & WEST)) * PPT + stepY -= ((bulletDir & NORTH) - (bulletDir & SOUTH)) * PPT + stepZ -= ((bulletDir & UP) - (bulletDir & DOWN)) * PPT + projectile.forceMove(movementTurf) projectile.pixel_x -= stepX projectile.pixel_y -= stepY projectile.pixel_z -= stepZ - movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) - if(projectile.scanTurf(movementTurf,)) + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ + if(canContinue != PROJECTILE_CONTINUE) + break From e913ba0d16dcd4a1402d2455c36860bfbeb5dbf4 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 7 Aug 2024 12:28:08 +0300 Subject: [PATCH 135/171] aAAA --- code/controllers/subsystems/bullets.dm | 21 +++--- code/modules/projectiles/hitbox_datums.dm | 78 ++++++++++------------- code/modules/projectiles/projectile.dm | 9 ++- 3 files changed, 46 insertions(+), 62 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index ad0293643d..b6d85db13f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -275,7 +275,7 @@ SUBSYSTEM_DEF(bullets) var/global/stepX var/global/stepY var/global/stepZ - var/global/atom/projectile + var/global/obj/item/projectile/projectile var/global/canContinue for(var/datum/bullet_data/dataReference in current_queue) current_queue.Remove(dataReference) @@ -293,24 +293,21 @@ SUBSYSTEM_DEF(bullets) currentTurf = get_turf(projectile) movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) if(movementTurf == currentTurf) - canContinue = projectile.scanTurf(currentTurf, bulletDir, &stepX, &stepY, &step) + canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &step) else - canContinue = projectile.scanTurf(currentTurf, bulletDir, &stepX, &stepY, &step) + canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &step) if(canContinue == PROJECTILE_CONTINUE) - canContinue = projectile.scanTurf(movementTurf, bulletDir, &stepX, &stepY, &stepZ) - if(canContinue == PROJECTILE_CONTINUE) - stepX -= ((bulletDir & EAST) - (bulletDir & WEST)) * PPT - stepY -= ((bulletDir & NORTH) - (bulletDir & SOUTH)) * PPT - stepZ -= ((bulletDir & UP) - (bulletDir & DOWN)) * PPT - projectile.forceMove(movementTurf) - projectile.pixel_x -= stepX - projectile.pixel_y -= stepY - projectile.pixel_z -= stepZ + canContinue = projectile.scanTurf(movementTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) + projectile.pixel_x -= ((bulletDir & EAST) - (bulletDir & WEST)) * PPT + projectile.pixel_y -= ((bulletDir & NORTH) - (bulletDir & SOUTH)) * PPT + projectile.pixel_z -= ((bulletDir & UP) - (bulletDir & DOWN)) * PPT + projectile.forceMove(movementTurf) dataReference.globalX += stepX dataReference.globalY += stepY dataReference.globalZ += stepZ if(canContinue != PROJECTILE_CONTINUE) break + animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%HPPT, pixel_y = dataReference.globalY%HPPT, flags = ANIMATION_END_NOW) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 04e98a2755..eba63a778a 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -30,7 +30,7 @@ GLOBAL_LIST_EMPTY(hitboxPrototypes) ) /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/proc/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) +/datum/hitboxDatum/proc/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) /datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone, atom/owner) @@ -59,23 +59,26 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo } */ // Based off the script above. Optimized based off github comments relating to code above. -/datum/hitboxDatum/proc/lineIntersect(list/firstLine , list/secondLine) +/// x1,y1 and x2,y2 are the start and end of the first line +/// x3,y3 and x4,y4 are the start and end of the second line +/// pStepX and pStepY are pointers for setting the bullets step end +/datum/hitboxDatum/proc/lineIntersect(x1,y1,x2,y2,x3,y3,x4,y4, pStepX, pStepY) var/global/firstRatio var/global/secondRatio - var/denominator = ((secondLine[4] - secondLine[2]) * (firstLine[3] - firstLine[1]) - (secondLine[3] - secondLine[1]) * (firstLine[4] - firstLine[2])) + var/denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)) if(denominator == 0) return FALSE - firstRatio = ((secondLine[3] - secondLine[1]) * (firstLine[2] - secondLine[2]) - (secondLine[4] - secondLine[2]) * (firstLine[1] - secondLine[1])) / denominator - secondRatio = ((firstLine[3] - firstLine[1]) * (firstLine[2] - secondLine[2]) - (firstLine[4] - firstLine[2]) * (firstLine[1] - secondLine[1])) / denominator + firstRatio = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator + secondRatio = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) /// Distance to intersection of point - return DIST_EUCLIDIAN_2D(firstLine[1],firstLine[2],firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]),firstLine[2] + firstRatio * (firstLine[4] - firstLine[2]) ) - //return list(firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]), firstLine[2] + firstRatio * (firstLine[4] - firstLine[2])) - //message_admins("X-collision : [firstLine[1] + firstRatio * (firstLine[3] - firstLine[1])] Y-collision : [firstLine[2] + firstRatio * (firstLine[4] - firstLine[2])]") - //message_admins("Distance between points : [DIST_EUCLIDIAN_2D(firstLine[1],firstLine[2],firstLine[1] + firstRatio * (firstLine[3] - firstLine[1]),firstLine[2] + firstRatio * (firstLine[4] - firstLine[2]) )]") + *pStepX = firstRatio * (x2 - x1) + *pStepY = firstRatio * (y2 - y1) return TRUE - else - return FALSE + //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) + //message_admins("X-collision : [x1 + firstRatio * (x2 - x1)] Y-collision : [y1 + firstRatio * (y2] - y1)]") + //message_admins("Distance between points : [DIST_EUCLIDIAN_2D(x1,y1,x1 + firstRatio * (x2 - x1),y1 + firstRatio * (y2] - y1) )]") + return FALSE /datum/hitboxDatum/proc/visualize(atom/owner) @@ -131,10 +134,9 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return defZoneToLevel[defZone] /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/atom/intersects(list/lineData,ownerDirection, turf/incomingFrom, atom/owner, list/arguments) +/datum/hitboxDatum/atom/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/global/worldX var/global/worldY - var/global/functionReturn worldX = owner.x worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) @@ -146,29 +148,17 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo break worldX *= 32 worldY *= 32 - for(var/list/boundingData in boundingBoxes["[owner.dir]"]) + for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) continue - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE return FALSE @@ -243,7 +233,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return medianLevels["[owner.dir]"] /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/atom/table/intersects(list/lineData,ownerDirection, turf/incomingFrom, obj/structure/table/owner, list/arguments) +/datum/hitboxDatum/atom/table/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/global/worldX var/global/worldY var/global/functionReturn @@ -260,26 +250,24 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo boundingList = boundingBoxes[text2num(owner.connections[i])+1]["[(1<<(i-1))]"] for(var/list/boundingData in boundingList) /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) && boundingData[6] > min(lineData[6],lineData[5])) - continue - if(boundingData[5] < max(lineData[5], lineData[6]) && boundingData[6] < min(lineData[6],lineData[5])) + if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)), continue - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn @@ -356,7 +344,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo message_admins("Returned [defZoneToLevel["[perceivedOwner.lying]"][defZone]] for [defZone]") return defZoneToLevel["[perceivedOwner.lying]"][defZone] -/datum/hitboxDatum/mob/intersects(list/lineData, ownerDirection, turf/incomingFrom, atom/owner, list/arguments) +/datum/hitboxDatum/mob/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) . = ..() var/global/worldX var/global/worldY @@ -366,24 +354,24 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/mob/living/perceivedOwner = owner for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(lineData[5],lineData[6]) || boundingData[6] < min(lineData[6],lineData[5])) + if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)), continue - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn return TRUE - functionReturn = lineIntersect(lineData, list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) if(functionReturn) arguments[3] = boundingData[7] arguments[4] = functionReturn diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 92bfb6b831..01ab136192 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -490,7 +490,7 @@ GLOBAL_LIST(projectileDamageConstants) /// The lower the index , the higher the priority. If you add new paths to the list , make sure to increase the amount of lists in scanTurf below. #define HittingPrioritiesList list(/mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) -/obj/item/projectile/proc/scanTurf(turf/scanning, list/trajectoryData, dpDistanceToTravel) +/obj/item/projectile/proc/scanTurf(turf/scanning, bulletDir, startX, startY, startZ, pStepX, pStepY, pStepZ) . = PROJECTILE_CONTINUE if(atomFlags & AF_VISUAL_MOVE) return PROJECTILE_CONTINUE @@ -515,9 +515,9 @@ GLOBAL_LIST(projectileDamageConstants) for(var/atom/possibleTarget as anything in thing.attached) if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(possibleTarget.dir & reverse_dir[trajectoryData[7]])) + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(possibleTarget.dir & reverse_dir[bulletDir])) continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(possibleTarget.dir == reverse_dir[trajectoryData[7]])) + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(possibleTarget.dir == reverse_dir[bulletDir])) continue if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) hittingList[index][length(hittingList[index])] = possibleTarget @@ -531,9 +531,8 @@ GLOBAL_LIST(projectileDamageConstants) continue /// third slot rezerved for flags passed back by hitbox intersect var/list/arguments = list(src, def_zone, null, null) - if(target.hitbox && !target.hitbox.intersects(trajectoryData, target.dir, 0, target, arguments)) + if(target.hitbox && !target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ)) return PROJECTILE_CONTINUE - *dpDistanceToTravel = arguments[4] if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP From 927b2e658cefcc2815ab3391b315df6356dad6e9 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 8 Aug 2024 16:50:26 +0300 Subject: [PATCH 136/171] AAAAAAAAAAG --- code/controllers/subsystems/bullets.dm | 88 ++++++++++++++++------- code/game/turfs/simulated/walls.dm | 2 + code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 58 +++++---------- code/modules/projectiles/projectile.dm | 1 + 5 files changed, 82 insertions(+), 69 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index b6d85db13f..285938e604 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -105,7 +105,7 @@ SUBSYSTEM_DEF(bullets) src.pixelsPerTick = pixelsPerTick src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime - src.firedCoordinates = list(0,0, referencedBullet.z) + src.firedCoordinates = list(16,16, referencedBullet.z) if(firer) src.firer = firer src.firedTurf = get_turf(firer) @@ -154,6 +154,11 @@ SUBSYSTEM_DEF(bullets) if(abs(target.pixel_y) > PPT/2) targetPos[2] += round((target.pixel_y - PPT/2) / PPT) + 1 * sign(target.pixel_y) + pixelSpeed = pixelsPerTick + globalX = currentTurf.x * 32 + currentCoords[1] + 16 + globalY = currentTurf.y * 32 + currentCoords[2] + 16 + globalZ = currentTurf.z * 32 + //message_admins("level set to [firedLevel], towards [targetLevel]") currentCoords[3] = firedLevel targetLevel += (targetCoords[3] - firedPos[3])* LEVEL_MAX @@ -189,6 +194,8 @@ SUBSYSTEM_DEF(bullets) var/matrix/rotation = matrix() movementRatios[1] = sin(movementRatios[4]) movementRatios[2] = cos(movementRatios[4]) + ratioX = movementRatios[1] + ratioY = movementRatios[2] rotation.Turn(movementRatios[4] + 180) @@ -264,57 +271,84 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/proc/realFire() current_queue = bullet_queue.Copy() - var/global/turf/movementTurf - var/global/turf/currentTurf - var/global/currentX - var/global/currentY - var/global/currentZ - var/global/pixelTotal - var/global/pixelStep - var/global/bulletDir - var/global/stepX - var/global/stepY - var/global/stepZ - var/global/obj/item/projectile/projectile - var/global/canContinue + var/turf/movementTurf + var/turf/currentTurf + var/currentX + var/currentY + var/currentZ + var/pixelTotal + var/pixelStep + var/bulletDir + var/stepX + var/stepY + var/stepZ + var/obj/item/projectile/projectile + var/canContinue for(var/datum/bullet_data/dataReference in current_queue) current_queue.Remove(dataReference) projectile = dataReference.referencedBullet + if(QDELETED(projectile)) + bullet_queue.Remove(dataReference) + continue currentX = dataReference.globalX currentY = dataReference.globalY currentZ = dataReference.globalZ bulletDir = (EAST*(dataReference.ratioX>0)) | (WEST*(dataReference.ratioX<0)) | (NORTH*(dataReference.ratioY>0)) | (SOUTH*(dataReference.ratioY<0)) | (UP*(dataReference.ratioZ>0)) | (DOWN*(dataReference.ratioZ<0)) pixelTotal = dataReference.pixelSpeed + dataReference.lifetime-- while(pixelTotal > 0) pixelStep = min(pixelTotal, (PPT/2)) + pixelTotal -= pixelStep stepX = dataReference.ratioX * pixelStep stepY = dataReference.ratioY * pixelStep stepZ = dataReference.ratioZ * pixelStep + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ currentTurf = get_turf(projectile) movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) + message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") if(movementTurf == currentTurf) - canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &step) + canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) else - canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &step) + canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) if(canContinue == PROJECTILE_CONTINUE) canContinue = projectile.scanTurf(movementTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) - projectile.pixel_x -= ((bulletDir & EAST) - (bulletDir & WEST)) * PPT - projectile.pixel_y -= ((bulletDir & NORTH) - (bulletDir & SOUTH)) * PPT - projectile.pixel_z -= ((bulletDir & UP) - (bulletDir & DOWN)) * PPT + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT + //message_admins("PX : [projectile.pixel_x] , PY : [projectile.pixel_y] , PZ: [projectile.pixel_z]") projectile.forceMove(movementTurf) - dataReference.globalX += stepX - dataReference.globalY += stepY - dataReference.globalZ += stepZ + currentX = dataReference.globalX + currentY = dataReference.globalY + currentZ = dataReference.globalZ + if(canContinue != PROJECTILE_CONTINUE) + var/a = round((currentX+stepX)/32) + var/b = round((currentY+stepY)/32) + var/c = round((currentZ+stepZ)/32) + var/turf/turfer = locate(a, b, c) + var/atom/movable/special = new /obj/item() + special.forceMove(turfer) + special.icon = projectile.icon + special.icon_state = projectile.icon_state + special.pixel_x = round((currentX+stepX))%32 + special.pixel_y = round((currentY+stepY))%32 + special.transform = projectile.transform + message_admins("started at X: [round(currentX)]. Y: [round(currentY)] , stopping at X: [round(currentX+stepX)] , Y:[round(currentY+stepY)]") + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ + dataReference.lifetime = 0 break - animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%HPPT, pixel_y = dataReference.globalY%HPPT, flags = ANIMATION_END_NOW) - - - - + animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%PPT - 16, pixel_y = dataReference.globalY%PPT - 16, flags = ANIMATION_END_NOW) + if(dataReference.lifetime < 1) + projectile.finishDeletion() + bullet_queue.Remove(dataReference) /datum/controller/subsystem/bullets/fire(resumed) + return realFire() if(!resumed) current_queue = bullet_queue.Copy() var/global/turf/leaving diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index b8dabc407a..e4f3d7ec2b 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -123,6 +123,7 @@ burn(500)//TODO : fucking write these two procs not only for plasma (see plasma in materials.dm:283) ~ else if(istype(hittingProjectile,/obj/item/projectile/ion)) burn(500) + /* else if(istype(hittingProjectile,/obj/item/projectile/bullet)) var/list/lastMoves = hittingProjectile.dataRef.lastChanges var/angle = hittingProjectile.dataRef.movementRatios[4] @@ -158,6 +159,7 @@ hittingProjectile.dataRef.cannotHit += src message_admins("Ricochet at [angle].") return PROJECTILE_CONTINUE + */ take_damage(projectileDamage) if(health < maxHealth * 0.4 && prob(projectileDamage)) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6391a841f9..33a415c032 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -636,7 +636,7 @@ offset = roll(2, offset) - (offset + 1) - return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]) - 16, text2num(paramList["icon-y"]) - 16, zOffset,offset) + return !P.launch_from_gun(target, user, src, target_zone, text2num(paramList["icon-x"]), text2num(paramList["icon-y"]), zOffset,offset) //Support proc for calculate_offset /obj/item/gun/proc/init_offset_with_brace(mob/living/user) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index eba63a778a..3f00c0636b 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -150,15 +150,15 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo worldY *= 32 for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) - continue - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + // continue + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE return FALSE @@ -233,7 +233,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return medianLevels["[owner.dir]"] /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/atom/table/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) +/datum/hitboxDatum/atom/table/intersects(obj/structure/table/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/global/worldX var/global/worldY var/global/functionReturn @@ -250,27 +250,15 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo boundingList = boundingBoxes[text2num(owner.connections[i])+1]["[(1<<(i-1))]"] for(var/list/boundingData in boundingList) /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)), + if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) continue - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) return TRUE - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) return TRUE - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) return TRUE - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) return TRUE return FALSE @@ -354,27 +342,15 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/mob/living/perceivedOwner = owner for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)), + if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) continue - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) return TRUE - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) return TRUE - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) return TRUE - functionReturn = lineIntersect(startX, startY, startX+*pStepX, startY+*pstepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY) - if(functionReturn) - arguments[3] = boundingData[7] - arguments[4] = functionReturn + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) return TRUE return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 01ab136192..4fe366a568 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -501,6 +501,7 @@ GLOBAL_LIST(projectileDamageConstants) hittingList[4] = list() var/list/sortingList = scanning.contents.Copy() sortingList.Add(scanning) + sortingList.Remove(src) for(var/atom/thing as anything in sortingList) if(thing.atomFlags & AF_IGNORE_ON_BULLETSCAN) continue From 6483577f0948a30f7a91764b55dfe726f0160bd0 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 9 Aug 2024 07:01:16 +0300 Subject: [PATCH 137/171] agny --- code/controllers/subsystems/bullets.dm | 16 ++++++++++------ code/modules/projectiles/hitbox_datums.dm | 6 ++++-- code/modules/projectiles/projectile.dm | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 285938e604..cb4a0d5c92 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -9,7 +9,7 @@ #define MAXPIXELS 16 SUBSYSTEM_DEF(bullets) name = "Bullets" - wait = 1 + wait = 5 priority = SS_PRIORITY_BULLETS init_order = INIT_ORDER_BULLETS @@ -323,6 +323,8 @@ SUBSYSTEM_DEF(bullets) currentY = dataReference.globalY currentZ = dataReference.globalZ + + if(canContinue != PROJECTILE_CONTINUE) var/a = round((currentX+stepX)/32) var/b = round((currentY+stepY)/32) @@ -332,17 +334,19 @@ SUBSYSTEM_DEF(bullets) special.forceMove(turfer) special.icon = projectile.icon special.icon_state = projectile.icon_state - special.pixel_x = round((currentX+stepX))%32 - special.pixel_y = round((currentY+stepY))%32 + special.pixel_x = round((currentX+stepX))%32 - 16 + special.pixel_y = round((currentY+stepY))%32 - 16 special.transform = projectile.transform message_admins("started at X: [round(currentX)]. Y: [round(currentY)] , stopping at X: [round(currentX+stepX)] , Y:[round(currentY+stepY)]") - dataReference.globalX += stepX - dataReference.globalY += stepY + dataReference.globalX = currentX + stepX + dataReference.globalY = currentY + stepY dataReference.globalZ += stepZ dataReference.lifetime = 0 break - animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%PPT - 16, pixel_y = dataReference.globalY%PPT - 16, flags = ANIMATION_END_NOW) + if(canContinue != PROJECTILE_CONTINUE) + message_admins("globalX : [dataReference.globalX] globalY: [dataReference.globalY]") + animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%PPT - HPPT, pixel_y = dataReference.globalY%PPT - HPPT, flags = ANIMATION_END_NOW) if(dataReference.lifetime < 1) projectile.finishDeletion() bullet_queue.Remove(dataReference) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 3f00c0636b..2a715b7523 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -72,8 +72,10 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo secondRatio = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) /// Distance to intersection of point - *pStepX = firstRatio * (x2 - x1) - *pStepY = firstRatio * (y2 - y1) + message_admins("pstepX = [*pStepX] , pstepY = [*pStepY]") + *pStepX = firstRatio * (x2 - x1) - *pStepX + *pStepY = firstRatio * (y2 - y1) - *pStepY + message_admins("Collision put at X:[x1 + *pStepX] Y:[y1+ *pStepY]") return TRUE //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) //message_admins("X-collision : [x1 + firstRatio * (x2 - x1)] Y-collision : [y1 + firstRatio * (y2] - y1)]") diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 4fe366a568..87fd1ffade 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -645,7 +645,7 @@ GLOBAL_LIST(projectileDamageConstants) visEffect.transform = src.transform visEffect.update_plane() - QDEL_IN(src, 2) + QDEL_IN(src, SSbullets.wait * 5) /obj/item/projectile/explosion_act(target_power, explosion_handler/handler) return 0 From 3564455209239eb7b7abef70916a5b01af60cbc3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 9 Aug 2024 09:03:45 +0300 Subject: [PATCH 138/171] Update bullets.dm --- code/controllers/subsystems/bullets.dm | 29 ++++++++++++-------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index cb4a0d5c92..3c6700775f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -302,11 +302,8 @@ SUBSYSTEM_DEF(bullets) stepX = dataReference.ratioX * pixelStep stepY = dataReference.ratioY * pixelStep stepZ = dataReference.ratioZ * pixelStep - dataReference.globalX += stepX - dataReference.globalY += stepY - dataReference.globalZ += stepZ currentTurf = get_turf(projectile) - movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) + movementTurf = locate(round((currentX+stepX)/PPT),round((currentY+stepY)/PPT),round((currentZ+stepZ)/PPT)) message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") if(movementTurf == currentTurf) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) @@ -314,22 +311,22 @@ SUBSYSTEM_DEF(bullets) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) if(canContinue == PROJECTILE_CONTINUE) canContinue = projectile.scanTurf(movementTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) - projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT - projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT - projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT //message_admins("PX : [projectile.pixel_x] , PY : [projectile.pixel_y] , PZ: [projectile.pixel_z]") - projectile.forceMove(movementTurf) - currentX = dataReference.globalX - currentY = dataReference.globalY - currentZ = dataReference.globalZ - - + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ + if(movementTurf == locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT))) + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT + projectile.forceMove(movementTurf) if(canContinue != PROJECTILE_CONTINUE) var/a = round((currentX+stepX)/32) var/b = round((currentY+stepY)/32) var/c = round((currentZ+stepZ)/32) var/turf/turfer = locate(a, b, c) + message_admins("turfer X: [turfer.x] Y:[turfer.y] Z:[turfer.z]") var/atom/movable/special = new /obj/item() special.forceMove(turfer) special.icon = projectile.icon @@ -338,9 +335,9 @@ SUBSYSTEM_DEF(bullets) special.pixel_y = round((currentY+stepY))%32 - 16 special.transform = projectile.transform message_admins("started at X: [round(currentX)]. Y: [round(currentY)] , stopping at X: [round(currentX+stepX)] , Y:[round(currentY+stepY)]") - dataReference.globalX = currentX + stepX - dataReference.globalY = currentY + stepY - dataReference.globalZ += stepZ + //dataReference.globalX = currentX + stepX + //dataReference.globalY = currentY + stepY + //dataReference.globalZ += stepZ dataReference.lifetime = 0 break From 83bfc70e14cf2d3696e4b3f7a31d7b036eaa3094 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 9 Aug 2024 09:10:55 +0300 Subject: [PATCH 139/171] Revert "Update bullets.dm" This reverts commit 3564455209239eb7b7abef70916a5b01af60cbc3. --- code/controllers/subsystems/bullets.dm | 29 ++++++++++++++------------ 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 3c6700775f..cb4a0d5c92 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -302,8 +302,11 @@ SUBSYSTEM_DEF(bullets) stepX = dataReference.ratioX * pixelStep stepY = dataReference.ratioY * pixelStep stepZ = dataReference.ratioZ * pixelStep + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ currentTurf = get_turf(projectile) - movementTurf = locate(round((currentX+stepX)/PPT),round((currentY+stepY)/PPT),round((currentZ+stepZ)/PPT)) + movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") if(movementTurf == currentTurf) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) @@ -311,22 +314,22 @@ SUBSYSTEM_DEF(bullets) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) if(canContinue == PROJECTILE_CONTINUE) canContinue = projectile.scanTurf(movementTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT //message_admins("PX : [projectile.pixel_x] , PY : [projectile.pixel_y] , PZ: [projectile.pixel_z]") - dataReference.globalX += stepX - dataReference.globalY += stepY - dataReference.globalZ += stepZ - if(movementTurf == locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT))) - projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT - projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT - projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT - projectile.forceMove(movementTurf) + projectile.forceMove(movementTurf) + currentX = dataReference.globalX + currentY = dataReference.globalY + currentZ = dataReference.globalZ + + if(canContinue != PROJECTILE_CONTINUE) var/a = round((currentX+stepX)/32) var/b = round((currentY+stepY)/32) var/c = round((currentZ+stepZ)/32) var/turf/turfer = locate(a, b, c) - message_admins("turfer X: [turfer.x] Y:[turfer.y] Z:[turfer.z]") var/atom/movable/special = new /obj/item() special.forceMove(turfer) special.icon = projectile.icon @@ -335,9 +338,9 @@ SUBSYSTEM_DEF(bullets) special.pixel_y = round((currentY+stepY))%32 - 16 special.transform = projectile.transform message_admins("started at X: [round(currentX)]. Y: [round(currentY)] , stopping at X: [round(currentX+stepX)] , Y:[round(currentY+stepY)]") - //dataReference.globalX = currentX + stepX - //dataReference.globalY = currentY + stepY - //dataReference.globalZ += stepZ + dataReference.globalX = currentX + stepX + dataReference.globalY = currentY + stepY + dataReference.globalZ += stepZ dataReference.lifetime = 0 break From 57935d6f6ec33265d333368854a6a8900aeb25d4 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 9 Aug 2024 15:24:18 +0300 Subject: [PATCH 140/171] a --- code/controllers/subsystems/bullets.dm | 74 ++++++++++++++--------- code/modules/projectiles/hitbox_datums.dm | 4 +- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index cb4a0d5c92..1063c9612c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -284,6 +284,8 @@ SUBSYSTEM_DEF(bullets) var/stepZ var/obj/item/projectile/projectile var/canContinue + var/oldX + var/oldY for(var/datum/bullet_data/dataReference in current_queue) current_queue.Remove(dataReference) projectile = dataReference.referencedBullet @@ -302,55 +304,73 @@ SUBSYSTEM_DEF(bullets) stepX = dataReference.ratioX * pixelStep stepY = dataReference.ratioY * pixelStep stepZ = dataReference.ratioZ * pixelStep - dataReference.globalX += stepX - dataReference.globalY += stepY - dataReference.globalZ += stepZ currentTurf = get_turf(projectile) - movementTurf = locate(round(dataReference.globalX/PPT),round(dataReference.globalY/PPT),round(dataReference.globalZ/PPT)) - message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") + movementTurf = locate(round((currentX+stepX)/PPT),round((currentY+stepY)/PPT),round((currentZ+stepZ)/PPT)) + //message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") if(movementTurf == currentTurf) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ else canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) if(canContinue == PROJECTILE_CONTINUE) canContinue = projectile.scanTurf(movementTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) - projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT - projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT - projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT - //message_admins("PX : [projectile.pixel_x] , PY : [projectile.pixel_y] , PZ: [projectile.pixel_z]") - projectile.forceMove(movementTurf) - currentX = dataReference.globalX - currentY = dataReference.globalY - currentZ = dataReference.globalZ - - + if(canContinue == PROJECTILE_CONTINUE) + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ + projectile.forceMove(movementTurf) + else + dataReference.globalX = stepX + dataReference.globalY = stepY + dataReference.globalZ = currentZ + movementTurf = locate(round(stepX/PPT), round(stepY/PPT), round(currentZ/PPT)) + if(movementTurf != currentTurf) + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT + projectile.forceMove(movementTurf) + dataReference.lifetime = 0 + break + + //message_admins("stepX:[stepX] , stepY : [stepY]") + /* if(canContinue != PROJECTILE_CONTINUE) - var/a = round((currentX+stepX)/32) - var/b = round((currentY+stepY)/32) - var/c = round((currentZ+stepZ)/32) - var/turf/turfer = locate(a, b, c) + /* + var/a = round((stepX)/32) + var/b = round((stepY)/32) + var/c = round((currentZ)/32) + var/turf/turfer = locate(a,b,c) var/atom/movable/special = new /obj/item() + message_admins("stepX:[stepX] , stepY : [stepY]") + message_admins("MovTurf ----- X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") + message_admins("VisTurf ----- X: [a] Y:[b] Z:[c]") special.forceMove(turfer) special.icon = projectile.icon special.icon_state = projectile.icon_state - special.pixel_x = round((currentX+stepX))%32 - 16 - special.pixel_y = round((currentY+stepY))%32 - 16 + special.pixel_x = round((stepX))%32 - 16 + special.pixel_y = round((stepY))%32 - 16 special.transform = projectile.transform - message_admins("started at X: [round(currentX)]. Y: [round(currentY)] , stopping at X: [round(currentX+stepX)] , Y:[round(currentY+stepY)]") - dataReference.globalX = currentX + stepX - dataReference.globalY = currentY + stepY - dataReference.globalZ += stepZ + */ dataReference.lifetime = 0 break + */ + currentX = dataReference.globalX + currentY = dataReference.globalY + currentZ = dataReference.globalZ + - if(canContinue != PROJECTILE_CONTINUE) - message_admins("globalX : [dataReference.globalX] globalY: [dataReference.globalY]") animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%PPT - HPPT, pixel_y = dataReference.globalY%PPT - HPPT, flags = ANIMATION_END_NOW) if(dataReference.lifetime < 1) projectile.finishDeletion() bullet_queue.Remove(dataReference) + /datum/controller/subsystem/bullets/fire(resumed) return realFire() if(!resumed) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 2a715b7523..5c7df6b710 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -73,8 +73,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) /// Distance to intersection of point message_admins("pstepX = [*pStepX] , pstepY = [*pStepY]") - *pStepX = firstRatio * (x2 - x1) - *pStepX - *pStepY = firstRatio * (y2 - y1) - *pStepY + *pStepX = x1 + firstRatio * (x2 - x1) + *pStepY = y1 + firstRatio * (y2 - y1) message_admins("Collision put at X:[x1 + *pStepX] Y:[y1+ *pStepY]") return TRUE //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) From 6692f96b2c6c015097070e45367be4e42b98172b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 9 Aug 2024 16:35:36 +0300 Subject: [PATCH 141/171] ITS FULLY ACCURTE NOW THANK GOGDDA HAHA --- code/controllers/subsystems/bullets.dm | 46 +++++++++++++++++++++-- code/modules/projectiles/hitbox_datums.dm | 3 -- code/modules/projectiles/projectile.dm | 2 +- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 1063c9612c..a955d0a0e7 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -286,6 +286,7 @@ SUBSYSTEM_DEF(bullets) var/canContinue var/oldX var/oldY + var/list/colored = list() for(var/datum/bullet_data/dataReference in current_queue) current_queue.Remove(dataReference) projectile = dataReference.referencedBullet @@ -309,9 +310,27 @@ SUBSYSTEM_DEF(bullets) //message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") if(movementTurf == currentTurf) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) - dataReference.globalX += stepX - dataReference.globalY += stepY - dataReference.globalZ += stepZ + if(canContinue == PROJECTILE_CONTINUE) + dataReference.globalX += stepX + dataReference.globalY += stepY + dataReference.globalZ += stepZ + else + dataReference.globalX = stepX + dataReference.globalY = stepY + dataReference.globalZ = currentZ + currentTurf.color = COLOR_RED + message_admins(" 1 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") + dataReference.lifetime = 0 + if(movementTurf != currentTurf) + message_admins("Adjusted for Delta") + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT + projectile.forceMove(movementTurf) + movementTurf.color = COLOR_RED + colored += movementTurf + dataReference.lifetime = 0 + break else canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) if(canContinue == PROJECTILE_CONTINUE) @@ -324,18 +343,33 @@ SUBSYSTEM_DEF(bullets) dataReference.globalY += stepY dataReference.globalZ += stepZ projectile.forceMove(movementTurf) + movementTurf.color = COLOR_GREEN + colored += movementTurf else dataReference.globalX = stepX dataReference.globalY = stepY dataReference.globalZ = currentZ + message_admins(" 2 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") movementTurf = locate(round(stepX/PPT), round(stepY/PPT), round(currentZ/PPT)) + movementTurf.color = COLOR_RED if(movementTurf != currentTurf) + message_admins("Adjusted for Delta") projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT projectile.forceMove(movementTurf) + movementTurf.color = COLOR_RED + colored += movementTurf dataReference.lifetime = 0 break + else + dataReference.globalX = stepX + dataReference.globalY = stepY + dataReference.globalZ = currentZ + currentTurf.color = COLOR_RED + message_admins(" 3 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") + dataReference.lifetime = 0 + break //message_admins("stepX:[stepX] , stepY : [stepY]") @@ -370,6 +404,12 @@ SUBSYSTEM_DEF(bullets) projectile.finishDeletion() bullet_queue.Remove(dataReference) + if(length(colored)) + addtimer(CALLBACK(src, PROC_REF(deleteColors), colored.Copy()), SSbullets.wait * 15) + +/datum/controller/subsystem/bullets/proc/deleteColors(list/specialList) + for(var/turf/tata in specialList) + tata.color = initial(tata.color) /datum/controller/subsystem/bullets/fire(resumed) return realFire() diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 5c7df6b710..2136717b05 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -71,11 +71,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo firstRatio = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator secondRatio = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) - /// Distance to intersection of point - message_admins("pstepX = [*pStepX] , pstepY = [*pStepY]") *pStepX = x1 + firstRatio * (x2 - x1) *pStepY = y1 + firstRatio * (y2 - y1) - message_admins("Collision put at X:[x1 + *pStepX] Y:[y1+ *pStepY]") return TRUE //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) //message_admins("X-collision : [x1 + firstRatio * (x2 - x1)] Y-collision : [y1 + firstRatio * (y2] - y1)]") diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 87fd1ffade..83386e1771 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -621,7 +621,7 @@ GLOBAL_LIST(projectileDamageConstants) on_impact(A) atomFlags |= AF_VISUAL_MOVE density = FALSE - dataRef.lifetime = 1 + dataRef.lifetime = 0 /obj/effect/bullet_sparks name = "bullet hit" From 300b588df853a3a3d24673f5cf55e6677414bec2 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 10 Aug 2024 09:09:56 +0300 Subject: [PATCH 142/171] it mothafucking works it works it works --- code/controllers/subsystems/bullets.dm | 29 +++++++++++++++++++++----- code/modules/projectiles/projectile.dm | 2 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index a955d0a0e7..8ebbcabae7 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -7,9 +7,11 @@ /// the higher this is ,the more performant the system is , since more of the math is done at once instead of in stages /// it is also more inaccurate the higher you go.. #define MAXPIXELS 16 +/// Define this / uncomment it if you want to see bullet debugging data for trajectories & chosen paths. +// #define BULLETDEBUG 1 SUBSYSTEM_DEF(bullets) name = "Bullets" - wait = 5 + wait = 1 priority = SS_PRIORITY_BULLETS init_order = INIT_ORDER_BULLETS @@ -286,7 +288,9 @@ SUBSYSTEM_DEF(bullets) var/canContinue var/oldX var/oldY + #ifdef BULLETDEBUG var/list/colored = list() + #endif for(var/datum/bullet_data/dataReference in current_queue) current_queue.Remove(dataReference) projectile = dataReference.referencedBullet @@ -318,17 +322,21 @@ SUBSYSTEM_DEF(bullets) dataReference.globalX = stepX dataReference.globalY = stepY dataReference.globalZ = currentZ + #ifdef BULLETDEBUG currentTurf.color = COLOR_RED message_admins(" 1 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") + #endif dataReference.lifetime = 0 if(movementTurf != currentTurf) - message_admins("Adjusted for Delta") projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT projectile.forceMove(movementTurf) + #ifdef BULLETDEBUG movementTurf.color = COLOR_RED colored += movementTurf + message_admins("Adjusted for Delta") + #endif dataReference.lifetime = 0 break else @@ -343,31 +351,39 @@ SUBSYSTEM_DEF(bullets) dataReference.globalY += stepY dataReference.globalZ += stepZ projectile.forceMove(movementTurf) + #ifdef BULLETDEBUG movementTurf.color = COLOR_GREEN colored += movementTurf + #endif else dataReference.globalX = stepX dataReference.globalY = stepY dataReference.globalZ = currentZ + #ifdef BULLETDEBUG message_admins(" 2 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") - movementTurf = locate(round(stepX/PPT), round(stepY/PPT), round(currentZ/PPT)) movementTurf.color = COLOR_RED + #endif + movementTurf = locate(round(stepX/PPT), round(stepY/PPT), round(currentZ/PPT)) if(movementTurf != currentTurf) - message_admins("Adjusted for Delta") projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT projectile.forceMove(movementTurf) + #ifdef BULLETDEBUG movementTurf.color = COLOR_RED + message_admins("Adjusted for Delta") colored += movementTurf + #endif dataReference.lifetime = 0 break else dataReference.globalX = stepX dataReference.globalY = stepY dataReference.globalZ = currentZ + #ifdef BULLETDEBUG currentTurf.color = COLOR_RED message_admins(" 3 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") + #endif dataReference.lifetime = 0 break @@ -398,14 +414,17 @@ SUBSYSTEM_DEF(bullets) currentY = dataReference.globalY currentZ = dataReference.globalZ + var/bulletTime = SSbullets.wait *(dataReference.pixelSpeed / (dataReference.pixelSpeed + pixelTotal)) - animate(projectile, SSbullets.wait, pixel_x = dataReference.globalX%PPT - HPPT, pixel_y = dataReference.globalY%PPT - HPPT, flags = ANIMATION_END_NOW) + animate(projectile, bulletTime, pixel_x = dataReference.globalX%PPT - HPPT, pixel_y = dataReference.globalY%PPT - HPPT, flags = ANIMATION_END_NOW) if(dataReference.lifetime < 1) projectile.finishDeletion() bullet_queue.Remove(dataReference) + #ifdef BULLETDEBUG if(length(colored)) addtimer(CALLBACK(src, PROC_REF(deleteColors), colored.Copy()), SSbullets.wait * 15) + #endif /datum/controller/subsystem/bullets/proc/deleteColors(list/specialList) for(var/turf/tata in specialList) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 83386e1771..af2e9725ec 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -645,7 +645,7 @@ GLOBAL_LIST(projectileDamageConstants) visEffect.transform = src.transform visEffect.update_plane() - QDEL_IN(src, SSbullets.wait * 5) + QDEL_IN(src, SSbullets.wait) /obj/item/projectile/explosion_act(target_power, explosion_handler/handler) return 0 From ce4f5312417f4418e11c15fbedfbcbf468f2e0d0 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 10 Aug 2024 18:13:07 +0300 Subject: [PATCH 143/171] more support for more special hitboxes --- code/ATMOSPHERICS/atmospherics.dm | 1 - code/_compile_options.dm | 4 +- code/controllers/subsystems/bullets.dm | 28 ++------ code/game/atoms.dm | 2 + code/modules/projectiles/hitbox_datums.dm | 78 +++++++++++++++++++++-- 5 files changed, 84 insertions(+), 29 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index e46d229349..b5f96c2b11 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -35,7 +35,6 @@ Pipelines + Other Objects -> Pipe network /// Pending a full implementation of hitbox for every atom /obj/machinery/atmospherics/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) - . = ..() return PROJECTILE_CONTINUE /obj/machinery/atmospherics/Initialize(mapload, d) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index eb60858483..6cd773af3e 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,7 +46,9 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -#define LOWMEMORYMODE 1 +//#define LOWMEMORYMODE 1 + +#define HITBOX_DEBUG 1 #ifdef LOWMEMORYMODE #define FORCE_MAP "_maps/runtimestation.json" diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 8ebbcabae7..bfd424aacf 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -17,25 +17,6 @@ SUBSYSTEM_DEF(bullets) var/list/datum/bullet_data/current_queue = list() var/list/datum/bullet_data/bullet_queue = list() - // Used for processing bullets. No point in deallocating and reallocating them every MC tick. - var/list/bulletRatios - var/list/bulletCoords - var/obj/item/projectile/projectile - var/pixelsToTravel - var/pixelsThisStep - var/x_change - var/y_change - var/z_change - var/tx_change - var/ty_change - var/tz_change - var/turf/moveTurf = null - var/list/relevantAtoms = list() - // 1 client tick by default , can be increased by impacts - var/bulletWait = 1 - //// x1,y1,x2,y2,z1,z2 - var/list/trajectoryData = list(0,0,0,0,0,0,0) - var/distanceToTravelForce @@ -326,8 +307,7 @@ SUBSYSTEM_DEF(bullets) currentTurf.color = COLOR_RED message_admins(" 1 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") #endif - dataReference.lifetime = 0 - if(movementTurf != currentTurf) + if(movementTurf != currentTurf && movementTurf) projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT @@ -337,7 +317,7 @@ SUBSYSTEM_DEF(bullets) colored += movementTurf message_admins("Adjusted for Delta") #endif - dataReference.lifetime = 0 + dataReference.lifetime = 0 break else canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) @@ -364,7 +344,7 @@ SUBSYSTEM_DEF(bullets) movementTurf.color = COLOR_RED #endif movementTurf = locate(round(stepX/PPT), round(stepY/PPT), round(currentZ/PPT)) - if(movementTurf != currentTurf) + if(movementTurf != currentTurf && movementTurf) projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT @@ -432,6 +412,7 @@ SUBSYSTEM_DEF(bullets) /datum/controller/subsystem/bullets/fire(resumed) return realFire() + /* if(!resumed) current_queue = bullet_queue.Copy() var/global/turf/leaving @@ -543,5 +524,6 @@ SUBSYSTEM_DEF(bullets) bullet_queue -= bullet //for(var/turf/painted in bullet.painted) // painted.color = initial(painted.color) + */ diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 2fa3e91037..b9a8b83bfc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -220,6 +220,8 @@ update_plane() hitbox = getHitbox(hitbox) + #ifdef HITBOX_DEBUG + hitbox.visualise(src) if(preloaded_reagents) if(!reagents) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 2136717b05..97901e5263 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -81,18 +81,16 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/proc/visualize(atom/owner) - var/list/availableColors = list(COLOR_RED, COLOR_AMBER, COLOR_BLUE, COLOR_ORANGE, COLOR_CYAN, COLOR_YELLOW, COLOR_BROWN, COLOR_VIOLET, COLOR_PINK, COLOR_ASSEMBLY_BEIGE, COLOR_ASSEMBLY_GREEN, COLOR_ASSEMBLY_LBLUE, COLOR_LIGHTING_BLUE_DARK) - var/chosenColor = pick_n_take(availableColors) for(var/list/hitbox in boundingBoxes[num2text(owner.dir)]) var/icon/Icon = icon('icons/hitbox.dmi', "box") var/multX = hitbox[3] - hitbox[1] + 1 var/multY = hitbox[4] - hitbox[2] + 1 Icon.Scale(multX, multY) var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") - newOverlay.color = chosenColor - chosenColor = pick_n_take(availableColors) + newOverlay.color = RANDOM_RGB newOverlay.pixel_x = hitbox[1] - 1 newOverlay.pixel_y = hitbox[2] - 1 + newOverlay.alpha = 100 owner.overlays.Add(newOverlay) /datum/hitboxDatum/atom @@ -301,6 +299,78 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)) ) +/// This checks line by line instead of a box. Less efficient. +/datum/hitboxDatum/atom/polygon + boundingBoxes = list( + LISTNORTH = list(BLINE(0,0,32,32)), + LISTSOUTH = list(BLINE(0,0,32,32)), + LISTEAST = list(BLINE(0,0,32,32)), + LISTWEST = list(BLINE(0,0,32,32)) + ) + +/datum/hitboxDatum/atom/polygon/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) + var/global/worldX + var/global/worldY + worldX = owner.x + worldY = owner.y + if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) + for(var/atom/thing as anything in owner.attached) + if(!(thing.attached[owner] & ATFS_SUPPORTER)) + continue + worldX += thing.x - owner.x + worldY += thing.y - owner.y + break + worldX *= 32 + worldY *= 32 + for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) + /// basic AABB but only for the Z-axis. + //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + // continue + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + return TRUE + return FALSE + +/// Hitboxes are ordered based on center distance. +/datum/hitboxDatum/atom/ordered + +/datum/hitboxDatum/atom/ordered/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) + var/global/worldX + var/global/worldY + worldX = owner.x + worldY = owner.y + if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) + for(var/atom/thing as anything in owner.attached) + if(!(thing.attached[owner] & ATFS_SUPPORTER)) + continue + worldX += thing.x - owner.x + worldY += thing.y - owner.y + break + worldX *= 32 + worldY *= 32 + var/list/relevantHitboxes + for(var/list/boundingBox in boundingBoxes["[ownerDirection]"]) + relevantHitboxes[boundingBox] = DIST_EUCLIDIAN_2D((boundingBox[1]+boundingBox[3])/2, (boundingBox[2]+boundingBox[4])/2, startX, startY) + for(var/index in 1 to (length(relevantHitboxes)-1)) + if(relevantHitboxes[index] > relevantHitboxes[index+1]) + relevantHitboxes[index+1] += relevantHitboxes[index] + relevantHitboxes[index] = relevantHitboxes[index+1] - relevantHitboxes[index] + relevantHitboxes[index+1] -= relevantHitboxes[index] + index = max(1, index - 1) + for(var/list/boundingData in relevantHitboxes) + /// basic AABB but only for the Z-axis. + //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + // continue + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + return TRUE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) + return TRUE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + return TRUE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + return TRUE + return FALSE + + /datum/hitboxDatum/mob /datum/hitboxDatum/mob/New() From be7646d8e64ad0647fe20677319dca66d0f2e833 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 07:19:00 +0300 Subject: [PATCH 144/171] a --- code/game/atoms.dm | 3 ++- code/modules/projectiles/hitbox_datums.dm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b9a8b83bfc..f1b5877109 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -221,7 +221,8 @@ hitbox = getHitbox(hitbox) #ifdef HITBOX_DEBUG - hitbox.visualise(src) + hitbox.visualize(src) + #endif if(preloaded_reagents) if(!reagents) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 97901e5263..a6fb6ed5ae 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -90,7 +90,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo newOverlay.color = RANDOM_RGB newOverlay.pixel_x = hitbox[1] - 1 newOverlay.pixel_y = hitbox[2] - 1 - newOverlay.alpha = 100 + newOverlay.alpha = 200 owner.overlays.Add(newOverlay) /datum/hitboxDatum/atom From 170145720a7dddd26a21827c9efc89d9f99c3bfb Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 10:40:40 +0300 Subject: [PATCH 145/171] debugging utilities + hitbox for power cables. --- code/_compile_options.dm | 6 +- code/game/atoms.dm | 3 +- code/modules/power/cable.dm | 4 +- code/modules/projectiles/hitbox_datums.dm | 130 ++++++++++++++++++++++ icons/obj/power_cond_white.dmi | Bin 12337 -> 6186 bytes 5 files changed, 134 insertions(+), 9 deletions(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 6cd773af3e..0fa7bab22d 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,14 +46,10 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -//#define LOWMEMORYMODE 1 +#define LOWMEMORYMODE 1 #define HITBOX_DEBUG 1 -#ifdef LOWMEMORYMODE -#define FORCE_MAP "_maps/runtimestation.json" -#endif - //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 #define MIN_COMPILER_BUILD 1556 diff --git a/code/game/atoms.dm b/code/game/atoms.dm index f1b5877109..84194e9484 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -221,7 +221,8 @@ hitbox = getHitbox(hitbox) #ifdef HITBOX_DEBUG - hitbox.visualize(src) + if(hitbox) + addtimer(CALLBACK(hitbox, TYPE_PROC_REF(/datum/hitboxDatum, visualize), src), 1 MINUTE) #endif if(preloaded_reagents) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 293230f8ed..eb389458c1 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -43,14 +43,12 @@ var/list/possible_cable_coil_colours = list( icon_state = "0-1" health = 20 maxHealth = 20 + hitbox = /datum/hitboxDatum/atom/polygon/powerCable var/d1 = 0 var/d2 = 1 color = COLOR_RED_LIGHT var/obj/machinery/power/breakerbox/breaker_box -/obj/structure/cable/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) - return PROJECTILE_CONTINUE - /obj/structure/cable/drain_power(var/drain_check, var/surge, var/amount = 0) if(drain_check) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index a6fb6ed5ae..7dd6200b2a 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -67,6 +67,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/global/secondRatio var/denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)) if(denominator == 0) + message_admins("Invalid line for [src], at hitbox coords BulletLine ([x1] | [y1]) ([x2] | [y2]) HitboxLine ([x3] | [y3]) ([x4] | [y4])") return FALSE firstRatio = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator secondRatio = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator @@ -229,6 +230,21 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/table/getAimingLevel(atom/shooter, defZone, atom/owner) return medianLevels["[owner.dir]"] +/datum/hitboxDatum/atom/table/visualize(obj/structure/table/owner) + for(var/i = 1 to 4) + var/list/boundingList = boundingBoxes[text2num(owner.connections[i])+1]["[(1<<(i-1))]"] + for(var/list/hitbox in boundingList) + var/icon/Icon = icon('icons/hitbox.dmi', "box") + var/multX = hitbox[3] - hitbox[1] + 1 + var/multY = hitbox[4] - hitbox[2] + 1 + Icon.Scale(multX, multY) + var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") + newOverlay.color = RANDOM_RGB + newOverlay.pixel_x = hitbox[1] - 1 + newOverlay.pixel_y = hitbox[2] - 1 + newOverlay.alpha = 200 + owner.overlays.Add(newOverlay) + /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/atom/table/intersects(obj/structure/table/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/global/worldX @@ -330,6 +346,105 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return TRUE return FALSE +/datum/hitboxDatum/atom/polygon/visualize(atom/owner) + for(var/list/hitbox in boundingBoxes[num2text(owner.dir)]) + var/icon/Icon = icon('icons/hitbox.dmi', "box") + var/length = round(DIST_EUCLIDIAN_2D(hitbox[1], hitbox[2], hitbox[3], hitbox[4])) + Icon.Scale(length, 1) + var/x = (hitbox[3] - hitbox[1]) + var/y = (hitbox[4] - hitbox[2]) + var/angle = ATAN2(y, x) + 180 + var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") + newOverlay.color = RANDOM_RGB + var/matrix/rotation = matrix() + rotation.Turn(angle) + newOverlay.transform = rotation + newOverlay.pixel_x = hitbox[1] - 1 + newOverlay.pixel_y = hitbox[2] - 1 + newOverlay.alpha = 200 + owner.overlays.Add(newOverlay) + +/// Indexed by icon-state +/datum/hitboxDatum/atom/polygon/powerCable + boundingBoxes = list( + "0-1" = list(BLINE(16,16,16,32)), + "0-2" = list(BLINE(16,0,16,16)), + "0-4" = list(BLINE(16,16,32,16)), + "0-5" = list(BLINE(16,16,32,32)), + "0-6" = list(BLINE(32,0,16,16)), + "0-8" = list(BLINE(0,16,16,16)), + "0-9" = list(BLINE(0,32,16,16)), + "0-10" = list(BLINE(0,0,16,16)), + "1-2" = list(BLINE(16,0,16,32)), + "1-4" = list(BLINE(16,32,20,20),BLINE(20,20,32,16)), + "1-5" = list(BLINE(16,32,21,25),BLINE(21,25,32,32)), + "1-6" = list(BLINE(16,32,22,12),BLINE(22,12,32,0)), + "1-8" = list(BLINE(0,16,13,20),BLINE(13,20,16,32)), + "1-9" = list(BLINE(0,32,12,25),BLINE(12,25,16,32)), + "1-10" = list(BLINE(0,0,12,14), BLINE(12,14,16,32)), + "2-4" = list(BLINE(16,0,19,12), BLINE(19,12,32,16)), + "2-5" = list(BLINE(16,0,21,19), BLINE(21,19,32,32)), + "2-6" = list(BLINE(16,0,20,9), BLINE(20,9,32,0)), + "2-8" = list(BLINE(0,16,13,13), BLINE(13,13,16,0)), + "2-9" = list(BLINE(0,32,13,17),BLINE(13,17,16,0)), + "2-10" = list(BLINE(0,0,13,8), BLINE(13,8,16,0)), + "4-5" = list(BLINE(32,16,25,22),BLINE(25,22,32,32)), + "4-6" = list(BLINE(32,0,25,11), BLINE(25,11,32,16)), + "4-8" = list(BLINE(0,16,32,16)), + "4-9" = list(BLINE(0,32,16,20), BLINE(16,20,32,16)), + "4-10" = list(BLINE(0,0,14,12), BLINE(14,12,32,16)), + "5-6" = list(BLINE(31,0,25,16), BLINE(25,16,31,32)), + "5-8" = list(BLINE(0,16,18,21), BLINE(18,21,32,32)), + "5-9" = list(BLINE(0,31,16,25), BLINE(16,25,32,31)), + "5-10" = list(BLINE(0,0,32,32)), + "6-8" = list(BLINE(0,17,17,13),BLINE(17,13,32,0)), + "6-9" = list(BLINE(0,32,32,0)), + "6-10" = list(BLINE(0,1,16,8), BLINE(16,8,32,1)), + "8-9" = list(BLINE(0,16,8,20), BLINE(8,20,2,32)), + "8-10" = list(BLINE(0,16,8,13), BLINE(8,13,0,0)), + "9-10" = list(BLINE(0,0,8,16), BLINE(8,16,0,32)), + "32-1" = list(BLINE(16,18,16,32)), + "32-2" = list(BLINE(16,0,16,16)), + "32-4" = list(BLINE(16,16,32,16)), + "32-5" = list(BLINE(16,16,32,32)), + "32-6" = list(BLINE(16,16,32,0)), + "32-8" = list(BLINE(0,16,16,16)), + "32-9" = list(BLINE(0,32,16,16)), + "32-10" = list(BLINE(0,0,16,16)), + "16-0" = list(BLINE(16,16,16,24)) + ) + +/datum/hitboxDatum/atom/polygon/powerCable/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) + var/global/worldX + var/global/worldY + worldX = owner.x * 32 + worldY = owner.y * 32 + for(var/list/boundingData in boundingBoxes[owner.icon_state]) + /// basic AABB but only for the Z-axis. + //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + // continue + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + return TRUE + return FALSE + +/datum/hitboxDatum/atom/polygon/powerCable/visualize(atom/owner) + for(var/list/hitbox in boundingBoxes[owner.icon_state]) + var/icon/Icon = icon('icons/hitbox.dmi', "box") + var/length = round(DIST_EUCLIDIAN_2D(hitbox[1], hitbox[2], hitbox[3], hitbox[4])) + Icon.Scale(1, length) + var/x = (hitbox[3] - hitbox[1]) + var/y = (hitbox[4] - hitbox[2]) + var/angle = ATAN2(y, x) + 180 + var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") + newOverlay.color = RANDOM_RGB + var/matrix/rotation = matrix() + rotation.Turn(angle) + newOverlay.transform = rotation + newOverlay.pixel_x = hitbox[3] - 1 + newOverlay.pixel_y = hitbox[4] - 1 + newOverlay.alpha = 200 + owner.overlays.Add(newOverlay) + /// Hitboxes are ordered based on center distance. /datum/hitboxDatum/atom/ordered @@ -392,6 +507,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo volumeSum += calculatedVolume medianLevels[state]["[direction]"] = median / volumeSum + + /datum/hitboxDatum/mob/getAimingLevel(atom/shooter, defZone, atom/owner) var/mob/living/perceivedOwner = owner if(defZone == null || (!(defZone in defZoneToLevel["[perceivedOwner.lying]"]))) @@ -423,6 +540,19 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return TRUE return FALSE +/datum/hitboxDatum/mob/visualize(mob/living/owner) + for(var/list/hitbox in boundingBoxes["[owner.lying]"]["[owner.dir]"]) + var/icon/Icon = icon('icons/hitbox.dmi', "box") + var/multX = hitbox[3] - hitbox[1] + 1 + var/multY = hitbox[4] - hitbox[2] + 1 + Icon.Scale(multX, multY) + var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") + newOverlay.color = RANDOM_RGB + newOverlay.pixel_x = hitbox[1] - 1 + newOverlay.pixel_y = hitbox[2] - 1 + newOverlay.alpha = 200 + owner.overlays.Add(newOverlay) + /datum/hitboxDatum/mob/human boundingBoxes = list( "0" = list( diff --git a/icons/obj/power_cond_white.dmi b/icons/obj/power_cond_white.dmi index 1b0930d7666aab14e4cd206f51866f37f9824c66..41952eeef600ee5664187104bd705bf6a52b4e77 100644 GIT binary patch literal 6186 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 From 5ffee2b1c12b0199631a98a43a2228529245cdf3 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 18:52:37 +0300 Subject: [PATCH 146/171] Rebruh --- code/ATMOSPHERICS/atmospherics.dm | 9 + code/ATMOSPHERICS/pipes.dm | 15 + code/__DEFINES/_bullets.dm | 18 +- code/controllers/subsystems/bullets.dm | 292 +++++------------- code/game/turfs/simulated/floor.dm | 2 + code/game/turfs/simulated/floor_attackby.dm | 19 +- code/game/turfs/simulated/walls.dm | 2 +- .../clothing/spacesuits/void/station.dm | 2 +- code/modules/clothing/suits/armor.dm | 2 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 255 +++++++++------ code/modules/projectiles/projectile.dm | 188 ++++++----- 12 files changed, 388 insertions(+), 418 deletions(-) diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index b5f96c2b11..12c9a599aa 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -62,6 +62,15 @@ Pipelines + Other Objects -> Pipe network return ..() +/// Yes this is necesarry due to how atmos is handled +/// In a perfect world this wouldn't be necesarry +/// and i do not have the willpower to rework all of atmos yet +/// SPCR - 2024 +/obj/machinery/atmospherics/proc/getHitboxData() + if(invisibility == 101) + return null + return initialize_directions + /obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction, var/icon_connect_type) if(node) if(T && !T.is_plating() && node.level == BELOW_PLATING_LEVEL && istype(node, /obj/machinery/atmospherics/pipe)) diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 95ae2292d0..fb675e498b 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -7,9 +7,19 @@ layer = GAS_PIPE_HIDDEN_LAYER use_power = NO_POWER_USE + hitbox = /datum/hitboxDatum/atom/polygon/atmosphericPipe + var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called +/// Pending a full implementation of hitbox for every atom +/obj/machinery/atmospherics/pipe/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + take_damage(P.get_structure_damage()) + if(QDELETED(src)) + return PROJECTILE_CONTINUE + return PROJECTILE_STOP + + /obj/machinery/atmospherics/pipe/Initialize(mapload, d) . = ..() AddComponent(/datum/component/buckling, buckleFlags = BUCKLE_MOB_ONLY | BUCKLE_REQUIRE_RESTRAINTED | BUCKLE_REQUIRE_NOT_BUCKLED | BUCKLE_FORCE_LIE) @@ -191,6 +201,11 @@ invisibility = i ? 101 : 0 update_icon() +/obj/machinery/atmospherics/pipe/simple/getHitboxData() + if(invisibility == 101) + return null + return initialize_directions + /obj/machinery/atmospherics/pipe/simple/Process() if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle ..() diff --git a/code/__DEFINES/_bullets.dm b/code/__DEFINES/_bullets.dm index bc2005bcc2..65e7ae4a4b 100644 --- a/code/__DEFINES/_bullets.dm +++ b/code/__DEFINES/_bullets.dm @@ -1,14 +1,14 @@ /// These define the MAXIMUM height for a level (as in a standing human height is considered) #define LEVEL_BELOW 0 -#define LEVEL_TURF 0.3 -#define LEVEL_LYING 0.6 -#define LEVEL_LOWWALL 0.8 -#define LEVEL_TABLE 1 -#define LEVEL_LEGS 1 -#define LEVEL_GROIN 1.1 -#define LEVEL_CHEST 1.8 -#define LEVEL_HEAD 2.1 -#define LEVEL_ABOVE 3 +#define LEVEL_TURF 3 +#define LEVEL_LYING 6 +#define LEVEL_LOWWALL 9 +#define LEVEL_TABLE 15 +#define LEVEL_LEGS 15 +#define LEVEL_GROIN 20 +#define LEVEL_CHEST 28 +#define LEVEL_HEAD 30 +#define LEVEL_ABOVE 32 // update these , using max() on defines wont give you constants #define LEVEL_MAX 3 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index bfd424aacf..dbcb7ce18c 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -8,7 +8,7 @@ /// it is also more inaccurate the higher you go.. #define MAXPIXELS 16 /// Define this / uncomment it if you want to see bullet debugging data for trajectories & chosen paths. -// #define BULLETDEBUG 1 +#define BULLETDEBUG 1 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -18,242 +18,99 @@ SUBSYSTEM_DEF(bullets) var/list/datum/bullet_data/current_queue = list() var/list/datum/bullet_data/bullet_queue = list() - - /// You might ask why use a bullet data datum, and not store all the vars on the bullet itself, honestly its to keep track and initialize firing relevant vars only when needed /// This data is guaranteed to be of temporary use spanning 15-30 seconds or how long the bullet moves for. Putting them on the bullet makes each one take up more ram /// And ram is not a worry , but its better to initialize less and do the lifting on fire. /datum/bullet_data var/obj/item/projectile/referencedBullet = null - // + var/atom/firer var/aimedZone = "" var/globalX = 0 var/globalY = 0 var/globalZ = 0 + var/originalX = 0 + var/originalY = 0 + var/originalZ = 0 + var/targetX = 0 + var/targetY = 0 + var/targetZ = 0 var/pixelSpeed = 0 var/ratioX = 0 var/ratioY = 0 - var/ratioZ = 0 - // - - - var/atom/firer = null - var/turf/firedTurf = null - var/list/firedCoordinates = list(0,0,0) - var/list/firedPos = list(0,0,0) - var/firedLevel = 0 - var/atom/target = null - var/turf/targetTurf = null - var/list/targetCoords = list(0,0,0) - var/list/targetPos = list(0,0,0) - var/turf/currentTurf = null - var/currentCoords = list(0,0,0) - /// [1]=X , [2]=Y, [3]=Z, [4]=Angle - /// Note : MovementRatios[3] aka Zratio is not used because i couldn't figure out - /// how to properly translate it to pixels travelled , main issue resides in dist_euclidian2D not being 1:1 with - /// actual amount of pixels to travel at other angles - var/movementRatios = list(0,0,0,0) - var/list/turf/coloreds = list() - var/targetLevel = 0 - var/currentLevel = 0 - var/pixelsPerTick = 0 - var/projectileAccuracy = 0 + var/angle = 0 var/lifetime = 30 - var/bulletLevel = 0 - var/lastChanges = list(0,0,0) - /// Used to determine wheter a projectile should be allowed to bump a turf or not. - var/isTraversingLevel = FALSE - /// Used to animate the ending pixels - var/hasImpacted = FALSE - var/list/painted = list() - var/traveled - var/trajSum + var/traveledPixels = 0 + var/distanceToTarget = 0 var/list/cannotHit = list() -/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, atom/target, list/targetCoords, pixelsPerTick,zOffset, angleOffset, lifetime) - /* - if(!target) - message_admins("Created bullet without target , [referencedBullet]") - return - if(!firer) - message_admins("Created bullet without firer, [referencedBullet]") - return - */ +/datum/bullet_data/New(obj/item/projectile/referencedBullet, aimedZone, atom/firer, list/currentCoordinates, list/targetCoordinates, pixelsPerTick, angleOffset, lifetime) referencedBullet.dataRef = src src.referencedBullet = referencedBullet - src.currentTurf = get_turf(referencedBullet) - src.currentCoords = list(referencedBullet.pixel_x, referencedBullet.pixel_y, referencedBullet.z) - src.targetCoords = targetCoords src.aimedZone = aimedZone - src.pixelsPerTick = pixelsPerTick - src.projectileAccuracy = projectileAccuracy src.lifetime = lifetime - src.firedCoordinates = list(16,16, referencedBullet.z) - if(firer) - src.firer = firer - src.firedTurf = get_turf(firer) - src.firedPos = list(firer.x , firer.y , firer.z) - if(ismob(firer)) - if(iscarbon(firer)) - if(firer:lying) - src.firedLevel = LEVEL_LYING - else - src.firedLevel = LEVEL_CHEST - else - src.firedLevel = LEVEL_CHEST - else - src.firedLevel = LEVEL_HEAD - if(target) - src.target = target - src.targetTurf = get_turf(target) - src.targetPos = list(target.x, target.y , target.z) - src.targetLevel = target.getAimingLevel(firer, aimedZone) - if(targetLevel == HBF_NOLEVEL) - if(ismob(target)) - if(iscarbon(target)) - if(target:lying) - src.targetLevel = LEVEL_LYING - else - src.targetLevel = LEVEL_HEAD - else - src.targetLevel = LEVEL_HEAD - else if(istype(target, /obj/structure/low_wall)) - src.targetLevel = LEVEL_LOWWALL - else if(istype(target, /obj/structure/window)) - src.targetLevel = LEVEL_HEAD - else if(istype(target, /obj/structure/table)) - src.targetLevel = LEVEL_TABLE - else if(iswall(target)) - src.targetLevel = LEVEL_HEAD - else if(isturf(target)) - src.targetLevel = LEVEL_TURF - else if(isitem(target)) - src.targetLevel = LEVEL_TURF - else - message_admins(("Created bullet without target , [referencedBullet], from [usr]")) - - if(abs(target.pixel_x) > PPT/2) - targetPos[1] += round((target.pixel_x - PPT/2 )/ PPT) + 1 * sign(target.pixel_x) - if(abs(target.pixel_y) > PPT/2) - targetPos[2] += round((target.pixel_y - PPT/2) / PPT) + 1 * sign(target.pixel_y) - + src.firer = firer pixelSpeed = pixelsPerTick - globalX = currentTurf.x * 32 + currentCoords[1] + 16 - globalY = currentTurf.y * 32 + currentCoords[2] + 16 - globalZ = currentTurf.z * 32 - - //message_admins("level set to [firedLevel], towards [targetLevel]") - currentCoords[3] = firedLevel - targetLevel += (targetCoords[3] - firedPos[3])* LEVEL_MAX - /// These use LERP until a way can be figured out to calculate a level for amount of pixels traversed - //message_admins("Distance to target is [distStartToFinish2D()] , startingLevel [firedLevel] , targetLevel [targetLevel]") - //movementRatios[3] = (targetLevel - firedLevel) / (distStartToFinish2D() * PPT) - - targetLevel += zOffset * (distStartToFinish2D() / PPT) - //movementRatios[3] += zOffset / MAXPIXELS - //message_admins("calculated movementRatio , [movementRatios[3]], offset is [zOffset * (distStartToFinish2D()/ PPT)]") - movementRatios[4] = getAngleByPosition() - movementRatios[4] += angleOffset + globalX = currentCoordinates[1] + globalY = currentCoordinates[2] + globalZ = currentCoordinates[3] + originalX = globalX + originalY = globalY + originalZ = globalZ + targetX = targetCoordinates[1] + targetY = targetCoordinates[2] + targetZ = targetCoordinates[3] + angle = getAngleByPosition() + angle += angleOffset + distanceToTarget = distStartToFinish2D() updatePathByAngle() - SSbullets.bullet_queue += src - -/datum/bullet_data/proc/redirect(list/targetCoordinates, list/firingCoordinates) - src.firedTurf = get_turf(referencedBullet) - src.firedPos = firingCoordinates - src.targetCoords = targetCoordinates + SSbullets.bullet_queue.Add(src) + +/datum/bullet_data/proc/redirect(currentX, currentY, currentZ, targetX, targetY, targetZ) + globalX = currentX + globalY = currentY + globalZ = currentZ + src.targetX = targetX + src.targetY = targetY + src.targetZ = targetZ + angle = getAngleByPosition() updatePathByPosition() /datum/bullet_data/proc/bounce(bounceAxis, angleOffset) - movementRatios[bounceAxis] *= -1 - movementRatios[4] = arctan(movementRatios[2], movementRatios[1]) + angleOffset + switch(bounceAxis) + if(1) + ratioX *= -1 + if(2) + ratioY *= -1 + angle = arctan(ratioY, ratioX) + angleOffset updatePathByAngle() /datum/bullet_data/proc/getAngleByPosition() - var/x = ((targetPos[1] - firedPos[1]) * PPT + targetCoords[1] - firedCoordinates[1]) - var/y = ((targetPos[2] - firedPos[2]) * PPT + targetCoords[2] - firedCoordinates[2]) - return ATAN2(y, x) + return ATAN2(targetY - originalY, targetX - originalX) /datum/bullet_data/proc/updatePathByAngle() var/matrix/rotation = matrix() - movementRatios[1] = sin(movementRatios[4]) - movementRatios[2] = cos(movementRatios[4]) - ratioX = movementRatios[1] - ratioY = movementRatios[2] - - - rotation.Turn(movementRatios[4] + 180) + ratioX = sin(angle) + ratioY = cos(angle) + rotation.Turn(angle + 180) referencedBullet.transform = rotation /datum/bullet_data/proc/updatePathByPosition() var/matrix/rotation = matrix() - //movementRatios[3] = ((targetPos[3] + targetLevel - firedPos[3] - firedLevel)) / (round(distStartToFinish3D()) * PPT) - movementRatios[4] = getAngleByPosition() - movementRatios[1] = sin(movementRatios[4]) - movementRatios[2] = cos(movementRatios[4]) - rotation.Turn(movementRatios[4] + 180) + angle = getAngleByPosition() + ratioX = sin(angle) + ratioY = cos(angle) + rotation.Turn(angle + 180) referencedBullet.transform = rotation /datum/bullet_data/proc/distStartToFinish2D() - var/x1 = ((targetPos[1] - 1)*PPT + targetCoords[1] + 16) - var/y1 = ((targetPos[2]- 1)*PPT + targetCoords[2] + 16) - var/x2 = ((firedPos[1] - 1)*PPT + firedCoordinates[1] + 16) - var/y2 = ((firedPos[2] - 1)*PPT + firedCoordinates[2] + 16) - return DIST_EUCLIDIAN_2D(x1,y1,x2,y2) - -/datum/bullet_data/proc/distStartToFinish3D() - return DIST_EUCLIDIAN_3D((targetPos[1]-1)*PPT + 16 + targetCoords[1],(targetPos[2]-1)*PPT + 16 + targetCoords[2],targetPos[3] + targetLevel ,(firedPos[1]*PPT)/PPT, (firedPos[2]*PPT)/PPT, firedPos[3] + firedLevel) - //return DIST_EUCLIDIAN_3D((targetPos[1]*PPT +targetCoords[1] + 16)/PPT,(targetPos[2]*PPT + targetCoords[2] + 16)/PPT,targetPos[3] + targetLevel ,(firedPos[1]*PPT +firedCoordinates[1] + 16)/PPT, (firedPos[2]*PPT +firedCoordinates[2] + 16)/PPT, firedPos[3] + firedLevel) - - - - /* - var/x = targetPos[1] - firedPos[1] - var/y = targetPos[2] - firedPos[2] - var/px = targetCoords[1] - firedCoordinates[1] - var/py = targetCoords[2] - firedCoordinates[2] - return sqrt(x**2 + y**2) + sqrt(px**2 + py**2) - */ - -/datum/bullet_data/proc/updateLevel() - switch(currentCoords[3]) - if(-INFINITY to LEVEL_BELOW) - currentLevel = LEVEL_BELOW - if(LEVEL_BELOW to LEVEL_TURF) - currentLevel = LEVEL_TURF - if(LEVEL_TURF to LEVEL_LYING) - currentLevel = LEVEL_LYING - if(LEVEL_LYING to LEVEL_LOWWALL) - currentLevel = LEVEL_LOWWALL - if(LEVEL_LOWWALL to LEVEL_TABLE) - currentLevel = LEVEL_TABLE - if(LEVEL_TABLE to LEVEL_HEAD) - currentLevel = LEVEL_HEAD - if(LEVEL_HEAD to INFINITY) - currentLevel = LEVEL_ABOVE - -/datum/bullet_data/proc/getLevel(height) - switch(height) - if(-INFINITY to LEVEL_BELOW) - return LEVEL_BELOW - if(LEVEL_BELOW to LEVEL_TURF) - return LEVEL_TURF - if(LEVEL_TURF to LEVEL_LYING) - return LEVEL_LYING - if(LEVEL_LYING to LEVEL_LOWWALL) - return LEVEL_LOWWALL - if(LEVEL_LOWWALL to LEVEL_TABLE) - return LEVEL_TABLE - if(LEVEL_TABLE to LEVEL_HEAD) - return LEVEL_HEAD - if(LEVEL_HEAD to INFINITY) - return LEVEL_ABOVE + return DIST_EUCLIDIAN_2D(targetX,targetY,originalX,originalY) /datum/controller/subsystem/bullets/proc/reset() current_queue = list() bullet_queue = list() -/datum/controller/subsystem/bullets/proc/realFire() - current_queue = bullet_queue.Copy() +/datum/controller/subsystem/bullets/fire(resumed) + /// processing variables var/turf/movementTurf var/turf/currentTurf var/currentX @@ -267,8 +124,9 @@ SUBSYSTEM_DEF(bullets) var/stepZ var/obj/item/projectile/projectile var/canContinue - var/oldX - var/oldY + current_queue = bullet_queue.Copy() + if(!resumed) + current_queue = bullet_queue.Copy() #ifdef BULLETDEBUG var/list/colored = list() #endif @@ -281,17 +139,23 @@ SUBSYSTEM_DEF(bullets) currentX = dataReference.globalX currentY = dataReference.globalY currentZ = dataReference.globalZ - bulletDir = (EAST*(dataReference.ratioX>0)) | (WEST*(dataReference.ratioX<0)) | (NORTH*(dataReference.ratioY>0)) | (SOUTH*(dataReference.ratioY<0)) | (UP*(dataReference.ratioZ>0)) | (DOWN*(dataReference.ratioZ<0)) + bulletDir = (EAST*(dataReference.ratioX>0)) | (WEST*(dataReference.ratioX<0)) | (NORTH*(dataReference.ratioY>0)) | (SOUTH*(dataReference.ratioY<0)) pixelTotal = dataReference.pixelSpeed dataReference.lifetime-- while(pixelTotal > 0) - pixelStep = min(pixelTotal, (PPT/2)) + pixelStep = min(pixelTotal, MAXPIXELS) pixelTotal -= pixelStep + dataReference.traveledPixels += pixelStep stepX = dataReference.ratioX * pixelStep stepY = dataReference.ratioY * pixelStep - stepZ = dataReference.ratioZ * pixelStep + stepZ = LERP(dataReference.originalZ, dataReference.targetZ, dataReference.traveledPixels/dataReference.distanceToTarget) - dataReference.globalZ currentTurf = get_turf(projectile) + message_admins("Z : [dataReference.globalZ] with step [stepZ] , Ratio : [dataReference.traveledPixels/dataReference.distanceToTarget]") movementTurf = locate(round((currentX+stepX)/PPT),round((currentY+stepY)/PPT),round((currentZ+stepZ)/PPT)) + if(!movementTurf) + dataReference.lifetime = 0 + break + //message_admins("X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") if(movementTurf == currentTurf) canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) @@ -302,7 +166,6 @@ SUBSYSTEM_DEF(bullets) else dataReference.globalX = stepX dataReference.globalY = stepY - dataReference.globalZ = currentZ #ifdef BULLETDEBUG currentTurf.color = COLOR_RED message_admins(" 1 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") @@ -310,14 +173,12 @@ SUBSYSTEM_DEF(bullets) if(movementTurf != currentTurf && movementTurf) projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT - projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT projectile.forceMove(movementTurf) #ifdef BULLETDEBUG movementTurf.color = COLOR_RED colored += movementTurf message_admins("Adjusted for Delta") #endif - dataReference.lifetime = 0 break else canContinue = projectile.scanTurf(currentTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ) @@ -326,7 +187,6 @@ SUBSYSTEM_DEF(bullets) if(canContinue == PROJECTILE_CONTINUE) projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT - projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT dataReference.globalX += stepX dataReference.globalY += stepY dataReference.globalZ += stepZ @@ -338,7 +198,6 @@ SUBSYSTEM_DEF(bullets) else dataReference.globalX = stepX dataReference.globalY = stepY - dataReference.globalZ = currentZ #ifdef BULLETDEBUG message_admins(" 2 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") movementTurf.color = COLOR_RED @@ -347,31 +206,37 @@ SUBSYSTEM_DEF(bullets) if(movementTurf != currentTurf && movementTurf) projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT - projectile.pixel_z -= (movementTurf.z - currentTurf.z) * PPT projectile.forceMove(movementTurf) #ifdef BULLETDEBUG movementTurf.color = COLOR_RED message_admins("Adjusted for Delta") colored += movementTurf #endif - dataReference.lifetime = 0 break else dataReference.globalX = stepX dataReference.globalY = stepY - dataReference.globalZ = currentZ + dataReference.globalZ = stepZ + movementTurf = locate(round(stepX/PPT), round(stepY/PPT), round(currentZ/PPT)) #ifdef BULLETDEBUG currentTurf.color = COLOR_RED message_admins(" 3 New turf, X:[round(dataReference.globalX/32)] | Y:[round(dataReference.globalY/32)] | Z:[round(dataReference.globalZ/32)]") #endif - dataReference.lifetime = 0 + if(movementTurf != currentTurf && movementTurf) + projectile.pixel_x -= (movementTurf.x - currentTurf.x) * PPT + projectile.pixel_y -= (movementTurf.y - currentTurf.y) * PPT + projectile.forceMove(movementTurf) + #ifdef BULLETDEBUG + movementTurf.color = COLOR_RED + message_admins("Adjusted for Delta") + colored += movementTurf + #endif break //message_admins("stepX:[stepX] , stepY : [stepY]") - /* + if(canContinue != PROJECTILE_CONTINUE) - /* var/a = round((stepX)/32) var/b = round((stepY)/32) var/c = round((currentZ)/32) @@ -386,10 +251,9 @@ SUBSYSTEM_DEF(bullets) special.pixel_x = round((stepX))%32 - 16 special.pixel_y = round((stepY))%32 - 16 special.transform = projectile.transform - */ dataReference.lifetime = 0 break - */ + currentX = dataReference.globalX currentY = dataReference.globalY currentZ = dataReference.globalZ @@ -410,8 +274,6 @@ SUBSYSTEM_DEF(bullets) for(var/turf/tata in specialList) tata.color = initial(tata.color) -/datum/controller/subsystem/bullets/fire(resumed) - return realFire() /* if(!resumed) current_queue = bullet_queue.Copy() diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 94fb08e7ef..22cbe88fb3 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -8,6 +8,8 @@ var/broken var/burnt + hitbox = /datum/hitboxDatum/turf/floor + // Flooring data. var/flooring_override diff --git a/code/game/turfs/simulated/floor_attackby.dm b/code/game/turfs/simulated/floor_attackby.dm index b6c734d4d9..a93d7ab4f6 100644 --- a/code/game/turfs/simulated/floor_attackby.dm +++ b/code/game/turfs/simulated/floor_attackby.dm @@ -204,19 +204,10 @@ return 1 /turf/simulated/floor/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) - if(P.dataRef.currentCoords[3] < 0) - if(take_damage(P.get_structure_damage(), BRUTE, FALSE)) - var/turf/theDeep = GetBelow(src) - if(!theDeep) - return PROJECTILE_STOP - return PROJECTILE_CONTINUE - return PROJECTILE_STOP - else if(P.dataRef.currentCoords[3] > LEVEL_MAX) - var/turf/theSkies = GetAbove(src) - if(!theSkies) - return PROJECTILE_STOP - if(theSkies.take_damage(P.get_structure_damage(), BRUTE, FALSE)) - return PROJECTILE_CONTINUE - return PROJECTILE_STOP + var/oldType = type + take_damage(P.get_structure_damage()) + if(type != oldType) + return PROJECTILE_CONTINUE + return PROJECTILE_STOP diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index e4f3d7ec2b..258593e98b 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -11,7 +11,7 @@ blocks_air = 1 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 - hitbox = /datum/hitboxDatum/atom/wall + hitbox = /datum/hitboxDatum/turf/wall var/ricochet_id = 0 var/health = 0 diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index e722b14db8..35b762f8a1 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -421,7 +421,7 @@ reflectchance /= 1.5 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]\'s [name] reflects [attack_text]!")) - P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + P.dataRef.angle += rand(25,50) * sign(rand(-1,1)) P.dataRef.updatePathByAngle() return PROJECTILE_FORCE_MISS_SILENCED // complete projectile permutation diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 508a0b3dfe..e432c5d11a 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -423,7 +423,7 @@ reflectchance /= 2 if(P.starting && prob(reflectchance)) visible_message(SPAN_DANGER("\The [user]'s [src.name] reflects [attack_text]!")) - P.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + P.dataRef.angle += rand(25,50) * sign(rand(-1,1)) P.dataRef.updatePathByAngle() return PROJECTILE_CONTINUE // complete projectile permutation diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index eb23da522e..984b13a86b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -523,7 +523,7 @@ chance = max((chance - B.armor_divisor * 10), 0) if(B.starting && prob(chance)) visible_message(SPAN_DANGER("\The [Proj.name] ricochets off [src]\'s armour!")) - B.dataRef.movementRatios[4] += rand(25,50) * sign(rand(-1,1)) + B.dataRef.angle += rand(25,50) * sign(rand(-1,1)) B.dataRef.updatePathByAngle() return PROJECTILE_CONTINUE // complete projectile permutation ..(Proj) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 7dd6200b2a..1a50668722 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -63,8 +63,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// x3,y3 and x4,y4 are the start and end of the second line /// pStepX and pStepY are pointers for setting the bullets step end /datum/hitboxDatum/proc/lineIntersect(x1,y1,x2,y2,x3,y3,x4,y4, pStepX, pStepY) - var/global/firstRatio - var/global/secondRatio + var/firstRatio + var/secondRatio var/denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)) if(denominator == 0) message_admins("Invalid line for [src], at hitbox coords BulletLine ([x1] | [y1]) ([x2] | [y2]) HitboxLine ([x3] | [y3]) ([x4] | [y4])") @@ -133,8 +133,9 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/atom/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) - var/global/worldX - var/global/worldY + var/worldX + var/worldY + var/worldZ worldX = owner.x worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) @@ -144,12 +145,12 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo worldX += thing.x - owner.x worldY += thing.y - owner.y break - worldX *= 32 - worldY *= 32 + worldX *= PPT + worldY *= PPT + worldX += owner.pixel_x + worldY += owner.pixel_y + worldZ = owner.z * PPT for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) - /// basic AABB but only for the Z-axis. - //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) - // continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) @@ -247,11 +248,12 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/atom/table/intersects(obj/structure/table/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) - var/global/worldX - var/global/worldY - var/global/functionReturn - worldX = owner.x * 32 - worldY = owner.y * 32 + var/worldX + var/worldY + var/worldZ + worldX = owner.x * PPT + owner.pixel_x + worldY = owner.y * PPT + owner.pixel_y + worldZ = owner.z * PPT var/list/boundingList for(var/i = 1 to 4) // 1<<(i-1) , clever way to convert from index to direction @@ -262,8 +264,9 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo // i dont get why owner connections is text.. but it is what it is boundingList = boundingBoxes[text2num(owner.connections[i])+1]["[(1<<(i-1))]"] for(var/list/boundingData in boundingList) - /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + if((boundingData[5]+worldZ) > max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) > max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) return TRUE @@ -277,43 +280,66 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/fixtureLightTube boundingBoxes = list( - LISTNORTH = list(BBOX(4,29,29,32,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), - LISTSOUTH = list(BBOX(4,1,29,4,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), - LISTEAST = list(BBOX(29,4,32,29,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), - LISTWEST = list(BBOX(1,4,4,29,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)) + LISTNORTH = list(BBOX(4,29,29,32,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTSOUTH = list(BBOX(4,1,29,4,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTEAST = list(BBOX(29,4,32,29,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTWEST = list(BBOX(1,4,4,29,LEVEL_HEAD-1,LEVEL_HEAD+1,null)) ) /datum/hitboxDatum/atom/fixtureBulb boundingBoxes = list( - LISTNORTH = list(BBOX(14,25,19,32,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), - LISTSOUTH = list(BBOX(14,1,20,8,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), - LISTEAST = list(BBOX(25,14,32,19,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)), - LISTWEST = list(BBOX(1,14,8,19,LEVEL_HEAD-0.1,LEVEL_HEAD+0.1,null)) + LISTNORTH = list(BBOX(14,25,19,32,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTSOUTH = list(BBOX(14,1,20,8,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTEAST = list(BBOX(25,14,32,19,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTWEST = list(BBOX(1,14,8,19,LEVEL_HEAD-1,LEVEL_HEAD+1,null)) ) /datum/hitboxDatum/atom/fireAlarm boundingBoxes = list( - LISTNORTH = list(BBOX(13,10,20,22,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)), - LISTSOUTH = list(BBOX(13,11,20,23,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)), - LISTEAST = list(BBOX(10,13,22,20,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)), - LISTWEST = list(BBOX(11,13,23,20,LEVEL_CHEST-0.1,LEVEL_CHEST+0.1,null)) + LISTNORTH = list(BBOX(13,10,20,22,LEVEL_CHEST-1,LEVEL_CHEST+1,null)), + LISTSOUTH = list(BBOX(13,11,20,23,LEVEL_CHEST-1,LEVEL_CHEST+1,null)), + LISTEAST = list(BBOX(10,13,22,20,LEVEL_CHEST-1,LEVEL_CHEST+1,null)), + LISTWEST = list(BBOX(11,13,23,20,LEVEL_CHEST-1,LEVEL_CHEST+1,null)) ) /datum/hitboxDatum/atom/airAlarm boundingBoxes = list( - LISTNORTH = list(BBOX(8,10,24,23,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)), - LISTSOUTH = list(BBOX(8,10,24,23,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)), - LISTEAST = list(BBOX(10,8,23,24,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)), - LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-0.1,LEVEL_CHEST+0.2,null)) + LISTNORTH = list(BBOX(8,10,24,23,LEVEL_CHEST-1,LEVEL_CHEST+2,null)), + LISTSOUTH = list(BBOX(8,10,24,23,LEVEL_CHEST-1,LEVEL_CHEST+2,null)), + LISTEAST = list(BBOX(10,8,23,24,LEVEL_CHEST-1,LEVEL_CHEST+2,null)), + LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-1,LEVEL_CHEST+2,null)) ) -/datum/hitboxDatum/atom/wall - boundingBoxes = list( - LISTNORTH = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)), - LISTSOUTH = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)), - LISTEAST = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)), - LISTWEST = list(BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null)) - ) +/datum/hitboxDatum/turf + boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) + +/datum/hitboxDatum/turf/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) + var/worldX + var/worldY + var/worldZ + worldX = owner.x * PPT + worldY = owner.y * PPT + worldZ = owner.z * PPT + //basic AABB but only for the Z-axis. + if((boundingBoxes[5]+worldZ)> max(startZ,startZ+*pStepZ) && (boundingBoxes[6]+worldZ) > max(startZ,startZ+*pStepZ)) + return FALSE + if((boundingBoxes[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingBoxes[6]+worldZ) < min(startZ,startZ+*pStepZ)) + return FALSE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingBoxes[1] + worldX, boundingBoxes[2] + worldY, boundingBoxes[1] + worldX, boundingBoxes[4] + worldY, pStepX, pStepY)) + return TRUE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingBoxes[1] + worldX, boundingBoxes[2] + worldY, boundingBoxes[3] + worldX, boundingBoxes[2] + worldY, pStepX, pStepY)) + return TRUE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingBoxes[1] + worldX, boundingBoxes[4] + worldY, boundingBoxes[3] + worldX, boundingBoxes[4] + worldY, pStepX, pStepY)) + return TRUE + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingBoxes[3] + worldX, boundingBoxes[2] + worldY, boundingBoxes[3] + worldX, boundingBoxes[4] + worldY, pStepX, pStepY)) + return TRUE + return FALSE + +/datum/hitboxDatum/turf/wall + boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) + +/datum/hitboxDatum/turf/floor + boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_TURF,null) /// This checks line by line instead of a box. Less efficient. /datum/hitboxDatum/atom/polygon @@ -325,8 +351,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo ) /datum/hitboxDatum/atom/polygon/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) - var/global/worldX - var/global/worldY + var/worldX + var/worldY worldX = owner.x worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) @@ -338,6 +364,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo break worldX *= 32 worldY *= 32 + worldX += owner.pixel_x + worldY += owner.pixel_y for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) /// basic AABB but only for the Z-axis. //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) @@ -347,22 +375,34 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return FALSE /datum/hitboxDatum/atom/polygon/visualize(atom/owner) - for(var/list/hitbox in boundingBoxes[num2text(owner.dir)]) - var/icon/Icon = icon('icons/hitbox.dmi', "box") - var/length = round(DIST_EUCLIDIAN_2D(hitbox[1], hitbox[2], hitbox[3], hitbox[4])) - Icon.Scale(length, 1) - var/x = (hitbox[3] - hitbox[1]) - var/y = (hitbox[4] - hitbox[2]) - var/angle = ATAN2(y, x) + 180 - var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") - newOverlay.color = RANDOM_RGB - var/matrix/rotation = matrix() - rotation.Turn(angle) - newOverlay.transform = rotation - newOverlay.pixel_x = hitbox[1] - 1 - newOverlay.pixel_y = hitbox[2] - 1 - newOverlay.alpha = 200 - owner.overlays.Add(newOverlay) + /// too hard to get offsets for lines ((( SPCR 2024 + return +/// Indexed by whatever the fuck dirs getHitboxData() returns from the pipe +/datum/hitboxDatum/atom/polygon/atmosphericPipe + boundingBoxes = list( + LISTNORTH = BLINE(16,16,16,32), + LISTSOUTH = BLINE(16,0,16,16), + LISTEAST = BLINE(16,16,32,16), + LISTWEST = BLINE(0,16,16,16) + ) + +/datum/hitboxDatum/atom/polygon/atmosphericPipe/intersects(obj/machinery/atmospherics/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) + var/worldX + var/worldY + var/worldZ + worldX = owner.x * 32 + worldY = owner.y * 32 + var/validDirs = owner.getHitboxData() + for(var/direction in list(NORTH, EAST, WEST, SOUTH)) + if(!(direction & validDirs)) + continue + var/list/boundingData = boundingBoxes["[direction]"] + /// basic AABB but only for the Z-axis. + //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + // continue + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) + return TRUE + return FALSE /// Indexed by icon-state /datum/hitboxDatum/atom/polygon/powerCable @@ -415,8 +455,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo ) /datum/hitboxDatum/atom/polygon/powerCable/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) - var/global/worldX - var/global/worldY + var/worldX + var/worldY worldX = owner.x * 32 worldY = owner.y * 32 for(var/list/boundingData in boundingBoxes[owner.icon_state]) @@ -428,6 +468,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return FALSE /datum/hitboxDatum/atom/polygon/powerCable/visualize(atom/owner) + return + /* for(var/list/hitbox in boundingBoxes[owner.icon_state]) var/icon/Icon = icon('icons/hitbox.dmi', "box") var/length = round(DIST_EUCLIDIAN_2D(hitbox[1], hitbox[2], hitbox[3], hitbox[4])) @@ -444,15 +486,18 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo newOverlay.pixel_y = hitbox[4] - 1 newOverlay.alpha = 200 owner.overlays.Add(newOverlay) + */ /// Hitboxes are ordered based on center distance. /datum/hitboxDatum/atom/ordered /datum/hitboxDatum/atom/ordered/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) - var/global/worldX - var/global/worldY + var/worldX + var/worldY + var/worldZ worldX = owner.x worldY = owner.y + worldZ = owner.z * PPT if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) for(var/atom/thing as anything in owner.attached) if(!(thing.attached[owner] & ATFS_SUPPORTER)) @@ -472,9 +517,10 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo relevantHitboxes[index+1] -= relevantHitboxes[index] index = max(1, index - 1) for(var/list/boundingData in relevantHitboxes) - /// basic AABB but only for the Z-axis. - //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) - // continue + if((boundingData[5]+worldZ)> max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ)> max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) + continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) @@ -518,25 +564,30 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo message_admins("Returned [defZoneToLevel["[perceivedOwner.lying]"][defZone]] for [defZone]") return defZoneToLevel["[perceivedOwner.lying]"][defZone] -/datum/hitboxDatum/mob/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) - . = ..() - var/global/worldX - var/global/worldY - var/global/functionReturn - worldX = owner.x * 32 - worldY = owner.y * 32 +/datum/hitboxDatum/mob/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ, pHitFlags) + var/worldX + var/worldY + var/worldZ + worldX = owner.x * PPT + worldY = owner.y * PPT + worldZ = owner.z * PPT var/mob/living/perceivedOwner = owner for(var/list/boundingData in boundingBoxes["[perceivedOwner.lying]"]["[owner.dir]"]) - /// basic AABB but only for the Z-axis. - if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) + if((boundingData[5]+worldZ)> max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ)> max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) continue - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepY, pStepZ)) + *pHitFlags = boundingData[7] return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepY, pStepZ)) + *pHitFlags = boundingData[7] return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepY, pStepZ)) + *pHitFlags = boundingData[7] return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepY, pStepZ)) + *pHitFlags = boundingData[7] return TRUE return FALSE @@ -585,28 +636,28 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo ), "1" = list( LISTNORTH = list( - BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), - BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 1, HB_LEGS), + BBOX(9,12,11,22, LEVEL_TURF + 1, LEVEL_TURF + 2, HB_GROIN), + BBOX(12,10,22,24, LEVEL_TURF + 2 , LEVEL_TURF + 3, HB_CHESTARMS), + BBOX(23,14,28,20, LEVEL_TURF + 3, LEVEL_TURF + 4, HB_HEAD) ), LISTSOUTH = list( - BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,12,11,22, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2, HB_GROIN), - BBOX(12,10,22,24, LEVEL_TURF + 0.2 , LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(23,14,28,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + BBOX(1,11,9,23, LEVEL_TURF, LEVEL_TURF + 1, HB_LEGS), + BBOX(9,12,11,22, LEVEL_TURF + 1, LEVEL_TURF + 2, HB_GROIN), + BBOX(12,10,22,24, LEVEL_TURF + 2 , LEVEL_TURF + 3, HB_CHESTARMS), + BBOX(23,14,28,20, LEVEL_TURF + 3, LEVEL_TURF + 4, HB_HEAD) ), LISTEAST = list( - BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), - BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 1, HB_LEGS), + BBOX(9,14,12,20, LEVEL_TURF + 1, LEVEL_TURF + 2 , HB_GROIN), + BBOX(11,12,23,21, LEVEL_TURF + 2, LEVEL_TURF + 3, HB_CHESTARMS), + BBOX(24,13,29,20, LEVEL_TURF + 3, LEVEL_TURF + 4, HB_HEAD) ), LISTWEST = list( - BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 0.1, HB_LEGS), - BBOX(9,14,12,20, LEVEL_TURF + 0.1, LEVEL_TURF + 0.2 , HB_GROIN), - BBOX(11,12,23,21, LEVEL_TURF + 0.2, LEVEL_TURF + 0.3, HB_CHESTARMS), - BBOX(24,13,29,20, LEVEL_TURF + 0.3, LEVEL_TURF + 0.4, HB_HEAD) + BBOX(1,14,10,19, LEVEL_TURF, LEVEL_TURF + 1, HB_LEGS), + BBOX(9,14,12,20, LEVEL_TURF + 1, LEVEL_TURF + 2 , HB_GROIN), + BBOX(11,12,23,21, LEVEL_TURF + 2, LEVEL_TURF + 3, HB_CHESTARMS), + BBOX(24,13,29,20, LEVEL_TURF + 3, LEVEL_TURF + 4, HB_HEAD) ) ) ) @@ -623,15 +674,15 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo BP_R_LEG = (LEVEL_TURF + LEVEL_TABLE)/2 ), "1" = list( - BP_EYES = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, - BP_MOUTH = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, - BP_HEAD = (LEVEL_TURF + 0.3 + LEVEL_TURF + 0.4)/2, - BP_CHEST = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, - BP_R_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, - BP_L_ARM = (LEVEL_TURF + 0.2 + LEVEL_TURF + 0.1)/2, - BP_GROIN = (LEVEL_TURF + 0.1 + LEVEL_TURF + 0.2)/2, - BP_L_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2, - BP_R_LEG = (LEVEL_TURF + 0.1 + LEVEL_TURF)/2 + BP_EYES = (LEVEL_TURF + 3 + LEVEL_TURF + 4)/2, + BP_MOUTH = (LEVEL_TURF + 3 + LEVEL_TURF + 4)/2, + BP_HEAD = (LEVEL_TURF + 3 + LEVEL_TURF + 4)/2, + BP_CHEST = (LEVEL_TURF + 2 + LEVEL_TURF + 1)/2, + BP_R_ARM = (LEVEL_TURF + 2 + LEVEL_TURF + 1)/2, + BP_L_ARM = (LEVEL_TURF + 2 + LEVEL_TURF + 1)/2, + BP_GROIN = (LEVEL_TURF + 1 + LEVEL_TURF + 2)/2, + BP_L_LEG = (LEVEL_TURF + 1 + LEVEL_TURF)/2, + BP_R_LEG = (LEVEL_TURF + 1 + LEVEL_TURF)/2 ) ) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index af2e9725ec..356cdd15f1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -109,11 +109,11 @@ GLOBAL_LIST(projectileDamageConstants) // yep , it checks itself , more efficient to handle it here.. if(P == src) return PROJECTILE_CONTINUE - if(!abs(abs(P.dataRef.currentCoords[3]) - abs(dataRef.currentCoords[3])) < 0.1) + if(abs(P.dataRef.globalZ - dataRef.globalZ) > 2) return PROJECTILE_CONTINUE - if(!(abs(abs(P.pixel_x)-abs(pixel_x)) < 2)) + if(abs(P.dataRef.globalX - dataRef.globalX) > 2) return PROJECTILE_CONTINUE - if(!(abs(abs(P.pixel_y)-abs(pixel_y)) < 2)) + if(abs(P.dataRef.globalY - dataRef.globalY) > 2) return PROJECTILE_CONTINUE // congratulations , you have 2 intersecting bullets... return PROJECTILE_STOP @@ -275,14 +275,14 @@ GLOBAL_LIST(projectileDamageConstants) p_y = text2num(mouse_control["icon-y"]) //called to launch a projectile -/obj/item/projectile/proc/launch(atom/target, target_zone, x_offset = 0, y_offset = 0,zOffset = 0, angle_offset = 0, proj_sound, user_recoil = 0) +/obj/item/projectile/proc/launch(atom/target, atom/firer, targetZone, xOffset = 0, yOffset = 0, zOffset = 0, angleOffset = 0, proj_sound, user_recoil = 0) var/turf/curloc = get_turf(src) var/turf/targloc = get_turf(target) if (!istype(targloc) || !istype(curloc)) return TRUE if(targloc == curloc) //Shooting something in the same turf - target.bullet_act(src, target_zone) + target.bullet_act(src, targetZone) on_impact(target) qdel(src) return FALSE @@ -291,19 +291,31 @@ GLOBAL_LIST(projectileDamageConstants) playsound(proj_sound) original = target - def_zone = target_zone + def_zone = targetZone - var/distance = get_dist(curloc, original) - check_hit_zone(distance, user_recoil) - muzzle_effect(effect_transform) - new /datum/bullet_data(src, target_zone, usr, target, list(x_offset, y_offset, target.z), 48,zOffset, angle_offset, 50) - //Process() + muzzle_effect(effect_transform) + var/list/currentCoords = list() + currentCoords.Add(x*PPT+HPPT + pixel_x) + currentCoords.Add(y*PPT+HPPT + pixel_y) + var/zCoords = z * PPT + if(ismob(firer)) + var/mob/living = firer + if(living.lying) + zCoords += LEVEL_LYING + else + zCoords += LEVEL_CHEST - 3 + currentCoords.Add(zCoords) + var/list/targetCoords = list() + targetCoords.Add(target.x*PPT+target.pixel_x+xOffset) + targetCoords.Add(target.y*PPT+target.pixel_y+yOffset) + targetCoords.Add(target.z*PPT+target.pixel_z+zOffset + target.getAimingLevel(firer, targetZone)) + new /datum/bullet_data(src, targetZone, firer, currentCoords, targetCoords, 48, angleOffset, 50) return FALSE //called to launch a projectile from a gun -/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, x_offset=0, y_offset=0, zOffset=0, angle_offset) +/obj/item/projectile/proc/launch_from_gun(atom/target, mob/user, obj/item/gun/launcher, target_zone, xOffset=0, yOffset=0, zOffset=0, angleOffset) if(user == target) //Shooting yourself user.bullet_act(src, target_zone) qdel(src) @@ -330,7 +342,7 @@ GLOBAL_LIST(projectileDamageConstants) firer = user shot_from = launcher.name silenced = launcher.item_flags & SILENT - return launch(target, target_zone, x_offset, y_offset,zOffset, angle_offset, user_recoil = recoil) + return launch(target,user, target_zone, xOffset, yOffset,zOffset, angleOffset, user_recoil = recoil) /obj/item/projectile/proc/istargetloc(mob/living/target_mob) if(target_mob && original) @@ -482,14 +494,43 @@ GLOBAL_LIST(projectileDamageConstants) else return FALSE -/obj/item/projectile/Move(NewLoc, Dir, step_x, step_y, glide_size_override, initiator) - . = ..() - if(NewLoc == dataRef.targetTurf) - message_admins("[src] reached target with a bulletLevel of [dataRef.currentCoords[3]], and a rate of [dataRef.movementRatios[3]]") - /// The lower the index , the higher the priority. If you add new paths to the list , make sure to increase the amount of lists in scanTurf below. #define HittingPrioritiesList list(/mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) +/// We don't care about order since we are just simulating to see wheter we can reach something or not +/proc/simulateBulletScan(turf/scanning, atom/firer, bulletDir, startX, startY, startZ, StepX, StepY, StepZ, passFlags) + . = PROJECTILE_CONTINUE + var/list/hittingList = scanning.contents.Copy() + scanning + for(var/atom/thing as anything in hittingList) + if(thing.atomFlags & AF_IGNORE_ON_BULLETSCAN) + continue + if(thing.hitbox && thing.hitbox.intersects(thing, thing.dir, startX, startY, startZ, &StepX, &StepY, &StepZ)) + if(istype(thing, /obj/structure/window) && passFlags & PASSGLASS) + continue + if(istype(thing, /obj/structure/grille) && passFlags & PASSGRILLE) + continue + if(istype(thing, /obj/structure/table) && passFlags & PASSTABLE) + continue + return PROJECTILE_STOP + if(!length(thing.attached)) + continue + for(var/atom/possibleTarget as anything in thing.attached) + if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) + continue + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(possibleTarget.dir & reverse_dir[bulletDir])) + continue + if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(possibleTarget.dir == reverse_dir[bulletDir])) + continue + if(possibleTarget.hitbox && possibleTarget.hitbox.intersects(thing, thing.dir, startX, startY, startZ, &StepX, &StepY, &StepZ)) + if(istype(thing, /obj/structure/window) && passFlags & PASSGLASS) + continue + if(istype(thing, /obj/structure/grille) && passFlags & PASSGRILLE) + continue + if(istype(thing, /obj/structure/table) && passFlags & PASSTABLE) + continue + return PROJECTILE_STOP + return PROJECTILE_CONTINUE + /obj/item/projectile/proc/scanTurf(turf/scanning, bulletDir, startX, startY, startZ, pStepX, pStepY, pStepZ) . = PROJECTILE_CONTINUE if(atomFlags & AF_VISUAL_MOVE) @@ -531,10 +572,10 @@ GLOBAL_LIST(projectileDamageConstants) if(target == firer) continue /// third slot rezerved for flags passed back by hitbox intersect - var/list/arguments = list(src, def_zone, null, null) - if(target.hitbox && !target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ)) + var/hitFlags = null + if(target.hitbox && !target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ, &hitFlags)) return PROJECTILE_CONTINUE - if(target.bullet_act(arglist(arguments)) & PROJECTILE_STOP) + if(target.bullet_act(src, def_zone, hitFlags) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP @@ -619,8 +660,6 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) - atomFlags |= AF_VISUAL_MOVE - density = FALSE dataRef.lifetime = 0 /obj/effect/bullet_sparks @@ -756,57 +795,58 @@ GLOBAL_LIST(projectileDamageConstants) I.Blend(color) return I -/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, pass_flags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null, mob/targetMob) +/proc/check_trajectory(list/startingCoordinates, list/targetCoordinates, passFlags=PASSTABLE|PASSGLASS|PASSGRILLE, flags=null, atom/target, turfLimit = 8) + var/turf/movementTurf + var/turf/targetTurf = get_turf(target) + var/currentX = startingCoordinates[1] + var/currentY = startingCoordinates[2] + var/currentZ = startingCoordinates[3] + var/turf/currentTurf = locate(round(currentX/PPT), round(currentY/PPT), round(currentZ/PPT)) + var/bulletDir + var/stepX + var/stepY + var/stepZ var/angle = ATAN2(targetCoordinates[2] - startingCoordinates[2], targetCoordinates[1] - startingCoordinates[1]) - message_admins("CT angle : [angle]") - var/xRatio = sin(angle) - var/yRatio = cos(angle) - var/xChange = 0 - var/yChange = 0 - var/tX = 0 - var/tY = 0 - var/turf/check = locate(round(startingCoordinates[1]/32), round(startingCoordinates[2]/32), round(startingCoordinates[3])) - var/turf/targetTurf = locate(round(targetCoordinates[1]/32), round(targetCoordinates[2]/32), round(targetCoordinates[3])) - var/simCoords = list(0,0,0) - while(check != targetTurf) - simCoords[1] += xRatio * 32 - simCoords[2] += yRatio * 32 - xChange = round(abs(simCoords[1])/16) * sign(simCoords[1]) - yChange = round(abs(simCoords[2])/16) * sign(simCoords[2]) - while((xChange || yChange) && (check != targetTurf)) - if(xChange) - tX = abs(xChange)/xChange - if(yChange) - tY = abs(yChange)/yChange - check = locate(check.x + tX, check.y + tY, check.z) - // collision checks - if(!check) - return FALSE - if(check.density) - return FALSE - for(var/atom/movable/object in check.contents) - if(object == targetMob) - return TRUE - if(object.density) - if(istype(object, /obj/structure/window)) - if(!(pass_flags & PASSGLASS)) - return FALSE - else if(istype(object, /obj/structure/table)) - if(!(pass_flags & PASSTABLE)) - return FALSE - else if(istype(object, /obj/structure/grille)) - if(!(pass_flags & PASSGRILLE)) - return FALSE - else if(!istype(object, /obj/structure/railing)) - return FALSE - xChange -= tX - yChange -= tY - simCoords[1] -= 32 * tX - simCoords[2] -= 32 * tY - tX = 0 - tY = 0 - return TRUE - - + var/ratioX = sin(angle) + var/ratioY = cos(angle) + var/ratioZ = (targetCoordinates[3] - startingCoordinates[3])/DIST_EUCLIDIAN_2D(startingCoordinates[1], startingCoordinates[2], targetCoordinates[1], targetCoordinates[2]) + var/traveledTurfs = 0 + #ifdef BULLETDEBUG + var/list/colored = list() + #endif + while(currentTurf != targetTurf && traveledTurfs < turfLimit) + bulletDir = (EAST*(ratioX>0)) | (WEST*(ratioX<0)) | (NORTH*(ratioY>0)) | (SOUTH*(ratioY<0)) | (UP*(ratioZ>0)) | (DOWN*(ratioZ<0)) + stepX = ratioX * HPPT + stepY = ratioY * HPPT + stepZ = ratioZ * HPPT + movementTurf = locate(round((currentX+stepX)/PPT),round((currentY+stepY)/PPT),round((currentZ+stepZ)/PPT)) + if(!movementTurf) + return FALSE + if(movementTurf == currentTurf) + currentX += stepX + currentY += stepY + currentZ += stepZ + continue + if(simulateBulletScan(movementTurf, bulletDir, currentX, currentY, currentZ, &stepX, &stepY, &stepZ, passFlags) == PROJECTILE_STOP) + #ifdef BULLETDEBUG + movementTurf.color = COLOR_RED + colored.Add(movementTurf) + #endif + return movementTurf == targetTurf + currentX += stepX + currentY += stepY + currentZ += stepZ + currentTurf = movementTurf + traveledTurfs++ + #ifdef BULLETDEBUG + movementTurf.color = COLOR_GREEN + colored.Add(movementTurf) + #endif + + #ifdef BULLETDEBUG + if(length(colored)) + QDEL_LIST_IN(colored, 2 SECONDS) + #endif + return FALSE From 429fe4a35eb87a9bee5c8be8cdad3b8e6b708163 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 19:12:11 +0300 Subject: [PATCH 147/171] a --- code/controllers/subsystems/bullets.dm | 33 +++++++++++++------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index dbcb7ce18c..b6f312e9e2 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -236,29 +236,28 @@ SUBSYSTEM_DEF(bullets) //message_admins("stepX:[stepX] , stepY : [stepY]") - if(canContinue != PROJECTILE_CONTINUE) - var/a = round((stepX)/32) - var/b = round((stepY)/32) - var/c = round((currentZ)/32) - var/turf/turfer = locate(a,b,c) - var/atom/movable/special = new /obj/item() - message_admins("stepX:[stepX] , stepY : [stepY]") - message_admins("MovTurf ----- X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") - message_admins("VisTurf ----- X: [a] Y:[b] Z:[c]") - special.forceMove(turfer) - special.icon = projectile.icon - special.icon_state = projectile.icon_state - special.pixel_x = round((stepX))%32 - 16 - special.pixel_y = round((stepY))%32 - 16 - special.transform = projectile.transform - dataReference.lifetime = 0 - break currentX = dataReference.globalX currentY = dataReference.globalY currentZ = dataReference.globalZ var/bulletTime = SSbullets.wait *(dataReference.pixelSpeed / (dataReference.pixelSpeed + pixelTotal)) + if(canContinue != PROJECTILE_CONTINUE) + var/a = round((stepX)/32) + var/b = round((stepY)/32) + var/c = round(currentZ/32) + var/turf/turfer = locate(a,b,c) + var/atom/movable/special = new /obj/item() + message_admins("stepX:[stepX] , stepY : [stepY]") + message_admins("MovTurf ----- X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") + message_admins("VisTurf ----- X: [a] Y:[b] Z:[c]") + special.forceMove(turfer) + special.icon = projectile.icon + special.icon_state = projectile.icon_state + special.pixel_x = round((stepX))%32 - 16 + special.pixel_y = round((stepY))%32 - 16 + special.transform = projectile.transform + animate(projectile, bulletTime, pixel_x = dataReference.globalX%PPT - HPPT, pixel_y = dataReference.globalY%PPT - HPPT, flags = ANIMATION_END_NOW) if(dataReference.lifetime < 1) From 53d24242a05a4687b8d0a0024af75ce59a26bf99 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 20:45:10 +0300 Subject: [PATCH 148/171] THIS NAMING MISTAKE COST ME 4 HOURS I FUCKINGU AHWUAUFHAFA --- code/controllers/subsystems/bullets.dm | 9 ++++++--- code/game/objects/items.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 4 +++- code/modules/projectiles/hitbox_datums.dm | 17 +++++++++-------- code/modules/projectiles/projectile.dm | 1 + 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index b6f312e9e2..993511551f 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -8,7 +8,7 @@ /// it is also more inaccurate the higher you go.. #define MAXPIXELS 16 /// Define this / uncomment it if you want to see bullet debugging data for trajectories & chosen paths. -#define BULLETDEBUG 1 +//#define BULLETDEBUG 1 SUBSYSTEM_DEF(bullets) name = "Bullets" wait = 1 @@ -150,7 +150,7 @@ SUBSYSTEM_DEF(bullets) stepY = dataReference.ratioY * pixelStep stepZ = LERP(dataReference.originalZ, dataReference.targetZ, dataReference.traveledPixels/dataReference.distanceToTarget) - dataReference.globalZ currentTurf = get_turf(projectile) - message_admins("Z : [dataReference.globalZ] with step [stepZ] , Ratio : [dataReference.traveledPixels/dataReference.distanceToTarget]") + //message_admins("Z : [dataReference.globalZ] with step [stepZ] , Ratio : [dataReference.traveledPixels/dataReference.distanceToTarget]") movementTurf = locate(round((currentX+stepX)/PPT),round((currentY+stepY)/PPT),round((currentZ+stepZ)/PPT)) if(!movementTurf) dataReference.lifetime = 0 @@ -242,6 +242,7 @@ SUBSYSTEM_DEF(bullets) currentZ = dataReference.globalZ var/bulletTime = SSbullets.wait *(dataReference.pixelSpeed / (dataReference.pixelSpeed + pixelTotal)) + /* if(canContinue != PROJECTILE_CONTINUE) var/a = round((stepX)/32) var/b = round((stepY)/32) @@ -249,7 +250,8 @@ SUBSYSTEM_DEF(bullets) var/turf/turfer = locate(a,b,c) var/atom/movable/special = new /obj/item() message_admins("stepX:[stepX] , stepY : [stepY]") - message_admins("MovTurf ----- X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") + if(movementTurf) + message_admins("MovTurf ----- X: [movementTurf.x] Y:[movementTurf.y] Z:[movementTurf.z]") message_admins("VisTurf ----- X: [a] Y:[b] Z:[c]") special.forceMove(turfer) special.icon = projectile.icon @@ -257,6 +259,7 @@ SUBSYSTEM_DEF(bullets) special.pixel_x = round((stepX))%32 - 16 special.pixel_y = round((stepY))%32 - 16 special.transform = projectile.transform + */ animate(projectile, bulletTime, pixel_x = dataReference.globalX%PPT - HPPT, pixel_y = dataReference.globalY%PPT - HPPT, flags = ANIMATION_END_NOW) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0b7decc74d..4f5e8119fb 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -405,7 +405,7 @@ GLOBAL_LIST(melleDamagesCache) //For non-projectile attacks this usually means the attack is blocked. //Otherwise should return 0 to indicate that the attack is not affected in any way. /obj/item/proc/handle_shield(mob/user, damage, atom/damage_source = null, mob/attacker = null, def_zone = null, attack_text = "the attack") - return 0 + return PROJECTILE_CONTINUE /obj/item/proc/get_loc_turf() var/atom/L = loc diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 52ab000e70..c04d3fd0f0 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -34,7 +34,7 @@ meteor_act return shield_check else P.on_hit(src, def_zone) - return 2 + return PROJECTILE_STOP //Checking absorb for spawning shrapnel .=..(P , def_zone) @@ -56,6 +56,8 @@ meteor_act return PROJECTILE_CONTINUE else return PROJECTILE_STOP + return PROJECTILE_STOP + diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 1a50668722..9fd92c83a4 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -74,6 +74,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) *pStepX = x1 + firstRatio * (x2 - x1) *pStepY = y1 + firstRatio * (y2 - y1) + message_admins("set x to [*pStepX] , set y to [*pStepY]") return TRUE //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) //message_admins("X-collision : [x1 + firstRatio * (x2 - x1)] Y-collision : [y1 + firstRatio * (y2] - y1)]") @@ -268,13 +269,13 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo continue if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) continue - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE return FALSE @@ -577,16 +578,16 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo continue if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) continue - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepY, pStepZ)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) *pHitFlags = boundingData[7] return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepY, pStepZ)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) *pHitFlags = boundingData[7] return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepY, pStepZ)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) *pHitFlags = boundingData[7] return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepY, pStepZ)) + if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) *pHitFlags = boundingData[7] return TRUE return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 356cdd15f1..0bccfd88bf 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -397,6 +397,7 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/attack_mob(mob/living/target_mob, miss_modifier=0) if(!istype(target_mob)) return + message_admins("Called attack mob") //roll to-hit miss_modifier = 0 From 9b8b1417ff1ac97b4729b00e308cc631be8df700 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 20:46:59 +0300 Subject: [PATCH 149/171] Update hitbox_datums.dm --- code/modules/projectiles/hitbox_datums.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 9fd92c83a4..676de58a73 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -74,7 +74,6 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) *pStepX = x1 + firstRatio * (x2 - x1) *pStepY = y1 + firstRatio * (y2 - y1) - message_admins("set x to [*pStepX] , set y to [*pStepY]") return TRUE //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) //message_admins("X-collision : [x1 + firstRatio * (x2 - x1)] Y-collision : [y1 + firstRatio * (y2] - y1)]") From 338726cf7b46daf69b5ebe3fa289fc0b75feb10e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sun, 11 Aug 2024 21:56:25 +0300 Subject: [PATCH 150/171] A --- code/__DEFINES/__atomFlags.dm | 4 ++++ code/controllers/subsystems/explosions.dm | 2 ++ code/game/objects/explosion.dm | 20 ++++++++++++++++--- code/modules/projectiles/projectile.dm | 13 +++++++----- .../modules/projectiles/projectile/bullets.dm | 4 ---- 5 files changed, 31 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index 3c442dfc08..a1079370ca 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -9,3 +9,7 @@ /// Our hitbox is offset by an attachment. #define AF_HITBOX_OFFSET_BY_ATTACHMENT (1<<5) #define AF_IGNORE_ON_BULLETSCAN (1<<6) +/// Bullets won't be able to hit this one and cause a mid-air collision +#define AF_BULLET_PASS (1<<7) +/// This atom will get ignored by explosions +#define AF_EXPLOSION_IGNORANT (1<<8) diff --git a/code/controllers/subsystems/explosions.dm b/code/controllers/subsystems/explosions.dm index 93c43bc5db..41b2608094 100644 --- a/code/controllers/subsystems/explosions.dm +++ b/code/controllers/subsystems/explosions.dm @@ -209,6 +209,8 @@ SUBSYSTEM_DEF(explosions) /turf/explosion_act(target_power, explosion_handler/handler) var/power_reduction = 0 for(var/atom/movable/thing as anything in contents) + if(thing.atomFlags & AF_EXPLOSION_IGNORANT) + continue power_reduction += thing.explosion_act(target_power, handler) if(!QDELETED(thing) && isobj(thing) && !thing.anchored) thing.throw_at(get_turf_away_from_target_simple(src, islist(handler.epicenter ? handler.epicenter[1] : handler.epicenter)), round(target_power / 30)) diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 51dced3d91..ebfb7d8eb7 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -156,9 +156,10 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount var/list/target_turfs = getcircle(epicenter, range) var/fragments_per_projectile = f_amount/target_turfs.len //This is rounded but only later + var/list/launchedList = list() for(var/turf/T in target_turfs) - //sleep(0) var/obj/item/projectile/bullet/pellet/fragment/P = new f_type(epicenter) + P.PrepareForLaunch() if (!isnull(f_damage)) @@ -167,14 +168,23 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount P.range_step = f_step P.shot_from = epicenter + P.atomFlags = AF_BULLET_PASS|AF_EXPLOSION_IGNORANT - P.launch(T) + P.launch(T, zStart = LEVEL_LYING ,zOffset = rand(LEVEL_LYING, LEVEL_ABOVE)) + launchedList.Add(P) //Some of the fragments will hit mobs in the same turf if (prob(same_turf_hit_chance)) for(var/mob/living/M in epicenter) P.attack_mob(M, 0, 100) + /// 3 ticks should be enough + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(removeFlags), launchedList.Copy(), AF_BULLET_PASS | AF_EXPLOSION_IGNORANT), 3) +/proc/removeFlags(list/targets, flagsToRemove) + for(var/atom/thing as anything in targets) + if(QDELETED(thing)) + continue + thing.atomFlags &= ~flagsToRemove // This is made to mimic the explosion that would happen when something gets pierced by a bullet ( a tank by a anti-armor shell , a armoured car by an .60 AMR, etc, creates flying shrapnel on the other side!) proc/fragment_explosion_angled(atom/epicenter, turf/origin , projectile_type, projectile_amount) @@ -184,9 +194,13 @@ proc/fragment_explosion_angled(atom/epicenter, turf/origin , projectile_type, pr while(proj_amount) proj_amount-- var/obj/item/projectile/pew_thingie = new projectile_type(epicenter) + var/turf/chosen = pick_n_take(hittable_turfs) + var/angle = ATAN2(chosen.y - epicenter.y, chosen.x - epicenter.x) + pew_thingie.pixel_x = 8 * sin(angle) + pew_thingie.pixel_y = 8 * cos(angle) pew_thingie.firer = epicenter pew_thingie.PrepareForLaunch() - pew_thingie.launch(pick(hittable_turfs)) + pew_thingie.launch(chosen) //Generic proc for spread of any projectile type. proc/projectile_explosion(turf/epicenter, range, p_type, p_amount = 10, list/p_damage = list()) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0bccfd88bf..6171ec3964 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -109,11 +109,13 @@ GLOBAL_LIST(projectileDamageConstants) // yep , it checks itself , more efficient to handle it here.. if(P == src) return PROJECTILE_CONTINUE - if(abs(P.dataRef.globalZ - dataRef.globalZ) > 2) + if(atomFlags & AF_BULLET_PASS || P.atomFlags & AF_BULLET_PASS) return PROJECTILE_CONTINUE - if(abs(P.dataRef.globalX - dataRef.globalX) > 2) + if(abs(P.dataRef.globalZ - dataRef.globalZ) > 0.1) return PROJECTILE_CONTINUE - if(abs(P.dataRef.globalY - dataRef.globalY) > 2) + if(abs(P.dataRef.globalX - dataRef.globalX) > 0.1) + return PROJECTILE_CONTINUE + if(abs(P.dataRef.globalY - dataRef.globalY) > 0.1) return PROJECTILE_CONTINUE // congratulations , you have 2 intersecting bullets... return PROJECTILE_STOP @@ -275,7 +277,7 @@ GLOBAL_LIST(projectileDamageConstants) p_y = text2num(mouse_control["icon-y"]) //called to launch a projectile -/obj/item/projectile/proc/launch(atom/target, atom/firer, targetZone, xOffset = 0, yOffset = 0, zOffset = 0, angleOffset = 0, proj_sound, user_recoil = 0) +/obj/item/projectile/proc/launch(atom/target, atom/firer, targetZone, xOffset = 0, yOffset = 0, zOffset = 0, zStart = 0, angleOffset = 0, proj_sound, user_recoil = 0) var/turf/curloc = get_turf(src) var/turf/targloc = get_turf(target) if (!istype(targloc) || !istype(curloc)) @@ -299,7 +301,7 @@ GLOBAL_LIST(projectileDamageConstants) var/list/currentCoords = list() currentCoords.Add(x*PPT+HPPT + pixel_x) currentCoords.Add(y*PPT+HPPT + pixel_y) - var/zCoords = z * PPT + var/zCoords = z * PPT + zStart if(ismob(firer)) var/mob/living = firer if(living.lying) @@ -661,6 +663,7 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) + message_admins("Has hit [A]") dataRef.lifetime = 0 /obj/effect/bullet_sparks diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index c17d6b8eed..2d2f0b475d 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -130,10 +130,6 @@ matter[entry] /= pellets // yet disallows for pellet shrapnel created on impact multiplying the matter count . = ..() -/obj/item/projectile/bullet/pellet/Bumped() - . = ..() - bumped = 0 //can hit all mobs in a tile. pellets is decremented inside attack_mob so this should be fine. - /obj/item/projectile/bullet/pellet/proc/get_pellets(var/distance) var/pellet_loss = round((distance - 1)/range_step) //pellets lost due to distance var/remaining = pellets - pellet_loss From b35fae761a5f0f86bc40e7563e04e17028ec47ee Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 12 Aug 2024 19:13:25 +0300 Subject: [PATCH 151/171] aaa --- code/__DEFINES/misc.dm | 2 +- code/controllers/subsystems/bullets.dm | 2 + code/game/atoms.dm | 6 + code/game/machinery/alarm.dm | 2 +- code/game/objects/explosion.dm | 6 +- .../objects/items/weapons/grenades/frag.dm | 2 +- code/game/turfs/space/space.dm | 6 + code/modules/power/apc.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 216 +++++++++++------- code/modules/projectiles/projectile.dm | 8 +- .../projectile/projectilegrenades.dm | 2 +- 11 files changed, 157 insertions(+), 97 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 95d5128b27..b9f155e5b1 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -369,5 +369,5 @@ #define TTS_SEED_ANNOUNCER "Robot_2" #define BBOX(x1,y1,x2,y2, minLevel, maxLevel, flags) list(x1,y1,x2,y2, minLevel, maxLevel, flags) -#define BLINE(x1,y1,x2,y2) list(x1,y1,x2,y2) +#define BLINE(x1,y1,x2,y2, minLevel, maxLevel, flags) list(x1,y1,x2,y2, minLevel, maxLevel, flags) #define TRIGSLOPE(x1,y1,x2,y2) ((y2-y1)/(x2-x1)) diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 993511551f..167cf6aea5 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -62,7 +62,9 @@ SUBSYSTEM_DEF(bullets) angle = getAngleByPosition() angle += angleOffset distanceToTarget = distStartToFinish2D() + cannotHit.Add(firer) updatePathByAngle() + message_admins("Bullet created with Z-target at [targetZ] and starting at [globalZ]") SSbullets.bullet_queue.Add(src) /datum/bullet_data/proc/redirect(currentX, currentY, currentZ, targetX, targetY, targetZ) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 84194e9484..115d7d42b7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -117,6 +117,12 @@ return /atom/proc/getAimingLevel(atom/shooter,defZone) + if(isliving(shooter)) + var/mob/living/carbon/human/hoomie = shooter + if(!istype(hoomie)) + return HBF_NOLEVEL + else + return hoomie.getAimingLevel(hoomie, hoomie.targeted_organ) return HBF_NOLEVEL /atom/proc/getWeight() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index edb1f38b03..997f0ce5ad 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -129,7 +129,7 @@ var/turf/toAttach = get_step(loc, reverse_dir[dir]) if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE | ATFA_CENTER_ON_SUPPORTER) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index ebfb7d8eb7..e3c6b4b9c4 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -154,7 +154,7 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount if(!epicenter || !f_type) return - var/list/target_turfs = getcircle(epicenter, range) + var/list/target_turfs = orange(range, epicenter) var/fragments_per_projectile = f_amount/target_turfs.len //This is rounded but only later var/list/launchedList = list() for(var/turf/T in target_turfs) @@ -169,8 +169,8 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount P.shot_from = epicenter P.atomFlags = AF_BULLET_PASS|AF_EXPLOSION_IGNORANT - - P.launch(T, zStart = LEVEL_LYING ,zOffset = rand(LEVEL_LYING, LEVEL_ABOVE)) + /// has to be exxagerate due to how far the turfs are + P.launch(T, zStart = LEVEL_LYING ,zOffset = rand(LEVEL_LYING+5, LEVEL_CHEST)) launchedList.Add(P) //Some of the fragments will hit mobs in the same turf diff --git a/code/game/objects/items/weapons/grenades/frag.dm b/code/game/objects/items/weapons/grenades/frag.dm index ddca490e2d..1a96ee332e 100644 --- a/code/game/objects/items/weapons/grenades/frag.dm +++ b/code/game/objects/items/weapons/grenades/frag.dm @@ -13,7 +13,7 @@ var/explosion_falloff = 40 //The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern - var/spread_range = 7 + var/spread_range = 4 /obj/item/grenade/frag/prime() set waitfor = 0 diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 167e96da10..c4ed738c2d 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -18,6 +18,12 @@ update_starlight() ..() +/turf/space/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + return PROJECTILE_CONTINUE + +/turf/space/getAimingLevel(atom/shooter, defZone) + return shooter.getAimingLevel(shooter, defZone) + /turf/space/take_damage(target_power, damage_type) return TRUE diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6be7d7c8ce..f8d337228c 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -224,7 +224,7 @@ var/turf/toAttach = get_step(loc, dir) if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE | ATFA_CENTER_ON_SUPPORTER) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 676de58a73..69a542f685 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -29,6 +29,30 @@ GLOBAL_LIST_EMPTY(hitboxPrototypes) BP_L_ARM = HBF_USEMEDIAN ) +/datum/hitboxDatum/proc/calculateAimingLevels() + var/median + var/volumeSum + var/calculatedVolume = 0 + // dont bother calculating if already defined. + if(length(medianLevels)) + return + medianLevels = list() + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + median = 0 + volumeSum = 0 + for(var/list/boundingBox in boundingBoxes["[direction]"]) + calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) + median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume + volumeSum += calculatedVolume + if(volumeSum == 0) + medianLevels["[direction]"] = LEVEL_TABLE + else + medianLevels["[direction]"] = median / volumeSum + +/datum/hitboxDatum/New() + . = ..() + calculateAimingLevels() + /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 /datum/hitboxDatum/proc/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) @@ -102,27 +126,6 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(16,16,24,24,1,2,null)) ) -/datum/hitboxDatum/atom/New() - . = ..() - var/median - var/volumeSum - var/calculatedVolume = 0 - // dont bother calculating if already defined. - if(length(medianLevels)) - return - medianLevels = list() - for(var/direction in list(NORTH, SOUTH, EAST , WEST)) - median = 0 - volumeSum = 0 - for(var/list/boundingBox in boundingBoxes["[direction]"]) - calculatedVolume = (boundingBox[4] - boundingBox[2]) * (boundingBox[3] - boundingBox[1]) - median += ((boundingBox[5] + boundingBox[6])/2) * calculatedVolume - volumeSum += calculatedVolume - if(volumeSum == 0) - medianLevels["[direction]"] = LEVEL_TABLE - else - medianLevels["[direction]"] = median / volumeSum - /datum/hitboxDatum/atom/getAimingLevel(atom/shooter, defZone, atom/owner) if(defZone == null || (!(defZone in defZoneToLevel))) return medianLevels["[owner.dir]"] @@ -151,6 +154,10 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo worldY += owner.pixel_y worldZ = owner.z * PPT for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) + if((boundingData[5]+worldZ) > max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) > max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) + continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) @@ -335,6 +342,12 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return TRUE return FALSE +/datum/hitboxDatum/turf/getAimingLevel(atom/shooter, defZone, atom/owner) + if(isliving(shooter)) + return shooter.getAimingLevel(shooter, defZone) + else + return ..() + /datum/hitboxDatum/turf/wall boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) @@ -344,15 +357,27 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// This checks line by line instead of a box. Less efficient. /datum/hitboxDatum/atom/polygon boundingBoxes = list( - LISTNORTH = list(BLINE(0,0,32,32)), - LISTSOUTH = list(BLINE(0,0,32,32)), - LISTEAST = list(BLINE(0,0,32,32)), - LISTWEST = list(BLINE(0,0,32,32)) + LISTNORTH = list(BLINE(0,0,32,32, LEVEL_BELOW, LEVEL_ABOVE, null)), + LISTSOUTH = list(BLINE(0,0,32,32, LEVEL_BELOW, LEVEL_ABOVE, null)), + LISTEAST = list(BLINE(0,0,32,32, LEVEL_BELOW, LEVEL_ABOVE, null)), + LISTWEST = list(BLINE(0,0,32,32, LEVEL_BELOW, LEVEL_ABOVE, null)) ) +/datum/hitboxDatum/atom/polygon/calculateAimingLevels() + var/levelSum + if(length(medianLevels)) + return + medianLevels = list() + for(var/direction in list(NORTH, SOUTH, EAST , WEST)) + levelSum = 0 + for(var/list/boundingBox in boundingBoxes["[direction]"]) + levelSum += (boundingBox[5]+boundingBox[6])/2 + medianLevels["[direction]"] = levelSum / length(boundingBoxes["[direction]"]) + /datum/hitboxDatum/atom/polygon/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/worldX var/worldY + var/worldZ worldX = owner.x worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) @@ -362,14 +387,16 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo worldX += thing.x - owner.x worldY += thing.y - owner.y break - worldX *= 32 - worldY *= 32 + worldX *= PPT + worldY *= PPT worldX += owner.pixel_x worldY += owner.pixel_y + worldZ = owner.z * PPT for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) - /// basic AABB but only for the Z-axis. - //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) - // continue + if((boundingData[5]+worldZ) > max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) > max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) + continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE return FALSE @@ -380,26 +407,28 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// Indexed by whatever the fuck dirs getHitboxData() returns from the pipe /datum/hitboxDatum/atom/polygon/atmosphericPipe boundingBoxes = list( - LISTNORTH = BLINE(16,16,16,32), - LISTSOUTH = BLINE(16,0,16,16), - LISTEAST = BLINE(16,16,32,16), - LISTWEST = BLINE(0,16,16,16) + LISTNORTH = BLINE(16,16,16,32, LEVEL_TURF, LEVEL_TURF+5, null), + LISTSOUTH = BLINE(16,0,16,16, LEVEL_TURF, LEVEL_TURF+5, null), + LISTEAST = BLINE(16,16,32,16, LEVEL_TURF, LEVEL_TURF+5, null), + LISTWEST = BLINE(0,16,16,16, LEVEL_TURF, LEVEL_TURF+5, null) ) /datum/hitboxDatum/atom/polygon/atmosphericPipe/intersects(obj/machinery/atmospherics/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/worldX var/worldY var/worldZ - worldX = owner.x * 32 - worldY = owner.y * 32 + worldX = owner.x * PPT + worldY = owner.y * PPT + worldZ = owner.z * PPT var/validDirs = owner.getHitboxData() for(var/direction in list(NORTH, EAST, WEST, SOUTH)) if(!(direction & validDirs)) continue var/list/boundingData = boundingBoxes["[direction]"] - /// basic AABB but only for the Z-axis. - //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) - // continue + if((boundingData[5]+worldZ) > max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) > max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) + continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE return FALSE @@ -407,53 +436,67 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// Indexed by icon-state /datum/hitboxDatum/atom/polygon/powerCable boundingBoxes = list( - "0-1" = list(BLINE(16,16,16,32)), - "0-2" = list(BLINE(16,0,16,16)), - "0-4" = list(BLINE(16,16,32,16)), - "0-5" = list(BLINE(16,16,32,32)), - "0-6" = list(BLINE(32,0,16,16)), - "0-8" = list(BLINE(0,16,16,16)), - "0-9" = list(BLINE(0,32,16,16)), - "0-10" = list(BLINE(0,0,16,16)), - "1-2" = list(BLINE(16,0,16,32)), - "1-4" = list(BLINE(16,32,20,20),BLINE(20,20,32,16)), - "1-5" = list(BLINE(16,32,21,25),BLINE(21,25,32,32)), - "1-6" = list(BLINE(16,32,22,12),BLINE(22,12,32,0)), - "1-8" = list(BLINE(0,16,13,20),BLINE(13,20,16,32)), - "1-9" = list(BLINE(0,32,12,25),BLINE(12,25,16,32)), - "1-10" = list(BLINE(0,0,12,14), BLINE(12,14,16,32)), - "2-4" = list(BLINE(16,0,19,12), BLINE(19,12,32,16)), - "2-5" = list(BLINE(16,0,21,19), BLINE(21,19,32,32)), - "2-6" = list(BLINE(16,0,20,9), BLINE(20,9,32,0)), - "2-8" = list(BLINE(0,16,13,13), BLINE(13,13,16,0)), - "2-9" = list(BLINE(0,32,13,17),BLINE(13,17,16,0)), - "2-10" = list(BLINE(0,0,13,8), BLINE(13,8,16,0)), - "4-5" = list(BLINE(32,16,25,22),BLINE(25,22,32,32)), - "4-6" = list(BLINE(32,0,25,11), BLINE(25,11,32,16)), - "4-8" = list(BLINE(0,16,32,16)), - "4-9" = list(BLINE(0,32,16,20), BLINE(16,20,32,16)), - "4-10" = list(BLINE(0,0,14,12), BLINE(14,12,32,16)), - "5-6" = list(BLINE(31,0,25,16), BLINE(25,16,31,32)), - "5-8" = list(BLINE(0,16,18,21), BLINE(18,21,32,32)), - "5-9" = list(BLINE(0,31,16,25), BLINE(16,25,32,31)), - "5-10" = list(BLINE(0,0,32,32)), - "6-8" = list(BLINE(0,17,17,13),BLINE(17,13,32,0)), - "6-9" = list(BLINE(0,32,32,0)), - "6-10" = list(BLINE(0,1,16,8), BLINE(16,8,32,1)), - "8-9" = list(BLINE(0,16,8,20), BLINE(8,20,2,32)), - "8-10" = list(BLINE(0,16,8,13), BLINE(8,13,0,0)), - "9-10" = list(BLINE(0,0,8,16), BLINE(8,16,0,32)), - "32-1" = list(BLINE(16,18,16,32)), - "32-2" = list(BLINE(16,0,16,16)), - "32-4" = list(BLINE(16,16,32,16)), - "32-5" = list(BLINE(16,16,32,32)), - "32-6" = list(BLINE(16,16,32,0)), - "32-8" = list(BLINE(0,16,16,16)), - "32-9" = list(BLINE(0,32,16,16)), - "32-10" = list(BLINE(0,0,16,16)), - "16-0" = list(BLINE(16,16,16,24)) + "0-1" = list(BLINE(16,16,16,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-2" = list(BLINE(16,0,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-4" = list(BLINE(16,16,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-5" = list(BLINE(16,16,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-6" = list(BLINE(32,0,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-8" = list(BLINE(0,16,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-9" = list(BLINE(0,32,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "0-10" = list(BLINE(0,0,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-2" = list(BLINE(16,0,16,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-4" = list(BLINE(16,32,20,20, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(20,20,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-5" = list(BLINE(16,32,21,25, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(21,25,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-6" = list(BLINE(16,32,22,12, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(22,12,32,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-8" = list(BLINE(0,16,13,20, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(13,20,16,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-9" = list(BLINE(0,32,12,25, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(12,25,16,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "1-10" = list(BLINE(0,0,12,14, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(12,14,16,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "2-4" = list(BLINE(16,0,19,12, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(19,12,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "2-5" = list(BLINE(16,0,21,19, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(21,19,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "2-6" = list(BLINE(16,0,20,9, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(20,9,32,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "2-8" = list(BLINE(0,16,13,13, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(13,13,16,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "2-9" = list(BLINE(0,32,13,17, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(13,17,16,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "2-10" = list(BLINE(0,0,13,8, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(13,8,16,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "4-5" = list(BLINE(32,16,25,22, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(25,22,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "4-6" = list(BLINE(32,0,25,11, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(25,11,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "4-8" = list(BLINE(0,16,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "4-9" = list(BLINE(0,32,16,20, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(16,20,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "4-10" = list(BLINE(0,0,14,12, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(14,12,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "5-6" = list(BLINE(31,0,25,16, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(25,16,31,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "5-8" = list(BLINE(0,16,18,21, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(18,21,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "5-9" = list(BLINE(0,31,16,25, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(16,25,32,31, LEVEL_TURF, LEVEL_TURF+5, null)), + "5-10" = list(BLINE(0,0,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "6-8" = list(BLINE(0,17,17,13, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(17,13,32,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "6-9" = list(BLINE(0,32,32,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "6-10" = list(BLINE(0,1,16,8, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(16,8,32,1, LEVEL_TURF, LEVEL_TURF+5, null)), + "8-9" = list(BLINE(0,16,8,20, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(8,20,2,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "8-10" = list(BLINE(0,16,8,13, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(8,13,0,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "9-10" = list(BLINE(0,0,8,16, LEVEL_TURF, LEVEL_TURF+5, null),BLINE(8,16,0,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-1" = list(BLINE(16,18,16,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-2" = list(BLINE(16,0,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-4" = list(BLINE(16,16,32,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-5" = list(BLINE(16,16,32,32, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-6" = list(BLINE(16,16,32,0, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-8" = list(BLINE(0,16,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-9" = list(BLINE(0,32,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "32-10" = list(BLINE(0,0,16,16, LEVEL_TURF, LEVEL_TURF+5, null)), + "16-0" = list(BLINE(16,16,16,24, LEVEL_TURF, LEVEL_TURF+5, null)) ) +/datum/hitboxDatum/atom/polygon/powerCable/calculateAimingLevels() + var/levelSum + if(length(medianLevels)) + return + medianLevels = list() + for(var/possibleState in boundingBoxes) + levelSum = 0 + for(var/list/boundingBox in boundingBoxes[possibleState]) + levelSum += (boundingBox[5]+boundingBox[6])/2 + medianLevels[possibleState] = levelSum / length(boundingBoxes[possibleState]) + +/datum/hitboxDatum/atom/polygon/powerCable/getAimingLevel(atom/shooter, defZone, atom/owner) + return medianLevels[owner.icon_state] + /datum/hitboxDatum/atom/polygon/powerCable/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/worldX var/worldY @@ -534,8 +577,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/mob -/datum/hitboxDatum/mob/New() - . = ..() +/datum/hitboxDatum/mob/calculateAimingLevels() var/median var/volumeSum var/calculatedVolume = 0 @@ -553,8 +595,6 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo volumeSum += calculatedVolume medianLevels[state]["[direction]"] = median / volumeSum - - /datum/hitboxDatum/mob/getAimingLevel(atom/shooter, defZone, atom/owner) var/mob/living/perceivedOwner = owner if(defZone == null || (!(defZone in defZoneToLevel["[perceivedOwner.lying]"]))) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 6171ec3964..1c4b1dc4af 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -104,6 +104,10 @@ GLOBAL_LIST(projectileDamageConstants) var/datum/bullet_data/dataRef = null +/// Returns 0 , no mod to aiming level +/obj/item/projectile/getAimingLevel(atom/shooter, defZone) + return 0 + /// Fun interaction time - 2 bullets colliding mid air ! SPCR 2024 /obj/item/projectile/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) // yep , it checks itself , more efficient to handle it here.. @@ -663,7 +667,9 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/onBlockingHit(atom/A) on_impact(A) - message_admins("Has hit [A]") + #ifdef BULLETDEBUG + message_admins("[src] Has hit [A]") + #endif dataRef.lifetime = 0 /obj/effect/bullet_sparks diff --git a/code/modules/projectiles/projectile/projectilegrenades.dm b/code/modules/projectiles/projectile/projectilegrenades.dm index 06becb32ab..f0c70f6766 100644 --- a/code/modules/projectiles/projectile/projectilegrenades.dm +++ b/code/modules/projectiles/projectile/projectilegrenades.dm @@ -51,7 +51,7 @@ /obj/item/projectile/bullet/grenade/frag name = "frag shell" - var/range = 7 + var/range = 4 var/f_type = /obj/item/projectile/bullet/pellet/fragment var/f_amount = 30 var/f_damage = 12 From 04b978a2e251234d7793951d16aac703632af7da Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Mon, 12 Aug 2024 21:05:32 +0300 Subject: [PATCH 152/171] more hitboxes & shit --- code/__DEFINES/__atomFlags.dm | 2 -- code/_compile_options.dm | 2 +- code/controllers/subsystems/bullets.dm | 2 ++ code/game/atoms.dm | 4 ++- code/game/objects/effects/effect_system.dm | 1 + code/game/objects/explosion.dm | 9 +++--- code/game/objects/structures.dm | 1 + code/game/objects/structures/lattice.dm | 5 ++++ code/game/objects/structures/low_wall.dm | 1 + code/game/objects/structures/window.dm | 14 ++++++++- code/modules/lighting/lighting_overlay.dm | 4 +-- code/modules/power/apc.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 33 ++++++++++++++++++++++ code/modules/projectiles/projectile.dm | 4 +-- 14 files changed, 67 insertions(+), 16 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index a1079370ca..5265cc6e66 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -9,7 +9,5 @@ /// Our hitbox is offset by an attachment. #define AF_HITBOX_OFFSET_BY_ATTACHMENT (1<<5) #define AF_IGNORE_ON_BULLETSCAN (1<<6) -/// Bullets won't be able to hit this one and cause a mid-air collision -#define AF_BULLET_PASS (1<<7) /// This atom will get ignored by explosions #define AF_EXPLOSION_IGNORANT (1<<8) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 0fa7bab22d..a98c2db2c6 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -48,7 +48,7 @@ // 2 for preloading absolutely everything; #define LOWMEMORYMODE 1 -#define HITBOX_DEBUG 1 +#define BULLETDEBUG 1 //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 diff --git a/code/controllers/subsystems/bullets.dm b/code/controllers/subsystems/bullets.dm index 167cf6aea5..07b49731f8 100644 --- a/code/controllers/subsystems/bullets.dm +++ b/code/controllers/subsystems/bullets.dm @@ -64,7 +64,9 @@ SUBSYSTEM_DEF(bullets) distanceToTarget = distStartToFinish2D() cannotHit.Add(firer) updatePathByAngle() + #ifdef BULLETDEBUG message_admins("Bullet created with Z-target at [targetZ] and starting at [globalZ]") + #endif SSbullets.bullet_queue.Add(src) /datum/bullet_data/proc/redirect(currentX, currentY, currentZ, targetX, targetY, targetZ) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 115d7d42b7..b18b01e276 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -226,7 +226,7 @@ update_plane() hitbox = getHitbox(hitbox) - #ifdef HITBOX_DEBUG + #ifdef BULLETDEBUG if(hitbox) addtimer(CALLBACK(hitbox, TYPE_PROC_REF(/datum/hitboxDatum, visualize), src), 1 MINUTE) #endif @@ -354,7 +354,9 @@ /atom/proc/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) P.on_hit(src, def_zone) + #ifdef BULLETDEBUG message_admins("Bullet stopped by [src]") + #endif . = PROJECTILE_STOP /atom/proc/block_bullet(mob/user, var/obj/item/projectile/damage_source, def_zone) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 3723fd83fc..c427de9ec1 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -6,6 +6,7 @@ would spawn and follow the beaker, even if it is carried or thrown. */ /obj/effect + atomFlags = AF_IGNORE_ON_BULLETSCAN | AF_EXPLOSION_IGNORANT var/random_rotation = 0 //If 1, pick a random cardinal direction. if 2, pick a randomised angle var/random_offset = 0 weight = 0 diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index e3c6b4b9c4..0d11538d5c 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -154,10 +154,9 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount if(!epicenter || !f_type) return - var/list/target_turfs = orange(range, epicenter) - var/fragments_per_projectile = f_amount/target_turfs.len //This is rounded but only later + var/fragments_per_projectile = round(3.14*range*range) var/list/launchedList = list() - for(var/turf/T in target_turfs) + for(var/turf/T in orange(range, epicenter)) var/obj/item/projectile/bullet/pellet/fragment/P = new f_type(epicenter) P.PrepareForLaunch() @@ -168,7 +167,7 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount P.range_step = f_step P.shot_from = epicenter - P.atomFlags = AF_BULLET_PASS|AF_EXPLOSION_IGNORANT + P.atomFlags = AF_IGNORE_ON_BULLETSCAN|AF_EXPLOSION_IGNORANT /// has to be exxagerate due to how far the turfs are P.launch(T, zStart = LEVEL_LYING ,zOffset = rand(LEVEL_LYING+5, LEVEL_CHEST)) launchedList.Add(P) @@ -178,7 +177,7 @@ proc/fragment_explosion(var/turf/epicenter, var/range, var/f_type, var/f_amount for(var/mob/living/M in epicenter) P.attack_mob(M, 0, 100) /// 3 ticks should be enough - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(removeFlags), launchedList.Copy(), AF_BULLET_PASS | AF_EXPLOSION_IGNORANT), 3) + addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(removeFlags), launchedList.Copy(), AF_IGNORE_ON_BULLETSCAN | AF_EXPLOSION_IGNORANT), SSbullets.wait * 3) /proc/removeFlags(list/targets, flagsToRemove) for(var/atom/thing as anything in targets) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 7570b586b3..4918e34810 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -104,6 +104,7 @@ take_damage(P.get_structure_damage()) if(QDELETED(src)) return PROJECTILE_CONTINUE + return PROJECTILE_STOP /obj/structure/New() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index d1cbd6b413..3fd5ab9425 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -10,6 +10,11 @@ layer = LATTICE_LAYER //under pipes // flags = CONDUCT +/// This would be too bad if it was actually always blocking(and not really make sense for players.) SPCR 2024 +/obj/structure/lattice/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) + return PROJECTILE_CONTINUE + + /obj/structure/lattice/Initialize() . = ..() ///// Z-Level Stuff diff --git a/code/game/objects/structures/low_wall.dm b/code/game/objects/structures/low_wall.dm index b15743509f..aa2ed90917 100644 --- a/code/game/objects/structures/low_wall.dm +++ b/code/game/objects/structures/low_wall.dm @@ -24,6 +24,7 @@ anchored = TRUE layer = LOW_WALL_LAYER icon = 'icons/obj/structures/low_wall.dmi' + hitbox = /datum/hitboxDatum/atom/lowWall icon_state = "metal" throwpass = TRUE var/connected = TRUE diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 7fecca0cf3..705ba34974 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -566,6 +566,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) desc = "It looks thin and flimsy. A few knocks with... anything, really should shatter it." icon_state = "window" basestate = "window" + hitbox = /datum/hitboxDatum/atom/window/directional glasstype = /obj/item/stack/material/glass maximal_heat = T0C + 200 // Was 100. Spaceship windows surely surpass coffee pots. damage_per_fire_tick = 3 // Was 2. Made weaker than rglass per tick. @@ -576,6 +577,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) dir = SOUTH|EAST icon = 'icons/obj/structures/windows.dmi' icon_state = "fwindow" + hitbox = /datum/hitboxDatum/turf/window alpha = 120 maxHealth = 40 resistance = RESISTANCE_FLIMSY @@ -585,6 +587,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) name = "plasma window" desc = "A borosilicate alloy window. It seems to be quite strong." + hitbox = /datum/hitboxDatum/atom/window/directional icon_state = "plasmawindow" shardtype = /obj/item/material/shard/plasma glasstype = /obj/item/stack/material/glass/plasmaglass @@ -597,6 +600,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) dir = SOUTH|EAST icon = 'icons/obj/structures/windows.dmi' basestate = "pwindow" + hitbox = /datum/hitboxDatum/turf/window icon_state = "plasmawindow_mask" alpha = 150 maxHealth = 200 @@ -608,6 +612,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) desc = "It looks rather strong. Might take a few good hits to shatter it." icon_state = "rwindow" basestate = "rwindow" + hitbox = /datum/hitboxDatum/atom/window/directional reinf = 1 maximal_heat = T0C + 750 // Fused quartz. damage_per_fire_tick = 2 @@ -627,6 +632,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) dir = SOUTH|EAST icon = 'icons/obj/structures/windows.dmi' icon_state = "fwindow" + hitbox = /datum/hitboxDatum/turf/window alpha = 150 maxHealth = 80 resistance = RESISTANCE_FRAGILE @@ -637,6 +643,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) desc = "A borosilicate alloy window, with rods supporting it. It seems to be very strong." basestate = "plasmarwindow" icon_state = "plasmarwindow" + hitbox = /datum/hitboxDatum/atom/window/directional shardtype = /obj/item/material/shard/plasma glasstype = /obj/item/stack/material/glass/plasmarglass maximal_heat = T0C + 5453 // Safe use temperature at 6000 kelvin. @@ -646,6 +653,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) /obj/structure/window/reinforced/plasma/full dir = SOUTH|EAST + hitbox = /datum/hitboxDatum/turf/window icon = 'icons/obj/structures/windows.dmi' basestate = "rpwindow" icon_state = "plasmarwindow_mask" @@ -658,12 +666,14 @@ proc/end_grab_onto(mob/living/user, mob/living/target) name = "tinted window" desc = "It looks rather strong and opaque. Might take a few good hits to shatter it." icon_state = "twindow" + hitbox = /datum/hitboxDatum/atom/window/directional basestate = "twindow" opacity = 1 /obj/structure/window/reinforced/tinted/frosted name = "frosted window" desc = "It looks rather strong and frosted over. Looks like it might take a few less hits then a normal reinforced window." + hitbox = /datum/hitboxDatum/atom/window/directional icon_state = "fwindow" basestate = "fwindow" @@ -673,6 +683,7 @@ proc/end_grab_onto(mob/living/user, mob/living/target) icon = 'icons/obj/podwindows.dmi' icon_state = "window" basestate = "window" + hitbox = /datum/hitboxDatum/turf/window maxHealth = 300 resistance = RESISTANCE_IMPROVED reinf = 1 @@ -681,12 +692,13 @@ proc/end_grab_onto(mob/living/user, mob/living/target) /obj/structure/window/reinforced/polarized name = "electrochromic window" - + hitbox = /datum/hitboxDatum/atom/window/directional desc = "Adjusts its tint with voltage. Might take a few good hits to shatter it." var/id /obj/structure/window/reinforced/polarized/full dir = SOUTH|EAST + hitbox = /datum/hitboxDatum/turf/window icon = 'icons/obj/structures/windows.dmi' icon_state = "fwindow" flags = null diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 3cb0556a0e..46fdc0aee7 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -15,7 +15,7 @@ weight = 0 - atomFlags = AF_IGNORE_ON_BULLETSCAN + atomFlags = AF_IGNORE_ON_BULLETSCAN | AF_EXPLOSION_IGNORANT var/needs_update = FALSE @@ -23,8 +23,6 @@ /atom/movable/lighting_overlay/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) return PROJECTILE_CONTINUE - - /atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE) . = ..() verbs.Cut() diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index f8d337228c..87cd79e7e9 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -71,6 +71,7 @@ anchored = TRUE use_power = NO_POWER_USE req_access = list(access_engine_equip) + //hitbox = /datum/hitboxDatum/atom/apc var/need_sound var/area/area var/areastring diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 69a542f685..37e534d784 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -317,9 +317,38 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-1,LEVEL_CHEST+2,null)) ) +/datum/hitboxDatum/atom/window/directional + boundingBoxes = list( + LISTNORTH = list(BBOX(1,26,32,32, LEVEL_TURF, LEVEL_ABOVE, null)), + LISTSOUTH = list(BBOX(1,1,32,7, LEVEL_TURF, LEVEL_ABOVE, null)), + LISTEAST = list(BBOX(26,1,32,32, LEVEL_TURF, LEVEL_ABOVE, null)), + LISTWEST = list(BBOX(1,1,7,32, LEVEL_TURF, LEVEL_ABOVE, null)) + ) + +/datum/hitboxDatum/atom/lowWall + boundingBoxes = list( + LISTNORTH = list(BBOX(0,0,32,32, LEVEL_TURF, LEVEL_LOWWALL, null)), + LISTSOUTH = list(BBOX(0,0,32,32, LEVEL_TURF, LEVEL_LOWWALL, null)), + LISTEAST = list(BBOX(0,0,32,32, LEVEL_TURF, LEVEL_LOWWALL, null)), + LISTWEST = list(BBOX(0,0,32,32, LEVEL_TURF, LEVEL_LOWWALL, null)) + ) + /datum/hitboxDatum/turf boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) +/datum/hitboxDatum/turf/visualize(atom/owner) + var/list/hitbox = boundingBoxes + var/icon/Icon = icon('icons/hitbox.dmi', "box") + var/multX = hitbox[3] - hitbox[1] + 1 + var/multY = hitbox[4] - hitbox[2] + 1 + Icon.Scale(multX, multY) + var/mutable_appearance/newOverlay = mutable_appearance(Icon, "hitbox") + newOverlay.color = RANDOM_RGB + newOverlay.pixel_x = hitbox[1] - 1 + newOverlay.pixel_y = hitbox[2] - 1 + newOverlay.alpha = 200 + owner.overlays.Add(newOverlay) + /datum/hitboxDatum/turf/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/worldX var/worldY @@ -354,6 +383,9 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/turf/floor boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_TURF,null) +/datum/hitboxDatum/turf/window + boundingBoxes = BBOX(0,0,32,32, LEVEL_LOWWALL, LEVEL_ABOVE, null) + /// This checks line by line instead of a box. Less efficient. /datum/hitboxDatum/atom/polygon boundingBoxes = list( @@ -404,6 +436,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/polygon/visualize(atom/owner) /// too hard to get offsets for lines ((( SPCR 2024 return + /// Indexed by whatever the fuck dirs getHitboxData() returns from the pipe /datum/hitboxDatum/atom/polygon/atmosphericPipe boundingBoxes = list( diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 1c4b1dc4af..63f6bb5246 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -113,8 +113,6 @@ GLOBAL_LIST(projectileDamageConstants) // yep , it checks itself , more efficient to handle it here.. if(P == src) return PROJECTILE_CONTINUE - if(atomFlags & AF_BULLET_PASS || P.atomFlags & AF_BULLET_PASS) - return PROJECTILE_CONTINUE if(abs(P.dataRef.globalZ - dataRef.globalZ) > 0.1) return PROJECTILE_CONTINUE if(abs(P.dataRef.globalX - dataRef.globalX) > 0.1) @@ -581,7 +579,7 @@ GLOBAL_LIST(projectileDamageConstants) /// third slot rezerved for flags passed back by hitbox intersect var/hitFlags = null if(target.hitbox && !target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ, &hitFlags)) - return PROJECTILE_CONTINUE + continue if(target.bullet_act(src, def_zone, hitFlags) & PROJECTILE_STOP) onBlockingHit(target) return PROJECTILE_STOP From 7a99caeeb3f0361d499e91e00cfcc7f4afe79078 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 13 Aug 2024 08:24:01 +0300 Subject: [PATCH 153/171] THE changes. --- code/__DEFINES/__atomFlags.dm | 2 + code/game/atoms.dm | 3 + code/game/machinery/alarm.dm | 4 +- code/game/objects/structures.dm | 1 - code/game/objects/structures/window.dm | 16 - code/game/turfs/space/space.dm | 4 +- code/game/turfs/turf.dm | 2 + code/modules/power/apc.dm | 14 +- code/modules/projectiles/hitbox_datums.dm | 22 +- code/modules/reagents/reagent_dispenser.dm | 4 +- maps/CEVEris/_CEV_Eris.dmm | 314 +++++++++--------- maps/encounters/prisonhulk/prisonhulk.dmm | 2 +- maps/submaps/cave_pois/crashed_pod.dmm | 2 +- .../crashed_pod/crashed_pod.dmm | 2 +- .../ec_old_crash/ec_old_crash.dmm | 6 +- .../planetary_ruins/hydrobase/hydrobase.dmm | 22 +- .../planetary_ruins/playablecolony/colony.dmm | 80 ++--- maps/testmap/test_map.dmm | 6 +- 18 files changed, 252 insertions(+), 254 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index 5265cc6e66..7e3ffc9ecb 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -11,3 +11,5 @@ #define AF_IGNORE_ON_BULLETSCAN (1<<6) /// This atom will get ignored by explosions #define AF_EXPLOSION_IGNORANT (1<<8) +/// Uses the aiming level for shooting at the shooter instead. +#define AF_PASS_AIMING_LEVEL (1<<9) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index b18b01e276..2f20b49592 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -108,6 +108,9 @@ return /atom/getAimingLevel(atom/shooter, defZone) + if(atomFlags & AF_PASS_AIMING_LEVEL) + if(isliving(shooter)) + return shooter.getAimingLevel(shooter, defZone) if(hitbox) return hitbox.getAimingLevel(shooter, defZone, src) else diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 997f0ce5ad..19809987a7 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -129,7 +129,7 @@ var/turf/toAttach = get_step(loc, reverse_dir[dir]) if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE | ATFA_CENTER_ON_SUPPORTER) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! @@ -1221,7 +1221,7 @@ FIRE ALARM var/turf/toAttach = get_step(loc, reverse_dir[dir]) if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE | ATFA_CENTER_ON_SUPPORTER) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 4918e34810..99512870be 100755 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -106,7 +106,6 @@ return PROJECTILE_CONTINUE return PROJECTILE_STOP - /obj/structure/New() ..() if(climbable) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 705ba34974..be6cf72c76 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -147,22 +147,6 @@ qdel(src) return - -/obj/structure/window/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) - - . = PROJECTILE_CONTINUE - var/targetzone = check_zone(Proj.def_zone) - if(targetzone in list(BP_CHEST, BP_HEAD, BP_L_ARM, BP_R_ARM)) - var/proj_damage = Proj.get_structure_damage() - if(proj_damage) - hit(proj_damage) - ..() - if(!QDELETED(src)) - return PROJECTILE_STOP - - return PROJECTILE_STOP - - //TODO: Make full windows a separate type of window. //Once a full window, it will always be a full window, so there's no point //having the same type for both. diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index c4ed738c2d..c0f80e02a0 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -3,6 +3,7 @@ name = "\proper space" icon_state = "0" dynamic_lighting = 0 + atomFlags = AF_PASS_AIMING_LEVEL plane = PLANE_SPACE layer = SPACE_LAYER @@ -21,9 +22,6 @@ /turf/space/bullet_act(obj/item/projectile/P, def_zone, hitboxFlags) return PROJECTILE_CONTINUE -/turf/space/getAimingLevel(atom/shooter, defZone) - return shooter.getAimingLevel(shooter, defZone) - /turf/space/take_damage(target_power, damage_type) return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index f12820e193..dc1968016b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -14,6 +14,8 @@ var/footstep_type + atomFlags = AF_PASS_AIMING_LEVEL + //Properties for airtight tiles (/wall) var/thermal_conductivity = 0.05 var/heat_capacity = 1 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 87cd79e7e9..df10297528 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -71,7 +71,7 @@ anchored = TRUE use_power = NO_POWER_USE req_access = list(access_engine_equip) - //hitbox = /datum/hitboxDatum/atom/apc + hitbox = /datum/hitboxDatum/atom/areaPowerController var/need_sound var/area/area var/areastring @@ -183,13 +183,13 @@ /obj/machinery/power/apc/set_dir() . = ..() switch(dir) - if(NORTH) - pixel_y = 28 if(SOUTH) + pixel_y = 28 + if(NORTH) pixel_y = -28 - if(EAST) - pixel_x = 28 if(WEST) + pixel_x = 28 + if(EAST) pixel_x = -28 @@ -222,10 +222,10 @@ log_mapping("Duplicate APC created at [AREACOORD(src)]. Original at [AREACOORD(area.apc)].") area.apc = src - var/turf/toAttach = get_step(loc, dir) + var/turf/toAttach = get_step(loc, reverse_dir[dir]) if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE | ATFA_CENTER_ON_SUPPORTER) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 37e534d784..17032cf53b 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -317,6 +317,14 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-1,LEVEL_CHEST+2,null)) ) +/datum/hitboxDatum/atom/areaPowerController + boundingBoxes = list( + LISTNORTH = list(BBOX(8,10,24,23,LEVEL_CHEST-1,LEVEL_CHEST+2,null)), + LISTSOUTH = list(BBOX(8,10,24,23,LEVEL_CHEST-1,LEVEL_CHEST+2,null)), + LISTEAST = list(BBOX(10,8,23,24,LEVEL_CHEST-1,LEVEL_CHEST+2,null)), + LISTWEST = list(BBOX(10,9,23,25,LEVEL_CHEST-1,LEVEL_CHEST+2,null)) + ) + /datum/hitboxDatum/atom/window/directional boundingBoxes = list( LISTNORTH = list(BBOX(1,26,32,32, LEVEL_TURF, LEVEL_ABOVE, null)), @@ -333,6 +341,14 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(0,0,32,32, LEVEL_TURF, LEVEL_LOWWALL, null)) ) +/datum/hitboxDatum/atom/reagentTank + boundingBoxes = list( + LISTNORTH = list(BBOX(5,4,31,28, LEVEL_TURF, LEVEL_TABLE, null)), + LISTSOUTH = list(BBOX(5,4,31,28, LEVEL_TURF, LEVEL_TABLE, null)), + LISTEAST = list(BBOX(5,4,31,28, LEVEL_TURF, LEVEL_TABLE, null)), + LISTWEST = list(BBOX(5,4,31,28, LEVEL_TURF, LEVEL_TABLE, null)) + ) + /datum/hitboxDatum/turf boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) @@ -371,12 +387,6 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return TRUE return FALSE -/datum/hitboxDatum/turf/getAimingLevel(atom/shooter, defZone, atom/owner) - if(isliving(shooter)) - return shooter.getAimingLevel(shooter, defZone) - else - return ..() - /datum/hitboxDatum/turf/wall boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 3281ef02a2..cb02089554 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -80,6 +80,7 @@ name = "water tank" desc = "A water tank. It is used to store high amounts of water." icon_state = "watertank" + hitbox = /datum/hitboxDatum/atom/reagentTank amount_per_transfer_from_this = 10 volume = 1500 starting_reagent = "water" @@ -108,6 +109,7 @@ desc = "A tank full of industrial welding fuel. Do not consume." description_antag = "Can have an assembly with a igniter attached for detonation upon a trigger. Can also use a screwdriver to leak fuel when dragged" icon = 'icons/obj/objects.dmi' + hitbox = /datum/hitboxDatum/atom/reagentTank icon_state = "weldtank" amount_per_transfer_from_this = 10 volume = 500 @@ -197,8 +199,6 @@ message_admins("[key_name_admin(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]) (JMP).") log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).") - if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) - explode() /obj/structure/reagent_dispensers/fueltank/explosion_act(target_power, explosion_handler/handle) if(target_power > health) explode() diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index c0e57f4540..262c4b84a7 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -86,7 +86,7 @@ /obj/item/target, /obj/item/target, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -345,7 +345,7 @@ "abb" = ( /obj/structure/closet/wardrobe/sec, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -773,7 +773,7 @@ "acc" = ( /obj/structure/closet/wardrobe/color/orange, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -918,7 +918,7 @@ /area/eris/security/disposal) "acu" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -2645,7 +2645,7 @@ /area/eris/security/exerooms) "agz" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -2881,7 +2881,7 @@ icon_state = "pipe-c" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -4367,7 +4367,7 @@ /area/eris/security/exerooms) "akn" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -5116,7 +5116,7 @@ /area/eris/security/maintpost) "amg" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -6460,7 +6460,7 @@ /area/eris/crew_quarters/sleep) "apz" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -6721,7 +6721,7 @@ /area/eris/crew_quarters/bar) "aqb" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -6929,7 +6929,7 @@ "aqA" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -7028,7 +7028,7 @@ /area/eris/hallway/side/eschangarb) "aqJ" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -7613,7 +7613,7 @@ /area/eris/hallway/side/eschangarb) "arV" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -8280,7 +8280,7 @@ /area/eris/maintenance/section3deck5starboard) "atq" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -9055,7 +9055,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -9073,7 +9073,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -9242,7 +9242,7 @@ "awc" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -10937,7 +10937,7 @@ /area/eris/maintenance/disposal) "aAC" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -11449,7 +11449,7 @@ /area/eris/crew_quarters/toilet/medbay) "aBQ" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -11934,7 +11934,7 @@ /area/eris/maintenance/section4deck5port) "aDh" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -12529,7 +12529,7 @@ /area/eris/maintenance/section4deck5port) "aEF" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -13100,7 +13100,7 @@ dir = 8 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -16187,7 +16187,7 @@ /area/eris/engineering/wastingroom) "aOG" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -16320,7 +16320,7 @@ pixel_y = -22 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -16597,7 +16597,7 @@ /area/eris/engineering/atmos/storage) "aPH" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -17345,7 +17345,7 @@ /area/eris/security/main) "aRi" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -17627,7 +17627,7 @@ /area/eris/security/barracks) "aRQ" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -17926,7 +17926,7 @@ /area/eris/security/warden) "aSz" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -18729,7 +18729,7 @@ /area/eris/security/prisoncells) "aUs" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -19886,7 +19886,7 @@ /area/eris/maintenance/section2deck4port) "aWU" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -20113,7 +20113,7 @@ /area/eris/engineering/atmos) "aXy" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -22103,7 +22103,7 @@ "bbB" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -23690,7 +23690,7 @@ /area/eris/maintenance/substation/section1) "bez" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -23938,7 +23938,7 @@ /area/eris/maintenance/substation/section2) "bfc" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -24148,7 +24148,7 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -24542,7 +24542,7 @@ /area/eris/maintenance/section2deck4starboard) "bgD" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -25569,7 +25569,7 @@ dir = 8 }, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -25995,7 +25995,7 @@ /area/eris/rnd/robotics) "bjW" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -26778,7 +26778,7 @@ /area/eris/crew_quarters/librarybackroom) "blC" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -27863,7 +27863,7 @@ /area/eris/medical/morgue) "bnW" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -28056,7 +28056,7 @@ /area/eris/maintenance/section3deck1central) "box" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -30290,7 +30290,7 @@ /area/eris/command/teleporter) "bux" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -31058,7 +31058,7 @@ /area/eris/hallway/main/section1) "bws" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -31866,7 +31866,7 @@ /area/eris/engineering/drone_fabrication) "byc" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -32341,7 +32341,7 @@ dir = 8 }, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -32640,7 +32640,7 @@ /area/eris/engineering/atmos/storage) "bzP" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -32864,7 +32864,7 @@ /area/eris/maintenance/sorter) "bAt" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -33133,7 +33133,7 @@ /area/eris/maintenance/section3deck1central) "bBb" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -34095,7 +34095,7 @@ /area/eris/rnd/docking) "bDK" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -35186,7 +35186,7 @@ /area/eris/security/lobby) "bGf" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -35287,7 +35287,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -35912,7 +35912,7 @@ /area/eris/hallway/main/section4) "bHG" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -37136,7 +37136,7 @@ /area/eris/maintenance/section4deck4port) "bKj" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -38050,7 +38050,7 @@ /area/eris/maintenance/section4deck4port) "bMi" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -39358,7 +39358,7 @@ /area/eris/engineering/construction) "bOZ" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -40148,7 +40148,7 @@ /area/eris/maintenance/section4deck4port) "bQR" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -40193,7 +40193,7 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -40523,7 +40523,7 @@ "bRW" = ( /obj/structure/closet/wardrobe/color/mixed, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -40757,7 +40757,7 @@ "bSC" = ( /obj/structure/closet/firecloset, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -41266,7 +41266,7 @@ "bTP" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -41935,7 +41935,7 @@ /area/eris/hallway/main/section1) "bVD" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -42181,7 +42181,7 @@ /area/eris/medical/psych) "bWm" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -44212,7 +44212,7 @@ /area/eris/command/fo) "cbz" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -44834,7 +44834,7 @@ /area/eris/maintenance/section3deck4central) "cda" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -47069,7 +47069,7 @@ /area/eris/rnd/server) "chX" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -48282,7 +48282,7 @@ /area/eris/medical/medbay) "clh" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -48410,7 +48410,7 @@ /area/eris/rnd/mixing) "clA" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -49660,7 +49660,7 @@ pixel_y = 4 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -49685,7 +49685,7 @@ /area/eris/maintenance/section3deck4central) "coO" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -50450,7 +50450,7 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -51447,7 +51447,7 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -51584,7 +51584,7 @@ /area/eris/quartermaster/storage) "ctT" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -51852,7 +51852,7 @@ /area/eris/command/meo) "cuJ" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -51942,7 +51942,7 @@ /area/eris/medical/medbreak) "cuV" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -52888,7 +52888,7 @@ "cxr" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -53961,7 +53961,7 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -54019,7 +54019,7 @@ /obj/structure/table/reinforced, /obj/item/storage/box/donut, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -54217,7 +54217,7 @@ /obj/structure/table/standard, /obj/item/device/radio/off, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -54236,7 +54236,7 @@ "cAG" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -56573,7 +56573,7 @@ /area/eris/maintenance/section3deck4central) "cGp" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -56631,7 +56631,7 @@ "cGu" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -57266,7 +57266,7 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -57690,7 +57690,7 @@ "cJj" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -58762,7 +58762,7 @@ "cLS" = ( /obj/structure/disposalpipe/segment, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -61534,7 +61534,7 @@ pixel_y = 30 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -62360,7 +62360,7 @@ /area/space) "cWe" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -62401,7 +62401,7 @@ /area/eris/rnd/xenobiology) "cWi" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -63129,7 +63129,7 @@ "cXU" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -63167,7 +63167,7 @@ /area/eris/maintenance/section2deck2port) "cXY" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -63195,7 +63195,7 @@ /area/eris/maintenance/section3deck3starboard) "cYa" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -63645,7 +63645,7 @@ /area/shuttle/mining/station) "cYY" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -64273,7 +64273,7 @@ /obj/item/clothing/mask/muzzle, /obj/item/clothing/mask/muzzle, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -65596,7 +65596,7 @@ /area/eris/command/bridgebar) "ddF" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -66055,7 +66055,7 @@ /area/eris/command/captain) "deD" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -66737,7 +66737,7 @@ /area/eris/maintenance/section3deck4starboard) "dgi" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -66822,7 +66822,7 @@ /area/eris/rnd/anomal) "dgr" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -67246,7 +67246,7 @@ /area/eris/command/fo/quarters) "dhe" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -68474,7 +68474,7 @@ /area/eris/rnd/research) "djW" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -68942,7 +68942,7 @@ "dla" = ( /obj/structure/table/woodentable, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -69464,7 +69464,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -70020,7 +70020,7 @@ /area/eris/medical/reception) "dnp" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -70431,7 +70431,7 @@ /area/eris/maintenance/section2deck2port) "dok" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -72213,7 +72213,7 @@ "dsE" = ( /obj/structure/closet/secure_closet/engineering_electrical, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -72285,7 +72285,7 @@ /obj/structure/table/standard, /obj/structure/cable/green, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -72783,7 +72783,7 @@ /area/eris/maintenance/section3deck4starboard) "dua" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -72848,7 +72848,7 @@ /area/eris/security/checkpoint/medical) "dui" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -73070,7 +73070,7 @@ "duF" = ( /obj/structure/closet/secure_closet/personal/doctor, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -73199,7 +73199,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -74257,7 +74257,7 @@ /area/eris/command/bridge) "dxC" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -75209,7 +75209,7 @@ "dzV" = ( /obj/structure/table/standard, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -75564,7 +75564,7 @@ /obj/structure/table/standard, /obj/item/device/eftpos, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -75796,7 +75796,7 @@ /area/eris/medical/medbay) "dBp" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -76108,7 +76108,7 @@ /obj/structure/bed/padded, /obj/item/bedsheet/medical, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -76600,7 +76600,7 @@ /area/eris/maintenance/section1deck1central) "dDd" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -76714,7 +76714,7 @@ "dDu" = ( /obj/structure/catwalk, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -77855,7 +77855,7 @@ /area/eris/maintenance/section1deck5central) "dGn" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -77957,7 +77957,7 @@ /area/eris/hallway/main/section3) "dGz" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -77998,7 +77998,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -78418,7 +78418,7 @@ /area/eris/maintenance/section3deck4port) "dHE" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -81003,7 +81003,7 @@ "dOs" = ( /obj/structure/closet/secure_closet/reinforced/engineering_chief, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -81443,7 +81443,7 @@ /obj/item/stack/cable_coil, /obj/item/device/radio, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -82012,7 +82012,7 @@ "dRn" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -83715,7 +83715,7 @@ /area/eris/medical/chemstor) "dVO" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -84087,7 +84087,7 @@ dir = 1 }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -85205,7 +85205,7 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -85601,7 +85601,7 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -85985,7 +85985,7 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -86015,7 +86015,7 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -86584,7 +86584,7 @@ /area/eris/rnd/misc_lab) "ecZ" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -87182,7 +87182,7 @@ /area/eris/rnd/anomal) "eeu" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -88210,7 +88210,7 @@ /obj/structure/table/standard, /obj/item/device/lighting/toggleable/lamp, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -88996,7 +88996,7 @@ "eiP" = ( /obj/machinery/portable_atmospherics/canister/air, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -89110,7 +89110,7 @@ /area/eris/maintenance/section4deck1central) "ejb" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -90692,7 +90692,7 @@ /area/eris/hallway/side/section3deck2port) "emX" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -90829,7 +90829,7 @@ "enq" = ( /obj/structure/table/standard, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -91875,7 +91875,7 @@ /area/eris/engineering/propulsion/left) "eqc" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -92527,7 +92527,7 @@ /area/eris/crew_quarters/clownoffice) "erz" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -92942,7 +92942,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -94149,7 +94149,7 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -96856,7 +96856,7 @@ dir = 10 }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -96965,7 +96965,7 @@ /area/eris/engineering/gravity_generator) "eBC" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -97832,7 +97832,7 @@ "eDG" = ( /obj/structure/closet/secure_closet/medicine, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -98933,7 +98933,7 @@ /area/eris/engineering/propulsion/right) "eHd" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -99210,7 +99210,7 @@ /area/eris/maintenance/section3deck2starboard) "ePg" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -100288,7 +100288,7 @@ /area/eris/medical/medbay/organs) "haf" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -101210,7 +101210,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -101515,7 +101515,7 @@ "jwC" = ( /obj/spawner/mob/roaches/low_chance, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -101640,7 +101640,7 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -102239,7 +102239,7 @@ icon_state = "0-8" }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -102970,7 +102970,7 @@ /area/eris/crew_quarters/kitchen) "mFk" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -103767,7 +103767,7 @@ /area/eris/crew_quarters/hydroponics) "oSZ" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -103964,7 +103964,7 @@ "ppW" = ( /obj/structure/table/rack/shelf, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -104279,7 +104279,7 @@ /area/eris/crew_quarters/fitness) "pYm" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -104580,7 +104580,7 @@ dir = 1 }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, @@ -105557,7 +105557,7 @@ "sRC" = ( /obj/structure/cable/green, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -106342,7 +106342,7 @@ icon_state = "0-4" }, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -107568,7 +107568,7 @@ "xsu" = ( /obj/structure/cable/green, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, diff --git a/maps/encounters/prisonhulk/prisonhulk.dmm b/maps/encounters/prisonhulk/prisonhulk.dmm index 7cd88ea214..fc6d7a4876 100644 --- a/maps/encounters/prisonhulk/prisonhulk.dmm +++ b/maps/encounters/prisonhulk/prisonhulk.dmm @@ -17,7 +17,7 @@ /area/outpost/prisonhulk/food) "bD" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, diff --git a/maps/submaps/cave_pois/crashed_pod.dmm b/maps/submaps/cave_pois/crashed_pod.dmm index 0385023d70..54186bbad2 100644 --- a/maps/submaps/cave_pois/crashed_pod.dmm +++ b/maps/submaps/cave_pois/crashed_pod.dmm @@ -94,7 +94,7 @@ "as" = ( /obj/effect/floor_decal/industrial/outline/blue, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; diff --git a/maps/submaps/planetary_ruins/crashed_pod/crashed_pod.dmm b/maps/submaps/planetary_ruins/crashed_pod/crashed_pod.dmm index 4e96a1deb4..5547ca58ee 100644 --- a/maps/submaps/planetary_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/submaps/planetary_ruins/crashed_pod/crashed_pod.dmm @@ -94,7 +94,7 @@ "as" = ( /obj/effect/floor_decal/industrial/outline/blue, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; diff --git a/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm b/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm index 89b803895f..3993f22a32 100644 --- a/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm +++ b/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm @@ -379,7 +379,7 @@ dir = 8 }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; icon_state = "apc0"; pixel_x = 28 }, @@ -611,7 +611,7 @@ }, /obj/structure/closet/l3closet, /obj/machinery/power/apc{ - dir = 4; + dir = 8; icon_state = "apc0"; pixel_y = -28 }, @@ -701,7 +701,7 @@ /area/map_template/ecship/engineering) "cM" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; icon_state = "apc0"; pixel_y = 28 }, diff --git a/maps/submaps/planetary_ruins/hydrobase/hydrobase.dmm b/maps/submaps/planetary_ruins/hydrobase/hydrobase.dmm index 591fec4ee2..7ee569450c 100644 --- a/maps/submaps/planetary_ruins/hydrobase/hydrobase.dmm +++ b/maps/submaps/planetary_ruins/hydrobase/hydrobase.dmm @@ -111,7 +111,7 @@ "as" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "east bump"; pixel_x = 24 }, @@ -367,7 +367,7 @@ /area/map_template/hydrobase/station/growD) "bc" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; name = "south bump"; pixel_y = -24 }, @@ -785,7 +785,7 @@ "cc" = ( /obj/structure/cable/yellow, /obj/machinery/power/apc{ - dir = 4; + dir = 8; icon_state = "apc0"; pixel_x = 25 }, @@ -1061,7 +1061,7 @@ /area/map_template/hydrobase/station/growC) "cS" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; icon_state = "apc0"; pixel_x = 25 }, @@ -1651,7 +1651,7 @@ /area/map_template/hydrobase/station/processing) "eq" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "east bump"; pixel_x = 24 }, @@ -1818,7 +1818,7 @@ tag_interior_door = "solars_inner" }, /obj/machinery/power/apc{ - dir = 1; + dir = 2; icon_state = "apc0"; pixel_x = 0; pixel_y = 25 @@ -1957,7 +1957,7 @@ icon_state = "0-2" }, /obj/machinery/power/apc{ - dir = 4; + dir = 8; icon_state = "apc0"; pixel_x = 25 }, @@ -1967,7 +1967,7 @@ /area/map_template/hydrobase/station/growB) "eS" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; icon_state = "apc0"; pixel_x = -25 }, @@ -2284,7 +2284,7 @@ /area/map_template/hydrobase/station/growA) "fM" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "west bump"; pixel_x = -24 }, @@ -2315,7 +2315,7 @@ "fP" = ( /obj/machinery/washing_machine, /obj/machinery/power/apc{ - dir = 1; + dir = 2; icon_state = "apc0"; pixel_x = 0; pixel_y = 25 @@ -2608,7 +2608,7 @@ pixel_y = 25 }, /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "west bump"; pixel_x = -24 }, diff --git a/maps/submaps/planetary_ruins/playablecolony/colony.dmm b/maps/submaps/planetary_ruins/playablecolony/colony.dmm index ae247f8aa3..47a2ed0767 100644 --- a/maps/submaps/planetary_ruins/playablecolony/colony.dmm +++ b/maps/submaps/planetary_ruins/playablecolony/colony.dmm @@ -424,7 +424,7 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -447,7 +447,7 @@ dir = 1 }, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -1712,7 +1712,7 @@ /obj/machinery/door/blast/shutters{ id = "colsen"; name = "Hard Storage Shutter"; - + }, /turf/simulated/floor/plating, /area/map_template/colony/command) @@ -1766,7 +1766,7 @@ dir = 4 }, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -2342,7 +2342,7 @@ /area/map_template/colony/messhall) "gf" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -2632,7 +2632,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/structure/railing/mapped{ dir = 1; @@ -2647,12 +2647,12 @@ dir = 2; frequency = 2222; id_tag = "playablecolonymain_pump_out_external"; - + }, /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/structure/railing/mapped, /obj/effect/floor_decal/industrial/hatch/orange, @@ -2699,7 +2699,7 @@ /area/map_template/colony/atmospherics) "gY" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -2848,7 +2848,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /turf/simulated/floor/exoplanet/concrete, /area/template_noop) @@ -2874,7 +2874,7 @@ /area/map_template/colony) "hv" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -3201,7 +3201,7 @@ "ip" = ( /obj/effect/floor_decal/borderfloorwhite, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -3360,7 +3360,7 @@ dir = 1 }, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -3516,7 +3516,7 @@ /area/map_template/colony/jail) "ji" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -4216,7 +4216,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /turf/simulated/floor/exoplanet/concrete, /area/map_template/colony/mineralprocessing) @@ -4295,7 +4295,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/machinery/conveyor_switch{ id = "colonymine" @@ -4367,7 +4367,7 @@ /area/map_template/colony/jail) "lt" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -4435,7 +4435,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/machinery/computer/mining, /obj/structure/table/steel_reinforced, @@ -4554,7 +4554,7 @@ frequency = 2222; id_tag = "playablecolonymain_pump"; power_rating = 25000; - + }, /turf/simulated/floor/tiled/steel/techfloor, /area/map_template/colony/airlock) @@ -4589,7 +4589,7 @@ frequency = 2222; id_tag = "playablecolonymain_pump"; power_rating = 25000; - + }, /turf/simulated/floor/tiled/steel/techfloor, /area/map_template/colony/airlock) @@ -4815,7 +4815,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/effect/decal/cleanable/dirt, /turf/simulated/floor/exoplanet/concrete, @@ -4852,12 +4852,12 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/structure/railing/mapped{ dir = 4; icon_state = "railing0-1"; - + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -4976,7 +4976,7 @@ id = "colsen"; name = "Hard Equipment Storage"; pixel_y = 28; - + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -5064,7 +5064,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/machinery/recharge_station, /turf/simulated/floor/exoplanet/concrete, @@ -5430,7 +5430,7 @@ frequency = 2222; id_tag = "playablecolonymain_pump_out_internal"; power_rating = 25000; - + }, /obj/item/device/radio/intercom{ dir = 4; @@ -5494,7 +5494,7 @@ frequency = 2222; id_tag = "playablecolonymain_pump"; power_rating = 25000; - + }, /turf/simulated/floor/tiled/steel/techfloor, /area/map_template/colony/airlock) @@ -5521,7 +5521,7 @@ frequency = 2222; id_tag = "playablecolonymain_pump"; power_rating = 25000; - + }, /turf/simulated/floor/tiled/steel/techfloor, /area/map_template/colony/airlock) @@ -5672,7 +5672,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/structure/cable{ d1 = 4; @@ -5711,7 +5711,7 @@ /obj/structure/railing/mapped{ dir = 4; icon_state = "railing0-1"; - + }, /obj/structure/cable{ d1 = 4; @@ -5858,7 +5858,7 @@ frequency = 2222; id_tag = "playablecolonymain_pump_out_internal"; power_rating = 25000; - + }, /turf/simulated/floor/tiled/steel/techfloor, /area/map_template/colony/airlock) @@ -6104,7 +6104,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6340,7 +6340,7 @@ /area/map_template/colony/commons) "zV" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -6376,7 +6376,7 @@ dir = 10 }, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -6482,7 +6482,7 @@ "Hy" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -6652,7 +6652,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -6855,7 +6855,7 @@ /obj/structure/railing/mapped{ dir = 8; icon_state = "railing0-1"; - + }, /obj/structure/railing/mapped, /turf/simulated/floor/exoplanet/concrete, @@ -6877,7 +6877,7 @@ /area/map_template/colony/commons) "OV" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -6977,7 +6977,7 @@ "Sr" = ( /obj/structure/table/steel_reinforced, /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; @@ -7077,7 +7077,7 @@ /area/map_template/colony/command) "Xj" = ( /obj/machinery/power/apc{ - dir = 2; + dir = 1; locked = 0; name = "south bump"; operating = 1; diff --git a/maps/testmap/test_map.dmm b/maps/testmap/test_map.dmm index 291a7f3e2e..a68b8693cf 100644 --- a/maps/testmap/test_map.dmm +++ b/maps/testmap/test_map.dmm @@ -477,7 +477,7 @@ /area/testing/first) "cp" = ( /obj/machinery/power/apc{ - dir = 8; + dir = 4; name = "West APC"; pixel_x = -28 }, @@ -492,7 +492,7 @@ /area/testing/first) "gB" = ( /obj/machinery/power/apc{ - dir = 4; + dir = 8; name = "East APC"; pixel_x = 28 }, @@ -613,7 +613,7 @@ /area/testing/first) "xv" = ( /obj/machinery/power/apc{ - dir = 1; + dir = 2; name = "North APC"; pixel_y = 28 }, From 63826d5d4db90ae9bfcbc15610caff23b6ea6545 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 13 Aug 2024 09:37:01 +0300 Subject: [PATCH 154/171] fix the mapping mistkaes --- code/_compile_options.dm | 4 +- code/modules/power/apc.dm | 2 +- code/modules/projectiles/hitbox_datums.dm | 13 ++-- maps/CEVEris/_CEV_Eris.dmm | 76 ++++++++++++++--------- 4 files changed, 59 insertions(+), 36 deletions(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index a98c2db2c6..496a3ee100 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,9 +46,9 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -#define LOWMEMORYMODE 1 +//#define LOWMEMORYMODE 1 -#define BULLETDEBUG 1 +//#define BULLETDEBUG 1 //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index df10297528..6075a8e6ce 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -301,7 +301,7 @@ /obj/machinery/power/apc/update_icon() var/matrix/trans = matrix() - trans.Turn(dir2angle(dir)) + trans.Turn(dir2angle(dir) + 180) transform = trans if (!status_overlays) status_overlays = 1 diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 17032cf53b..d85381f618 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -543,12 +543,15 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/polygon/powerCable/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) var/worldX var/worldY - worldX = owner.x * 32 - worldY = owner.y * 32 + var/worldZ + worldX = owner.x * PPT + worldY = owner.y * PPT + worldZ = owner.z * PPT for(var/list/boundingData in boundingBoxes[owner.icon_state]) - /// basic AABB but only for the Z-axis. - //if(boundingData[5] > max(startZ,startZ+*pStepZ) || boundingData[6] < min(startZ,startZ+*pStepZ)) - // continue + if((boundingData[5]+worldZ) > max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) > max(startZ,startZ+*pStepZ)) + continue + if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) + continue if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) return TRUE return FALSE diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 262c4b84a7..18189bbd4e 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -14385,7 +14385,8 @@ }, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck5starboard) @@ -15855,7 +15856,8 @@ }, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /turf/simulated/floor/tiled/dark/techfloor, @@ -27029,7 +27031,8 @@ /obj/structure/cable/green, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) @@ -31771,7 +31774,8 @@ }, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green{ d2 = 8; @@ -32225,7 +32229,6 @@ icon_state = "0-4" }, /obj/machinery/power/apc/super/critical{ - dir = 1; name = "north bump"; pixel_y = 28 }, @@ -33497,7 +33500,8 @@ /obj/structure/reagent_dispensers/fueltank, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green{ d2 = 4; @@ -36932,7 +36936,8 @@ }, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) @@ -39986,7 +39991,8 @@ /obj/structure/catwalk, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /obj/spawner/traps/wire_splicing/low_chance, @@ -42903,7 +42909,8 @@ "bXY" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /obj/structure/flora/ausbushes/fullgrass, @@ -44687,7 +44694,6 @@ icon_state = "0-2" }, /obj/machinery/power/apc/critical{ - dir = 1; name = "north bump"; pixel_y = 28 }, @@ -44960,7 +44966,6 @@ icon_state = "0-8" }, /obj/machinery/power/apc/super/critical{ - dir = 1; name = "north bump"; pixel_y = 28 }, @@ -46068,7 +46073,8 @@ "cfF" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green{ d2 = 8; @@ -47478,7 +47484,8 @@ /obj/structure/cable/green, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck5port) @@ -48600,7 +48607,8 @@ /obj/structure/cable/green, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) @@ -67662,7 +67670,8 @@ "die" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/catwalk, /obj/structure/cable/green, @@ -81185,7 +81194,8 @@ "dOS" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/catwalk, /obj/structure/cable/green, @@ -82701,7 +82711,8 @@ "dTf" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/catwalk, /obj/structure/cable/green{ @@ -82926,7 +82937,8 @@ "dTI" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/catwalk, /obj/structure/cable/green, @@ -92181,7 +92193,8 @@ "eqM" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /turf/simulated/floor/tiled/steel, @@ -92207,7 +92220,8 @@ "eqO" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /turf/simulated/floor/wood, @@ -92414,7 +92428,8 @@ }, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/maintenance/section3deck2starboard) @@ -96262,7 +96277,8 @@ "eAe" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /obj/structure/catwalk, @@ -98595,7 +98611,8 @@ "eFo" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green{ d2 = 4; @@ -98760,7 +98777,6 @@ icon_state = "0-4" }, /obj/machinery/power/apc/hyper/critical{ - dir = 1; name = "north bump"; pixel_y = 28 }, @@ -101290,7 +101306,8 @@ /obj/structure/cable/green, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -105305,7 +105322,8 @@ /obj/machinery/light, /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/long_range_scanner) @@ -105751,7 +105769,8 @@ }, /obj/machinery/light, /obj/machinery/power/apc/super{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /turf/simulated/floor/carpet/sblucarpet, @@ -106499,7 +106518,8 @@ "uXJ" = ( /obj/machinery/power/apc{ name = "South APC"; - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/cable/green, /turf/simulated/floor/carpet/bcarpet, From cfa84d9ec5d32fd7392289288256387f3467dac8 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 13 Aug 2024 10:16:33 +0300 Subject: [PATCH 155/171] add --- .../structures/stool_bed_chair_nest/chairs.dm | 2 + .../structures/stool_bed_chair_nest/stools.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 50 +++++++++++++++++++ code/modules/tables/rack.dm | 2 + 4 files changed, 55 insertions(+) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 8823108153..35fbda608a 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -3,6 +3,7 @@ desc = "You sit in this. Either by will or force." description_info = "Can be used as a support to climb up by looking up and clicking on a free tile that is not blocked by a railing" icon_state = "chair_preview" + hitbox = /datum/hitboxDatum/atom/chair color = "#666666" base_icon = "chair" var/propelled = 0 // Check for fire-extinguisher-driven chairs @@ -109,6 +110,7 @@ /obj/structure/bed/chair/comfy desc = "A chair. It looks comfy." icon_state = "comfychair_preview" + hitbox = /datum/hitboxDatum/atom/armChair /obj/structure/bed/chair/comfy/brown/New(var/newloc,var/newmaterial) ..(newloc,MATERIAL_STEEL, MATERIAL_LEATHER) diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index e750ba2e07..0225ef2143 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -5,6 +5,7 @@ var/global/list/stool_cache = list() //haha stool name = "stool" desc = "Apply butt." icon = 'icons/obj/furniture.dmi' + hitbox = /datum/hitboxDatum/atom/stool icon_state = "stool_preview" //set for the map melleDamages = list(ARMOR_BLUNT = list(DELEM(BRUTE,15))) throwforce = 10 diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index d85381f618..35a7a0fc7a 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -349,6 +349,56 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(5,4,31,28, LEVEL_TURF, LEVEL_TABLE, null)) ) +/datum/hitboxDatum/atom/storageRack + boundingBoxes = list( + LISTNORTH = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_TABLE, null)), + LISTSOUTH = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_TABLE, null)), + LISTEAST = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_TABLE, null)), + LISTWEST = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_TABLE, null)) + ) + +/datum/hitboxDatum/atom/storageShelf + boundingBoxes = list( + LISTNORTH = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_CHEST, null)), + LISTSOUTH = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_CHEST, null)), + LISTEAST = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_CHEST, null)), + LISTWEST = list(BBOX(5,5,28,27, LEVEL_TURF, LEVEL_CHEST, null)) + ) + +/datum/hitboxDatum/atom/bed + boundingBoxes = list( + LISTNORTH = list(BBOX(2,4,31,19, LEVEL_TURF+2, LEVEL_LYING-5, null)), + LISTSOUTH = list(BBOX(2,4,31,19, LEVEL_TURF+2, LEVEL_LYING-5, null)), + LISTEAST = list(BBOX(2,4,31,19, LEVEL_TURF+2, LEVEL_LYING-5, null)), + LISTWEST = list(BBOX(2,4,31,19, LEVEL_TURF+2, LEVEL_LYING-5, null)) + ) + +/datum/hitboxDatum/atom/stool + boundingBoxes = list( + LISTNORTH = list(BBOX(10,1,23,17, LEVEL_TURF, LEVEL_LYING+5, null)), + LISTSOUTH = list(BBOX(10,1,23,17, LEVEL_TURF, LEVEL_LYING+5, null)), + LISTEAST = list(BBOX(10,1,23,17, LEVEL_TURF, LEVEL_LYING+5, null)), + LISTWEST = list(BBOX(10,1,23,17, LEVEL_TURF, LEVEL_LYING+5, null)) + ) + +/datum/hitboxDatum/atom/chair + boundingBoxes = list( + LISTSOUTH = list(BBOX(9,6,23,15, LEVEL_LYING, LEVEL_LYING+3, null), BBOX(10,15,22,25, LEVEL_LYING+3, LEVEL_TABLE, null)), + LISTNORTH = list(BBOX(9,4,23,10, LEVEL_LYING, LEVEL_LYING+3, null), BBOX(9,11,23,22, LEVEL_LYING+3, LEVEL_TABLE, null)), + LISTEAST = list(BBOX(10,7,22,19, LEVEL_LYING, LEVEL_LYING+3, null), BBOX(8,9,12,26, LEVEL_LYING+3, LEVEL_TABLE, null)), + LISTWEST = list(BBOX(11,7,23,19, LEVEL_LYING, LEVEL_LYING+3, null), BBOX(21,8,25,26, LEVEL_LYING+3, LEVEL_TABLE, null)) + ) + +/datum/hitboxDatum/atom/armChair + boundingBoxes = list( + LISTSOUTH = list(BBOX(8,1,25,15, LEVEL_TURF, LEVEL_LYING+3, null), BBOX(10,14,23,25, LEVEL_LYING+3, LEVEL_TABLE+5, null)), + LISTNORTH = list(BBOX(8,2,25,15, LEVEL_TURF, LEVEL_LYING+3, null), BBOX(10,11,23,28, LEVEL_LYING+3, LEVEL_TABLE+5, null)), + LISTEAST = list(BBOX(9,2,25,18, LEVEL_TURF, LEVEL_LYING+3, null), BBOX(8,10,13,29, LEVEL_LYING+3, LEVEL_TABLE+5, null)), + LISTWEST = list(BBOX(8,2,24,18, LEVEL_TURF, LEVEL_LYING+3, null), BBOX(20,11,25,29, LEVEL_LYING+3, LEVEL_TABLE+5, null)), + ) + + + /datum/hitboxDatum/turf boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) diff --git a/code/modules/tables/rack.dm b/code/modules/tables/rack.dm index 7ce674c167..1aa14576a8 100644 --- a/code/modules/tables/rack.dm +++ b/code/modules/tables/rack.dm @@ -2,6 +2,7 @@ name = "rack" desc = "Different from the medieval version." icon = 'icons/obj/objects.dmi' + hitbox = /datum/hitboxDatum/atom/storageRack icon_state = "rack" can_plate = 0 can_reinforce = 0 @@ -25,6 +26,7 @@ name = "shelf" desc = "For showing off your collections of dust, electronics, the heads of your enemies and tools." icon_state = "shelf" + hitbox = /datum/hitboxDatum/atom/storageShelf From 5176c8d5b9ed2ded7749aea4d158c273cddaeeb9 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 13 Aug 2024 19:27:07 +0300 Subject: [PATCH 156/171] Remap ext inguishers --- code/__DEFINES/misc.dm | 4 + code/_compile_options.dm | 2 +- code/controllers/subsystems/ticker.dm | 6 + code/game/atoms.dm | 2 +- code/game/machinery/alarm.dm | 6 +- .../atmoalter/portable_atmospherics.dm | 9 +- code/game/machinery/doors/blast_door.dm | 5 +- code/game/machinery/doors/firedoor.dm | 8 +- code/game/machinery/newscaster.dm | 5 +- code/game/machinery/portable_turret.dm | 5 +- code/game/machinery/slotmachine.dm | 5 +- code/game/objects/structures/extinguisher.dm | 11 + .../game/objects/structures/window_spawner.dm | 3 +- code/modules/power/apc.dm | 5 +- maps/CEVEris/_CEV_Eris.dmm | 204 ++++++++++++------ .../blacksite/blacksite_large_chunk.dmm | 3 +- .../blacksite/blacksite_medium_chunk.dmm | 3 +- maps/encounters/prisonhulk/prisonhulk.dmm | 3 +- .../spider_nest/spider_nest3.dmm | 3 +- 19 files changed, 189 insertions(+), 103 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index b9f155e5b1..2f4fec3f94 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -228,6 +228,10 @@ #define EMAIL_BROADCAST "broadcast@internal-services.net" #define EMAIL_PAYROLL "payroll@internal-services.net" +#ifdef BULLETDEBUG +GLOBAL_LIST_EMPTY(initVis) +#endif + #define LEGACY_RECORD_STRUCTURE(X, Y) GLOBAL_LIST_EMPTY(##X);/datum/computer_file/data/##Y/var/list/fields[0];/datum/computer_file/data/##Y/New(){..();GLOB.##X.Add(src);}/datum/computer_file/data/##Y/Destroy(){. = ..();GLOB.##X.Remove(src);} //Number of slots a modular computer has which can be tweaked via gear tweaks. diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 496a3ee100..65e07ab8fe 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -48,7 +48,7 @@ // 2 for preloading absolutely everything; //#define LOWMEMORYMODE 1 -//#define BULLETDEBUG 1 +#define BULLETDEBUG 1 //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 28dcd31d9d..f37a41ff55 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -124,6 +124,12 @@ SUBSYSTEM_DEF(ticker) //setup failed current_state = GAME_STATE_STARTUP Master.SetRunLevel(RUNLEVEL_LOBBY) + #ifdef BULLETDEBUG + for(var/atom/thing as anything in GLOB.initVis) + if(QDELETED(thing)) + continue + thing.hitbox.visualize(thing) + #endif if(GAME_STATE_PLAYING) GLOB.storyteller.Process() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 2f20b49592..a1dfa9f1bc 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -231,7 +231,7 @@ hitbox = getHitbox(hitbox) #ifdef BULLETDEBUG if(hitbox) - addtimer(CALLBACK(hitbox, TYPE_PROC_REF(/datum/hitboxDatum, visualize), src), 1 MINUTE) + GLOB.initVis += src #endif if(preloaded_reagents) diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 19809987a7..eebf1cdf43 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -885,8 +885,7 @@ /obj/machinery/alarm/power_change() ..() - spawn(rand(0,15)) - update_icon() + update_icon() /obj/machinery/alarm/examine(mob/user) var/description = "" @@ -1120,8 +1119,7 @@ FIRE ALARM /obj/machinery/firealarm/power_change() ..() - spawn(rand(0,15)) - update_icon() + update_icon() /obj/machinery/firealarm/nano_ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = NANOUI_FOCUS, var/datum/nano_topic_state/state = GLOB.outside_state) var/data[0] diff --git a/code/game/machinery/atmoalter/portable_atmospherics.dm b/code/game/machinery/atmoalter/portable_atmospherics.dm index c27e799707..211f86448e 100644 --- a/code/game/machinery/atmoalter/portable_atmospherics.dm +++ b/code/game/machinery/atmoalter/portable_atmospherics.dm @@ -29,11 +29,10 @@ /obj/machinery/portable_atmospherics/Initialize() . = ..() - spawn() - var/obj/machinery/atmospherics/portables_connector/port = locate() in loc - if(port) - connect(port) - update_icon() + var/obj/machinery/atmospherics/portables_connector/port = locate() in loc + if(port) + connect(port) + update_icon() /obj/machinery/portable_atmospherics/Process() if(!connected_port) //only react when pipe_network will ont it do it for you diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index a611a6fc44..8308326c11 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -453,9 +453,8 @@ return force_open() if(autoclose) - spawn(150) - close() - return 1 + addtimer(CALLBACK(src, PROC_REF(close)), 15 SECONDS) + return TRUE // Proc: close() // Parameters: 1 (forced - if true, the checks will be skipped) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index fe357bd2e7..5be9a37741 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -258,12 +258,14 @@ use_power(360) if(checkAlarmed()) - spawn(150) - if(checkAlarmed()) - close() + addtimer(CALLBACK(src, PROC_REF(tryClose)), 15 SECONDS) return ..() +/obj/machinery/door/firedoor/proc/tryClose() + if(checkAlarmed()) + close() + /obj/machinery/door/firedoor/do_animate(animation) switch(animation) if("opening") diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 3afb9569db..38655a6caf 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -250,9 +250,8 @@ var/datum/feed_network/news_network = new /datum/feed_network //The global n src.ispowered = 1 src.update_icon() else - spawn(rand(0, 15)) - src.ispowered = 0 - src.update_icon() + src.ispowered = 0 + src.update_icon() /obj/machinery/newscaster/take_damage(amount) . = ..() diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index f275f58de8..5e90b6ac4f 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -277,9 +277,8 @@ var/list/turret_icons stat &= ~NOPOWER update_icon() else - spawn(rand(0, 15)) - stat |= NOPOWER - update_icon() + stat |= NOPOWER + update_icon() /obj/machinery/porta_turret/attackby(obj/item/I, mob/user) diff --git a/code/game/machinery/slotmachine.dm b/code/game/machinery/slotmachine.dm index 1ba214eb42..5970800906 100644 --- a/code/game/machinery/slotmachine.dm +++ b/code/game/machinery/slotmachine.dm @@ -36,8 +36,7 @@ if( !(stat & NOPOWER) ) icon_state = icon_type else - spawn(rand(0, 15)) - icon_state = "[icon_type]_off" + icon_state = "[icon_type]_off" /obj/machinery/slotmachine/update_icon() overlays.Cut() @@ -126,7 +125,7 @@ playsound(src.loc, 'sound/machines/click.ogg', 50, 1) set_spin_ovarlay() - + set_pull_overlay() set_slots_overlay() diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index ca07b47c9d..bdf7c4e046 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -13,6 +13,17 @@ has_extinguisher = new/obj/item/extinguisher(src) update_icon() +/obj/structure/extinguisher_cabinet/Initialize() + . = ..() + var/turf/toAttach = get_step(loc, reverse_dir[dir]) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + /obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user) if(isrobot(user)) return diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm index e8f7dff597..459eb0d5fb 100644 --- a/code/game/objects/structures/window_spawner.dm +++ b/code/game/objects/structures/window_spawner.dm @@ -43,8 +43,7 @@ if(activated) return activate() - spawn(10) - qdel(src) + qdel(src) /obj/effect/window_lwall_spawn/proc/handle_window_spawn(var/obj/structure/window/W) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 6075a8e6ce..33c1741063 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -472,9 +472,8 @@ if(!updating_icon) updating_icon = 1 // Start the update - spawn(APC_UPDATE_ICON_COOLDOWN) - update_icon() - updating_icon = 0 + update_icon() + updating_icon = 0 //attack with an item - open/close cover, insert cell, or (un)lock interface diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 18189bbd4e..38c6108116 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -10605,7 +10605,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/quartermaster/disposaldrop) @@ -11288,7 +11289,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -17359,7 +17361,8 @@ /area/eris/security/barracks) "aRj" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos/storage) @@ -17933,7 +17936,8 @@ pixel_x = 28 }, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /obj/structure/cable/green{ d2 = 8; @@ -18314,7 +18318,8 @@ /obj/structure/table/reinforced, /obj/item/paper_bin, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/item/computer_hardware/hard_drive/portable{ default_files = list(/datum/computer_file/program/trade); @@ -25146,7 +25151,8 @@ /obj/item/storage/box/mousetraps, /obj/item/storage/box/mousetraps, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/altar) @@ -27985,7 +27991,8 @@ /area/eris/hallway/side/morguehallway) "bop" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/hallway/side/morguehallway) @@ -29782,7 +29789,8 @@ dir = 1 }, /obj/structure/extinguisher_cabinet{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) @@ -31703,7 +31711,8 @@ pixel_y = -28 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) @@ -33535,7 +33544,8 @@ /obj/item/ammo_casing/flare, /obj/item/gun/projectile/flare_gun, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/maintenance/junk) @@ -33988,7 +33998,8 @@ /area/eris/rnd/docking) "bDw" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 4 @@ -36916,7 +36927,8 @@ /area/eris/command/tcommsat/chamber) "bJJ" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/structure/cable/green{ @@ -37685,7 +37697,8 @@ /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/item/device/radio/intercom{ pixel_y = 24 @@ -39880,7 +39893,8 @@ dir = 1 }, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /obj/structure/cable{ d1 = 4; @@ -41021,7 +41035,8 @@ "bTo" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -41800,7 +41815,8 @@ "bVi" = ( /obj/spawner/junk/low_chance, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/section2deck4central) @@ -42458,7 +42474,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/camera/network/research{ dir = 4 @@ -45071,7 +45088,8 @@ /area/eris/crew_quarters/clothingstorage) "cdI" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/clothingstorage) @@ -47819,7 +47837,8 @@ /area/eris/quartermaster/storage) "cjS" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/camera/network/research{ dir = 4 @@ -48906,7 +48925,8 @@ /area/eris/command/meo) "cmK" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/atmospherics/binary/passive_gate{ dir = 1; @@ -49830,7 +49850,8 @@ /area/eris/hallway/main/section2) "cpf" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -49985,7 +50006,8 @@ /area/eris/medical/surgery) "cpz" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/light{ dir = 8 @@ -51181,7 +51203,8 @@ /area/eris/crew_quarters/kitchen_storage) "csE" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/structure/catwalk, /turf/simulated/floor/plating/under, @@ -51228,7 +51251,8 @@ req_access = null }, /obj/structure/extinguisher_cabinet{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/machinery/button/remote/blast_door{ id = "artist_office_west"; @@ -51516,7 +51540,8 @@ /area/eris/maintenance/section3deck4central) "ctI" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/oldtele) @@ -51703,7 +51728,8 @@ /area/eris/hallway/side/bridgehallway) "cul" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) @@ -52103,7 +52129,8 @@ /obj/spawner/pack/tech_loot, /obj/spawner/pack/tech_loot, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/techmaint_perforated, /area/eris/maintenance/section3deck4central) @@ -53356,7 +53383,8 @@ /area/eris/quartermaster/storage) "cyu" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/item/device/radio/intercom{ pixel_y = 24 @@ -57007,7 +57035,8 @@ /obj/spawner/material/building/low_chance, /obj/spawner/material/building/low_chance, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/drone_fabrication) @@ -57880,7 +57909,8 @@ "cJJ" = ( /obj/spawner/junk/low_chance, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck4central) @@ -57919,14 +57949,16 @@ "cJO" = ( /obj/structure/cyberplant, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/sleep/cryo) "cJP" = ( /obj/structure/cyberplant, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/sleep/cryo) @@ -58197,7 +58229,8 @@ /area/eris/medical/medbay) "cKw" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) @@ -58676,7 +58709,8 @@ /area/eris/medical/medbay) "cLH" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 26 + pixel_x = 26; + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -58832,7 +58866,8 @@ icon_state = "1-2" }, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/plating, /area/eris/engineering/construction) @@ -60193,7 +60228,8 @@ /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -62446,7 +62482,8 @@ pixel_y = 3 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/xenobiology) @@ -65887,7 +65924,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -66802,7 +66840,8 @@ "dgo" = ( /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/reception) @@ -66842,7 +66881,8 @@ /area/eris/rnd/xenobiology) "dgs" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/white, /area/eris/medical/medbay) @@ -68441,7 +68481,8 @@ /area/eris/hallway/side/atmosphericshallway) "djS" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -68517,7 +68558,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) @@ -72013,7 +72055,8 @@ /area/eris/maintenance/section3deck2starboard) "dsa" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -74379,7 +74422,8 @@ /area/eris/engineering/foyer) "dxT" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -26 + pixel_x = -26; + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) @@ -76416,7 +76460,8 @@ /area/eris/medical/reception) "dCD" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /obj/item/modular_computer/console/preset/engineering/alarms{ dir = 4 @@ -76591,7 +76636,8 @@ "dDa" = ( /obj/structure/catwalk, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/open, /area/eris/quartermaster/storage) @@ -76849,7 +76895,8 @@ dir = 4 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/dark, @@ -76956,7 +77003,8 @@ dir = 8 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -78626,7 +78674,8 @@ /area/eris/engineering/starboardhallway) "dHZ" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/engine_room) @@ -80571,7 +80620,8 @@ /area/eris/engineering/propulsion/right) "dNb" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -26 + pixel_x = -26; + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/propulsion/left) @@ -80754,13 +80804,15 @@ /obj/structure/table/reinforced, /obj/machinery/recharger, /obj/structure/extinguisher_cabinet{ - pixel_x = -24 + pixel_x = -24; + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) "dNF" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 26 + pixel_x = 26; + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/propulsion/right) @@ -80832,7 +80884,8 @@ /area/eris/engineering/foyer) "dNS" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) @@ -81332,7 +81385,8 @@ /area/eris/engineering/gravity_generator) "dPp" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -26 + pixel_x = -26; + dir = 4 }, /obj/machinery/firealarm{ dir = 1; @@ -81664,7 +81718,8 @@ /area/eris/maintenance/section2deck1port) "dQq" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/structure/cable/green{ d1 = 2; @@ -83059,7 +83114,8 @@ /obj/item/tool/crowbar, /obj/item/tool/crowbar, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/quartermaster/misc) @@ -83996,7 +84052,8 @@ "dWo" = ( /obj/structure/disposalpipe/segment, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -85324,7 +85381,8 @@ /area/eris/maintenance/section3deck2port) "dZS" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/white/golden, @@ -87921,7 +87979,8 @@ dir = 1 }, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/storage) @@ -90340,7 +90399,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/catwalk, /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck3starboard) @@ -91875,7 +91935,8 @@ /obj/item/storage/toolbox/emergency, /obj/item/storage/toolbox/emergency, /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/hallway/main/section3) @@ -93244,7 +93305,8 @@ "eta" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -93275,7 +93337,8 @@ /area/eris/command/exultant) "etf" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /obj/machinery/portable_atmospherics/powered/scrubber, /turf/simulated/floor/tiled/steel/gray_platform, @@ -94220,7 +94283,8 @@ /area/eris/neotheology/chapel) "evv" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 24 + pixel_x = 24; + dir = 8 }, /obj/structure/table/standard, /obj/item/reagent_containers/dropper{ @@ -103067,7 +103131,8 @@ /area/eris/medical/chemstor) "nfm" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = 27 + pixel_y = 27; + dir = 2 }, /obj/structure/bed/chair{ dir = 4 @@ -105553,7 +105618,8 @@ /area/eris/maintenance/section2deck3port) "sOh" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/structure/bed/chair/comfy/beige, /turf/simulated/floor/carpet/bcarpet, @@ -105887,7 +105953,8 @@ /area/eris/medical/chemistry) "tAt" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /obj/structure/disposalpipe/segment, /turf/simulated/floor/tiled/dark/golden, @@ -108031,7 +108098,8 @@ /area/eris/neotheology/chapelritualroom) "yit" = ( /obj/structure/extinguisher_cabinet{ - pixel_y = -28 + pixel_y = -28; + dir = 1 }, /obj/structure/bed/chair/comfy/brown{ dir = 8 diff --git a/maps/encounters/blacksite/blacksite_large_chunk.dmm b/maps/encounters/blacksite/blacksite_large_chunk.dmm index 9811736378..2eed51b655 100644 --- a/maps/encounters/blacksite/blacksite_large_chunk.dmm +++ b/maps/encounters/blacksite/blacksite_large_chunk.dmm @@ -1554,7 +1554,8 @@ /area/outpost/blacksite/large) "RX" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/simulated/floor/tiled/derelict, /area/outpost/blacksite/large) diff --git a/maps/encounters/blacksite/blacksite_medium_chunk.dmm b/maps/encounters/blacksite/blacksite_medium_chunk.dmm index 5cd292c3fc..38a67c2f4b 100644 --- a/maps/encounters/blacksite/blacksite_medium_chunk.dmm +++ b/maps/encounters/blacksite/blacksite_medium_chunk.dmm @@ -1620,7 +1620,8 @@ /area/outpost/blacksite/medium) "RX" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/simulated/floor/tiled/derelict, /area/outpost/blacksite/medium) diff --git a/maps/encounters/prisonhulk/prisonhulk.dmm b/maps/encounters/prisonhulk/prisonhulk.dmm index fc6d7a4876..cad47dfd43 100644 --- a/maps/encounters/prisonhulk/prisonhulk.dmm +++ b/maps/encounters/prisonhulk/prisonhulk.dmm @@ -535,7 +535,8 @@ /area/outpost/prisonhulk/security) "DG" = ( /obj/structure/extinguisher_cabinet{ - pixel_x = -27 + pixel_x = -27; + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/outpost/prisonhulk/security) diff --git a/maps/submaps/planetary_ruins/spider_nest/spider_nest3.dmm b/maps/submaps/planetary_ruins/spider_nest/spider_nest3.dmm index 498064ac7e..137c164888 100644 --- a/maps/submaps/planetary_ruins/spider_nest/spider_nest3.dmm +++ b/maps/submaps/planetary_ruins/spider_nest/spider_nest3.dmm @@ -30,7 +30,8 @@ pixel_y = 3 }, /obj/structure/extinguisher_cabinet{ - pixel_x = 27 + pixel_x = 27; + dir = 8 }, /turf/simulated/floor/tiled/white/violetcorener, /area/map_template/spider_nest) From c8f947c23127f3268724822f5d77fc17c4e60310 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 13 Aug 2024 20:59:34 +0300 Subject: [PATCH 157/171] HITBOXES GALORE --- .../components/unary/vent_pump.dm | 1 + .../components/unary/vent_scrubber.dm | 1 + code/controllers/subsystems/ticker.dm | 14 +-- code/game/machinery/buttons.dm | 13 +++ code/game/machinery/camera/camera.dm | 12 +++ code/game/machinery/doors/door.dm | 3 + code/game/machinery/doors/windowdoor.dm | 1 + code/game/machinery/hologram.dm | 1 + .../objects/items/devices/radio/intercom.dm | 12 +++ code/game/objects/structures/catwalk.dm | 2 +- .../structures/crates_lockers/closets.dm | 1 + code/game/objects/structures/extinguisher.dm | 1 + .../objects/structures/fireaxe_cabinet.dm | 14 ++- .../structures/stool_bed_chair_nest/bed.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 91 +++++++++++++++++++ code/modules/recycling/disposal.dm | 1 + maps/CEVEris/_CEV_Eris.dmm | 12 ++- .../ec_old_crash/ec_old_crash.dmm | 3 +- .../spider_nest/spider_nest.dmm | 3 +- .../spider_nest/spider_nest2.dmm | 3 +- 20 files changed, 174 insertions(+), 16 deletions(-) diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 8efb6748e2..dabb6b1306 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -53,6 +53,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on use_power = IDLE_POWER_USE icon_state = "map_vent_out" + hitbox = /datum/hitboxDatum/atom/atmosphericVentScrubber /obj/machinery/atmospherics/unary/vent_pump/siphon pump_direction = 0 diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 6489833d43..63507250d9 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -40,6 +40,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on use_power = IDLE_POWER_USE icon_state = "map_scrubber_on" + hitbox = /datum/hitboxDatum/atom/atmosphericVentScrubber /obj/machinery/atmospherics/unary/vent_scrubber/Initialize(mapload, d) . = ..() diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index f37a41ff55..2dfb4eea1c 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -124,14 +124,14 @@ SUBSYSTEM_DEF(ticker) //setup failed current_state = GAME_STATE_STARTUP Master.SetRunLevel(RUNLEVEL_LOBBY) - #ifdef BULLETDEBUG - for(var/atom/thing as anything in GLOB.initVis) - if(QDELETED(thing)) - continue - thing.hitbox.visualize(thing) - #endif - if(GAME_STATE_PLAYING) + #ifdef BULLETDEBUG + for(var/atom/thing as anything in GLOB.initVis) + if(QDELETED(thing)) + continue + thing.hitbox.visualize(thing) + GLOB.initVis -= thing + #endif GLOB.storyteller.Process() GLOB.storyteller.process_events() diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 818025edaa..2aaf68a378 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/machines/buttons.dmi' icon_state = "launcher0" desc = "A remote control switch for something." + hitbox = /datum/hitboxDatum/atom/button var/id = null var/active = 0 var/operating = 0 @@ -19,6 +20,18 @@ if(_wifi_id && !wifi_sender) wifi_sender = new/datum/wifi/sender/button(_wifi_id, src) + //// YES this doesn't rely on proper mapping because i can't really replace most of them and wouldn't make sense in most cases anyway.(since pixel_x and pixel_y will always vary etc etc.) + var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y <16)*SOUTH + var/turf/toAttach = get_step(loc, attachmentDir) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + + /obj/machinery/button/Destroy() qdel(wifi_sender) wifi_sender = null diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index c2b97e19ae..f8872458c4 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -8,6 +8,7 @@ idle_power_usage = 5 active_power_usage = 10 layer = WALL_OBJ_LAYER + hitbox = /datum/hitboxDatum/atom/camera var/list/network = list(NETWORK_CEV_ERIS) var/c_tag = null @@ -63,6 +64,17 @@ var/area/A = get_area(src) c_tag = A.get_camera_tag(src) +/obj/machinery/camera/Initialize(mapload, d) + . = ..() + var/turf/toAttach = get_step(loc, reverse_dir[dir]) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + /obj/machinery/camera/Destroy() deactivate(null, 0) //kick anyone viewing out taped = 0 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index e41fa9b3d1..994b429b9c 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -11,6 +11,7 @@ opacity = 1 density = TRUE layer = OPEN_DOOR_LAYER + hitbox = /datum/hitboxDatum/turf/door var/open_layer = OPEN_DOOR_LAYER var/closed_layer = CLOSED_DOOR_LAYER var/visible = 1 @@ -185,6 +186,8 @@ return TRUE /obj/machinery/door/bullet_act(obj/item/projectile/Proj, defZone, hitboxFlags) + if(!density) + return PROJECTILE_CONTINUE ..() var/damage = Proj.get_structure_damage() diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index b904f4b746..f22695c73a 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/doors/windoor.dmi' icon_state = "left" var/base_state = "left" + hitbox = /datum/hitboxDatum/atom/window/directional resistance = RESISTANCE_FRAGILE hitsound = 'sound/effects/Glasshit.ogg' maxHealth = 100 //If you change this, consiter changing ../door/window/brigdoor/ health at the bottom of this .dm file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index dbe999cf57..1ab9c1de8d 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -42,6 +42,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED var/power_per_hologram = 500 //per usage per hologram idle_power_usage = 5 use_power = IDLE_POWER_USE + hitbox = /datum/hitboxDatum/atom/holopad var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 8589b82194..6ae38edb8f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -8,6 +8,7 @@ volumeClass = ITEM_SIZE_BULKY canhear_range = 2 flags = CONDUCT | NOBLOODY + hitbox = /datum/hitboxDatum/atom/intercom var/number = 0 var/area/linked_area @@ -112,6 +113,17 @@ icon_state = "intercom-p" addtimer(CALLBACK(src, PROC_REF(loop_area_check)), 30 SECONDS) +/obj/item/device/radio/intercom/Initialize() + . = ..() + var/turf/toAttach = get_step(loc, reverse_dir[dir]) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + /obj/item/device/radio/intercom/broadcasting broadcasting = 1 diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index f55105c31f..3fd0dcd7d8 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -6,7 +6,7 @@ desc = "Cats really don't like these things." density = FALSE anchored = TRUE - + hitbox = /datum/hitboxDatum/turf/floor /obj/structure/catwalk/New() ..() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index ac29e1a099..95f6b0988f 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -9,6 +9,7 @@ matter = list(MATERIAL_STEEL = 10) //bad_type = /obj/structure/closet spawn_tags = SPAWN_TAG_CLOSET + hitbox = /datum/hitboxDatum/atom/closet var/locked = FALSE var/broken = FALSE var/horizontal = FALSE diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index bdf7c4e046..facbb6ba70 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -3,6 +3,7 @@ desc = "A small wall mounted cabinet designed to hold a fire extinguisher." icon = 'icons/obj/closet.dmi' icon_state = "extinguisher_closed" + hitbox = /datum/hitboxDatum/atom/fireExtinguisherCabinet anchored = TRUE density = FALSE var/obj/item/extinguisher/has_extinguisher diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm index 63eae3e655..f1264c530b 100644 --- a/code/game/objects/structures/fireaxe_cabinet.dm +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -4,6 +4,7 @@ icon_state = "fireaxe" anchored = TRUE density = FALSE + hitbox = /datum/hitboxDatum/atom/fireAxeCabinet var/damage_threshold = 15 var/open @@ -27,6 +28,17 @@ playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) update_icon() +/obj/structure/fireaxecabinet/Initialize() + . = ..() + + var/turf/toAttach = get_step(loc, reverse_dir[dir]) + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + color = COLOR_PINK + /obj/structure/fireaxecabinet/update_icon() overlays.Cut() if(fireaxe) @@ -82,7 +94,7 @@ if(istype(O, /obj/item/tool/multitool)) toggle_lock(user) return - if(istype(O, /obj/item/card/id)) + if(istype(O, /obj/item/card/id)) var/obj/item/card/id/ID = O if(has_access(list(), req_one_access, ID.GetAccess())) toggle_lock(user) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index cf34750f8d..44ac2c1926 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -14,6 +14,7 @@ description_info = "Can be used as a support to climb up by looking up and clicking on a free tile that is not blocked by a railing" icon_state = "bed" anchored = TRUE + hitbox = /datum/hitboxDatum/atom/bed var/material/material var/material/padding_material var/base_icon = "bed" diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 35a7a0fc7a..aa6e039b69 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -397,7 +397,95 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(8,2,24,18, LEVEL_TURF, LEVEL_LYING+3, null), BBOX(20,11,25,29, LEVEL_LYING+3, LEVEL_TABLE+5, null)), ) +/datum/hitboxDatum/atom/fireAxeCabinet + boundingBoxes = list( + LISTNORTH = list(BBOX(3,8,29,26,LEVEL_CHEST-5,LEVEL_CHEST+4,null)), + LISTSOUTH = list(BBOX(3,8,29,26,LEVEL_CHEST-5,LEVEL_CHEST+4,null)), + LISTEAST = list(BBOX(3,8,29,26,LEVEL_CHEST-5,LEVEL_CHEST+4,null)), + LISTWEST = list(BBOX(3,8,29,26,LEVEL_CHEST-5,LEVEL_CHEST+4,null)) + ) +/datum/hitboxDatum/atom/fireExtinguisherCabinet + boundingBoxes = list( + LISTNORTH = list(BBOX(10,6,23,28,LEVEL_CHEST-5,LEVEL_CHEST+4,null)), + LISTSOUTH = list(BBOX(10,6,23,28,LEVEL_CHEST-5,LEVEL_CHEST+4,null)), + LISTEAST = list(BBOX(10,6,23,28,LEVEL_CHEST-5,LEVEL_CHEST+4,null)), + LISTWEST = list(BBOX(10,6,23,28,LEVEL_CHEST-5,LEVEL_CHEST+4,null)) + ) + +/datum/hitboxDatum/atom/intercom + boundingBoxes = list( + LISTSOUTH = list(BBOX(8,11,25,23,LEVEL_CHEST-3,LEVEL_CHEST+3,null)), + LISTNORTH = list(BBOX(8,10,25,22,LEVEL_CHEST-3,LEVEL_CHEST+3,null)), + LISTEAST = list(BBOX(10,8,22,25,LEVEL_CHEST-3,LEVEL_CHEST+3,null)), + LISTWEST = list(BBOX(11,8,23,25,LEVEL_CHEST-3,LEVEL_CHEST+3,null)) + ) + + /datum/hitboxDatum/atom/camera + boundingBoxes = list( + LISTSOUTH = list(BBOX(14,27,17,32,LEVEL_HEAD-3, LEVEL_HEAD+3,null)), + LISTNORTH = list(BBOX(12,1,20,7,LEVEL_HEAD-3, LEVEL_HEAD+3,null)), + LISTEAST = list(BBOX(1,14,16,20,LEVEL_HEAD-3, LEVEL_HEAD+3,null)), + LISTWEST = list(BBOX(27,13,32,19,LEVEL_HEAD-3, LEVEL_HEAD+3,null)) + ) + +/datum/hitboxDatum/atom/button + boundingBoxes = list( + LISTSOUTH = list(BBOX(13,13,20,21,LEVEL_CHEST+1, LEVEL_CHEST-1,null)), + LISTNORTH = list(BBOX(13,13,20,21,LEVEL_CHEST+1, LEVEL_CHEST-1,null)), + LISTEAST = list(BBOX(13,13,20,21,LEVEL_CHEST+1, LEVEL_CHEST-1,null)), + LISTWEST = list(BBOX(13,13,20,21,LEVEL_CHEST+1, LEVEL_CHEST-1,null)) + ) + +/datum/hitboxDatum/atom/closet + boundingBoxes = list( + LISTSOUTH = list(BBOX(9,3,24,32,LEVEL_TURF, LEVEL_HEAD,null)), + LISTNORTH = list(BBOX(9,3,24,32,LEVEL_TURF, LEVEL_HEAD,null)), + LISTEAST = list(BBOX(9,3,24,32,LEVEL_TURF, LEVEL_HEAD,null)), + LISTWEST = list(BBOX(9,3,24,32,LEVEL_TURF, LEVEL_HEAD,null)) + ) + +/datum/hitboxDatum/atom/vendingMachine + boundingBoxes = list( + LISTSOUTH = list(BBOX(4,1,29,31,LEVEL_TURF, LEVEL_HEAD,null)), + LISTNORTH = list(BBOX(4,1,29,31,LEVEL_TURF, LEVEL_HEAD,null)), + LISTEAST = list(BBOX(4,1,29,31,LEVEL_TURF, LEVEL_HEAD,null)), + LISTWEST = list(BBOX(4,1,29,31,LEVEL_TURF, LEVEL_HEAD,null)) + ) + +/datum/hitboxDatum/atom/holopad + boundingBoxes = list( + LISTSOUTH = list(BBOX(8,8,25,25,LEVEL_TURF+3, LEVEL_TURF+6,null)), + LISTNORTH = list(BBOX(8,8,25,25,LEVEL_TURF+3, LEVEL_TURF+6,null)), + LISTEAST = list(BBOX(8,8,25,25,LEVEL_TURF+3, LEVEL_TURF+6,null)), + LISTWEST = list(BBOX(8,8,25,25,LEVEL_TURF+3, LEVEL_TURF+6,null)) + ) + + /datum/hitboxDatum/atom/atmosphericVentScrubber + boundingBoxes = list( + LISTSOUTH = list(BBOX(8,8,24,25,LEVEL_TURF-2, LEVEL_TURF,null)), + LISTNORTH = list(BBOX(8,8,24,25,LEVEL_TURF-2, LEVEL_TURF,null)), + LISTEAST = list(BBOX(8,8,24,25,LEVEL_TURF-2, LEVEL_TURF,null)), + LISTWEST = list(BBOX(8,8,24,25,LEVEL_TURF-2, LEVEL_TURF,null)) + ) + +/datum/hitboxDatum/atom/modularConsole + boundingBoxes = list( + LISTSOUTH = list(BBOX(5,5,28,14,LEVEL_TURF, LEVEL_TABLE,null),BBOX(4 ,15, 29, 30, LEVEL_TURF, LEVEL_HEAD, null)), + LISTNORTH = list(BBOX(5,4,29,29,LEVEL_TURF, LEVEL_TABLE,null),BBOX(5 ,9, 29, 22, LEVEL_TURF, LEVEL_HEAD, null)), + LISTEAST = list(BBOX(5,4,27,26,LEVEL_TURF, LEVEL_TABLE,null),BBOX(9 ,8, 19, 31, LEVEL_TURF, LEVEL_HEAD, null)), + LISTWEST = list(BBOX(5,5,28,26,LEVEL_TURF, LEVEL_TABLE,null),BBOX(14 ,7, 24, 32, LEVEL_TURF, LEVEL_HEAD, null)) + ) + +/datum/hitboxDatum/disposalUnit + boundingBoxes = list( + LISTSOUTH = list(BBOX(8,4,25,28,LEVEL_TURF-2, LEVEL_LOWWALL,null)), + LISTNORTH = list(BBOX(8,4,25,28,LEVEL_TURF-2, LEVEL_LOWWALL,null)), + LISTEAST = list(BBOX(8,4,25,28,LEVEL_TURF-2, LEVEL_LOWWALL,null)), + LISTWEST = list(BBOX(8,4,25,28,LEVEL_TURF-2, LEVEL_LOWWALL,null)) + ) + +/datum/hitboxDatum/atom/atmosphericCanister /datum/hitboxDatum/turf boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) @@ -446,6 +534,9 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/turf/window boundingBoxes = BBOX(0,0,32,32, LEVEL_LOWWALL, LEVEL_ABOVE, null) +/datum/hitboxDatum/turf/door + boundingBoxes = BBOX(0,0,32,32,LEVEL_TURF ,LEVEL_ABOVE,null) + /// This checks line by line instead of a box. Less efficient. /datum/hitboxDatum/atom/polygon boundingBoxes = list( diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index fd34211508..e04fa77574 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -22,6 +22,7 @@ anchored = TRUE density = TRUE layer = LOW_OBJ_LAYER //This allows disposal bins to be underneath tables + hitbox = /datum/hitboxDatum/disposalUnit var/datum/gas_mixture/air_contents // internal reservoir var/mode = DISPOSALS_CHARGING var/flush = 0 // true if flush handle is pulled diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 38c6108116..28b5c7e4ce 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -1882,7 +1882,8 @@ dir = 4 }, /obj/structure/fireaxecabinet{ - pixel_y = -24 + pixel_y = -24; + dir = 1 }, /turf/simulated/floor/tiled/dark, /area/eris/security/armory) @@ -63673,7 +63674,8 @@ /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, /obj/structure/fireaxecabinet{ - pixel_y = 24 + pixel_y = 24; + dir = 2 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/medical/reception) @@ -74303,7 +74305,8 @@ /area/eris/engineering/foyer) "dxB" = ( /obj/structure/fireaxecabinet{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/command/bridge) @@ -83214,7 +83217,8 @@ /obj/machinery/recharger, /obj/machinery/camera/network/engineering, /obj/structure/fireaxecabinet{ - pixel_y = 24 + pixel_y = 24; + dir = 2 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/breakroom) diff --git a/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm b/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm index 3993f22a32..b66af44636 100644 --- a/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm +++ b/maps/submaps/planetary_ruins/ec_old_crash/ec_old_crash.dmm @@ -599,7 +599,8 @@ /obj/effect/floor_decal/industrial/warning, /obj/structure/closet/l3closet, /obj/structure/fireaxecabinet{ - pixel_y = -32 + pixel_y = -32; + dir = 1 }, /obj/machinery/light/small, /turf/simulated/floor/tiled/white/lowpressure, diff --git a/maps/submaps/planetary_ruins/spider_nest/spider_nest.dmm b/maps/submaps/planetary_ruins/spider_nest/spider_nest.dmm index 1eb501e413..5da16b5109 100644 --- a/maps/submaps/planetary_ruins/spider_nest/spider_nest.dmm +++ b/maps/submaps/planetary_ruins/spider_nest/spider_nest.dmm @@ -93,7 +93,8 @@ /obj/item/seeds/random, /obj/effect/decal/cleanable/spiderling_remains, /obj/structure/fireaxecabinet{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /turf/simulated/floor/tiled/cafe, /area/map_template/spider_nest) diff --git a/maps/submaps/planetary_ruins/spider_nest/spider_nest2.dmm b/maps/submaps/planetary_ruins/spider_nest/spider_nest2.dmm index 98433453a8..168af44cc8 100644 --- a/maps/submaps/planetary_ruins/spider_nest/spider_nest2.dmm +++ b/maps/submaps/planetary_ruins/spider_nest/spider_nest2.dmm @@ -121,7 +121,8 @@ "F" = ( /obj/effect/spider/stickyweb, /obj/structure/fireaxecabinet{ - pixel_x = -32 + pixel_x = -32; + dir = 4 }, /obj/effect/decal/cleanable/blood/splatter, /turf/simulated/floor/tiled/white/danger, From 3f445db74ceffa1dcd380554b5684cd2fc9cb287 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 14 Aug 2024 16:37:22 +0300 Subject: [PATCH 158/171] the hitbox hell continues --- code/game/machinery/atmoalter/canister.dm | 1 + code/game/machinery/vending.dm | 1 + .../modular_computers/computers/subtypes/dev_console.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 6 ++++++ 4 files changed, 9 insertions(+) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 205eeddeb8..33cb50517b 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -7,6 +7,7 @@ maxHealth = 100 flags = CONDUCT volumeClass = ITEM_SIZE_HUGE + hitbox = /datum/hitboxDatum/atom/atmosphericCanister var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 8142040660..696a16f9ed 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -91,6 +91,7 @@ layer = BELOW_OBJ_LAYER anchored = TRUE density = TRUE + hitbox = /datum/hitboxDatum/atom/vendingMachine var/icon_vend //Icon_state when vending var/icon_deny //Icon_state when denying access diff --git a/code/modules/modular_computers/computers/subtypes/dev_console.dm b/code/modules/modular_computers/computers/subtypes/dev_console.dm index c06962d0c7..bc86f7910b 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_console.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_console.dm @@ -17,6 +17,7 @@ max_damage = 300 broken_damage = 150 spawn_tags = SPAWN_TAG_MACHINERY + hitbox = /datum/hitboxDatum/atom/modularConsole /obj/item/modular_computer/console/CouldUseTopic(mob/user) ..() diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index aa6e039b69..d20b71a64d 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -486,6 +486,12 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo ) /datum/hitboxDatum/atom/atmosphericCanister + boundingBoxes = list( + LISTSOUTH = list(BBOX(9,3,24,31,LEVEL_TURF, LEVEL_CHEST,null)), + LISTNORTH = list(BBOX(9,3,24,31,LEVEL_TURF, LEVEL_CHEST,null)), + LISTEAST = list(BBOX(9,3,24,31,LEVEL_TURF, LEVEL_CHEST,null)), + LISTWEST = list(BBOX(9,3,24,31,LEVEL_TURF, LEVEL_CHEST,null)) + ) /datum/hitboxDatum/turf boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) From cb07448159846a000fb534dd651260fe95d26504 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 14 Aug 2024 18:50:29 +0300 Subject: [PATCH 159/171] even more hitbxes & fxes & shit --- code/_compile_options.dm | 2 +- code/game/machinery/buttons.dm | 15 +++++++++-- code/game/machinery/camera/camera.dm | 3 +++ code/game/machinery/computer/computer.dm | 1 + code/game/machinery/doors/door.dm | 27 ++++++++----------- code/game/machinery/doors/firedoor.dm | 1 + .../objects/items/devices/radio/intercom.dm | 8 +++++- code/modules/projectiles/hitbox_datums.dm | 4 +-- maps/CEVEris/_CEV_Eris.dmm | 20 +++----------- 9 files changed, 42 insertions(+), 39 deletions(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 65e07ab8fe..496a3ee100 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -48,7 +48,7 @@ // 2 for preloading absolutely everything; //#define LOWMEMORYMODE 1 -#define BULLETDEBUG 1 +//#define BULLETDEBUG 1 //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 2aaf68a378..931b466f7d 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -21,14 +21,25 @@ wifi_sender = new/datum/wifi/sender/button(_wifi_id, src) //// YES this doesn't rely on proper mapping because i can't really replace most of them and wouldn't make sense in most cases anyway.(since pixel_x and pixel_y will always vary etc etc.) - var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y <16)*SOUTH - var/turf/toAttach = get_step(loc, attachmentDir) + var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y < -16)*SOUTH + var/turf/toAttach + if(!attachmentDir) + stack_trace("[src.type] is directly placed ontop of a wall / not on a wall at X:[x] Y:[y] Z:[z], this shoudln't be done so buttons don't show on other sides of the walls.") + color = COLOR_PINK + name = "I am bugged tell devs!!" + desc = "Bugged at X:[x] Y:[y] Z:[z]" + toAttach = get_turf(src) + else + toAttach = get_step(loc, attachmentDir) + dir = reverse_dir[attachmentDir] if(iswall(toAttach)) toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) else stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") // the players need to be confused so they complain about it! + name = "I am bugged tell devs!!" + desc = "Bugged at X:[x] Y:[y] Z:[z]" color = COLOR_PINK diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index f8872458c4..59494ece60 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -66,6 +66,9 @@ /obj/machinery/camera/Initialize(mapload, d) . = ..() + /// sim-camera. + if(!isturf(loc)) + return var/turf/toAttach = get_step(loc, reverse_dir[dir]) if(iswall(toAttach)) diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 732dbfb20d..00d57de195 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -5,6 +5,7 @@ density = TRUE anchored = TRUE use_power = IDLE_POWER_USE + hitbox = /datum/hitboxDatum/atom/modularConsole idle_power_usage = 300 active_power_usage = 300 var/processing = 0 diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 994b429b9c..da8c6afe31 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -48,7 +48,16 @@ /obj/machinery/door/New() GLOB.all_doors += src - ..() + . = ..() + if(density) + layer = closed_layer + update_heat_protection(get_turf(src)) + else + layer = open_layer + + health = maxHealth + + update_nearby_tiles(need_rebuild=TRUE) /obj/machinery/door/Destroy() GLOB.all_doors -= src @@ -67,24 +76,12 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN*1.5) attack_animation(user) -/obj/machinery/door/New() - . = ..() - if(density) - layer = closed_layer - update_heat_protection(get_turf(src)) - else - layer = open_layer - - health = maxHealth - - update_nearby_tiles(need_rebuild=TRUE) - return - /// modifying bounds when the map is not fully loaded causes improper detection /// this was apparent when done through DMMSuite loading , where left/right facing multi-tile /// wouldn't work , because the right turf didn't exist at the moment or was replaced, erasing its /// contents list - SPCR 2024 /obj/machinery/door/Initialize(mapload, d) + . = ..() if(width > 1) if(dir in list(EAST, WEST)) bound_width = width * world.icon_size @@ -93,8 +90,6 @@ bound_width = world.icon_size bound_height = width * world.icon_size - - /obj/machinery/door/Destroy() density = FALSE update_nearby_tiles() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 5be9a37741..c1d9ffb749 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -22,6 +22,7 @@ description_info = "Can be deconstructed by welding closed, screwing and crowbaring the circuits out." icon_state = "door_open" req_one_access = list(access_atmospherics, access_engine_equip, access_medical_equip) + hitbox = /datum/hitboxDatum/turf/door opacity = FALSE density = FALSE layer = BELOW_OPEN_DOOR_LAYER diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 6ae38edb8f..ac0697d4c5 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -115,7 +115,13 @@ /obj/item/device/radio/intercom/Initialize() . = ..() - var/turf/toAttach = get_step(loc, reverse_dir[dir]) + + /// We are a internal intercom, not for game-usage. + if(!isturf(loc)) + return + //// YES this doesn't rely on proper mapping because i can't really replace most of them and wouldn't make sense in most cases anyway.(since pixel_x and pixel_y will always vary etc etc.) + var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y < -16)*SOUTH + var/turf/toAttach = get_step(loc, attachmentDir) if(iswall(toAttach)) toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index d20b71a64d..2d97f65d43 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -421,7 +421,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(11,8,23,25,LEVEL_CHEST-3,LEVEL_CHEST+3,null)) ) - /datum/hitboxDatum/atom/camera +/datum/hitboxDatum/atom/camera boundingBoxes = list( LISTSOUTH = list(BBOX(14,27,17,32,LEVEL_HEAD-3, LEVEL_HEAD+3,null)), LISTNORTH = list(BBOX(12,1,20,7,LEVEL_HEAD-3, LEVEL_HEAD+3,null)), @@ -461,7 +461,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(8,8,25,25,LEVEL_TURF+3, LEVEL_TURF+6,null)) ) - /datum/hitboxDatum/atom/atmosphericVentScrubber +/datum/hitboxDatum/atom/atmosphericVentScrubber boundingBoxes = list( LISTSOUTH = list(BBOX(8,8,24,25,LEVEL_TURF-2, LEVEL_TURF,null)), LISTNORTH = list(BBOX(8,8,24,25,LEVEL_TURF-2, LEVEL_TURF,null)), diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 28b5c7e4ce..2c10d2e984 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -17209,13 +17209,6 @@ /obj/structure/catwalk, /turf/simulated/open, /area/eris/security/barracks) -"aQN" = ( -/obj/structure/catwalk, -/obj/machinery/camera/network/security{ - dir = 8 - }, -/turf/simulated/open, -/area/eris/security/main) "aQO" = ( /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -17235,13 +17228,6 @@ /obj/structure/catwalk, /turf/simulated/open, /area/eris/security/barracks) -"aQR" = ( -/obj/structure/catwalk, -/obj/machinery/camera/network/security{ - dir = 8 - }, -/turf/simulated/open, -/area/eris/security/barracks) "aQT" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -99946,7 +99932,7 @@ /area/eris/hallway/side/section3deck2port) "gey" = ( /obj/machinery/camera/network/research{ - dir = 8 + dir = 1 }, /obj/item/storage/toolbox/mechanical, /obj/structure/table/reinforced, @@ -168353,7 +168339,7 @@ aaA aaa aac aQJ -aQN +aQJ aQT aac aBl @@ -171989,7 +171975,7 @@ aaA aaa aag aQL -aQR +aQL bNB aag aag From 9f227cd88f5b1f60118d1abf267379eaa531111c Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 14 Aug 2024 20:40:41 +0300 Subject: [PATCH 160/171] even omre hitboxes & features. --- code/__DEFINES/__atomFlags.dm | 3 + code/_compile_options.dm | 2 +- code/controllers/subsystems/staverbs.dm | 24 ++++++ code/game/atoms.dm | 2 +- code/game/machinery/atmoalter/pump.dm | 2 + code/game/machinery/atmoalter/scrubber.dm | 2 + code/game/machinery/autolathe/autolathe.dm | 1 + code/game/machinery/buttons.dm | 24 +----- code/game/machinery/camera/camera.dm | 15 +--- .../game/machinery/computer/buildandrepair.dm | 1 + code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock_control.dm | 3 + .../embedded_controller_base.dm | 5 +- code/game/machinery/flasher.dm | 1 + code/game/machinery/holoposter.dm | 7 +- code/game/machinery/kitchen/smartfridge.dm | 3 +- code/game/machinery/lightswitch.dm | 2 + code/game/machinery/machinery.dm | 1 - code/game/machinery/newscaster.dm | 1 + code/game/machinery/requests_console.dm | 1 + code/game/machinery/spaceheater.dm | 1 + code/game/machinery/status_display.dm | 1 + code/game/machinery/turret_control.dm | 1 + code/game/machinery/vending.dm | 1 + .../objects/items/devices/radio/intercom.dm | 22 ++--- code/game/objects/items/devices/spy_bug.dm | 2 + .../crates_lockers/closets/wall_mounted.dm | 1 + .../structures/crates_lockers/crates.dm | 1 + code/game/objects/structures/extinguisher.dm | 12 +-- .../objects/structures/fireaxe_cabinet.dm | 12 +-- code/game/objects/structures/noticeboard.dm | 1 + code/game/objects/structures/signs.dm | 1 + .../game/objects/structures/tank_dispenser.dm | 1 + code/modules/economy/ATM.dm | 1 + code/modules/holomap/holomap.dm | 1 + code/modules/paperwork/photocopier.dm | 1 + code/modules/power/apc.dm | 10 +-- code/modules/power/lighting.dm | 2 + code/modules/power/smes.dm | 1 + code/modules/projectiles/hitbox_datums.dm | 83 +++++++++++++++++++ .../security levels/keycard authentication.dm | 1 + code/modules/shuttles/shuttle_specops.dm | 4 +- 42 files changed, 167 insertions(+), 96 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index 7e3ffc9ecb..1adb194236 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -13,3 +13,6 @@ #define AF_EXPLOSION_IGNORANT (1<<8) /// Uses the aiming level for shooting at the shooter instead. #define AF_PASS_AIMING_LEVEL (1<<9) +/// This is a wall-mounted atom and should be treated as such on initialization. +#define AF_WALL_MOUNTED (1<<10) +#define AF_WALL_MOUNTED_REVERSE_DIR (1<<11) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 496a3ee100..65e07ab8fe 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -48,7 +48,7 @@ // 2 for preloading absolutely everything; //#define LOWMEMORYMODE 1 -//#define BULLETDEBUG 1 +#define BULLETDEBUG 1 //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 diff --git a/code/controllers/subsystems/staverbs.dm b/code/controllers/subsystems/staverbs.dm index 874181fa63..4d4b7dd37f 100644 --- a/code/controllers/subsystems/staverbs.dm +++ b/code/controllers/subsystems/staverbs.dm @@ -70,6 +70,30 @@ SUBSYSTEM_DEF(statverbs) /atom/Initialize() . = ..() initalize_statverbs() + if(atomFlags & AF_WALL_MOUNTED) + //// YES this doesn't rely on proper mapping because i can't really replace most of them and wouldn't make sense in most cases anyway.(since pixel_x and pixel_y will always vary etc etc.) + if(!isturf(loc)) + stack_trace("[src.type] has the AF_WALL_MOUNTED flag, but is not initialized with a valid location(on a turf). Remove it or fix the underlying issue.") + return + var/turf/toAttach + var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y < -16)*SOUTH + if(atomFlags & AF_WALL_MOUNTED_REVERSE_DIR) + if(!attachmentDir) + attachmentDir = dir + else + if(!attachmentDir) + attachmentDir = reverse_dir[dir] + dir = reverse_dir[attachmentDir] + toAttach = get_step(loc, attachmentDir) + + if(iswall(toAttach)) + toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) + else + stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") + // the players need to be confused so they complain about it! + name = "I am bugged tell devs!!" + desc = "Bugged at X:[x] Y:[y] Z:[z]" + color = COLOR_PINK diff --git a/code/game/atoms.dm b/code/game/atoms.dm index a1dfa9f1bc..a9250ce49a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -20,7 +20,7 @@ var/used_now = FALSE //For tools system, check for it should forbid to work on atom for more than one user at time - var/atomFlags = null + var/atomFlags = 0 ///Chemistry. var/reagent_flags = NONE diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index f04c7de03d..2b24f14d6d 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -13,6 +13,8 @@ var/pressuremin = 0 var/pressuremax = 10 * ONE_ATMOSPHERE + hitbox = /datum/hitboxDatum/atom/atmosphericPump + volume = 1000 power_rating = 7500 //7500 W ~ 10 HP diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 7b49fec1af..b5b4b94c43 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -12,6 +12,8 @@ volume = 750 + hitbox = /datum/hitboxDatum/atom/atmosphericScrubber + power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 diff --git a/code/game/machinery/autolathe/autolathe.dm b/code/game/machinery/autolathe/autolathe.dm index dd78e52513..377a99c70e 100644 --- a/code/game/machinery/autolathe/autolathe.dm +++ b/code/game/machinery/autolathe/autolathe.dm @@ -11,6 +11,7 @@ idle_power_usage = 10 active_power_usage = 2000 circuit = /obj/item/electronics/circuitboard/autolathe + hitbox = /datum/hitboxDatum/atom/autolathe var/build_type = AUTOLATHE diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 931b466f7d..3435051b47 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -4,6 +4,7 @@ icon_state = "launcher0" desc = "A remote control switch for something." hitbox = /datum/hitboxDatum/atom/button + atomFlags = AF_WALL_MOUNTED var/id = null var/active = 0 var/operating = 0 @@ -20,29 +21,6 @@ if(_wifi_id && !wifi_sender) wifi_sender = new/datum/wifi/sender/button(_wifi_id, src) - //// YES this doesn't rely on proper mapping because i can't really replace most of them and wouldn't make sense in most cases anyway.(since pixel_x and pixel_y will always vary etc etc.) - var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y < -16)*SOUTH - var/turf/toAttach - if(!attachmentDir) - stack_trace("[src.type] is directly placed ontop of a wall / not on a wall at X:[x] Y:[y] Z:[z], this shoudln't be done so buttons don't show on other sides of the walls.") - color = COLOR_PINK - name = "I am bugged tell devs!!" - desc = "Bugged at X:[x] Y:[y] Z:[z]" - toAttach = get_turf(src) - else - toAttach = get_step(loc, attachmentDir) - dir = reverse_dir[attachmentDir] - - if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) - else - stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") - // the players need to be confused so they complain about it! - name = "I am bugged tell devs!!" - desc = "Bugged at X:[x] Y:[y] Z:[z]" - color = COLOR_PINK - - /obj/machinery/button/Destroy() qdel(wifi_sender) wifi_sender = null diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 59494ece60..709c4e05aa 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -9,6 +9,7 @@ active_power_usage = 10 layer = WALL_OBJ_LAYER hitbox = /datum/hitboxDatum/atom/camera + atomFlags = AF_WALL_MOUNTED var/list/network = list(NETWORK_CEV_ERIS) var/c_tag = null @@ -64,20 +65,6 @@ var/area/A = get_area(src) c_tag = A.get_camera_tag(src) -/obj/machinery/camera/Initialize(mapload, d) - . = ..() - /// sim-camera. - if(!isturf(loc)) - return - var/turf/toAttach = get_step(loc, reverse_dir[dir]) - - if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) - else - stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") - // the players need to be confused so they complain about it! - color = COLOR_PINK - /obj/machinery/camera/Destroy() deactivate(null, 0) //kick anyone viewing out taped = 0 diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index f780c93c83..26859386bd 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -5,6 +5,7 @@ density = TRUE anchored = FALSE matter = list(MATERIAL_STEEL = 5) + hitbox = /datum/hitboxDatum/atom/modularConsole var/state = 0 var/obj/item/electronics/circuitboard/circuit spawn_tags = SPAWN_TAG_MACHINE_FRAME diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index a7bf7ea923..fa2bb15124 100755 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -212,7 +212,7 @@ applies_stasis = 0 /obj/machinery/cryopod/New() - announce = new /obj/item/device/radio/intercom(src) + announce = new /obj/item/device/radio/intercom/internal(src) update_icon() ..() diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index faf9ae43fd..6c5f02f122 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -154,6 +154,9 @@ anchored = TRUE power_channel = STATIC_ENVIRON + atomFlags = AF_WALL_MOUNTED + hitbox = /datum/hitboxDatum/atom/button + var/id_tag var/master_tag var/frequency = 1379 diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 17de6b2e7b..8658077576 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -7,9 +7,12 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 + atomFlags = AF_WALL_MOUNTED + hitbox = /datum/hitboxDatum/atom/button + var/on = TRUE -obj/machinery/embedded_controller/radio/Destroy() +/obj/machinery/embedded_controller/radio/Destroy() SSradio.remove_object(src,frequency) . = ..() diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index f8ef4bd764..36b2da6338 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -5,6 +5,7 @@ desc = "A wall-mounted flashbulb device." icon = 'icons/obj/stationobjs.dmi' icon_state = "mflash1" + atomFlags = AF_WALL_MOUNTED var/id = null var/range = 2 //this is roughly the size of brig cell var/disable = 0 diff --git a/code/game/machinery/holoposter.dm b/code/game/machinery/holoposter.dm index 4a14c90d13..8fd3a6b61b 100644 --- a/code/game/machinery/holoposter.dm +++ b/code/game/machinery/holoposter.dm @@ -7,6 +7,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 80 power_channel = STATIC_ENVIRON + atomFlags = AF_WALL_MOUNTED var/static/list/poster_types = list( "ironhammer" = COLOR_LIGHTING_BLUE_BRIGHT, @@ -46,7 +47,7 @@ src.add_fingerprint(user) if(stat & (NOPOWER)) return - + if(istype(W, /obj/item/tool/multitool)) ui_interact(user) return @@ -99,12 +100,12 @@ "selected" = selected_icon, "icon" = icon2base64html(icon_chache[selected_icon]) ) - + /obj/machinery/holoposter/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) . = ..() if(.) return - + switch(action) if("change") change(params["value"]) diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index 1d86d10b55..1ca99c66e6 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -11,7 +11,8 @@ idle_power_usage = 5 active_power_usage = 100 reagent_flags = NO_REACT - var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. + hitbox = /datum/hitboxDatum/atom/smartfridge + var/global/max_n_of_items = 250 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" var/icon_panel = "smartfridge-panel" diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 5db11d5535..caf99870b5 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -10,6 +10,8 @@ use_power = IDLE_POWER_USE idle_power_usage = 20 power_channel = STATIC_LIGHT + atomFlags = AF_WALL_MOUNTED + hitbox = /datum/hitboxDatum/atom/button var/slow_turning_on = FALSE var/forceful_toggle = FALSE var/on = TRUE diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 22ebd7463d..688a759840 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -130,7 +130,6 @@ GLOB.machines += src InitCircuit() START_PROCESSING(SSmachines, src) - return INITIALIZE_HINT_LATELOAD /obj/machinery/LateInitialize() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 38655a6caf..3d5d4d8fff 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -137,6 +137,7 @@ var/datum/feed_network/news_network = new /datum/feed_network //The global n icon_state = "newscaster_normal" light_range = 0 anchored = TRUE + atomFlags = AF_WALL_MOUNTED var/isbroken = 0 //1 if someone banged it with something heavy var/ispowered = 1 //starts powered, changes with power_change() diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 4c30ef7209..13214c3fbb 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -28,6 +28,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() anchored = TRUE icon = 'icons/obj/terminals.dmi' icon_state = "req_comp0" + atomFlags = AF_WALL_MOUNTED var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department var/list/message_log = list() //List of all messages var/departmentType = 0 //Bitflag. Zero is reply-only. Map currently uses raw numbers instead of defines. diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 430852ae40..03c81ec339 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -6,6 +6,7 @@ name = "space heater" desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the ship on fire." description_info = "Can have its temperature adjusted by opening the panel with a screwdriver and clicking." + hitbox = /datum/hitboxDatum/atom/atmosphericHeater var/obj/item/cell/large/cell var/on = FALSE var/set_temperature = T0C + 50 //K diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index ad05026387..6abdf541c4 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -17,6 +17,7 @@ density = FALSE use_power = IDLE_POWER_USE idle_power_usage = 10 + atomFlags = AF_WALL_MOUNTED var/mode = 1 // 0 = Blank // 1 = Shuttle timer // 2 = Arbitrary message(s) diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 464b14678e..56a75cd0e9 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -13,6 +13,7 @@ icon_state = "control_standby" anchored = TRUE density = FALSE + atomFlags = AF_WALL_MOUNTED var/enabled = 0 var/lethal = 0 var/locked = 1 diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 696a16f9ed..299c98e7db 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1215,6 +1215,7 @@ custom_vendor = TRUE // Chemists can load it for customers can_stock = list(/obj/item/reagent_containers/glass, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/pill, /obj/item/stack/medical, /obj/item/bodybag, /obj/item/device/scanner/health, /obj/item/reagent_containers/hypospray, /obj/item/storage/pill_bottle, /obj/item/reagent_containers/food/snacks/moecube, /obj/item/organ/internal) vendor_department = DEPARTMENT_MEDICAL + atomFlags = AF_WALL_MOUNTED /obj/machinery/vending/wallmed/minor products = list( diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index ac0697d4c5..ade170694f 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -9,9 +9,14 @@ canhear_range = 2 flags = CONDUCT | NOBLOODY hitbox = /datum/hitboxDatum/atom/intercom + atomFlags = AF_WALL_MOUNTED var/number = 0 var/area/linked_area +/// For internal stuff not meant to wall mount +/obj/item/device/radio/intercom/internal + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED + /obj/item/device/radio/intercom/custom name = "ship intercom (Custom)" broadcasting = 0 @@ -113,23 +118,6 @@ icon_state = "intercom-p" addtimer(CALLBACK(src, PROC_REF(loop_area_check)), 30 SECONDS) -/obj/item/device/radio/intercom/Initialize() - . = ..() - - /// We are a internal intercom, not for game-usage. - if(!isturf(loc)) - return - //// YES this doesn't rely on proper mapping because i can't really replace most of them and wouldn't make sense in most cases anyway.(since pixel_x and pixel_y will always vary etc etc.) - var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y < -16)*SOUTH - var/turf/toAttach = get_step(loc, attachmentDir) - - if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) - else - stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") - // the players need to be confused so they complain about it! - color = COLOR_PINK - /obj/item/device/radio/intercom/broadcasting broadcasting = 1 diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 28f2ca63b9..ba0f0c162d 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -59,6 +59,8 @@ origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1, TECH_COVERT = 3) + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED + var/operating = 0 var/obj/item/device/radio/spy/radio var/obj/machinery/camera/spy/selected_camera diff --git a/code/game/objects/structures/crates_lockers/closets/wall_mounted.dm b/code/game/objects/structures/crates_lockers/closets/wall_mounted.dm index 74bb25eb30..bba38bc995 100644 --- a/code/game/objects/structures/crates_lockers/closets/wall_mounted.dm +++ b/code/game/objects/structures/crates_lockers/closets/wall_mounted.dm @@ -5,6 +5,7 @@ icon_state = "wall-locker" anchored = TRUE wall_mounted = TRUE //This handles density in closets.dm + atomFlags = AF_WALL_MOUNTED /obj/structure/closet/wall_mounted/emcloset diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 464dcb7b5c..2a76d4cca1 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -11,6 +11,7 @@ health = 600 maxHealth = 600 price_tag = 50 + hitbox = /datum/hitboxDatum/atom/crate /obj/structure/closet/crate/close() if(!src.opened) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index facbb6ba70..1aacf1ed77 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/closet.dmi' icon_state = "extinguisher_closed" hitbox = /datum/hitboxDatum/atom/fireExtinguisherCabinet + atomFlags = AF_WALL_MOUNTED anchored = TRUE density = FALSE var/obj/item/extinguisher/has_extinguisher @@ -14,17 +15,6 @@ has_extinguisher = new/obj/item/extinguisher(src) update_icon() -/obj/structure/extinguisher_cabinet/Initialize() - . = ..() - var/turf/toAttach = get_step(loc, reverse_dir[dir]) - - if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) - else - stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") - // the players need to be confused so they complain about it! - color = COLOR_PINK - /obj/structure/extinguisher_cabinet/attackby(obj/item/O, mob/user) if(isrobot(user)) return diff --git a/code/game/objects/structures/fireaxe_cabinet.dm b/code/game/objects/structures/fireaxe_cabinet.dm index f1264c530b..a5d2fe94a6 100644 --- a/code/game/objects/structures/fireaxe_cabinet.dm +++ b/code/game/objects/structures/fireaxe_cabinet.dm @@ -5,6 +5,7 @@ anchored = TRUE density = FALSE hitbox = /datum/hitboxDatum/atom/fireAxeCabinet + atomFlags = AF_WALL_MOUNTED var/damage_threshold = 15 var/open @@ -28,17 +29,6 @@ playsound(user, 'sound/effects/Glassbr3.ogg', 100, 1) update_icon() -/obj/structure/fireaxecabinet/Initialize() - . = ..() - - var/turf/toAttach = get_step(loc, reverse_dir[dir]) - if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) - else - stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") - // the players need to be confused so they complain about it! - color = COLOR_PINK - /obj/structure/fireaxecabinet/update_icon() overlays.Cut() if(fireaxe) diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 504f791396..89eba628dd 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -5,6 +5,7 @@ icon_state = "nboard00" density = FALSE anchored = TRUE + atomFlags = AF_WALL_MOUNTED var/notices = 0 /obj/structure/noticeboard/Initialize() diff --git a/code/game/objects/structures/signs.dm b/code/game/objects/structures/signs.dm index e319ea69f3..f9d51c1ebc 100644 --- a/code/game/objects/structures/signs.dm +++ b/code/game/objects/structures/signs.dm @@ -5,6 +5,7 @@ density = FALSE layer = SIGN_LAYER volumeClass = ITEM_SIZE_NORMAL + atomFlags = AF_WALL_MOUNTED /obj/structure/sign/attackby(obj/item/tool as obj, mob/user as mob) //deconstruction if(istype(tool, /obj/item/tool/screwdriver) && !istype(src, /obj/structure/sign/double)) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index 5d0cfdf0f8..d4bbfa3ff2 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -9,6 +9,7 @@ layer = BELOW_OBJ_LAYER spawn_tags = SPAWN_TAG_STRUCTURE_COMMON rarity_value = 50 + hitbox = /datum/hitboxDatum/atom/tankDispenser var/oxygentanks = 10 var/plasmatanks = 10 var/list/oxytanks = list() //sorry for the similar var names diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 7df3bb3d58..ea80f267bc 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -20,6 +20,7 @@ log transactions anchored = TRUE use_power = IDLE_POWER_USE idle_power_usage = 10 + atomFlags = AF_WALL_MOUNTED var/datum/money_account/authenticated_account var/number_incorrect_tries = 0 var/previous_account_number = 0 diff --git a/code/modules/holomap/holomap.dm b/code/modules/holomap/holomap.dm index 6d61c53172..1579d54f0d 100644 --- a/code/modules/holomap/holomap.dm +++ b/code/modules/holomap/holomap.dm @@ -11,6 +11,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 80 active_power_usage = 3000 + atomFlags = AF_WALL_MOUNTED var/use_auto_lights = 1 var/light_power_on = 1 diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index bfa6a51225..279cd38153 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -9,6 +9,7 @@ idle_power_usage = 30 active_power_usage = 200 power_channel = STATIC_EQUIP + hitbox = /datum/hitboxDatum/atom/photocopier var/obj/item/copyitem = null //what's in the copier! var/copies = 1 //how many copies to print! var/toner = 30 //how much toner is left! woooooo~ diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 33c1741063..f9b4d70ead 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -72,6 +72,7 @@ use_power = NO_POWER_USE req_access = list(access_engine_equip) hitbox = /datum/hitboxDatum/atom/areaPowerController + atomFlags = AF_WALL_MOUNTED var/need_sound var/area/area var/areastring @@ -222,15 +223,6 @@ log_mapping("Duplicate APC created at [AREACOORD(src)]. Original at [AREACOORD(area.apc)].") area.apc = src - var/turf/toAttach = get_step(loc, reverse_dir[dir]) - - if(iswall(toAttach)) - toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) - else - stack_trace("[src.type] has no wall to attach itself to at X:[x] Y:[y] Z:[z]") - // the players need to be confused so they complain about it! - color = COLOR_PINK - update_icon() make_terminal() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 8dabf5951b..e66169c1ea 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -166,6 +166,7 @@ use_power = ACTIVE_POWER_USE idle_power_usage = 2 active_power_usage = 20 + atomFlags = AF_WALL_MOUNTED | AF_WALL_MOUNTED_REVERSE_DIR power_channel = STATIC_LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = FALSE // 1 if on, 0 if off var/on_gs = 0 @@ -190,6 +191,7 @@ name = "floorlight fixture" base_state = "floortube" icon_state = "floortube1" + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED layer = 2.5 /obj/machinery/light/small diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 0a25377d5b..97dd6c3137 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -14,6 +14,7 @@ density = TRUE anchored = TRUE use_power = NO_POWER_USE + hitbox = /datum/hitboxDatum/atom/smes var/capacity = 5e6 // maximum charge var/charge = 1e6 // actual charge diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 2d97f65d43..a617da4194 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -493,6 +493,89 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(9,3,24,31,LEVEL_TURF, LEVEL_CHEST,null)) ) +/datum/hitboxDatum/atom/atmosphericPump + boundingBoxes = list( + LISTSOUTH = list(BBOX(6,4,25,27,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTNORTH = list(BBOX(6,4,25,27,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTEAST = list(BBOX(6,4,25,27,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTWEST = list(BBOX(6,4,25,27,LEVEL_TURF, LEVEL_LOWWALL,null)) + ) + +/datum/hitboxDatum/atom/atmosphericScrubber + boundingBoxes = list( + LISTSOUTH = list(BBOX(6,4,29,26,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTNORTH =list(BBOX(6,4,29,26,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTEAST = list(BBOX(6,4,29,26,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTWEST = list(BBOX(6,4,29,26,LEVEL_TURF, LEVEL_LOWWALL,null)) + ) + +/datum/hitboxDatum/atom/atmosphericHeater + boundingBoxes = list( + LISTSOUTH = list(BBOX(8,3,25,23,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTNORTH = list(BBOX(8,3,25,23,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTEAST = list(BBOX(8,3,25,23,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTWEST = list(BBOX(8,3,25,23,LEVEL_TURF, LEVEL_LOWWALL,null)) + ) + +/datum/hitboxDatum/atom/photocopier + boundingBoxes = list( + LISTSOUTH = list(BBOX(7,4,26,27,LEVEL_TURF, LEVEL_TABLE,null)), + LISTNORTH = list(BBOX(7,4,26,27,LEVEL_TURF, LEVEL_TABLE,null)), + LISTEAST = list(BBOX(7,4,26,27,LEVEL_TURF, LEVEL_TABLE,null)), + LISTWEST = list(BBOX(7,4,26,27,LEVEL_TURF, LEVEL_TABLE,null)) + ) + +/datum/hitboxDatum/atom/filingCabinet + boundingBoxes = list( + LISTSOUTH = list(BBOX(11,1,21,23,LEVEL_TURF, LEVEL_TABLE+4,null)), + LISTNORTH = list(BBOX(11,1,21,23,LEVEL_TURF, LEVEL_TABLE+4,null)), + LISTEAST = list(BBOX(11,1,21,23,LEVEL_TURF, LEVEL_TABLE+4,null)), + LISTWEST = list(BBOX(11,1,21,23,LEVEL_TURF, LEVEL_TABLE+4,null)) + ) + +/datum/hitboxDatum/atom/tankDispenser + boundingBoxes = list( + LISTSOUTH = list(BBOX(4,2,30,30,LEVEL_TURF, LEVEL_TABLE+4,null)), + LISTNORTH = list(BBOX(4,2,30,30,LEVEL_TURF, LEVEL_TABLE+4,null)), + LISTEAST = list(BBOX(4,2,30,30,LEVEL_TURF, LEVEL_TABLE+4,null)), + LISTWEST = list(BBOX(4,2,30,30,LEVEL_TURF, LEVEL_TABLE+4,null)) + ) + +/datum/hitboxDatum/atom/smes + boundingBoxes = list( + LISTSOUTH = list(BBOX(1,5,31,26,LEVEL_TURF, LEVEL_TABLE+4,null), BBOX(16,2,31,31, LEVEL_TURF, LEVEL_TABLE+4, null)), + LISTNORTH = list(BBOX(1,5,31,26,LEVEL_TURF, LEVEL_TABLE+4,null), BBOX(16,2,31,31, LEVEL_TURF, LEVEL_TABLE+4, null)), + LISTEAST = list(BBOX(1,5,31,26,LEVEL_TURF, LEVEL_TABLE+4,null), BBOX(16,2,31,31, LEVEL_TURF, LEVEL_TABLE+4, null)), + LISTWEST = list(BBOX(1,5,31,26,LEVEL_TURF, LEVEL_TABLE+4,null), BBOX(16,2,31,31, LEVEL_TURF, LEVEL_TABLE+4, null)) + ) + +/datum/hitboxDatum/atom/crate + boundingBoxes = list( + LISTSOUTH = list(BBOX(4,5,29,22,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTNORTH = list(BBOX(4,5,29,22,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTEAST = list(BBOX(4,5,29,22,LEVEL_TURF, LEVEL_LOWWALL,null)), + LISTWEST = list(BBOX(4,5,29,22,LEVEL_TURF, LEVEL_LOWWALL,null)) + ) + +/datum/hitboxDatum/atom/autolathe + boundingBoxes = list( + LISTSOUTH = list(BBOX(3,3,30,21,LEVEL_TURF, LEVEL_LYING,null), BBOX(3,6,22,30, LEVEL_LYING, LEVEL_TABLE, null)), + LISTNORTH = list(BBOX(3,3,30,21,LEVEL_TURF, LEVEL_LYING,null), BBOX(3,6,22,30, LEVEL_LYING, LEVEL_TABLE, null)), + LISTEAST = list(BBOX(3,3,30,21,LEVEL_TURF, LEVEL_LYING,null), BBOX(3,6,22,30, LEVEL_LYING, LEVEL_TABLE, null)), + LISTWEST = list(BBOX(3,3,30,21,LEVEL_TURF, LEVEL_LYING,null), BBOX(3,6,22,30, LEVEL_LYING, LEVEL_TABLE, null)) + ) + +/datum/hitboxDatum/atom/smartfridge + boundingBoxes = list( + LISTSOUTH = list(BBOX(3,2,30,32,LEVEL_TURF, LEVEL_HEAD,null)), + LISTNORTH = list(BBOX(3,2,30,32,LEVEL_TURF, LEVEL_HEAD,null)), + LISTEAST = list(BBOX(3,2,30,32,LEVEL_TURF, LEVEL_HEAD,null)), + LISTWEST = list(BBOX(3,2,30,32,LEVEL_TURF, LEVEL_HEAD,null)) + ) + + + + /datum/hitboxDatum/turf boundingBoxes = BBOX(0,0,32,32,LEVEL_BELOW ,LEVEL_ABOVE,null) diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index 5d4c3aaea2..38f5ff7b7c 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -8,6 +8,7 @@ active_power_usage = 0 interact_offline = TRUE req_access = list(access_keycard_auth) + atomFlags = AF_WALL_MOUNTED var/static/const/countdown = 3 MINUTES var/static/const/cooldown = 10 MINUTES var/static/list/ongoing_countdowns = list() diff --git a/code/modules/shuttles/shuttle_specops.dm b/code/modules/shuttles/shuttle_specops.dm index 5828786ce2..afd8e09314 100644 --- a/code/modules/shuttles/shuttle_specops.dm +++ b/code/modules/shuttles/shuttle_specops.dm @@ -19,7 +19,7 @@ /datum/shuttle/autodock/ferry/specops/New() ..() - announcer = new /obj/item/device/radio/intercom(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky. + announcer = new /obj/item/device/radio/intercom/internal(null)//We need a fake AI to announce some stuff below. Otherwise it will be wonky. announcer.config(list("Response Team" = 0)) /datum/shuttle/autodock/ferry/specops/proc/radio_announce(var/message) @@ -197,4 +197,4 @@ spawn(0) M.close() special_ops.readyreset()//Reset firealarm after the team launched. - //End Marauder launchpad. \ No newline at end of file + //End Marauder launchpad. From b4bb425c85ddf26a6f4e37e08ead8825f4fd24e9 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Thu, 15 Aug 2024 14:50:09 +0300 Subject: [PATCH 161/171] more fixes & shit --- code/__DEFINES/__atomFlags.dm | 1 - code/__DEFINES/error_handler.dm | 2 +- code/_compile_options.dm | 2 +- code/controllers/subsystems/staverbs.dm | 13 +- code/game/machinery/camera/camera.dm | 10 + code/game/machinery/flasher.dm | 1 + code/game/objects/items/devices/spy_bug.dm | 1 + code/global.dm | 2 +- code/modules/power/lighting.dm | 11 +- code/modules/projectiles/hitbox_datums.dm | 16 +- code/modules/projectiles/projectile.dm | 6 +- icons/obj/lighting.dmi | Bin 46675 -> 47173 bytes maps/CEVEris/_CEV_Eris.dmm | 3161 ++++++++++---------- maps/CEVEris/centcomm.dmm | 268 +- maps/pulsar/pulsar.dmm | 44 +- 15 files changed, 1854 insertions(+), 1684 deletions(-) diff --git a/code/__DEFINES/__atomFlags.dm b/code/__DEFINES/__atomFlags.dm index 1adb194236..0f2424df9d 100644 --- a/code/__DEFINES/__atomFlags.dm +++ b/code/__DEFINES/__atomFlags.dm @@ -15,4 +15,3 @@ #define AF_PASS_AIMING_LEVEL (1<<9) /// This is a wall-mounted atom and should be treated as such on initialization. #define AF_WALL_MOUNTED (1<<10) -#define AF_WALL_MOUNTED_REVERSE_DIR (1<<11) diff --git a/code/__DEFINES/error_handler.dm b/code/__DEFINES/error_handler.dm index 05edb294cb..c2fcb0866f 100644 --- a/code/__DEFINES/error_handler.dm +++ b/code/__DEFINES/error_handler.dm @@ -4,4 +4,4 @@ #define ERROR_MAX_COOLDOWN (ERROR_COOLDOWN * ERROR_LIMIT) #define ERROR_SILENCE_TIME 6000 // How long a unique error will be silenced for // How long to wait between messaging admins about occurrences of a unique error -#define ERROR_MSG_DELAY 50 \ No newline at end of file +#define ERROR_MSG_DELAY 50 diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 65e07ab8fe..496a3ee100 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -48,7 +48,7 @@ // 2 for preloading absolutely everything; //#define LOWMEMORYMODE 1 -#define BULLETDEBUG 1 +//#define BULLETDEBUG 1 //Update this whenever you need to take advantage of more recent byond features #define MIN_COMPILER_VERSION 514 diff --git a/code/controllers/subsystems/staverbs.dm b/code/controllers/subsystems/staverbs.dm index 4d4b7dd37f..bb76919b3c 100644 --- a/code/controllers/subsystems/staverbs.dm +++ b/code/controllers/subsystems/staverbs.dm @@ -75,16 +75,11 @@ SUBSYSTEM_DEF(statverbs) if(!isturf(loc)) stack_trace("[src.type] has the AF_WALL_MOUNTED flag, but is not initialized with a valid location(on a turf). Remove it or fix the underlying issue.") return - var/turf/toAttach var/attachmentDir = (pixel_x > 16)*EAST | (pixel_x < -16)*WEST | (pixel_y > 16)*NORTH | (pixel_y < -16)*SOUTH - if(atomFlags & AF_WALL_MOUNTED_REVERSE_DIR) - if(!attachmentDir) - attachmentDir = dir - else - if(!attachmentDir) - attachmentDir = reverse_dir[dir] - dir = reverse_dir[attachmentDir] - toAttach = get_step(loc, attachmentDir) + if(!attachmentDir) + attachmentDir = reverse_dir[dir] + dir = reverse_dir[attachmentDir] + var/turf/toAttach = get_step(loc, attachmentDir) if(iswall(toAttach)) toAttach.attachGameAtom(src, ATFS_PRIORITIZE_ATTACHED_FOR_HITS, ATFA_EASY_INTERACTIVE | ATFA_DIRECTIONAL_HITTABLE ) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 709c4e05aa..8700162725 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -65,6 +65,16 @@ var/area/A = get_area(src) c_tag = A.get_camera_tag(src) +/obj/machinery/camera/Initialize(mapload, d) + . = ..() + switch(dir) + if(SOUTH) + pixel_y = 20 + if(EAST) + pixel_x = -10 + if(WEST) + pixel_x = 10 + /obj/machinery/camera/Destroy() deactivate(null, 0) //kick anyone viewing out taped = 0 diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 36b2da6338..1109437252 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -29,6 +29,7 @@ base_state = "pflash" density = TRUE range = 3 //the eris' hallways are wider than other maps + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED /obj/machinery/flasher/Initialize() . = ..() diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index ba0f0c162d..ee72da5314 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -149,6 +149,7 @@ /obj/machinery/camera/spy // These cheap toys are accessible from the mercenary camera console as well network = list(NETWORK_MERCENARY) + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED /obj/machinery/camera/spy/New() ..() diff --git a/code/global.dm b/code/global.dm index 0fed59b2ac..3adaaa9790 100644 --- a/code/global.dm +++ b/code/global.dm @@ -116,7 +116,7 @@ var/static/list/scarySounds = list( var/max_explosion_range = 14 // Announcer intercom, because too much stuff creates an intercom for one message then hard del()s it. -var/global/obj/item/device/radio/intercom/global_announcer = new(null) +var/global/obj/item/device/radio/intercom/internal/global_announcer = new(null) var/global/list/mob/living/carbon/human/krabin_linked = list() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index e66169c1ea..13d2d2a6d6 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -166,7 +166,7 @@ use_power = ACTIVE_POWER_USE idle_power_usage = 2 active_power_usage = 20 - atomFlags = AF_WALL_MOUNTED | AF_WALL_MOUNTED_REVERSE_DIR + atomFlags = AF_WALL_MOUNTED power_channel = STATIC_LIGHT //Lights are calc'd via area so they dont need to be in the machine list var/on = FALSE // 1 if on, 0 if off var/on_gs = 0 @@ -248,6 +248,15 @@ if(location.area_light_color) brightness_color = location.area_light_color + if(type == /obj/machinery/light) + switch(dir) + if(SOUTH) + pixel_y = 20 + if(EAST) + pixel_x = -10 + if(WEST) + pixel_x = 10 + update(0) /obj/machinery/light/Destroy() diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index a617da4194..384e2cb005 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -287,18 +287,18 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /datum/hitboxDatum/atom/fixtureLightTube boundingBoxes = list( - LISTNORTH = list(BBOX(4,29,29,32,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), - LISTSOUTH = list(BBOX(4,1,29,4,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), - LISTEAST = list(BBOX(29,4,32,29,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), - LISTWEST = list(BBOX(1,4,4,29,LEVEL_HEAD-1,LEVEL_HEAD+1,null)) + LISTSOUTH = list(BBOX(4,29,29,32,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTNORTH = list(BBOX(4,1,29,4,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTWEST = list(BBOX(29,4,32,29,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTEAST = list(BBOX(1,4,4,29,LEVEL_HEAD-1,LEVEL_HEAD+1,null)) ) /datum/hitboxDatum/atom/fixtureBulb boundingBoxes = list( - LISTNORTH = list(BBOX(14,25,19,32,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), - LISTSOUTH = list(BBOX(14,1,20,8,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), - LISTEAST = list(BBOX(25,14,32,19,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), - LISTWEST = list(BBOX(1,14,8,19,LEVEL_HEAD-1,LEVEL_HEAD+1,null)) + LISTSOUTH = list(BBOX(14,25,19,32,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTNORTH = list(BBOX(14,1,20,8,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTWEST = list(BBOX(25,14,32,19,LEVEL_HEAD-1,LEVEL_HEAD+1,null)), + LISTEAST = list(BBOX(1,14,8,19,LEVEL_HEAD-1,LEVEL_HEAD+1,null)) ) /datum/hitboxDatum/atom/fireAlarm diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 63f6bb5246..25f1b0ace1 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -499,9 +499,6 @@ GLOBAL_LIST(projectileDamageConstants) else return FALSE -/// The lower the index , the higher the priority. If you add new paths to the list , make sure to increase the amount of lists in scanTurf below. -#define HittingPrioritiesList list(/mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) - /// We don't care about order since we are just simulating to see wheter we can reach something or not /proc/simulateBulletScan(turf/scanning, atom/firer, bulletDir, startX, startY, startZ, StepX, StepY, StepZ, passFlags) . = PROJECTILE_CONTINUE @@ -536,6 +533,8 @@ GLOBAL_LIST(projectileDamageConstants) return PROJECTILE_STOP return PROJECTILE_CONTINUE +/// The lower the index , the higher the priority. If you add new paths to the list , make sure to increase the amount of lists in scanTurf below. +#define HittingPrioritiesList list(/obj/machinery/door/blast/shutters/glass, /mob/living,/obj/structure/multiz/stairs/active,/obj/structure,/atom) /obj/item/projectile/proc/scanTurf(turf/scanning, bulletDir, startX, startY, startZ, pStepX, pStepY, pStepZ) . = PROJECTILE_CONTINUE if(atomFlags & AF_VISUAL_MOVE) @@ -545,6 +544,7 @@ GLOBAL_LIST(projectileDamageConstants) hittingList[2] = list() hittingList[3] = list() hittingList[4] = list() + hittingList[5] = list() var/list/sortingList = scanning.contents.Copy() sortingList.Add(scanning) sortingList.Remove(src) diff --git a/icons/obj/lighting.dmi b/icons/obj/lighting.dmi index a45f29ce2504d083ebd6306385a90d1bbec4d100..5c35ca648945a3e0167c47127fd75cf0eed22a6c 100644 GIT binary patch literal 47173 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ΞQt3QqCg-iFUX-#C8k}ypu0%BfY)XO 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 JCTAA%e*iQxj(h+B literal 46675 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 diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 2c10d2e984..42d57b0497 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -138,7 +138,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/range) @@ -203,9 +203,7 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/warden) "aaK" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/dark, /area/eris/security/warden) "aaL" = ( @@ -304,7 +302,7 @@ /area/eris/security/range) "aaW" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -332,9 +330,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/armory) "aba" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/closet, /obj/item/clothing/under/netrunner, /obj/item/clothing/under/netrunner, @@ -569,7 +565,7 @@ "abE" = ( /obj/machinery/deployable/barrier, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/cargo, /area/eris/security/armory) @@ -637,7 +633,7 @@ /area/eris/crew_quarters/toilet/medbay) "abO" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/security/range) @@ -892,7 +888,7 @@ /area/eris/security/armory) "acp" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/security/armory) @@ -1031,7 +1027,7 @@ /area/eris/security/armory) "acF" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -1108,12 +1104,7 @@ pixel_x = 25; pixel_y = 25 }, -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/sign/faction/ironhammer{ - pixel_y = 32 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -1121,6 +1112,9 @@ dir = 1; pixel_y = -22 }, +/obj/structure/sign/faction/ironhammer{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/security/armory) "acM" = ( @@ -1197,7 +1191,9 @@ /turf/simulated/floor/tiled/dark/techfloor, /area/eris/security/disposal) "acW" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -1512,9 +1508,7 @@ /turf/simulated/floor/plating, /area/eris/security/exerooms) "adK" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/alarm{ pixel_y = 26 }, @@ -1667,13 +1661,13 @@ pixel_x = 24 }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/security/disposal) "aee" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/security/prison) @@ -1734,7 +1728,7 @@ dir = 6 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/firealarm{ dir = 4; @@ -1812,7 +1806,7 @@ "aev" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/security/prison) @@ -1848,9 +1842,13 @@ /turf/simulated/floor/plating, /area/eris/security/exerooms) "aeB" = ( -/obj/structure/sign/faction/ironhammer, -/turf/simulated/wall/r_wall, -/area/eris/security/prison) +/obj/structure/table/rack, +/obj/spawner/lowkeyrandom, +/obj/machinery/light{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel/brown_platform, +/area/eris/quartermaster/office) "aeC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 @@ -1879,7 +1877,7 @@ /area/eris/security/armory) "aeF" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/fireaxecabinet{ pixel_y = -24; @@ -2145,7 +2143,7 @@ /area/eris/maintenance/section1deck5central) "afm" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/spawner/junk/low_chance, /turf/simulated/floor/tiled/dark/techfloor_grid, @@ -2162,7 +2160,9 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/prison) "afo" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/camera/network/prison, /obj/machinery/alarm{ pixel_y = 26 @@ -2204,9 +2204,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/wood, /area/eris/command/commander) "afv" = ( @@ -2528,7 +2526,7 @@ /area/eris/maintenance/section2deck5starboard) "ago" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/security/maintpost) @@ -2598,7 +2596,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck5central) "agv" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/prisoncells) "agw" = ( @@ -2754,7 +2754,7 @@ /area/eris/maintenance/section1deck5central) "agJ" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/cable/green{ d1 = 1; @@ -2832,7 +2832,7 @@ }, /obj/machinery/photocopier, /obj/structure/sign/faction/ironhammer{ - pixel_y = 32 + pixel_x = -32 }, /turf/simulated/floor/wood, /area/eris/command/commander) @@ -3204,9 +3204,7 @@ "ahK" = ( /obj/structure/table/standard, /obj/item/clothing/glasses/sunglasses/blindfold, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/item/device/radio/intercom{ dir = 4; pixel_x = -22 @@ -3237,9 +3235,7 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/exerooms) "ahP" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/dark, /area/eris/security/exerooms) "ahQ" = ( @@ -3248,7 +3244,9 @@ /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/security/prison) "ahR" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/spawner/traps/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck5port) @@ -3483,7 +3481,7 @@ pixel_x = -30 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -3538,7 +3536,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/carpet, /area/eris/crew_quarters/sleep) @@ -3568,7 +3566,7 @@ "aiF" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -3636,7 +3634,9 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/exerooms) "aiN" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/closet/secure_closet/injection, /turf/simulated/floor/tiled/dark, /area/eris/security/exerooms) @@ -3918,7 +3918,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -3943,7 +3945,7 @@ /obj/structure/railing, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck5central) @@ -4202,9 +4204,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4351,9 +4351,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, @@ -4379,9 +4377,7 @@ /turf/simulated/floor/tiled/dark/bluecorner, /area/eris/security/exerooms) "ako" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -4433,7 +4429,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck5starboard) "akt" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck5central) "aku" = ( @@ -4613,7 +4611,9 @@ /turf/simulated/floor/tiled/dark/bluecorner, /area/eris/security/exerooms) "akQ" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/prison) "akR" = ( @@ -4710,7 +4710,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_ihsforens1"; name = "Maintenance Hatch Control"; @@ -5007,7 +5009,7 @@ "alR" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/carpet, @@ -5030,7 +5032,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/carpet, /area/eris/crew_quarters/sleep) @@ -5206,7 +5208,9 @@ pixel_x = -3; pixel_y = -3 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/bluecorner, /area/eris/security/exerooms) "amp" = ( @@ -5295,7 +5299,9 @@ /area/eris/crew_quarters/sleep) "amz" = ( /obj/machinery/bodyscanner, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/bluecorner, /area/eris/security/exerooms) "amA" = ( @@ -5317,7 +5323,9 @@ /turf/simulated/floor/tiled/white/bluecorner, /area/eris/security/exerooms) "amD" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/table/glass, /obj/item/storage/toolbox/mechanical, /turf/simulated/floor/tiled/white/bluecorner, @@ -5440,7 +5448,9 @@ /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/maintpost) "amU" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) "amV" = ( @@ -5483,7 +5493,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/maintpost) "ana" = ( @@ -5875,7 +5887,7 @@ /area/eris/maintenance/section2deck5starboard) "anV" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/visible/universal, @@ -5990,7 +6002,7 @@ /area/eris/maintenance/section2deck5port) "aoi" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/spawner/scrap/low_chance, /turf/simulated/floor/plating/under, @@ -6062,7 +6074,7 @@ /area/eris/maintenance/section2deck1starboard) "aot" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck5port) @@ -6206,7 +6218,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark, /area/eris/rnd/podbay) "aoJ" = ( @@ -6399,9 +6413,7 @@ /turf/simulated/wall/r_wall, /area/eris/maintenance/section3deck5starboard) "apo" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/disposaloutlet, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -6593,7 +6605,7 @@ /area/eris/hallway/side/eschangarb) "apO" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/reinforced, /area/eris/rnd/podbay) @@ -6637,7 +6649,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) @@ -6738,9 +6750,7 @@ /area/eris/rnd/podbay) "aqd" = ( /obj/machinery/recharge_station, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/toilet/medbay) "aqe" = ( @@ -6899,7 +6909,7 @@ /area/eris/maintenance/section3deck2starboard) "aqv" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/rnd/podbay) @@ -6945,7 +6955,7 @@ /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck5port) @@ -6976,9 +6986,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck5port) "aqE" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck5starboard) @@ -7199,7 +7207,7 @@ /obj/spawner/material/building/low_chance, /obj/spawner/material/building/low_chance, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/toilet/medbay) @@ -7519,9 +7527,7 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/landmark/storyevent/midgame_stash_spawn{ navigation = "Section 2, floor 1. Medbay toilet." }, @@ -7764,7 +7770,7 @@ /area/eris/maintenance/section2deck5starboard) "ash" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/vending/printomat{ dir = 4 @@ -7893,7 +7899,7 @@ pixel_y = -22 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/toilet/medbay) @@ -7949,7 +7955,7 @@ tag_door = "escape_pod_1_berth_hatch" }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) @@ -8220,9 +8226,7 @@ dir = 4 }, /obj/structure/catwalk, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -8258,7 +8262,7 @@ /area/eris/quartermaster/hangarsupply) "atl" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/fueltankstorage) @@ -8473,9 +8477,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck5starboard) "atS" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, @@ -8529,9 +8531,7 @@ /area/shuttle/escape_pod1/station) "aue" = ( /obj/structure/bed/chair/shuttle, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -8553,9 +8553,7 @@ /turf/space, /area/shuttle/escape_pod1/station) "aui" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/medical_lowcost, /obj/structure/table/standard, /turf/simulated/floor/tiled/techmaint_panels, @@ -8614,9 +8612,7 @@ pixel_y = 24 }, /obj/spawner/junk/low_chance, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/quartermaster/disposaldrop) "aus" = ( @@ -8666,7 +8662,9 @@ /turf/space, /area/shuttle/escape_pod1/station) "aux" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck4port) "auy" = ( @@ -8689,7 +8687,9 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/button/remote/airlock{ desc = "A remote control switch."; id = "unisex_room_2"; @@ -8728,7 +8728,9 @@ /obj/structure/bed/chair/shuttle{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -8822,9 +8824,7 @@ /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) "auT" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -9030,7 +9030,13 @@ /area/eris/quartermaster/hangarsupply) "avy" = ( /obj/machinery/smartfridge/secure/extract, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/biohazard{ + icon_state = "bio-danger"; + pixel_y = -32 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) "avz" = ( @@ -9041,7 +9047,7 @@ /area/eris/quartermaster/disposaldrop) "avA" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/steel, @@ -9834,7 +9840,13 @@ /area/eris/quartermaster/disposaldrop) "axP" = ( /obj/structure/reagent_dispensers/watertank, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/sign/biohazard{ + icon_state = "bio-danger"; + pixel_y = -32 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) "axQ" = ( @@ -10024,7 +10036,9 @@ /turf/simulated/floor/tiled/dark/techfloor, /area/eris/quartermaster/disposaldrop) "ayt" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -10039,9 +10053,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) "ayu" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "ayv" = ( @@ -10076,7 +10088,7 @@ /area/eris/engineering/atmos) "ayy" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -10102,7 +10114,7 @@ /area/eris/crew_quarters/library) "ayB" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -10421,9 +10433,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/disposal) "azt" = ( @@ -10564,9 +10574,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) "azJ" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/button/remote/blast_door{ id = "Armoury"; name = "Armoury Access"; @@ -10587,9 +10595,7 @@ "azM" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -11086,7 +11092,7 @@ id = "disposal" }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/disposal) @@ -11102,7 +11108,7 @@ icon_state = "pipe-c" }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/disposal) @@ -11128,7 +11134,7 @@ "aAX" = ( /obj/structure/reagent_dispensers/fueltank, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/crew_quarters/sleep) @@ -11145,9 +11151,7 @@ /area/eris/security/main) "aBa" = ( /obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/rnd/chargebay) "aBb" = ( @@ -11202,7 +11206,7 @@ "aBf" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/crew_quarters/sleep) @@ -11224,9 +11228,7 @@ name = "Security Requests Console"; pixel_y = 30 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBk" = ( @@ -11252,9 +11254,7 @@ /obj/structure/noticeboard{ pixel_y = 28 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBn" = ( @@ -11329,9 +11329,7 @@ /obj/machinery/door/blast/shutters/glass{ id = "Sky_Driver" }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/prisoncells) "aBy" = ( @@ -11339,7 +11337,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBz" = ( @@ -11370,7 +11370,7 @@ /area/eris/maintenance/section3deck2starboard) "aBE" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/dispenser, /turf/simulated/floor/tiled/dark/gray_platform, @@ -11381,7 +11381,7 @@ /area/eris/maintenance/junk) "aBG" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics) @@ -11412,7 +11412,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/sorter) "aBK" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/suit_storage_unit/moebius, /turf/simulated/floor/tiled/white, /area/eris/rnd/anomal) @@ -11897,7 +11899,7 @@ /area/eris/maintenance/junk) "aCY" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck5port) @@ -11978,9 +11980,12 @@ /turf/simulated/floor/plating/under, /area/eris/engineering/atmos) "aDn" = ( -/obj/structure/sign/department/atmos, -/turf/simulated/wall/r_wall, -/area/eris/engineering/atmos) +/obj/structure/catwalk, +/obj/structure/sign/vacuum{ + pixel_y = -32 + }, +/turf/simulated/floor/plating/under, +/area/eris/maintenance/section4deck5port) "aDo" = ( /obj/structure/multiz/stairs/active/bottom{ dir = 1 @@ -12043,12 +12048,14 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/prison) "aDw" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aDx" = ( @@ -12198,9 +12205,7 @@ /obj/structure/sign/sec2{ pixel_y = 32 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -12211,7 +12216,7 @@ "aDS" = ( /obj/structure/multiz/stairs/enter/bottom, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/lobby) @@ -12226,7 +12231,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/armory) @@ -12287,7 +12292,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) "aEd" = ( @@ -12339,9 +12346,7 @@ /area/shuttle/escape_pod2/station) "aEj" = ( /obj/structure/bed/chair/shuttle, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -12452,7 +12457,7 @@ name = "Junk Beacon Airlock Pump" }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/maintenance/junk) @@ -12662,7 +12667,7 @@ /area/eris/maintenance/section4deck5port) "aEY" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/air_sensor{ frequency = 1441; @@ -12801,9 +12806,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/chargebay) "aFv" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/maintenance/junk) "aFw" = ( @@ -12842,7 +12845,9 @@ /obj/structure/bed/chair/shuttle{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -13006,7 +13011,7 @@ /area/eris/hallway/side/eschangara) "aGb" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/section2deck4starboard) @@ -13257,7 +13262,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13309,7 +13314,7 @@ /area/eris/engineering/atmos) "aGT" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13420,7 +13425,7 @@ /area/eris/engineering/atmos) "aHj" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/reinforced/airless, /area/eris/engineering/atmos) @@ -13467,7 +13472,7 @@ /area/eris/engineering/atmos) "aHr" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/air_sensor{ frequency = 1441; @@ -13509,7 +13514,7 @@ "aHx" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13821,7 +13826,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/chargebay) "aIs" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/section2deck4central) "aIu" = ( @@ -14157,7 +14164,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -14219,7 +14226,7 @@ /area/eris/engineering/atmos) "aJv" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/air_sensor{ frequency = 1443; @@ -14229,7 +14236,9 @@ /turf/simulated/floor/reinforced/airmix, /area/eris/engineering/atmos) "aJw" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/chargebay) "aJx" = ( @@ -14367,7 +14376,7 @@ /area/eris/maintenance/section4deck5port) "aJN" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/air_sensor{ frequency = 1441; @@ -14721,7 +14730,7 @@ "aKO" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck5port) @@ -14733,8 +14742,7 @@ /area/eris/maintenance/junk) "aKQ" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /obj/spawner/junk/low_chance, /turf/simulated/floor/tiled/techmaint, @@ -15443,12 +15451,15 @@ /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/maintenance/section3deck5starboard) "aMM" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/hull, /area/eris/maintenance/junk) "aMN" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/light/small, +/obj/structure/sign/department/atmos{ + pixel_y = -32 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -16054,9 +16065,7 @@ /turf/simulated/floor/reinforced/nitrogen, /area/eris/engineering/atmos) "aOm" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -16140,9 +16149,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck5port) "aOy" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck5port) "aOz" = ( @@ -16241,7 +16248,9 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/rnd/chargebay) "aOM" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/air_sensor{ frequency = 1441; id_tag = "o2_sensor" @@ -16253,7 +16262,9 @@ frequency = 1441; id_tag = "n2_sensor" }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/reinforced/nitrogen, /area/eris/engineering/atmos) "aOO" = ( @@ -16266,9 +16277,11 @@ /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/wastingroom) "aOQ" = ( -/obj/structure/sign/department/atmos, -/turf/simulated/wall/r_wall, -/area/eris/engineering/atmos/storage) +/obj/structure/sign/department/medbay{ + pixel_x = -32 + }, +/turf/simulated/floor/tiled/steel, +/area/eris/hallway/main/section2) "aOR" = ( /obj/spawner/mob/spiders/cluster/low_chance, /turf/simulated/floor/tiled/techmaint, @@ -16305,7 +16318,7 @@ /area/eris/maintenance/section3deck4central) "aOV" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/table/standard{ name = "plastic table frame" @@ -16359,14 +16372,19 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/rnd/chargebay) "aPd" = ( -/obj/structure/sign/department/eng, -/turf/simulated/wall/r_wall, +/obj/structure/multiz/stairs/enter{ + dir = 4 + }, +/obj/structure/sign/faction/technomancers{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/foyer) "aPe" = ( /obj/structure/table/reinforced, /obj/item/electronics/ai_module/corp, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) @@ -16462,7 +16480,9 @@ /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/prisoncells) "aPt" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/door_timer{ id = "Cell 6"; name = "Cell 6"; @@ -16524,7 +16544,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck4central) "aPA" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -16598,6 +16620,9 @@ d2 = 8; icon_state = "4-8" }, +/obj/structure/sign/department/atmos{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos/storage) "aPH" = ( @@ -16963,7 +16988,9 @@ /area/eris/maintenance/section4deck5port) "aQi" = ( /obj/structure/catwalk, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck5port) "aQj" = ( @@ -17000,9 +17027,15 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck5port) "aQo" = ( -/obj/structure/sign/vacuum, -/turf/simulated/wall/r_wall, -/area/eris/maintenance/section4deck5port) +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_x = 32 + }, +/turf/space, +/area/space) "aQp" = ( /obj/machinery/door/airlock/external{ frequency = 1379; @@ -17273,7 +17306,9 @@ name = "Cell 2"; pixel_y = -32 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -17490,9 +17525,7 @@ /area/eris/security/warden) "aRC" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/rnd/lab) "aRD" = ( @@ -17710,7 +17743,7 @@ /area/eris/security/main) "aSb" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/closet/secure_closet/personal/security, /turf/simulated/floor/tiled/dark/gray_platform, @@ -17753,7 +17786,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -17844,7 +17877,7 @@ "aSr" = ( /obj/machinery/vending/security, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -17941,9 +17974,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/rnd/lab) "aSC" = ( @@ -17982,7 +18013,9 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/warden) "aSG" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -18276,7 +18309,9 @@ /turf/simulated/open, /area/eris/security/armory) "aTq" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -18349,7 +18384,9 @@ /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/warden) "aTy" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -18460,7 +18497,7 @@ "aTN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -18498,7 +18535,7 @@ /area/eris/security/main) "aTR" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -18534,7 +18571,7 @@ /area/eris/rnd/lab) "aTV" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/firealarm{ dir = 8; @@ -18932,7 +18969,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, @@ -19202,7 +19241,7 @@ /obj/item/device/radio/off, /obj/item/tool/crowbar, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -19243,7 +19282,7 @@ /area/eris/security/warden) "aVA" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/altar) @@ -19575,7 +19614,7 @@ }, /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -19851,7 +19890,7 @@ "aWP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/medical/virology) @@ -19868,7 +19907,7 @@ /obj/structure/table/standard, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/medical/virology) @@ -20024,7 +20063,7 @@ /obj/item/handcuffs, /obj/item/handcuffs, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -20133,9 +20172,7 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/evidencestorage) "aXB" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/table/rack/shelf, /turf/simulated/floor/tiled/dark, /area/eris/security/evidencestorage) @@ -20272,7 +20309,7 @@ /area/eris/medical/virology) "aXQ" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -20711,7 +20748,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_evidstor"; @@ -20900,7 +20937,9 @@ /turf/simulated/floor/tiled/dark, /area/eris/rnd/podbay) "aZg" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -21436,7 +21475,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck4central) "bad" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -21650,7 +21691,9 @@ /turf/simulated/floor/tiled/techmaint_cargo, /area/eris/maintenance/section1deck4central) "baC" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck4central) "baD" = ( @@ -21665,9 +21708,6 @@ /area/eris/security/main) "baE" = ( /obj/machinery/autolathe/rnd/protolathe/loaded, -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -21792,7 +21832,7 @@ /obj/structure/table/reinforced, /obj/item/electronics/ai_module/robocop, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sign/department/ai{ pixel_x = 32 @@ -22089,9 +22129,7 @@ /obj/structure/railing{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/plating/under, /area/eris/crew_quarters/sleep) "bbB" = ( @@ -22155,9 +22193,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open, /area/eris/crew_quarters/sleep) "bbG" = ( @@ -22186,9 +22222,7 @@ /obj/structure/sign/atmos_air{ pixel_y = 32 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open, /area/eris/crew_quarters/sleep) "bbI" = ( @@ -22199,7 +22233,9 @@ pixel_y = 4 }, /obj/item/storage/box/beakers, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/item/storage/box/syringes{ pixel_x = 3; pixel_y = 3 @@ -22435,7 +22471,9 @@ /obj/item/tank/emergency_oxygen/double, /obj/item/tank/emergency_oxygen/double, /obj/item/tank/emergency_oxygen/double, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/engineering/atmos/storage) "bce" = ( @@ -22555,7 +22593,9 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/open, /area/eris/crew_quarters/sleep) "bcn" = ( @@ -22575,7 +22615,7 @@ /area/eris/crew_quarters/sleep) "bco" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/spawner/flora/low_chance, /turf/simulated/floor/tiled/steel, @@ -23228,7 +23268,7 @@ /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck4central) @@ -23240,7 +23280,7 @@ /area/eris/crew_quarters/sleep) "bdu" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/section4deck4port) @@ -23583,9 +23623,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4central) "beo" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_medbay_rec"; name = "Maintenance Hatch Control"; @@ -23678,7 +23716,7 @@ icon_state = "2-8" }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating, /area/eris/maintenance/substation/section1) @@ -23805,9 +23843,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4central) "beM" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/junk/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck4central) @@ -23986,7 +24022,9 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/camera/network/research{ dir = 8 }, @@ -24021,7 +24059,9 @@ /turf/simulated/wall/r_wall, /area/eris/rnd/chargebay) "bfo" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) "bfp" = ( @@ -24035,6 +24075,9 @@ /obj/machinery/status_display{ pixel_x = -32 }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/rnd/lab) "bfr" = ( @@ -24115,7 +24158,7 @@ "bfD" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/spawner/traps/low_chance, /turf/simulated/floor/tiled/techmaint, @@ -24318,7 +24361,7 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -24404,7 +24447,7 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -24530,7 +24573,7 @@ /area/eris/rnd/chargebay) "bgC" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck4starboard) @@ -24672,7 +24715,7 @@ "bgV" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck4central) @@ -24783,7 +24826,7 @@ /area/eris/maintenance/section2deck4central) "bhk" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/structure/cable/green{ d1 = 2; @@ -24834,9 +24877,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4starboard) "bhq" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -25307,7 +25348,7 @@ /area/eris/maintenance/section3deck1central) "biz" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 2; @@ -25405,7 +25446,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/command/courtroom) @@ -25548,7 +25589,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sign/department/robo{ pixel_x = 32 @@ -25561,7 +25602,7 @@ /obj/item/storage/fancy/vials, /obj/item/storage/fancy/vials, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/power/apc{ dir = 4; @@ -26135,7 +26176,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/button/remote/blast_door{ id = "xenobio2"; @@ -26211,7 +26252,7 @@ /area/eris/hallway/side/morguehallway) "bkr" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/cable/green{ d1 = 1; @@ -26338,7 +26379,7 @@ /area/eris/maintenance/section2deck4central) "bkB" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck4central) @@ -26471,7 +26512,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4central) @@ -26699,9 +26740,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "blt" = ( @@ -27145,7 +27184,9 @@ /turf/simulated/floor/tiled/white/panels, /area/eris/medical/virology) "bmv" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/panels, /area/eris/medical/virology) "bmw" = ( @@ -27458,7 +27499,9 @@ /turf/simulated/floor/tiled/dark, /area/eris/rnd/lab) "bnd" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/smartfridge/disks, /turf/simulated/floor/tiled/dark, /area/eris/rnd/lab) @@ -27710,7 +27753,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -27738,7 +27781,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -27867,7 +27910,9 @@ /turf/simulated/floor/tiled/dark, /area/eris/hallway/side/morguehallway) "bnX" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/item/device/radio/intercom{ dir = 1; pixel_y = -22 @@ -27915,7 +27960,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -28107,9 +28152,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "boD" = ( @@ -28759,9 +28802,7 @@ /area/eris/maintenance/section2deck4central) "bqi" = ( /obj/spawner/pack/machine, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck4central) "bqj" = ( @@ -28961,7 +29002,7 @@ /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4central) @@ -29040,7 +29081,7 @@ /area/eris/maintenance/section1deck3central) "bra" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/toilet/medbay) @@ -29048,7 +29089,9 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/command/courtroom) "brc" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, @@ -29082,7 +29125,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck3central) "brg" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/command/courtroom) "brh" = ( @@ -29148,9 +29193,6 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck4central) "bro" = ( -/obj/machinery/light/small{ - dir = 1 - }, /obj/structure/table/standard{ name = "plastic table frame" }, @@ -29927,8 +29969,7 @@ /area/eris/neotheology/chapelritualroom) "btz" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/quartermaster/disposaldrop) @@ -30007,7 +30048,7 @@ /area/eris/maintenance/section3deck1central) "btK" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) @@ -30238,8 +30279,7 @@ /area/eris/maintenance/section3deck1central) "buo" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck3central) @@ -30491,7 +30531,7 @@ /area/eris/engineering/atmoscontrol) "buX" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -30628,7 +30668,7 @@ /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -31010,7 +31050,7 @@ /area/eris/security/lobby) "bwk" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/lobby) @@ -31026,8 +31066,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) "bwo" = ( -/obj/machinery/light{ - dir = 1 +/obj/machinery/light, +/obj/structure/sign/faction/ironhammer{ + pixel_y = 32 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) @@ -31040,12 +31081,13 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/security/prisoncells) "bwq" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, +/obj/structure/sign/faction/ironhammer{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) "bwr" = ( @@ -31129,7 +31171,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -31147,7 +31191,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -31177,7 +31223,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) "bwA" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -31224,9 +31272,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck4central) "bwF" = ( @@ -31284,7 +31330,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) "bwK" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -31562,7 +31610,7 @@ /area/eris/crew_quarters/clothingstorage) "bxt" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/landmark/storyevent/hidden_vent_antag, /turf/simulated/floor/tiled/steel, @@ -31638,7 +31686,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 2; d2 = 4; @@ -31651,7 +31701,7 @@ /area/eris/engineering/atmoscontrol) "bxF" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/holoposter{ pixel_y = -32 @@ -31675,7 +31725,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -31758,7 +31808,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) "bxR" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) "bxS" = ( @@ -31829,9 +31881,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) "bxX" = ( @@ -31900,7 +31950,7 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -31953,7 +32003,10 @@ /area/eris/medical/surgery) "bym" = ( /obj/machinery/light{ - dir = 4 + dir = 8 + }, +/obj/structure/sign/department/sci{ + pixel_x = 32 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -31985,7 +32038,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/security/prisoncells) "byq" = ( @@ -32023,7 +32078,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -32050,7 +32105,7 @@ /area/eris/hallway/main/section2) "byx" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/structure/sign/department/chem{ pixel_x = -32 @@ -32190,9 +32245,7 @@ /turf/simulated/floor/tiled/steel/danger, /area/eris/engineering/drone_fabrication) "byT" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/drone_fabrication) "byU" = ( @@ -32280,7 +32333,9 @@ /area/eris/maintenance/section4deck4port) "bzf" = ( /obj/machinery/space_heater, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/engineering/atmos/storage) "bzg" = ( @@ -32327,9 +32382,6 @@ /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/engineering/atmos/storage) "bzl" = ( -/obj/structure/sign/atmos_waste{ - pixel_y = -32 - }, /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 10 }, @@ -32337,7 +32389,7 @@ /area/eris/hallway/main/section4) "bzm" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/power/apc{ dir = 4; @@ -32437,7 +32489,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/cyan, /turf/simulated/floor/tiled/steel, @@ -32462,9 +32514,6 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section4) "bzA" = ( -/obj/structure/sign/atmos_air{ - pixel_y = 32 - }, /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 9 }, @@ -32749,7 +32798,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/command/courtroom) "bAd" = ( @@ -32782,7 +32833,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/cryo) "bAi" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/firealarm{ dir = 1; pixel_y = -28 @@ -32796,7 +32849,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/cryo) "bAj" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -32885,9 +32940,7 @@ /obj/machinery/ai_status_display{ pixel_y = 32 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -33127,7 +33180,9 @@ /turf/simulated/floor/plating, /area/eris/maintenance/section3deck1central) "bBa" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck1central) "bBb" = ( @@ -33185,7 +33240,7 @@ /area/eris/maintenance/section4deck4central) "bBk" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, @@ -33361,7 +33416,7 @@ pixel_x = -32 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, @@ -33503,7 +33558,9 @@ d2 = 4; icon_state = "0-4" }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) "bCb" = ( @@ -33569,8 +33626,7 @@ /area/eris/maintenance/section1deck3central) "bCj" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /obj/structure/table/reinforced, /obj/spawner/lowkeyrandom/low_chance, @@ -33633,7 +33689,7 @@ /area/eris/maintenance/section3deck5port) "bCs" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section4) @@ -33840,7 +33896,7 @@ /area/eris/maintenance/section1deck1central) "bCY" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck3central) @@ -33921,9 +33977,7 @@ info = "Directions:
First you'll want to make sure there is a target stake in the center of the magnetic platform. Next, take an aluminum target from the crates back there and slip it into the stake. Make sure it clicks! Next, there should be a control console mounted on the wall somewhere in the room.

This control console dictates the behaviors of the magnetic platform, which can move your firing target around to simulate real-world combat situations. From here, you can turn off the magnets or adjust their electromagnetic levels and magnetic fields. The electricity level dictates the strength of the pull - you will usually want this to be the same value as the speed. The magnetic field level dictates how far the magnetic pull reaches.

Speed and path are the next two settings. Speed is associated with how fast the machine loops through the designated path. Paths dictate where the magnetic field will be centered at what times. There should be a pre-fabricated path input already. You can enable moving to observe how the path affects the way the stake moves. To script your own path, look at the following key:


N: North
S: South
E: East
W: West
C: Center
R: Random (results may vary)
; or &: separators. They are not necessary but can make the path string better visible."; name = "Firing Range Instructions" }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/section1deck1central) "bDn" = ( @@ -34123,7 +34177,9 @@ "bDN" = ( /obj/structure/table/reinforced, /obj/spawner/pack/tech_loot, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/spawner/pack/tech_loot, /turf/simulated/floor/tiled/steel, /area/eris/rnd/docking) @@ -34154,7 +34210,9 @@ /obj/structure/table/reinforced, /obj/item/reagent_containers/glass/beaker/large, /obj/item/reagent_containers/glass/beaker/large, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/docking) "bDT" = ( @@ -34184,7 +34242,7 @@ /area/eris/rnd/docking) "bDW" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) @@ -34405,7 +34463,7 @@ /area/turret_protected/ai) "bEv" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/anomal) @@ -34451,7 +34509,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -34491,8 +34549,10 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) "bEH" = ( -/obj/machinery/light{ - dir = 1 +/obj/machinery/light, +/obj/structure/sign/biohazard{ + icon_state = "bio-danger"; + pixel_y = 32 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -34610,7 +34670,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/button/remote/blast_door{ id = "xenobio1"; @@ -34740,9 +34800,7 @@ /area/eris/maintenance/section1deck3central) "bFh" = ( /obj/structure/catwalk, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -34794,9 +34852,7 @@ /turf/simulated/wall/r_wall, /area/eris/engineering/telecommonitor) "bFn" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/telecomms/server/presets/supply, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -34859,7 +34915,9 @@ /turf/simulated/floor/tiled/steel/monofloor, /area/eris/command/teleporter) "bFt" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 5 }, @@ -34902,7 +34960,9 @@ /obj/machinery/atmospherics/pipe/simple/visible/universal{ dir = 4 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck4central) "bFx" = ( @@ -35058,7 +35118,7 @@ /area/eris/command/tcommsat/chamber) "bFQ" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/telecomms/bus/preset_four, /turf/simulated/floor/bluegrid{ @@ -35450,9 +35510,7 @@ /area/eris/hallway/side/atmosphericshallway) "bGG" = ( /obj/machinery/disposal, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/disposalpipe/trunk, /obj/structure/cable{ d1 = 4; @@ -35482,7 +35540,9 @@ /turf/simulated/floor/plating, /area/eris/command/tcommsat/chamber) "bGK" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 1; d2 = 4; @@ -35602,9 +35662,7 @@ "bGY" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/atmospherics/portables_connector, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology/xenoflora) "bGZ" = ( @@ -35655,7 +35713,7 @@ icon_state = "2-4" }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating, /area/eris/maintenance/substation/section4) @@ -35806,9 +35864,7 @@ /area/eris/engineering/atmos) "bHw" = ( /obj/structure/catwalk, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, @@ -35997,7 +36053,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck3central) "bHP" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/command/tcommsat/computer) "bHQ" = ( @@ -36016,7 +36074,7 @@ /area/eris/maintenance/section1deck3central) "bHR" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/spawner/junk/low_chance, /turf/simulated/floor/plating/under, @@ -36077,7 +36135,7 @@ "bHW" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/simulated/open, @@ -36191,7 +36249,7 @@ /area/eris/maintenance/section4deck4port) "bIl" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) @@ -36220,7 +36278,7 @@ pixel_x = -32 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck4central) @@ -36243,7 +36301,7 @@ "bIt" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 5 @@ -36265,9 +36323,7 @@ /obj/machinery/atmospherics/pipe/simple/visible/red{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open, /area/eris/engineering/atmos) "bIw" = ( @@ -36513,7 +36569,7 @@ /area/eris/engineering/engine_room) "bIQ" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/visible/yellow, /turf/simulated/floor/plating, @@ -36675,9 +36731,6 @@ /area/eris/engineering/engine_room) "bJk" = ( /obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/recharger, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/engine_room) @@ -37021,9 +37074,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck3central) "bJS" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/spawner/material/building, /turf/simulated/floor/plating, /area/eris/engineering/construction) @@ -37211,7 +37262,7 @@ /area/eris/engineering/construction) "bKq" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/cyan{ d1 = 1; @@ -37253,7 +37304,9 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/spawner/flora/low_chance, /turf/simulated/open, /area/eris/crew_quarters/sleep) @@ -37781,9 +37834,7 @@ "bLx" = ( /obj/structure/table/standard, /obj/machinery/recharger, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/holoposter{ pixel_y = 32 }, @@ -37804,7 +37855,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck4central) @@ -37953,7 +38004,7 @@ /area/eris/hallway/side/eschangara) "bLT" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -38019,9 +38070,7 @@ /obj/machinery/computer/cryopod/robot{ pixel_y = 30 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) "bMd" = ( @@ -38408,9 +38457,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) "bMS" = ( @@ -38442,7 +38489,7 @@ /area/eris/security/inspectors_office) "bMV" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/inspectors_office) @@ -38724,9 +38771,7 @@ "bNA" = ( /obj/structure/table/standard, /obj/item/device/aicard, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint_panels, /area/eris/maintenance/section1deck3central) "bNB" = ( @@ -39615,7 +39660,9 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ dir = 1 @@ -39643,7 +39690,7 @@ "bPE" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -39876,9 +39923,7 @@ "bQg" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/structure/reagent_dispensers/watertank/huge, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/extinguisher_cabinet{ pixel_y = 27; dir = 2 @@ -40059,9 +40104,6 @@ /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics) "bQH" = ( -/obj/machinery/light{ - dir = 8 - }, /obj/structure/table/reinforced, /obj/item/reagent_containers/food/drinks/mug, /turf/simulated/floor/tiled/steel/gray_perforated, @@ -40097,7 +40139,7 @@ /area/eris/maintenance/substation/engineering) "bQK" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating, /area/eris/maintenance/substation/engineering) @@ -40349,7 +40391,9 @@ pixel_y = -24; req_access = null }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "bRs" = ( @@ -40512,7 +40556,7 @@ "bRT" = ( /obj/structure/closet/wardrobe/color/grey, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/clothingstorage) @@ -40640,9 +40684,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck3central) "bSk" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/junk/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck3central) @@ -40663,7 +40705,7 @@ }, /obj/machinery/atmospherics/pipe/simple/visible/universal, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck3central) @@ -40860,9 +40902,7 @@ /turf/simulated/floor/wood, /area/eris/command/courtroom) "bSU" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/wood, /area/eris/command/courtroom) "bSV" = ( @@ -41004,9 +41044,7 @@ /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/storage) "bTl" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/storage) "bTm" = ( @@ -41313,7 +41351,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -41418,7 +41456,7 @@ "bUj" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -41686,7 +41724,7 @@ }, /obj/item/paper_bin, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -41733,7 +41771,7 @@ /obj/item/stack/material/steel/random, /obj/item/stack/material/plastic/random, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/crew_quarters/janitor) @@ -41758,7 +41796,7 @@ "bVd" = ( /obj/structure/janitorialcart, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/crew_quarters/janitor) @@ -41926,7 +41964,7 @@ /area/eris/security/lobby) "bVA" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/steel/bluecorner, @@ -41981,7 +42019,7 @@ }, /obj/structure/flora/ausbushes/lavendergrass, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) @@ -42025,9 +42063,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/carpet/bcarpet, /area/eris/security/inspectors_office) "bVL" = ( @@ -42049,7 +42085,7 @@ /area/eris/hallway/main/section1) "bVP" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/computer/rdservercontrol{ dir = 4 @@ -42241,9 +42277,7 @@ /area/eris/rnd/server) "bWs" = ( /obj/structure/closet, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/surgery) "bWt" = ( @@ -42395,7 +42429,7 @@ /area/eris/maintenance/section1deck3central) "bWI" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/storage) @@ -42498,9 +42532,7 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/security/inspectors_office) "bWV" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/omni/filter{ tag_east = 1; tag_south = 5; @@ -42517,7 +42549,7 @@ /area/eris/rnd/mixing) "bWX" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -42950,9 +42982,7 @@ /obj/structure/table/standard, /obj/item/storage/box/gloves, /obj/item/reagent_containers/spray/cleaner, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -42974,7 +43004,7 @@ /area/eris/security/lobby) "bYh" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/hallway/main/section1) @@ -43186,9 +43216,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck3port) "bYM" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/bluegrid{ name = "Server Base"; nitrogen = 180; @@ -43226,7 +43254,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) "bYV" = ( @@ -43426,9 +43456,7 @@ id = "AI"; pixel_y = 24 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -43483,9 +43511,7 @@ id = "AI"; pixel_y = 24 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/cable/cyan{ d1 = 4; d2 = 8; @@ -43584,7 +43610,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) @@ -43593,7 +43619,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -43624,7 +43650,7 @@ /area/eris/hallway/main/section2) "bZT" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -43637,7 +43663,7 @@ /area/turret_protected/ai) "bZV" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/cyan{ d1 = 1; @@ -43722,7 +43748,7 @@ id = "hangar_to_cargo" }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) @@ -43867,7 +43893,7 @@ /area/eris/command/fo) "caB" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/turret_protected/ai) @@ -44211,9 +44237,7 @@ /turf/simulated/floor/wood, /area/eris/command/fo) "cby" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -44239,7 +44263,7 @@ /area/eris/command/fo) "cbC" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) @@ -44307,7 +44331,7 @@ /area/turret_protected/ai) "cbJ" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/cyan{ d1 = 1; @@ -44336,7 +44360,7 @@ /area/eris/command/tcommsat/chamber) "cbM" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -44671,9 +44695,7 @@ /area/eris/rnd/mixing) "ccK" = ( /obj/machinery/hologram/holopad, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/turretid/stun{ check_synth = 1; name = "AI Chamber turret control"; @@ -44912,7 +44934,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/clothingstorage) @@ -45339,7 +45361,9 @@ /turf/simulated/floor/tiled/steel/monofloor, /area/eris/quartermaster/hangarsupply) "ceg" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) "ceh" = ( @@ -45485,9 +45509,7 @@ dir = 2; icon_state = "pipe-c" }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -45522,7 +45544,9 @@ id = "AI"; pixel_y = -24 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) "cez" = ( @@ -45567,7 +45591,9 @@ id = "AI"; pixel_y = -24 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/cyan{ d1 = 4; d2 = 8; @@ -45665,7 +45691,9 @@ }, /area/eris/command/tcommsat/chamber) "ceM" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/manifold/hidden/black, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -45689,7 +45717,9 @@ }, /area/eris/command/tcommsat/chamber) "ceO" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 9 }, @@ -45734,7 +45764,7 @@ "ceS" = ( /obj/machinery/disposal, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/disposalpipe/trunk, /turf/simulated/floor/bluegrid, @@ -45805,7 +45835,7 @@ id = "Bluespace_Biosyphon" }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) @@ -45834,7 +45864,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/wood, /area/eris/command/fo) "cfe" = ( @@ -45943,9 +45975,7 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/storage/tech) "cfs" = ( @@ -45960,7 +45990,9 @@ /obj/spawner/powercell/low_chance, /obj/spawner/powercell/low_chance, /obj/spawner/powercell/low_chance, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/steel/cargo, /area/eris/quartermaster/hangarsupply) @@ -46200,7 +46232,9 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck3starboard) "cfU" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/foyer) "cfV" = ( @@ -46389,7 +46423,9 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) "cgm" = ( @@ -46428,7 +46464,9 @@ /obj/spawner/medical_lowcost/low_chance, /obj/spawner/medical_lowcost/low_chance, /obj/spawner/medical_lowcost/low_chance, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/steel/cargo, /area/eris/quartermaster/hangarsupply) @@ -46565,7 +46603,7 @@ /obj/structure/table/standard, /obj/machinery/recharger, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/item/device/radio/intercom{ dir = 4; @@ -47311,7 +47349,7 @@ /area/eris/rnd/scient) "ciA" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/portable_atmospherics/powered/pump, /turf/simulated/floor/tiled/steel/gray_platform, @@ -47833,15 +47871,15 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "cjT" = ( -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/visible/yellow, +/obj/machinery/light/floor{ + dir = 4 + }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) "cjU" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -47850,7 +47888,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -47934,9 +47972,7 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 8 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "ckh" = ( @@ -48095,14 +48131,12 @@ /obj/machinery/recharger, /obj/structure/table/reinforced, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/rnd/mixing) "ckB" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/table/standard, /obj/spawner/powercell/low_chance, /obj/spawner/powercell/low_chance, @@ -48123,9 +48157,7 @@ /turf/simulated/open, /area/eris/quartermaster/storage) "ckF" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/camera/network/fourth_section{ dir = 4 }, @@ -48175,6 +48207,9 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "ckP" = ( +/obj/structure/sign/department/sci{ + pixel_x = 32 + }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/rnd/lab) "ckQ" = ( @@ -48182,7 +48217,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) "ckS" = ( @@ -48259,9 +48296,7 @@ /turf/simulated/open, /area/eris/quartermaster/storage) "clc" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/table/standard, /obj/spawner/toolbox, /turf/simulated/floor/tiled/techmaint_perforated, @@ -48620,9 +48655,7 @@ /area/eris/crew_quarters/kitchen_storage) "clY" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/flora/ausbushes/ppflowers, /obj/structure/sign/faction/neotheology_cross/gold{ pixel_y = 32 @@ -48695,9 +48728,7 @@ /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/hallway/side/eschangarb) "cmi" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/white, /area/eris/command/mbo) "cmj" = ( @@ -48739,7 +48770,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 @@ -48877,7 +48908,7 @@ /area/eris/maintenance/section3deck4port) "cmD" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/item/device/radio/intercom{ dir = 4; @@ -49153,7 +49184,9 @@ /area/eris/medical/surgery) "cnp" = ( /obj/machinery/meter, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) @@ -49247,9 +49280,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck4central) "cnD" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/junk/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck2central) @@ -49324,7 +49355,7 @@ pixel_x = -2 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay) @@ -49369,7 +49400,7 @@ /area/eris/rnd/mixing) "cnR" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sink{ dir = 4; @@ -49425,7 +49456,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -49434,9 +49465,7 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "coc" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/table/woodentable, /obj/item/storage/fancy/vials, /turf/simulated/floor/carpet, @@ -49479,7 +49508,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/medical/medbay) @@ -49490,7 +49519,9 @@ /obj/item/device/synthesized_instrument/guitar/multi, /obj/item/device/synthesized_instrument/guitar, /obj/item/device/synthesized_instrument/synthesizer, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet/gaycarpet, /area/eris/crew_quarters/artistoffice) "coo" = ( @@ -49581,7 +49612,7 @@ /area/eris/medical/medbay) "coD" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -49712,9 +49743,7 @@ /area/eris/medical/reception) "coP" = ( /obj/machinery/photocopier, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -49773,7 +49802,9 @@ /obj/machinery/computer/guestpass{ pixel_y = -32 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/eris/medical/reception) "coX" = ( @@ -49804,7 +49835,9 @@ dir = 1; pixel_y = -28 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/panels, /area/eris/rnd/scient) "cpb" = ( @@ -49997,7 +50030,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -50014,7 +50047,9 @@ /turf/simulated/floor/tiled/techmaint_perforated, /area/eris/maintenance/section4deck3port) "cpB" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/conveyor/east{ id = "cargo_intake" }, @@ -50091,7 +50126,7 @@ /area/eris/medical/medbay) "cpK" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -50110,7 +50145,7 @@ /area/eris/crew_quarters/kitchen) "cpO" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -50137,7 +50172,9 @@ /turf/simulated/floor/plating, /area/eris/engineering/foyer) "cpR" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "cpU" = ( @@ -50169,16 +50206,24 @@ "cpZ" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics/garden) "cqa" = ( -/obj/structure/sign/faction/neotheology, -/turf/simulated/wall/r_wall, -/area/eris/crew_quarters/hydroponics/garden) +/obj/structure/multiz/stairs/enter{ + dir = 4 + }, +/obj/structure/sign/faction/technomancers{ + pixel_y = -32 + }, +/turf/simulated/floor/tiled/steel/techfloor, +/area/eris/engineering/foyer) "cqb" = ( /obj/structure/disposalpipe/segment, +/obj/structure/sign/faction/neotheology{ + pixel_x = -32 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "cqc" = ( @@ -50269,9 +50314,7 @@ /turf/simulated/floor/tiled/white, /area/eris/medical/medbay) "cqr" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -50311,7 +50354,9 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 8 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/maintenance/section4deck3port) "cqx" = ( @@ -50520,9 +50565,23 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck4starboard) "cqS" = ( -/obj/structure/sign/department/sci, -/turf/simulated/wall/r_wall, -/area/eris/rnd/scient) +/obj/machinery/door/firedoor, +/obj/machinery/door/blast/regular{ + density = 0; + icon_state = "pdoor0"; + id = "EngineeringTotalLockdown"; + layer = 2.6; + name = "Engineering Total Lockdown"; + opacity = 0 + }, +/obj/machinery/door/airlock/glass_engineering{ + name = "Engineering Lobby Access" + }, +/obj/structure/sign/faction/technomancers{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/steel/cargo, +/area/eris/engineering/foyer) "cqT" = ( /obj/structure/catwalk, /obj/structure/table/rack/shelf, @@ -50554,9 +50613,23 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "cqY" = ( -/obj/structure/sign/department/sci, -/turf/simulated/wall, -/area/eris/rnd/lab) +/obj/machinery/door/firedoor, +/obj/machinery/door/blast/regular{ + density = 0; + icon_state = "pdoor0"; + id = "EngineeringTotalLockdown"; + layer = 2.6; + name = "Engineering Total Lockdown"; + opacity = 0 + }, +/obj/machinery/door/airlock/glass_engineering{ + name = "Engineering Lobby Access" + }, +/obj/structure/sign/department/eng{ + pixel_y = -32 + }, +/turf/simulated/floor/tiled/steel/cargo, +/area/eris/engineering/foyer) "crb" = ( /obj/effect/window_lwall_spawn/smartspawn, /obj/machinery/door/firedoor, @@ -50768,9 +50841,7 @@ /area/eris/maintenance/section2deck3port) "crz" = ( /obj/machinery/vending/cola, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/sign/pods{ pixel_y = 32 }, @@ -50808,9 +50879,6 @@ dir = 2; icon_state = "pipe-c" }, -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -50879,7 +50947,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -50922,7 +50990,9 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "crS" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/disposal, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -51092,6 +51162,9 @@ pixel_x = -24; req_access = null }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/cryo) "cso" = ( @@ -51105,7 +51178,7 @@ /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck4central) @@ -51326,7 +51399,7 @@ /area/eris/quartermaster/storage) "csX" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -51355,6 +51428,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/structure/sign/faction/neotheology_cross{ + pixel_x = -32 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "ctd" = ( @@ -51456,7 +51532,7 @@ /area/eris/maintenance/junk) "ctw" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck3port) @@ -51564,9 +51640,7 @@ /obj/structure/multiz/stairs/enter{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "ctP" = ( @@ -51709,7 +51783,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) @@ -51908,7 +51982,7 @@ /area/eris/command/meo) "cuM" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -52039,7 +52113,7 @@ }, /obj/item/bluespace_harpoon, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/carpet/purcarpet, /area/eris/command/meo) @@ -52181,7 +52255,7 @@ /area/eris/hallway/side/bridgehallway) "cvD" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/green{ @@ -52279,7 +52353,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/computer/message_monitor{ dir = 4 @@ -52979,7 +53053,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/flora/ausbushes/lavendergrass, /turf/simulated/floor/grass, @@ -53082,9 +53156,7 @@ "cxP" = ( /obj/structure/table/standard, /obj/spawner/pack/tech_loot, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint_panels, /area/eris/maintenance/section1deck4central) "cxQ" = ( @@ -53113,6 +53185,9 @@ /obj/spawner/lathe_disk, /obj/spawner/lathe_disk, /obj/item/computer_hardware/hard_drive/portable/design/tools, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) "cxT" = ( @@ -53249,9 +53324,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -53306,9 +53379,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -53381,7 +53452,7 @@ /area/eris/rnd/research) "cyv" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/research) @@ -53395,7 +53466,7 @@ "cyy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atm{ dir = 8; @@ -53490,6 +53561,9 @@ /obj/item/modular_computer/console/preset/engineering/power{ dir = 4 }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/engine_room) "cyP" = ( @@ -53670,7 +53744,7 @@ /area/eris/quartermaster/storage) "czn" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/floodlight, /turf/simulated/floor/tiled/steel/danger, @@ -54163,7 +54237,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -54382,7 +54456,7 @@ "cAU" = ( /obj/machinery/shieldwallgen, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/maintenance/section4deck3port) @@ -54591,7 +54665,7 @@ /area/eris/crew_quarters/kitchen) "cBs" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -54639,7 +54713,9 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck4port) "cBy" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 1; d2 = 8; @@ -54852,7 +54928,7 @@ /area/eris/maintenance/section1deck2central) "cBZ" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/hallway/side/bridgehallway) @@ -54924,9 +55000,7 @@ /area/eris/crew_quarters/kitchen) "cCj" = ( /obj/structure/lattice, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open, /area/eris/quartermaster/storage) "cCk" = ( @@ -54992,7 +55066,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/atmosphericshallway) "cCs" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, @@ -55052,7 +55128,7 @@ "cCA" = ( /obj/structure/reagent_dispensers/cahorsbarrel, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/neotheology/storage) @@ -55078,7 +55154,9 @@ /obj/spawner/rations, /obj/spawner/rations, /obj/spawner/rations, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "cCE" = ( @@ -55094,7 +55172,7 @@ /area/eris/hallway/side/bridgehallway) "cCG" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/bar_dance, /area/eris/crew_quarters/bar) @@ -55347,9 +55425,7 @@ /obj/machinery/recharger, /obj/item/cell/large/high, /obj/item/cell/large/high, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -55390,7 +55466,9 @@ dir = 1; pixel_y = -23 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) "cDt" = ( @@ -55429,7 +55507,9 @@ /turf/simulated/floor/carpet/turcarpet, /area/eris/crew_quarters/clothingstorage) "cDy" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/recharge_station, /turf/simulated/floor/tiled/steel/bar_dance, /area/eris/crew_quarters/bar) @@ -55805,7 +55885,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck4central) "cEw" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/button/remote/blast_door/id_card{ dir = 1; id = "atomic_distillery"; @@ -55928,9 +56010,7 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/command/exultant/quarters) "cEJ" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -55974,7 +56054,7 @@ /area/eris/engineering/engeva) "cEO" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/hologram/holopad, /obj/structure/sign/faction/technomancers{ @@ -56180,7 +56260,7 @@ /area/eris/maintenance/section3deck4starboard) "cFo" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/neotheology/office) @@ -56288,7 +56368,7 @@ /obj/structure/disposalpipe/segment, /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck4central) @@ -56355,9 +56435,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -56399,7 +56477,9 @@ /obj/structure/table/reinforced, /obj/item/clothing/gloves/insulated, /obj/item/storage/belt/utility, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/command/exultant/quarters) "cFN" = ( @@ -56504,7 +56584,7 @@ /area/eris/quartermaster/office) "cGa" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -56539,9 +56619,7 @@ /area/eris/rnd/storage) "cGf" = ( /obj/machinery/portable_atmospherics/canister/plasma, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/white/cargo, /area/eris/rnd/storage) "cGg" = ( @@ -57201,7 +57279,9 @@ /turf/simulated/floor/tiled/steel/panels, /area/eris/engineering/post) "cHO" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/steel/panels, /area/eris/engineering/post) @@ -57382,7 +57462,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/command/bridge) @@ -57618,6 +57698,9 @@ /obj/machinery/door/airlock/glass_engineering{ name = "Engineering Lobby Access" }, +/obj/structure/sign/department/eng{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/engineering/foyer) "cIZ" = ( @@ -57776,9 +57859,7 @@ /turf/simulated/wall, /area/eris/maintenance/substation/section3) "cJx" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/autolathe/nanoforge, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -57809,7 +57890,9 @@ /turf/simulated/floor/tiled/steel/cargo, /area/eris/quartermaster/miningdock) "cJA" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, @@ -57838,7 +57921,7 @@ /area/eris/maintenance/section2deck2starboard) "cJE" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sign/sec4{ pixel_x = 32 @@ -58040,7 +58123,9 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/engeva) "cKe" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -58200,9 +58285,7 @@ /turf/simulated/floor/tiled/steel/cargo, /area/eris/hallway/main/section4) "cKu" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint_panels, /area/eris/maintenance/section1deck2central) @@ -58377,7 +58460,7 @@ /area/eris/hallway/main/section4) "cKP" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, @@ -58424,7 +58507,7 @@ /obj/item/cell/large/high, /obj/item/cell/large/high, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/hallway/side/section3starboard) @@ -58558,8 +58641,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/red{ dir = 9 }, -/obj/effect/window_lwall_spawn/smartspawn, -/turf/simulated/floor/plating, +/turf/simulated/wall, /area/eris/hallway/main/section4) "cLp" = ( /obj/structure/dispenser/oxygen, @@ -58623,7 +58705,7 @@ /area/eris/maintenance/section4deck3port) "cLy" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -59011,9 +59093,7 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "cMt" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/camera/network/third_section{ dir = 8 }, @@ -59207,7 +59287,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -59276,12 +59356,14 @@ /area/eris/rnd/storage) "cNv" = ( /obj/structure/catwalk, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck3port) "cNx" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck2starboard) @@ -59334,7 +59416,9 @@ /area/eris/engineering/breakroom) "cNG" = ( /obj/machinery/portable_atmospherics/powered/scrubber, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/white/cargo, /area/eris/rnd/storage) "cNH" = ( @@ -59515,7 +59599,9 @@ /turf/simulated/floor/plating, /area/eris/rnd/xenobiology) "cOj" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "cOl" = ( @@ -59616,8 +59702,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/cyan{ dir = 10 }, -/obj/effect/window_lwall_spawn/smartspawn, -/turf/simulated/floor/plating, +/turf/simulated/wall, /area/eris/hallway/main/section4) "cOA" = ( /obj/structure/disposalpipe/segment, @@ -59900,9 +59985,7 @@ pixel_y = 26 }, /obj/item/bedsheet/yellow, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/unary/vent_scrubber/on, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/breakroom) @@ -59965,9 +60048,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck2starboard) "cPx" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -60024,9 +60105,7 @@ }, /area/shuttle/mining/station) "cPF" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "3,21" }, @@ -60045,7 +60124,9 @@ }, /area/shuttle/mining/station) "cPJ" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_pump/high_volume{ dir = 4; frequency = 1380; @@ -60353,7 +60434,7 @@ "cQC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "12,20" @@ -60376,7 +60457,7 @@ /area/shuttle/mining/station) "cQF" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/bluegrid{ name = "Mainframe Base" @@ -60484,7 +60565,7 @@ /obj/item/device/lighting/glowstick/flare, /obj/item/device/lighting/glowstick/flare, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sign/sec4{ pixel_x = 32 @@ -60613,7 +60694,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "10,19" }, @@ -60804,7 +60887,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/hallway/main/section4) @@ -61006,9 +61089,7 @@ /area/eris/maintenance/section4deck3port) "cSt" = ( /obj/effect/decal/cleanable/dirt, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck2starboard) @@ -61211,7 +61292,7 @@ /area/eris/rnd/xenobiology) "cSY" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/rnd/research) @@ -61254,7 +61335,7 @@ /area/shuttle/mining/station) "cTf" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor/mining{ icon_state = "6,16" @@ -61270,7 +61351,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "8,16" @@ -61354,18 +61435,13 @@ d2 = 8; icon_state = "0-8" }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/power/smes/buildable/substation{ RCon_tag = "Substation - Third Section" }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/substation/section3) "cTt" = ( -/obj/machinery/light{ - dir = 8 - }, /obj/item/modular_computer/console/preset/engineering/rcon{ dir = 4 }, @@ -61580,7 +61656,7 @@ icon_state = "plant-01" }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -61602,7 +61678,7 @@ icon_state = "plant-21" }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -61724,9 +61800,7 @@ /area/shuttle/mining/station) "cUr" = ( /obj/structure/ore_box, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "13,14" }, @@ -61845,7 +61919,9 @@ }, /area/shuttle/mining/station) "cUL" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "11,13" }, @@ -62056,7 +62132,7 @@ /area/shuttle/mining/station) "cVm" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor/mining{ icon_state = "6,12" @@ -62070,7 +62146,7 @@ "cVo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "8,12" @@ -62237,7 +62313,7 @@ /obj/item/clothing/gloves/latex, /obj/item/hand_labeler, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/xenobiology) @@ -62620,7 +62696,9 @@ /turf/simulated/floor/carpet, /area/eris/security/inspectors_office) "cWF" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/spawner/traps/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck3port) @@ -62991,9 +63069,7 @@ /area/shuttle/mining/station) "cXC" = ( /obj/structure/closet/secure_closet/personal/miner, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "4,9" }, @@ -63179,7 +63255,7 @@ /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck2starboard) @@ -63193,7 +63269,9 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/breakroom) "cXX" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/spawner/junk/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck2port) @@ -63742,9 +63820,7 @@ }, /area/shuttle/mining/station) "cZf" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "10,7" }, @@ -63906,9 +63982,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -64170,7 +64244,7 @@ pixel_y = 28 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/medbay/iso) @@ -64365,7 +64439,9 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "4,4" }, @@ -64525,7 +64601,7 @@ /obj/item/reagent_containers/food/drinks/bottle/small/beer, /obj/item/reagent_containers/food/drinks/bottle/small/beer, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "7,3" @@ -64548,7 +64624,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor/mining{ icon_state = "10,3" @@ -64880,9 +64956,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/catwalk, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck2port) @@ -65134,9 +65208,7 @@ /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/medbay/iso) "dcy" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/medical/chemistry) "dcz" = ( @@ -65616,9 +65688,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "ddE" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -65817,7 +65887,7 @@ pixel_x = 25 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -65909,7 +65979,7 @@ icon_state = "pipe-j2" }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -65944,7 +66014,7 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -65984,7 +66054,7 @@ "deq" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/command/bridgebar) @@ -66489,7 +66559,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/command/captain) @@ -66527,7 +66597,9 @@ pixel_x = 8 }, /obj/item/disk/nuclear, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet/turcarpet, /area/eris/command/captain) "dfB" = ( @@ -66543,7 +66615,7 @@ "dfD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/item/device/radio/intercom{ dir = 8; @@ -66571,7 +66643,7 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -66707,7 +66779,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/wood, /area/eris/command/captain) "dgb" = ( @@ -66779,6 +66853,9 @@ d2 = 4; icon_state = "0-4" }, +/obj/machinery/light/small{ + dir = 4 + }, /turf/simulated/floor/plating, /area/eris/maintenance/substation/bridge) "dgj" = ( @@ -66995,9 +67072,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -67051,9 +67126,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/light_switch{ pixel_y = 28 }, @@ -67193,9 +67266,7 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) "dgZ" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -67226,9 +67297,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/light_switch{ pixel_y = 28 }, @@ -67531,7 +67600,7 @@ /obj/structure/bed/padded, /obj/item/bedsheet/rd, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/command/meo/quarters) @@ -67601,7 +67670,7 @@ /area/eris/command/meeting_room) "dhU" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -67612,7 +67681,7 @@ /obj/item/hand_labeler, /obj/item/packageWrap, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) @@ -67678,7 +67747,7 @@ /obj/structure/table/woodentable, /obj/item/storage/box/donut, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -67931,9 +68000,6 @@ }, /area/eris/hallway/main/section3) "diI" = ( -/obj/machinery/light/small{ - dir = 8 - }, /obj/structure/cable/green{ d1 = 2; d2 = 4; @@ -67952,9 +68018,7 @@ "diK" = ( /obj/structure/closet, /obj/spawner/contraband/low_chance, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "diL" = ( @@ -67987,7 +68051,7 @@ "diO" = ( /obj/structure/railing, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/open, /area/turret_protected/ai) @@ -68543,7 +68607,7 @@ /area/eris/security/checkpoint/science) "djZ" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -68582,7 +68646,7 @@ /area/eris/hallway/side/atmosphericshallway) "dkd" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -68837,7 +68901,7 @@ /area/eris/maintenance/substation/bridge) "dkJ" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/railing{ dir = 1 @@ -69125,9 +69189,7 @@ /turf/simulated/floor, /area/eris/rnd/research) "dln" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -69361,9 +69423,7 @@ desc = "BIOHAZARD. Toxic biomatter in this area."; pixel_y = 32 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -69551,7 +69611,9 @@ /obj/machinery/camera/network/research{ dir = 8 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/rnd/research) "dmn" = ( @@ -69620,7 +69682,7 @@ /obj/structure/table/woodentable, /obj/item/clothing/glasses/hud/health, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/command/mbo/quarters) @@ -69677,7 +69739,7 @@ "dmC" = ( /obj/structure/railing, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/floor/plating/under, @@ -69849,9 +69911,7 @@ /area/eris/command/exultant/quarters) "dmS" = ( /obj/structure/bed/chair/wood, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, @@ -69885,7 +69945,9 @@ /turf/simulated/floor/reinforced, /area/eris/maintenance/section2deck1starboard) "dmZ" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/reinforced, /area/eris/maintenance/section2deck1starboard) "dna" = ( @@ -70324,7 +70386,7 @@ icon_state = "1-2" }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -70434,7 +70496,7 @@ pixel_x = -32 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck2port) @@ -70498,9 +70560,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck4starboard) "doo" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/white/techfloor, /area/eris/medical/medeva) "dop" = ( @@ -70575,6 +70635,9 @@ pixel_x = -24; pixel_y = -5 }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/checkpoint/supply) "dow" = ( @@ -70700,7 +70763,9 @@ /turf/simulated/floor/tiled/techmaint_cargo, /area/eris/maintenance/section1deck1central) "doL" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck4starboard) "doM" = ( @@ -70900,8 +70965,7 @@ /area/eris/maintenance/section1deck1central) "dpj" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /obj/effect/decal/cleanable/graffiti{ pixel_x = -30; @@ -70929,7 +70993,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -70943,9 +71007,7 @@ /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/reception) "dpq" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, @@ -71042,7 +71104,7 @@ /area/eris/rnd/research) "dpE" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/maintenance/junk) @@ -71126,7 +71188,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/tiled/white, @@ -71203,7 +71267,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, @@ -71477,7 +71543,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) @@ -71637,7 +71703,7 @@ /area/eris/medical/medbay/iso) "drf" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -71669,7 +71735,7 @@ /area/eris/maintenance/section4deck2starboard) "drj" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/holoposter{ pixel_x = 32 @@ -71830,9 +71896,7 @@ /turf/simulated/floor/tiled/white, /area/eris/hallway/main/section2) "drB" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/hallway/main/section2) "drC" = ( @@ -71998,7 +72062,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/flasher{ id = "Cell 3"; pixel_y = -28 @@ -72115,7 +72181,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/security/prisoncells) "dsk" = ( @@ -72434,7 +72502,7 @@ /area/eris/medical/medbay/iso) "dtb" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -72523,7 +72591,9 @@ /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/checkpoint/supply) "dto" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -72683,9 +72753,7 @@ /area/eris/maintenance/section3deck4starboard) "dtE" = ( /obj/spawner/scrap, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/maintenance/section3deck4starboard) "dtF" = ( @@ -72816,9 +72884,7 @@ /area/eris/maintenance/section3deck4starboard) "dtZ" = ( /obj/spawner/scrap/dense, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/maintenance/section3deck4starboard) "dua" = ( @@ -72846,9 +72912,6 @@ /turf/simulated/floor/tiled/techmaint_cargo, /area/eris/hallway/main/section2) "dud" = ( -/obj/machinery/light{ - dir = 4 - }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/checkpoint/supply) "due" = ( @@ -73009,7 +73072,9 @@ name = "plastic table frame" }, /obj/item/lipstick/random, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet/purcarpet, /area/eris/rnd/research) "dux" = ( @@ -73152,7 +73217,7 @@ icon_state = "0-8" }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating, /area/eris/engineering/engine_room) @@ -73318,8 +73383,10 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "duY" = ( -/obj/structure/sign/faction/neotheology, -/turf/simulated/wall/r_wall, +/obj/structure/sign/faction/neotheology_cross/gold{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "duZ" = ( /obj/structure/multiz/stairs/active/bottom{ @@ -73331,9 +73398,7 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "dvb" = ( @@ -73343,7 +73408,7 @@ /area/eris/engineering/engine_room) "dvc" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/hallway/main/section2) @@ -73351,7 +73416,9 @@ /turf/simulated/wall/r_wall, /area/eris/maintenance/section3deck3starboard) "dve" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/storage) "dvf" = ( @@ -73414,7 +73481,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) @@ -73461,7 +73528,7 @@ /area/eris/command/bridge) "dvy" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/firealarm{ dir = 8; @@ -73482,9 +73549,7 @@ /area/eris/hallway/main/section2) "dvA" = ( /obj/machinery/power/nt_obelisk, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "dvB" = ( @@ -73743,9 +73808,7 @@ /obj/structure/railing{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/visible{ dir = 4 }, @@ -73828,7 +73891,7 @@ /area/eris/maintenance/section3deck2port) "dwq" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/sign/department/eva{ pixel_x = -32 @@ -73929,7 +73992,9 @@ pixel_x = -2; pixel_y = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay) "dwE" = ( @@ -73977,7 +74042,9 @@ /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay) "dwJ" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/table/reinforced, /obj/item/storage/toolbox/emergency, /obj/spawner/firstaid, @@ -74069,6 +74136,9 @@ pixel_y = 24 }, /obj/spawner/junk/low_chance, +/obj/machinery/status_display{ + pixel_y = -32 + }, /turf/simulated/floor/tiled/dark/panels, /area/eris/maintenance/oldbridge) "dwW" = ( @@ -74079,6 +74149,9 @@ /obj/item/device/radio/intercom{ pixel_y = 24 }, +/obj/machinery/status_display{ + pixel_y = -32 + }, /turf/simulated/floor/tiled/dark/panels, /area/eris/maintenance/oldbridge) "dwY" = ( @@ -74093,7 +74166,9 @@ /turf/simulated/floor/tiled/dark/panels, /area/eris/maintenance/oldbridge) "dxa" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/item/modular_computer/console/preset/civilian/professional{ dir = 1 }, @@ -74136,7 +74211,9 @@ name = "Medbay Therapy Exit Button"; pixel_y = -26 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay) "dxf" = ( @@ -74149,9 +74226,11 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/foyer) "dxh" = ( -/obj/machinery/status_display, -/turf/simulated/wall/r_wall, -/area/eris/maintenance/oldbridge) +/obj/structure/sign/faction/frozenstar{ + pixel_y = -32 + }, +/turf/simulated/floor/tiled/techmaint, +/area/eris/maintenance/section3deck1central) "dxi" = ( /obj/structure/computerframe{ anchored = 1; @@ -74193,7 +74272,7 @@ /area/eris/maintenance/section2deck3port) "dxo" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/genetics) @@ -74245,9 +74324,7 @@ /turf/simulated/floor/tiled/white, /area/eris/command/mbo) "dxw" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/camera/network/second_section{ dir = 8 }, @@ -74381,8 +74458,10 @@ /turf/simulated/floor/tiled/steel/cargo, /area/eris/quartermaster/misc) "dxN" = ( -/obj/machinery/light/small{ - dir = 1 +/obj/machinery/light/small, +/obj/machinery/status_display{ + layer = 4; + pixel_y = 32 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/maintenance/oldbridge) @@ -74550,7 +74629,9 @@ /turf/simulated/wall/r_wall, /area/eris/security/checkpoint/medical) "dyr" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -74669,7 +74750,7 @@ "dyE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -74913,7 +74994,7 @@ /obj/spawner/medical, /obj/spawner/medical, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/spawner/medical, /obj/spawner/medical, @@ -74934,7 +75015,9 @@ /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/command/bridge) "dze" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -75053,9 +75136,7 @@ /obj/item/contraband/poster, /obj/item/contraband/poster, /obj/item/contraband/poster, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/lowkeyrandom, /obj/spawner/lowkeyrandom, /obj/spawner/lowkeyrandom, @@ -75221,7 +75302,7 @@ /area/eris/command/mbo) "dzQ" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck2port) @@ -75312,7 +75393,7 @@ /area/eris/command/mbo) "dAa" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -75434,7 +75515,7 @@ /area/eris/command/bridgebar) "dAo" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck5central) @@ -75443,7 +75524,7 @@ /area/eris/maintenance/section1deck5central) "dAq" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/structure/railing{ dir = 1; @@ -75579,7 +75660,7 @@ /area/eris/maintenance/section2deck1port) "dAG" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck1port) @@ -75681,9 +75762,7 @@ /obj/machinery/atmospherics/pipe/manifold/visible{ dir = 1 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/plating/under, /area/eris/medical/medbay) "dAT" = ( @@ -75717,9 +75796,7 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/foyer) "dAX" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck1central) "dAY" = ( @@ -76170,7 +76247,7 @@ /area/eris/medical/patients_rooms) "dBV" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -76216,9 +76293,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/medical/reception) "dCc" = ( @@ -76271,7 +76346,7 @@ "dCh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/reception) @@ -76287,7 +76362,7 @@ "dCk" = ( /obj/structure/medical_stand, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/patients_rooms) @@ -76455,6 +76530,9 @@ /obj/item/modular_computer/console/preset/engineering/alarms{ dir = 4 }, +/obj/machinery/light{ + dir = 4 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) "dCF" = ( @@ -76486,7 +76564,7 @@ pixel_y = 28 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/hologram/holopad, /turf/simulated/floor/wood, @@ -76530,8 +76608,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8; - icon_state = "tube1" + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/medical/medbreak) @@ -76564,7 +76641,9 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) "dCS" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -76698,7 +76777,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) @@ -76881,7 +76960,7 @@ /area/eris/engineering/starboardhallway) "dDL" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/extinguisher_cabinet{ pixel_x = 27; @@ -76973,14 +77052,18 @@ /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/medbreak) "dDV" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/eris/medical/patients_rooms) "dDW" = ( /obj/structure/bed/chair{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/item/device/radio/intercom{ dir = 4; pixel_x = -22 @@ -76989,7 +77072,7 @@ /area/eris/medical/reception) "dDX" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -77003,7 +77086,9 @@ "dDZ" = ( /obj/structure/table/standard, /obj/spawner/medical, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/eris/medical/reception) "dEa" = ( @@ -77157,7 +77242,7 @@ /area/eris/medical/genetics) "dEq" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/table/standard, /obj/item/storage/box/gloves{ @@ -77210,7 +77295,7 @@ /area/eris/engineering/foyer) "dEv" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/table/standard, /turf/simulated/floor/tiled/white, @@ -77222,7 +77307,7 @@ pixel_y = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/genetics) @@ -77377,16 +77462,16 @@ /turf/simulated/floor/tiled/white, /area/eris/medical/genetics) "dEP" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/command/mbo) "dEQ" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/noticeboard{ pixel_y = -28 }, @@ -77479,7 +77564,9 @@ /obj/structure/mopbucket, /obj/item/mop, /obj/item/reagent_containers/glass/bucket, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "dFc" = ( @@ -77500,9 +77587,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck1central) "dFe" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck1central) @@ -77732,9 +77817,7 @@ /area/eris/maintenance/section1deck1central) "dFP" = ( /obj/item/newspaper, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck1central) "dFQ" = ( @@ -77786,7 +77869,9 @@ /area/eris/quartermaster/office) "dFY" = ( /obj/structure/catwalk, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/open, /area/eris/quartermaster/storage) "dFZ" = ( @@ -78307,7 +78392,7 @@ "dHn" = ( /obj/structure/table/rack, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/office) @@ -78334,9 +78419,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) "dHs" = ( @@ -78524,7 +78607,9 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) "dHJ" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, @@ -78804,7 +78889,9 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) "dIo" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) "dIp" = ( @@ -78919,7 +79006,7 @@ dir = 1 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/propulsion/right) @@ -79065,9 +79152,11 @@ }, /area/eris/security/lobby) "dIQ" = ( -/obj/structure/sign/faction/ironhammer, -/turf/simulated/wall/r_wall, -/area/eris/security/lobby) +/obj/machinery/holoposter{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/white, +/area/eris/hallway/main/section2) "dIR" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/maintenance_common{ @@ -79262,7 +79351,7 @@ /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/breakroom) @@ -79290,7 +79379,7 @@ sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Engine Waste") }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/command/exultant) @@ -79423,9 +79512,7 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/propulsion/left) "dJF" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -79479,7 +79566,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/hallway/side/section3port) "dJL" = ( @@ -79538,9 +79627,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/docking) "dJT" = ( @@ -79934,9 +80021,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/cable/yellow{ d1 = 4; d2 = 8; @@ -80273,7 +80358,7 @@ /area/eris/engineering/gravity_generator) "dMf" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 4 @@ -80298,9 +80383,22 @@ /turf/simulated/floor/tiled/steel/panels, /area/eris/crew_quarters/pubeva) "dMj" = ( -/obj/structure/sign/faction/technomancers, -/turf/simulated/wall/r_wall, -/area/eris/engineering/foyer) +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/obj/structure/cable{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/structure/sign/securearea{ + pixel_y = 32 + }, +/turf/simulated/floor/plating/under, +/area/eris/maintenance/section1deck4central) "dMk" = ( /obj/machinery/computer/general_air_control/large_tank_control{ dir = 8; @@ -80406,7 +80504,7 @@ /area/eris/engineering/engine_room) "dMD" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating, /area/eris/engineering/engine_room) @@ -80519,7 +80617,7 @@ /area/eris/engineering/propulsion/right) "dMT" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 @@ -80859,7 +80957,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/engineering/foyer) "dNR" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/table/reinforced, /obj/item/tool/multitool{ pixel_x = 5 @@ -81202,9 +81302,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck1starboard) "dON" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/pack/machine, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck1port) @@ -81277,7 +81375,9 @@ /turf/simulated/floor/tiled/techmaint_cargo, /area/eris/maintenance/section4deck2starboard) "dOZ" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/table/reinforced, /obj/item/storage/toolbox/mechanical{ pixel_x = -2; @@ -81390,9 +81490,6 @@ /obj/structure/table/rack, /obj/item/weldpack, /obj/item/weldpack, -/obj/machinery/camera/network/engineering{ - dir = 1 - }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/gravity_generator) "dPr" = ( @@ -81662,7 +81759,9 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/engine_room) "dQk" = ( @@ -81756,7 +81855,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/gravity_generator) "dQy" = ( @@ -82178,9 +82279,7 @@ /area/space) "dRD" = ( /obj/machinery/shieldgen, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/maintenance/section4deck3port) "dRE" = ( @@ -82204,7 +82303,7 @@ "dRH" = ( /obj/structure/catwalk, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/open, /area/eris/engineering/engeva) @@ -82528,9 +82627,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck2starboard) "dSz" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section4deck2starboard) "dSA" = ( @@ -83031,9 +83128,7 @@ /obj/item/computer_hardware/hard_drive/portable/design/misc, /obj/item/computer_hardware/hard_drive/portable/design/devices, /obj/item/computer_hardware/hard_drive/portable/design/tools, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/storage/primary) "dTP" = ( @@ -83495,9 +83590,7 @@ id_tag = "second_sec_1_airlock_pump"; name = "Second Section Airlock Pump - 1" }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/embedded_controller/radio/airlock/docking_port{ frequency = 1331; id_tag = "second_sec_1_access_console"; @@ -83675,7 +83768,9 @@ /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/maintenance/section2deck1port) "dVy" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/maintenance/section2deck1port) "dVz" = ( @@ -83697,7 +83792,7 @@ /area/eris/maintenance/section2deck5port) "dVD" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck1starboard) @@ -83766,7 +83861,7 @@ /obj/spawner/medical/low_chance, /obj/structure/table/rack/shelf, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/item/storage/box/njoy/green, /turf/simulated/floor/tiled/steel/gray_platform, @@ -83815,7 +83910,7 @@ "dVU" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -83832,7 +83927,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/docking) @@ -84034,9 +84129,7 @@ icon_state = "4-8" }, /obj/structure/catwalk, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck1starboard) "dWo" = ( @@ -84068,9 +84161,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) "dWr" = ( @@ -84142,9 +84233,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck1port) "dWy" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/power/apc{ dir = 2; name = "North APC"; @@ -84376,9 +84465,6 @@ /turf/simulated/floor/wood, /area/eris/crew_quarters/kitchen) "dXa" = ( -/obj/machinery/light{ - dir = 8 - }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -84453,7 +84539,7 @@ "dXk" = ( /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sign/department/dock{ pixel_x = 32 @@ -84548,7 +84634,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 10 @@ -84769,7 +84855,7 @@ /area/eris/crew_quarters/sleep/cryo) "dYa" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) @@ -84918,7 +85004,7 @@ /obj/structure/catwalk, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/eris/hallway/side/section3starboard) @@ -85096,7 +85182,7 @@ /area/eris/hallway/side/section3starboard) "dZc" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/table/rack, /turf/simulated/floor/tiled/steel/brown_platform, @@ -85240,9 +85326,7 @@ /turf/simulated/floor/reinforced, /area/eris/rnd/misc_lab) "dZy" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/reinforced, /area/eris/rnd/misc_lab) "dZz" = ( @@ -85438,9 +85522,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3starboard) "eab" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/spawner/mob/roaches/cluster/low_chance, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3starboard) @@ -85591,9 +85673,7 @@ /area/eris/rnd/docking) "eao" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/camera/network/third_section{ dir = 4 }, @@ -85816,7 +85896,7 @@ dir = 4 }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/hallway/main/section3) @@ -85937,7 +86017,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) @@ -86042,7 +86122,7 @@ /area/eris/rnd/anomalisolone) "ebv" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/power/apc{ dir = 8; @@ -86072,7 +86152,7 @@ /area/eris/rnd/anomalisoltwo) "eby" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/power/apc{ dir = 8; @@ -86098,7 +86178,7 @@ /area/eris/rnd/misc_lab) "ebC" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/table/reinforced, /obj/item/reagent_containers/glass/bucket, @@ -86701,11 +86781,11 @@ /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) "edd" = ( -/obj/structure/sign/biohazard{ - icon_state = "bio-danger" +/obj/structure/sign/department/anomaly{ + pixel_x = -32 }, -/turf/simulated/wall/r_wall, -/area/eris/rnd/xenobiology) +/turf/simulated/floor/tiled/white, +/area/eris/rnd/research) "ede" = ( /obj/machinery/alarm{ dir = 8; @@ -86849,7 +86929,9 @@ /area/shuttle/research/station) "edt" = ( /obj/structure/table/standard, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/science{ icon_state = "9,17" }, @@ -87204,9 +87286,7 @@ /area/eris/engineering/propulsion/right) "eep" = ( /obj/item/newspaper, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/landmark/storyevent/hidden_vent_antag, /obj/effect/decal/cleanable/graffiti{ pixel_y = 35 @@ -87310,9 +87390,7 @@ /turf/simulated/floor/tiled/dark/panels, /area/eris/maintenance/oldbridge) "eeD" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/dark/panels, /area/eris/maintenance/oldbridge) "eeE" = ( @@ -87402,7 +87480,7 @@ "eeR" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor/science, /area/shuttle/research/station) @@ -87538,7 +87616,7 @@ /area/eris/maintenance/oldbridge) "efk" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -87624,7 +87702,7 @@ /area/eris/rnd/xenobiology) "efq" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/item/trash/cigbutt, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -87766,7 +87844,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/science{ icon_state = "6,14" }, @@ -87805,7 +87885,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/science{ icon_state = "10,14" }, @@ -87831,9 +87913,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10 }, @@ -87975,9 +88055,7 @@ /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/storage) "egk" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/table/rack, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/medical/paramedic) @@ -88369,9 +88447,11 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/anomal) "ehd" = ( -/obj/structure/sign/department/anomaly, -/turf/simulated/wall/r_wall, -/area/eris/rnd/anomal) +/obj/machinery/camera/network/engineering{ + dir = 8 + }, +/turf/simulated/floor/tiled/steel/techfloor, +/area/eris/engineering/gravity_generator) "ehe" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -88588,9 +88668,7 @@ }, /area/shuttle/research/station) "ehE" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/shuttle/floor/science{ icon_state = "10,12" }, @@ -88680,7 +88758,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section4deck1central) "ehS" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/maintenance/section4deck1central) "ehT" = ( @@ -88952,7 +89032,9 @@ }, /area/shuttle/research/station) "eiA" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/science{ icon_state = "5,11" }, @@ -89418,7 +89500,9 @@ /area/eris/maintenance/section4deck1central) "ejA" = ( /obj/machinery/portable_atmospherics/canister/plasma, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/anomal) "ejB" = ( @@ -89703,7 +89787,7 @@ "ejY" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/science{ icon_state = "8,9" @@ -89911,7 +89995,7 @@ icon_state = "0-8" }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white, /area/eris/maintenance/section2deck1starboard) @@ -90176,7 +90260,9 @@ }, /area/shuttle/research/station) "ell" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/science{ icon_state = "6,7" }, @@ -90198,7 +90284,9 @@ }, /area/shuttle/research/station) "elp" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor/science{ icon_state = "10,7" }, @@ -90459,9 +90547,7 @@ /area/eris/rnd/xenobiology/xenoflora) "emf" = ( /obj/machinery/seed_storage/xenobotany, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology/xenoflora) "emg" = ( @@ -90545,7 +90631,7 @@ dir = 8 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/science{ icon_state = "8,6" @@ -90839,7 +90925,7 @@ /area/eris/rnd/xenobiology/xenoflora) "eni" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/maintenance/section2deck1starboard) @@ -91471,7 +91557,7 @@ icon_state = "1-4" }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor/science{ icon_state = "3,3" @@ -91547,7 +91633,7 @@ /obj/structure/table/steel, /obj/item/stack/flag/yellow, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor/science{ icon_state = "13,3" @@ -91601,7 +91687,7 @@ /area/eris/quartermaster/misc) "epg" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) @@ -91678,7 +91764,7 @@ /area/shuttle/research/station) "epr" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/simulated/shuttle/floor/science{ @@ -91754,7 +91840,9 @@ /turf/simulated/open, /area/eris/quartermaster/misc) "epB" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/portables_connector{ dir = 4 }, @@ -91781,7 +91869,9 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology/xenoflora) "epF" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/item/device/radio/intercom{ dir = 1; pixel_y = -22 @@ -92973,7 +93063,7 @@ "esm" = ( /obj/structure/multiz/stairs/enter/bottom, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93123,7 +93213,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93183,7 +93273,7 @@ /area/eris/medical/paramedic) "esK" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/bar_dance, /area/holodeck/alphadeck) @@ -93197,9 +93287,7 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) "esN" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/bluegrid, /area/holodeck/alphadeck) "esO" = ( @@ -93278,11 +93366,11 @@ /turf/simulated/floor/grass, /area/eris/crew_quarters/hydroponics) "esX" = ( -/obj/structure/table/rack, -/obj/spawner/lowkeyrandom, -/obj/machinery/light, -/turf/simulated/floor/tiled/steel/brown_platform, -/area/eris/quartermaster/office) +/obj/structure/sign/faction/ironhammer{ + pixel_x = -32 + }, +/turf/simulated/floor/tiled/dark/techfloor_grid, +/area/eris/security/prison) "esY" = ( /obj/landmark/join/start/paramedic, /turf/simulated/floor/tiled/white/gray_perforated, @@ -93303,7 +93391,7 @@ "etd" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/danger, /area/eris/quartermaster/storage) @@ -93364,7 +93452,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "etk" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "etl" = ( @@ -93396,7 +93486,7 @@ "etp" = ( /obj/structure/multiz/stairs/enter, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93405,13 +93495,13 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "etr" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/vending/dinnerware, /turf/simulated/floor/tiled/steel/bar_dance, /area/holodeck/alphadeck) @@ -93420,7 +93510,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -93465,17 +93555,13 @@ /area/eris/crew_quarters/kitchen) "ety" = ( /obj/structure/bed/chair, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3starboard) "etz" = ( /obj/structure/closet/emcloset, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3starboard) "etA" = ( @@ -93520,33 +93606,36 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "etD" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "etE" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/pubeva) "etF" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/hallway/side/section3starboard) "etG" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/hallway/side/section3starboard) @@ -93560,7 +93649,7 @@ req_one_access = list(13,48) }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/panels, /area/eris/quartermaster/miningdock) @@ -93568,14 +93657,14 @@ /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, -/obj/machinery/light, -/turf/simulated/floor/tiled/steel/gray_platform, -/area/eris/quartermaster/miningdock) -"etJ" = ( /obj/machinery/light{ dir = 1 }, /turf/simulated/floor/tiled/steel/gray_platform, +/area/eris/quartermaster/miningdock) +"etJ" = ( +/obj/machinery/light, +/turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3deck2port) "etK" = ( /obj/structure/table/standard{ @@ -93603,9 +93692,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) "etN" = ( @@ -93628,7 +93715,7 @@ /area/eris/maintenance/section3deck1central) "etP" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) @@ -93639,7 +93726,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) "etR" = ( @@ -93649,9 +93738,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) "etS" = ( @@ -93661,18 +93748,14 @@ /obj/structure/railing{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open, /area/eris/quartermaster/misc) "etV" = ( /obj/structure/railing{ dir = 8 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open, /area/eris/quartermaster/misc) "etW" = ( @@ -93703,7 +93786,7 @@ "etY" = ( /obj/structure/table/standard, /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/spawner/junkfood/low_chance, /turf/simulated/floor/tiled/steel/gray_perforated, @@ -93715,14 +93798,13 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet, /area/eris/quartermaster/office) "eua" = ( /obj/structure/table/woodentable, -/obj/machinery/light{ - dir = 8 - }, /obj/item/storage/freezer/contains_food, /turf/simulated/floor/carpet/oracarpet, /area/eris/quartermaster/misc) @@ -93764,7 +93846,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) @@ -93793,15 +93875,14 @@ "eug" = ( /obj/structure/railing, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/open, /area/eris/quartermaster/misc) "euh" = ( /obj/structure/railing, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/open, /area/eris/quartermaster/misc) @@ -93809,7 +93890,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) @@ -93818,15 +93899,13 @@ /turf/simulated/floor/tiled/steel/cargo, /area/eris/storage/primary) "eul" = ( -/obj/machinery/light{ - dir = 4 - }, +/obj/machinery/light/floor, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/storage/primary) "eum" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) @@ -93835,7 +93914,7 @@ dir = 1 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/open, /area/eris/quartermaster/misc) @@ -93844,8 +93923,7 @@ dir = 1 }, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/open, /area/eris/quartermaster/misc) @@ -93857,7 +93935,9 @@ /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/storage/primary) "euq" = ( @@ -93865,7 +93945,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/hallway/side/section3deck2port) @@ -93876,7 +93956,9 @@ /turf/simulated/floor/tiled/steel/cargo, /area/eris/storage/primary) "eus" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/open, /area/eris/quartermaster/misc) "eut" = ( @@ -93888,9 +93970,7 @@ "euu" = ( /obj/structure/table/woodentable, /obj/item/hand_labeler, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/item/packageWrap, /obj/item/device/destTagger, /turf/simulated/floor/wood, @@ -93909,12 +93989,14 @@ /area/eris/hallway/main/section3) "euw" = ( /obj/structure/cyberplant, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/hallway/main/section3) "euy" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) @@ -93929,23 +94011,20 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) "euA" = ( /obj/spawner/closet/wardrobe, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/maintenance/section3deck2starboard) "euB" = ( /obj/spawner/closet/wardrobe, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/maintenance/section3deck2starboard) @@ -93954,12 +94033,14 @@ /obj/spawner/medical/low_chance, /obj/spawner/medical/low_chance, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/maintenance/section3deck2starboard) "euD" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/maintenance/section3deck2starboard) "euE" = ( @@ -93967,7 +94048,9 @@ dir = 4 }, /obj/structure/catwalk, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck2starboard) "euF" = ( @@ -93981,8 +94064,7 @@ icon_state = "1-2" }, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/carpet/turcarpet, /area/eris/crew_quarters/librarybackroom) @@ -93991,13 +94073,14 @@ dir = 9 }, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/carpet/turcarpet, /area/eris/crew_quarters/librarybackroom) "euH" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/maintenance/section3deck1central) "euI" = ( @@ -94017,8 +94100,7 @@ /area/eris/quartermaster/miningdock) "euL" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/maintenance/section3deck1central) @@ -94027,8 +94109,7 @@ /obj/spawner/surgery_tool, /obj/spawner/surgery_tool/low_chance, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/white/panels, /area/eris/maintenance/section3deck1central) @@ -94038,8 +94119,7 @@ /obj/spawner/surgery_tool/low_chance, /obj/spawner/knife/low_chance, /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/white/panels, /area/eris/maintenance/section3deck1central) @@ -94048,7 +94128,9 @@ /turf/simulated/floor/tiled/white/brown_platform, /area/eris/maintenance/section3deck1central) "euP" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/maintenance/section3deck1central) "euR" = ( @@ -94062,7 +94144,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -94072,7 +94156,7 @@ /area/eris/quartermaster/storage) "euT" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -94098,7 +94182,7 @@ /area/eris/medical/chemistry) "euX" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/item/device/radio/intercom{ dir = 8; @@ -94501,9 +94585,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -94563,9 +94645,7 @@ /turf/simulated/floor/tiled/steel/brown_perforated, /area/eris/maintenance/section3deck3starboard) "ewb" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "ewc" = ( @@ -94599,7 +94679,7 @@ "ewe" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -94610,9 +94690,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/bar_flat, /area/eris/crew_quarters/bar) "ewg" = ( @@ -94653,7 +94731,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -94735,7 +94813,9 @@ /turf/simulated/floor/tiled/steel/monofloor, /area/eris/quartermaster/hangarsupply) "ewv" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/bar_dance, /area/holodeck/alphadeck) "eww" = ( @@ -94949,13 +95029,15 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) "ewY" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/firealarm{ pixel_y = 28 @@ -95072,7 +95154,9 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/storage/primary) "exl" = ( @@ -95198,9 +95282,7 @@ /area/eris/hallway/side/section3deck2port) "exA" = ( /obj/structure/cyberplant, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -95306,7 +95388,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/hangarsupply) "exM" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/hangarsupply) "exN" = ( @@ -95366,9 +95450,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -95778,7 +95860,9 @@ /obj/structure/multiz/stairs/enter{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/storage/primary) "eyW" = ( @@ -96402,9 +96486,7 @@ /area/eris/maintenance/section3deck1central) "eAm" = ( /obj/structure/table/standard, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/item/modular_computer/laptop/preset/atmos, /turf/simulated/floor/tiled/white, /area/eris/rnd/anomal) @@ -96415,9 +96497,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/maintenance/section3deck1central) "eAo" = ( @@ -96801,9 +96881,7 @@ /turf/simulated/open, /area/eris/engineering/engine_room) "eBc" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/railing{ dir = 8 }, @@ -97232,7 +97310,9 @@ /turf/simulated/floor/tiled/techmaint_panels, /area/eris/maintenance/section3deck2port) "eBW" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/shower{ dir = 1 }, @@ -97568,9 +97648,7 @@ /area/eris/neotheology/churchcorridor) "eCI" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) "eCK" = ( @@ -97626,7 +97704,9 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/gravity_generator) "eCQ" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/gravity_generator) "eCR" = ( @@ -97722,7 +97802,9 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/maintenance/section3deck2starboard) "eDg" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, @@ -97850,7 +97932,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet/oracarpet, /area/eris/quartermaster/misc) "eDy" = ( @@ -97947,7 +98031,7 @@ /area/eris/medical/chemstor) "eDL" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -98038,9 +98122,7 @@ /turf/simulated/floor/plating, /area/eris/engineering/propulsion/right) "eDZ" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -98311,7 +98393,7 @@ pixel_y = 26 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/button/remote/blast_door{ id = "EngineeringTotalLockdown"; @@ -98696,9 +98778,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck2port) "eFr" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -98978,9 +99058,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6 }, @@ -99034,7 +99112,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/kitchen) @@ -99191,7 +99269,9 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/propulsion/right) "eKV" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 4 }, @@ -99296,7 +99376,9 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/propulsion/right) "eQb" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, @@ -99386,7 +99468,9 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/hallway/side/section3deck2port) "eVa" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/plating/under, /area/eris/crew_quarters/kitchen) "eWR" = ( @@ -99522,9 +99606,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "flg" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/item/contraband/poster/placed{ icon_state = "poster6"; pixel_x = 0; @@ -99554,7 +99636,9 @@ /turf/simulated/floor/tiled/white/gray_platform, /area/eris/medical/medbay/organs) "fnt" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/office) "fnU" = ( @@ -99896,7 +99980,9 @@ /obj/structure/bed/chair/wood{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/firealarm{ dir = 8; pixel_x = 28 @@ -99954,7 +100040,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/kitchenspike, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/crew_quarters/kitchen) @@ -99969,9 +100057,7 @@ /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) "gkh" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -100003,9 +100089,7 @@ /turf/simulated/floor/wood, /area/eris/neotheology/churchbarracks) "gmK" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3starboard) "gmM" = ( @@ -100099,7 +100183,7 @@ /area/eris/command/meo) "gxX" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -100293,7 +100377,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) @@ -100816,7 +100900,7 @@ /area/eris/crew_quarters/hydroponics) "hRs" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/structure/cable{ d1 = 1; @@ -101128,7 +101212,9 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/button/remote/airlock{ desc = "A remote control switch."; id = "unisex_room_1"; @@ -101295,7 +101381,7 @@ "iVN" = ( /obj/structure/closet/coffin, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/funeral) @@ -101330,7 +101416,7 @@ /area/eris/crew_quarters/clubmanager) "iXt" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/fitness) @@ -101462,7 +101548,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/hallway/side/section3port) "jlf" = ( @@ -101697,9 +101785,7 @@ /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) "jIq" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 4 }, @@ -101728,7 +101814,7 @@ pixel_y = 32 }, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/bioprinter) @@ -101782,9 +101868,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/sorter) "jRe" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/medical/chemstor) "jRq" = ( @@ -101823,7 +101907,7 @@ /obj/structure/table/standard, /obj/spawner/pack/tech_loot, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck5port) @@ -101848,9 +101932,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/altar) "jZP" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -101935,7 +102017,9 @@ /obj/structure/bed/chair/wood{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/chapel) "khS" = ( @@ -102081,9 +102165,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3port) "ksR" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 }, @@ -102154,9 +102236,15 @@ /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) "kGo" = ( -/obj/structure/sign/faction/neotheology_cross/gold, -/turf/simulated/wall/r_wall, -/area/eris/neotheology/chapel) +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/powered/pump, +/obj/structure/sign/atmos_air{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/steel/cargo, +/area/eris/hallway/main/section4) "kGH" = ( /obj/effect/floor_decal/industrial/hatch/yellow, /turf/simulated/floor/tiled/dark/techfloor, @@ -102414,7 +102502,7 @@ /area/eris/crew_quarters/artistoffice) "lwA" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/item/reagent_containers/food/snacks/monkeycube/wrapped, /turf/simulated/floor/reinforced, @@ -102687,7 +102775,7 @@ /area/eris/medical/medbay/organs) "lXg" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/table/standard, /obj/item/tool/multitool, @@ -102701,7 +102789,7 @@ /area/eris/crew_quarters/hydroponics/garden) "lZF" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -102896,9 +102984,7 @@ /obj/item/tool/hammer/dumbbell{ pixel_y = -6 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/crew_quarters/fitness) "myt" = ( @@ -102913,7 +102999,9 @@ /area/eris/engineering/foyer) "myz" = ( /obj/structure/catwalk, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -102966,9 +103054,7 @@ pixel_y = 24 }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "mCf" = ( @@ -102985,9 +103071,7 @@ "mCh" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) "mCG" = ( @@ -103022,7 +103106,7 @@ /obj/structure/closet/secure_closet/reinforced/chaplain, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/office) @@ -103130,9 +103214,7 @@ /turf/simulated/floor/dirt, /area/eris/neotheology/chapelritualroom) "nha" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -103220,7 +103302,9 @@ /turf/simulated/floor/tiled/white, /area/eris/medical/chemistry) "nlx" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/holomap{ dir = 4; pixel_x = -32 @@ -103434,7 +103518,7 @@ /obj/item/reagent_containers/food/drinks/mug/new_nt, /obj/structure/table/woodentable, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/storage) @@ -103529,7 +103613,9 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 8 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel, /area/eris/neotheology/churchcorridor) "ojP" = ( @@ -103618,7 +103704,7 @@ "ovh" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/sorter) @@ -103644,8 +103730,7 @@ /area/eris/maintenance/section3deck2port) "oyl" = ( /obj/machinery/light/small{ - dir = 4; - pixel_y = 8 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3starboard) @@ -103779,7 +103864,7 @@ "oLP" = ( /obj/structure/bookcase, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/altar) @@ -103790,7 +103875,7 @@ "oOF" = ( /obj/machinery/neotheology/cruciformforge, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -104157,7 +104242,7 @@ "pAy" = ( /obj/structure/catwalk, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -104319,7 +104404,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/engine_room) @@ -104380,7 +104465,9 @@ /turf/simulated/floor/tiled/dark/techfloor, /area/eris/quartermaster/disposaldrop) "qeb" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/fitness) "qed" = ( @@ -104402,6 +104489,9 @@ /area/eris/maintenance/section3deck5port) "qhN" = ( /obj/machinery/camera/network/third_section, +/obj/structure/sign/faction/neotheology{ + pixel_y = 32 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "qhU" = ( @@ -104584,7 +104674,7 @@ "qyl" = ( /obj/structure/table/rack/shelf, /obj/machinery/light{ - dir = 8 + dir = 4 }, /obj/spawner/tool/advanced/low_chance, /turf/simulated/floor/tiled/steel/gray_platform, @@ -104792,7 +104882,9 @@ /obj/spawner/pack/tech_loot, /obj/spawner/pack/tech_loot, /obj/structure/table/rack, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/spawner/powercell, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -104812,7 +104904,9 @@ /area/eris/quartermaster/storage) "raY" = ( /obj/spawner/junk/low_chance, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck1central) "reO" = ( @@ -104827,7 +104921,9 @@ /area/eris/crew_quarters/fitness) "reY" = ( /obj/structure/lattice, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/open, /area/eris/engineering/engine_room) "rfp" = ( @@ -104969,9 +105065,7 @@ /area/eris/neotheology/altar) "rDp" = ( /obj/structure/table/rack, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) "rDZ" = ( @@ -105019,7 +105113,7 @@ /area/eris/hallway/side/section3starboard) "rJe" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/item/stool/padded, /turf/simulated/floor/tiled/white, @@ -105038,7 +105132,9 @@ /area/eris/neotheology/funeral) "rJp" = ( /mob/living/simple_animal/chicken, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/dirt, /area/eris/crew_quarters/hydroponics) "rMC" = ( @@ -105182,7 +105278,7 @@ /area/eris/medical/medbay/organs) "saN" = ( /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/altar) @@ -105374,7 +105470,9 @@ /area/eris/maintenance/oldbridge) "stu" = ( /obj/structure/cable/green, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/power/apc{ name = "South APC"; pixel_y = -28; @@ -105444,7 +105542,7 @@ /area/eris/neotheology/office) "szo" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/sign/faction/astersguild{ pixel_x = 32 @@ -105467,12 +105565,6 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/sign/securearea{ - desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; - icon_state = "space"; - layer = 4; - name = "EXTERNAL AIRLOCK" - }, /turf/simulated/wall/r_wall, /area/eris/neotheology/funeral) "sBN" = ( @@ -105486,13 +105578,29 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/long_range_scanner) "sDP" = ( -/obj/structure/sign/faction/frozenstar, -/turf/simulated/wall, -/area/eris/maintenance/section3deck1central) +/obj/structure/sign/faction/neotheology{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark/golden, +/area/eris/neotheology/chapel) "sEG" = ( -/obj/structure/sign/faction/neotheology_cross, -/turf/simulated/wall/r_wall, -/area/eris/crew_quarters/hydroponics/garden) +/obj/machinery/door/firedoor, +/obj/machinery/door/blast/regular{ + density = 0; + icon_state = "pdoor0"; + id = "EngineeringTotalLockdown"; + layer = 2.6; + name = "Engineering Total Lockdown"; + opacity = 0 + }, +/obj/machinery/door/airlock/glass_engineering{ + name = "Engineering Lobby Access" + }, +/obj/structure/sign/faction/technomancers{ + pixel_y = -32 + }, +/turf/simulated/floor/tiled/steel/cargo, +/area/eris/engineering/foyer) "sFZ" = ( /obj/structure/closet/secure_closet/personal/doctor, /turf/simulated/floor/tiled/white, @@ -105571,9 +105679,7 @@ }, /area/eris/hallway/main/section2) "sNS" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/machinery/power/nt_obelisk, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) @@ -105705,9 +105811,7 @@ /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/engine_room) "tdA" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck3port) "teI" = ( @@ -105823,7 +105927,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/power/apc/super{ pixel_y = -28; dir = 1 @@ -105837,7 +105943,9 @@ /area/eris/neotheology/office) "tqZ" = ( /obj/spawner/junk/low_chance, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/maintenance/section2deck1port) "trS" = ( @@ -105871,7 +105979,9 @@ /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) "tti" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, @@ -105971,9 +106081,7 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/long_range_scanner) "tEu" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -106033,7 +106141,9 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section1deck4central) "tNx" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_escapecor2"; name = "Maintenance Hatch Control"; @@ -106047,7 +106157,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -106099,7 +106209,7 @@ /area/eris/neotheology/chapelritualroom) "tSV" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/machinery/power/nt_obelisk, /turf/simulated/floor/tiled/white/golden, @@ -106128,7 +106238,7 @@ /obj/structure/table/standard, /obj/item/paper/detective_guide, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/exerooms) @@ -106307,7 +106417,9 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "ulr" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 }, @@ -106461,7 +106573,7 @@ }, /obj/machinery/disposal, /obj/machinery/light{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -106476,7 +106588,7 @@ dir = 6 }, /obj/machinery/light{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/engineering/atmos) @@ -106697,7 +106809,9 @@ d2 = 2; icon_state = "1-2" }, -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay/uppercor) "vkt" = ( @@ -106858,9 +106972,7 @@ /obj/item/storage/box/lights/bulbs, /obj/item/storage/box/lights/bulbs, /obj/item/storage/box/lights/bulbs, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/hangarsupply) "vyY" = ( @@ -106922,7 +107034,7 @@ /obj/item/soap/nanotrasen, /obj/item/soap/nanotrasen, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/structure/sign/faction/neotheology_cross/gold{ pixel_y = 32 @@ -106954,9 +107066,7 @@ /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "vHq" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/funeral) "vIJ" = ( @@ -107211,7 +107321,7 @@ /area/eris/neotheology/bioprinter) "wlN" = ( /obj/machinery/light{ - dir = 4 + dir = 8 }, /obj/structure/cyberplant, /turf/simulated/floor/tiled/steel/bar_dance, @@ -107255,9 +107365,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/wood, /area/eris/neotheology/churchbarracks) "wpU" = ( @@ -107357,9 +107465,7 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/landmark/storyevent/midgame_stash_spawn{ navigation = "Section 2, floor 1. Medbay toilet." }, @@ -107462,9 +107568,7 @@ /area/eris/security/exerooms) "wXf" = ( /obj/structure/closet/secure_closet/medicine, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /obj/structure/catwalk, /turf/simulated/floor/plating/under, /area/eris/medical/chemstor) @@ -107522,7 +107626,7 @@ /obj/structure/catwalk, /obj/spawner/junk, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/maintenance/sorter) @@ -107558,6 +107662,13 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/structure/sign/securearea{ + desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; + icon_state = "space"; + layer = 4; + name = "EXTERNAL AIRLOCK"; + pixel_x = -32 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/funeral) "xhf" = ( @@ -107568,7 +107679,9 @@ /turf/simulated/wall, /area/eris/neotheology/funeral) "xij" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /obj/structure/bed/chair{ dir = 8 }, @@ -107775,9 +107888,11 @@ /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/altar) "xEL" = ( -/obj/machinery/holoposter, -/turf/simulated/wall/r_wall, -/area/eris/hallway/main/section2) +/obj/structure/sign/faction/neotheology_cross{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark/golden, +/area/eris/neotheology/chapel) "xHE" = ( /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply, @@ -107835,7 +107950,9 @@ /turf/simulated/floor/tiled/techmaint_panels, /area/eris/maintenance/section4deck3port) "xSp" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -107843,7 +107960,7 @@ /area/eris/crew_quarters/hydroponics) "xSE" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /obj/structure/closet/wardrobe/color/white, /turf/simulated/floor/tiled/dark/gray_platform, @@ -107973,7 +108090,9 @@ /turf/simulated/floor/plating, /area/eris/crew_quarters/kitchen) "xWI" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/closet, /obj/spawner/contraband/low_chance, /turf/simulated/floor/tiled/steel, @@ -108097,9 +108216,15 @@ /turf/simulated/floor/carpet, /area/eris/medical/psych) "ykt" = ( -/obj/structure/sign/faction/neotheology_cross, -/turf/simulated/wall/r_wall, -/area/eris/neotheology/chapel) +/obj/machinery/atmospherics/portables_connector{ + dir = 4 + }, +/obj/machinery/portable_atmospherics/powered/scrubber, +/obj/structure/sign/atmos_waste{ + pixel_x = 32 + }, +/turf/simulated/floor/tiled/steel/cargo, +/area/eris/hallway/main/section4) "yll" = ( /obj/structure/closet/secure_closet/agrolyte, /turf/simulated/floor/grass, @@ -122354,7 +122479,7 @@ cbR btm bTz bYY -cuj +bpo drc cbR cbR @@ -123181,7 +123306,7 @@ alg aaa aCM aMN -aDn +aCW aFj aFR aGv @@ -123366,7 +123491,7 @@ lXg cas cxv cbt -bpo +cuj bmP bmP cbR @@ -123748,7 +123873,7 @@ dLB dMu dOa dOa -dVI +dUL apQ aqD arO @@ -123815,8 +123940,8 @@ aai aai aai aPT -aCR -aQo +aDn +aai aai aai aai @@ -123968,7 +124093,7 @@ alg ceU aHP can -bVb +sug cdS cAs dyO @@ -123977,7 +124102,7 @@ eaP esT cdS cdS -sug +bVb bZO gWZ qKj @@ -124574,7 +124699,7 @@ aCn btg aNS bBS -bVh +bXn btg cCo btg @@ -124736,9 +124861,9 @@ agf acf ajY akH -ali -agY alD +agY +ali alV agD aaa @@ -124754,7 +124879,7 @@ aaa dLB dLB aoq -aou +aov dMt dMt dOa @@ -125152,7 +125277,7 @@ aad aad aad dLB -dUL +dVI dLB aad dLB @@ -125162,7 +125287,7 @@ dQN dMt dMt dOa -dVI +dUL apQ aqF arO @@ -125325,7 +125450,7 @@ aaa abH adA aea -aeB +abH abH abH abH @@ -125527,7 +125652,7 @@ aaa abH adB aei -aei +esX afm afA afy @@ -125562,7 +125687,7 @@ aaa dLB dLB dNN -aov +aou aoC aoS dOa @@ -125988,7 +126113,7 @@ aCn ayw btg btg -bXn +bVh cga cOt btl @@ -126025,11 +126150,11 @@ aLh aGq aGr aMt -aRl +aPk aOc aOC aOY -aPk +aRl aOO aPx aRS @@ -126172,7 +126297,7 @@ dOa ahT arY dOa -dVI +dUL apZ aqQ arP @@ -126434,7 +126559,7 @@ aOh aOD aOZ aPo -aOQ +aOO aPG aRT blM @@ -126737,11 +126862,11 @@ aar aaG aaa abH -adG +ahQ aem ael aem -ahQ +adG abH aaa aaa @@ -126977,7 +127102,7 @@ dOa anL dMt dMt -dUL +dVI dOa dOa dOa @@ -126985,7 +127110,7 @@ aqm dOa dOa aew -aou +aov dMt dMt dMt @@ -127041,7 +127166,7 @@ rDZ rDZ aOO aOO -aRl +aPk aSu bzO aOO @@ -127337,9 +127462,9 @@ aac aab aaa aaG -abz -aar enY +aar +abz aaG aaa abH @@ -130059,7 +130184,7 @@ aMl auY axK aTE -ayU +bzE azN auY aAm @@ -130444,7 +130569,7 @@ aaa eoA aaa aaa -aaa +aQo aaa aaa apn @@ -130568,7 +130693,7 @@ aaa aaB aaB aaR -abf +abg abf abf aci @@ -130646,7 +130771,7 @@ ewc auV ewN exK -auU +auV aaa aaa aqU @@ -130770,7 +130895,7 @@ aaa aaA aaa aaR -abg +abf abf abf aci @@ -131821,7 +131946,7 @@ dUP amP anF aoy -aoO +arj aoN aoN aoN @@ -131829,7 +131954,7 @@ aoN aoN aoN aoN -arj +aoO aoy aru asj @@ -132225,7 +132350,7 @@ dUP anm anp aoy -aoO +arj aoN aoN aoN @@ -132233,7 +132358,7 @@ aoN aoN aoN aoN -arj +aoO aoy aru asg @@ -134493,7 +134618,7 @@ feu aZI aJI aMK -aOB +aOW aaa aaa aaa @@ -136311,7 +136436,7 @@ aFN aUX aFN bhh -aOW +aOB aaa aaa aaa @@ -160152,7 +160277,7 @@ brL bqj bum bqK -bEL +bOI bum bum bFI @@ -160363,14 +160488,14 @@ bqj bum bqK bum -bEL +bOI bum bFI bum bum bum bum -bEL +bOI bum bFI bqK @@ -160981,7 +161106,7 @@ bNh bNV bOm bum -bOI +bEL bum bFI bum @@ -161759,7 +161884,7 @@ cBq bUG abF aCM -aNm +bHd aDb aDb aND @@ -162098,7 +162223,7 @@ aaa aaa aaa agD -aYB +beH aYW aVd aYW @@ -162113,7 +162238,7 @@ aYW aYW aVd aYW -beH +aYB agD aaa aad @@ -162906,7 +163031,7 @@ abF aae aae agD -aYB +beH aYW aUQ aYW @@ -162921,7 +163046,7 @@ aYW aYW aVd aYW -beH +aYB agD aaa aad @@ -164329,7 +164454,7 @@ csS cyw aYx aZW -bay +bbo jRq aLc aUS @@ -165820,7 +165945,7 @@ aCW bJh bKw bvW -bEL +bOI bum bum bvW @@ -165948,7 +166073,7 @@ bac cvH agY aEf -ali +alD agD csS csS @@ -166380,7 +166505,7 @@ blP bmy bnW blQ -bol +boo bop bmw abF @@ -167584,7 +167709,7 @@ aHR aHR aJB aDd -bhP +beK bjd bkh beQ @@ -167592,7 +167717,7 @@ bmw bnn bok blQ -boo +bol blQ bmw aaa @@ -167778,7 +167903,7 @@ auG aDa aDd bel -beK +bhP aDd aHN aHR @@ -168415,7 +168540,7 @@ cDV cBu cHG cdf -dnN +cRs cdf csE cHG @@ -168662,7 +168787,7 @@ bgf bgI bmM bnC -bsE +bsF btn btD bUn @@ -168774,7 +168899,7 @@ aVp aWc csS aUD -bbo +bay bbQ bcr bcR @@ -168864,7 +168989,7 @@ bgf bgI bfA bfB -bsF +bsE btA btL bUn @@ -169017,13 +169142,13 @@ cqM cdf cdf cdf -cRs +dnN cdf cdf cYT doG cdf -cRs +dnN cZU cdf dfB @@ -169381,8 +169506,8 @@ aZM csS csS bbq -fCt -bcu +csS +dMj csU aaa abF @@ -172414,7 +172539,7 @@ csS csS bcz csS -aLc +bqi cuN csU abF @@ -172625,7 +172750,7 @@ dpA cIB bgk aMQ -aMR +aMS aMU aMQ aKI @@ -172669,7 +172794,7 @@ csW ctt ede cgY -dJj +cxe cgO aaa aaa @@ -173433,7 +173558,7 @@ abF abF bgk aMQ -aMS +aMR aNo aMQ aKI @@ -173460,7 +173585,7 @@ cgO gjm euS bgH -cxe +dJj cgY cie ciR @@ -201353,7 +201478,7 @@ aDb aDb cCr aDb -bHd +aNm cIT cIT cyc @@ -201370,7 +201495,7 @@ cwU abF cwU cxw -qjY +cXR avi cwU cWq @@ -201754,7 +201879,7 @@ duu abF cAO aDb -bHd +aNm aCM bFl bFl @@ -203153,10 +203278,10 @@ cxu cxu cxu cxu -cqa +cxu csx cwc -sEG +cxu cxu cxu cxu @@ -203553,8 +203678,8 @@ abF abF duu cmE -duY -etS +cmE +sDP etS evu evu @@ -203956,8 +204081,8 @@ dAO dAO vGy abF -duY -etS +cmE +sDP etS etS evu @@ -203996,7 +204121,7 @@ cwU cGj cwU cxw -cWc +cWr cwU abF abF @@ -204158,8 +204283,8 @@ dAv dAv uqj abF -ykt -etS +cmE +xEL esF esF evu @@ -204301,11 +204426,11 @@ aaa aaa abF aTG -brP +bCc btX btX btX -bCc +brP aTG abF abF @@ -204360,8 +204485,8 @@ dEN dAv uqj abF -kGo -etS +cmE +duY cws esF cor @@ -204562,8 +204687,8 @@ dDO dAv uqj abF -kGo -etS +cmE +duY cws esF cor @@ -204612,7 +204737,7 @@ cUy cUy cOg cwU -cWc +cWr cwU cwU cYH @@ -204764,8 +204889,8 @@ tti dAv uqj aaa -ykt -etS +cmE +xEL esF esF evu @@ -204966,8 +205091,8 @@ pJc dAv uqj aaa -duY -etS +cmE +sDP etS etS evu @@ -205220,7 +205345,7 @@ cJB cUy cWq cwU -cXR +qjY cYJ cxw cwU @@ -205371,7 +205496,7 @@ dAv uqj aaa cmE -duY +cmE qhN nHG pRq @@ -205420,7 +205545,7 @@ cxR cGA cKc cUy -cWr +cWc cwU cYa cZo @@ -205980,7 +206105,7 @@ aaa jaM hdR dJp -phq +fyY fiZ eeB evC @@ -206955,7 +207080,7 @@ bxb bSf agD bxu -ali +alD agD bDT aTG @@ -207191,7 +207316,7 @@ abF aaa jaM rVC -fyY +phq rVC dFB eeB @@ -207787,7 +207912,7 @@ xdY coS coS clT -bol +boo bQo bQp bmw @@ -208132,7 +208257,7 @@ aaa aaa aaa aTG -bqv +bSp aTG abF aTG @@ -208432,17 +208557,17 @@ abF abF abF abF -dMj -cIY -cIY -aPd +cLV +cqS +cqY +cLV cKZ cLF cNh -aPd -cIY +cLV cIY -dMj +sEG +cLV aaa aaa aaa @@ -208594,7 +208719,7 @@ dAI dAI dCN dqC -cnh +chM bZc cdL cdL @@ -208655,7 +208780,7 @@ bzZ bAh cRE cZz -dac +dae cZz cZz cZz @@ -208763,7 +208888,7 @@ bBL bXU bXU bXU -dIQ +bBL bwo bwv bwM @@ -208796,7 +208921,7 @@ bxP bxP dDR byn -bxP +aOQ byr byt bxP @@ -208807,7 +208932,7 @@ cpe cpe bZc chY -dTS +etu cpo dGT dhR @@ -208826,7 +208951,7 @@ cpo cpo ehT cpo -etu +dTS chY ewR cpo @@ -209058,7 +209183,7 @@ cWA dzr cYj cRM -bsE +bsF bAp daC bON @@ -209369,7 +209494,7 @@ bBL bXU bXU bXU -dIQ +bBL bwq bwz bwn @@ -209413,7 +209538,7 @@ cpe cpe bZc chY -dTS +etu cpo dGz cpo @@ -209432,7 +209557,7 @@ cpo cpo ewy cpo -etu +dTS chY ewS cpo @@ -209602,7 +209727,7 @@ bfn cnW ciw cjB -cqS +cnW apJ cmh cmu @@ -209648,9 +209773,9 @@ cHw cJr bzd cKM -cKM +ykt byY -cOx +kGo cOx bzy cQW @@ -209665,7 +209790,7 @@ bzX bzX cRE cZz -dae +dac cZz cZz cZz @@ -210152,7 +210277,7 @@ aaa aaa aaa aTG -bqv +bSp aTG aaa abF @@ -210576,7 +210701,7 @@ bwl bXc bXj aEy -aPj +csZ bXj bYq bYK @@ -210668,7 +210793,7 @@ abF aDf bLq aWp -bzE +ayU aTs bzX bzX @@ -211218,7 +211343,7 @@ crb cuB cpd cpd -cqY +cuB crb crb bhb @@ -211617,14 +211742,14 @@ bgk bgk bgk cjr -bjE +fbK cmB qOs crN crN qOs cmB -fbK +bjE bhb bhb bhb @@ -211647,7 +211772,7 @@ cvx cvx cxQ cvx -esX +ctm cwD ccX wTM @@ -211806,7 +211931,7 @@ bDT bPD bqw bSl -bSp +bqv aTG aaa bSw @@ -211849,7 +211974,7 @@ ctV ctV cxX czc -ctm +aeB cwD ccX rII @@ -213834,7 +213959,7 @@ cgx bTj cgx aMQ -aMS +aMR bxT aMQ bfY @@ -214276,7 +214401,7 @@ czl czG cAi cie -etl +evV bgH ewA ewJ @@ -214470,7 +214595,7 @@ cgO cgO cgO cgO -evV +etl cie cwY cyb @@ -242789,7 +242914,7 @@ bIP bIP aaa dEy -dRR +dUj dID dqS dRF @@ -243575,7 +243700,7 @@ eiL dqI aaa aCM -aNm +bHd aDb diX aCM @@ -243602,7 +243727,7 @@ dSE dTc dFl dRF -dUj +dRR dEy dEy aaa @@ -244718,7 +244843,7 @@ aaa aaa aaa bYo -dhn +dlR dhm dhm cZA @@ -244931,7 +245056,7 @@ djP cZA dhm dhm -dlR +dhn bYo bYo cGE @@ -246808,7 +246933,7 @@ ybs abF abF aCM -aNm +bHd djR dIw dnM @@ -248027,13 +248152,13 @@ dHX efG cLV dJA -dJM +dPT cLV dLz dMR dLz cLV -dPT +dJM dJA cLV cLV @@ -248229,13 +248354,13 @@ dIC end cLV dLb -dLb -dMj +cqa +cLV dyb dAU dCR -dMj -dLb +cLV +aPd dLb cLV aaa @@ -248453,7 +248578,7 @@ dwM dwM dxG dxJ -dyh +dyF dyG dyQ abF @@ -248794,7 +248919,7 @@ dqa drD drD drD -drD +dIQ dsF dsO bZc @@ -248996,7 +249121,7 @@ dqy drA drA drV -xEL +bZc bZc bZc bZc @@ -249056,8 +249181,8 @@ dwM dwM dwM dwV -dxh -dxh +dwM +dwM dxN dyt dyG @@ -250066,8 +250191,8 @@ dwM dwM dwM dwX -dxh -dxh +dwM +dwM dxN dyo dyG @@ -250675,7 +250800,7 @@ dwM dwM dxI dyg -dyF +dyh dyG dyQ abF @@ -250956,7 +251081,7 @@ aaa aaa csc csk -cua +cwf ctZ cBP cxO @@ -251008,7 +251133,7 @@ beh cHT cPw beh -cXk +bki cYo dcn dcO @@ -251074,12 +251199,12 @@ abF dLf dRq dTo -dTK +egS dMq dOY eca egO -egS +dTK dMq dLf aaa @@ -251582,7 +251707,7 @@ deI dff dfA bXj -csZ +aPj ctW bXj cHd @@ -251766,7 +251891,7 @@ aaa csc cxh ctZ -cwf +cua csc csc csc @@ -252232,7 +252357,7 @@ dkh cjr dnc dnW -bki +cXk bdN bdN aaa @@ -252271,7 +252396,7 @@ abF dLg dki dki -dqs +dqz dki dki dLg @@ -252822,7 +252947,7 @@ bUf cGu cGL cIw -cIM +cJb cLI cMi cNr @@ -253483,7 +253608,7 @@ abF dLg dki dki -dqz +dqs dki dki dLg @@ -253630,7 +253755,7 @@ bUf cHr cGL cIw -cJb +cIM cLI cNl cNl @@ -284340,14 +284465,14 @@ dNZ dNZ dNZ dPK -amQ +aqk alb dON aof apf -amQ -alb aqk +alb +amQ dQZ dNZ dNZ @@ -286122,7 +286247,7 @@ doM doQ doM doM -dpk +dFj doM doQ doM @@ -286152,7 +286277,7 @@ abF alb dNZ dPK -amQ +aqk anQ dQr dQr @@ -286540,7 +286665,7 @@ abF abF doR dEI -dFj +dpk dpC dFu doM @@ -287825,7 +287950,7 @@ ehu eik ehu ehu -ejc +eix ejJ ekR ela @@ -287935,7 +288060,7 @@ dVP dWi dVP dVg -dWO +dWT dcW dvB dvB @@ -287976,7 +288101,7 @@ dAF dAF anQ dId -dUR +aqS dUW alG egQ @@ -288833,7 +288958,7 @@ ehk ehu eho eip -eix +ejc ehu eho ejP @@ -288986,7 +289111,7 @@ amc aof amc rVy -amQ +aqk efd efY egT @@ -289166,7 +289291,7 @@ doM dBZ doR dEI -dFj +dpk dFQ dGl dpC @@ -289398,7 +289523,7 @@ edQ efd ect ect -aqS +dUR dWg dWB ala @@ -289551,7 +289676,7 @@ dVP dWi dVP dVg -dWT +dWO dcW dvF dvB @@ -289617,8 +289742,8 @@ boS cNH ezN ezV -cNH -sDP +dxh +boS cNH cNH aRM @@ -290585,7 +290710,7 @@ doQ doD doD bDa -bDc +bDh dKO doR doR @@ -291211,7 +291336,7 @@ ecw ecw ecw ecw -ehd +ect ecw efw ecw @@ -291393,7 +291518,7 @@ doM doD doD bDb -bDh +bDc dKX doR doR @@ -291413,7 +291538,7 @@ ecV ecV ecV ecV -ecV +edd dXr eiY dXz @@ -292061,7 +292186,7 @@ abF dLg dPr eFe -eFe +ehd eFe eFe eBB @@ -293226,13 +293351,13 @@ ebi ebi ebi ebi -edd +ebi bEH dgN djv dgN avy -edd +ebi ebi ebi ebi @@ -294034,13 +294159,13 @@ dpg ebi ebi ebi -edd +ebi bEH dhu dkF dmx axP -edd +ebi ebi ebi ebi @@ -295696,7 +295821,7 @@ euM boY dXi dtg -euO +euI dXi aaa aaa @@ -296295,7 +296420,7 @@ boS eAT cNH boS -euI +euO boF boO bpn @@ -297305,7 +297430,7 @@ boN dXi boS boS -euI +euO boF boU boU @@ -297716,7 +297841,7 @@ bpr bpr dXi dtj -euO +euI dXi aaa aaa diff --git a/maps/CEVEris/centcomm.dmm b/maps/CEVEris/centcomm.dmm index 39b4c0b44c..ec30467364 100644 --- a/maps/CEVEris/centcomm.dmm +++ b/maps/CEVEris/centcomm.dmm @@ -62,7 +62,7 @@ /area/space) "aw" = ( /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -165,9 +165,7 @@ /turf/simulated/floor/holofloor/tiled/dark, /area/holodeck/source/industrial_arena) "cF" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/open/holonofloor, /area/space) "cK" = ( @@ -312,9 +310,7 @@ /area/centcom/evac) "dZ" = ( /obj/structure/table/woodentable, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/centcom/evac) "ea" = ( @@ -349,7 +345,7 @@ /area/space) "eg" = ( /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -1614,8 +1610,10 @@ }, /area/centcom/merc_base) "hM" = ( -/obj/structure/sign/faction/neotheology_cross, -/turf/simulated/wall/r_wall, +/obj/structure/sign/faction/neotheology_cross{ + pixel_x = 32 + }, +/turf/simulated/floor/carpet/bcarpet, /area/centcom/evac) "hN" = ( /obj/effect/window_lwall_spawn/smartspawn, @@ -1789,7 +1787,9 @@ frequency = 1331; id_tag = "vox_west_vent" }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/plating, /area/skipjack_station/start) "ix" = ( @@ -1874,7 +1874,9 @@ frequency = 1331; id_tag = "vox_east_vent" }, -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/plating, /area/skipjack_station/start) "iL" = ( @@ -1924,7 +1926,9 @@ "iV" = ( /obj/structure/computerframe, /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /turf/simulated/shuttle/floor{ icon_state = "floor6" @@ -1958,12 +1962,14 @@ /turf/simulated/floor/tiled/dark, /area/centcom/evac) "jf" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/tiled/dark, /area/centcom/evac) "jg" = ( /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -1984,7 +1990,9 @@ }, /area/centcom/merc_base) "jk" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/item/device/radio/intercom/syndicate{ dir = 1; pixel_y = -22 @@ -2057,9 +2065,7 @@ /turf/space, /area/centcom/evac) "jA" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /obj/structure/table/standard, /obj/item/toy/figure/serbian, /turf/simulated/shuttle/floor{ @@ -2108,7 +2114,7 @@ pixel_x = -25 }, /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -2210,9 +2216,7 @@ pixel_x = 0; pixel_y = 28 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/shuttle/floor{ icon_state = "floor7" }, @@ -2329,9 +2333,7 @@ pixel_x = 8; pixel_y = 25 }, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/shuttle/floor{ icon_state = "floor6" }, @@ -2636,7 +2638,9 @@ name = "suit closet" }, /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /turf/simulated/shuttle/floor{ icon_state = "floor6" @@ -2672,7 +2676,7 @@ "lc" = ( /obj/machinery/sleeper, /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -2706,7 +2710,7 @@ /area/holodeck/source/texas) "lh" = ( /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -2719,13 +2723,11 @@ }, /area/shuttle/mercenary) "li" = ( -/obj/machinery/light{ - dir = 4 +/obj/structure/sign/faction/neotheology_cross{ + pixel_y = -32 }, -/turf/simulated/shuttle/floor{ - icon_state = "floor6" - }, -/area/shuttle/mercenary) +/turf/simulated/floor/tiled/dark/golden, +/area/centcom/evac) "lj" = ( /obj/machinery/chem_master, /turf/unsimulated/floor{ @@ -2831,7 +2833,9 @@ /area/shuttle/mercenary) "lC" = ( /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/item/device/radio/intercom/syndicate{ dir = 8; @@ -2854,7 +2858,7 @@ /area/centcom/raider_base) "lE" = ( /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -2943,7 +2947,9 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/structure/reagent_dispensers/watertank/huge, /turf/simulated/shuttle/floor{ @@ -2978,7 +2984,7 @@ "lW" = ( /obj/structure/table/standard, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -3822,13 +3828,15 @@ }, /area/skipjack_station/start) "oY" = ( -/obj/machinery/button/remote/blast_door{ - id = "skipjackshutters"; - name = "remote shutter control"; - req_access = list(150) +/obj/machinery/light{ + dir = 4; + icon_state = "tube1"; + pixel_y = 0 }, -/turf/simulated/wall/voxshuttle, -/area/skipjack_station/start) +/turf/simulated/shuttle/floor{ + icon_state = "floor6" + }, +/area/shuttle/mercenary) "oZ" = ( /obj/machinery/airlock_sensor{ frequency = 1331; @@ -3853,7 +3861,7 @@ /area/skipjack_station/start) "pd" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/suit_storage_unit/merc, /turf/simulated/shuttle/floor{ @@ -3870,7 +3878,14 @@ /area/skipjack_station/start) "pg" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 + }, +/obj/machinery/button/remote/blast_door{ + id = "skipjackshutters"; + name = "remote shutter control"; + req_access = list(150); + pixel_x = 0; + pixel_y = 24 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -3965,7 +3980,7 @@ "pB" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/plating, /area/skipjack_station/start) @@ -3982,7 +3997,7 @@ /obj/item/clothing/shoes/magboots, /obj/item/clothing/mask/breath, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/plating, /area/skipjack_station/start) @@ -4007,7 +4022,7 @@ /obj/structure/table/steel, /obj/machinery/recharger, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -4041,7 +4056,7 @@ dir = 4 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -4058,7 +4073,7 @@ dir = 8 }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -4093,9 +4108,7 @@ }, /area/skipjack_station/start) "pZ" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/shuttle/floor{ icon_state = "floor7" }, @@ -4124,9 +4137,7 @@ /area/skipjack_station/start) "qe" = ( /obj/machinery/body_scanconsole, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/shuttle/floor{ icon_state = "floor3" }, @@ -4191,7 +4202,9 @@ }, /area/skipjack_station/start) "qr" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/shuttle/floor{ icon_state = "floor4" }, @@ -4218,7 +4231,7 @@ dir = 4 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/shuttle/floor{ icon_state = "floor7" @@ -4250,8 +4263,11 @@ /turf/space, /area/space) "qI" = ( -/turf/space, -/area/space) +/obj/structure/sign/faction/neotheology_cross{ + pixel_y = 32 + }, +/turf/simulated/floor/tiled/dark/golden, +/area/centcom/evac) "qX" = ( /obj/structure/table/rack, /obj/item/gun/launcher/spikethrower, @@ -4275,7 +4291,7 @@ /area/centcom/merc_base) "rt" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/machinery/portable_atmospherics/canister/oxygen, /turf/simulated/shuttle/floor{ @@ -4286,9 +4302,7 @@ /turf/simulated/floor/carpet, /area/centcom/pirate_base) "rz" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/holofloor/tiled/dark, /area/space) "rE" = ( @@ -4359,7 +4373,9 @@ /area/holodeck/source/industrial) "sA" = ( /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/structure/closet, /obj/item/clothing/suit/space/void/riggedvoidsuit, @@ -4506,7 +4522,7 @@ /obj/item/storage/belt/utility/full, /obj/item/tool/multitool, /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -4615,7 +4631,7 @@ amount = 10 }, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /obj/item/beartrap, /obj/item/beartrap, @@ -4811,7 +4827,9 @@ "wu" = ( /obj/structure/closet, /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/item/storage/deferred/rations, /turf/simulated/shuttle/floor{ @@ -5395,7 +5413,7 @@ /area/holodeck/source/industrial_arena) "Cx" = ( /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/open/holonofloor, /area/space) @@ -5705,7 +5723,9 @@ /area/holodeck/source/wireframe) "Gl" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + icon_state = "tube1"; + pixel_y = 0 }, /turf/simulated/shuttle/floor{ icon_state = "floor6" @@ -5967,7 +5987,9 @@ /turf/simulated/floor/holofloor/tiled/dark, /area/holodeck/source/industrial) "Jx" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/bed/chair/custom/holochair{ dir = 8 }, @@ -6014,7 +6036,7 @@ pixel_y = 9 }, /obj/machinery/light{ - dir = 8; + dir = 4; icon_state = "tube1"; pixel_y = 0 }, @@ -6036,7 +6058,7 @@ pixel_y = 3 }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor3" @@ -6102,7 +6124,9 @@ }, /area/centcom/merc_base) "Kr" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/effect/floor_decal/industrial/danger, /obj/effect/floor_decal/industrial/danger{ dir = 1 @@ -6160,9 +6184,7 @@ /turf/simulated/floor/holofloor/reinforced, /area/holodeck/source/off) "KZ" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/holofloor/tiled/bar_dance, /area/space) "Lb" = ( @@ -6479,7 +6501,9 @@ products = list(/obj/item/device/assembly/prox_sensor=5,/obj/item/device/assembly/signaler=4,/obj/item/device/assembly/infra=4,/obj/item/device/assembly/prox_sensor=4,/obj/item/handcuffs=8,/obj/item/device/flash=4,/obj/item/clothing/glasses/sunglasses=4) }, /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/structure/sign/faction/serbian{ pixel_y = 32 @@ -6513,7 +6537,9 @@ /turf/simulated/shuttle/plating, /area/shuttle/pirate) "Or" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /turf/simulated/floor/holofloor/tiled/bar_light, /area/space) "Ot" = ( @@ -6655,7 +6681,7 @@ /obj/structure/bed, /obj/item/bedsheet/green, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/shuttle/floor{ icon_state = "floor4" @@ -6692,7 +6718,9 @@ /area/space) "Qw" = ( /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/effect/floor_decal/industrial/danger{ dir = 1 @@ -7060,7 +7088,9 @@ /area/skipjack_station/start) "Ug" = ( /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /turf/simulated/floor/holofloor/tiled/bar_light, /area/space) @@ -7117,7 +7147,9 @@ }, /obj/item/reagent_containers/syringe, /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/item/reagent_containers/syringe/spaceacillin, /obj/item/reagent_containers/syringe/spaceacillin, @@ -7367,7 +7399,9 @@ /area/skipjack_station/start) "XU" = ( /obj/machinery/light{ - dir = 4 + dir = 8; + icon_state = "tube1"; + pixel_y = 0 }, /obj/structure/table/steel, /obj/item/storage/fancy/crayons, @@ -7766,7 +7800,7 @@ aa aa aa aa -qI +aa "} (2,1,1) = {" aa @@ -15547,7 +15581,7 @@ ho ho ho ho -dj +dX dn dn hZ @@ -15555,7 +15589,7 @@ hZ hZ dn dn -dX +dj ho ho ho @@ -15748,8 +15782,8 @@ at at at at -hM -cN +ho +qI dn dn hZ @@ -15757,8 +15791,8 @@ hZ hZ dn dn -cN -hM +li +ho at at at @@ -15817,7 +15851,7 @@ pz pz pH pH -pW +qi qk qo aa @@ -16754,7 +16788,7 @@ aa aa aa ho -aE +ec cq cq cq @@ -16772,7 +16806,7 @@ ek cq cq cq -ec +aE ho aa aa @@ -16960,8 +16994,8 @@ bI bI bI bI -hM -cN +ho +qI do dL hZ @@ -16969,8 +17003,8 @@ hZ hZ dL dT -cN -hM +li +ho bI bI bI @@ -17163,7 +17197,7 @@ ho ho ho ho -dj +dX do dL hZ @@ -17171,7 +17205,7 @@ hZ hZ dL dT -dX +dj ho ho ho @@ -17631,7 +17665,7 @@ pl et pl pl -pD +pl pl pl pR @@ -18031,7 +18065,7 @@ aa aa aa hN -oY +oM pg pl pl @@ -18374,8 +18408,8 @@ ho ho ho ho -hM -cN +ho +qI dn dn hZ @@ -18383,8 +18417,8 @@ hZ hZ dn dn -cN -hM +li +ho ho ho ho @@ -18580,9 +18614,9 @@ ho dk dn dn +hM hZ -hZ -hZ +hM dn dn XJ @@ -18782,9 +18816,9 @@ ho ho dK ho -hM +ho ek -hM +ho ho dU ho @@ -19453,7 +19487,7 @@ pz pz pz Lv -qi +pW qk qo aa @@ -30310,7 +30344,7 @@ iU iJ kf iq -kA +oY iJ iJ iJ @@ -30719,7 +30753,7 @@ iJ iJ iJ iJ -li +kA iJ iJ iJ @@ -33094,7 +33128,7 @@ sO sO sO sO -DS +Gl vG jT sc @@ -33498,7 +33532,7 @@ sO sO sO sO -Gl +DS vG jT tv diff --git a/maps/pulsar/pulsar.dmm b/maps/pulsar/pulsar.dmm index f44bc3a807..d0e33f4504 100644 --- a/maps/pulsar/pulsar.dmm +++ b/maps/pulsar/pulsar.dmm @@ -86,7 +86,7 @@ "cl" = ( /obj/spawner/scrap/sparse, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/techmaint, /area/outpost/pulsar/maintenance) @@ -303,9 +303,7 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/outpost/pulsar/maintenance) "lf" = ( -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/orangecorner, /area/outpost/pulsar/maintenance) "lh" = ( @@ -334,7 +332,7 @@ "lS" = ( /obj/spawner/junk/low_chance, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/outpost/pulsar/maintenance) @@ -352,9 +350,7 @@ /turf/simulated/floor/wood, /area/outpost/pulsar) "nK" = ( -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light/floor, /turf/simulated/floor/wood, /area/outpost/pulsar) "or" = ( @@ -493,9 +489,7 @@ /area/outpost/pulsar) "sZ" = ( /obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 1 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark, /area/outpost/pulsar) "th" = ( @@ -689,7 +683,9 @@ /turf/simulated/floor/tiled/dark/gray_perforated, /area/outpost/pulsar) "zu" = ( -/obj/machinery/light, +/obj/machinery/light{ + dir = 1 + }, /obj/structure/dispenser/plasma, /turf/simulated/floor/tiled/dark, /area/outpost/pulsar) @@ -705,7 +701,9 @@ /turf/simulated/floor/tiled/techmaint, /area/outpost/pulsar/maintenance) "zI" = ( -/obj/machinery/light/small, +/obj/machinery/light/small{ + dir = 1 + }, /turf/simulated/floor/tiled/techmaint, /area/outpost/pulsar/maintenance) "zM" = ( @@ -815,7 +813,7 @@ /area/outpost/pulsar) "Df" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/outpost/pulsar/maintenance) @@ -1081,7 +1079,7 @@ pixel_x = 32 }, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/plating/under, /area/outpost/pulsar/maintenance) @@ -1155,7 +1153,7 @@ "Mj" = ( /obj/spawner/junkfood/low_chance, /obj/machinery/light/small{ - dir = 8 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/outpost/pulsar/maintenance) @@ -1215,9 +1213,7 @@ "Pd" = ( /obj/structure/table/standard, /obj/spawner/material/building, -/obj/machinery/light/small{ - dir = 1 - }, +/obj/machinery/light/small, /turf/simulated/floor/tiled/steel/gray_platform, /area/outpost/pulsar/maintenance) "Pj" = ( @@ -1267,7 +1263,7 @@ /obj/structure/toilet, /obj/spawner/oddities/low_chance, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/white, /area/outpost/pulsar/maintenance) @@ -1355,7 +1351,7 @@ /obj/spawner/pizza/low_chance, /obj/item/bedsheet/yellow, /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/outpost/pulsar/maintenance) @@ -1411,7 +1407,7 @@ /area/outpost/pulsar/maintenance) "Xw" = ( /obj/machinery/light/small{ - dir = 4 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/outpost/pulsar/maintenance) @@ -24686,7 +24682,7 @@ qL to wr vW -xH +xR vW qW as @@ -25494,7 +25490,7 @@ qP nE wu vW -xR +xH vW qW as From a486c1f5607ae006bdf77023c79a6dbadb537ff5 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 16 Aug 2024 17:28:14 +0300 Subject: [PATCH 162/171] working vision , toolkit and mecha crusher. --- icons/mechs/mech_equipment.dmi | Bin 29051 -> 29038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mechs/mech_equipment.dmi b/icons/mechs/mech_equipment.dmi index 0c2c6540a36913ffc4eeeaee298638eddb2f6dda..a23ec911bf2f1eb24de51290689be61fd4c38fe2 100644 GIT binary patch delta 9277 zcma)iWmr^Q*zO*>q*GE->5!0aq(zVh=@yXgO-c%=#L$R@bcb|`bhorHAT8bB=6kPm zoj>QtnICJenZ4IDd#&}vec#Vqufg`$U=<;%U{3$>T|EiO_?Ivk6-x~cpN8~Hc@zpl zpS^4-OXZiS#vh93Qiwv2j7Sy#9tUgQUe1nup-JxODhyIIpyZCPeq3nXk@Hjv?s{Vk6E%^ zL@W*P&=>gO{R)foPo9b#y+K1JA*o)=e`h<#)uJ{<>K!?Xm_{NhRG6(>TGiF3T|de* z-)6{eVN(KYMmAypG>w7p!^kLfdDZqbbRo+olJ+?~1|LnW_=4SJOnES6xCy{N_pg}( z;>7EgI(!BDr7$;mnmnb|YW-_r(I(tacfgxC>Y=TzElCB1@IevLi{YlCOJ$4j)X$&& z!c$=IpC3y7JFk&{Av3DP<2uE4prPq*OcOq7>fzGdEl7J)8|{vmt0a;1x8*Y?l*}24 zcQjS3zjZU0o!!m6Pj&c?se%tuM9hmyvQ@zFrKumIGDqNqs*+xY*%< z#+NA$=f<^kFvbX+4`kBWI=fyYv1B3}3FL&W7x4h0EUn~=CkA+g;^xo?luxyzbQn_j zdf1qB591IrqZ`k{eRp=iQ~HUo;*#{7H}Zhhc6l*<#2vDCV5lj$winvD;wk$iLM0p} zel+auCld=6;v{3I<5$5i1)pO`1pXP0srg=-W~^! zF;$&J?u(i$0#kK8eKj1;x>87I+6iJ){GCYQM8~ZdibsMMZ2QM;V`j|V}!@eyZRSafaF9*T;s z=1Ye4+@^j%*aZS-CeTPT)l!!1e(tvKM^!-%Meee!e&h@I;sH$(aVsc+icAtP!0+hq zLVMf0psv*#xf&|vov=7<9V8$C4wHu4U4)a^?e8Kx|8!dXycW%ejAewoYNTzJ)&yjDD3adblpl32ZCTVDBv zpG`iq-VJ_46{5Nz$~^|APR#jCEPQrLh*j_1jd3d={Sy`#~ z-Kbhr{^vZ;$L&tu9uEWZAM+>^*o^i^065@3S!C-YfI`Ja*f->W9-Xw_tiVQ>^5 zM8~C{`1Z}0vHOlqC+7<9$H3*wXVK%eq+~q8L0h)IMfRcft#@g}C;>P=w4&mm2y-&& zI@prl@%k$2ho@q>f&SURI2uw$@EZaPk?0EUkNVO!{C6dfkL#UW1{EBDv&@0Ti(b8A z7+_F0+1D&Z$MbdOpZMfxRP4_MouzN`|E!+lK_^f=4g2O1Gi&t2MdtTNbE6&V{=%%q zT)uI@bZIGBfL<**H8r*F)G<%&;@gi$<)8z)V;jZSi7cRj;sA7e3{=#gGI4XoFJ?iv zHBQvA;{{g$Pl3;bfaT)6Pms43jxmsMX=6J_TW!{{(J!N+@u^TLh3~20yj!eKMpw`J zHz$tvTb)*^BM!5Qt-VivTJkbH#3Uqr`F>P>2&0=SJDxjp1wLFutaaJvZ>_FDbcECL zA0hllNF%~QFz>)!k+B`rrP>4c8|Of{gtk;K>4v$3hPb}|nL$9~F~Jya>#^hSZH}8< zTaoVg^3Xhvrj@rpq#Dt+<=<9^!+?vMJxuow?kB$}5~3esQ=CPT-S@0LZocc!xS1YB zb&Yb7jPp-V`Z>2#5;H*S)nFyO%O#~-oa;(im{!D(n zLW&c+;4Yi1kV)lAwpk{=ZeG|Uy;vU60hX|vs}Y||(!Jm;DH!a(b4dH(7()SwvJ8T! zU5>{{BL%1>(NBnipS_icgE>iXiPWE|t?M<&Ci@PGHZOm5^n4iFfFD z$u%SjNJfgpob_T`c!Rv=Gds4?myR1B{hMpgm)7|08+K=*O41gQLsl_KwBs11-=^T8-n~IH?}{)nDe1fb z0o)0#YPsBfU7eF7De=>keMgs5jqP*BTq9Le{@E_=OFC_B{UtVDWqbQ#b93`*Zf6rc z6}=JiSxz?dtTt*WrZVU5LQBT0Zz^sa9UKJs&HDavn|nFX_-$Agd6QR^Q-m{!wXdVD zfwtU8T@Ue zxI26?v4&2LFX=(hk|_|XhT?nzM@L0P-LkvJ;i_u^fQEbod*-|$dV!`xe&vZ3a_&=f z99`4BcmB_q-$6+V;J&?TL#B&*v;D|hvb;A=?tliJ8=TRi@f!3A4ALf}Z{mU_c5(E^ zy0e#(v9^6)W-NJz5|NoTGr?SZ^Td&^d*+)M{y5pIv&)aPI-GA#2;wCG?+)|cOP5F; z#r2M>XphD1#$jPlyi1GfZb(=qPCuJ2FaTbp)s?;K{MG6#}*xF2K2 zPEEbcHJFIifbB!8UOJC^d4Sh?%(>sR@6!^eC#?hMOmTWtbUez|@jA>}z>jo`&O!8t zOgz&br`WKxahOdVZElBZBNCB-z+s1pU}F_XG>^BEvZoHLr1~r)ah3VPye*fz#E^~h zk9ojrW^_svo;8@GkQfTSb?Hl*Y$zmxhn83T5#VE1JPo&vp*J3`Q)POwL$v99w<3g0 zOYPy0`@M**w)evKKFj;TR@(Ep&obYyVKPS)h*;cywfjn0dZvEd`S-YfKsL}Fc@eBU zL=(#R5h2@s-;`eS1)D;CtklsK-G5s12rulcu&` zc}=k#<2XmlbXt*lDAD4KB614QZM9#mu7r@|sz?U?tmyCUM7a#(481JYs88A}#2-1)IMevix;}OCJ^~Y zk<`LR3CvXmfzX~XJfpVL#YE+WH5=^cC3d!c;1Wes~ngR_)0!)!fMVG zNEfngr33==wk-OCp75O*?xS7b`n~vr(=WH7V>Ih6?{`pc_yO5K7BAv75&VZ|d>8P1 z;_;Esyak?qts}Ze%o{%_#~+-g#&{s4cG^;G`8aiq%d11+ty6H(*%wTRxhz#@cBIfA zdygKRc@E=hWx%BHNAU+!*dMmZB{F^L!HhSJwMSQ5G1=+7oo~G$EKDfrq515(A;BL9 zT14urw^Y~>L*-`;_x*z4S~O~V7_3E8mVCE%sx*5NO-(>R02^=7gHHf-#(jAA6SI7M z{HM#LU{|WbQaQunFAAGXF*0wVA!bgZ!t`^GAOBXeYG0Ma-+9a>FfnNxJSny#Q^vde z)+-90ObmkJhj;rbiTvWaLj^KBLF{tDG0g+tV6)?+p?qAho(7yZQ4Cuu9cSX3_$iZUh2TL8p(znq0$6KsCLwk}_0n1I*5@OJS$!8}0Y+bX2o`xS2L zMP}smabPr$q5Mst=OBeO~tO{yO85r!I_EZhQ$C%ZD+Fjj;R>oUs% zG9yM)HuYCb892pM9-L10?bl_Wz|haOhz^w8w|axj1pmc z4cL91l{LoB?6r0HSzEpjKs(`_>eFLgqk+1seDDWFFqBl}m-Xp-K5ulf^AchPl%-YX zopv68XGB2zz3?Fm5LhuZyHD>SCp#bz<8|l55hR!RrnBw$bHk{NP8*4hZt9PZ-j^dc zA#_KJLqU8~ERS2yrFfR9+PkHH6Tk6mYir*$&SA?Zo5*|XsW@9OKkvgQH(l`QB^x{Z z0ye>73JuXvgi!&gJn1QUTArCznD6ofdI6LW?6f+bot$Ls#zv*UL8~g)l|e;OqDA7!z%GM0a;&Z+p{ykALh0 z}&Z{|kMMSrGNftvB`SIfrl5bnC5BLOW44qJ&ar|S~ zCn_p&&L!Lt>Nbim=`X%}F{0Eo;vk+_zv4{NDv$jUD-JffIsAtOd)=nKSLXWEp3Fy? z*ojenmMhxZD=Z@j5SR@^W|1NHw})+J;J_T~vzzY#h}f_&eLCA5a>tIf@17k-{ibYz zfRKIR5@^@m1THlitku`mDM{72qHV0n)&wS`RHj`n2)@8=SPbU<{dHs+_W)6U%Iq-v z*#AA{Xaz}A)^hOTh?5iqfC_Ua%k*%w+Kjke*U>|ya9o9g5N0F(&i#?u_}z=1%kP9s zDXu@g6zpU*6=3+}h!Wy*EkE)1>&cD%4102hlfx|QF<6#D$HU_y>`HI}it#KPI7r?k zczd}|VfnqV!T*UsyhOC_?n>iWW@-_Uk&oYn8Ll+_X34ocBi!IkYRQe&09x zVmz<@7LhbKnG*q(gjFkR@@qC}mA(2B{o3&<*Zy~Bs%GXBGdV#_iqYyA)I=H(RGx92N7fa zAHf9_6Sr(LZAxd_NkxV`q;!N@@<+6>Zq8Ud)R1`lkr$|3Y?I zPYuh&6}Konmv6=y8oni`UG>3mYlmsy^fv!5$Ph6PQeOMWpd}H*lQ?h)PM@&=6^*zz zHwX#!RE&L6dfgT0wKx0ZJ8PI|ArUi+$PuRcZv!qZW$N6-B(=Asu@9>|I7QzdwpIAd zO91$&KM_vJoU**K@#PUJC@jgO=EvxW!;yjgPvb2oC$vYeYhbO!Pvv;VPKn?>Eynhme!zx@&FCc zeh_djQeyZ679?4)=NY(5R zS9)8-0yBs=dGgoz$lvxE6e>r}!s3VVDK+vdVxabs_{G5cqd(;|31zpMX*(-!oAiX+ zNpoaQ`bYf7lY>!eM;rtR4P9RAf@?BKWRhnqsDYM?%SeHfDrHwUY`YCdXj=YvB=BC# z(U)Yr|`yo}03w}qj_2OXdh z0N3c>bai0%+uZN@SY4nXb9@1L{#^UdaUav}ZQL7oYjjef^w)e5rv!36T&pbX_zMNd zCq6kU32gh%kbO86xA&V1o^ST<2LwbzSxWHYcUtmcMbEvo(CiIivvr;v}IlHtrIGXSF*SjYgx zVxFSm+qj#)oO!!)`s=v+A1a`ZFlM8t~ z#sE2aY3QnRvfIZ&j4BN$xOcD)J9zdUsYO*CJn_7Bw?6RH(Hi_b{>&htWdA{dw6Yf2 zdQd|mP7D+FPq7hPskkHau6j+)k9tu_>q1?c((IY? z-i7*Vym+p++Dp4azAKgHCA@5Gwf|aNjI(J>6`EGPcVVAn_ zN{c$dS5IrCUJP1JliK_EP^O`l7d&FX_r1MDX9(FqbY4d5*4G)63;2ECwtZ_Slr)Wf z(eZL1%i23;M%|W`TNq3utHAXqkV z+S}wr;(6qGgvo5`KC?(J2MOn~dO!3?Y#5fft38FrL%4)YtL(nC-Noje2A`udKTz{0|M zKHQC!no?tBIs+$b^ipxzd@3q_Ii!UiIG<}p`imSE zuiXX(0gf^jVZJb@P4O%E(Q;NoL%V~ew5jQn5}#oCRRj))v(OXBQg)tmUq?qN?x?VU zQ<;I6(7i%ZQfErfU~{9ztmSv_0?|k{3$Hk=Lu zv>c3q|L^fV>gYzJ+{%3cVe$@X&~4s)UFxmdpY`G5FDQ3l(YtC1%YboH32IBp6L1a7 zM942H8Yf8~h7qp*0)Fd;@#KDCA_%PNEYJs*nl>xeTkLT~;CmwFYJ{`bT65}&9Q3|p z>F8T7i}ayg1ym|tuQ@Q3nzsL;=uza#;4ecnLNMPJp-R~bP9Y60Sg)no5is*&Z!ojy z!{=^fHGxDDi7EPc$5nIh6SyDCd5P1Y~Lz?DMGn(WBzS{HMqxQX=QYj^+?(7rjOp1&c_ zcx{ojTQDL%()`2mYj(DzD_gO<{Z81crwIwS6oL?obV&BBrCvH6wkPn!|MM`DO3Z~^ zA&x4EQp-o_+G(h|1 ztSxQMcR3c|?BUn(4{?PTw>Yf#yX^OFv(`5J?zLUKjKeYic%Q8_>1%q*d#4b$46A4g zm7xn+_FJgHg)oVj)jAWNtr_1#3^)oRTs;jTP7LD{V2JNQM&wI%yr0y5l+Y!+f7U$; z19uM>MSbfA1H8^0Vni-H#`nlbNFHEzng6xLnbGxG-tM{PrM2f}L4PZ$QI=oHRkA}& zXdOT0oj@77*H%2FP-#A!-&q3zO#ufW$2gGMW{%cSCmfU+ z~>$XeXUV!hV?<1Zm_#~*Kq$E^pqL#p2F zU1=0nnX7=6%f+=pR^cvxxY1^&OyPamJ=(j-?FkIw=DX`lDOJz=YG^aXD8r3?jjHZL z=Biic>$#ZD3U8{LZYC_VzViS23Qo(8xTy#R!7hm~@UyzZnbkgL4tfxbh*uBXt0&%e zxVsCvZl(|3rSKuR8_GBzCKujlno4M5pa@%b>c9R>%h29$-alevYReZ2-JOHpE*3OL z^z==r^+?hj-biK!?*gC&f<@W?M)v=yL)|A+#^L%o-IXMic(EX_3y@_r^KWWyW9RBz z_501i7ju<-*29X4+;e9Wx7QQzvic=__l|>Bhtida`8uH#2vOURoxjfI^O3&R^i()z zL0yrHQ~c6ZW+zpjB>97%Rb=fiXE|PL-ObrAZ}dm|auV~>rf_6*leB|Z1^4ShZogQ7 zwTJ{h7W592SEMVt;M}$!)LOh?BQ=v6;AFfar~l6{TR&s253FZ;ZpL(n9x=SDOEq*8 zYadF>a;wnW>iU2;^>L>#1}*C;6aZgtPv&%9H(9+X!%F5K;fLzcROVO*PU%R|Blsb? z9g@@1O)dle7BMb0Aq&ND`U_3Icf6dy9Lu$Zg#Q^IhzijccNDnB>(2*J?;|Yt9EQ|x z?Q8db!n0g%ge1G^+5l)j-xNdw?i!D66NJ;X+fsKaSElmJEXk*Mhzqc}%(Qx6-OT#3 z%&C96b!fW-D!x}K0fE+@`!BEMA8GUOV?C^I8`Bjs*i&$STFYVKTi6)3`2&BKBDhP>fM?8`ZSp0B(EDFWEYk~~>;Kt| zB5Oq`9sC$iGQzK8@|5zZTd)=sJ%GjEPR@;N?u=Y*K#bG&uQI*AyF52Tnbo+yBNCq{ zEr9lH_>zq@r~5D27k`=G_3x5SuE1UkiH)=BqbpjmO{rW2I{=B1M$(M*YTge`K5lhx zVl0?$I?7I8M-5;s1QOWO>LtfC$NN{QpYi<;5c;!o(#Tv8Va4X26v;= z5DY~HBO6kCZ>`htit?dlQOs*G`+N{YwYJQo1hjOD zTwF;79r!5VCoxFICpSolgL=8C*GG{5^vvemh)>}#L+T7YCnN!cL2Q?Y>WlgLu|Y*; z<%?DCps~Dn`OOl5?wh9BvDu2Lcorp9lVG~%m?*+wQCRPXS0T>#7mI*MS(3O*t7m2Iv*TaENvdMV#L@Vn z68K9W>MP@P#Qn8(52aL;!A}V-Lnp^@!_xjx^N`&8mgvJ@a@JGnxxy6%ipx9=)Iva2%sy_UYdnM{(}p0ghKN-Em$I=cg({>%0;l1)u{@) z-c&JnMEEC;5Xj1Z=AogJ82a$e3gY$>R@gNBM;b(8mOXrpat%o@c{JAFJv$~`e5B)1 zl4C~Nph|uHTh_D~NxoCz1QiE6TYn=qd78Bukym#QC#Y0LvlD1RwJim*C?heHKcI5h!Q4-YY?d2gq@MZy|$;xUVP97 zft9%ok@44@+jZ*rk!HHUPz(x76=o;2(I;UWHi1W$UVibLvOV07|KdsR2FkJuWW9X& z9U@Jd>`#=UV@mB@3dP^ymTvTJAuKc$_*koev2qOG`CWtpIwmFEPZD z9FxsTOUE%RDmO0AIWAn~)BY9if`7!=mMB5x{F!7$XqO#TFthcu(i5M1n7O@pOjP3) z{01rsqx#DWI`Y|=!Q8Q?FpCf(D78Ql&!4Y{IIZ~#g_9roZcG!xxaijhBbD*RKPu2x zyi5?ELSgn%^!&oN2-(HOi9hAkXK!NPsey voL$@g0CDrLfI?ekd|5D9R5F;ZD(N1NeL);)xohYQfL@AnYO-b0Cc*y$SuErT delta 9290 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 Date: Tue, 20 Aug 2024 11:38:31 +0300 Subject: [PATCH 163/171] table buttons --- code/game/machinery/buttons.dm | 1 + code/game/machinery/door_control.dm | 9 ++ code/game/machinery/igniter.dm | 4 + code/modules/projectiles/hitbox_datums.dm | 8 ++ maps/CEVEris/_CEV_Eris.dmm | 105 +++++++++++----------- 5 files changed, 75 insertions(+), 52 deletions(-) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 3435051b47..774d164518 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -193,6 +193,7 @@ wifi_sender.activate("lock") operating = 0 + #undef OPEN #undef IDSCAN #undef BOLTS diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 73a2eeb64b..5e8bc7c6c8 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -134,6 +134,11 @@ var/closed = 0 var/last_message +/// a subtype meant for tables +/obj/machinery/button/remote/blast_door/table + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED + hitbox = /datum/hitboxDatum/atom/button/table + /obj/machinery/button/remote/blast_door/Initialize() . = ..() radio_conn = SSradio.add_object(src, BLAST_DOOR_FREQ, RADIO_BLASTDOORS) @@ -233,6 +238,10 @@ desc = "It controls blast doors, remotely. But need id_card with access to it." icon_state = "doorid0" +/obj/machinery/button/remote/blast_door/id_card/table + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED + hitbox = /datum/hitboxDatum/atom/button/table + /obj/machinery/button/remote/blast_door/id_card/attackby(obj/item/W, mob/user as mob) if(istype(W, /obj/item/card/id)) var/obj/item/card/id/id_card = W diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 128767d02b..02be799008 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -171,3 +171,7 @@ active = 0 return + +/obj/machinery/buttion/ignition/table + atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED + hitbox = /datum/hitboxDatum/atom/button/table diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index 384e2cb005..f907870fca 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -437,6 +437,14 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo LISTWEST = list(BBOX(13,13,20,21,LEVEL_CHEST+1, LEVEL_CHEST-1,null)) ) +/datum/hitboxDatum/atom/button/table + boundingBoxes = list( + LISTSOUTH = list(BBOX(13,13,20,21,LEVEL_TABLE, LEVEL_TABLE+4,null)), + LISTNORTH = list(BBOX(13,13,20,21,LEVEL_TABLE, LEVEL_TABLE+4,null)), + LISTEAST = list(BBOX(13,13,20,21,LEVEL_TABLE, LEVEL_TABLE+4,null)), + LISTWEST = list(BBOX(13,13,20,21,LEVEL_TABLE, LEVEL_TABLE+4,null)) + ) + /datum/hitboxDatum/atom/closet boundingBoxes = list( LISTSOUTH = list(BBOX(9,3,24,32,LEVEL_TURF, LEVEL_HEAD,null)), diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 42d57b0497..63a3741ccc 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -9657,10 +9657,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "xenobio4"; - name = "Containment 4 Blast Doors"; - pixel_y = 4 + name = "Containment 4 Blast Doors" }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) @@ -25558,8 +25557,7 @@ /area/eris/rnd/lab) "biY" = ( /obj/structure/table/standard, -/obj/machinery/button/remote/blast_door{ - desc = "It controls the blast door to the main RND entrance."; +/obj/machinery/button/remote/blast_door/table{ id = "RDDoorLockdown"; name = "RND Door Blast Door Control" }, @@ -25858,8 +25856,7 @@ /area/eris/maintenance/section2deck4starboard) "bjC" = ( /obj/structure/table/standard, -/obj/machinery/button/remote/blast_door{ - desc = "It controls the RND Window Blast doors."; +/obj/machinery/button/remote/blast_door/table{ id = "RDWindowsLockdown"; name = "RND Window Blast Doors Control" }, @@ -26178,10 +26175,9 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "xenobio2"; - name = "Containment 2 Blast Doors"; - pixel_y = 4 + name = "Containment 2 Blast Doors" }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) @@ -34541,10 +34537,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/button/remote/blast_door{ - id = "xenobio5"; +/obj/machinery/button/remote/blast_door/table{ name = "Containment 5 Blast Doors"; - pixel_y = 4 + id = "xenobio5" }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -34657,10 +34652,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/button/remote/blast_door{ - id = "xenobio3"; +/obj/machinery/button/remote/blast_door/table{ name = "Containment 3 Blast Doors"; - pixel_y = 4 + id = "xenobio3" }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -34672,10 +34666,9 @@ /obj/machinery/light{ dir = 8 }, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "xenobio1"; - name = "Containment 1 Blast Doors"; - pixel_y = 4 + name = "Containment 1 Blast Doors" }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -45931,10 +45924,11 @@ id = "toxin_chamber1"; pixel_y = -5 }, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ + pixel_x = 0; + pixel_y = 5; id = "toxinchamber1"; - name = "Mixing Room Vent Control"; - pixel_y = 5 + name = "Mixing Room Vent Control" }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) @@ -48568,10 +48562,11 @@ id = "toxin_chamber2"; pixel_y = -5 }, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ + pixel_x = 0; + pixel_y = 5; id = "toxinchamber2"; - name = "Mixing Room Vent Control"; - pixel_y = 5 + name = "Mixing Room Vent Control" }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) @@ -71588,10 +71583,9 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "xenobio6"; - name = "Containment 6 Blast Doors"; - pixel_y = 4 + name = "Containment 6 Blast Doors" }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) @@ -76148,26 +76142,23 @@ /area/eris/medical/reception) "dBO" = ( /obj/structure/table/standard, -/obj/machinery/button/remote/airlock{ - desc = "A remote control switch."; - id = "MedbayPatients"; - name = "Patients Exit Button"; - pixel_x = -6; - pixel_y = 6 +/obj/machinery/button/remote/blast_door/table{ + pixel_x = -5; + pixel_y = -5; + id = "MedbayExam"; + name = "Examination Door Control" }, -/obj/machinery/button/remote/airlock{ - desc = "A remote control switch."; +/obj/machinery/button/remote/blast_door/table{ + pixel_x = 5; + pixel_y = -5; id = "MedbayCryo2"; - name = "Medbay Therapy Exit Button"; - pixel_x = 4; - pixel_y = -4 + name = "Medbay Therapy Exit Button" }, -/obj/machinery/button/remote/airlock{ - desc = "A remote control switch."; - id = "MedbayExam"; - name = "Examination Door Control"; - pixel_x = -6; - pixel_y = -4 +/obj/machinery/button/remote/blast_door/table{ + pixel_x = -5; + pixel_y = 5; + id = "MedbayPatients"; + name = "Patients Exit Button" }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/reception) @@ -81785,7 +81776,7 @@ /obj/structure/table/standard, /obj/item/cell/large/high, /obj/item/cell/large/high, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "shieldroom"; name = "Shield Generator Shutters" }, @@ -98327,7 +98318,8 @@ pixel_y = -30 }, /obj/structure/table/reinforced, -/obj/machinery/button/remote/blast_door{ +/obj/structure/table/reinforced, +/obj/machinery/button/remote/blast_door/table{ id = "BridgeEntrance"; name = "Bridge Entrance Lockdown" }, @@ -100962,6 +100954,16 @@ /obj/structure/cable/green, /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck5port) +"hYq" = ( +/obj/machinery/button/remote/airlock{ + desc = "A remote control switch."; + id = s; + name = s; + pixel_x = 4; + pixel_y = -4 + }, +/turf/simulated/floor/tiled/white/brown_perforated, +/area/eris/medical/reception) "iaf" = ( /obj/structure/multiz/stairs/enter{ dir = 1 @@ -106653,9 +106655,9 @@ /area/eris/crew_quarters/fitness) "uPp" = ( /obj/structure/table/standard, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "scannerroom"; - name = "Long Range Scanner Shutters" + name = "Long Range Scansner Shutters" }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/long_range_scanner) @@ -107990,8 +107992,7 @@ /area/eris/neotheology/chapel) "xTZ" = ( /obj/structure/table/standard, -/obj/machinery/button/remote/blast_door{ - desc = "It controls the blast door to the main RND entrance."; +/obj/machinery/button/remote/blast_door/table{ id = "MEOPrivacyShutters"; name = "MEO Privacy Shutters" }, @@ -207904,7 +207905,7 @@ kUI coS coM dzF -coM +hYq coM dno cqJ From 1997ad68bd5c29d7c1e5f90d9ade34933ebd4bd8 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 20 Aug 2024 11:40:08 +0300 Subject: [PATCH 164/171] a --- code/game/machinery/igniter.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 02be799008..ef58e6161a 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -172,6 +172,6 @@ return -/obj/machinery/buttion/ignition/table +/obj/machinery/button/ignition/table atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED hitbox = /datum/hitboxDatum/atom/button/table From d8ca30e51c4869429f819af9a76b5a450ab6456e Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 20 Aug 2024 11:51:53 +0300 Subject: [PATCH 165/171] mapping changes --- maps/CEVEris/_CEV_Eris.dmm | 1368 +++++++++++++++++++++++++----------- 1 file changed, 950 insertions(+), 418 deletions(-) diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 63a3741ccc..a839512547 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -138,7 +138,8 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/range) @@ -302,7 +303,8 @@ /area/eris/security/range) "aaW" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/green{ d1 = 1; @@ -330,7 +332,9 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/armory) "aba" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/closet, /obj/item/clothing/under/netrunner, /obj/item/clothing/under/netrunner, @@ -565,7 +569,8 @@ "abE" = ( /obj/machinery/deployable/barrier, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/cargo, /area/eris/security/armory) @@ -633,7 +638,8 @@ /area/eris/crew_quarters/toilet/medbay) "abO" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark, /area/eris/security/range) @@ -888,7 +894,8 @@ /area/eris/security/armory) "acp" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/security/armory) @@ -1027,7 +1034,8 @@ /area/eris/security/armory) "acF" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/alarm{ dir = 4; @@ -1667,7 +1675,8 @@ /area/eris/security/disposal) "aee" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark, /area/eris/security/prison) @@ -1728,7 +1737,8 @@ dir = 6 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/firealarm{ dir = 4; @@ -1845,7 +1855,8 @@ /obj/structure/table/rack, /obj/spawner/lowkeyrandom, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/office) @@ -1877,7 +1888,8 @@ /area/eris/security/armory) "aeF" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/fireaxecabinet{ pixel_y = -24; @@ -2754,7 +2766,8 @@ /area/eris/maintenance/section1deck5central) "agJ" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/cable/green{ d1 = 1; @@ -3481,7 +3494,8 @@ pixel_x = -30 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -3536,7 +3550,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/carpet, /area/eris/crew_quarters/sleep) @@ -3566,7 +3581,8 @@ "aiF" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -4204,7 +4220,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4733,7 +4751,9 @@ /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/exerooms) "ali" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep) "alj" = ( @@ -5009,7 +5029,8 @@ "alR" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/carpet, @@ -5032,7 +5053,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/carpet, /area/eris/crew_quarters/sleep) @@ -6074,7 +6096,8 @@ /area/eris/maintenance/section2deck1starboard) "aot" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck5port) @@ -6413,7 +6436,9 @@ /turf/simulated/wall/r_wall, /area/eris/maintenance/section3deck5starboard) "apo" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/disposaloutlet, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -6605,7 +6630,8 @@ /area/eris/hallway/side/eschangarb) "apO" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/reinforced, /area/eris/rnd/podbay) @@ -6649,7 +6675,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) @@ -6750,7 +6777,9 @@ /area/eris/rnd/podbay) "aqd" = ( /obj/machinery/recharge_station, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/toilet/medbay) "aqe" = ( @@ -6909,7 +6938,8 @@ /area/eris/maintenance/section3deck2starboard) "aqv" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark, /area/eris/rnd/podbay) @@ -7297,7 +7327,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/toilet/medbay) "arj" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/reinforced, /area/eris/rnd/podbay) "ark" = ( @@ -7527,7 +7559,9 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/landmark/storyevent/midgame_stash_spawn{ navigation = "Section 2, floor 1. Medbay toilet." }, @@ -7770,7 +7804,8 @@ /area/eris/maintenance/section2deck5starboard) "ash" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/vending/printomat{ dir = 4 @@ -7899,7 +7934,8 @@ pixel_y = -22 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/toilet/medbay) @@ -7955,7 +7991,8 @@ tag_door = "escape_pod_1_berth_hatch" }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) @@ -8531,7 +8568,9 @@ /area/shuttle/escape_pod1/station) "aue" = ( /obj/structure/bed/chair/shuttle, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -9047,7 +9086,8 @@ /area/eris/quartermaster/disposaldrop) "avA" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/steel, @@ -10052,7 +10092,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) "ayu" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "ayv" = ( @@ -10113,7 +10155,8 @@ /area/eris/crew_quarters/library) "ayB" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/green{ d1 = 1; @@ -10254,7 +10297,8 @@ /area/eris/maintenance/junk) "ayU" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) @@ -10573,7 +10617,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) "azJ" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/button/remote/blast_door{ id = "Armoury"; name = "Armoury Access"; @@ -10594,7 +10640,9 @@ "azM" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -11150,7 +11198,9 @@ /area/eris/security/main) "aBa" = ( /obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/rnd/chargebay) "aBb" = ( @@ -11227,7 +11277,9 @@ name = "Security Requests Console"; pixel_y = 30 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBk" = ( @@ -11253,7 +11305,9 @@ /obj/structure/noticeboard{ pixel_y = 28 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBn" = ( @@ -11328,7 +11382,9 @@ /obj/machinery/door/blast/shutters/glass{ id = "Sky_Driver" }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/prisoncells) "aBy" = ( @@ -11369,7 +11425,8 @@ /area/eris/maintenance/section3deck2starboard) "aBE" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/dispenser, /turf/simulated/floor/tiled/dark/gray_platform, @@ -11380,7 +11437,8 @@ /area/eris/maintenance/junk) "aBG" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics) @@ -12047,7 +12105,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/security/prison) @@ -12215,7 +12274,8 @@ "aDS" = ( /obj/structure/multiz/stairs/enter/bottom, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/security/lobby) @@ -12230,7 +12290,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/security/armory) @@ -12345,7 +12406,9 @@ /area/shuttle/escape_pod2/station) "aEj" = ( /obj/structure/bed/chair/shuttle, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -12456,7 +12519,8 @@ name = "Junk Beacon Airlock Pump" }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/maintenance/junk) @@ -12805,7 +12869,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/chargebay) "aFv" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/maintenance/junk) "aFw" = ( @@ -13261,7 +13327,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13313,7 +13380,8 @@ /area/eris/engineering/atmos) "aGT" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13513,7 +13581,8 @@ "aHx" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -14163,7 +14232,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -15486,7 +15556,8 @@ /area/eris/rnd/server) "aMR" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -15497,7 +15568,8 @@ /area/eris/rnd/server) "aMS" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -16163,7 +16235,8 @@ /area/eris/engineering/atmos) "aOB" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/hull, /area/eris/maintenance/junk) @@ -16317,7 +16390,8 @@ /area/eris/maintenance/section3deck4central) "aOV" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/table/standard{ name = "plastic table frame" @@ -16327,7 +16401,8 @@ /area/eris/rnd/chargebay) "aOW" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/hull, /area/eris/maintenance/junk) @@ -16383,7 +16458,8 @@ /obj/structure/table/reinforced, /obj/item/electronics/ai_module/corp, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) @@ -16411,7 +16487,9 @@ /turf/simulated/wall, /area/eris/maintenance/section1deck4central) "aPj" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) "aPk" = ( @@ -17524,7 +17602,9 @@ /area/eris/security/warden) "aRC" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/rnd/lab) "aRD" = ( @@ -17742,7 +17822,8 @@ /area/eris/security/main) "aSb" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/closet/secure_closet/personal/security, /turf/simulated/floor/tiled/dark/gray_platform, @@ -17785,7 +17866,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -17876,7 +17958,8 @@ "aSr" = ( /obj/machinery/vending/security, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -17973,7 +18056,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/rnd/lab) "aSC" = ( @@ -18496,7 +18581,8 @@ "aTN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -18534,7 +18620,8 @@ /area/eris/security/main) "aTR" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/alarm{ dir = 4; @@ -18570,7 +18657,8 @@ /area/eris/rnd/lab) "aTV" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/firealarm{ dir = 8; @@ -19240,7 +19328,8 @@ /obj/item/device/radio/off, /obj/item/tool/crowbar, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -19889,7 +19978,8 @@ "aWP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/medical/virology) @@ -19906,7 +19996,8 @@ /obj/structure/table/standard, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/medical/virology) @@ -20062,7 +20153,8 @@ /obj/item/handcuffs, /obj/item/handcuffs, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -20171,7 +20263,9 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/evidencestorage) "aXB" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/table/rack/shelf, /turf/simulated/floor/tiled/dark, /area/eris/security/evidencestorage) @@ -20308,7 +20402,8 @@ /area/eris/medical/virology) "aXQ" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/alarm{ dir = 4; @@ -20747,7 +20842,8 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_evidstor"; @@ -21831,7 +21927,8 @@ /obj/structure/table/reinforced, /obj/item/electronics/ai_module/robocop, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/department/ai{ pixel_x = 32 @@ -23622,7 +23719,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4central) "beo" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_medbay_rec"; name = "Maintenance Hatch Control"; @@ -24075,7 +24174,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/rnd/lab) @@ -24360,7 +24460,8 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -24446,7 +24547,8 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -24876,7 +24978,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4starboard) "bhq" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -25445,7 +25549,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/command/courtroom) @@ -25587,7 +25692,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/department/robo{ pixel_x = 32 @@ -25600,7 +25706,8 @@ /obj/item/storage/fancy/vials, /obj/item/storage/fancy/vials, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/power/apc{ dir = 4; @@ -26173,7 +26280,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/button/remote/blast_door/table{ id = "xenobio2"; @@ -26248,7 +26356,8 @@ /area/eris/hallway/side/morguehallway) "bkr" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/cable/green{ d1 = 1; @@ -26736,7 +26845,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "blt" = ( @@ -27749,7 +27860,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -27777,7 +27889,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -27956,7 +28069,8 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -27995,7 +28109,8 @@ /area/eris/hallway/side/morguehallway) "bol" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark, /area/eris/hallway/side/morguehallway) @@ -28013,7 +28128,8 @@ /area/eris/hallway/side/morguehallway) "boo" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark, /area/eris/hallway/side/morguehallway) @@ -28148,7 +28264,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "boD" = ( @@ -28445,7 +28563,8 @@ /area/eris/maintenance/section3deck1central) "bpo" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/biogenerator) @@ -29077,7 +29196,8 @@ /area/eris/maintenance/section1deck3central) "bra" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/toilet/medbay) @@ -29644,13 +29764,15 @@ /area/eris/maintenance/section4deck4port) "bsE" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) "bsF" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -30044,7 +30166,8 @@ /area/eris/maintenance/section3deck1central) "btK" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) @@ -30527,7 +30650,8 @@ /area/eris/engineering/atmoscontrol) "buX" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -30664,7 +30788,8 @@ /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -31046,7 +31171,8 @@ /area/eris/security/lobby) "bwk" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/security/lobby) @@ -31062,7 +31188,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) "bwo" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/sign/faction/ironhammer{ pixel_y = 32 }, @@ -31077,7 +31205,9 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/security/prisoncells) "bwq" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -31606,7 +31736,8 @@ /area/eris/crew_quarters/clothingstorage) "bxt" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/landmark/storyevent/hidden_vent_antag, /turf/simulated/floor/tiled/steel, @@ -31697,7 +31828,8 @@ /area/eris/engineering/atmoscontrol) "bxF" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/holoposter{ pixel_y = -32 @@ -31721,7 +31853,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -31877,7 +32010,9 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) "bxX" = ( @@ -31946,7 +32081,8 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -31999,7 +32135,8 @@ /area/eris/medical/surgery) "bym" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/department/sci{ pixel_x = 32 @@ -32074,7 +32211,8 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -32241,7 +32379,9 @@ /turf/simulated/floor/tiled/steel/danger, /area/eris/engineering/drone_fabrication) "byT" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/drone_fabrication) "byU" = ( @@ -32385,7 +32525,8 @@ /area/eris/hallway/main/section4) "bzm" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/power/apc{ dir = 4; @@ -32485,7 +32626,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/simple/hidden/cyan, /turf/simulated/floor/tiled/steel, @@ -32553,7 +32695,8 @@ /area/eris/hallway/main/section4) "bzE" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) @@ -32936,7 +33079,9 @@ /obj/machinery/ai_status_display{ pixel_y = 32 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -34238,7 +34383,8 @@ /area/eris/rnd/docking) "bDW" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) @@ -34459,7 +34605,8 @@ /area/turret_protected/ai) "bEv" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/anomal) @@ -34505,7 +34652,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -34544,7 +34692,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) "bEH" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/sign/biohazard{ icon_state = "bio-danger"; pixel_y = 32 @@ -34664,7 +34814,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/button/remote/blast_door/table{ id = "xenobio1"; @@ -34845,7 +34996,9 @@ /turf/simulated/wall/r_wall, /area/eris/engineering/telecommonitor) "bFn" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/telecomms/server/presets/supply, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -35111,7 +35264,8 @@ /area/eris/command/tcommsat/chamber) "bFQ" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/telecomms/bus/preset_four, /turf/simulated/floor/bluegrid{ @@ -35503,7 +35657,9 @@ /area/eris/hallway/side/atmosphericshallway) "bGG" = ( /obj/machinery/disposal, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/disposalpipe/trunk, /obj/structure/cable{ d1 = 4; @@ -35655,7 +35811,9 @@ "bGY" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/atmospherics/portables_connector, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology/xenoflora) "bGZ" = ( @@ -35677,7 +35835,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology/xenoflora) "bHd" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) "bHe" = ( @@ -36242,7 +36402,8 @@ /area/eris/maintenance/section4deck4port) "bIl" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) @@ -37067,7 +37228,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck3central) "bJS" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/spawner/material/building, /turf/simulated/floor/plating, /area/eris/engineering/construction) @@ -37255,7 +37418,8 @@ /area/eris/engineering/construction) "bKq" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/cyan{ d1 = 1; @@ -37827,7 +37991,9 @@ "bLx" = ( /obj/structure/table/standard, /obj/machinery/recharger, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/holoposter{ pixel_y = 32 }, @@ -38063,7 +38229,9 @@ /obj/machinery/computer/cryopod/robot{ pixel_y = 30 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) "bMd" = ( @@ -38450,7 +38618,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) "bMS" = ( @@ -39916,7 +40086,9 @@ "bQg" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/structure/reagent_dispensers/watertank/huge, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/extinguisher_cabinet{ pixel_y = 27; dir = 2 @@ -40549,7 +40721,8 @@ "bRT" = ( /obj/structure/closet/wardrobe/color/grey, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/clothingstorage) @@ -40895,7 +41068,9 @@ /turf/simulated/floor/wood, /area/eris/command/courtroom) "bSU" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/wood, /area/eris/command/courtroom) "bSV" = ( @@ -41344,7 +41519,8 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -41711,13 +41887,10 @@ /obj/item/storage/toolbox/mechanical, /obj/item/storage/toolbox/mechanical, /obj/structure/table/standard, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -28 - }, /obj/item/paper_bin, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -41764,7 +41937,8 @@ /obj/item/stack/material/steel/random, /obj/item/stack/material/plastic/random, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/crew_quarters/janitor) @@ -41789,7 +41963,8 @@ "bVd" = ( /obj/structure/janitorialcart, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/crew_quarters/janitor) @@ -41826,7 +42001,8 @@ /area/eris/security/lobby) "bVh" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) @@ -41957,7 +42133,8 @@ /area/eris/security/lobby) "bVA" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/steel/bluecorner, @@ -42012,7 +42189,8 @@ }, /obj/structure/flora/ausbushes/lavendergrass, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) @@ -42078,7 +42256,8 @@ /area/eris/hallway/main/section1) "bVP" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/computer/rdservercontrol{ dir = 4 @@ -42270,7 +42449,9 @@ /area/eris/rnd/server) "bWs" = ( /obj/structure/closet, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/surgery) "bWt" = ( @@ -42525,7 +42706,9 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/security/inspectors_office) "bWV" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/omni/filter{ tag_east = 1; tag_south = 5; @@ -42542,7 +42725,8 @@ /area/eris/rnd/mixing) "bWX" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/alarm{ dir = 4; @@ -42648,7 +42832,8 @@ /area/eris/security/inspectors_office) "bXn" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) @@ -42975,7 +43160,9 @@ /obj/structure/table/standard, /obj/item/storage/box/gloves, /obj/item/reagent_containers/spray/cleaner, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -43209,7 +43396,9 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck3port) "bYM" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/bluegrid{ name = "Server Base"; nitrogen = 180; @@ -43449,7 +43638,9 @@ id = "AI"; pixel_y = 24 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -43504,7 +43695,9 @@ id = "AI"; pixel_y = 24 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/cable/cyan{ d1 = 4; d2 = 8; @@ -43603,7 +43796,8 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) @@ -43612,7 +43806,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -43643,7 +43838,8 @@ /area/eris/hallway/main/section2) "bZT" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -43656,7 +43852,8 @@ /area/turret_protected/ai) "bZV" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/cyan{ d1 = 1; @@ -43741,7 +43938,8 @@ id = "hangar_to_cargo" }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) @@ -44230,7 +44428,9 @@ /turf/simulated/floor/wood, /area/eris/command/fo) "cby" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -44256,7 +44456,8 @@ /area/eris/command/fo) "cbC" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) @@ -44324,7 +44525,8 @@ /area/turret_protected/ai) "cbJ" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/cyan{ d1 = 1; @@ -44353,7 +44555,8 @@ /area/eris/command/tcommsat/chamber) "cbM" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -44688,7 +44891,9 @@ /area/eris/rnd/mixing) "ccK" = ( /obj/machinery/hologram/holopad, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/turretid/stun{ check_synth = 1; name = "AI Chamber turret control"; @@ -44927,7 +45132,8 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/clothingstorage) @@ -45757,7 +45963,8 @@ "ceS" = ( /obj/machinery/disposal, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/disposalpipe/trunk, /turf/simulated/floor/bluegrid, @@ -45828,7 +46035,8 @@ id = "Bluespace_Biosyphon" }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) @@ -45920,16 +46128,17 @@ /area/turret_protected/ai) "cfl" = ( /obj/structure/table/reinforced, -/obj/machinery/button/ignition{ - id = "toxin_chamber1"; - pixel_y = -5 - }, /obj/machinery/button/remote/blast_door/table{ pixel_x = 0; pixel_y = 5; id = "toxinchamber1"; name = "Mixing Room Vent Control" }, +/obj/machinery/button/ignition/table{ + pixel_x = 0; + pixel_y = -6; + id = "toxin_chamber1" + }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) "cfm" = ( @@ -45969,7 +46178,9 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/storage/tech) "cfs" = ( @@ -46597,7 +46808,8 @@ /obj/structure/table/standard, /obj/machinery/recharger, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/item/device/radio/intercom{ dir = 4; @@ -47343,7 +47555,8 @@ /area/eris/rnd/scient) "ciA" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/portable_atmospherics/powered/pump, /turf/simulated/floor/tiled/steel/gray_platform, @@ -47873,7 +48086,8 @@ /area/eris/rnd/mixing) "cjU" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -47882,7 +48096,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -47966,7 +48181,9 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 8 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "ckh" = ( @@ -48125,7 +48342,8 @@ /obj/machinery/recharger, /obj/structure/table/reinforced, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/rnd/mixing) @@ -48151,7 +48369,9 @@ /turf/simulated/open, /area/eris/quartermaster/storage) "ckF" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/camera/network/fourth_section{ dir = 4 }, @@ -48558,16 +48778,17 @@ /area/eris/rnd/mixing) "clQ" = ( /obj/structure/table/reinforced, -/obj/machinery/button/ignition{ - id = "toxin_chamber2"; - pixel_y = -5 - }, /obj/machinery/button/remote/blast_door/table{ pixel_x = 0; pixel_y = 5; id = "toxinchamber2"; name = "Mixing Room Vent Control" }, +/obj/machinery/button/ignition/table{ + pixel_x = 0; + pixel_y = -6; + id = "toxin_chamber2" + }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) "clR" = ( @@ -48650,10 +48871,13 @@ /area/eris/crew_quarters/kitchen_storage) "clY" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/flora/ausbushes/ppflowers, /obj/structure/sign/faction/neotheology_cross/gold{ - pixel_y = 32 + pixel_y = 25; + pixel_x = 0 }, /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) @@ -48765,7 +48989,8 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 @@ -49350,7 +49575,8 @@ pixel_x = -2 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay) @@ -49395,7 +49621,8 @@ /area/eris/rnd/mixing) "cnR" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sink{ dir = 4; @@ -49451,7 +49678,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -49460,7 +49688,9 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "coc" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/table/woodentable, /obj/item/storage/fancy/vials, /turf/simulated/floor/carpet, @@ -49503,7 +49733,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/medical/medbay) @@ -49738,7 +49969,9 @@ /area/eris/medical/reception) "coP" = ( /obj/machinery/photocopier, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -50025,7 +50258,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -50121,7 +50355,8 @@ /area/eris/medical/medbay) "cpK" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -50140,7 +50375,8 @@ /area/eris/crew_quarters/kitchen) "cpO" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -50201,7 +50437,8 @@ "cpZ" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics/garden) @@ -50836,7 +51073,9 @@ /area/eris/maintenance/section2deck3port) "crz" = ( /obj/machinery/vending/cola, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/sign/pods{ pixel_y = 32 }, @@ -50942,7 +51181,8 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -51158,7 +51398,8 @@ req_access = null }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/cryo) @@ -51394,7 +51635,8 @@ /area/eris/quartermaster/storage) "csX" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -51635,7 +51877,9 @@ /obj/structure/multiz/stairs/enter{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "ctP" = ( @@ -51664,7 +51908,7 @@ }, /obj/structure/catwalk, /obj/structure/table/standard, -/obj/machinery/button/remote/blast_door/id_card{ +/obj/machinery/button/remote/blast_door/id_card/table{ id = "random_radio"; name = "Random wave radio id lock"; req_access = list(31) @@ -51768,7 +52012,8 @@ /area/eris/medical/medbay) "cuj" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/biogenerator) @@ -51778,7 +52023,8 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) @@ -51977,7 +52223,8 @@ /area/eris/command/meo) "cuM" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -52108,7 +52355,8 @@ }, /obj/item/bluespace_harpoon, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/carpet/purcarpet, /area/eris/command/meo) @@ -52250,7 +52498,8 @@ /area/eris/hallway/side/bridgehallway) "cvD" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/green{ @@ -52348,7 +52597,8 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/computer/message_monitor{ dir = 4 @@ -53048,7 +53298,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/flora/ausbushes/lavendergrass, /turf/simulated/floor/grass, @@ -53181,7 +53432,8 @@ /obj/spawner/lathe_disk, /obj/item/computer_hardware/hard_drive/portable/design/tools, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) @@ -53319,7 +53571,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/alarm{ pixel_y = 26 }, @@ -53374,7 +53628,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -53447,7 +53703,8 @@ /area/eris/rnd/research) "cyv" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/research) @@ -53461,7 +53718,8 @@ "cyy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atm{ dir = 8; @@ -53557,7 +53815,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/engine_room) @@ -53739,7 +53998,8 @@ /area/eris/quartermaster/storage) "czn" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/floodlight, /turf/simulated/floor/tiled/steel/danger, @@ -55123,7 +55383,8 @@ "cCA" = ( /obj/structure/reagent_dispensers/cahorsbarrel, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/wood, /area/eris/neotheology/storage) @@ -55932,12 +56193,11 @@ /obj/structure/table/standard, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/machinery/button/remote/blast_door/id_card{ - id = "maneki_neko"; +/obj/machinery/button/remote/blast_door/id_card/table{ + req_access = list(41); name = "Maneki Neko id lock"; - req_access = list(41) + id = "maneki_neko" }, -/obj/landmark/storyevent/potential_unique_oddity_spawn, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) "cEC" = ( @@ -56005,7 +56265,9 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/command/exultant/quarters) "cEJ" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -56255,7 +56517,8 @@ /area/eris/maintenance/section3deck4starboard) "cFo" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/wood, /area/eris/neotheology/office) @@ -56430,7 +56693,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -56579,7 +56844,8 @@ /area/eris/quartermaster/office) "cGa" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -57457,7 +57723,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/command/bridge) @@ -57854,7 +58121,9 @@ /turf/simulated/wall, /area/eris/maintenance/substation/section3) "cJx" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/autolathe/nanoforge, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -57916,7 +58185,8 @@ /area/eris/maintenance/section2deck2starboard) "cJE" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/sec4{ pixel_x = 32 @@ -58166,6 +58436,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 5 }, +/obj/landmark/storyevent/potential_unique_oddity_spawn, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) "cKl" = ( @@ -58502,7 +58773,8 @@ /obj/item/cell/large/high, /obj/item/cell/large/high, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/hallway/side/section3starboard) @@ -58700,7 +58972,8 @@ /area/eris/maintenance/section4deck3port) "cLy" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -59088,7 +59361,9 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "cMt" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/camera/network/third_section{ dir = 8 }, @@ -59282,7 +59557,8 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -60100,7 +60376,9 @@ }, /area/shuttle/mining/station) "cPF" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "3,21" }, @@ -60429,7 +60707,8 @@ "cQC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/shuttle/floor/mining{ icon_state = "12,20" @@ -60560,7 +60839,8 @@ /obj/item/device/lighting/glowstick/flare, /obj/item/device/lighting/glowstick/flare, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/sec4{ pixel_x = 32 @@ -61346,7 +61626,8 @@ dir = 8 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/shuttle/floor/mining{ icon_state = "8,16" @@ -61651,7 +61932,8 @@ icon_state = "plant-01" }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -61673,7 +61955,8 @@ icon_state = "plant-21" }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -61795,7 +62078,9 @@ /area/shuttle/mining/station) "cUr" = ( /obj/structure/ore_box, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "13,14" }, @@ -62141,7 +62426,8 @@ "cVo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/shuttle/floor/mining{ icon_state = "8,12" @@ -62308,7 +62594,8 @@ /obj/item/clothing/gloves/latex, /obj/item/hand_labeler, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/xenobiology) @@ -63064,7 +63351,9 @@ /area/shuttle/mining/station) "cXC" = ( /obj/structure/closet/secure_closet/personal/miner, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "4,9" }, @@ -63815,7 +64104,9 @@ }, /area/shuttle/mining/station) "cZf" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/shuttle/floor/mining{ icon_state = "10,7" }, @@ -63977,7 +64268,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -64229,7 +64522,8 @@ /area/eris/maintenance/substation/section3) "dac" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/open, /area/eris/crew_quarters/sleep/cryo) @@ -64239,13 +64533,15 @@ pixel_y = 28 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/medbay/iso) "dae" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/open, /area/eris/crew_quarters/sleep/cryo) @@ -64596,7 +64892,8 @@ /obj/item/reagent_containers/food/drinks/bottle/small/beer, /obj/item/reagent_containers/food/drinks/bottle/small/beer, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/shuttle/floor/mining{ icon_state = "7,3" @@ -64619,7 +64916,8 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/shuttle/floor/mining{ icon_state = "10,3" @@ -65683,7 +65981,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "ddE" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -65882,7 +66182,8 @@ pixel_x = 25 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -65974,7 +66275,8 @@ icon_state = "pipe-j2" }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -66009,7 +66311,8 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -66049,7 +66352,8 @@ "deq" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/wood, /area/eris/command/bridgebar) @@ -66554,7 +66858,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/wood, /area/eris/command/captain) @@ -66610,7 +66915,8 @@ "dfD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/item/device/radio/intercom{ dir = 8; @@ -66638,7 +66944,8 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -67067,7 +67374,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -67121,7 +67430,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/light_switch{ pixel_y = 28 }, @@ -67261,7 +67572,9 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) "dgZ" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/alarm{ pixel_y = 26 }, @@ -67292,7 +67605,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/light_switch{ pixel_y = 28 }, @@ -67595,7 +67910,8 @@ /obj/structure/bed/padded, /obj/item/bedsheet/rd, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/wood, /area/eris/command/meo/quarters) @@ -67665,7 +67981,8 @@ /area/eris/command/meeting_room) "dhU" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -67676,7 +67993,8 @@ /obj/item/hand_labeler, /obj/item/packageWrap, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) @@ -67742,7 +68060,8 @@ /obj/structure/table/woodentable, /obj/item/storage/box/donut, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -68013,7 +68332,9 @@ "diK" = ( /obj/structure/closet, /obj/spawner/contraband/low_chance, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "diL" = ( @@ -68046,7 +68367,8 @@ "diO" = ( /obj/structure/railing, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/open, /area/turret_protected/ai) @@ -68602,7 +68924,8 @@ /area/eris/security/checkpoint/science) "djZ" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -68641,7 +68964,8 @@ /area/eris/hallway/side/atmosphericshallway) "dkd" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -68896,7 +69220,8 @@ /area/eris/maintenance/substation/bridge) "dkJ" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/railing{ dir = 1 @@ -69418,7 +69743,9 @@ desc = "BIOHAZARD. Toxic biomatter in this area."; pixel_y = 32 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -69442,7 +69769,9 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/office) "dlR" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/open, /area/eris/command/tcommsat/chamber) "dlS" = ( @@ -69677,7 +70006,8 @@ /obj/structure/table/woodentable, /obj/item/clothing/glasses/hud/health, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/wood, /area/eris/command/mbo/quarters) @@ -70381,7 +70711,8 @@ icon_state = "1-2" }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -70631,7 +70962,8 @@ pixel_y = -5 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/checkpoint/supply) @@ -70988,7 +71320,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -71002,7 +71335,9 @@ /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/reception) "dpq" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, @@ -71099,7 +71434,8 @@ /area/eris/rnd/research) "dpE" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/maintenance/junk) @@ -71450,7 +71786,8 @@ /area/eris/maintenance/section4deck2starboard) "dqs" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark/danger, /area/eris/engineering/gravity_generator) @@ -71501,7 +71838,8 @@ /area/eris/hallway/main/section2) "dqz" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/danger, /area/eris/engineering/gravity_generator) @@ -71538,7 +71876,8 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) @@ -71697,7 +72036,8 @@ /area/eris/medical/medbay/iso) "drf" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -71729,7 +72069,8 @@ /area/eris/maintenance/section4deck2starboard) "drj" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/holoposter{ pixel_x = 32 @@ -72496,7 +72837,8 @@ /area/eris/medical/medbay/iso) "dtb" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/green{ d1 = 1; @@ -73211,7 +73553,8 @@ icon_state = "0-8" }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/plating, /area/eris/engineering/engine_room) @@ -73392,7 +73735,9 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "dvb" = ( @@ -73475,7 +73820,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) @@ -73522,7 +73868,8 @@ /area/eris/command/bridge) "dvy" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/firealarm{ dir = 8; @@ -73543,7 +73890,9 @@ /area/eris/hallway/main/section2) "dvA" = ( /obj/machinery/power/nt_obelisk, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "dvB" = ( @@ -73885,7 +74234,8 @@ /area/eris/maintenance/section3deck2port) "dwq" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/sign/department/eva{ pixel_x = -32 @@ -74266,7 +74616,8 @@ /area/eris/maintenance/section2deck3port) "dxo" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/genetics) @@ -74744,7 +75095,8 @@ "dyE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -74988,7 +75340,8 @@ /obj/spawner/medical, /obj/spawner/medical, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/spawner/medical, /obj/spawner/medical, @@ -76238,7 +76591,8 @@ /area/eris/medical/patients_rooms) "dBV" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -76284,7 +76638,9 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/medical/reception) "dCc" = ( @@ -76337,7 +76693,8 @@ "dCh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/reception) @@ -76353,7 +76710,8 @@ "dCk" = ( /obj/structure/medical_stand, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/patients_rooms) @@ -76522,7 +76880,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) @@ -76555,7 +76914,8 @@ pixel_y = 28 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/hologram/holopad, /turf/simulated/floor/wood, @@ -76599,7 +76959,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/medical/medbreak) @@ -76768,7 +77129,8 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) @@ -76951,7 +77313,8 @@ /area/eris/engineering/starboardhallway) "dDL" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/extinguisher_cabinet{ pixel_x = 27; @@ -77063,7 +77426,8 @@ /area/eris/medical/reception) "dDX" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -77233,7 +77597,8 @@ /area/eris/medical/genetics) "dEq" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/table/standard, /obj/item/storage/box/gloves{ @@ -77286,7 +77651,8 @@ /area/eris/engineering/foyer) "dEv" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/table/standard, /turf/simulated/floor/tiled/white, @@ -77298,7 +77664,8 @@ pixel_y = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/genetics) @@ -77453,7 +77820,9 @@ /turf/simulated/floor/tiled/white, /area/eris/medical/genetics) "dEP" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/command/mbo) "dEQ" = ( @@ -78383,7 +78752,8 @@ "dHn" = ( /obj/structure/table/rack, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/office) @@ -78410,7 +78780,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) "dHs" = ( @@ -79342,12 +79714,15 @@ /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/breakroom) "dJj" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) "dJk" = ( @@ -79370,7 +79745,8 @@ sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Engine Waste") }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/command/exultant) @@ -79569,7 +79945,9 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/hallway/side/section3port) "dJM" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/steel, /area/eris/engineering/foyer) @@ -79618,7 +79996,9 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/docking) "dJT" = ( @@ -80012,7 +80392,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/cable/yellow{ d1 = 4; d2 = 8; @@ -80349,7 +80731,8 @@ /area/eris/engineering/gravity_generator) "dMf" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 4 @@ -80495,7 +80878,8 @@ /area/eris/engineering/engine_room) "dMD" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/plating, /area/eris/engineering/engine_room) @@ -80608,7 +80992,8 @@ /area/eris/engineering/propulsion/right) "dMT" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 @@ -82294,7 +82679,8 @@ "dRH" = ( /obj/structure/catwalk, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/open, /area/eris/engineering/engeva) @@ -83119,7 +83505,9 @@ /obj/item/computer_hardware/hard_drive/portable/design/misc, /obj/item/computer_hardware/hard_drive/portable/design/devices, /obj/item/computer_hardware/hard_drive/portable/design/tools, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/storage/primary) "dTP" = ( @@ -83901,7 +84289,8 @@ "dVU" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cable/green{ d1 = 1; @@ -83918,7 +84307,8 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/docking) @@ -84152,7 +84542,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) "dWr" = ( @@ -84362,7 +84754,8 @@ /area/eris/command/meeting_room) "dWO" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -84392,7 +84785,8 @@ /area/eris/command/meeting_room) "dWT" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -84530,7 +84924,8 @@ "dXk" = ( /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/department/dock{ pixel_x = 32 @@ -84625,7 +85020,8 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 10 @@ -84846,7 +85242,8 @@ /area/eris/crew_quarters/sleep/cryo) "dYa" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) @@ -85173,7 +85570,8 @@ /area/eris/hallway/side/section3starboard) "dZc" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/table/rack, /turf/simulated/floor/tiled/steel/brown_platform, @@ -85664,7 +86062,9 @@ /area/eris/rnd/docking) "eao" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/camera/network/third_section{ dir = 4 }, @@ -86008,7 +86408,8 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) @@ -86113,7 +86514,8 @@ /area/eris/rnd/anomalisolone) "ebv" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/power/apc{ dir = 8; @@ -86143,7 +86545,8 @@ /area/eris/rnd/anomalisoltwo) "eby" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/power/apc{ dir = 8; @@ -86169,7 +86572,8 @@ /area/eris/rnd/misc_lab) "ebC" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/table/reinforced, /obj/item/reagent_containers/glass/bucket, @@ -87904,7 +88308,9 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10 }, @@ -90538,7 +90944,9 @@ /area/eris/rnd/xenobiology/xenoflora) "emf" = ( /obj/machinery/seed_storage/xenobotany, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology/xenoflora) "emg" = ( @@ -91246,7 +91654,9 @@ /turf/simulated/floor/plating, /area/eris/hallway/side/section3deck2port) "enY" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/danger, /area/eris/security/range) "enZ" = ( @@ -91678,7 +92088,8 @@ /area/eris/quartermaster/misc) "epg" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) @@ -93054,7 +93465,8 @@ "esm" = ( /obj/structure/multiz/stairs/enter/bottom, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93204,7 +93616,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93382,7 +93795,8 @@ "etd" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel/danger, /area/eris/quartermaster/storage) @@ -93456,7 +93870,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/open, /area/eris/quartermaster/storage) "etm" = ( @@ -93477,7 +93893,8 @@ "etp" = ( /obj/structure/multiz/stairs/enter, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93486,7 +93903,9 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "etr" = ( @@ -93501,7 +93920,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -93528,7 +93948,9 @@ /turf/simulated/floor/tiled/steel, /area/eris/engineering/breakroom) "etu" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) "etv" = ( @@ -93546,13 +93968,17 @@ /area/eris/crew_quarters/kitchen) "ety" = ( /obj/structure/bed/chair, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3starboard) "etz" = ( /obj/structure/closet/emcloset, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3starboard) "etA" = ( @@ -93614,7 +94040,8 @@ "etE" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/pubeva) @@ -93640,7 +94067,8 @@ req_one_access = list(13,48) }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/panels, /area/eris/quartermaster/miningdock) @@ -93654,7 +94082,9 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/quartermaster/miningdock) "etJ" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3deck2port) "etK" = ( @@ -93683,7 +94113,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) "etN" = ( @@ -93706,7 +94138,8 @@ /area/eris/maintenance/section3deck1central) "etP" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) @@ -93729,7 +94162,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) "etS" = ( @@ -93777,7 +94212,8 @@ "etY" = ( /obj/structure/table/standard, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/spawner/junkfood/low_chance, /turf/simulated/floor/tiled/steel/gray_perforated, @@ -93837,7 +94273,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) @@ -93881,7 +94318,8 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) @@ -93896,7 +94334,8 @@ "eum" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) @@ -93936,7 +94375,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/hallway/side/section3deck2port) @@ -93987,7 +94427,8 @@ /area/eris/hallway/main/section3) "euy" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) @@ -94002,7 +94443,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) "euA" = ( @@ -94147,7 +94590,8 @@ /area/eris/quartermaster/storage) "euT" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -94173,7 +94617,8 @@ /area/eris/medical/chemistry) "euX" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/item/device/radio/intercom{ dir = 8; @@ -94576,7 +95021,9 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/alarm{ pixel_y = 26 }, @@ -94636,7 +95083,9 @@ /turf/simulated/floor/tiled/steel/brown_perforated, /area/eris/maintenance/section3deck3starboard) "ewb" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "ewc" = ( @@ -94670,7 +95119,8 @@ "ewe" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -94722,7 +95172,8 @@ dir = 1 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -95028,7 +95479,8 @@ "ewY" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/firealarm{ pixel_y = 28 @@ -95273,7 +95725,9 @@ /area/eris/hallway/side/section3deck2port) "exA" = ( /obj/structure/cyberplant, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -95441,7 +95895,9 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -96477,7 +96933,9 @@ /area/eris/maintenance/section3deck1central) "eAm" = ( /obj/structure/table/standard, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/item/modular_computer/laptop/preset/atmos, /turf/simulated/floor/tiled/white, /area/eris/rnd/anomal) @@ -96488,7 +96946,9 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/maintenance/section3deck1central) "eAo" = ( @@ -96872,7 +97332,9 @@ /turf/simulated/open, /area/eris/engineering/engine_room) "eBc" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/railing{ dir = 8 }, @@ -97639,7 +98101,9 @@ /area/eris/neotheology/churchcorridor) "eCI" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) "eCK" = ( @@ -98385,7 +98849,8 @@ pixel_y = 26 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/button/remote/blast_door{ id = "EngineeringTotalLockdown"; @@ -99050,7 +99515,9 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6 }, @@ -99104,7 +99571,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/kitchen) @@ -99523,7 +99991,9 @@ /area/eris/hallway/side/section3deck2port) "fbK" = ( /obj/structure/lattice, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/open, /area/eris/rnd/lab) "fdQ" = ( @@ -99598,7 +100068,9 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "flg" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/item/contraband/poster/placed{ icon_state = "poster6"; pixel_x = 0; @@ -99723,7 +100195,8 @@ /area/eris/maintenance/section2deck3port) "fyY" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/churchbooth) @@ -100049,7 +100522,9 @@ /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) "gkh" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/alarm{ pixel_y = 26 }, @@ -100175,7 +100650,8 @@ /area/eris/command/meo) "gxX" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -100369,7 +100845,8 @@ dir = 4 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) @@ -100892,7 +101369,8 @@ /area/eris/crew_quarters/hydroponics) "hRs" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/structure/cable{ d1 = 1; @@ -101418,7 +101896,8 @@ /area/eris/crew_quarters/clubmanager) "iXt" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/fitness) @@ -101816,7 +102295,8 @@ pixel_y = 32 }, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/bioprinter) @@ -101934,7 +102414,9 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/altar) "jZP" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -102167,7 +102649,9 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3port) "ksR" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 }, @@ -102777,7 +103261,8 @@ /area/eris/medical/medbay/organs) "lXg" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/table/standard, /obj/item/tool/multitool, @@ -102791,7 +103276,8 @@ /area/eris/crew_quarters/hydroponics/garden) "lZF" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -102986,7 +103472,9 @@ /obj/item/tool/hammer/dumbbell{ pixel_y = -6 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/crew_quarters/fitness) "myt" = ( @@ -103056,7 +103544,9 @@ pixel_y = 24 }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "mCf" = ( @@ -103073,7 +103563,9 @@ "mCh" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) "mCG" = ( @@ -103108,7 +103600,8 @@ /obj/structure/closet/secure_closet/reinforced/chaplain, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/office) @@ -103216,7 +103709,9 @@ /turf/simulated/floor/dirt, /area/eris/neotheology/chapelritualroom) "nha" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -103520,7 +104015,8 @@ /obj/item/reagent_containers/food/drinks/mug/new_nt, /obj/structure/table/woodentable, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/storage) @@ -103877,7 +104373,8 @@ "oOF" = ( /obj/machinery/neotheology/cruciformforge, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -104086,7 +104583,8 @@ /area/holodeck/alphadeck) "phq" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/churchbooth) @@ -104406,7 +104904,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/engine_room) @@ -104676,7 +105175,8 @@ "qyl" = ( /obj/structure/table/rack/shelf, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /obj/spawner/tool/advanced/low_chance, /turf/simulated/floor/tiled/steel/gray_platform, @@ -105067,7 +105567,9 @@ /area/eris/neotheology/altar) "rDp" = ( /obj/structure/table/rack, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) "rDZ" = ( @@ -105115,7 +105617,8 @@ /area/eris/hallway/side/section3starboard) "rJe" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/item/stool/padded, /turf/simulated/floor/tiled/white, @@ -105280,7 +105783,8 @@ /area/eris/medical/medbay/organs) "saN" = ( /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/altar) @@ -105488,7 +105992,9 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/bioprinter) "sug" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) "suD" = ( @@ -105544,7 +106050,8 @@ /area/eris/neotheology/office) "szo" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/sign/faction/astersguild{ pixel_x = 32 @@ -105681,7 +106188,9 @@ }, /area/eris/hallway/main/section2) "sNS" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/machinery/power/nt_obelisk, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) @@ -106083,7 +106592,9 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/long_range_scanner) "tEu" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -106159,7 +106670,8 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -106211,7 +106723,8 @@ /area/eris/neotheology/chapelritualroom) "tSV" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/machinery/power/nt_obelisk, /turf/simulated/floor/tiled/white/golden, @@ -106240,7 +106753,8 @@ /obj/structure/table/standard, /obj/item/paper/detective_guide, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/exerooms) @@ -106575,7 +107089,8 @@ }, /obj/machinery/disposal, /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -106590,7 +107105,8 @@ dir = 6 }, /obj/machinery/light{ - dir = 4 + dir = 4; + pixel_x = -10 }, /turf/simulated/floor/plating/under, /area/eris/engineering/atmos) @@ -106974,7 +107490,9 @@ /obj/item/storage/box/lights/bulbs, /obj/item/storage/box/lights/bulbs, /obj/item/storage/box/lights/bulbs, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/hangarsupply) "vyY" = ( @@ -107068,7 +107586,9 @@ /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "vHq" = ( -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/funeral) "vIJ" = ( @@ -107323,7 +107843,8 @@ /area/eris/neotheology/bioprinter) "wlN" = ( /obj/machinery/light{ - dir = 8 + dir = 8; + pixel_x = 10 }, /obj/structure/cyberplant, /turf/simulated/floor/tiled/steel/bar_dance, @@ -107367,7 +107888,9 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /turf/simulated/floor/wood, /area/eris/neotheology/churchbarracks) "wpU" = ( @@ -107467,7 +107990,9 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light, +/obj/machinery/light{ + pixel_y = 20 + }, /obj/landmark/storyevent/midgame_stash_spawn{ navigation = "Section 2, floor 1. Medbay toilet." }, @@ -107876,6 +108401,13 @@ /obj/machinery/door/holy/preacher, /turf/simulated/floor/tiled/white/cargo, /area/eris/neotheology/office) +"xCT" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 + }, +/turf/simulated/floor/tiled/white/golden, +/area/eris/neotheology/bioprinter) "xDB" = ( /obj/machinery/atmospherics/pipe/zpipe/up, /obj/structure/disposalpipe/up, @@ -165309,7 +165841,7 @@ evn jKn hQD hQD -pZe +xCT uCj ulE uYj From 8c64b61eaeb06b4e4337c94022588ee1e8be5c0d Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 20 Aug 2024 12:02:45 +0300 Subject: [PATCH 166/171] last mods --- maps/CEVEris/_CEV_Eris.dmm | 30 +++++++++--------------------- maps/CEVEris/centcomm.dmm | 4 ++-- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index a839512547..0ab29b3275 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -99964,11 +99964,9 @@ /area/eris/quartermaster/hangarsupply) "faY" = ( /obj/structure/table/standard, -/obj/machinery/button/remote/blast_door{ +/obj/machinery/button/remote/blast_door/table{ id = "neotheology_shop"; - name = "NeoTheology Shop Access"; - pixel_x = 4; - pixel_y = -4 + name = "NeoTheology Shop Access" }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/churchbooth) @@ -101433,15 +101431,12 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section3deck5port) "hYq" = ( -/obj/machinery/button/remote/airlock{ - desc = "A remote control switch."; - id = s; - name = s; - pixel_x = 4; - pixel_y = -4 +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 28 }, -/turf/simulated/floor/tiled/white/brown_perforated, -/area/eris/medical/reception) +/turf/simulated/floor/tiled/white/golden, +/area/eris/neotheology/bioprinter) "iaf" = ( /obj/structure/multiz/stairs/enter{ dir = 1 @@ -108401,13 +108396,6 @@ /obj/machinery/door/holy/preacher, /turf/simulated/floor/tiled/white/cargo, /area/eris/neotheology/office) -"xCT" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 28 - }, -/turf/simulated/floor/tiled/white/golden, -/area/eris/neotheology/bioprinter) "xDB" = ( /obj/machinery/atmospherics/pipe/zpipe/up, /obj/structure/disposalpipe/up, @@ -165841,7 +165829,7 @@ evn jKn hQD hQD -xCT +hYq uCj ulE uYj @@ -208437,7 +208425,7 @@ kUI coS coM dzF -hYq +coM coM dno cqJ diff --git a/maps/CEVEris/centcomm.dmm b/maps/CEVEris/centcomm.dmm index ec30467364..3a37bd3cc0 100644 --- a/maps/CEVEris/centcomm.dmm +++ b/maps/CEVEris/centcomm.dmm @@ -1843,12 +1843,12 @@ }, /area/centcom/merc_base) "iH" = ( -/obj/machinery/button/remote/blast_door{ +/obj/structure/table/reinforced, +/obj/machinery/button/remote/blast_door/id_card/table{ id = "syndieshutters"; name = "remote shutter control"; req_access = list(150) }, -/obj/structure/table/reinforced, /turf/simulated/shuttle/floor{ icon_state = "floor6" }, From 6fdcdcade46dd85c77ce73f7910dfd1161698b1a Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Tue, 20 Aug 2024 12:47:26 +0300 Subject: [PATCH 167/171] a --- code/game/machinery/camera/camera.dm | 10 - code/game/machinery/door_control.dm | 4 +- code/game/machinery/igniter.dm | 1 + code/modules/power/lighting.dm | 9 - icons/obj/machines/buttons.dmi | Bin 9131 -> 9464 bytes maps/CEVEris/_CEV_Eris.dmm | 1324 ++++++++------------------ 6 files changed, 403 insertions(+), 945 deletions(-) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 8700162725..709c4e05aa 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -65,16 +65,6 @@ var/area/A = get_area(src) c_tag = A.get_camera_tag(src) -/obj/machinery/camera/Initialize(mapload, d) - . = ..() - switch(dir) - if(SOUTH) - pixel_y = 20 - if(EAST) - pixel_x = -10 - if(WEST) - pixel_x = 10 - /obj/machinery/camera/Destroy() deactivate(null, 0) //kick anyone viewing out taped = 0 diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 5e8bc7c6c8..0560a094d1 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -138,6 +138,7 @@ /obj/machinery/button/remote/blast_door/table atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED hitbox = /datum/hitboxDatum/atom/button/table + icon_state = "doorctrl0_table" /obj/machinery/button/remote/blast_door/Initialize() . = ..() @@ -240,7 +241,8 @@ /obj/machinery/button/remote/blast_door/id_card/table atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED - hitbox = /datum/hitboxDatum/atom/button/table + hitbox = + icon_state = "doorid0_table" /obj/machinery/button/remote/blast_door/id_card/attackby(obj/item/W, mob/user as mob) if(istype(W, /obj/item/card/id)) diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index ef58e6161a..2fd98e5021 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -175,3 +175,4 @@ /obj/machinery/button/ignition/table atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED hitbox = /datum/hitboxDatum/atom/button/table + icon_state = "launcher_table" diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 13d2d2a6d6..3d95469296 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -248,15 +248,6 @@ if(location.area_light_color) brightness_color = location.area_light_color - if(type == /obj/machinery/light) - switch(dir) - if(SOUTH) - pixel_y = 20 - if(EAST) - pixel_x = -10 - if(WEST) - pixel_x = 10 - update(0) /obj/machinery/light/Destroy() diff --git a/icons/obj/machines/buttons.dmi b/icons/obj/machines/buttons.dmi index 2f78222ff61cb7eb2eef129c9b454a95d3cebebe..c5c88b3a4b908457b0fe4a46afc21640fc61cb3c 100644 GIT binary patch literal 9464 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 diff --git a/maps/CEVEris/_CEV_Eris.dmm b/maps/CEVEris/_CEV_Eris.dmm index 0ab29b3275..81331ebe1f 100644 --- a/maps/CEVEris/_CEV_Eris.dmm +++ b/maps/CEVEris/_CEV_Eris.dmm @@ -138,8 +138,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/range) @@ -303,8 +302,7 @@ /area/eris/security/range) "aaW" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -332,9 +330,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/armory) "aba" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/closet, /obj/item/clothing/under/netrunner, /obj/item/clothing/under/netrunner, @@ -569,8 +565,7 @@ "abE" = ( /obj/machinery/deployable/barrier, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/cargo, /area/eris/security/armory) @@ -638,8 +633,7 @@ /area/eris/crew_quarters/toilet/medbay) "abO" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/security/range) @@ -894,8 +888,7 @@ /area/eris/security/armory) "acp" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/security/armory) @@ -1034,8 +1027,7 @@ /area/eris/security/armory) "acF" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -1675,8 +1667,7 @@ /area/eris/security/disposal) "aee" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/security/prison) @@ -1737,8 +1728,7 @@ dir = 6 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/firealarm{ dir = 4; @@ -1855,8 +1845,7 @@ /obj/structure/table/rack, /obj/spawner/lowkeyrandom, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/office) @@ -1888,8 +1877,7 @@ /area/eris/security/armory) "aeF" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/fireaxecabinet{ pixel_y = -24; @@ -2766,8 +2754,7 @@ /area/eris/maintenance/section1deck5central) "agJ" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/cable/green{ d1 = 1; @@ -3494,8 +3481,7 @@ pixel_x = -30 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -3550,8 +3536,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/carpet, /area/eris/crew_quarters/sleep) @@ -3581,8 +3566,7 @@ "aiF" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -4220,9 +4204,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -4751,9 +4733,7 @@ /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/exerooms) "ali" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep) "alj" = ( @@ -5029,8 +5009,7 @@ "alR" = ( /obj/structure/closet/secure_closet/personal, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/carpet, @@ -5053,8 +5032,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/carpet, /area/eris/crew_quarters/sleep) @@ -6096,8 +6074,7 @@ /area/eris/maintenance/section2deck1starboard) "aot" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section2deck5port) @@ -6436,9 +6413,7 @@ /turf/simulated/wall/r_wall, /area/eris/maintenance/section3deck5starboard) "apo" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/disposaloutlet, /obj/structure/disposalpipe/trunk{ dir = 4 @@ -6630,8 +6605,7 @@ /area/eris/hallway/side/eschangarb) "apO" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/reinforced, /area/eris/rnd/podbay) @@ -6675,8 +6649,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) @@ -6777,9 +6750,7 @@ /area/eris/rnd/podbay) "aqd" = ( /obj/machinery/recharge_station, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/toilet/medbay) "aqe" = ( @@ -6938,8 +6909,7 @@ /area/eris/maintenance/section3deck2starboard) "aqv" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/rnd/podbay) @@ -7327,9 +7297,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/toilet/medbay) "arj" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/reinforced, /area/eris/rnd/podbay) "ark" = ( @@ -7559,9 +7527,7 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/landmark/storyevent/midgame_stash_spawn{ navigation = "Section 2, floor 1. Medbay toilet." }, @@ -7804,8 +7770,7 @@ /area/eris/maintenance/section2deck5starboard) "ash" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/vending/printomat{ dir = 4 @@ -7934,8 +7899,7 @@ pixel_y = -22 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/toilet/medbay) @@ -7991,8 +7955,7 @@ tag_door = "escape_pod_1_berth_hatch" }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangarb) @@ -8568,9 +8531,7 @@ /area/shuttle/escape_pod1/station) "aue" = ( /obj/structure/bed/chair/shuttle, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -9086,8 +9047,7 @@ /area/eris/quartermaster/disposaldrop) "avA" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, /turf/simulated/floor/tiled/steel, @@ -10092,9 +10052,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) "ayu" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "ayv" = ( @@ -10155,8 +10113,7 @@ /area/eris/crew_quarters/library) "ayB" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -10297,8 +10254,7 @@ /area/eris/maintenance/junk) "ayU" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) @@ -10617,9 +10573,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) "azJ" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/button/remote/blast_door{ id = "Armoury"; name = "Armoury Access"; @@ -10640,9 +10594,7 @@ "azM" = ( /obj/structure/table/reinforced, /obj/machinery/recharger, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -11198,9 +11150,7 @@ /area/eris/security/main) "aBa" = ( /obj/structure/reagent_dispensers/fueltank, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/rnd/chargebay) "aBb" = ( @@ -11277,9 +11227,7 @@ name = "Security Requests Console"; pixel_y = 30 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBk" = ( @@ -11305,9 +11253,7 @@ /obj/structure/noticeboard{ pixel_y = 28 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/security/main) "aBn" = ( @@ -11382,9 +11328,7 @@ /obj/machinery/door/blast/shutters/glass{ id = "Sky_Driver" }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/prisoncells) "aBy" = ( @@ -11425,8 +11369,7 @@ /area/eris/maintenance/section3deck2starboard) "aBE" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/dispenser, /turf/simulated/floor/tiled/dark/gray_platform, @@ -11437,8 +11380,7 @@ /area/eris/maintenance/junk) "aBG" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics) @@ -12105,8 +12047,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/prison) @@ -12274,8 +12215,7 @@ "aDS" = ( /obj/structure/multiz/stairs/enter/bottom, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/lobby) @@ -12290,8 +12230,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/armory) @@ -12406,9 +12345,7 @@ /area/shuttle/escape_pod2/station) "aEj" = ( /obj/structure/bed/chair/shuttle, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor{ icon_state = "cargofloor1" }, @@ -12519,8 +12456,7 @@ name = "Junk Beacon Airlock Pump" }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor_grid, /area/eris/maintenance/junk) @@ -12869,9 +12805,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/chargebay) "aFv" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/maintenance/junk) "aFw" = ( @@ -13327,8 +13261,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13380,8 +13313,7 @@ /area/eris/engineering/atmos) "aGT" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -13581,8 +13513,7 @@ "aHx" = ( /obj/machinery/atmospherics/pipe/simple/visible/yellow, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -14232,8 +14163,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/engineering/atmos) @@ -15556,8 +15486,7 @@ /area/eris/rnd/server) "aMR" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -15568,8 +15497,7 @@ /area/eris/rnd/server) "aMS" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -16235,8 +16163,7 @@ /area/eris/engineering/atmos) "aOB" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/hull, /area/eris/maintenance/junk) @@ -16390,8 +16317,7 @@ /area/eris/maintenance/section3deck4central) "aOV" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/table/standard{ name = "plastic table frame" @@ -16401,8 +16327,7 @@ /area/eris/rnd/chargebay) "aOW" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/hull, /area/eris/maintenance/junk) @@ -16458,8 +16383,7 @@ /obj/structure/table/reinforced, /obj/item/electronics/ai_module/corp, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) @@ -16487,9 +16411,7 @@ /turf/simulated/wall, /area/eris/maintenance/section1deck4central) "aPj" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) "aPk" = ( @@ -17602,9 +17524,7 @@ /area/eris/security/warden) "aRC" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/rnd/lab) "aRD" = ( @@ -17822,8 +17742,7 @@ /area/eris/security/main) "aSb" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/closet/secure_closet/personal/security, /turf/simulated/floor/tiled/dark/gray_platform, @@ -17866,8 +17785,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -17958,8 +17876,7 @@ "aSr" = ( /obj/machinery/vending/security, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -18056,9 +17973,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/rnd/lab) "aSC" = ( @@ -18581,8 +18496,7 @@ "aTN" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -18620,8 +18534,7 @@ /area/eris/security/main) "aTR" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -18657,8 +18570,7 @@ /area/eris/rnd/lab) "aTV" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/firealarm{ dir = 8; @@ -19328,8 +19240,7 @@ /obj/item/device/radio/off, /obj/item/tool/crowbar, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -19978,8 +19889,7 @@ "aWP" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/medical/virology) @@ -19996,8 +19906,7 @@ /obj/structure/table/standard, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/medical/virology) @@ -20153,8 +20062,7 @@ /obj/item/handcuffs, /obj/item/handcuffs, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/security/barracks) @@ -20263,9 +20171,7 @@ /turf/simulated/floor/tiled/dark, /area/eris/security/evidencestorage) "aXB" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/table/rack/shelf, /turf/simulated/floor/tiled/dark, /area/eris/security/evidencestorage) @@ -20402,8 +20308,7 @@ /area/eris/medical/virology) "aXQ" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -20842,8 +20747,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_evidstor"; @@ -21927,8 +21831,7 @@ /obj/structure/table/reinforced, /obj/item/electronics/ai_module/robocop, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/department/ai{ pixel_x = 32 @@ -23719,9 +23622,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4central) "beo" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/button/remote/blast_door{ id = "maint_hatch_medbay_rec"; name = "Maintenance Hatch Control"; @@ -24174,8 +24075,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/rnd/lab) @@ -24460,8 +24360,7 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -24547,8 +24446,7 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -24978,9 +24876,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck4starboard) "bhq" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, @@ -25549,8 +25445,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/command/courtroom) @@ -25692,8 +25587,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/department/robo{ pixel_x = 32 @@ -25706,8 +25600,7 @@ /obj/item/storage/fancy/vials, /obj/item/storage/fancy/vials, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/power/apc{ dir = 4; @@ -26280,8 +26173,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/button/remote/blast_door/table{ id = "xenobio2"; @@ -26356,8 +26248,7 @@ /area/eris/hallway/side/morguehallway) "bkr" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/cable/green{ d1 = 1; @@ -26845,9 +26736,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "blt" = ( @@ -27860,8 +27749,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -27889,8 +27777,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -28069,8 +27956,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -28109,8 +27995,7 @@ /area/eris/hallway/side/morguehallway) "bol" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/hallway/side/morguehallway) @@ -28128,8 +28013,7 @@ /area/eris/hallway/side/morguehallway) "boo" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/hallway/side/morguehallway) @@ -28264,9 +28148,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark, /area/eris/medical/morgue) "boD" = ( @@ -28563,8 +28445,7 @@ /area/eris/maintenance/section3deck1central) "bpo" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/biogenerator) @@ -29196,8 +29077,7 @@ /area/eris/maintenance/section1deck3central) "bra" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/toilet/medbay) @@ -29764,15 +29644,13 @@ /area/eris/maintenance/section4deck4port) "bsE" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) "bsF" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/crew_quarters/sleep/cryo) @@ -30166,8 +30044,7 @@ /area/eris/maintenance/section3deck1central) "btK" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) @@ -30650,8 +30527,7 @@ /area/eris/engineering/atmoscontrol) "buX" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -30788,8 +30664,7 @@ /obj/item/tank/oxygen, /obj/item/clothing/mask/gas, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/command/teleporter) @@ -31171,8 +31046,7 @@ /area/eris/security/lobby) "bwk" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/security/lobby) @@ -31188,9 +31062,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section1) "bwo" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/sign/faction/ironhammer{ pixel_y = 32 }, @@ -31205,9 +31077,7 @@ /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/security/prisoncells) "bwq" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -31736,8 +31606,7 @@ /area/eris/crew_quarters/clothingstorage) "bxt" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/landmark/storyevent/hidden_vent_antag, /turf/simulated/floor/tiled/steel, @@ -31828,8 +31697,7 @@ /area/eris/engineering/atmoscontrol) "bxF" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/holoposter{ pixel_y = -32 @@ -31853,8 +31721,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 @@ -32010,9 +31877,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) "bxX" = ( @@ -32081,8 +31946,7 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -32135,8 +31999,7 @@ /area/eris/medical/surgery) "bym" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/department/sci{ pixel_x = 32 @@ -32211,8 +32074,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section2) @@ -32379,9 +32241,7 @@ /turf/simulated/floor/tiled/steel/danger, /area/eris/engineering/drone_fabrication) "byT" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/drone_fabrication) "byU" = ( @@ -32525,8 +32385,7 @@ /area/eris/hallway/main/section4) "bzm" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/power/apc{ dir = 4; @@ -32626,8 +32485,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/cyan, /turf/simulated/floor/tiled/steel, @@ -32695,8 +32553,7 @@ /area/eris/hallway/main/section4) "bzE" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/eschangara) @@ -33079,9 +32936,7 @@ /obj/machinery/ai_status_display{ pixel_y = 32 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -34383,8 +34238,7 @@ /area/eris/rnd/docking) "bDW" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) @@ -34605,8 +34459,7 @@ /area/turret_protected/ai) "bEv" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/anomal) @@ -34652,8 +34505,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) @@ -34692,9 +34544,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology) "bEH" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/sign/biohazard{ icon_state = "bio-danger"; pixel_y = 32 @@ -34814,8 +34664,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/button/remote/blast_door/table{ id = "xenobio1"; @@ -34996,9 +34845,7 @@ /turf/simulated/wall/r_wall, /area/eris/engineering/telecommonitor) "bFn" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/telecomms/server/presets/supply, /turf/simulated/floor/bluegrid{ name = "Server Base"; @@ -35264,8 +35111,7 @@ /area/eris/command/tcommsat/chamber) "bFQ" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/telecomms/bus/preset_four, /turf/simulated/floor/bluegrid{ @@ -35657,9 +35503,7 @@ /area/eris/hallway/side/atmosphericshallway) "bGG" = ( /obj/machinery/disposal, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/disposalpipe/trunk, /obj/structure/cable{ d1 = 4; @@ -35811,9 +35655,7 @@ "bGY" = ( /obj/machinery/portable_atmospherics/hydroponics, /obj/machinery/atmospherics/portables_connector, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology/xenoflora) "bGZ" = ( @@ -35835,9 +35677,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/rnd/xenobiology/xenoflora) "bHd" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) "bHe" = ( @@ -36402,8 +36242,7 @@ /area/eris/maintenance/section4deck4port) "bIl" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) @@ -37228,9 +37067,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section1deck3central) "bJS" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/spawner/material/building, /turf/simulated/floor/plating, /area/eris/engineering/construction) @@ -37418,8 +37255,7 @@ /area/eris/engineering/construction) "bKq" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/cyan{ d1 = 1; @@ -37991,9 +37827,7 @@ "bLx" = ( /obj/structure/table/standard, /obj/machinery/recharger, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/holoposter{ pixel_y = 32 }, @@ -38229,9 +38063,7 @@ /obj/machinery/computer/cryopod/robot{ pixel_y = 30 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/drone_fabrication) "bMd" = ( @@ -38618,9 +38450,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/lobby) "bMS" = ( @@ -40086,9 +39916,7 @@ "bQg" = ( /obj/structure/flora/ausbushes/ywflowers, /obj/structure/reagent_dispensers/watertank/huge, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/extinguisher_cabinet{ pixel_y = 27; dir = 2 @@ -40721,8 +40549,7 @@ "bRT" = ( /obj/structure/closet/wardrobe/color/grey, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/clothingstorage) @@ -41068,9 +40895,7 @@ /turf/simulated/floor/wood, /area/eris/command/courtroom) "bSU" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/wood, /area/eris/command/courtroom) "bSV" = ( @@ -41519,8 +41344,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -41889,8 +41713,7 @@ /obj/structure/table/standard, /obj/item/paper_bin, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -41937,8 +41760,7 @@ /obj/item/stack/material/steel/random, /obj/item/stack/material/plastic/random, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/crew_quarters/janitor) @@ -41963,8 +41785,7 @@ "bVd" = ( /obj/structure/janitorialcart, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/crew_quarters/janitor) @@ -42001,8 +41822,7 @@ /area/eris/security/lobby) "bVh" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) @@ -42133,8 +41953,7 @@ /area/eris/security/lobby) "bVA" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/tiled/steel/bluecorner, @@ -42189,8 +42008,7 @@ }, /obj/structure/flora/ausbushes/lavendergrass, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) @@ -42256,8 +42074,7 @@ /area/eris/hallway/main/section1) "bVP" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/computer/rdservercontrol{ dir = 4 @@ -42449,9 +42266,7 @@ /area/eris/rnd/server) "bWs" = ( /obj/structure/closet, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/surgery) "bWt" = ( @@ -42706,9 +42521,7 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/security/inspectors_office) "bWV" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/omni/filter{ tag_east = 1; tag_south = 5; @@ -42725,8 +42538,7 @@ /area/eris/rnd/mixing) "bWX" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/alarm{ dir = 4; @@ -42832,8 +42644,7 @@ /area/eris/security/inspectors_office) "bXn" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) @@ -43160,9 +42971,7 @@ /obj/structure/table/standard, /obj/item/storage/box/gloves, /obj/item/reagent_containers/spray/cleaner, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -43396,9 +43205,7 @@ /turf/simulated/floor/plating/under, /area/eris/maintenance/section2deck3port) "bYM" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/bluegrid{ name = "Server Base"; nitrogen = 180; @@ -43638,9 +43445,7 @@ id = "AI"; pixel_y = 24 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 }, @@ -43695,9 +43500,7 @@ id = "AI"; pixel_y = 24 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/cable/cyan{ d1 = 4; d2 = 8; @@ -43796,8 +43599,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/techfloor_grid, /area/eris/rnd/mixing) @@ -43806,8 +43608,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -43838,8 +43639,7 @@ /area/eris/hallway/main/section2) "bZT" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -43852,8 +43652,7 @@ /area/turret_protected/ai) "bZV" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/cyan{ d1 = 1; @@ -43938,8 +43737,7 @@ id = "hangar_to_cargo" }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) @@ -44428,9 +44226,7 @@ /turf/simulated/floor/wood, /area/eris/command/fo) "cby" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -44456,8 +44252,7 @@ /area/eris/command/fo) "cbC" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/bluegrid, /area/turret_protected/ai) @@ -44525,8 +44320,7 @@ /area/turret_protected/ai) "cbJ" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/cyan{ d1 = 1; @@ -44555,8 +44349,7 @@ /area/eris/command/tcommsat/chamber) "cbM" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -44891,9 +44684,7 @@ /area/eris/rnd/mixing) "ccK" = ( /obj/machinery/hologram/holopad, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/turretid/stun{ check_synth = 1; name = "AI Chamber turret control"; @@ -45132,8 +44923,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/clothingstorage) @@ -45963,8 +45753,7 @@ "ceS" = ( /obj/machinery/disposal, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/disposalpipe/trunk, /turf/simulated/floor/bluegrid, @@ -46035,8 +45824,7 @@ id = "Bluespace_Biosyphon" }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/security/main) @@ -46178,9 +45966,7 @@ pixel_x = 3; pixel_y = -3 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/storage/tech) "cfs" = ( @@ -46808,8 +46594,7 @@ /obj/structure/table/standard, /obj/machinery/recharger, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/item/device/radio/intercom{ dir = 4; @@ -47555,8 +47340,7 @@ /area/eris/rnd/scient) "ciA" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/portable_atmospherics/powered/pump, /turf/simulated/floor/tiled/steel/gray_platform, @@ -48086,8 +47870,7 @@ /area/eris/rnd/mixing) "cjU" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -48096,8 +47879,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -48181,9 +47963,7 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 8 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "ckh" = ( @@ -48342,8 +48122,7 @@ /obj/machinery/recharger, /obj/structure/table/reinforced, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/rnd/mixing) @@ -48369,9 +48148,7 @@ /turf/simulated/open, /area/eris/quartermaster/storage) "ckF" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/camera/network/fourth_section{ dir = 4 }, @@ -48871,9 +48648,7 @@ /area/eris/crew_quarters/kitchen_storage) "clY" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/flora/ausbushes/ppflowers, /obj/structure/sign/faction/neotheology_cross/gold{ pixel_y = 25; @@ -48989,8 +48764,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 @@ -49575,8 +49349,7 @@ pixel_x = -2 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/medbay) @@ -49621,8 +49394,7 @@ /area/eris/rnd/mixing) "cnR" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sink{ dir = 4; @@ -49678,8 +49450,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/mixing) @@ -49688,9 +49459,7 @@ /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "coc" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/table/woodentable, /obj/item/storage/fancy/vials, /turf/simulated/floor/carpet, @@ -49733,8 +49502,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/gray_platform, /area/eris/medical/medbay) @@ -49969,9 +49737,7 @@ /area/eris/medical/reception) "coP" = ( /obj/machinery/photocopier, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -50258,8 +50024,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 @@ -50355,8 +50120,7 @@ /area/eris/medical/medbay) "cpK" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) @@ -50375,8 +50139,7 @@ /area/eris/crew_quarters/kitchen) "cpO" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/hallway/side/atmosphericshallway) @@ -50437,8 +50200,7 @@ "cpZ" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/hydroponics/garden) @@ -51073,9 +50835,7 @@ /area/eris/maintenance/section2deck3port) "crz" = ( /obj/machinery/vending/cola, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/sign/pods{ pixel_y = 32 }, @@ -51181,8 +50941,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 @@ -51398,8 +51157,7 @@ req_access = null }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/cryo) @@ -51635,8 +51393,7 @@ /area/eris/quartermaster/storage) "csX" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ @@ -51877,9 +51634,7 @@ /obj/structure/multiz/stairs/enter{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/lab) "ctP" = ( @@ -52012,8 +51767,7 @@ /area/eris/medical/medbay) "cuj" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/biogenerator) @@ -52023,8 +51777,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/hallway/side/bridgehallway) @@ -52223,8 +51976,7 @@ /area/eris/command/meo) "cuM" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/effect/floor_decal/industrial/warning{ dir = 1 @@ -52355,8 +52107,7 @@ }, /obj/item/bluespace_harpoon, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/carpet/purcarpet, /area/eris/command/meo) @@ -52498,8 +52249,7 @@ /area/eris/hallway/side/bridgehallway) "cvD" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/structure/cable/green{ @@ -52597,8 +52347,7 @@ pixel_x = -28 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/computer/message_monitor{ dir = 4 @@ -53298,8 +53047,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/flora/ausbushes/lavendergrass, /turf/simulated/floor/grass, @@ -53432,8 +53180,7 @@ /obj/spawner/lathe_disk, /obj/item/computer_hardware/hard_drive/portable/design/tools, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) @@ -53571,9 +53318,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -53628,9 +53373,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -53703,8 +53446,7 @@ /area/eris/rnd/research) "cyv" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/research) @@ -53718,8 +53460,7 @@ "cyy" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atm{ dir = 8; @@ -53815,8 +53556,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/engineering/engine_room) @@ -53998,8 +53738,7 @@ /area/eris/quartermaster/storage) "czn" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/floodlight, /turf/simulated/floor/tiled/steel/danger, @@ -55383,8 +55122,7 @@ "cCA" = ( /obj/structure/reagent_dispensers/cahorsbarrel, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/neotheology/storage) @@ -56265,9 +56003,7 @@ /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/command/exultant/quarters) "cEJ" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -56517,8 +56253,7 @@ /area/eris/maintenance/section3deck4starboard) "cFo" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/neotheology/office) @@ -56693,9 +56428,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -56844,8 +56577,7 @@ /area/eris/quartermaster/office) "cGa" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -57723,8 +57455,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/command/bridge) @@ -58121,9 +57852,7 @@ /turf/simulated/wall, /area/eris/maintenance/substation/section3) "cJx" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/autolathe/nanoforge, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -58185,8 +57914,7 @@ /area/eris/maintenance/section2deck2starboard) "cJE" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/sec4{ pixel_x = 32 @@ -58773,8 +58501,7 @@ /obj/item/cell/large/high, /obj/item/cell/large/high, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/hallway/side/section3starboard) @@ -58972,8 +58699,7 @@ /area/eris/maintenance/section4deck3port) "cLy" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) @@ -59361,9 +59087,7 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/bioreactor) "cMt" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/camera/network/third_section{ dir = 8 }, @@ -59557,8 +59281,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -60376,9 +60099,7 @@ }, /area/shuttle/mining/station) "cPF" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "3,21" }, @@ -60707,8 +60428,7 @@ "cQC" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "12,20" @@ -60839,8 +60559,7 @@ /obj/item/device/lighting/glowstick/flare, /obj/item/device/lighting/glowstick/flare, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/sec4{ pixel_x = 32 @@ -61626,8 +61345,7 @@ dir = 8 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "8,16" @@ -61932,8 +61650,7 @@ icon_state = "plant-01" }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -61955,8 +61672,7 @@ icon_state = "plant-21" }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -62078,9 +61794,7 @@ /area/shuttle/mining/station) "cUr" = ( /obj/structure/ore_box, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "13,14" }, @@ -62426,8 +62140,7 @@ "cVo" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "8,12" @@ -62594,8 +62307,7 @@ /obj/item/clothing/gloves/latex, /obj/item/hand_labeler, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/violetcorener, /area/eris/rnd/xenobiology) @@ -63351,9 +63063,7 @@ /area/shuttle/mining/station) "cXC" = ( /obj/structure/closet/secure_closet/personal/miner, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "4,9" }, @@ -64104,9 +63814,7 @@ }, /area/shuttle/mining/station) "cZf" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/shuttle/floor/mining{ icon_state = "10,7" }, @@ -64268,9 +63976,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/cable/green{ d1 = 4; d2 = 8; @@ -64522,8 +64228,7 @@ /area/eris/maintenance/substation/section3) "dac" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/open, /area/eris/crew_quarters/sleep/cryo) @@ -64533,15 +64238,13 @@ pixel_y = 28 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/medbay/iso) "dae" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/open, /area/eris/crew_quarters/sleep/cryo) @@ -64892,8 +64595,7 @@ /obj/item/reagent_containers/food/drinks/bottle/small/beer, /obj/item/reagent_containers/food/drinks/bottle/small/beer, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/shuttle/floor/mining{ icon_state = "7,3" @@ -64916,8 +64618,7 @@ /obj/item/paper_bin, /obj/item/pen, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/shuttle/floor/mining{ icon_state = "10,3" @@ -65981,9 +65682,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "ddE" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/item/device/radio/intercom{ pixel_y = 24 }, @@ -66182,8 +65881,7 @@ pixel_x = 25 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -66275,8 +65973,7 @@ icon_state = "pipe-j2" }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -66311,8 +66008,7 @@ icon_state = "pipe-c" }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -66352,8 +66048,7 @@ "deq" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/command/bridgebar) @@ -66858,8 +66553,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/command/captain) @@ -66915,8 +66609,7 @@ "dfD" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/item/device/radio/intercom{ dir = 8; @@ -66944,8 +66637,7 @@ pixel_x = 32 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -67374,9 +67066,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -67430,9 +67120,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/light_switch{ pixel_y = 28 }, @@ -67572,9 +67260,7 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) "dgZ" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -67605,9 +67291,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/light_switch{ pixel_y = 28 }, @@ -67910,8 +67594,7 @@ /obj/structure/bed/padded, /obj/item/bedsheet/rd, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/command/meo/quarters) @@ -67981,8 +67664,7 @@ /area/eris/command/meeting_room) "dhU" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -67993,8 +67675,7 @@ /obj/item/hand_labeler, /obj/item/packageWrap, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) @@ -68060,8 +67741,7 @@ /obj/structure/table/woodentable, /obj/item/storage/box/donut, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 9 @@ -68332,9 +68012,7 @@ "diK" = ( /obj/structure/closet, /obj/spawner/contraband/low_chance, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) "diL" = ( @@ -68367,8 +68045,7 @@ "diO" = ( /obj/structure/railing, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/open, /area/turret_protected/ai) @@ -68924,8 +68601,7 @@ /area/eris/security/checkpoint/science) "djZ" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -68964,8 +68640,7 @@ /area/eris/hallway/side/atmosphericshallway) "dkd" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -69220,8 +68895,7 @@ /area/eris/maintenance/substation/bridge) "dkJ" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/railing{ dir = 1 @@ -69743,9 +69417,7 @@ desc = "BIOHAZARD. Toxic biomatter in this area."; pixel_y = 32 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -69769,9 +69441,7 @@ /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/office) "dlR" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/open, /area/eris/command/tcommsat/chamber) "dlS" = ( @@ -70006,8 +69676,7 @@ /obj/structure/table/woodentable, /obj/item/clothing/glasses/hud/health, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/wood, /area/eris/command/mbo/quarters) @@ -70711,8 +70380,7 @@ icon_state = "1-2" }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -70962,8 +70630,7 @@ pixel_y = -5 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/security/checkpoint/supply) @@ -71320,8 +70987,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/hallway/side/section3starboard) @@ -71335,9 +71001,7 @@ /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/reception) "dpq" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, @@ -71434,8 +71098,7 @@ /area/eris/rnd/research) "dpE" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/techfloor, /area/eris/maintenance/junk) @@ -71786,8 +71449,7 @@ /area/eris/maintenance/section4deck2starboard) "dqs" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark/danger, /area/eris/engineering/gravity_generator) @@ -71838,8 +71500,7 @@ /area/eris/hallway/main/section2) "dqz" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/danger, /area/eris/engineering/gravity_generator) @@ -71876,8 +71537,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) @@ -72036,8 +71696,7 @@ /area/eris/medical/medbay/iso) "drf" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -72069,8 +71728,7 @@ /area/eris/maintenance/section4deck2starboard) "drj" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/holoposter{ pixel_x = 32 @@ -72837,8 +72495,7 @@ /area/eris/medical/medbay/iso) "dtb" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -73553,8 +73210,7 @@ icon_state = "0-8" }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/plating, /area/eris/engineering/engine_room) @@ -73735,9 +73391,7 @@ /obj/structure/multiz/stairs/enter/bottom{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) "dvb" = ( @@ -73820,8 +73474,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) @@ -73868,8 +73521,7 @@ /area/eris/command/bridge) "dvy" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/firealarm{ dir = 8; @@ -73890,9 +73542,7 @@ /area/eris/hallway/main/section2) "dvA" = ( /obj/machinery/power/nt_obelisk, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "dvB" = ( @@ -74234,8 +73884,7 @@ /area/eris/maintenance/section3deck2port) "dwq" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/sign/department/eva{ pixel_x = -32 @@ -74616,8 +74265,7 @@ /area/eris/maintenance/section2deck3port) "dxo" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/genetics) @@ -75095,8 +74743,7 @@ "dyE" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/command/meeting_room) @@ -75340,8 +74987,7 @@ /obj/spawner/medical, /obj/spawner/medical, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/spawner/medical, /obj/spawner/medical, @@ -76591,8 +76237,7 @@ /area/eris/medical/patients_rooms) "dBV" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 @@ -76638,9 +76283,7 @@ /obj/structure/bed/chair{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/medical/reception) "dCc" = ( @@ -76693,8 +76336,7 @@ "dCh" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/reception) @@ -76710,8 +76352,7 @@ "dCk" = ( /obj/structure/medical_stand, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/patients_rooms) @@ -76880,8 +76521,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/foyer) @@ -76914,8 +76554,7 @@ pixel_y = 28 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/hologram/holopad, /turf/simulated/floor/wood, @@ -76959,8 +76598,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/medical/medbreak) @@ -77129,8 +76767,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/orangecorner, /area/eris/engineering/starboardhallway) @@ -77313,8 +76950,7 @@ /area/eris/engineering/starboardhallway) "dDL" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/extinguisher_cabinet{ pixel_x = 27; @@ -77426,8 +77062,7 @@ /area/eris/medical/reception) "dDX" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/extinguisher_cabinet{ pixel_x = -27; @@ -77597,8 +77232,7 @@ /area/eris/medical/genetics) "dEq" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/table/standard, /obj/item/storage/box/gloves{ @@ -77651,8 +77285,7 @@ /area/eris/engineering/foyer) "dEv" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/table/standard, /turf/simulated/floor/tiled/white, @@ -77664,8 +77297,7 @@ pixel_y = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/medical/genetics) @@ -77820,9 +77452,7 @@ /turf/simulated/floor/tiled/white, /area/eris/medical/genetics) "dEP" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white/brown_perforated, /area/eris/command/mbo) "dEQ" = ( @@ -78752,8 +78382,7 @@ "dHn" = ( /obj/structure/table/rack, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/quartermaster/office) @@ -78780,9 +78409,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) "dHs" = ( @@ -79714,15 +79341,12 @@ /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/breakroom) "dJj" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) "dJk" = ( @@ -79745,8 +79369,7 @@ sensors = list("mair_in_meter"="Mixed Air In","air_sensor"="Mixed Air Supply Tank","mair_out_meter"="Mixed Air Out","dloop_atm_meter"="Distribution Loop","wloop_atm_meter"="Engine Waste") }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/brown_platform, /area/eris/command/exultant) @@ -79945,9 +79568,7 @@ /turf/simulated/floor/tiled/dark/golden, /area/eris/hallway/side/section3port) "dJM" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/door/firedoor, /turf/simulated/floor/tiled/steel, /area/eris/engineering/foyer) @@ -79996,9 +79617,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/docking) "dJT" = ( @@ -80392,9 +80011,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/cable/yellow{ d1 = 4; d2 = 8; @@ -80731,8 +80348,7 @@ /area/eris/engineering/gravity_generator) "dMf" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 4 @@ -80878,8 +80494,7 @@ /area/eris/engineering/engine_room) "dMD" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/plating, /area/eris/engineering/engine_room) @@ -80992,8 +80607,7 @@ /area/eris/engineering/propulsion/right) "dMT" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/visible/yellow{ dir = 8 @@ -82679,8 +82293,7 @@ "dRH" = ( /obj/structure/catwalk, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/open, /area/eris/engineering/engeva) @@ -83505,9 +83118,7 @@ /obj/item/computer_hardware/hard_drive/portable/design/misc, /obj/item/computer_hardware/hard_drive/portable/design/devices, /obj/item/computer_hardware/hard_drive/portable/design/tools, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/storage/primary) "dTP" = ( @@ -84289,8 +83900,7 @@ "dVU" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cable/green{ d1 = 1; @@ -84307,8 +83917,7 @@ pixel_x = -26 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/docking) @@ -84542,9 +84151,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology) "dWr" = ( @@ -84754,8 +84361,7 @@ /area/eris/command/meeting_room) "dWO" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -84785,8 +84391,7 @@ /area/eris/command/meeting_room) "dWT" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark, /area/eris/command/meeting_room) @@ -84924,8 +84529,7 @@ "dXk" = ( /obj/machinery/atmospherics/pipe/simple/hidden, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/department/dock{ pixel_x = 32 @@ -85020,8 +84624,7 @@ pixel_x = 28 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/black{ dir = 10 @@ -85242,8 +84845,7 @@ /area/eris/crew_quarters/sleep/cryo) "dYa" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) @@ -85570,8 +85172,7 @@ /area/eris/hallway/side/section3starboard) "dZc" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/table/rack, /turf/simulated/floor/tiled/steel/brown_platform, @@ -86062,9 +85663,7 @@ /area/eris/rnd/docking) "eao" = ( /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/camera/network/third_section{ dir = 4 }, @@ -86408,8 +86007,7 @@ }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white, /area/eris/rnd/research) @@ -86514,8 +86112,7 @@ /area/eris/rnd/anomalisolone) "ebv" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/power/apc{ dir = 8; @@ -86545,8 +86142,7 @@ /area/eris/rnd/anomalisoltwo) "eby" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/power/apc{ dir = 8; @@ -86572,8 +86168,7 @@ /area/eris/rnd/misc_lab) "ebC" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/table/reinforced, /obj/item/reagent_containers/glass/bucket, @@ -88308,9 +87903,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 10 }, @@ -90944,9 +90537,7 @@ /area/eris/rnd/xenobiology/xenoflora) "emf" = ( /obj/machinery/seed_storage/xenobotany, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white, /area/eris/rnd/xenobiology/xenoflora) "emg" = ( @@ -91654,9 +91245,7 @@ /turf/simulated/floor/plating, /area/eris/hallway/side/section3deck2port) "enY" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/danger, /area/eris/security/range) "enZ" = ( @@ -92088,8 +91677,7 @@ /area/eris/quartermaster/misc) "epg" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) @@ -93465,8 +93053,7 @@ "esm" = ( /obj/structure/multiz/stairs/enter/bottom, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93616,8 +93203,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93795,8 +93381,7 @@ "etd" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel/danger, /area/eris/quartermaster/storage) @@ -93870,9 +93455,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/open, /area/eris/quartermaster/storage) "etm" = ( @@ -93893,8 +93476,7 @@ "etp" = ( /obj/structure/multiz/stairs/enter, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -93903,9 +93485,7 @@ /obj/machinery/alarm{ pixel_y = 26 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "etr" = ( @@ -93920,8 +93500,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -93948,9 +93527,7 @@ /turf/simulated/floor/tiled/steel, /area/eris/engineering/breakroom) "etu" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) "etv" = ( @@ -93968,17 +93545,13 @@ /area/eris/crew_quarters/kitchen) "ety" = ( /obj/structure/bed/chair, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3starboard) "etz" = ( /obj/structure/closet/emcloset, /obj/machinery/atmospherics/unary/vent_pump/on, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3starboard) "etA" = ( @@ -94040,8 +93613,7 @@ "etE" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/crew_quarters/pubeva) @@ -94067,8 +93639,7 @@ req_one_access = list(13,48) }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/panels, /area/eris/quartermaster/miningdock) @@ -94082,9 +93653,7 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/quartermaster/miningdock) "etJ" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/hallway/side/section3deck2port) "etK" = ( @@ -94113,9 +93682,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) "etN" = ( @@ -94138,8 +93705,7 @@ /area/eris/maintenance/section3deck1central) "etP" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/misc) @@ -94162,9 +93728,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) "etS" = ( @@ -94212,8 +93776,7 @@ "etY" = ( /obj/structure/table/standard, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/spawner/junkfood/low_chance, /turf/simulated/floor/tiled/steel/gray_perforated, @@ -94273,8 +93836,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) @@ -94318,8 +93880,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/misc) @@ -94334,8 +93895,7 @@ "eum" = ( /obj/structure/disposalpipe/segment, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/quartermaster/office) @@ -94375,8 +93935,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/cargo, /area/eris/hallway/side/section3deck2port) @@ -94427,8 +93986,7 @@ /area/eris/hallway/main/section3) "euy" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3deck2port) @@ -94443,9 +94001,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/hallway/main/section3) "euA" = ( @@ -94590,8 +94146,7 @@ /area/eris/quartermaster/storage) "euT" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/storage) @@ -94617,8 +94172,7 @@ /area/eris/medical/chemistry) "euX" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/item/device/radio/intercom{ dir = 8; @@ -95021,9 +94575,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -95083,9 +94635,7 @@ /turf/simulated/floor/tiled/steel/brown_perforated, /area/eris/maintenance/section3deck3starboard) "ewb" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) "ewc" = ( @@ -95119,8 +94669,7 @@ "ewe" = ( /obj/machinery/atmospherics/unary/vent_pump/on, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -95172,8 +94721,7 @@ dir = 1 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -95479,8 +95027,7 @@ "ewY" = ( /obj/machinery/suit_storage_unit/standard_unit, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/firealarm{ pixel_y = 28 @@ -95725,9 +95272,7 @@ /area/eris/hallway/side/section3deck2port) "exA" = ( /obj/structure/cyberplant, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -95895,9 +95440,7 @@ d2 = 8; icon_state = "4-8" }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/firealarm{ pixel_y = 28 }, @@ -96933,9 +96476,7 @@ /area/eris/maintenance/section3deck1central) "eAm" = ( /obj/structure/table/standard, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/item/modular_computer/laptop/preset/atmos, /turf/simulated/floor/tiled/white, /area/eris/rnd/anomal) @@ -96946,9 +96487,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/bluecorner, /area/eris/maintenance/section3deck1central) "eAo" = ( @@ -97332,9 +96871,7 @@ /turf/simulated/open, /area/eris/engineering/engine_room) "eBc" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/railing{ dir = 8 }, @@ -98101,9 +97638,7 @@ /area/eris/neotheology/churchcorridor) "eCI" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) "eCK" = ( @@ -98849,8 +98384,7 @@ pixel_y = 26 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/button/remote/blast_door{ id = "EngineeringTotalLockdown"; @@ -99515,9 +99049,7 @@ /obj/machinery/firealarm{ pixel_y = 28 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/visible/yellow{ dir = 6 }, @@ -99571,8 +99103,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/wood, /area/eris/crew_quarters/kitchen) @@ -99989,9 +99520,7 @@ /area/eris/hallway/side/section3deck2port) "fbK" = ( /obj/structure/lattice, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/open, /area/eris/rnd/lab) "fdQ" = ( @@ -100066,9 +99595,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "flg" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/item/contraband/poster/placed{ icon_state = "poster6"; pixel_x = 0; @@ -100193,8 +99720,7 @@ /area/eris/maintenance/section2deck3port) "fyY" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/churchbooth) @@ -100520,9 +100046,7 @@ /turf/simulated/floor/grass, /area/eris/neotheology/chapelritualroom) "gkh" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/alarm{ pixel_y = 26 }, @@ -100648,8 +100172,7 @@ /area/eris/command/meo) "gxX" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 1 @@ -100843,8 +100366,7 @@ dir = 4 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/brown_platform, /area/eris/medical/chemistry) @@ -101367,8 +100889,7 @@ /area/eris/crew_quarters/hydroponics) "hRs" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/structure/cable{ d1 = 1; @@ -101891,8 +101412,7 @@ /area/eris/crew_quarters/clubmanager) "iXt" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/crew_quarters/fitness) @@ -102290,8 +101810,7 @@ pixel_y = 32 }, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/bioprinter) @@ -102409,9 +101928,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/altar) "jZP" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -102644,9 +102161,7 @@ /turf/simulated/floor/tiled/techmaint, /area/eris/maintenance/section3deck3port) "ksR" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/effect/floor_decal/industrial/warning/corner{ dir = 8 }, @@ -103256,8 +102771,7 @@ /area/eris/medical/medbay/organs) "lXg" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/table/standard, /obj/item/tool/multitool, @@ -103271,8 +102785,7 @@ /area/eris/crew_quarters/hydroponics/garden) "lZF" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 8 @@ -103467,9 +102980,7 @@ /obj/item/tool/hammer/dumbbell{ pixel_y = -6 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/gray_perforated, /area/eris/crew_quarters/fitness) "myt" = ( @@ -103539,9 +103050,7 @@ pixel_y = 24 }, /obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/quartermaster/hangarsupply) "mCf" = ( @@ -103558,9 +103067,7 @@ "mCh" = ( /obj/machinery/disposal, /obj/structure/disposalpipe/trunk, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/white/golden, /area/eris/crew_quarters/kitchen_storage) "mCG" = ( @@ -103595,8 +103102,7 @@ /obj/structure/closet/secure_closet/reinforced/chaplain, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/office) @@ -103704,9 +103210,7 @@ /turf/simulated/floor/dirt, /area/eris/neotheology/chapelritualroom) "nha" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, @@ -104010,8 +103514,7 @@ /obj/item/reagent_containers/food/drinks/mug/new_nt, /obj/structure/table/woodentable, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/carpet/bcarpet, /area/eris/neotheology/storage) @@ -104368,8 +103871,7 @@ "oOF" = ( /obj/machinery/neotheology/cruciformforge, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -104578,8 +104080,7 @@ /area/holodeck/alphadeck) "phq" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/churchbooth) @@ -104899,8 +104400,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel/techfloor, /area/eris/engineering/engine_room) @@ -105170,8 +104670,7 @@ "qyl" = ( /obj/structure/table/rack/shelf, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /obj/spawner/tool/advanced/low_chance, /turf/simulated/floor/tiled/steel/gray_platform, @@ -105562,9 +105061,7 @@ /area/eris/neotheology/altar) "rDp" = ( /obj/structure/table/rack, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel/techfloor_grid, /area/eris/engineering/breakroom) "rDZ" = ( @@ -105612,8 +105109,7 @@ /area/eris/hallway/side/section3starboard) "rJe" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/item/stool/padded, /turf/simulated/floor/tiled/white, @@ -105778,8 +105274,7 @@ /area/eris/medical/medbay/organs) "saN" = ( /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/altar) @@ -105987,9 +105482,7 @@ /turf/simulated/floor/tiled/dark/gray_platform, /area/eris/neotheology/bioprinter) "sug" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/churchcorridor) "suD" = ( @@ -106045,8 +105538,7 @@ /area/eris/neotheology/office) "szo" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/sign/faction/astersguild{ pixel_x = 32 @@ -106183,9 +105675,7 @@ }, /area/eris/hallway/main/section2) "sNS" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/machinery/power/nt_obelisk, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/chapel) @@ -106587,9 +106077,7 @@ /turf/simulated/floor/tiled/steel/gray_platform, /area/eris/engineering/long_range_scanner) "tEu" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/structure/disposalpipe/trunk{ dir = 4 }, @@ -106665,8 +106153,7 @@ pixel_x = -32 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/steel, /area/eris/hallway/side/section3starboard) @@ -106718,8 +106205,7 @@ /area/eris/neotheology/chapelritualroom) "tSV" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/machinery/power/nt_obelisk, /turf/simulated/floor/tiled/white/golden, @@ -106748,8 +106234,7 @@ /obj/structure/table/standard, /obj/item/paper/detective_guide, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/tiled/dark/gray_perforated, /area/eris/security/exerooms) @@ -107084,8 +106569,7 @@ }, /obj/machinery/disposal, /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /turf/simulated/floor/tiled/white/golden, /area/eris/neotheology/bioprinter) @@ -107100,8 +106584,7 @@ dir = 6 }, /obj/machinery/light{ - dir = 4; - pixel_x = -10 + dir = 4 }, /turf/simulated/floor/plating/under, /area/eris/engineering/atmos) @@ -107485,9 +106968,7 @@ /obj/item/storage/box/lights/bulbs, /obj/item/storage/box/lights/bulbs, /obj/item/storage/box/lights/bulbs, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/steel, /area/eris/quartermaster/hangarsupply) "vyY" = ( @@ -107581,9 +107062,7 @@ /turf/simulated/floor/tiled/cafe, /area/eris/crew_quarters/kitchen) "vHq" = ( -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/tiled/dark/golden, /area/eris/neotheology/funeral) "vIJ" = ( @@ -107838,8 +107317,7 @@ /area/eris/neotheology/bioprinter) "wlN" = ( /obj/machinery/light{ - dir = 8; - pixel_x = 10 + dir = 8 }, /obj/structure/cyberplant, /turf/simulated/floor/tiled/steel/bar_dance, @@ -107883,9 +107361,7 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /turf/simulated/floor/wood, /area/eris/neotheology/churchbarracks) "wpU" = ( @@ -107985,9 +107461,7 @@ /obj/structure/toilet{ dir = 4 }, -/obj/machinery/light{ - pixel_y = 20 - }, +/obj/machinery/light, /obj/landmark/storyevent/midgame_stash_spawn{ navigation = "Section 2, floor 1. Medbay toilet." }, From 0ea4fd1e6fb8e7622ad365b658ac45559c68e238 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 28 Aug 2024 01:21:09 +0300 Subject: [PATCH 168/171] ah --- code/game/machinery/door_control.dm | 2 +- icons/obj/machines/buttons.dmi | Bin 9464 -> 9423 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 0560a094d1..46de556768 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -241,7 +241,7 @@ /obj/machinery/button/remote/blast_door/id_card/table atomFlags = parent_type::atomFlags & ~AF_WALL_MOUNTED - hitbox = + hitbox = /datum/hitboxDatum/atom/button/table icon_state = "doorid0_table" /obj/machinery/button/remote/blast_door/id_card/attackby(obj/item/W, mob/user as mob) diff --git a/icons/obj/machines/buttons.dmi b/icons/obj/machines/buttons.dmi index c5c88b3a4b908457b0fe4a46afc21640fc61cb3c..2d8a42f7d8b8a96b177ca44f0639a40ca5017811 100644 GIT binary patch literal 9423 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 Lh8Oa6Z$0`C0a=q@ literal 9464 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 wxM1rA9-K)$2=*O+IcC*A^M>d0bZ Date: Tue, 3 Sep 2024 04:43:44 +0300 Subject: [PATCH 169/171] a --- code/_compile_options.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_compile_options.dm b/code/_compile_options.dm index 496a3ee100..c73fd50e0e 100644 --- a/code/_compile_options.dm +++ b/code/_compile_options.dm @@ -46,7 +46,7 @@ #define PRELOAD_RSC 2 // 0 to allow using external resources or on-demand behaviour; #endif // 1 to use the default behaviour; // 2 for preloading absolutely everything; -//#define LOWMEMORYMODE 1 +#define LOWMEMORYMODE 1 //#define BULLETDEBUG 1 From 43ba46e5e69edd41311929aaf12dde16dd365e0b Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Sat, 7 Sep 2024 15:48:53 +0300 Subject: [PATCH 170/171] some new ordering standards & fixes to the fucking ordering isuses --- code/modules/projectiles/hitbox_datums.dm | 43 +++++++++++++++-------- code/modules/projectiles/projectile.dm | 24 ++++++++++--- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index f907870fca..de71d773ec 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(hitboxPrototypes) calculateAimingLevels() /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/proc/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) +/datum/hitboxDatum/proc/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) as number /datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone, atom/owner) @@ -86,23 +86,23 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// x1,y1 and x2,y2 are the start and end of the first line /// x3,y3 and x4,y4 are the start and end of the second line /// pStepX and pStepY are pointers for setting the bullets step end -/datum/hitboxDatum/proc/lineIntersect(x1,y1,x2,y2,x3,y3,x4,y4, pStepX, pStepY) +/datum/hitboxDatum/proc/lineIntersect(x1,y1,x2,y2,x3,y3,x4,y4, pStepX, pStepY) as number var/firstRatio var/secondRatio var/denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)) if(denominator == 0) message_admins("Invalid line for [src], at hitbox coords BulletLine ([x1] | [y1]) ([x2] | [y2]) HitboxLine ([x3] | [y3]) ([x4] | [y4])") - return FALSE + return 0 firstRatio = ((x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3)) / denominator secondRatio = ((x2 - x1) * (y1 - y3) - (y2 - y1) * (x1 - x3)) / denominator if(firstRatio >= 0 && firstRatio <= 1 && secondRatio >= 0 && secondRatio <= 1) *pStepX = x1 + firstRatio * (x2 - x1) *pStepY = y1 + firstRatio * (y2 - y1) - return TRUE + return DIST_EUCLIDIAN_2D(x1,y1, *pStepX, *pStepY) //return list(x1 + firstRatio * (x2 - x1), y1 + firstRatio * (y2 - y1)) //message_admins("X-collision : [x1 + firstRatio * (x2 - x1)] Y-collision : [y1 + firstRatio * (y2] - y1)]") //message_admins("Distance between points : [DIST_EUCLIDIAN_2D(x1,y1,x1 + firstRatio * (x2 - x1),y1 + firstRatio * (y2] - y1) )]") - return FALSE + return 0 /datum/hitboxDatum/proc/visualize(atom/owner) @@ -118,6 +118,21 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo newOverlay.alpha = 200 owner.overlays.Add(newOverlay) +/datum/hitboxDatum/proc/getHitboxLines(atom/owner, ownerDirection, worldX, worldY, worldZ) + . = new/list(length(boundingBoxes["[ownerDirection]"])*4) + var/currentIndex = 1 + var/firstZ + var/lastZ + var/flags + for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) + firstZ = boundingData[5] + worldZ + vlastZ = boundingData[6] + worldZ + vflags = boundingData[7] + .[currentIndex++] = (list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, firstZ, lastZ, flags)) + .[currentIndex++] = (list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, firstZ, lastZ, flags)) + .[currentIndex++] = (list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, firstZ, lastZ, flags)) + .[currentIndex++] = (list(boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, firstZ, lastZ, flags)) + /datum/hitboxDatum/atom boundingBoxes = list( LISTNORTH = list(BBOX(16,16,24,24,1,2,null)), @@ -139,6 +154,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/worldX var/worldY var/worldZ + var/minimumIntersection = 999999 + var/intersectionDistance = 0 worldX = owner.x worldY = owner.y if(owner.atomFlags & AF_HITBOX_OFFSET_BY_ATTACHMENT) @@ -153,20 +170,16 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo worldX += owner.pixel_x worldY += owner.pixel_y worldZ = owner.z * PPT - for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) + for(var/list/boundingData in getHitboxLines(owner, ownerDirection, worldX, worldY, worldZ)) if((boundingData[5]+worldZ) > max(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) > max(startZ,startZ+*pStepZ)) continue if((boundingData[5]+worldZ) < min(startZ,startZ+*pStepZ) && (boundingData[6]+worldZ) < min(startZ,startZ+*pStepZ)) continue - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, pStepX, pStepY)) - return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, pStepX, pStepY)) - return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) - return TRUE - if(lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[3] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, pStepX, pStepY)) - return TRUE - return FALSE + intersectionDistance = lineIntersect(startX, startY, startX+*pStepX, startY+*pStepY, boundingData[1], boundingData[2], boundingData[3], boundingData[4], pStepX, pStepY) + if(intersectionDistance > 0 && intersectionDistance < minimumIntersection) + minimumIntersection = intersectionDistance + *pHitFlags = boundingData[7] + return minimumIntersection = 999999 ? 0 : minimumIntersection /// This subtype is dedicated especially to tables. Their building system changes shape depending on adjaency. So this reflects that diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 25f1b0ace1..78a83e7909 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -538,7 +538,7 @@ GLOBAL_LIST(projectileDamageConstants) /obj/item/projectile/proc/scanTurf(turf/scanning, bulletDir, startX, startY, startZ, pStepX, pStepY, pStepZ) . = PROJECTILE_CONTINUE if(atomFlags & AF_VISUAL_MOVE) - return PROJECTILE_CONTINUE + return var/list/hittingList = new/list(length(HittingPrioritiesList)) hittingList[1] = list() hittingList[2] = list() @@ -572,17 +572,31 @@ GLOBAL_LIST(projectileDamageConstants) else hittingList[index] += possibleTarget + var/list/hitboxesList = list() + for(var/i in 1 to length(hittingList)) for(var/atom/target as anything in hittingList[i]) if(target == firer) continue /// third slot rezerved for flags passed back by hitbox intersect var/hitFlags = null - if(target.hitbox && !target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ, &hitFlags)) + var/hitboxIntersect = target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ, &hitFlags) + if(target.hitbox && !hitboxIntersect) continue - if(target.bullet_act(src, def_zone, hitFlags) & PROJECTILE_STOP) - onBlockingHit(target) - return PROJECTILE_STOP + hitboxesList.Add(list(hitboxIntersect, hitFlags, target)) + + var/temp + for(var/i in 1 to length(hitboxesList) - 1) + if(hitboxList[i][1] < hitboxList[i+1][1]) + temp = hitboxList[i] + hitboxesList[i] = hitboxesList[i+1] + hitboxesList[i+1] = temp + i = max(i-2, 1) + + for(var/i in 1 to length(hitboxesList)) + if(hitboxesList[i][3].bullet_act(src, def_zone, hitFlags) & PROJECTILE_STOP) + onBlockingHit(hitboxesList[i][3]) + return PROJECTILE_STOP return PROJECTILE_CONTINUE From 659dfb0b793d2c6becacbbf0674bc9d286120f19 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Wed, 11 Sep 2024 22:55:41 +0300 Subject: [PATCH 171/171] optimizations --- code/modules/projectiles/hitbox_datums.dm | 10 +-- code/modules/projectiles/projectile.dm | 81 +++++++++++------------ 2 files changed, 42 insertions(+), 49 deletions(-) diff --git a/code/modules/projectiles/hitbox_datums.dm b/code/modules/projectiles/hitbox_datums.dm index de71d773ec..5175a26634 100644 --- a/code/modules/projectiles/hitbox_datums.dm +++ b/code/modules/projectiles/hitbox_datums.dm @@ -54,7 +54,7 @@ GLOBAL_LIST_EMPTY(hitboxPrototypes) calculateAimingLevels() /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/proc/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) as number +/datum/hitboxDatum/proc/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) /datum/hitboxDatum/proc/getAimingLevel(atom/shooter, defZone, atom/owner) @@ -86,7 +86,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo /// x1,y1 and x2,y2 are the start and end of the first line /// x3,y3 and x4,y4 are the start and end of the second line /// pStepX and pStepY are pointers for setting the bullets step end -/datum/hitboxDatum/proc/lineIntersect(x1,y1,x2,y2,x3,y3,x4,y4, pStepX, pStepY) as number +/datum/hitboxDatum/proc/lineIntersect(x1,y1,x2,y2,x3,y3,x4,y4, pStepX, pStepY) var/firstRatio var/secondRatio var/denominator = ((y4 - y3) * (x2 - x1) - (x4 - x3) * (y2 - y1)) @@ -126,8 +126,8 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo var/flags for(var/list/boundingData in boundingBoxes["[ownerDirection]"]) firstZ = boundingData[5] + worldZ - vlastZ = boundingData[6] + worldZ - vflags = boundingData[7] + lastZ = boundingData[6] + worldZ + flags = boundingData[7] .[currentIndex++] = (list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[1] + worldX, boundingData[4] + worldY, firstZ, lastZ, flags)) .[currentIndex++] = (list(boundingData[1] + worldX, boundingData[2] + worldY, boundingData[3] + worldX, boundingData[2] + worldY, firstZ, lastZ, flags)) .[currentIndex++] = (list(boundingData[1] + worldX, boundingData[4] + worldY, boundingData[3] + worldX, boundingData[4] + worldY, firstZ, lastZ, flags)) @@ -150,7 +150,7 @@ boolean lineLine(float x1, float y1, float x2, float y2, float x3, float y3, flo return defZoneToLevel[defZone] /// this can be optimized further by making the calculations not make a new list , and instead be added when checking line intersection - SPCR 2024 -/datum/hitboxDatum/atom/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ) +/datum/hitboxDatum/atom/intersects(atom/owner, ownerDirection, startX, startY, startZ, pStepX, pStepY, pStepZ, pHitFlags) var/worldX var/worldY var/worldZ diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 78a83e7909..4412b013f3 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -539,63 +539,56 @@ GLOBAL_LIST(projectileDamageConstants) . = PROJECTILE_CONTINUE if(atomFlags & AF_VISUAL_MOVE) return - var/list/hittingList = new/list(length(HittingPrioritiesList)) - hittingList[1] = list() - hittingList[2] = list() - hittingList[3] = list() - hittingList[4] = list() - hittingList[5] = list() - var/list/sortingList = scanning.contents.Copy() - sortingList.Add(scanning) - sortingList.Remove(src) - for(var/atom/thing as anything in sortingList) - if(thing.atomFlags & AF_IGNORE_ON_BULLETSCAN) - continue - if(thing in dataRef.cannotHit) - continue - for(var/index=1 to length(HittingPrioritiesList)) - if(!istype(thing, HittingPrioritiesList[index])) - continue - hittingList[index] += thing - if(!length(thing.attached)) - continue - for(var/atom/possibleTarget as anything in thing.attached) - if(thing.attached[possibleTarget] & ATFS_IGNORE_HITS) - continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE && !(possibleTarget.dir & reverse_dir[bulletDir])) - continue - if(possibleTarget.attached[thing] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(possibleTarget.dir == reverse_dir[bulletDir])) - continue - if(thing.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) - hittingList[index][length(hittingList[index])] = possibleTarget - hittingList[index] += thing - else - hittingList[index] += possibleTarget var/list/hitboxesList = list() - for(var/i in 1 to length(hittingList)) - for(var/atom/target as anything in hittingList[i]) - if(target == firer) + for(var/atom/target as anything in scanning.contents) + if(target.atomFlags & AF_IGNORE_ON_BULLETSCAN) + continue + if(target in dataRef.cannotHit) + continue + if(target == firer) + continue + if(target == src) + continue + if(!target.hitbox) + message_admins("[src] [src.type] has no hitbox!") + continue + /// third slot rezerved for flags passed back by hitbox intersect + var/hitFlags = null + + var/hitboxIntersect = target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ, &hitFlags) + if(target.hitbox && !hitboxIntersect) + continue + hitboxesList.Add(list(hitboxIntersect, hitFlags, target)) + for(var/atom/possibleTarget as anything in target.attached) + if(target.attached[possibleTarget] & ATFS_IGNORE_HITS) continue - /// third slot rezerved for flags passed back by hitbox intersect - var/hitFlags = null - var/hitboxIntersect = target.hitbox.intersects(target, target.dir, startX, startY, startZ, pStepX, pStepY, pStepZ, &hitFlags) - if(target.hitbox && !hitboxIntersect) + if(possibleTarget.attached[target] & ATFA_DIRECTIONAL_HITTABLE && !(possibleTarget.dir & reverse_dir[bulletDir])) continue - hitboxesList.Add(list(hitboxIntersect, hitFlags, target)) + if(possibleTarget.attached[target] & ATFA_DIRECTIONAL_HITTABLE_STRICT && !(possibleTarget.dir == reverse_dir[bulletDir])) + continue + var/intersectDistance = possibleTarget.hitbox.intersects(possibleTarget, possibleTarget.dir, startX, startY,startZ, pStepX, pStepY, pStepZ, &hitFlags) + if(intersectDistance) + if(target.attached[possibleTarget] & ATFS_PRIORITIZE_ATTACHED_FOR_HITS) + var/listReference = hitboxesList[length(hitboxesList)] + hitboxesList[length(hitboxesList)]= list(intersectDistance, hitFlags, possibleTarget) + hitboxesList.Add(listReference) + else + hitboxesList.Add(list(intersectDistance, hitFlags, possibleTarget)) var/temp for(var/i in 1 to length(hitboxesList) - 1) - if(hitboxList[i][1] < hitboxList[i+1][1]) - temp = hitboxList[i] + if(hitboxesList[i][1] < hitboxesList[i+1][1]) + temp = hitboxesList[i] hitboxesList[i] = hitboxesList[i+1] hitboxesList[i+1] = temp i = max(i-2, 1) for(var/i in 1 to length(hitboxesList)) - if(hitboxesList[i][3].bullet_act(src, def_zone, hitFlags) & PROJECTILE_STOP) - onBlockingHit(hitboxesList[i][3]) + var/atom/target = hitboxesList[i][3] + if(target.bullet_act(src, def_zone, hitboxesList[i][2]) & PROJECTILE_STOP) + onBlockingHit(target) return PROJECTILE_STOP return PROJECTILE_CONTINUE