mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 00:29:02 +01:00
[MIRROR] Reworks Mech Extinguisher to be utility equipment, related balance changes. [MDB IGNORE] (#12929)
* Reworks Mech Extinguisher to be utility equipment, related balance changes. (#66058) The extinguisher is now utility rather than an active equipment mount. This means it no longer takes up one of a mech's limited hardpoint slots. Mech extinguishers now extinguish in a 3x3 grid around (and including) themselves. Mech extinguishers now use 80u of water, and store a maximum of 400u. This adds up to five uses before needing a refil. * Reworks Mech Extinguisher to be utility equipment, related balance changes. Co-authored-by: zxaber <37497534+zxaber@users.noreply.github.com>
This commit is contained in:
@@ -161,67 +161,74 @@
|
||||
icon_state = "mecha_exting"
|
||||
equip_cooldown = 5
|
||||
energy_drain = 0
|
||||
equipment_slot = MECHA_UTILITY
|
||||
range = MECHA_MELEE|MECHA_RANGED
|
||||
mech_flags = EXOSUIT_MODULE_WORKING
|
||||
var/sprays_left = 0
|
||||
///Minimum amount of reagent needed to activate.
|
||||
var/required_amount = 80
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/Initialize(mapload)
|
||||
. = ..()
|
||||
create_reagents(1000)
|
||||
reagents.add_reagent(/datum/reagent/water, 1000)
|
||||
create_reagents(400)
|
||||
reagents.add_reagent(/datum/reagent/water, 400)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/action(mob/source, atom/target, list/modifiers)
|
||||
if(!action_checks(target) || get_dist(chassis, target)>3)
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/spray_extinguisher(mob/user)
|
||||
if(reagents.total_volume < required_amount)
|
||||
return
|
||||
|
||||
if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
|
||||
var/obj/structure/reagent_dispensers/watertank/WT = target
|
||||
WT.reagents.trans_to(src, 1000)
|
||||
to_chat(source, "[icon2html(src, source)][span_notice("Extinguisher refilled.")]")
|
||||
playsound(chassis, 'sound/effects/refill.ogg', 50, TRUE, -6)
|
||||
return
|
||||
for(var/turf/targetturf in RANGE_TURFS(1, chassis))
|
||||
var/obj/effect/particle_effect/water/extinguisher/water = new /obj/effect/particle_effect/water/extinguisher(targetturf)
|
||||
var/datum/reagents/water_reagents = new /datum/reagents(required_amount/8) //required_amount/8, because the water usage is split between eight sprays. As of this comment, required_amount/8 = 10u each.
|
||||
water.reagents = water_reagents
|
||||
water_reagents.my_atom = water
|
||||
reagents.trans_to(water, required_amount/8)
|
||||
water.move_at(get_step(chassis, get_dir(targetturf, chassis)), 2, 4) //Target is the tile opposite of the mech as the starting turf.
|
||||
|
||||
if(reagents.total_volume <= 0)
|
||||
return
|
||||
playsound(chassis, 'sound/effects/extinguish.ogg', 75, TRUE, -3)
|
||||
|
||||
sprays_left += 5
|
||||
add_hiddenprint(source) //log prints so admins can figure out who touched it last.
|
||||
log_combat(source, target, "fired an extinguisher at")
|
||||
spray_extinguisher(target)
|
||||
return ..()
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/spray_extinguisher(atom/target)
|
||||
var/direction = get_dir(chassis, target)
|
||||
var/turf/T1 = get_turf(target)
|
||||
var/turf/T2 = get_step(T1,turn(direction, 90))
|
||||
var/turf/T3 = get_step(T1,turn(direction, -90))
|
||||
var/list/targets = list(T1,T2,T3)
|
||||
|
||||
var/obj/effect/particle_effect/water/extinguisher/water = new /obj/effect/particle_effect/water/extinguisher(get_turf(chassis))
|
||||
var/datum/reagents/water_reagents = new /datum/reagents(5)
|
||||
water.reagents = water_reagents
|
||||
water_reagents.my_atom = water
|
||||
reagents.trans_to(water, 1)
|
||||
|
||||
var/delay = 2
|
||||
var/datum/move_loop/our_loop = water.move_at(pick(targets), delay, 4)
|
||||
RegisterSignal(our_loop, COMSIG_PARENT_QDELETING, .proc/water_finished_moving)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/water_finished_moving(datum/move_loop/has_target/source)
|
||||
SIGNAL_HANDLER
|
||||
sprays_left--
|
||||
if(!sprays_left)
|
||||
/**
|
||||
* Handles attemted refills of the extinguisher.
|
||||
*
|
||||
* The mech can only refill an extinguisher that is in front of it.
|
||||
* Only water tank objects can be used.
|
||||
*/
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/proc/attempt_refill(mob/user)
|
||||
if(reagents.maximum_volume == reagents.total_volume)
|
||||
return
|
||||
extinguish(source.target)
|
||||
var/turf/in_front = get_step(chassis, chassis.dir)
|
||||
var/obj/structure/reagent_dispensers/watertank/refill_source = locate(/obj/structure/reagent_dispensers/watertank) in in_front
|
||||
if(!refill_source)
|
||||
to_chat(user, span_notice("Refill failed. No compatible tank found."))
|
||||
return
|
||||
if(!refill_source.reagents?.total_volume)
|
||||
to_chat(user, span_notice("Refill failed. Source tank empty."))
|
||||
return
|
||||
|
||||
refill_source.reagents.trans_to(src, reagents.maximum_volume)
|
||||
playsound(chassis, 'sound/effects/refill.ogg', 50, TRUE, -6)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/get_snowflake_data()
|
||||
return list(
|
||||
"snowflake_id" = MECHA_SNOWFLAKE_ID_EXTINGUISHER,
|
||||
"reagents" = reagents.total_volume,
|
||||
"total_reagents" = reagents.maximum_volume,
|
||||
"minimum_requ" = required_amount,
|
||||
)
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/ui_act(action, list/params)
|
||||
. = ..()
|
||||
if(.)
|
||||
return TRUE
|
||||
switch(action)
|
||||
if("activate")
|
||||
spray_extinguisher(usr)
|
||||
return TRUE
|
||||
if("refill")
|
||||
attempt_refill(usr)
|
||||
return TRUE
|
||||
|
||||
|
||||
/obj/item/mecha_parts/mecha_equipment/extinguisher/can_attach(obj/vehicle/sealed/mecha/M, attach_right = FALSE)
|
||||
. = ..()
|
||||
if(!.)
|
||||
|
||||
@@ -117,7 +117,6 @@ const BallisticStats = (props: {weapon: MechWeapon}, context) => {
|
||||
const MECHA_SNOWFLAKE_ID_SLEEPER = "sleeper_snowflake";
|
||||
const MECHA_SNOWFLAKE_ID_SYRINGE = "syringe_snowflake";
|
||||
const MECHA_SNOWFLAKE_ID_MODE = "mode_snowflake";
|
||||
const MECHA_SNOWFLAKE_ID_EXTINGUISHER = "extinguisher_snowflake";
|
||||
|
||||
// Handles all the snowflake buttons and whatever
|
||||
const Snowflake = (props: {weapon: MechWeapon}, context) => {
|
||||
@@ -129,8 +128,6 @@ const Snowflake = (props: {weapon: MechWeapon}, context) => {
|
||||
return <SnowflakeSleeper weapon={props.weapon} />;
|
||||
case MECHA_SNOWFLAKE_ID_SYRINGE:
|
||||
return <SnowflakeSyringe weapon={props.weapon} />;
|
||||
case MECHA_SNOWFLAKE_ID_EXTINGUISHER:
|
||||
return <SnowflakeExtinguisher weapon={props.weapon} />;
|
||||
case MECHA_SNOWFLAKE_ID_MODE:
|
||||
return <SnowflakeMode weapon={props.weapon} />;
|
||||
default:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useBackend } from '../../backend';
|
||||
import { Button, LabeledList } from '../../components';
|
||||
import { Button, LabeledList, ProgressBar } from '../../components';
|
||||
import { OperatorData, MechaUtility } from './data';
|
||||
|
||||
export const UtilityModulesPane = (props, context) => {
|
||||
@@ -36,6 +36,7 @@ export const UtilityModulesPane = (props, context) => {
|
||||
};
|
||||
|
||||
const MECHA_SNOWFLAKE_ID_EJECTOR = "ejector_snowflake";
|
||||
const MECHA_SNOWFLAKE_ID_EXTINGUISHER = "extinguisher_snowflake";
|
||||
|
||||
// Handles all the snowflake buttons and whatever
|
||||
const Snowflake = (props: {module: MechaUtility}, context) => {
|
||||
@@ -45,6 +46,8 @@ const Snowflake = (props: {module: MechaUtility}, context) => {
|
||||
switch (snowflake["snowflake_id"]) {
|
||||
case MECHA_SNOWFLAKE_ID_EJECTOR:
|
||||
return <SnowflakeEjector module={props.module} />;
|
||||
case MECHA_SNOWFLAKE_ID_EXTINGUISHER:
|
||||
return <SnowflakeExtinguisher module={props.module} />;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
@@ -72,3 +75,50 @@ const SnowflakeEjector = (props: {module: MechaUtility}, context) => {
|
||||
</LabeledList>
|
||||
);
|
||||
};
|
||||
|
||||
const SnowflakeExtinguisher = (props: {module: MechaUtility}, context) => {
|
||||
const { act, data } = useBackend<OperatorData>(context);
|
||||
return (
|
||||
<>
|
||||
<ProgressBar
|
||||
value={props.module.snowflake.reagents}
|
||||
minValue={0}
|
||||
maxValue={props.module.snowflake.total_reagents}>
|
||||
{props.module.snowflake.reagents}
|
||||
</ProgressBar>
|
||||
<Button
|
||||
tooltip={"ACTIVATE"}
|
||||
color={"red"}
|
||||
disabled={
|
||||
props.module.snowflake.reagents < props.module.snowflake.minimum_requ
|
||||
? 1 : 0
|
||||
}
|
||||
icon={"fire-extinguisher"}
|
||||
onClick={() => act('equip_act', {
|
||||
ref: props.module.ref,
|
||||
gear_action: "activate",
|
||||
})} />
|
||||
<Button
|
||||
tooltip={"REFILL"}
|
||||
icon={"fill"}
|
||||
onClick={() => act('equip_act', {
|
||||
ref: props.module.ref,
|
||||
gear_action: "refill",
|
||||
})} />
|
||||
<Button
|
||||
tooltip={"REPAIR"}
|
||||
icon={"wrench"}
|
||||
onClick={() => act('equip_act', {
|
||||
ref: props.module.ref,
|
||||
gear_action: "repair",
|
||||
})} />
|
||||
<Button
|
||||
tooltip={"DETACH"}
|
||||
icon={"arrow-down"}
|
||||
onClick={() => act('equip_act', {
|
||||
ref: props.module.ref,
|
||||
gear_action: "detach",
|
||||
})} />
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user