Files
Bubberstation/code/game/shuttle_engines.dm
John Willard a4e7929a3b Lighters use welding fuel and can be used as welders in some cases (#85941)
## About The Pull Request

Lighters now have welding fuel which can be filled/extracted by hand,
giving a small but consistent source of welding fuel for non-chemists.
Welding fuel is now required for these lighters to work, they'll close
automatically once they're out of fuel.
They last for a minute, zippo lasts 2 minutes, before they need to be
refuelled. It can have other reagents put into it but it only checks for
welding fuel, so it won't work at all unless its got some.
They can be used as welding tools in minor cases, mostly fixing things
and welding doors shut, but can't do big things like deconstruction,
except the xenobio one because it's a lot hotter than the normal
lighter.

Also added a baseline support to check for heat to perform certain
welds, before heat is just this binary "has or doesnt have heat", which
made its value useless.

## Why It's Good For The Game

Adds a ghetto way of getting welding fuel, hiding reagents, and a ghetto
welding tool without being something that prisoners could break out of
prison with. They could weld the doors shut which is a little funny,
security still has proper welding tools to counter it.
It also currently is kinda lame that lighters could just be open 24/7,
unlike matches which has a lifespan of 10 seconds each or something.

## Changelog

🆑
add: Lighters now use and require welding fuel to work, but can be used
as a welding tool for tasks that don't require much heat.
/🆑

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-09-13 12:32:09 +00:00

214 lines
7.3 KiB
Plaintext

#define ENGINE_UNWRENCHED 0
#define ENGINE_WRENCHED 1
#define ENGINE_WELDED 2
///How long it takes to weld/unweld an engine in place.
#define ENGINE_WELDTIME (20 SECONDS)
/obj/machinery/power/shuttle_engine
name = "engine"
desc = "A bluespace engine used to make shuttles move."
icon = 'icons/turf/shuttle.dmi'
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
smoothing_groups = SMOOTH_GROUP_SHUTTLE_PARTS
armor_type = /datum/armor/power_shuttle_engine
can_atmos_pass = ATMOS_PASS_DENSITY
max_integrity = 500
density = TRUE
anchored = TRUE
use_power = NO_POWER_USE
circuit = /obj/item/circuitboard/machine/engine
///How well the engine affects the ship's speed.
var/engine_power = 1
///Construction state of the Engine.
var/engine_state = ENGINE_WELDED //welding shmelding //i love welding
///The mobile ship we are connected to.
var/datum/weakref/connected_ship_ref
/datum/armor/power_shuttle_engine
melee = 100
bullet = 10
laser = 10
fire = 50
acid = 70
/obj/machinery/power/shuttle_engine/Initialize(mapload)
. = ..()
register_context()
/obj/machinery/power/shuttle_engine/connect_to_shuttle(mapload, obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
. = ..()
if(!port)
return FALSE
connected_ship_ref = WEAKREF(port)
port.engine_list += src
port.current_engine_power += engine_power
if(mapload)
port.initial_engine_power += engine_power
/obj/machinery/power/shuttle_engine/Destroy()
if(engine_state == ENGINE_WELDED)
alter_engine_power(-engine_power)
unsync_ship()
return ..()
/obj/machinery/power/shuttle_engine/examine(mob/user)
. = ..()
switch(engine_state)
if(ENGINE_UNWRENCHED)
. += span_notice("\The [src] is unbolted from the floor. It needs to be wrenched to the floor to be installed.")
if(ENGINE_WRENCHED)
. += span_notice("\The [src] is bolted to the floor and can be unbolted with a wrench. It needs to be welded to the floor to finish installation.")
if(ENGINE_WELDED)
. += span_notice("\The [src] is welded to the floor and can be unwelded. It is currently fully installed.")
/obj/machinery/power/shuttle_engine/add_context(atom/source, list/context, obj/item/held_item, mob/living/user)
if(held_item?.tool_behaviour == TOOL_WELDER && engine_state == ENGINE_WRENCHED)
context[SCREENTIP_CONTEXT_LMB] = "Weld to Floor"
if(held_item?.tool_behaviour == TOOL_WELDER && engine_state == ENGINE_WELDED)
context[SCREENTIP_CONTEXT_LMB] = "Unweld from Floor"
if(held_item?.tool_behaviour == TOOL_WRENCH && engine_state == ENGINE_UNWRENCHED)
context[SCREENTIP_CONTEXT_LMB] = "Wrench to Floor"
if(held_item?.tool_behaviour == TOOL_WRENCH && engine_state == ENGINE_WRENCHED)
context[SCREENTIP_CONTEXT_LMB] = "Unwrench from Floor"
return CONTEXTUAL_SCREENTIP_SET
/**
* Called on destroy and when we need to unsync an engine from their ship.
*/
/obj/machinery/power/shuttle_engine/proc/unsync_ship()
var/obj/docking_port/mobile/port = connected_ship_ref?.resolve()
if(port)
port.engine_list -= src
port.current_engine_power -= initial(engine_power)
connected_ship_ref = null
//Ugh this is a lot of copypasta from emitters, welding need some boilerplate reduction
/obj/machinery/power/shuttle_engine/can_be_unfasten_wrench(mob/user, silent)
if(engine_state == ENGINE_WELDED)
if(!silent)
to_chat(user, span_warning("[src] is welded to the floor!"))
return FAILED_UNFASTEN
return ..()
/obj/machinery/power/shuttle_engine/default_unfasten_wrench(mob/user, obj/item/tool, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
if(anchored)
connect_to_shuttle(port = SSshuttle.get_containing_shuttle(src)) //connect to a new ship, if needed
engine_state = ENGINE_WRENCHED
else
unsync_ship() //not part of the ship anymore
engine_state = ENGINE_UNWRENCHED
/obj/machinery/power/shuttle_engine/wrench_act(mob/living/user, obj/item/tool)
. = ..()
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
/obj/machinery/power/shuttle_engine/welder_act(mob/living/user, obj/item/tool)
. = ..()
switch(engine_state)
if(ENGINE_UNWRENCHED)
to_chat(user, span_warning("The [src.name] needs to be wrenched to the floor!"))
if(ENGINE_WRENCHED)
if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED))
return TRUE
user.visible_message(span_notice("[user.name] starts to weld the [name] to the floor."), \
span_notice("You start to weld \the [src] to the floor..."), \
span_hear("You hear welding."))
if(tool.use_tool(src, user, ENGINE_WELDTIME, volume=50))
engine_state = ENGINE_WELDED
to_chat(user, span_notice("You weld \the [src] to the floor."))
alter_engine_power(engine_power)
if(ENGINE_WELDED)
if(!tool.tool_start_check(user, amount=round(ENGINE_WELDTIME / 5), heat_required = HIGH_TEMPERATURE_REQUIRED))
return TRUE
user.visible_message(span_notice("[user.name] starts to cut the [name] free from the floor."), \
span_notice("You start to cut \the [src] free from the floor..."), \
span_hear("You hear welding."))
if(tool.use_tool(src, user, ENGINE_WELDTIME, volume=50))
engine_state = ENGINE_WRENCHED
to_chat(user, span_notice("You cut \the [src] free from the floor."))
alter_engine_power(-engine_power)
return TRUE
//Propagates the change to the shuttle.
/obj/machinery/power/shuttle_engine/proc/alter_engine_power(mod)
if(!mod)
return
var/obj/docking_port/mobile/port = connected_ship_ref?.resolve()
if(port)
port.alter_engines(mod)
/obj/machinery/power/shuttle_engine/heater
name = "engine heater"
desc = "Directs energy into compressed particles in order to power engines."
icon_state = "heater"
circuit = /obj/item/circuitboard/machine/engine/heater
engine_power = 0 // todo make these into 2x1 parts
/obj/machinery/power/shuttle_engine/propulsion
name = "propulsion engine"
icon_state = "propulsion"
desc = "A standard reliable bluespace engine used by many forms of shuttles."
circuit = /obj/item/circuitboard/machine/engine/propulsion
opacity = TRUE
/obj/machinery/power/shuttle_engine/propulsion/left
name = "left propulsion engine"
icon_state = "propulsion_l"
/obj/machinery/power/shuttle_engine/propulsion/right
name = "right propulsion engine"
icon_state = "propulsion_r"
/obj/machinery/power/shuttle_engine/propulsion/burst
name = "burst engine"
desc = "An engine that releases a large bluespace burst to propel it."
/obj/machinery/power/shuttle_engine/propulsion/burst/cargo
engine_state = ENGINE_UNWRENCHED
anchored = FALSE
/obj/machinery/power/shuttle_engine/propulsion/burst/left
name = "left burst engine"
icon_state = "burst_l"
/obj/machinery/power/shuttle_engine/propulsion/burst/right
name = "right burst engine"
icon_state = "burst_r"
/obj/machinery/power/shuttle_engine/large
name = "engine"
icon = 'icons/obj/fluff/2x2.dmi'
icon_state = "large_engine"
desc = "A very large bluespace engine used to propel very large ships."
circuit = null
opacity = TRUE
bound_width = 64
bound_height = 64
appearance_flags = LONG_GLIDE
/obj/machinery/power/shuttle_engine/huge
name = "engine"
icon = 'icons/obj/fluff/3x3.dmi'
icon_state = "huge_engine"
desc = "An extremely large bluespace engine used to propel extremely large ships."
circuit = null
opacity = TRUE
bound_width = 96
bound_height = 96
appearance_flags = LONG_GLIDE
#undef ENGINE_UNWRENCHED
#undef ENGINE_WRENCHED
#undef ENGINE_WELDED
#undef ENGINE_WELDTIME