mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-24 21:48:39 +01:00
Integrated circuits for modular computers (#80530)
## About The Pull Request This PR integrates circuits for modular computers and a good bits of their programs. The peculiarity here is that modular computers have no fixed amount of unremovable components (except the base one with just a couple ports for now), instead, they're added and removed along with programs. With a few exceptions (such as the messenger and signaler), for these program circuits to work, their associated program has to be either open or in the background. For a reason or another, not all programs have a circuit associated to them, still, however the programs with a circuit are still a handful. They are: - Nanotrasen Pay System - Notepad - SiliConnect - WireCarp - MODsuit Control - Spectre Meter - Direct Messenger* - LifeConnect - Custodial Locator - Fission360 - Camera - Status Display - SignalCommander *By the by, sending messages has a cooldown, so it shouldn't be as spammy. If it turns out to not be enough, I can make it so messages from circuit will be ignored by other messenger circuits. The PR is no longer WIP. ## Why It's Good For The Game I believe modular computers could make for some interesting setups with circuits, since they're fairly flexible and stocked with features unlike many other appliances, therefore also a speck more abusable, though limits, cooldowns, logging and sanitization have been implemented to keep it in check. ## Changelog 🆑 add: Modular Computers now support integrated circuits. What can be done with them depends on the programs installed and whether they're running (open or background). add: Modular Consoles (the machinery) now have a small backup cell they draw power from if the power goes out. /🆑
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
#define CPU_INTERACTABLE(user) (cpu && !HAS_TRAIT_FROM(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user)))
|
||||
|
||||
// Modular Computer - A machinery that is mostly just a host to the Modular Computer item.
|
||||
/obj/machinery/modular_computer
|
||||
name = "modular computer"
|
||||
@@ -9,8 +11,6 @@
|
||||
max_integrity = 300
|
||||
integrity_failure = 0.5
|
||||
|
||||
///The power cell, null by default as we use the APC we're in
|
||||
var/internal_cell = null
|
||||
///A flag that describes this device type
|
||||
var/hardware_flag = PROGRAM_CONSOLE
|
||||
/// Amount of programs that can be ran at once
|
||||
@@ -41,23 +41,42 @@
|
||||
. = ..()
|
||||
cpu = new(src)
|
||||
cpu.screen_on = TRUE
|
||||
cpu.add_shell_component(SHELL_CAPACITY_LARGE, SHELL_FLAG_USB_PORT)
|
||||
update_appearance()
|
||||
register_context()
|
||||
|
||||
/obj/machinery/modular_computer/Destroy()
|
||||
QDEL_NULL(cpu)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/modular_computer/add_context(atom/source, list/context, obj/item/held_item, mob/user)
|
||||
. = ..()
|
||||
if(isnull(held_item))
|
||||
context[SCREENTIP_CONTEXT_RMB] = "Toggle processor interaction"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
/obj/machinery/modular_computer/attack_hand_secondary(mob/user, list/modifiers)
|
||||
. = ..()
|
||||
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
|
||||
return
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user)))
|
||||
REMOVE_TRAIT(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user))
|
||||
balloon_alert(user, "now interacting with computer")
|
||||
else
|
||||
ADD_TRAIT(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user))
|
||||
balloon_alert(user, "now interacting with frame")
|
||||
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
|
||||
|
||||
/obj/machinery/modular_computer/examine(mob/user)
|
||||
if(cpu)
|
||||
return cpu.examine(user)
|
||||
return ..()
|
||||
. = cpu?.examine(user) || ..()
|
||||
. += span_info("You can toggle interaction between computer and its machinery frame with [EXAMINE_HINT("Right-Click")] while empty-handed.")
|
||||
. += span_info("Currently interacting with [EXAMINE_HINT(HAS_TRAIT_FROM(src, TRAIT_MODPC_INTERACTING_WITH_FRAME, REF(user)) ? "frame" : "computer")].")
|
||||
|
||||
/obj/machinery/modular_computer/attack_ghost(mob/dead/observer/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if(cpu)
|
||||
cpu.attack_ghost(user)
|
||||
cpu?.attack_ghost(user)
|
||||
|
||||
/obj/machinery/modular_computer/emag_act(mob/user, obj/item/card/emag/emag_card)
|
||||
if(!cpu)
|
||||
@@ -98,17 +117,14 @@
|
||||
|
||||
/obj/machinery/modular_computer/AltClick(mob/user)
|
||||
. = ..()
|
||||
if(!can_interact(user))
|
||||
if(CPU_INTERACTABLE(user) || !can_interact(user))
|
||||
return
|
||||
if(cpu)
|
||||
cpu.AltClick(user)
|
||||
cpu.AltClick(user)
|
||||
|
||||
//ATTACK HAND IGNORING PARENT RETURN VALUE
|
||||
// On-click handling. Turns on the computer if it's off and opens the GUI.
|
||||
/obj/machinery/modular_computer/interact(mob/user)
|
||||
if(cpu)
|
||||
return cpu.interact(user)
|
||||
return ..()
|
||||
return CPU_INTERACTABLE(user) ? cpu.interact(user) : ..()
|
||||
|
||||
// Modular computers can have battery in them, we handle power in previous proc, so prevent this from messing it up for us.
|
||||
/obj/machinery/modular_computer/power_change()
|
||||
@@ -118,30 +134,33 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
///Try to recharge our internal cell if it isn't fully charged.
|
||||
/obj/machinery/modular_computer/process(seconds_per_tick)
|
||||
var/obj/item/stock_parts/cell/cell = get_cell()
|
||||
if(isnull(cell) || cell.percent() >= 100)
|
||||
return
|
||||
var/power_to_draw = idle_power_usage * seconds_per_tick * 0.5
|
||||
if(!use_power_from_net(power_to_draw))
|
||||
return
|
||||
cell.give(power_to_draw)
|
||||
|
||||
/obj/machinery/modular_computer/get_cell()
|
||||
return cpu?.internal_cell
|
||||
|
||||
/obj/machinery/modular_computer/screwdriver_act(mob/user, obj/item/tool)
|
||||
if(cpu)
|
||||
return cpu.screwdriver_act(user, tool)
|
||||
return ..()
|
||||
return CPU_INTERACTABLE(user) ? cpu.screwdriver_act(user, tool) : ..()
|
||||
|
||||
/obj/machinery/modular_computer/wrench_act_secondary(mob/user, obj/item/tool)
|
||||
if(cpu)
|
||||
return cpu.wrench_act_secondary(user, tool)
|
||||
return ..()
|
||||
return CPU_INTERACTABLE(user) ? cpu.wrench_act_secondary(user, tool) : ..()
|
||||
|
||||
/obj/machinery/modular_computer/welder_act(mob/user, obj/item/tool)
|
||||
if(cpu)
|
||||
return cpu.welder_act(user, tool)
|
||||
return ..()
|
||||
return CPU_INTERACTABLE(user) ? cpu.welder_act(user, tool) : ..()
|
||||
|
||||
/obj/machinery/modular_computer/attackby(obj/item/W as obj, mob/living/user)
|
||||
if (cpu && !user.combat_mode && !(obj_flags & NO_DECONSTRUCTION))
|
||||
return cpu.attackby(W, user)
|
||||
return ..()
|
||||
/obj/machinery/modular_computer/attackby(obj/item/weapon, mob/living/user)
|
||||
return (CPU_INTERACTABLE(user) && !user.combat_mode) ? cpu.attackby(weapon, user) : ..()
|
||||
|
||||
/obj/machinery/modular_computer/attacked_by(obj/item/attacking_item, mob/living/user)
|
||||
if (cpu)
|
||||
return cpu.attacked_by(attacking_item, user)
|
||||
return ..()
|
||||
return CPU_INTERACTABLE(user) ? cpu.attacked_by(attacking_item, user) : ..()
|
||||
|
||||
// Stronger explosions cause serious damage to internal components
|
||||
// Minor explosions are mostly mitigitated by casing.
|
||||
@@ -170,6 +189,6 @@
|
||||
// "Burn" damage is equally strong against internal components and exterior casing
|
||||
// "Brute" damage mostly damages the casing.
|
||||
/obj/machinery/modular_computer/bullet_act(obj/projectile/Proj)
|
||||
if(cpu)
|
||||
return cpu.bullet_act(Proj)
|
||||
return ..()
|
||||
return cpu?.bullet_act(Proj) || ..()
|
||||
|
||||
#undef CPU_INTERACTABLE
|
||||
|
||||
Reference in New Issue
Block a user