From 172ecc409ca21aa0ed750ba285ff2d52deb35dfc Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 29 Sep 2020 00:17:23 +0200 Subject: [PATCH] [MIRROR] Mining mechas refactors (#1026) * Mining mechas refactors (#53676) * Mining mechas refactors Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com> --- .../mecha/equipment/mecha_equipment.dm | 1 + .../mecha/equipment/tools/weapon_bay.dm | 2 +- .../mecha/equipment/tools/work_tools.dm | 382 ++++++++---------- .../vehicles/mecha/mecha_control_console.dm | 4 +- code/modules/vehicles/mecha/working/clarke.dm | 3 - code/modules/vehicles/mecha/working/ripley.dm | 55 ++- .../modules/vehicles/mecha/working/working.dm | 23 +- 7 files changed, 220 insertions(+), 250 deletions(-) diff --git a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm index 617b82603a8..f58db78715e 100644 --- a/code/modules/vehicles/mecha/equipment/mecha_equipment.dm +++ b/code/modules/vehicles/mecha/equipment/mecha_equipment.dm @@ -116,6 +116,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/vehicle/sealed/mecha/M) if(LAZYLEN(M.equipment)[M] already has a concealed weapon bay!") return - ..() + return ..() diff --git a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm index ad911ba7dd0..662b2de5267 100644 --- a/code/modules/vehicles/mecha/equipment/tools/work_tools.dm +++ b/code/modules/vehicles/mecha/equipment/tools/work_tools.dm @@ -11,24 +11,28 @@ tool_behaviour = TOOL_RETRACTOR range = MECHA_MELEE toolspeed = 0.8 - var/dam_force = 20 - var/obj/vehicle/sealed/mecha/working/ripley/cargo_holder harmful = TRUE mech_flags = EXOSUIT_MODULE_RIPLEY + ///Bool for whether we beat the hell out of things we punch (and tear off their arms) + var/killer_clamp = FALSE + ///How much base damage this clamp does + var/clamp_damage = 20 + ///Var for the chassis we are attached to, needed to access ripley contents and such + var/obj/vehicle/sealed/mecha/working/ripley/cargo_holder -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/vehicle/sealed/mecha/working/ripley/M) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/can_attach(obj/vehicle/sealed/mecha/M) + . = ..() + if(!.) + return + if(!istype(M, /obj/vehicle/sealed/mecha/working/ripley)) + return FALSE /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/attach(obj/vehicle/sealed/mecha/M) - ..() + . = ..() cargo_holder = M - return /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/detach(atom/moveto = null) - ..() + . = ..() cargo_holder = null /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/action(mob/source, atom/target, params) @@ -48,52 +52,82 @@ to_chat(source, "No further supplies can be provided to [M].") else to_chat(source, "No providable supplies found in cargo hold") - return - if(isobj(target)) - var/obj/O = target - if(istype(O, /obj/machinery/door/firedoor)) - var/obj/machinery/door/firedoor/D = O - D.try_to_crowbar(src, source) + + else if(isobj(target)) + var/obj/clamptarget = target + if(istype(clamptarget, /obj/machinery/door/firedoor)) + var/obj/machinery/door/firedoor/targetfiredoor = clamptarget + targetfiredoor.try_to_crowbar(src, source) return - if(istype(O, /obj/machinery/door/airlock/)) - var/obj/machinery/door/airlock/D = O - D.try_to_crowbar(src, source) + if(istype(clamptarget, /obj/machinery/door/airlock/)) + var/obj/machinery/door/airlock/targetairlock = clamptarget + targetairlock.try_to_crowbar(src, source) return - if(!O.anchored) - if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) - chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - O.set_anchored(TRUE) - if(do_after_cooldown(target, source)) - cargo_holder.cargo += O - O.forceMove(chassis) - O.set_anchored(FALSE) - to_chat(source, "[icon2html(src, source)][target] successfully loaded.") - log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) - else - O.set_anchored(initial(O.anchored)) - else - to_chat(source, "[icon2html(src, source)]Not enough room in cargo compartment!") - else + if(clamptarget.anchored) to_chat(source, "[icon2html(src, source)][target] is firmly secured!") + return + if(LAZYLEN(cargo_holder.cargo) >= cargo_holder.cargo_capacity) + to_chat(source, "[icon2html(src, source)]Not enough room in cargo compartment!") + return + chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") + clamptarget.set_anchored(TRUE) + if(!do_after_cooldown(target, source)) + clamptarget.set_anchored(initial(clamptarget.anchored)) + return + LAZYADD(cargo_holder.cargo, clamptarget) + clamptarget.forceMove(chassis) + clamptarget.set_anchored(FALSE) + if(!cargo_holder.box && istype(clamptarget, /obj/structure/ore_box)) + cargo_holder.box = clamptarget + to_chat(source, "[icon2html(src, source)][target] successfully loaded.") + log_message("Loaded [clamptarget]. Cargo compartment capacity: [cargo_holder.cargo_capacity - LAZYLEN(cargo_holder.cargo)]", LOG_MECHA) else if(isliving(target)) var/mob/living/M = target if(M.stat == DEAD) return - if(source.a_intent == INTENT_HARM) - M.take_overall_damage(dam_force) - if(!M) - return - M.adjustOxyLoss(round(dam_force/2)) - M.updatehealth() - target.visible_message("[chassis] squeezes [target]!", \ - "[chassis] squeezes you!",\ - "You hear something crack.") - log_combat(source, M, "attacked", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - else + if(source.a_intent == INTENT_HELP) step_away(M,chassis) - to_chat(source, "[icon2html(src, source)]You push [target] out of the way.") - chassis.visible_message("[chassis] pushes [target] out of the way.") + if(killer_clamp) + target.visible_message("[chassis] tosses [target] like a piece of paper!", \ + "[chassis] tosses you like a piece of paper!") + else + to_chat(source, "[icon2html(src, source)]You push [target] out of the way.") + chassis.visible_message("[chassis] pushes [target] out of the way.", \ + "[chassis] pushes you aside.") + return ..() + else if(source.a_intent == INTENT_DISARM && iscarbon(M))//meme clamp here + if(!killer_clamp) + to_chat(source, "You longingly wish to tear [M]'s arms off.") + return + var/mob/living/carbon/C = target + var/torn_off = FALSE + var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM) + if(affected != null) + affected.dismember(damtype) + torn_off = TRUE + affected = C.get_bodypart(BODY_ZONE_R_ARM) + if(affected != null) + affected.dismember(damtype) + torn_off = TRUE + if(!torn_off) + to_chat(source, "[M]'s arms are already torn off, you must find a challenger worthy of the kill clamp!") + return + playsound(src, get_dismember_sound(), 80, TRUE) + target.visible_message("[chassis] rips [target]'s arms off!", \ + "[chassis] rips your arms off!") + log_combat(source, M, "removed both arms with a real clamp,", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") + return ..() + + M.take_overall_damage(clamp_damage) + if(!M) //get gibbed stoopid + return + M.adjustOxyLoss(round(clamp_damage/2)) + M.updatehealth() + target.visible_message("[chassis] squeezes [target]!", \ + "[chassis] squeezes you!",\ + "You hear something crack.") + log_combat(source, M, "attacked", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") return ..() @@ -101,87 +135,15 @@ //This is pretty much just for the death-ripley /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill name = "\improper KILL CLAMP" + desc = "They won't know what clamped them! This time for real!" + killer_clamp = TRUE + + +/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/fake//harmless fake for pranks desc = "They won't know what clamped them!" energy_drain = 0 - dam_force = 0 - var/real_clamp = FALSE - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real - desc = "They won't know what clamped them! This time for real!" - energy_drain = 10 - dam_force = 20 - real_clamp = TRUE - -/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/action(mob/source, atom/target, params) - if(!action_checks(target)) - return - if(!cargo_holder) - return - if(isobj(target)) - var/obj/O = target - if(!O.anchored) - if(cargo_holder.cargo.len < cargo_holder.cargo_capacity) - chassis.visible_message("[chassis] lifts [target] and starts to load it into cargo compartment.") - O.set_anchored(TRUE) - if(do_after_cooldown(target, source)) - cargo_holder.cargo += O - O.forceMove(chassis) - O.set_anchored(FALSE) - to_chat(source, "[icon2html(src, source)][target] successfully loaded.") - log_message("Loaded [O]. Cargo compartment capacity: [cargo_holder.cargo_capacity - cargo_holder.cargo.len]", LOG_MECHA) - else - O.set_anchored(initial(O.anchored)) - else - to_chat(source, "[icon2html(src, source)]Not enough room in cargo compartment!") - else - to_chat(source, "[icon2html(src, source)][target] is firmly secured!") - - else if(isliving(target)) - var/mob/living/M = target - if(M.stat == DEAD) - return - if(source.a_intent == INTENT_HARM) - if(real_clamp) - M.take_overall_damage(dam_force) - if(!M) - return - M.adjustOxyLoss(round(dam_force/2)) - M.updatehealth() - target.visible_message("[chassis] destroys [target] in an unholy fury!", \ - "[chassis] destroys you in an unholy fury!") - log_combat(source, M, "attacked", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - else - target.visible_message("[chassis] destroys [target] in an unholy fury!", \ - "[chassis] destroys you in an unholy fury!") - else if(source.a_intent == INTENT_DISARM) - if(real_clamp) - var/mob/living/carbon/C = target - var/play_sound = FALSE - var/limbs_gone = "" - var/obj/item/bodypart/affected = C.get_bodypart(BODY_ZONE_L_ARM) - if(affected != null) - affected.dismember(damtype) - play_sound = TRUE - limbs_gone = ", [affected]" - affected = C.get_bodypart(BODY_ZONE_R_ARM) - if(affected != null) - affected.dismember(damtype) - play_sound = TRUE - limbs_gone = "[limbs_gone], [affected]" - if(play_sound) - playsound(src, get_dismember_sound(), 80, TRUE) - target.visible_message("[chassis] rips [target]'s arms off!", \ - "[chassis] rips your arms off!") - log_combat(source, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])") - else - target.visible_message("[chassis] rips [target]'s arms off!", \ - "[chassis] rips your arms off!") - else - step_away(M,chassis) - target.visible_message("[chassis] tosses [target] like a piece of paper!", \ - "[chassis] tosses you like a piece of paper!") - return ..() - + clamp_damage = 0 + killer_clamp = FALSE /obj/item/mecha_parts/mecha_equipment/extinguisher @@ -198,7 +160,7 @@ create_reagents(1000) reagents.add_reagent(/datum/reagent/water, 1000) -/obj/item/mecha_parts/mecha_equipment/extinguisher/action(mob/source, atom/target, params) //copypasted from extinguisher. TODO: Rewrite from scratch.//Still todo +/obj/item/mecha_parts/mecha_equipment/extinguisher/action(mob/source, atom/target, params) if(!action_checks(target) || get_dist(chassis, target)>3) return @@ -207,50 +169,57 @@ WT.reagents.trans_to(src, 1000) to_chat(source, "[icon2html(src, source)]Extinguisher refilled.") playsound(chassis, 'sound/effects/refill.ogg', 50, TRUE, -6) - else - if(reagents.total_volume > 0) - playsound(chassis, 'sound/effects/extinguish.ogg', 75, TRUE, -3) - var/direction = get_dir(chassis,target) - var/turf/T = get_turf(target) - var/turf/T1 = get_step(T,turn(direction, 90)) - var/turf/T2 = get_step(T,turn(direction, -90)) + return - var/list/the_targets = list(T,T1,T2) - spawn(0) - for(var/a=0, a<5, a++) - var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(chassis)) - if(!W) - return - var/turf/my_target = pick(the_targets) - var/datum/reagents/R = new/datum/reagents(5) - W.reagents = R - R.my_atom = W - reagents.trans_to(W,1, transfered_by = source) - for(var/b=0, b<4, b++) - if(!W) - return - step_towards(W,my_target) - if(!W) - return - var/turf/W_turf = get_turf(W) - W.reagents.expose(W_turf) - for(var/atom/atm in W_turf) - W.reagents.expose(atm) - if(W.loc == my_target) - break - sleep(2) - return ..() + if(reagents.total_volume <= 0) + return + playsound(chassis, 'sound/effects/extinguish.ogg', 75, TRUE, -3) + var/direction = get_dir(chassis,target) + var/turf/T = get_turf(target) + var/turf/T1 = get_step(T,turn(direction, 90)) + var/turf/T2 = get_step(T,turn(direction, -90)) + + var/list/the_targets = list(T,T1,T2) + INVOKE_ASYNC(src, .proc/do_extinguish, the_targets, source) + return ..() + +///Creates new water effects and moves them, takes a list of turfs as an argument +/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/do_extinguish(list/targets, mob/user)//this could be made slighty better but extinguisher code sucks even more so... + for(var/a=0 to 5)//generate new water... + var/obj/effect/particle_effect/water/W = new /obj/effect/particle_effect/water(get_turf(chassis)) + var/turf/my_target = pick(targets) + var/datum/reagents/R = new/datum/reagents(5) + W.reagents = R + R.my_atom = W + reagents.trans_to(W,1, transfered_by = user) + for(var/b=0 to 4)//...and move it 4 tiles + if(!W) + return + step_towards(W,my_target) + if(!W) + return + var/turf/W_turf = get_turf(W) + W.reagents.expose(W_turf) + for(var/atom/atm in W_turf) + W.reagents.expose(atm) + if(W.loc == my_target) + break + sleep(2) /obj/item/mecha_parts/mecha_equipment/extinguisher/get_equip_info() return "[..()] \[[src.reagents.total_volume]\]" -/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/vehicle/sealed/mecha/working/M as obj) - if(..()) - if(istype(M)) - return 1 - return 0 +/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/vehicle/sealed/mecha/M) + . = ..() + if(!.) + return + if(!istype(M, /obj/vehicle/sealed/mecha/working)) + return FALSE +#define MODE_DECONSTRUCT 0 +#define MODE_WALL 1 +#define MODE_AIRLOCK 2 /obj/item/mecha_parts/mecha_equipment/rcd name = "mounted RCD" @@ -260,7 +229,8 @@ energy_drain = 250 range = MECHA_MELEE|MECHA_RANGED item_flags = NO_MAT_REDEMPTION - var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock. + ///determines what we'll so when clicking on a turf + var/mode = MODE_DECONSTRUCT /obj/item/mecha_parts/mecha_equipment/rcd/Initialize() . = ..() @@ -271,61 +241,52 @@ return ..() /obj/item/mecha_parts/mecha_equipment/rcd/action(mob/source, atom/target, params) - if(istype(target, /turf/open/space/transit))//>implying these are ever made -Sieve - return - if(!isturf(target) && !istype(target, /obj/machinery/door/airlock)) target = get_turf(target) - if(!action_checks(target) || get_dist(chassis, target)>3) + if(!action_checks(target) || get_dist(chassis, target)>3 || istype(target, /turf/open/space/transit)) return playsound(chassis, 'sound/machines/click.ogg', 50, TRUE) switch(mode) - if(0) + if(MODE_DECONSTRUCT) + to_chat(source, "[icon2html(src, source)]Deconstructing [target]...") if(iswallturf(target)) var/turf/closed/wall/W = target - to_chat(source, "[icon2html(src, source)]Deconstructing [W]...") - if(do_after_cooldown(W, source)) - chassis.spark_system.start() - W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - playsound(W, 'sound/items/deconstruct.ogg', 50, TRUE) + if(!do_after_cooldown(W, source)) + return + W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else if(isfloorturf(target)) var/turf/open/floor/F = target - to_chat(source, "[icon2html(src, source)]Deconstructing [F]...") - if(do_after_cooldown(target, source)) - chassis.spark_system.start() - F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) - playsound(F, 'sound/items/deconstruct.ogg', 50, TRUE) + if(!do_after_cooldown(target, source)) + return + F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else if (istype(target, /obj/machinery/door/airlock)) - to_chat(source, "[icon2html(src, source)]Deconstructing [target]...") - if(do_after_cooldown(target, source)) - chassis.spark_system.start() - qdel(target) - playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) - if(1) + if(!do_after_cooldown(target, source)) + return + qdel(target) + if(MODE_WALL) if(isspaceturf(target)) var/turf/open/space/S = target to_chat(source, "[icon2html(src, source)]Building Floor...") - if(do_after_cooldown(S, source)) - S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) - playsound(S, 'sound/items/deconstruct.ogg', 50, TRUE) - chassis.spark_system.start() + if(!do_after_cooldown(S, source)) + return + S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else if(isfloorturf(target)) var/turf/open/floor/F = target to_chat(source, "[icon2html(src, source)]Building Wall...") - if(do_after_cooldown(F, source)) - F.PlaceOnTop(/turf/closed/wall) - playsound(F, 'sound/items/deconstruct.ogg', 50, TRUE) - chassis.spark_system.start() - if(2) + if(!do_after_cooldown(F, source)) + return + F.PlaceOnTop(/turf/closed/wall) + if(MODE_AIRLOCK) if(isfloorturf(target)) to_chat(source, "[icon2html(src, source)]Building Airlock...") - if(do_after_cooldown(target, source)) - chassis.spark_system.start() - var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) - T.autoclose = TRUE - playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) - playsound(target, 'sound/effects/sparks2.ogg', 50, TRUE) + if(!do_after_cooldown(target, source)) + return + var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target) + T.autoclose = TRUE + playsound(target, 'sound/effects/sparks2.ogg', 50, TRUE) + chassis.spark_system.start() + playsound(target, 'sound/items/deconstruct.ogg', 50, TRUE) return ..() /obj/item/mecha_parts/mecha_equipment/rcd/Topic(href,href_list) @@ -333,20 +294,23 @@ if(href_list["mode"]) mode = text2num(href_list["mode"]) switch(mode) - if(0) + if(MODE_DECONSTRUCT) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Deconstruct.") energy_drain = initial(energy_drain) - if(1) - to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Construct.") + if(MODE_WALL) + to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Construct Walls and Flooring.") energy_drain = 2*initial(energy_drain) - if(2) + if(MODE_AIRLOCK) to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]Switched RCD to Construct Airlock.") energy_drain = 2*initial(energy_drain) - return /obj/item/mecha_parts/mecha_equipment/rcd/get_equip_info() return "[..()] \[D|C|A\]" +#undef MODE_DECONSTRUCT +#undef MODE_WALL +#undef MODE_AIRLOCK + //Dunno where else to put this so shrug /obj/item/mecha_parts/mecha_equipment/ripleyupgrade name = "Ripley MK-II Conversion Kit" @@ -358,7 +322,7 @@ if(M.type != /obj/vehicle/sealed/mecha/working/ripley) to_chat(loc, "This conversion kit can only be applied to APLU MK-I models.") return FALSE - if(M.cargo.len) + if(LAZYLEN(M.cargo)) to_chat(loc, "[M]'s cargo hold must be empty before this conversion kit can be applied.") return FALSE if(!(M.mecha_flags & ADDING_MAINT_ACCESS_POSSIBLE)) //non-removable upgrade, so lets make sure the pilot or owner has their say. @@ -402,9 +366,9 @@ N.mecha_flags = M.mecha_flags N.strafe = M.strafe N.obj_integrity = M.obj_integrity //This is not a repair tool - if (M.name != "\improper APLU MK-I \"Ripley\"") + if(M.name != initial(M.name)) N.name = M.name - M.wreckage = 0 + M.wreckage = FALSE qdel(M) playsound(get_turf(N),'sound/items/ratchet.ogg',50,TRUE) return diff --git a/code/modules/vehicles/mecha/mecha_control_console.dm b/code/modules/vehicles/mecha/mecha_control_console.dm index 5bb110a3449..404eb0b4053 100644 --- a/code/modules/vehicles/mecha/mecha_control_console.dm +++ b/code/modules/vehicles/mecha/mecha_control_console.dm @@ -38,7 +38,7 @@ if(istype(M, /obj/vehicle/sealed/mecha/working/ripley)) var/obj/vehicle/sealed/mecha/working/ripley/RM = M mech_data += list( - cargo_space = round((RM.cargo.len / RM.cargo_capacity) * 100) + cargo_space = round((LAZYLEN(RM.cargo) / RM.cargo_capacity) * 100) ) data["mechs"] += list(mech_data) @@ -102,7 +102,7 @@ Active Equipment: [chassis.selected || "None"]"} if(istype(chassis, /obj/vehicle/sealed/mecha/working/ripley)) var/obj/vehicle/sealed/mecha/working/ripley/RM = chassis - answer += "
Used Cargo Space: [round((RM.cargo.len / RM.cargo_capacity * 100), 0.01)]%" + answer += "
Used Cargo Space: [round((LAZYLEN(RM.cargo) / RM.cargo_capacity * 100), 0.01)]%" return answer diff --git a/code/modules/vehicles/mecha/working/clarke.dm b/code/modules/vehicles/mecha/working/clarke.dm index 25e782ca96c..a56444ba70a 100644 --- a/code/modules/vehicles/mecha/working/clarke.dm +++ b/code/modules/vehicles/mecha/working/clarke.dm @@ -15,12 +15,9 @@ wreckage = /obj/structure/mecha_wreckage/clarke enter_delay = 40 mecha_flags = ADDING_ACCESS_POSSIBLE | IS_ENCLOSED - /// Handles an internal ore box for Clarke - var/obj/structure/ore_box/box /obj/vehicle/sealed/mecha/working/clarke/Initialize() . = ..() - box = new /obj/structure/ore_box(src) var/obj/item/mecha_parts/mecha_equipment/orebox_manager/ME = new(src) ME.attach(src) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index 59205c7c034..363485cc6bf 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -22,7 +22,7 @@ /// Amount of Goliath hides attached to the mech var/hides = 0 /// List of all things in Ripley's Cargo Compartment - var/list/cargo = new + var/list/cargo /// How much things Ripley can carry in their Cargo Compartment var/cargo_capacity = 15 @@ -38,12 +38,14 @@ initialize_passenger_action_type(/datum/action/vehicle/sealed/mecha/strafe) /obj/vehicle/sealed/mecha/working/ripley/check_for_internal_damage(list/possible_int_damage, ignore_threshold = FALSE) - if (!enclosed) - possible_int_damage -= (MECHA_INT_TEMP_CONTROL + MECHA_INT_TANK_BREACH) //if we don't even have an air tank, these two doesn't make a ton of sense. - . = ..() + if(!enclosed) //if we don't even have an air tank, these two doesn't make a ton of sense. + possible_int_damage -= (MECHA_INT_TEMP_CONTROL + MECHA_INT_TANK_BREACH) + return ..() /obj/vehicle/sealed/mecha/working/ripley/Initialize() . = ..() + //Add ore box to cargo, here because the clarke has a unremovable box + LAZYADD(cargo, box) AddComponent(/datum/component/armor_plate,3,/obj/item/stack/sheet/animalhide/goliath_hide,list(MELEE = 10, BULLET = 5, LASER = 5)) @@ -51,7 +53,7 @@ for(var/atom/movable/A in cargo) A.forceMove(drop_location()) step_rand(A) - cargo.Cut() + QDEL_LIST(cargo) return ..() /obj/vehicle/sealed/mecha/working/ripley/mk2 @@ -93,8 +95,8 @@ /obj/vehicle/sealed/mecha/working/ripley/deathripley/Initialize() . = ..() - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill - ME.attach(src) + var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/fake/clamper = new(loc) + clamper.attach(src) /obj/vehicle/sealed/mecha/working/ripley/deathripley/real desc = "OH SHIT IT'S THE DEATHSQUAD WE'RE ALL GONNA DIE. FOR REAL" @@ -105,8 +107,8 @@ E.detach() qdel(E) LAZYCLEARLIST(equipment) - var/obj/item/mecha_parts/mecha_equipment/ME = new /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/real - ME.attach(src) + var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/kill/clamper = new(loc) + clamper.attach(src) /obj/vehicle/sealed/mecha/working/ripley/mining desc = "An old, dusty mining Ripley." @@ -129,15 +131,9 @@ var/obj/item/mecha_parts/mecha_equipment/weapon/energy/plasma/P = new P.attach(src) - //Add ore box to cargo - cargo.Add(new /obj/structure/ore_box(src)) - //Attach hydraulic clamp var/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp/HC = new HC.attach(src) - for(var/obj/item/mecha_parts/mecha_tracking/B in trackers)//Deletes the beacon so it can't be found easily - qdel(B) - var/obj/item/mecha_parts/mecha_equipment/mining_scanner/scanner = new scanner.attach(src) @@ -149,27 +145,28 @@ /obj/vehicle/sealed/mecha/working/ripley/Topic(href, href_list) ..() if(href_list["drop_from_cargo"]) - var/obj/O = locate(href_list["drop_from_cargo"]) in cargo - if(O) - to_chat(occupants, "[icon2html(src, occupants)]You unload [O].") - O.forceMove(drop_location()) - cargo -= O - log_message("Unloaded [O]. Cargo compartment capacity: [cargo_capacity - src.cargo.len]", LOG_MECHA) - return + var/obj/cargoobj = locate(href_list["drop_from_cargo"]) in cargo + if(cargoobj) + to_chat(occupants, "[icon2html(src, occupants)]You unload [cargoobj].") + cargoobj.forceMove(drop_location()) + LAZYREMOVE(cargo, cargoobj) + if(cargoobj == box) + box = null + log_message("Unloaded [cargoobj]. Cargo compartment capacity: [cargo_capacity - LAZYLEN(cargo)]", LOG_MECHA) /obj/vehicle/sealed/mecha/working/ripley/contents_explosion(severity, target) - for(var/X in cargo) - var/obj/O = X + for(var/i in cargo) + var/obj/cargoobj = i if(prob(30/severity)) - cargo -= O - O.forceMove(drop_location()) - . = ..() + LAZYREMOVE(cargo, cargoobj) + cargoobj.forceMove(drop_location()) + return ..() /obj/vehicle/sealed/mecha/working/ripley/get_stats_part() var/output = ..() output += "Cargo Compartment Contents:
" - if(cargo.len) + if(LAZYLEN(cargo)) for(var/obj/O in cargo) output += "Unload : [O]
" else @@ -184,7 +181,7 @@ return to_chat(user, "You successfully pushed [O] out of [src]!") O.forceMove(drop_location()) - cargo -= O + LAZYREMOVE(cargo, O) else if(user.loc == src) //so we don't get the message if we resisted multiple times and succeeded. to_chat(user, "You fail to push [O] out of [src]!") diff --git a/code/modules/vehicles/mecha/working/working.dm b/code/modules/vehicles/mecha/working/working.dm index 5d6a8537152..e6dc3d7a6c4 100644 --- a/code/modules/vehicles/mecha/working/working.dm +++ b/code/modules/vehicles/mecha/working/working.dm @@ -1,5 +1,15 @@ /obj/vehicle/sealed/mecha/working internal_damage_threshold = 60 + /// Handles an internal ore box for working mechs + var/obj/structure/ore_box/box + +/obj/vehicle/sealed/mecha/working/Initialize() + . = ..() + box = new /obj/structure/ore_box(src) + +/obj/vehicle/sealed/mecha/working/Destroy() + QDEL_NULL(box) + return ..() /obj/vehicle/sealed/mecha/working/Move() . = ..() @@ -12,9 +22,10 @@ * Checks for a hydraulic clamp or ore box manager and if it finds an ore box inside them puts ore in the ore box. */ /obj/vehicle/sealed/mecha/working/proc/collect_ore() - if((locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment) || (locate(/obj/item/mecha_parts/mecha_equipment/orebox_manager) in equipment)) - var/obj/structure/ore_box/ore_box = locate(/obj/structure/ore_box) in contents - if(ore_box) - for(var/obj/item/stack/ore/ore in range(1, src)) - if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! - ore.forceMove(ore_box) + if(!box) + return + if(!(locate(/obj/item/mecha_parts/mecha_equipment/hydraulic_clamp) in equipment) && !(locate(/obj/item/mecha_parts/mecha_equipment/orebox_manager) in equipment)) + return + for(var/obj/item/stack/ore/ore in range(1, src)) + if(ore.Adjacent(src) && ((get_dir(src, ore) & dir) || ore.loc == loc)) //we can reach it and it's in front of us? grab it! + ore.forceMove(box)