[MIRROR] Mining mechas refactors (#1026)

* Mining mechas refactors (#53676)

* Mining mechas refactors

Co-authored-by: TiviPlus <57223640+TiviPlus@users.noreply.github.com>
This commit is contained in:
SkyratBot
2020-09-29 00:17:23 +02:00
committed by GitHub
co-authored by TiviPlus
parent 1ba1b08ce8
commit 172ecc409c
7 changed files with 220 additions and 250 deletions
@@ -116,6 +116,7 @@
/obj/item/mecha_parts/mecha_equipment/proc/can_attach(obj/vehicle/sealed/mecha/M)
if(LAZYLEN(M.equipment)<M.max_equip)
return TRUE
return FALSE
/obj/item/mecha_parts/mecha_equipment/proc/attach(obj/vehicle/sealed/mecha/M)
LAZYADD(M.equipment, src)
@@ -11,4 +11,4 @@
if(locate(/obj/item/mecha_parts/concealed_weapon_bay) in M.contents)
to_chat(user, "<span class='warning'>[M] already has a concealed weapon bay!</span>")
return
..()
return ..()
@@ -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("<span class='notice'>[chassis] lifts [target] and starts to load it into cargo compartment.</span>")
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)]<span class='notice'>[target] successfully loaded.</span>")
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)]<span class='warning'>Not enough room in cargo compartment!</span>")
else
if(clamptarget.anchored)
to_chat(source, "[icon2html(src, source)]<span class='warning'>[target] is firmly secured!</span>")
return
if(LAZYLEN(cargo_holder.cargo) >= cargo_holder.cargo_capacity)
to_chat(source, "[icon2html(src, source)]<span class='warning'>Not enough room in cargo compartment!</span>")
return
chassis.visible_message("<span class='notice'>[chassis] lifts [target] and starts to load it into cargo compartment.</span>")
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)]<span class='notice'>[target] successfully loaded.</span>")
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("<span class='danger'>[chassis] squeezes [target]!</span>", \
"<span class='userdanger'>[chassis] squeezes you!</span>",\
"<span class='hear'>You hear something crack.</span>")
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)]<span class='notice'>You push [target] out of the way.</span>")
chassis.visible_message("<span class='notice'>[chassis] pushes [target] out of the way.</span>")
if(killer_clamp)
target.visible_message("<span class='danger'>[chassis] tosses [target] like a piece of paper!</span>", \
"<span class='userdanger'>[chassis] tosses you like a piece of paper!</span>")
else
to_chat(source, "[icon2html(src, source)]<span class='notice'>You push [target] out of the way.</span>")
chassis.visible_message("<span class='notice'>[chassis] pushes [target] out of the way.</span>", \
"<span class='notice'>[chassis] pushes you aside.</span>")
return ..()
else if(source.a_intent == INTENT_DISARM && iscarbon(M))//meme clamp here
if(!killer_clamp)
to_chat(source, "<span class='notice'>You longingly wish to tear [M]'s arms off.</span>")
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, "<span class='notice'>[M]'s arms are already torn off, you must find a challenger worthy of the kill clamp!</span>")
return
playsound(src, get_dismember_sound(), 80, TRUE)
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off!</span>", \
"<span class='userdanger'>[chassis] rips your arms off!</span>")
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("<span class='danger'>[chassis] squeezes [target]!</span>", \
"<span class='userdanger'>[chassis] squeezes you!</span>",\
"<span class='hear'>You hear something crack.</span>")
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("<span class='notice'>[chassis] lifts [target] and starts to load it into cargo compartment.</span>")
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)]<span class='notice'>[target] successfully loaded.</span>")
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)]<span class='warning'>Not enough room in cargo compartment!</span>")
else
to_chat(source, "[icon2html(src, source)]<span class='warning'>[target] is firmly secured!</span>")
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("<span class='danger'>[chassis] destroys [target] in an unholy fury!</span>", \
"<span class='userdanger'>[chassis] destroys you in an unholy fury!</span>")
log_combat(source, M, "attacked", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
else
target.visible_message("<span class='danger'>[chassis] destroys [target] in an unholy fury!</span>", \
"<span class='userdanger'>[chassis] destroys you in an unholy fury!</span>")
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("<span class='danger'>[chassis] rips [target]'s arms off!</span>", \
"<span class='userdanger'>[chassis] rips your arms off!</span>")
log_combat(source, M, "dismembered of[limbs_gone],", "[name]", "(INTENT: [uppertext(source.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
else
target.visible_message("<span class='danger'>[chassis] rips [target]'s arms off!</span>", \
"<span class='userdanger'>[chassis] rips your arms off!</span>")
else
step_away(M,chassis)
target.visible_message("<span class='danger'>[chassis] tosses [target] like a piece of paper!</span>", \
"<span class='userdanger'>[chassis] tosses you like a piece of paper!</span>")
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)]<span class='notice'>Extinguisher refilled.</span>")
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)]<span class='notice'>Deconstructing [target]...</span>")
if(iswallturf(target))
var/turf/closed/wall/W = target
to_chat(source, "[icon2html(src, source)]<span class='notice'>Deconstructing [W]...</span>")
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)]<span class='notice'>Deconstructing [F]...</span>")
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)]<span class='notice'>Deconstructing [target]...</span>")
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)]<span class='notice'>Building Floor...</span>")
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)]<span class='notice'>Building Wall...</span>")
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)]<span class='notice'>Building Airlock...</span>")
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)]<span class='notice'>Switched RCD to Deconstruct.</span>")
energy_drain = initial(energy_drain)
if(1)
to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]<span class='notice'>Switched RCD to Construct.</span>")
if(MODE_WALL)
to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]<span class='notice'>Switched RCD to Construct Walls and Flooring.</span>")
energy_drain = 2*initial(energy_drain)
if(2)
if(MODE_AIRLOCK)
to_chat(chassis.occupants, "[icon2html(src, chassis.occupants)]<span class='notice'>Switched RCD to Construct Airlock.</span>")
energy_drain = 2*initial(energy_drain)
return
/obj/item/mecha_parts/mecha_equipment/rcd/get_equip_info()
return "[..()] \[<a href='?src=[REF(src)];mode=0'>D</a>|<a href='?src=[REF(src)];mode=1'>C</a>|<a href='?src=[REF(src)];mode=2'>A</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, "<span class='warning'>This conversion kit can only be applied to APLU MK-I models.</span>")
return FALSE
if(M.cargo.len)
if(LAZYLEN(M.cargo))
to_chat(loc, "<span class='warning'>[M]'s cargo hold must be empty before this conversion kit can be applied.</span>")
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
@@ -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 @@
<b>Active Equipment:</b> [chassis.selected || "None"]"}
if(istype(chassis, /obj/vehicle/sealed/mecha/working/ripley))
var/obj/vehicle/sealed/mecha/working/ripley/RM = chassis
answer += "<br><b>Used Cargo Space:</b> [round((RM.cargo.len / RM.cargo_capacity * 100), 0.01)]%"
answer += "<br><b>Used Cargo Space:</b> [round((LAZYLEN(RM.cargo) / RM.cargo_capacity * 100), 0.01)]%"
return answer
@@ -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)
+26 -29
View File
@@ -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)]<span class='notice'>You unload [O].</span>")
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)]<span class='notice'>You unload [cargoobj].</span>")
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 += "<b>Cargo Compartment Contents:</b><div style=\"margin-left: 15px;\">"
if(cargo.len)
if(LAZYLEN(cargo))
for(var/obj/O in cargo)
output += "<a href='?src=[REF(src)];drop_from_cargo=[REF(O)]'>Unload</a> : [O]<br>"
else
@@ -184,7 +181,7 @@
return
to_chat(user, "<span class='notice'>You successfully pushed [O] out of [src]!</span>")
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, "<span class='warning'>You fail to push [O] out of [src]!</span>")
+17 -6
View File
@@ -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)