From 80bb3e953208f7e6acb4902575d950aba367c3a0 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 00:58:28 +0200 Subject: [PATCH 1/7] Update mech_damage.dm --- code/modules/mechs/mech_damage.dm | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 2a36e0dddfb..83e674794b3 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -73,6 +73,8 @@ else return body /mob/living/exosuit/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, armor_divisor = 1, wounding_multiplier = 1, sharp = FALSE, edge = FALSE, obj/used_weapon = null) + if(istext(def_zone)) + def_zone = zoneToComponent(def_zone) switch(damagetype) if(BRUTE) wounding_multiplier = wound_check(injury_type, wounding_multiplier, edge, sharp) @@ -85,6 +87,7 @@ updatehealth() return FALSE + /mob/living/exosuit/bullet_act(obj/item/projectile/P, var/def_zone) var/hit_dir = get_dir(P.starting, src) def_zone = zoneToComponent(def_zone) @@ -140,3 +143,25 @@ for(var/thing in pilots) var/mob/pilot = thing pilot.emp_act(severity) + +/mob/living/exosuit/explosion_act(target_power, explosion_handler/handler) + var/damage = target_power - getarmor(body, ARMOR_BOMB) + var/split = round(damage/4) + var/blocked = 0 + if(head) + adjustBruteLoss(split, head) + blocked++ + if(body) + adjustBruteLoss(split, body) + blocked++ + if(legs) + adjustBruteLoss(split, legs) + blocked++ + if(arms) + adjustBruteLoss(split, arms) + blocked++ + if(damage > 400) + occupant_message("You feel the shockwave of a external explosion pass through your body!") + + return split*blocked + From 44cb6eea3fc5c9081ee3cc1fd13168b655a034cb Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 12:56:33 +0200 Subject: [PATCH 2/7] Add mech pilot attack interactions when hatch isnt closed + explosion act for open hatch. --- code/modules/mechs/mech_damage.dm | 35 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 83e674794b3..5233235d30c 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -32,8 +32,8 @@ if(!I.force) user.visible_message(SPAN_NOTICE("\The [user] bonks \the [src] harmlessly with \the [I].")) return - - if(LAZYLEN(pilots) && !prob(body.pilot_coverage)) + // must be in front + if(LAZYLEN(pilots) && !(hatch_closed || prob(body.pilot_coverage) && get_dir(user, src) & reverse_dir[dir])) var/mob/living/pilot = pick(pilots) return pilot.resolve_item_attack(I, user, def_zone) @@ -94,23 +94,34 @@ if (P.is_hot() >= HEAT_MOBIGNITE_THRESHOLD) IgniteMob() + var/mob/living/target = src + if(def_zone == body && !(hatch_closed || prob(body.pilot_coverage) && hit_dir & reverse_dir[dir] && get_mob())) + target = get_mob() //Stun Beams - if(P.taser_effect) + if(P.taser_effect && target == src) qdel(P) return TRUE - //Armor and damage + // Pass to pilot + if(target != src) + var/result = target.bullet_act(P, ran_zone()) + var/turf/location = get_turf(src) + location.visible_message("[get_mob()] gets hit by \the [P]!") + // if it gets stuck in the mob , dont go throug mech + if(result != PROJECTILE_CONTINUE) + return + // hit mech if there is no pilot or if it went throug the pilot if(!P.nodamage) hit_impact(P.get_structure_damage(), hit_dir) for(var/damage_type in P.damage_types) - if(damage_type == HALLOSS) + if(damage_type == HALLOSS && target == src) continue // don't even bother var/damage = P.damage_types[damage_type] damage_through_armor(clamp(damage,0, damage), damage_type, def_zone, P.check_armour, armor_divisor = P.armor_divisor, used_weapon = P, sharp=is_sharp(P), edge=has_edge(P)) - P.on_hit(src, def_zone) - return TRUE + P.on_hit(target, def_zone) + return PROJECTILE_STOP /mob/living/exosuit/getFireLoss() var/total = 0 @@ -152,7 +163,13 @@ adjustBruteLoss(split, head) blocked++ if(body) - adjustBruteLoss(split, body) + if(pilots && !(hatch_closed || prob(body.pilot_coverage))) + var/mob/living/pilot = get_mob() + // split damage between pilot n mech + pilot.explosion_act(round(split/2), handler) + adjustBruteLoss(round(split/2), body) + else + adjustBruteLoss(split, body) blocked++ if(legs) adjustBruteLoss(split, legs) @@ -163,5 +180,5 @@ if(damage > 400) occupant_message("You feel the shockwave of a external explosion pass through your body!") - return split*blocked + return round(split*blocked) From 443e8e551c8246ed43cb026c0587a8cb8d47fa78 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 12:58:23 +0200 Subject: [PATCH 3/7] use something more reliable --- code/modules/mechs/mech_damage.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 5233235d30c..76eb0bf8a9b 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -163,7 +163,7 @@ adjustBruteLoss(split, head) blocked++ if(body) - if(pilots && !(hatch_closed || prob(body.pilot_coverage))) + if(get_mob() && !(hatch_closed || prob(body.pilot_coverage))) var/mob/living/pilot = get_mob() // split damage between pilot n mech pilot.explosion_act(round(split/2), handler) From efb618a517e71b2d7e6296e6d0e8daeb3afefbd7 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 13:07:33 +0200 Subject: [PATCH 4/7] Attack from any angle if hatch is not closed based on pilot coverage , else always succed from front if hatch is opened --- code/modules/mechs/mech_damage.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/modules/mechs/mech_damage.dm b/code/modules/mechs/mech_damage.dm index 76eb0bf8a9b..3f3daeae7a3 100644 --- a/code/modules/mechs/mech_damage.dm +++ b/code/modules/mechs/mech_damage.dm @@ -32,10 +32,15 @@ if(!I.force) user.visible_message(SPAN_NOTICE("\The [user] bonks \the [src] harmlessly with \the [I].")) return - // must be in front - if(LAZYLEN(pilots) && !(hatch_closed || prob(body.pilot_coverage) && get_dir(user, src) & reverse_dir[dir])) + // must be in front if the hatch is opened , else we roll for any angle based on chassis coverage + var/roll = !prob(body.pilot_coverage) + if(LAZYLEN(pilots) && ((!hatch_closed && (get_dir(user,src) & reverse_dir[dir])) || roll)) var/mob/living/pilot = pick(pilots) return pilot.resolve_item_attack(I, user, def_zone) + else if(LAZYLEN(pilots) && !roll) + var/turf/location = get_turf(src) + location.visible_message(SPAN_DANGER("\The [user] tries to attack the pilot inside of \the [src], but the chassis blocks it!")) + return def_zone return def_zone //Careful with effects, mechs shouldn't be stunned @@ -95,7 +100,7 @@ if (P.is_hot() >= HEAT_MOBIGNITE_THRESHOLD) IgniteMob() var/mob/living/target = src - if(def_zone == body && !(hatch_closed || prob(body.pilot_coverage) && hit_dir & reverse_dir[dir] && get_mob())) + if(def_zone == body && ((!hatch_closed && (hit_dir & reverse_dir[dir])) || !prob(body.pilot_coverage)) && get_mob()) target = get_mob() //Stun Beams if(P.taser_effect && target == src) From 27ace31ecf83f8afa9d425134b182e015f24b930 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 13:44:56 +0200 Subject: [PATCH 5/7] Fix mech slowdown --- code/modules/mob/living/carbon/human/human_movement.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 4dfe967ae30..9e14d579786 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -5,6 +5,9 @@ tally += species.slowdown if (istype(loc, /turf/space)) // It's hard to be slowed down in space by... anything return tally + /// No slowdown for mech pilots , mech already handles movement. + if(ismech(loc)) + return 0 if(embedded_flag) handle_embedded_objects() //Moving with objects stuck in you can cause bad times. From e14e68c74762cfd49230de4a87083661019513b1 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 15:00:31 +0200 Subject: [PATCH 6/7] fix projectiles hitting pilots. --- code/modules/projectiles/projectile.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 883599528ac..3c0d6e9b880 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -448,6 +448,10 @@ return FALSE if(ismob(A)) + // for when somehow a mob inside a mech / closet gets bumped. + if(!isturf(A.loc)) + bumped = FALSE + return FALSE var/mob/M = A if(isliving(A)) //if they have a neck grab on someone, that person gets hit instead From 9d712fe3d49463c16b180e6dbfce0a66bd7d7d38 Mon Sep 17 00:00:00 2001 From: MLGTASTICa Date: Fri, 3 Nov 2023 15:41:35 +0200 Subject: [PATCH 7/7] better fix for mech bumping. --- code/modules/projectiles/projectile.dm | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 3c0d6e9b880..4a82cf79336 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -448,10 +448,6 @@ return FALSE if(ismob(A)) - // for when somehow a mob inside a mech / closet gets bumped. - if(!isturf(A.loc)) - bumped = FALSE - return FALSE var/mob/M = A if(isliving(A)) //if they have a neck grab on someone, that person gets hit instead @@ -535,7 +531,8 @@ pixel_y = location.pixel_y if(!bumped && !QDELETED(original) && !isturf(original)) - if(loc == get_turf(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