Skip to content

Commit

Permalink
Ports from Nova
Browse files Browse the repository at this point in the history
  • Loading branch information
thgvr committed Oct 10, 2024
1 parent f86f9b9 commit a640945
Show file tree
Hide file tree
Showing 20 changed files with 295 additions and 58 deletions.
1 change: 0 additions & 1 deletion _maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -2441,7 +2441,6 @@
"MB" = (
/obj/structure/flora/ausbushes/sparsegrass,
/obj/effect/decal/cleanable/blood/splatter,
/obj/item/weldingtool/experimental,
/turf/open/floor/grass,
/area/overmap_encounter/planetoid/jungle/explored)
"MF" = (
Expand Down
4 changes: 0 additions & 4 deletions _maps/RandomRuins/SpaceRuins/spacemall.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -7900,10 +7900,6 @@
/obj/item/clothing/head/hardhat/weldhat/dblue{
pixel_y = 5
},
/obj/item/weldingtool/experimental{
pixel_y = 5
},
/obj/item/weldingtool/experimental,
/obj/effect/turf_decal/siding/wideplating/dark/end{
dir = 8
},
Expand Down
2 changes: 0 additions & 2 deletions _maps/map_files/generic/CentCom.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -13170,7 +13170,6 @@
/obj/effect/turf_decal/industrial/warning,
/obj/effect/decal/cleanable/dirt,
/obj/structure/reagent_dispensers/fueltank,
/obj/item/weldingtool/experimental,
/obj/machinery/power/terminal{
dir = 8
},
Expand Down Expand Up @@ -16172,7 +16171,6 @@
/area/centcom)
"wbx" = (
/obj/structure/reagent_dispensers/fueltank,
/obj/item/weldingtool/experimental,
/obj/effect/decal/cleanable/oil,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/industrial/warning,
Expand Down
13 changes: 13 additions & 0 deletions code/__DEFINES/cells.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
//General defines for items that use power and the cell component.
/// The minimal amount of power an item can use.
#define POWER_CELL_USE_MINIMUM 1
/// For items that barely use any power at all.
#define POWER_CELL_USE_VERY_LOW 10
/// For items that generally wouldn't use very much power.
#define POWER_CELL_USE_LOW 30
/// For items that use a average amount of power.
#define POWER_CELL_USE_NORMAL 50
/// For items that use a high amount of power.
#define POWER_CELL_USE_HIGH 70
/// For items that use A LOT OF POWER.
#define POWER_CELL_USE_INSANE 100
8 changes: 8 additions & 0 deletions code/__DEFINES/dcs/signals/signals.dm
Original file line number Diff line number Diff line change
Expand Up @@ -744,3 +744,11 @@
#define COMSIG_ADDED_POINT_OF_INTEREST "added_point_of_interest"
/// Sent from base of /datum/controller/subsystem/points_of_interest/proc/on_poi_element_removed : (atom/old_poi)
#define COMSIG_REMOVED_POINT_OF_INTEREST "removed_point_of_interest"

// Power signals
/// Sent when an obj/item calls item_use_power: (use_amount, user, check_only)
#define COMSIG_ITEM_POWER_USE "item_use_power"
#define NO_COMPONENT NONE
#define COMPONENT_POWER_SUCCESS (1<<0)
#define COMPONENT_NO_CELL (1<<1)
#define COMPONENT_NO_CHARGE (1<<2)
178 changes: 178 additions & 0 deletions code/datums/components/cell_component.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
/*
CELL COMPONENT
What we aim to achieve with cell components is a universal framework for all items that would logically use batteries,
Be it a flashlight, T-ray scanner or multitool. All of them would logically require batteries right? Well, welcome,
to the cell component.
General logic:
Component attaches to parent(flashlight etc)
Registers onhit signal to check if it's being slapped by a battery
Component moves battery to equipment loc, keeps a record, and then communicates with
the equipment and controls the behaviour of said equipment.
If it's a robot, it uses the robot cell - Using certified shitcode.(this needs redone)
If you are adding this to an item that is active for a period of time, register signal to COMSIG_CELL_START_USE when it would start using the cell
and COMSIG_CELL_STOP_USE when it should stop. To handle the turning off of said item once the cell is depleted, add your code into the
component_cell_out_of_charge/component_cell_removed proc using loc where necessary, processing is done in the component!
*/

/datum/component/cell
/// Our reference to the inserted cell, which will be stored in the parent.
var/obj/item/stock_parts/cell/inserted_cell
/// The item reference to parent.
var/obj/item/equipment
/// How much power do we use each process?
var/power_use_amount = POWER_CELL_USE_NORMAL
/// Are we using a robot's powersource?
var/inside_robot = FALSE
/// Callback interaction for when the cell is removed.
var/datum/callback/on_cell_removed = null
///Can this cell be removed from the parent?
var/cell_can_be_removed = TRUE
///Our reference to the cell overlay
var/mutable_appearance/cell_overlay = null

/datum/component/cell/Initialize(cell_override, _on_cell_removed, _power_use_amount, start_with_cell = TRUE, _cell_can_be_removed)
if(!isitem(parent)) //Currently only compatable with items.
return COMPONENT_INCOMPATIBLE

equipment = parent //We'd like a simple reference to the atom this component is attached to instead of having to declare it every time we use it.

if(_on_cell_removed)
src.on_cell_removed = _on_cell_removed

if(_power_use_amount)
power_use_amount = _power_use_amount
else
power_use_amount = equipment.power_use_amount

if(_cell_can_be_removed)
cell_can_be_removed = _cell_can_be_removed

if(start_with_cell)
var/obj/item/stock_parts/cell/new_cell
if(cell_override)
new_cell = new cell_override()
else
new_cell = new /obj/item/stock_parts/cell/upgraded()
inserted_cell = new_cell
new_cell.forceMove(parent) //We use the parents location so things like EMP's can interact with the cell.
handle_cell_overlays()
return ..()

/datum/component/cell/RegisterWithParent()
//Component to Parent signal registries
RegisterSignal(parent, COMSIG_ITEM_POWER_USE, .proc/simple_power_use)
RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, .proc/insert_cell)
RegisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT , .proc/remove_cell)
RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine_cell)

/datum/component/cell/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_ITEM_POWER_USE)
UnregisterSignal(parent, COMSIG_PARENT_ATTACKBY)
UnregisterSignal(parent, COMSIG_CLICK_CTRL_SHIFT)
UnregisterSignal(parent, COMSIG_PARENT_EXAMINE)

/datum/component/cell/Destroy(force, silent)
if(on_cell_removed)
QDEL_NULL(on_cell_removed)
if(inserted_cell)
if(!inside_robot) //We really don't want to be deleting the robot's cell.
QDEL_NULL(inserted_cell)
inserted_cell = null
return ..()

/// This proc is the basic way of processing the cell, with included feedback. It will return a bitflag if it failed to use the power, or COMPONENT_POWER_SUCCESS if it succeeds.
/// The user is sent the feedback, use_amount is an override, check_only will only return if it can use the cell and feedback relating to that.
/datum/component/cell/proc/simple_power_use(datum/source, use_amount, mob/user, check_only)
SIGNAL_HANDLER

if(!use_amount)
use_amount = power_use_amount

if(!inserted_cell)
if(user)
to_chat(user, "<span class='danger'>There is no cell inside [equipment]</span>")
return COMPONENT_NO_CELL

if(check_only && inserted_cell.charge < use_amount)
if(user)
to_chat(user, "<span class='danger'>The cell inside [equipment] does not have enough charge to perform this action!</span>")
return COMPONENT_NO_CHARGE

if(!inserted_cell.use(use_amount))
inserted_cell.update_appearance() //Updates the attached cell sprite - Why does this not happen in cell.use?
if(user)
to_chat(user, "<span class='danger'>The cell inside [equipment] does not have enough charge to perform this action!</span>")
return COMPONENT_NO_CHARGE

inserted_cell.update_appearance()

return COMPONENT_POWER_SUCCESS

/datum/component/cell/proc/examine_cell(atom/A, mob/user, list/examine_list)
SIGNAL_HANDLER

if(!inserted_cell)
examine_list += "<span class='danger'>It does not have a cell inserted!</span>"
else if(!inside_robot)
examine_list += "<span class='notice'>It has [inserted_cell] inserted. It has <b>[inserted_cell.percent()]%</b> charge left."
else
examine_list += "<span class='notice'>It is drawing power from an external powersource, reading <b>[inserted_cell.percent()]%</b> charge.</span>"

/// Handling of cell removal.
/datum/component/cell/proc/remove_cell(datum/source, mob/user)
if(!equipment.can_interact(user))
return

if(inside_robot)
return

if(!cell_can_be_removed)
return

if(inserted_cell)
to_chat(user, "<span class='notice'>You remove [inserted_cell] from [equipment]!</span>")
playsound(equipment, 'sound/weapons/magout.ogg', 40, TRUE)
inserted_cell.forceMove(get_turf(equipment))
INVOKE_ASYNC(user, /mob/living.proc/put_in_hands, inserted_cell)
inserted_cell = null
if(on_cell_removed)
on_cell_removed.Invoke()
handle_cell_overlays(TRUE)
else
to_chat(user, "<span class='danger'>There is no cell inserted in [equipment]!</span>")

/// Handling of cell insertion.
/datum/component/cell/proc/insert_cell(datum/source, obj/item/inserting_item, mob/living/user, params)
if(!equipment.can_interact(user))
return

if(inside_robot) //More robot shitcode, if we allowed them to remove the cell, it would cause the universe to implode.
return

if(!istype(inserting_item, /obj/item/stock_parts/cell))
return

if(inserted_cell) //No quickswap compatibility
to_chat(user, "<span class='danger'>There is already a cell inserted in [equipment]!</span>")
return

to_chat(user, "<span class='notice'>You insert [inserting_item] into [equipment]!</span>")
playsound(equipment, 'sound/weapons/magin.ogg', 40, TRUE)
inserted_cell = inserting_item
inserting_item.forceMove(parent)
handle_cell_overlays(FALSE)

/datum/component/cell/proc/handle_cell_overlays(update_overlays)
if(inserted_cell)
cell_overlay = mutable_appearance(equipment.icon, "[initial(equipment.icon_state)]_cell")
equipment.add_overlay(cell_overlay)
else
QDEL_NULL(cell_overlay)
cell_overlay = null
if(update_overlays)
equipment.overlays.Cut()
equipment.update_overlays()
1 change: 0 additions & 1 deletion code/game/gamemodes/sandbox/h_sandbox.dm
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ GLOBAL_VAR_INIT(hsboxspawn, TRUE)
"Standard Tools",
"Spawn Flashlight" = "hsbspawn&path=[/obj/item/flashlight]",
"Spawn Toolbox" = "hsbspawn&path=[/obj/item/storage/toolbox/mechanical]",
"Spawn Experimental Welding tool" = "hsbspawn&path=[/obj/item/weldingtool/experimental]",
"Spawn Light Replacer" = "hsbspawn&path=[/obj/item/lightreplacer]",
"Spawn Medical Kit" = "hsbspawn&path=[/obj/item/storage/firstaid/regular]",
"Spawn All-Access ID" = "hsbaaid",
Expand Down
7 changes: 7 additions & 0 deletions code/game/objects/items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,8 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
var/strip_delay = 40
///How long it takes to resist out of the item (cuffs and such)
var/breakouttime = 0
///How much power would this item use?
var/power_use_amount = POWER_CELL_USE_NORMAL

/// Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]"
var/list/attack_verb
Expand Down Expand Up @@ -965,6 +967,11 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb
/obj/item/proc/remove_outline()
remove_filter(HOVER_OUTLINE_FILTER)

/// Use the power of an attached component that posesses power handling, will return the signal bitflag.
/obj/item/proc/item_use_power(use_amount, mob/user, check_only)
SHOULD_CALL_PARENT(TRUE)
return SEND_SIGNAL(src, COMSIG_ITEM_POWER_USE, use_amount, user, check_only)

/// Called when a mob tries to use the item as a tool.Handles most checks.
/obj/item/proc/use_tool(atom/target, mob/living/user, delay, amount=0, volume=0, datum/callback/extra_checks)
// we have no target, why are we even doing this?
Expand Down
2 changes: 0 additions & 2 deletions code/game/objects/items/storage/belt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@
/obj/item/storage/belt/utility/chief/full/PopulateContents()
new /obj/item/screwdriver/power(src)
new /obj/item/crowbar/power(src)
new /obj/item/weldingtool/experimental(src)//This can be changed if this is too much
new /obj/item/multitool(src)
new /obj/item/stack/cable_coil(src,MAXCOIL,pick("red","yellow","orange"))
new /obj/item/extinguisher/mini(src)
Expand Down Expand Up @@ -143,7 +142,6 @@
/obj/item/storage/belt/utility/full/ert/PopulateContents()
new /obj/item/screwdriver/power(src)
new /obj/item/crowbar/power(src)
new /obj/item/weldingtool/experimental(src)
new /obj/item/multitool(src)
new /obj/item/construction/rcd/combat(src)
new /obj/item/extinguisher/mini(src)
Expand Down
82 changes: 82 additions & 0 deletions code/game/objects/items/tools/electric_weldingtool.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/obj/item/weldingtool/electric
name = "electrical welding tool"
desc = "An experimental welding tool capable of welding functionality through the use of electricity. The flame seems almost cold."
icon_state = "elwelder"
light_power = 1
light_color = LIGHT_COLOR_HALOGEN
tool_behaviour = NONE
toolspeed = 0.5 //twice as fast, but doesn't require welding fuel
power_use_amount = POWER_CELL_USE_LOW
// We don't use fuel
change_icons = FALSE
var/cell_override = /obj/item/stock_parts/cell/high
var/powered = FALSE
max_fuel = 20 //uses fuel anyways like a boss

/obj/item/weldingtool/electric/Initialize(mapload)
. = ..()
AddComponent(/datum/component/cell, cell_override, CALLBACK(src, PROC_REF(switched_off)))

/obj/item/weldingtool/electric/attack_self(mob/user, modifiers)
. = ..()
if(!powered)
if(!(item_use_power(power_use_amount, user, TRUE) & COMPONENT_POWER_SUCCESS))
return
powered = !powered
playsound(src, 'sound/effects/sparks4.ogg', 100, TRUE)
if(powered)
to_chat(user, span_notice("You turn [src] on."))
switched_on()
return
to_chat(user, span_notice("You turn [src] off."))
switched_off()

/obj/item/weldingtool/electric/switched_on(mob/user)
welding = TRUE
tool_behaviour = TOOL_WELDER
light_on = TRUE
force = 15
damtype = BURN
hitsound = 'sound/items/welder.ogg'
set_light_on(powered)
update_appearance()
START_PROCESSING(SSobj, src)

/obj/item/weldingtool/electric/switched_off(mob/user)
powered = FALSE
welding = FALSE
light_on = FALSE
force = initial(force)
damtype = BRUTE
set_light_on(powered)
tool_behaviour = NONE
update_appearance()
STOP_PROCESSING(SSobj, src)

/obj/item/weldingtool/electric/process(seconds_per_tick)
if(!powered)
switched_off()
return
if(!(item_use_power(power_use_amount) & COMPONENT_POWER_SUCCESS))
switched_off()
return

// We don't need to know how much fuel it has, because it doesn't use any.
/obj/item/weldingtool/electric/examine(mob/user)
. = ..()
. -= "It contains [get_fuel()] unit\s of fuel out of [max_fuel]."

// This is what uses fuel in the parent. We override it here to not use fuel
/obj/item/weldingtool/electric/use(used = 0)
return isOn()

/obj/item/weldingtool/electric/examine()
. = ..()
. += "[src] is currently [powered ? "powered" : "unpowered"]."

/obj/item/weldingtool/electric/update_icon_state()
if(powered)
mob_overlay_icon = "[initial(mob_overlay_icon)]1"
else
mob_overlay_icon = "[initial(mob_overlay_icon)]"
return ..()
23 changes: 0 additions & 23 deletions code/game/objects/items/tools/weldingtool.dm
Original file line number Diff line number Diff line change
Expand Up @@ -351,29 +351,6 @@
/obj/item/weldingtool/hugetank/empty
start_full = FALSE

/obj/item/weldingtool/experimental
name = "experimental welding tool"
desc = "An experimental welder capable of self-fuel generation and less harmful to the eyes."
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
custom_materials = list(/datum/material/iron=70, /datum/material/glass=120)
/*WS Begin - Better Tool sprites
change_icons = 0
WS End */
can_off_process = 1
light_range = 1
toolspeed = 0.5
wall_decon_damage = 100
var/last_gen = 0
var/nextrefueltick = 0

/obj/item/weldingtool/experimental/process()
..()
if(get_fuel() < max_fuel && nextrefueltick < world.time)
nextrefueltick = world.time + 10
reagents.add_reagent(/datum/reagent/fuel, 1)

/obj/item/weldingtool/old
desc = "A standard edition welder provided by Nanotrasen. This one seems to leak a little bit."
icon = 'icons/obj/tools.dmi'
Expand Down
Loading

0 comments on commit a640945

Please sign in to comment.