From fd9a7f8a581a189d9ff9b4164dd7065e4f372134 Mon Sep 17 00:00:00 2001 From: Fikou <23585223+Fikou@users.noreply.github.com> Date: Sat, 15 Jan 2022 13:54:53 +0100 Subject: [PATCH] MOD update: Modular Cores (#64042) * Modsuit update - Cores --- .../map_files/Deltastation/DeltaStation2.dmm | 6 +- .../map_files/IceBoxStation/IceBoxStation.dmm | 6 +- _maps/map_files/KiloStation/KiloStation.dmm | 4 +- _maps/map_files/MetaStation/MetaStation.dmm | 6 +- code/__DEFINES/actions.dm | 11 + code/__DEFINES/dcs/signals/signals_mod.dm | 8 +- code/__DEFINES/mod.dm | 2 +- code/__HELPERS/roundend.dm | 2 +- code/_onclick/hud/action_button.dm | 5 +- code/_onclick/hud/alert.dm | 6 + code/controllers/subsystem/vote.dm | 2 +- code/datums/action.dm | 39 +-- code/datums/components/crafting/recipes.dm | 19 +- code/datums/martial/krav_maga.dm | 6 +- code/datums/martial/wrestling.dm | 10 +- .../machinery/porta_turret/portable_turret.dm | 4 +- code/game/machinery/suit_storage_unit.dm | 6 +- code/game/objects/items/crayons.dm | 3 + code/game/objects/items/devices/multitool.dm | 2 +- .../antagonists/_common/antag_datum.dm | 2 +- .../changeling/changeling_power.dm | 2 +- .../changeling/powers/tiny_prick.dm | 4 +- .../traitor/equipment/Malf_Modules.dm | 2 +- code/modules/cargo/packs.dm | 6 +- code/modules/clothing/chameleon.dm | 8 +- code/modules/clothing/outfits/standard.dm | 6 +- code/modules/detectivework/scanner.dm | 2 +- code/modules/mining/lavaland/tendril_loot.dm | 3 +- .../carbon/human/species_types/dullahan.dm | 2 +- .../carbon/human/species_types/vampire.dm | 2 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- .../mob/living/silicon/pai/pai_actions.dm | 12 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../simple_animal/hostile/bosses/boss.dm | 4 +- .../hostile/bosses/paperwizard.dm | 4 +- .../simple_animal/hostile/giant_spider.dm | 4 +- .../simple_animal/hostile/mecha_pilot.dm | 12 +- .../hostile/megafauna/blood_drunk_miner.dm | 10 +- .../hostile/megafauna/bubblegum.dm | 8 +- .../hostile/megafauna/colossus.dm | 8 +- .../hostile/megafauna/demonic_frost_miner.dm | 12 +- .../simple_animal/hostile/megafauna/drake.dm | 12 +- .../hostile/mining_mobs/lobstrosity.dm | 2 +- .../mob/living/simple_animal/hostile/ooze.dm | 2 +- code/modules/mod/adding_new_mod.md | 323 ++++++++++++++++++ code/modules/mod/mod_actions.dm | 61 ++-- code/modules/mod/mod_activation.dm | 24 +- code/modules/mod/mod_ai.dm | 8 +- code/modules/mod/mod_clothes.dm | 44 +-- code/modules/mod/mod_construction.dm | 19 +- code/modules/mod/mod_control.dm | 175 ++++++---- code/modules/mod/mod_core.dm | 246 +++++++++++++ code/modules/mod/mod_theme.dm | 119 ++++--- code/modules/mod/mod_types.dm | 123 ++++--- code/modules/mod/mod_ui.dm | 4 +- code/modules/mod/modules/_module.dm | 24 +- code/modules/mod/modules/modules_antag.dm | 16 +- .../mod/modules/modules_engineering.dm | 16 +- code/modules/mod/modules/modules_general.dm | 43 ++- code/modules/mod/modules/modules_maint.dm | 44 ++- code/modules/mod/modules/modules_medical.dm | 8 +- code/modules/mod/modules/modules_science.dm | 19 +- code/modules/mod/modules/modules_security.dm | 16 +- code/modules/mod/modules/modules_service.dm | 8 +- code/modules/mod/modules/modules_supply.dm | 10 +- code/modules/mod/modules/modules_timeline.dm | 41 +-- code/modules/mod/modules/modules_visor.dm | 2 +- code/modules/power/cell.dm | 4 - code/modules/projectiles/gun.dm | 2 +- .../designs/mechfabricator_designs.dm | 25 +- code/modules/research/techweb/all_nodes.dm | 2 + .../xenobiology/crossbreeding/_clothing.dm | 4 +- .../ruins/spaceruin_code/hilbertshotel.dm | 2 +- code/modules/surgery/dental_implant.dm | 2 +- code/modules/surgery/organs/heart.dm | 2 +- code/modules/surgery/organs/tongue.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 4 +- code/modules/vehicles/mecha/combat/durand.dm | 2 +- .../vehicles/mecha/combat/savannah_ivanov.dm | 4 +- code/modules/vehicles/mecha/mecha_actions.dm | 28 +- code/modules/vehicles/vehicle_actions.dm | 20 +- .../wiremod/shell/brain_computer_interface.dm | 2 +- icons/hud/radial.dmi | Bin 26384 -> 26541 bytes icons/mob/clothing/mod.dmi | Bin 118331 -> 120094 bytes icons/obj/clothing/modsuit/mod_clothing.dmi | Bin 68184 -> 68394 bytes .../obj/clothing/modsuit/mod_construction.dmi | Bin 4116 -> 4361 bytes icons/obj/clothing/modsuit/mod_modules.dmi | Bin 36923 -> 36799 bytes tgstation.dme | 2 + tgui/packages/tgui/interfaces/MODsuit.js | 14 +- 89 files changed, 1240 insertions(+), 556 deletions(-) create mode 100644 code/__DEFINES/actions.dm create mode 100644 code/modules/mod/adding_new_mod.md create mode 100644 code/modules/mod/mod_core.dm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 831533dec81..f9443c9c35d 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -25385,13 +25385,13 @@ }, /obj/structure/table/reinforced, /obj/effect/turf_decal/bot, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = -4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = 4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_y = 4 }, /turf/open/floor/iron, diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index b585a71fd19..cba03f56cc5 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -6856,13 +6856,13 @@ /obj/effect/turf_decal/tile/red{ dir = 4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = -4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = 4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_y = 4 }, /obj/structure/table, diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index a3a6514b031..624c368a087 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -9649,10 +9649,10 @@ /obj/machinery/ecto_sniffer{ pixel_x = -6 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = -4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = 4 }, /turf/open/floor/iron/dark, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 28367a9bf23..6c821d3b611 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -29160,13 +29160,13 @@ name = "Robotics Privacy Control"; req_access_txt = "29" }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = -4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_x = 4 }, -/obj/item/mod/construction/core{ +/obj/item/mod/core/standard{ pixel_y = 4 }, /obj/structure/closet/crate/science{ diff --git a/code/__DEFINES/actions.dm b/code/__DEFINES/actions.dm new file mode 100644 index 00000000000..b4ee3d76e2c --- /dev/null +++ b/code/__DEFINES/actions.dm @@ -0,0 +1,11 @@ +///Action button checks if hands are unusable +#define AB_CHECK_HANDS_BLOCKED (1<<0) +///Action button checks if user is immobile +#define AB_CHECK_IMMOBILE (1<<1) +///Action button checks if user is resting +#define AB_CHECK_LYING (1<<2) +///Action button checks if user is conscious +#define AB_CHECK_CONSCIOUS (1<<3) + +///Action button triggered with right click +#define TRIGGER_SECONDARY_ACTION (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm index ff60666a157..26a8f2b80c0 100644 --- a/code/__DEFINES/dcs/signals/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -10,6 +10,12 @@ /// Cancels the removal of modules #define MOD_CANCEL_REMOVAL (1 << 0) /// Called when a module attempts to activate, however it does. At the end of checks so you can add some yourself, or work on trigger behavior (mob/user) -#define COMSIG_MOD_MODULE_TRIGGERED "mod_module_triggered" +#define COMSIG_MODULE_TRIGGERED "mod_module_triggered" // Cancels activation, with no message. include feedback on your cancel. #define MOD_ABORT_USE (1<<0) +/// Called when a module activates, after all checks have passed and cooldown started. +#define COMSIG_MODULE_ACTIVATED "mod_module_activated" +/// Called when a module deactivates, after all checks have passed. +#define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated" +/// Called when a module is used, after all checks have passed and cooldown started. +#define COMSIG_MODULE_USED "mod_module_used" diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index d92cfdc212e..1ffc12d601f 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -2,7 +2,7 @@ #define DEFAULT_MAX_COMPLEXITY 15 /// Default cell drain per process on MODsuits -#define DEFAULT_CELL_DRAIN 5 +#define DEFAULT_CHARGE_DRAIN 5 /// Default time for a part to seal #define MOD_ACTIVATION_STEP_TIME 2 SECONDS diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 6486ebe619a..dab964915bd 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -643,7 +643,7 @@ name = "Show roundend report" button_icon_state = "round_end" -/datum/action/report/Trigger() +/datum/action/report/Trigger(trigger_flags) if(owner && GLOB.common_report && SSticker.current_state == GAME_STATE_FINISHED) SSticker.show_roundend_report(owner.client) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 94c8c461997..ffd1a480b12 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -64,7 +64,10 @@ if(usr.next_click > world.time) return usr.next_click = world.time + 1 - linked_action.Trigger() + var/trigger_flags + if(LAZYACCESS(modifiers, RIGHT_CLICK)) + trigger_flags |= TRIGGER_SECONDARY_ACTION + linked_action.Trigger(trigger_flags = trigger_flags) return TRUE //Hide/Show Action Buttons ... Button diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 07e044ecd3a..b1f5e3be100 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -629,6 +629,12 @@ Recharging stations are available in robotics, the dormitory bathrooms, and the desc = "Your charge is running dangerously high, find an outlet for your energy! Right click an APC while not in combat mode." icon_state = "cell_overcharge" +//MODsuit unique +/atom/movable/screen/alert/nocore + name = "Missing Core" + desc = "Unit has no core. No modules available until a core is reinstalled. Robotics may provide assistance." + icon_state = "no_cell" + //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg /atom/movable/screen/alert/hacked name = "Hacked" diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index 4e649795ab8..250479d85d7 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -313,7 +313,7 @@ SUBSYSTEM_DEF(vote) name = "Vote!" button_icon_state = "vote" -/datum/action/vote/Trigger() +/datum/action/vote/Trigger(trigger_flags) if(owner) owner.vote() remove_from_client() diff --git a/code/datums/action.dm b/code/datums/action.dm index ec8c09b0970..caa0b66d967 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -1,8 +1,3 @@ -#define AB_CHECK_HANDS_BLOCKED (1<<0) -#define AB_CHECK_IMMOBILE (1<<1) -#define AB_CHECK_LYING (1<<2) -#define AB_CHECK_CONSCIOUS (1<<3) - /datum/action var/name = "Generic Action" var/desc @@ -105,7 +100,7 @@ button.locked = FALSE button.id = null -/datum/action/proc/Trigger() +/datum/action/proc/Trigger(trigger_flags) if(!IsAvailable()) return FALSE if(SEND_SIGNAL(src, COMSIG_ACTION_TRIGGER, src) & COMPONENT_ACTION_BLOCK_TRIGGER) @@ -204,7 +199,7 @@ UNSETEMPTY(I.actions) return ..() -/datum/action/item_action/Trigger() +/datum/action/item_action/Trigger(trigger_flags) . = ..() if(!.) return FALSE @@ -233,7 +228,7 @@ /datum/action/item_action/toggle_light name = "Toggle Light" -/datum/action/item_action/toggle_light/Trigger() +/datum/action/item_action/toggle_light/Trigger(trigger_flags) if(istype(target, /obj/item/pda)) var/obj/item/pda/P = target P.toggle_light(owner) @@ -299,7 +294,7 @@ /datum/action/item_action/toggle_welding_screen name = "Toggle Welding Screen" -/datum/action/item_action/toggle_welding_screen/Trigger() +/datum/action/item_action/toggle_welding_screen/Trigger(trigger_flags) var/obj/item/clothing/head/hardhat/weldhat/H = target if(istype(H)) H.toggle_welding_screen(owner) @@ -307,7 +302,7 @@ /datum/action/item_action/toggle_welding_screen/plasmaman name = "Toggle Welding Screen" -/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger() +/datum/action/item_action/toggle_welding_screen/plasmaman/Trigger(trigger_flags) var/obj/item/clothing/head/helmet/space/plasmaman/H = target if(istype(H)) H.toggle_welding_screen(owner) @@ -325,7 +320,7 @@ UnregisterSignal(target, COMSIG_SUIT_SPACE_TOGGLE) return ..() -/datum/action/item_action/toggle_spacesuit/Trigger() +/datum/action/item_action/toggle_spacesuit/Trigger(trigger_flags) var/obj/item/clothing/suit/space/suit = target if(!istype(suit)) return @@ -362,7 +357,7 @@ button_icon_state = "berserk_mode" background_icon_state = "bg_demon" -/datum/action/item_action/berserk_mode/Trigger() +/datum/action/item_action/berserk_mode/Trigger(trigger_flags) if(istype(target, /obj/item/clothing/head/hooded/berserker)) var/obj/item/clothing/head/hooded/berserker/berzerk = target if(berzerk.berserk_active) @@ -410,7 +405,7 @@ if(istype(Target, /obj/item/picket_sign)) S = Target -/datum/action/item_action/nano_picket_sign/Trigger() +/datum/action/item_action/nano_picket_sign/Trigger(trigger_flags) if(istype(S)) S.retext(owner) @@ -462,7 +457,7 @@ button_icon_state = "scan_mode" var/active = FALSE -/datum/action/item_action/toggle_research_scanner/Trigger() +/datum/action/item_action/toggle_research_scanner/Trigger(trigger_flags) if(IsAvailable()) active = !active if(active) @@ -482,7 +477,7 @@ name = "Use Instrument" desc = "Use the instrument specified" -/datum/action/item_action/instrument/Trigger() +/datum/action/item_action/instrument/Trigger(trigger_flags) if(istype(target, /obj/item/instrument)) var/obj/item/instrument/I = target I.interact(usr) @@ -531,7 +526,7 @@ button.screen_loc = "6:157,4:-2" button.moved = "6:157,4:-2" -/datum/action/item_action/cult_dagger/Trigger() +/datum/action/item_action/cult_dagger/Trigger(trigger_flags) for(var/obj/item/held_item as anything in owner.held_items) // In case we were already holding a dagger if(istype(held_item, /obj/item/melee/cultblade/dagger)) held_item.attack_self(owner) @@ -567,7 +562,7 @@ COOLDOWN_DECLARE(box_cooldown) ///Handles opening and closing the box. -/datum/action/item_action/agent_box/Trigger() +/datum/action/item_action/agent_box/Trigger(trigger_flags) . = ..() if(!.) return FALSE @@ -631,7 +626,7 @@ S.action = null return ..() -/datum/action/spell_action/Trigger() +/datum/action/spell_action/Trigger(trigger_flags) if(!..()) return FALSE if(target) @@ -671,7 +666,7 @@ check_flags = NONE var/active = 0 -/datum/action/innate/Trigger() +/datum/action/innate/Trigger(trigger_flags) if(!..()) return FALSE if(!active) @@ -733,7 +728,7 @@ UpdateButtonIcon() START_PROCESSING(SSfastprocess, src) -/datum/action/cooldown/Trigger(atom/target) +/datum/action/cooldown/Trigger(trigger_flags, atom/target) . = ..() if(!.) return @@ -845,7 +840,7 @@ button_icon_state = "language_menu" check_flags = NONE -/datum/action/language_menu/Trigger() +/datum/action/language_menu/Trigger(trigger_flags) if(!..()) return FALSE if(ismob(owner)) @@ -903,7 +898,7 @@ small_icon_state = "arachnid_mini" background_icon_state = "bg_demon" -/datum/action/small_sprite/Trigger() +/datum/action/small_sprite/Trigger(trigger_flags) ..() if(!small) var/image/I = image(icon = small_icon, icon_state = small_icon_state, loc = owner) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index ba0b15a4ac8..f889933fb83 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -1216,14 +1216,27 @@ category = CAT_MISC /datum/crafting_recipe/mod_core - name = "MOD core" - result = /obj/item/mod/construction/core + name = "MOD core (Standard)" + result = /obj/item/mod/core/standard tool_behaviors = list(TOOL_SCREWDRIVER) time = 10 SECONDS reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 2, /obj/item/stack/sheet/glass = 1, - /obj/item/organ/heart/ethereal = 1 + /obj/item/organ/heart/ethereal = 1, + ) + category = CAT_MISC + +/datum/crafting_recipe/mod_core + name = "MOD core (Ethereal)" + result = /obj/item/mod/core/ethereal + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 10 SECONDS + reqs = list(/datum/reagent/consumable/liquidelectricity = 5, + /obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/reagent_containers/syringe = 1, ) category = CAT_MISC diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index beee30a9074..df491f5a0f7 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -10,7 +10,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "neckchop" -/datum/action/neck_chop/Trigger() +/datum/action/neck_chop/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't use [name] while you're incapacitated.")) return @@ -26,7 +26,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "legsweep" -/datum/action/leg_sweep/Trigger() +/datum/action/leg_sweep/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't use [name] while you're incapacitated.")) return @@ -42,7 +42,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "lungpunch" -/datum/action/lung_punch/Trigger() +/datum/action/lung_punch/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't use [name] while you're incapacitated.")) return diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm index d8c4d2b3063..2ebece40d3b 100644 --- a/code/datums/martial/wrestling.dm +++ b/code/datums/martial/wrestling.dm @@ -52,7 +52,7 @@ If you make a derivative work from this code, you must include this notification name = "Slam (Cinch) - Slam a grappled opponent into the floor." button_icon_state = "wrassle_slam" -/datum/action/slam/Trigger() +/datum/action/slam/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) return @@ -63,7 +63,7 @@ If you make a derivative work from this code, you must include this notification name = "Throw (Cinch) - Spin a cinched opponent around and throw them." button_icon_state = "wrassle_throw" -/datum/action/throw_wrassle/Trigger() +/datum/action/throw_wrassle/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) return @@ -74,7 +74,7 @@ If you make a derivative work from this code, you must include this notification name = "Kick - A powerful kick, sends people flying away from you. Also useful for escaping from bad situations." button_icon_state = "wrassle_kick" -/datum/action/kick/Trigger() +/datum/action/kick/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) return @@ -85,7 +85,7 @@ If you make a derivative work from this code, you must include this notification name = "Strike - Hit a neaby opponent with a quick attack." button_icon_state = "wrassle_strike" -/datum/action/strike/Trigger() +/datum/action/strike/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) return @@ -96,7 +96,7 @@ If you make a derivative work from this code, you must include this notification name = "Drop - Smash down onto an opponent." button_icon_state = "wrassle_drop" -/datum/action/drop/Trigger() +/datum/action/drop/Trigger(trigger_flags) if(owner.incapacitated()) to_chat(owner, span_warning("You can't WRESTLE while you're OUT FOR THE COUNT.")) return diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 2f4c7aa70c2..840e40c3d9a 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -645,7 +645,7 @@ DEFINE_BITFIELD(turret_flags, list( icon_icon = 'icons/mob/actions/actions_mecha.dmi' button_icon_state = "mech_cycle_equip_off" -/datum/action/turret_toggle/Trigger() +/datum/action/turret_toggle/Trigger(trigger_flags) var/obj/machinery/porta_turret/P = target if(!istype(P)) return @@ -656,7 +656,7 @@ DEFINE_BITFIELD(turret_flags, list( icon_icon = 'icons/mob/actions/actions_mecha.dmi' button_icon_state = "mech_eject" -/datum/action/turret_quit/Trigger() +/datum/action/turret_quit/Trigger(trigger_flags) var/obj/machinery/porta_turret/P = target if(!istype(P)) return diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 46151d3194e..eeee11af9d2 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -431,11 +431,9 @@ return cell = suit.cell else if(mod) - if(!istype(mod)) + cell = mod.get_charge_source() + if(!istype(cell)) return - if(!mod.cell) - return - cell = mod.cell else return use_power(charge_rate * delta_time) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 5fc5cd2d37f..d6fe09c8088 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -817,6 +817,9 @@ return SECONDARY_ATTACK_CONTINUE_CHAIN +/obj/item/toy/crayon/spraycan/attackby_storage_insert(datum/component/storage, atom/storage_holder, mob/user) + return is_capped + /obj/item/toy/crayon/spraycan/update_icon_state() icon_state = is_capped ? icon_capped : icon_uncapped return ..() diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 3ec5a92c6f9..7aa675e3cde 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -154,7 +154,7 @@ name = "Toggle AI detector HUD" check_flags = NONE -/datum/action/item_action/toggle_multitool/Trigger() +/datum/action/item_action/toggle_multitool/Trigger(trigger_flags) if(!..()) return FALSE if(target) diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index d7fb789734a..19b5aca1f33 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -488,7 +488,7 @@ GLOBAL_LIST_EMPTY(antagonists) . = ..() name += " [target]" -/datum/action/antag_info/Trigger() +/datum/action/antag_info/Trigger(trigger_flags) . = ..() if(!.) return diff --git a/code/modules/antagonists/changeling/changeling_power.dm b/code/modules/antagonists/changeling/changeling_power.dm index cb35f799ef8..dd9ca14309b 100644 --- a/code/modules/antagonists/changeling/changeling_power.dm +++ b/code/modules/antagonists/changeling/changeling_power.dm @@ -30,7 +30,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p if(needs_button) Grant(user)//how powers are added rather than the checks in mob.dm -/datum/action/changeling/Trigger() +/datum/action/changeling/Trigger(trigger_flags) var/mob/user = owner if(!user || !user.mind || !user.mind.has_antag_datum(/datum/antagonist/changeling)) return diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index effb2b645d1..3841e2ae6d9 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -2,7 +2,7 @@ name = "Tiny Prick" desc = "Stabby stabby" -/datum/action/changeling/sting/Trigger() +/datum/action/changeling/sting/Trigger(trigger_flags) var/mob/user = owner if(!user || !user.mind) return @@ -72,7 +72,7 @@ dna_cost = 3 var/datum/changeling_profile/selected_dna = null -/datum/action/changeling/sting/transformation/Trigger() +/datum/action/changeling/sting/transformation/Trigger(trigger_flags) var/mob/user = usr var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) if(changeling.chosen_sting) diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 4857b371825..88fbc34a969 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(malf_modules, subtypesof(/datum/ai_module)) if(owner_AI && owner_AI.malf_cooldown > world.time) return -/datum/action/innate/ai/Trigger() +/datum/action/innate/ai/Trigger(trigger_flags) . = ..() if(auto_use_uses) adjust_uses(-1) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 30f3af6af5b..65e6ceb4133 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1462,9 +1462,9 @@ cost = CARGO_CRATE_VALUE * 3 access = ACCESS_ROBOTICS access_view = ACCESS_ROBOTICS - contains = list(/obj/item/mod/construction/core, - /obj/item/mod/construction/core, - /obj/item/mod/construction/core) + contains = list(/obj/item/mod/core/standard, + /obj/item/mod/core/standard, + /obj/item/mod/core/standard) crate_name = "MOD core crate" crate_type = /obj/structure/closet/crate/secure/science diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 3c5f7c6b62e..419603d2720 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -5,7 +5,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "random" -/datum/action/item_action/chameleon/drone/randomise/Trigger() +/datum/action/item_action/chameleon/drone/randomise/Trigger(trigger_flags) if(!IsAvailable()) return @@ -32,7 +32,7 @@ if (istype(target, /obj/item/clothing/mask/chameleon/drone)) button_icon_state = "drone_camogear_mask" -/datum/action/item_action/chameleon/drone/togglehatmask/Trigger() +/datum/action/item_action/chameleon/drone/togglehatmask/Trigger(trigger_flags) if(!IsAvailable()) return @@ -87,7 +87,7 @@ sortTim(standard_outfit_options, /proc/cmp_text_asc) outfit_options = standard_outfit_options -/datum/action/chameleon_outfit/Trigger() +/datum/action/chameleon_outfit/Trigger(trigger_flags) return select_outfit(owner) /datum/action/chameleon_outfit/proc/select_outfit(mob/user) @@ -240,7 +240,7 @@ else atom_target.icon = initial(picked_item.icon) -/datum/action/item_action/chameleon/change/Trigger() +/datum/action/item_action/chameleon/change/Trigger(trigger_flags) if(!IsAvailable()) return diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 9d7f28167e5..8d2b1734b34 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -402,12 +402,12 @@ uniform = /obj/item/clothing/under/color/white suit_store = /obj/item/tank/internals/oxygen mask = /obj/item/clothing/mask/breath - back = /obj/item/mod/control/pre_equipped/timeline + back = /obj/item/mod/control/pre_equipped/chrono /datum/outfit/chrono_agent/post_equip(mob/living/carbon/human/agent, visualsOnly) . = ..() - var/obj/item/mod/control/pre_equipped/timeline = agent.back - var/obj/item/mod/module/eradication_lock/lock = locate(/obj/item/mod/module/eradication_lock) in timeline.modules + var/obj/item/mod/control/mod = agent.back + var/obj/item/mod/module/eradication_lock/lock = locate(/obj/item/mod/module/eradication_lock) in mod.modules lock.true_owner_ckey = agent.ckey /datum/outfit/debug //Debug objs plus MODsuit diff --git a/code/modules/detectivework/scanner.dm b/code/modules/detectivework/scanner.dm index 04d92cfb662..f3af29917d6 100644 --- a/code/modules/detectivework/scanner.dm +++ b/code/modules/detectivework/scanner.dm @@ -25,7 +25,7 @@ /datum/action/item_action/display_detective_scan_results name = "Display Forensic Scanner Results" -/datum/action/item_action/display_detective_scan_results/Trigger() +/datum/action/item_action/display_detective_scan_results/Trigger(trigger_flags) var/obj/item/detective_scanner/scanner = target if(istype(scanner)) scanner.displayDetectiveScanResults(usr) diff --git a/code/modules/mining/lavaland/tendril_loot.dm b/code/modules/mining/lavaland/tendril_loot.dm index ccc5be638fd..8738b7d7ac6 100644 --- a/code/modules/mining/lavaland/tendril_loot.dm +++ b/code/modules/mining/lavaland/tendril_loot.dm @@ -200,7 +200,7 @@ name = "Memento Mori" desc = "Bind your life to the pendant." -/datum/action/item_action/hands_free/memento_mori/Trigger() +/datum/action/item_action/hands_free/memento_mori/Trigger(trigger_flags) var/obj/item/clothing/neck/necklace/memento_mori/MM = target if(!MM.active_owner) if(ishuman(owner)) @@ -633,7 +633,6 @@ . += span_notice("Berserk mode is [berserk_charge]% charged.") /obj/item/clothing/head/hooded/berserker/process(delta_time) - . = ..() if(berserk_active) berserk_charge = clamp(berserk_charge - CHARGE_DRAINED_PER_SECOND * delta_time, 0, MAX_BERSERK_CHARGE) if(!berserk_charge) diff --git a/code/modules/mob/living/carbon/human/species_types/dullahan.dm b/code/modules/mob/living/carbon/human/species_types/dullahan.dm index bccbfb9d153..fa138083f80 100644 --- a/code/modules/mob/living/carbon/human/species_types/dullahan.dm +++ b/code/modules/mob/living/carbon/human/species_types/dullahan.dm @@ -143,7 +143,7 @@ name = "Toggle Perspective" desc = "Switch between seeing normally from your head, or blindly from your body." -/datum/action/item_action/organ_action/dullahan/Trigger() +/datum/action/item_action/organ_action/dullahan/Trigger(trigger_flags) . = ..() var/obj/item/organ/eyes/dullahan/dullahan_eyes = target dullahan_eyes.tint = dullahan_eyes.tint ? NONE : INFINITY diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 48b8e6758cb..d981c6f0425 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -85,7 +85,7 @@ name = "Drain Victim" desc = "Leech blood from any carbon victim you are passively grabbing." -/datum/action/item_action/organ_action/vampire/Trigger() +/datum/action/item_action/organ_action/vampire/Trigger(trigger_flags) . = ..() if(iscarbon(owner)) var/mob/living/carbon/H = owner diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index bad54cf1681..d6b98ecd04b 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -961,7 +961,7 @@ icon_icon = 'icons/mob/actions/actions_AI.dmi' button_icon_state = "ai_shell" -/datum/action/innate/deploy_shell/Trigger() +/datum/action/innate/deploy_shell/Trigger(trigger_flags) var/mob/living/silicon/ai/AI = owner if(!AI) return @@ -974,7 +974,7 @@ button_icon_state = "ai_last_shell" var/mob/living/silicon/robot/last_used_shell -/datum/action/innate/deploy_last_shell/Trigger() +/datum/action/innate/deploy_last_shell/Trigger(trigger_flags) if(!owner) return if(last_used_shell) diff --git a/code/modules/mob/living/silicon/pai/pai_actions.dm b/code/modules/mob/living/silicon/pai/pai_actions.dm index c6e92cea578..cd1015d2506 100644 --- a/code/modules/mob/living/silicon/pai/pai_actions.dm +++ b/code/modules/mob/living/silicon/pai/pai_actions.dm @@ -3,7 +3,7 @@ icon_icon = 'icons/mob/actions/actions_silicon.dmi' var/mob/living/silicon/pai/pai_owner -/datum/action/innate/pai/Trigger() +/datum/action/innate/pai/Trigger(trigger_flags) if(!ispAI(owner)) return FALSE pai_owner = owner @@ -13,7 +13,7 @@ button_icon_state = "pai" background_icon_state = "bg_tech" -/datum/action/innate/pai/software/Trigger() +/datum/action/innate/pai/software/Trigger(trigger_flags) ..() pai_owner.ui_act() @@ -22,7 +22,7 @@ button_icon_state = "pai_holoform" background_icon_state = "bg_tech" -/datum/action/innate/pai/shell/Trigger() +/datum/action/innate/pai/shell/Trigger(trigger_flags) ..() if(pai_owner.holoform) pai_owner.fold_in(0) @@ -34,7 +34,7 @@ button_icon_state = "pai_chassis" background_icon_state = "bg_tech" -/datum/action/innate/pai/chassis/Trigger() +/datum/action/innate/pai/chassis/Trigger(trigger_flags) ..() pai_owner.choose_chassis() @@ -43,7 +43,7 @@ button_icon_state = "pai_rest" background_icon_state = "bg_tech" -/datum/action/innate/pai/rest/Trigger() +/datum/action/innate/pai/rest/Trigger(trigger_flags) ..() pai_owner.toggle_resting() @@ -53,6 +53,6 @@ button_icon_state = "emp" background_icon_state = "bg_tech" -/datum/action/innate/pai/light/Trigger() +/datum/action/innate/pai/light/Trigger(trigger_flags) ..() pai_owner.toggle_integrated_light() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5462e589087..439cc41c2b6 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -854,7 +854,7 @@ icon_icon = 'icons/mob/actions/actions_AI.dmi' button_icon_state = "ai_core" -/datum/action/innate/undeployment/Trigger() +/datum/action/innate/undeployment/Trigger(trigger_flags) if(!..()) return FALSE var/mob/living/silicon/robot/R = owner diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index 9dfeb167a7f..5ecdf09d6ec 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -52,7 +52,7 @@ var/needs_target = TRUE //Does the boss need to have a target? (Only matters for the AI) var/say_when_triggered = "" //What does the boss Say() when the ability triggers? -/datum/action/boss/Trigger() +/datum/action/boss/Trigger(trigger_flags) . = ..() if(!.) return @@ -73,7 +73,7 @@ //Example: /* -/datum/action/boss/selfgib/Trigger() +/datum/action/boss/selfgib/Trigger(trigger_flags) if(..()) boss.gib() */ diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm index 5067643bc37..9c33f8ba0be 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm @@ -55,7 +55,7 @@ return FALSE return TRUE -/datum/action/boss/wizard_summon_minions/Trigger() +/datum/action/boss/wizard_summon_minions/Trigger(trigger_flags) . = ..() if(!.) return @@ -91,7 +91,7 @@ boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard say_when_triggered = "" -/datum/action/boss/wizard_mimic/Trigger() +/datum/action/boss/wizard_mimic/Trigger(trigger_flags) if(..()) var/mob/living/target if(!boss.client) //AI's target diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 6caf0506c71..880c6691f98 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -211,7 +211,7 @@ /mob/living/simple_animal/hostile/giant_spider/tarantula/OpenFire() if(client) return - charge.Trigger(target) + charge.Trigger(target = target) /mob/living/simple_animal/hostile/giant_spider/tarantula/Moved(atom/oldloc, dir) . = ..() @@ -530,7 +530,7 @@ return FALSE return TRUE -/datum/action/innate/spider/comm/Trigger() +/datum/action/innate/spider/comm/Trigger(trigger_flags) var/input = tgui_input_text(owner, "Input a command for your legions to follow.", "Command") if(QDELETED(src) || !input || !IsAvailable()) return FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index 1fbc7cd6471..2b653064b79 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -88,8 +88,8 @@ wanted_objects = list() search_objects = 0 if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) - var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - action.Trigger(TRUE) + var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] + action.Trigger(forced_state = TRUE) /mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/vehicle/sealed/mecha/M) if(!M) @@ -229,16 +229,16 @@ if(mecha.get_integrity() < mecha.max_integrity*0.25) if(prob(defense_mode_chance)) if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_defense_mode) && !mecha.defense_mode) - var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] - action.Trigger(TRUE) + var/datum/action/vehicle/sealed/mecha/mech_defense_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_defense_mode] + action.Trigger(forced_state = TRUE) addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_defense_mode.proc/Trigger, FALSE), 100) //10 seconds of defense, then toggle off else if(prob(retreat_chance)) //Speed boost if possible if(LAZYACCESSASSOC(mecha.occupant_actions, src, /datum/action/vehicle/sealed/mecha/mech_overload_mode) && !mecha.leg_overload_mode) - var/datum/action/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode] + var/datum/action/vehicle/sealed/mecha/mech_overload_mode/action = mecha.occupant_actions[src][/datum/action/vehicle/sealed/mecha/mech_overload_mode] mecha.leg_overload_mode = FALSE - action.Trigger(TRUE) + action.Trigger(forced_state = TRUE) addtimer(CALLBACK(action, /datum/action/vehicle/sealed/mecha/mech_overload_mode.proc/Trigger, FALSE), 100) //10 seconds of speeeeed, then toggle off retreat_distance = 50 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index 7bb0e4abc13..a48d9c4c617 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -82,12 +82,12 @@ Difficulty: Medium Goto(target, move_to_delay, minimum_distance) if(get_dist(src, target) > 4) - if(dash.Trigger(target)) + if(dash.Trigger(target = target)) kinetic_accelerator.StartCooldown(0) - kinetic_accelerator.Trigger(target) + kinetic_accelerator.Trigger(target = target) else - kinetic_accelerator.Trigger(target) - transform_weapon.Trigger(target) + kinetic_accelerator.Trigger(target = target) + transform_weapon.Trigger(target = target) /obj/item/melee/cleaving_saw/miner //nerfed saw because it is very murdery force = 6 @@ -121,7 +121,7 @@ Difficulty: Medium return ..() /mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/ex_act(severity, target) - if(dash.Trigger(target)) + if(dash.Trigger(target = target)) return FALSE return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm index 463199a684c..9a7d253e03c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm @@ -119,15 +119,15 @@ Difficulty: Hard return if(!try_bloodattack() || prob(25 + anger_modifier)) - blood_warp.Trigger(target) + blood_warp.Trigger(target = target) if(!BUBBLEGUM_SMASH) - triple_charge.Trigger(target) + triple_charge.Trigger(target = target) else if(prob(50 + anger_modifier)) - hallucination_charge.Trigger(target) + hallucination_charge.Trigger(target = target) else - hallucination_charge_surround.Trigger(target) + hallucination_charge_surround.Trigger(target = target) /mob/living/simple_animal/hostile/megafauna/bubblegum/proc/get_mobs_on_blood(mob/target) var/list/targets = list(target) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index d706eaa40a1..90312136a16 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -104,14 +104,14 @@ move_to_delay = initial(move_to_delay) if(prob(20+anger_modifier)) //Major attack - spiral_shots.Trigger(target) + spiral_shots.Trigger(target = target) else if(prob(20)) - random_shots.Trigger(target) + random_shots.Trigger(target = target) else if(prob(70)) - shotgun_blast.Trigger(target) + shotgun_blast.Trigger(target = target) else - dir_shots.Trigger(target) + dir_shots.Trigger(target = target) /mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph() for(var/mob/M in range(10,src)) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 80381f13ae9..f4eb72fb123 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -86,31 +86,31 @@ Difficulty: Extremely Hard if(easy_attack) frost_orbs.shot_count = 8 frost_orbs.shot_delay = 10 - frost_orbs.Trigger(target) + frost_orbs.Trigger(target = target) else frost_orbs.shot_count = 16 frost_orbs.shot_delay = 5 - frost_orbs.Trigger(target) + frost_orbs.Trigger(target = target) if(2) if(easy_attack) snowball_machine_gun.shot_count = 60 snowball_machine_gun.default_projectile_spread = 45 - snowball_machine_gun.Trigger(target) + snowball_machine_gun.Trigger(target = target) else if(ice_shotgun.IsAvailable()) ice_shotgun.shot_angles = list(list(-180, -140, -100, -60, -20, 20, 60, 100, 140), list(-160, -120, -80, -40, 0, 40, 80, 120, 160)) INVOKE_ASYNC(ice_shotgun, /datum/action/proc/Trigger, target) snowball_machine_gun.shot_count = 5 * 8 snowball_machine_gun.default_projectile_spread = 5 snowball_machine_gun.StartCooldown(0) - snowball_machine_gun.Trigger(target) + snowball_machine_gun.Trigger(target = target) if(3) if(easy_attack) // static lists? remind me later ice_shotgun.shot_angles = list(list(-40, -20, 0, 20, 40), list(-30, -10, 10, 30)) - ice_shotgun.Trigger(target) + ice_shotgun.Trigger(target = target) else ice_shotgun.shot_angles = list(list(0, 30, 60, 90, 120, 150, 180, 210, 240, 270, 300, 330), list(-30, -15, 0, 15, 30)) - ice_shotgun.Trigger(target) + ice_shotgun.Trigger(target = target) /// Pre-ability usage stuff /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner/proc/start_attack(mob/living/owner, datum/action/cooldown/activated) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 36497589b8f..1b38d1dc68b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -115,23 +115,23 @@ if(prob(15 + anger_modifier)) if(DRAKE_ENRAGED) // Lava Arena - lava_swoop.Trigger(target) + lava_swoop.Trigger(target = target) return // Lava Pools - if(lava_swoop.Trigger(target)) + if(lava_swoop.Trigger(target = target)) SLEEP_CHECK_DEATH(0, src) fire_cone.StartCooldown(0) - fire_cone.Trigger(target) + fire_cone.Trigger(target = target) meteors.StartCooldown(0) INVOKE_ASYNC(meteors, /datum/action/proc/Trigger, target) return else if(prob(10+anger_modifier) && DRAKE_ENRAGED) - mass_fire.Trigger(target) + mass_fire.Trigger(target = target) return - if(fire_cone.Trigger(target)) + if(fire_cone.Trigger(target = target)) if(prob(50)) meteors.StartCooldown(0) - meteors.Trigger(target) + meteors.Trigger(target = target) /mob/living/simple_animal/hostile/megafauna/dragon/proc/start_attack(mob/living/owner, datum/action/cooldown/activated) SIGNAL_HANDLER diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm index e4ac66719e9..d5ae726e6d0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/lobstrosity.dm @@ -47,7 +47,7 @@ /mob/living/simple_animal/hostile/asteroid/lobstrosity/OpenFire() if(client) return - charge.Trigger(target) + charge.Trigger(target = target) /mob/living/simple_animal/hostile/asteroid/lobstrosity/lava name = "tropical lobstrosity" diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm index e09cc78a17e..82f2cde55aa 100644 --- a/code/modules/mob/living/simple_animal/hostile/ooze.dm +++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm @@ -208,7 +208,7 @@ stop_consuming() //Shit out the vored mob before u go go ///Try to consume the pulled mob -/datum/action/consume/Trigger() +/datum/action/consume/Trigger(trigger_flags) . = ..() if(!.) return diff --git a/code/modules/mod/adding_new_mod.md b/code/modules/mod/adding_new_mod.md new file mode 100644 index 00000000000..657e3d8d52a --- /dev/null +++ b/code/modules/mod/adding_new_mod.md @@ -0,0 +1,323 @@ +## Introduction + +This is a step by step guide for creating a MODsuit theme, skin and module. + +## Theme + +This is pretty simple, we go [here](./mod_theme.dm) and add a new definition, let's go with a Psychologist theme as an example. \ +Their names should be like model names or use similar adjectives, like "magnate" or simply "engineering", so we'll go with "psychological". \ +After that, it's good to decide what company is manufacturing the suit, and a basic description of what it offers, we'll write that down in the desc. \ +So, let's our suit should be a low-power usage with lowered module capacity. We'd go with something like this. + +```dm +/datum/mod_theme/psychological + name = "psychological" + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." +``` + +For people that want to see additional stuff, we add an extended description with some more insight into what the suit does. We also set the default skin to usually the theme name, like so. + +```dm +/datum/mod_theme/psychological + name = "psychological" + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ + Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ + for operating at lower power levels, keeping people sane. As consequence, the capacity \ + of the suit has decreased, not being able to fit many modules at all." + default_skin = "psychological" +``` + +Next we want to set the statistics, you can view them all in the theme file, so let's just grab our relevant ones, armor, charge and capacity and set them to what we establilished. \ +Currently crew MODsuits should be unarmored in combat relevant stats. + +```dm +/datum/mod_theme/psychological + name = "psychological" + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ + Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ + for operating at lower power levels, keeping people sane. As consequence, the capacity \ + of the suit has decreased, not being able to fit many modules at all." + default_skin = "psychological" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + complexity_max = DEFAULT_MAX_COMPLEXITY - 7 + charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 +``` + +Now we have a basic theme, it lacks a skin which will be covered in the next section, and an item, which we will add right now. \ +Let's go into [here](./mod_types.dm). It's as simple as adding a new suit type with the appropriate modules you want. + +```dm +/obj/item/mod/control/pre_equipped/psychological + theme = /datum/mod_theme/psychological + initial_modules = list( + /obj/item/mod/module/storage, + /obj/item/mod/module/flashlight, + ) +``` + +This will create our psychological suit, equipped with a storage and flashlight modules by default. We might also want to make it craftable, in which case we go [here](./mod_construction.dm) and set this. + +```dm +/obj/item/mod/construction/armor/psychological + theme = /datum/mod_theme/psychological +``` + +After that we put it in the techweb or whatever other source we want. Now our suit is almost ready, it just needs a skin. + +## Skin + +So, now that we have our theme, we want to add a skin to it (or another theme of our choosing). Let's start with a basis. + +```dm +/datum/mod_theme/psychological + name = "psychological" + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ + Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ + for operating at lower power levels, keeping people sane. As consequence, the capacity \ + of the suit has decreased, not being able to fit many modules at all." + default_skin = "psychological" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + complexity_max = DEFAULT_MAX_COMPLEXITY - 7 + charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 + skins = list( + "psychological" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + ), + CHESTPLATE_FLAGS = list( + ), + GAUNTLETS_FLAGS = list( + ), + BOOTS_FLAGS = list( + ), + ), + ) +``` + +We now have a psychological skin, this will apply the psychological icons to every part of the suit. Next we'll be looking at the flags. Boots, gauntlets and the chestplate are usually very standard, we set their thickmaterial and pressureproofness while hiding the jumpsuit on the chestplate. On the helmet however, we'll actually look at its' icon. \ +For example, if our helmet's icon covers the full head (like the research skin), we want to do something like this. + +```dm + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), +``` + +Otherwise, with an open helmet that becomes closed (like the engineering skin), we'd do this. + +```dm + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), +``` + +There are specific cases of helmets that semi-cover the head, like the cosmohonk, apocryphal and whatnot. You can look at these for more specific suits. So let's say our suit is an open helmet design, and also add an alternate skin with a closed helmet called psychotherapeutic. It'd look something like this. + +```dm +/datum/mod_theme/psychological + name = "psychological" + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ + Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ + for operating at lower power levels, keeping people sane. As consequence, the capacity \ + of the suit has decreased, not being able to fit many modules at all." + default_skin = "psychological" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + complexity_max = DEFAULT_MAX_COMPLEXITY - 7 + charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 + skins = list( + "psychological" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + "psychotherapeutic" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) +``` + +Thus we finished our codeside. Now we go to the icon files for the suits and simply add our new skin's icons. \ +Now our suit is finished. But let's say we want to give it an unique module. + +## Module + +So, for our psychological suit, let's say we want a module that heals the brain damage of everyone in range. \ +As it's a medical module, we'll put it [here](modules/modules_medical.dm). Let's start with the object definition. + +```dm +/obj/item/mod/module/neuron_healer + name = "MOD neuron healer module" + desc = "A module made experimentally by DeForest Medical Corporation. On demand it releases waves \ + that heal neuron damage of everyone nearby, getting their brains to a better state." + icon_state = "neuron_healer" +``` + +As we want this effect to be on demand, we probably want this to be an usable module. There are four types of modules: +- Passive: These have a passive effect. +- Togglable: You can turn these on and off. +- Usable: You can use these for a one time effect. +- Active: You can only have one selected at a time. It gives you a special click effect. +As we have an usable module, we want to set a cooldown time. All modules are also incompatible with themselves, have a specific power cost and complexity varying on how powerful they are, so let's update our definition, and also add a new variable for how much brain damage we'll heal. + +```dm +/obj/item/mod/module/neuron_healer + name = "MOD neuron healer module" + desc = "A module made experimentally by DeForest Medical Corporation. On demand it releases waves \ + that heal neuron damage of everyone nearby, getting their brains to a better state." + icon_state = "neuron_healer" + module_type = MODULE_USABLE + complexity = 3 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/neuron_healer) + cooldown_time = 15 SECONDS + var/brain_damage_healed = 25 +``` + +Now, we want to override the on_use proc for our new effect. We want to make sure the use checks passed from parent. You can read about most procs and variables by reading [this](modules/_module.dm) + +```dm +/obj/item/mod/module/neuron_healer/on_use() + . = ..() + if(!.) + return +``` + +After this, we want to put our special code, a basic effect of healing all mobs nearby for their brain damage and creating a beam to them. + +```dm +/obj/item/mod/module/neuron_healer/on_use() + . = ..() + if(!.) + return + for(var/mob/living/carbon/carbon_mob in range(5, src)) + if(carbon_mob == mod.wearer) + continue + carbon_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, -brain_damage_healed) + mod.wearer.Beam(carbon_mob, icon_state = "plasmabeam", time = 1.5 SECONDS) + playsound(src, 'sound/effects/magic.ogg', 100, TRUE) + drain_power(use_power_cost) +``` + +We now have a basic module, we can add it to the techwebs to make it printable ingame, and we can add an inbuilt, advanced version of it for our psychological suit. We'll give it more healing power, no complexity and make it unremovable. + +```dm +/obj/item/mod/module/neuron_healer/advanced + name = "MOD advanced neuron healer module" + complexity = 0 + brain_damage_healed = 50 +``` + +Now we want to add it to the psychological theme, which is very simple, finishing with this: + +```dm +/datum/mod_theme/psychological + name = "psychological" + desc = "A DeForest Medical Corporation power-saving psychological suit, limiting its' module capacity." + extended_desc = "DeForest Medical Corporation's prototype suit, based off the work of \ + Nakamura Engineering. The suit has been modified to save power compared to regular suits, \ + for operating at lower power levels, keeping people sane. As consequence, the capacity \ + of the suit has decreased, not being able to fit many modules at all." + default_skin = "psychological" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, WOUND = 5) + complexity_max = DEFAULT_MAX_COMPLEXITY - 7 + charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 + inbuilt_modules = list(/obj/item/mod/module/neuron_healer/advanced) + skins = list( + "psychological" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + "psychotherapeutic" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) +``` + +## Ending +This finishes this hopefully easy to follow along tutorial. You should now know how to make a basic theme a skin for it and a module. diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index d6bb55ef31f..fa5caec72f8 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -27,7 +27,7 @@ return return ..() -/datum/action/item_action/mod/Trigger() +/datum/action/item_action/mod/Trigger(trigger_flags) if(!IsAvailable()) return FALSE if(mod.malfunctioning && prob(75)) @@ -37,30 +37,33 @@ /datum/action/item_action/mod/deploy name = "Deploy MODsuit" - desc = "Deploy/Conceal a part of the MODsuit." + desc = "LMB: Deploy/Undeploy part. RMB: Deploy/Undeploy full suit." button_icon_state = "deploy" -/datum/action/item_action/mod/deploy/Trigger() +/datum/action/item_action/mod/deploy/Trigger(trigger_flags) . = ..() if(!.) return - mod.choose_deploy(usr) + if(trigger_flags & TRIGGER_SECONDARY_ACTION) + mod.quick_deploy(usr) + else + mod.choose_deploy(usr) /datum/action/item_action/mod/deploy/ai ai_action = TRUE /datum/action/item_action/mod/activate name = "Activate MODsuit" - desc = "Activate/Deactivate the MODsuit." + desc = "LMB: Activate/Deactivate suit with prompt. RMB: Activate/Deactivate suit skipping prompt." button_icon_state = "activate" /// First time clicking this will set it to TRUE, second time will activate it. var/ready = FALSE -/datum/action/item_action/mod/activate/Trigger() +/datum/action/item_action/mod/activate/Trigger(trigger_flags) . = ..() if(!.) return - if(!ready) + if(!(trigger_flags & TRIGGER_SECONDARY_ACTION) && !ready) ready = TRUE button_icon_state = "activate-ready" if(!ai_action) @@ -87,7 +90,7 @@ desc = "Toggle a MODsuit module." button_icon_state = "module" -/datum/action/item_action/mod/module/Trigger() +/datum/action/item_action/mod/module/Trigger(trigger_flags) . = ..() if(!.) return @@ -101,7 +104,7 @@ desc = "Open the MODsuit's panel." button_icon_state = "panel" -/datum/action/item_action/mod/panel/Trigger() +/datum/action/item_action/mod/panel/Trigger(trigger_flags) . = ..() if(!.) return @@ -112,7 +115,11 @@ /datum/action/item_action/mod/pinned_module desc = "Activate the module." + /// Overrides the icon applications. + var/override = FALSE + /// Module we are linked to. var/obj/item/mod/module/module + /// Mob we are pinned to. var/mob/pinner /datum/action/item_action/mod/pinned_module/New(Target, obj/item/mod/module/linked_module, mob/user) @@ -121,40 +128,52 @@ ..() module = linked_module name = "Activate [capitalize(linked_module.name)]" + desc = "Quickly activate [linked_module]." icon_icon = linked_module.icon button_icon_state = linked_module.icon_state pinner = user - RegisterSignal(mod, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select) - RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) + RegisterSignal(linked_module, COMSIG_MODULE_ACTIVATED, .proc/on_module_activate) + RegisterSignal(linked_module, COMSIG_MODULE_DEACTIVATED, .proc/on_module_deactivate) + RegisterSignal(linked_module, COMSIG_MODULE_USED, .proc/on_module_use) /datum/action/item_action/mod/pinned_module/Grant(mob/user) if(user != pinner) return return ..() -/datum/action/item_action/mod/pinned_module/Trigger() +/datum/action/item_action/mod/pinned_module/Trigger(trigger_flags) . = ..() if(!.) return + if(!mod.active) + mod.balloon_alert(usr, "suit not on!") module.on_select() /datum/action/item_action/mod/pinned_module/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) . = ..(current_button, force = TRUE) + if(override) + return if(module == mod.selected_module) current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_selected", layer = FLOAT_LAYER-0.1)) else if(module.active) current_button.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_active", layer = FLOAT_LAYER-0.1)) + if(!COOLDOWN_FINISHED(module, cooldown_timer)) + var/image/cooldown_image = image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown") + current_button.add_overlay(cooldown_image) + addtimer(CALLBACK(current_button, /image.proc/cut_overlay, cooldown_image), COOLDOWN_TIMELEFT(module, cooldown_timer)) -/// When the module is selected, we update the icon. -/datum/action/item_action/mod/pinned_module/proc/on_module_select(datum/source, obj/item/mod/module/selected_module) - SIGNAL_HANDLER - if(selected_module != mod.selected_module && selected_module != module) - return - UpdateButtonIcon() - -/// When the suit is being activated, we update the icon. -/datum/action/item_action/mod/pinned_module/proc/on_mod_activation(datum/source, mob/user) +/datum/action/item_action/mod/pinned_module/proc/on_module_activate(datum/source) + SIGNAL_HANDLER + + UpdateButtonIcon() + +/datum/action/item_action/mod/pinned_module/proc/on_module_deactivate(datum/source) + SIGNAL_HANDLER + + UpdateButtonIcon() + +/datum/action/item_action/mod/pinned_module/proc/on_module_use(datum/source) SIGNAL_HANDLER UpdateButtonIcon() diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 52a6897fec2..d3da5d9e2d9 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -37,6 +37,28 @@ choose_deploy(user) break +/// Quickly deploys all parts (or retracts if all are on the wearer) +/obj/item/mod/control/proc/quick_deploy(mob/user) + if(active || activating) + balloon_alert(user, "deactivate the suit first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + var/deploy = FALSE + for(var/obj/item/part as anything in mod_parts) + if(part.loc != src) + continue + deploy = TRUE + for(var/obj/item/part as anything in mod_parts) + if(deploy && part.loc == src) + deploy(null, part) + else if(!deploy && part.loc != src) + conceal(null, part) + wearer.visible_message(span_notice("[wearer]'s [src] [deploy ? "deploys" : "retracts"] its' pieces with a mechanical hiss."), + span_notice("[src] [deploy ? "deploys" : "retracts"] its' pieces with a mechanical hiss."), + span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + /// Deploys a part of the suit onto the user. /obj/item/mod/control/proc/deploy(mob/user, part) var/obj/item/piece = part @@ -102,7 +124,7 @@ balloon_alert(user, "access insufficient!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - if(!cell?.charge && !force_deactivate) + if(!get_charge() && !force_deactivate) balloon_alert(user, "suit not powered!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index 700fce07333..58cd73fafcf 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -63,11 +63,11 @@ #define MOVE_DELAY 2 #define WEARER_DELAY 1 #define LONE_DELAY 5 -#define CELL_PER_STEP DEFAULT_CELL_DRAIN * 2.5 +#define CHARGE_PER_STEP DEFAULT_CHARGE_DRAIN * 2.5 #define AI_FALL_TIME 1 SECONDS /obj/item/mod/control/relaymove(mob/user, direction) - if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) + if((!active && wearer) || get_charge() < CHARGE_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) return FALSE var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) if(wearer && !wearer.Process_Spacemove(direction)) @@ -75,7 +75,7 @@ else if(!wearer && (!has_gravity() || !isturf(loc))) return FALSE COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown_active) - cell.charge = max(0, cell.charge - CELL_PER_STEP) + subtract_charge(CHARGE_PER_STEP) playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) if(ismovable(wearer?.loc)) return wearer.loc.relaymove(wearer, direction) @@ -88,7 +88,7 @@ #undef MOVE_DELAY #undef WEARER_DELAY #undef LONE_DELAY -#undef CELL_PER_STEP +#undef CHARGE_PER_STEP /obj/item/mod/control/proc/ai_fall() if(!wearer) diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 594c705101b..2fac5bc629d 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -4,23 +4,12 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "helmet" worn_icon = 'icons/mob/clothing/mod.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) body_parts_covered = HEAD heat_protection = HEAD cold_protection = HEAD - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL|SNUG_FIT - resistance_flags = NONE - flash_protect = FLASH_PROTECTION_NONE dynamic_hair_suffix = "" - dynamic_fhair_suffix = "" - flags_inv = HIDEFACIALHAIR - flags_cover = NONE - visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE - visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT - visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF - item_flags = IMMUTABLE_SLOW + obj_flags = IMMUTABLE_SLOW var/alternate_layer = NECK_LAYER var/obj/item/mod/control/mod @@ -41,18 +30,11 @@ icon_state = "chestplate" worn_icon = 'icons/mob/clothing/mod.dmi' blood_overlay_type = "armor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) body_parts_covered = CHEST|GROIN heat_protection = CHEST|GROIN cold_protection = CHEST|GROIN - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - visor_flags = STOPSPRESSUREDAMAGE - visor_flags_inv = HIDEJUMPSUIT - resistance_flags = NONE - item_flags = IMMUTABLE_SLOW - allowed = list(/obj/item/flashlight, /obj/item/tank/internals) + obj_flags = IMMUTABLE_SLOW var/obj/item/mod/control/mod /obj/item/clothing/suit/mod/Destroy() @@ -71,15 +53,11 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "gauntlets" worn_icon = 'icons/mob/clothing/mod.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) body_parts_covered = HANDS|ARMS heat_protection = HANDS|ARMS cold_protection = HANDS|ARMS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - resistance_flags = NONE - item_flags = IMMUTABLE_SLOW + obj_flags = IMMUTABLE_SLOW var/obj/item/mod/control/mod var/obj/item/clothing/overslot @@ -109,15 +87,13 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "boots" worn_icon = 'icons/mob/clothing/mod.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) body_parts_covered = FEET|LEGS heat_protection = FEET|LEGS cold_protection = FEET|LEGS - max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT - min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - clothing_flags = THICKMATERIAL - resistance_flags = NONE - item_flags = IMMUTABLE_SLOW|IGNORE_DIGITIGRADE + obj_flags = IMMUTABLE_SLOW + item_flags = IGNORE_DIGITIGRADE + can_be_tied = FALSE var/obj/item/mod/control/mod var/obj/item/clothing/overslot diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index a730916629f..99b7bf61f44 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -35,18 +35,9 @@ . = ..() . += span_notice("You could insert these into a MOD shell...") -/obj/item/mod/construction/core - name = "MOD core" - icon_state = "mod-core" - desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \ - These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \ - owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\ - Which one you have in your suit is unclear, but either way, \ - it's been repurposed to be an internal power source for a Modular Outerwear Device." - /obj/item/mod/construction/broken_core name = "broken MOD core" - icon_state = "mod-core-broken" + icon_state = "mod-core" desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though." /obj/item/mod/construction/broken_core/examine(mob/user) @@ -57,7 +48,7 @@ . = ..() if(!tool.use_tool(src, user, 5 SECONDS, volume = 30)) return - new /obj/item/mod/construction/core(drop_location()) + new /obj/item/mod/core/standard(drop_location()) qdel(src) /obj/item/mod/construction/armor @@ -146,7 +137,7 @@ . = ..() switch(step) if(START_STEP) - if(!istype(part, /obj/item/mod/construction/core)) + if(!istype(part, /obj/item/mod/core)) return if(!user.transferItemToLoc(part, src)) balloon_alert(user, "core stuck to your hand!") @@ -250,9 +241,9 @@ return playsound(src, 'sound/machines/click.ogg', 30, TRUE) balloon_alert(user, "suit finished") - var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme) + var/obj/item/mod = new /obj/item/mod/control(drop_location(), external_armor.theme, null, core) qdel(src) - user.put_in_hands(modsuit) + user.put_in_hands(mod) else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct if(part.use_tool(src, user, 0, volume=30)) balloon_alert(user, "assembly unscrewed") diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index a4787f9e079..3f3b3390ccd 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -14,7 +14,7 @@ w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, FIRE = 0, ACID = 0, WOUND = 0) actions_types = list( /datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, @@ -56,7 +56,7 @@ /// How much module complexity this MOD is carrying. var/complexity = 0 /// Power usage of the MOD. - var/cell_drain = DEFAULT_CELL_DRAIN + var/charge_drain = DEFAULT_CHARGE_DRAIN /// Slowdown of the MOD when not active. var/slowdown_inactive = 1.25 /// Slowdown of the MOD when active. @@ -65,8 +65,6 @@ var/activation_step_time = MOD_ACTIVATION_STEP_TIME /// Extended description of the theme. var/extended_desc - /// MOD cell. - var/obj/item/stock_parts/cell/cell /// MOD helmet. var/obj/item/clothing/head/mod/helmet /// MOD chestplate. @@ -75,6 +73,8 @@ var/obj/item/clothing/gloves/mod/gauntlets /// MOD boots. var/obj/item/clothing/shoes/mod/boots + /// MOD core. + var/obj/item/mod/core/core /// List of parts (helmet, chestplate, gauntlets, boots). var/list/mod_parts = list() /// Modules the MOD should spawn with. @@ -92,7 +92,7 @@ /// Person wearing the MODsuit. var/mob/living/carbon/human/wearer -/obj/item/mod/control/Initialize(mapload, new_theme, new_skin) +/obj/item/mod/control/Initialize(mapload, datum/mod_theme/new_theme, new_skin, obj/item/mod/core/new_core) . = ..() if(new_theme) theme = new_theme @@ -103,13 +103,12 @@ complexity_max = theme.complexity_max skin = new_skin || theme.default_skin ui_theme = theme.ui_theme - cell_drain = theme.cell_drain + charge_drain = theme.charge_drain initial_modules += theme.inbuilt_modules wires = new /datum/wires/mod(src) if(length(req_access)) locked = TRUE - if(ispath(cell)) - cell = new cell(src) + new_core?.install(src) helmet = new /obj/item/clothing/head/mod(src) helmet.mod = src mod_parts += helmet @@ -129,6 +128,7 @@ piece.desc = "[piece.desc] [theme.desc]" piece.armor = getArmor(arglist(theme.armor)) piece.resistance_flags = theme.resistance_flags + piece.flags_1 |= theme.atom_flags //flags like initialization or admin spawning are here, so we cant set, have to add piece.heat_protection = NONE piece.cold_protection = NONE piece.max_heat_protection_temperature = theme.max_heat_protection_temperature @@ -148,6 +148,9 @@ /obj/item/mod/control/Destroy() if(active) STOP_PROCESSING(SSobj, src) + for(var/obj/item/mod/module/module as anything in modules) + module.mod = null + modules -= module var/atom/deleting_atom if(!QDELETED(helmet)) deleting_atom = helmet @@ -173,11 +176,9 @@ boots = null mod_parts -= deleting_atom qdel(deleting_atom) - for(var/obj/item/mod/module/module as anything in modules) - module.mod = null - modules -= module + if(core) + QDEL_NULL(core) QDEL_NULL(wires) - QDEL_NULL(cell) return ..() /obj/item/mod/control/atom_destruction(damage_flag) @@ -196,7 +197,7 @@ /obj/item/mod/control/examine(mob/user) . = ..() if(active) - . += span_notice("Cell power: [cell ? "[round(cell.percent(), 1)]%" : "No cell"].") + . += span_notice("Charge: [core ? "[get_charge_percent()]%" : "No core"].") . += span_notice("Selected module: [selected_module || "None"].") if(!open && !active) . += span_notice("You could put it on your back to turn it on.") @@ -206,11 +207,11 @@ . += span_notice("You could use modules on it to install them.") . += span_notice("You could remove modules with a crowbar.") . += span_notice("You could update the access with an ID.") - . += span_notice("You could access the wire panel with a wire configuring tool.") - if(cell) - . += span_notice("You could remove the cell with an empty hand.") + . += span_notice("You could access the wire panel with a wire tool.") + if(core) + . += span_notice("You could remove [core] with a wrench.") else - . += span_notice("You could use a cell on it to install one.") + . += span_notice("You could use a MOD core on it to install one.") if(ai) . += span_notice("You could remove [ai] with an intellicard.") else @@ -223,14 +224,14 @@ /obj/item/mod/control/process(delta_time) if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- - if((!cell || !cell.charge) && active && !activating) + if(!get_charge() && active && !activating) power_off() return PROCESS_KILL var/malfunctioning_charge_drain = 0 if(malfunctioning) malfunctioning_charge_drain = rand(1,20) - cell.charge = max(0, cell.charge - (cell_drain + malfunctioning_charge_drain)*delta_time) - update_cell_alert() + subtract_charge((charge_drain + malfunctioning_charge_drain)*delta_time) + update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) if(malfunctioning && module.active && DT_PROB(5, delta_time)) module.on_deactivation() @@ -255,7 +256,7 @@ /obj/item/mod/control/allow_attack_hand_drop(mob/user) if(user != wearer) return ..() - for(var/obj/item/part in mod_parts) + for(var/obj/item/part as anything in mod_parts) if(part.loc != src) balloon_alert(user, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) @@ -264,7 +265,7 @@ /obj/item/mod/control/MouseDrop(atom/over_object) if(usr != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) return ..() - for(var/obj/item/part in mod_parts) + for(var/obj/item/part as anything in mod_parts) if(part.loc != src) balloon_alert(wearer, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) @@ -275,24 +276,25 @@ add_fingerprint(usr) return ..() -/obj/item/mod/control/attack_hand(mob/user) - if(seconds_electrified && cell?.charge) - if(shock(user)) - return - if(open && loc == user) - if(!cell) - balloon_alert(user, "no cell!") - return - balloon_alert(user, "removing cell...") - if(!do_after(user, 1.5 SECONDS, target = src)) +/obj/item/mod/control/wrench_act(mob/living/user, obj/item/wrench) + if(..()) + return TRUE + if(seconds_electrified && get_charge() && shock(user)) + return TRUE + if(open) + if(!core) + balloon_alert(user, "no core!") + return TRUE + balloon_alert(user, "removing core...") + wrench.play_tool_sound(src, 100) + if(!wrench.use_tool(src, user, 3 SECONDS) || !open) balloon_alert(user, "interrupted!") - return - balloon_alert(user, "cell removed") - playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - if(!user.put_in_hands(cell)) - cell.forceMove(drop_location()) - update_cell_alert() - return + return TRUE + wrench.play_tool_sound(src, 100) + balloon_alert(user, "core removed") + core.forceMove(drop_location()) + update_charge_alert() + return TRUE return ..() /obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) @@ -352,20 +354,20 @@ return FALSE install(attacking_item, user) return TRUE - else if(istype(attacking_item, /obj/item/stock_parts/cell)) + else if(istype(attacking_item, /obj/item/mod/core)) if(!open) balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - if(cell) - balloon_alert(user, "cell already installed!") + if(core) + balloon_alert(user, "core already installed!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - attacking_item.forceMove(src) - cell = attacking_item - balloon_alert(user, "cell installed") + var/obj/item/mod/core/attacking_core = attacking_item + attacking_core.install(src) + balloon_alert(user, "core installed") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) - update_cell_alert() + update_charge_alert() return TRUE else if(is_wire_tool(attacking_item) && open) wires.interact(user) @@ -384,8 +386,12 @@ return ..() /obj/item/mod/control/get_cell() - if(open) - return cell + if(!open) + return + var/obj/item/stock_parts/cell/cell = get_charge_source() + if(!istype(cell)) + return + return cell /obj/item/mod/control/GetAccess() if(ai_controller) @@ -418,7 +424,7 @@ /obj/item/mod/control/doStrip(mob/stripper, mob/owner) if(active && !toggle_activate(stripper, force_deactivate = TRUE)) return - for(var/obj/item/part in mod_parts) + for(var/obj/item/part as anything in mod_parts) if(part.loc == src) continue conceal(null, part) @@ -437,7 +443,7 @@ RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit) RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) RegisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP, .proc/on_unequip) - update_cell_alert() + update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) module.on_equip() @@ -452,7 +458,7 @@ /obj/item/mod/control/proc/on_unequip() SIGNAL_HANDLER - for(var/obj/item/part in mod_parts) + for(var/obj/item/part as anything in mod_parts) if(part.loc != src) return COMPONENT_ITEM_BLOCK_UNEQUIP @@ -492,6 +498,8 @@ module_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_selected") else if(module.active) module_image.underlays += image(icon = 'icons/hud/radial.dmi', icon_state = "module_active") + if(!COOLDOWN_FINISHED(module, cooldown_timer)) + module_image.add_overlay(image(icon = 'icons/hud/radial.dmi', icon_state = "module_cooldown")) items += list(module.name = module_image) if(!length(items)) return @@ -525,11 +533,11 @@ return TRUE /obj/item/mod/control/proc/shock(mob/living/user) - if(!istype(user) || cell?.charge < 1) + if(!istype(user) || get_charge() < 1) return FALSE do_sparks(5, TRUE, src) var/check_range = TRUE - return electrocute_mob(user, cell, src, 0.7, check_range) + return electrocute_mob(user, get_charge_source(), src, 0.7, check_range) /obj/item/mod/control/proc/install(module, mob/user) var/obj/item/mod/module/new_module = module @@ -558,6 +566,13 @@ new_module.on_install() if(wearer) new_module.on_equip() + var/datum/action/item_action/mod/pinned_module/action = new_module.pinned_to[wearer] + if(action) + action.Grant(wearer) + if(ai) + var/datum/action/item_action/mod/pinned_module/action = new_module.pinned_to[ai] + if(action) + action.Grant(ai) if(user) balloon_alert(user, "[new_module] added") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) @@ -572,6 +587,7 @@ old_module.on_deactivation() if(wearer) old_module.on_unequip() + old_module.pinned_to.Cut() old_module.on_uninstall() old_module.mod = null @@ -583,28 +599,36 @@ req_access = card.access.Copy() balloon_alert(user, "access updated") -/obj/item/mod/control/proc/update_cell_alert() +/obj/item/mod/control/proc/get_charge_source() + return core?.charge_source() + +/obj/item/mod/control/proc/get_charge() + return core?.charge_amount() || 0 + +/obj/item/mod/control/proc/get_max_charge() + return core?.max_charge_amount() || 1 //avoid dividing by 0 + +/obj/item/mod/control/proc/get_charge_percent() + return ROUND_UP((get_charge() / get_max_charge()) * 100) + +/obj/item/mod/control/proc/add_charge(amount) + return core?.add_charge(amount) || FALSE + +/obj/item/mod/control/proc/subtract_charge(amount) + return core?.subtract_charge(amount) || FALSE + +/obj/item/mod/control/proc/update_charge_alert() if(!wearer) return - if(!cell) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell) + if(!core) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocore) return - var/remaining_cell = cell.charge/cell.maxcharge - switch(remaining_cell) - if(0.75 to INFINITY) - wearer.clear_alert("mod_charge") - if(0.5 to 0.75) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1) - if(0.25 to 0.5) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2) - if(0.01 to 0.25) - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3) - else - wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell) + core.update_charge_alert() /obj/item/mod/control/proc/update_speed() - for(var/obj/item/part as anything in mod_parts) - part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(mod_parts) + var/list/all_parts = mod_parts + src + for(var/obj/item/part as anything in all_parts) + part.slowdown = (active ? slowdown_active : slowdown_inactive) / length(all_parts) wearer?.update_equipment_speed_mods() /obj/item/mod/control/proc/power_off() @@ -616,9 +640,9 @@ if(part.loc == src) return - if(part == cell) - cell = null - update_cell_alert() + if(part == core) + core.uninstall() + update_charge_alert() return if(part.loc == wearer) return @@ -634,10 +658,11 @@ /obj/item/mod/control/proc/on_borg_charge(datum/source, amount) SIGNAL_HANDLER - if(!cell) + update_charge_alert() + var/obj/item/stock_parts/cell/cell = get_charge_source() + if(!istype(cell)) return cell.give(amount) - update_cell_alert() /obj/item/mod/control/proc/on_potion(atom/movable/source, obj/item/slimepotion/speed/speed_potion, mob/living/user) SIGNAL_HANDLER diff --git a/code/modules/mod/mod_core.dm b/code/modules/mod/mod_core.dm new file mode 100644 index 00000000000..60bc33fb77a --- /dev/null +++ b/code/modules/mod/mod_core.dm @@ -0,0 +1,246 @@ +/obj/item/mod/core + name = "MOD core" + desc = "A non-functional MOD core. Inform the admins if you see this." + icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' + icon_state = "mod-core" + inhand_icon_state = "electronic" + lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi' + /// MOD unit we are powering. + var/obj/item/mod/control/mod + +/obj/item/mod/core/Destroy() + if(mod) + uninstall() + return ..() + +/obj/item/mod/core/proc/install(obj/item/mod/control/mod_unit) + mod = mod_unit + mod.core = src + forceMove(mod) + +/obj/item/mod/core/proc/uninstall() + mod.core = null + mod = null + +/obj/item/mod/core/proc/charge_source() + return + +/obj/item/mod/core/proc/charge_amount() + return 0 + +/obj/item/mod/core/proc/max_charge_amount() + return 1 + +/obj/item/mod/core/proc/add_charge(amount) + return FALSE + +/obj/item/mod/core/proc/subtract_charge(amount) + return FALSE + +/obj/item/mod/core/proc/update_charge_alert() + mod.wearer.clear_alert("mod_charge") + +/obj/item/mod/core/standard + name = "MOD standard core" + icon_state = "mod-core-standard" + desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \ + These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the \ + Ethereals, owing to their appearance; which is exactly similar to that of an Ethereal's heart.\n\ + Which one you have in your suit is unclear, but either way, \ + it's been repurposed to be an internal power source for a Modular Outerwear Device." + /// Installed cell. + var/obj/item/stock_parts/cell/cell + +/obj/item/mod/core/standard/Destroy() + if(cell) + QDEL_NULL(cell) + return ..() + +/obj/item/mod/core/standard/install(obj/item/mod/control/mod_unit) + . = ..() + if(cell) + install_cell(cell) + RegisterSignal(mod, COMSIG_PARENT_EXAMINE, .proc/on_examine) + RegisterSignal(mod, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + RegisterSignal(mod, COMSIG_PARENT_ATTACKBY, .proc/on_attackby) + +/obj/item/mod/core/standard/uninstall() + if(!QDELETED(cell)) + cell.forceMove(drop_location()) + uninstall_cell() + UnregisterSignal(mod, list(COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_HAND, COMSIG_PARENT_ATTACKBY)) + return ..() + +/obj/item/mod/core/standard/charge_source() + return cell + +/obj/item/mod/core/standard/charge_amount() + var/obj/item/stock_parts/cell/charge_source = charge_source() + return charge_source?.charge || 0 + +/obj/item/mod/core/standard/max_charge_amount(amount) + var/obj/item/stock_parts/cell/charge_source = charge_source() + return charge_source?.maxcharge || 1 + +/obj/item/mod/core/standard/add_charge(amount) + var/obj/item/stock_parts/cell/charge_source = charge_source() + if(!charge_source) + return FALSE + return charge_source.give(amount) + +/obj/item/mod/core/standard/subtract_charge(amount) + var/obj/item/stock_parts/cell/charge_source = charge_source() + if(!charge_source) + return FALSE + return charge_source.use(amount) + +/obj/item/mod/core/standard/update_charge_alert() + var/obj/item/stock_parts/cell/charge_source = charge_source() + if(!charge_source) + mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell) + return + var/remaining_cell = charge_amount() / max_charge_amount() + switch(remaining_cell) + if(0.75 to INFINITY) + mod.wearer.clear_alert("mod_charge") + if(0.5 to 0.75) + mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1) + if(0.25 to 0.5) + mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2) + if(0.01 to 0.25) + mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3) + else + mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell) + +/obj/item/mod/core/standard/proc/install_cell(new_cell) + cell = new_cell + cell.forceMove(src) + RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + +/obj/item/mod/core/standard/proc/uninstall_cell() + if(!cell) + return + cell = null + UnregisterSignal(src, COMSIG_ATOM_EXITED) + +/obj/item/mod/core/standard/proc/on_exit(datum/source, obj/item/stock_parts/cell, direction) + SIGNAL_HANDLER + + if(!istype(cell) || cell.loc == src) + return + uninstall_cell() + +/obj/item/mod/core/standard/proc/on_examine(datum/source, mob/examiner, list/examine_text) + SIGNAL_HANDLER + + if(!mod.open) + return + examine_text += cell ? "You could remove the cell with an empty hand." : "You could use a cell on it to install one." + +/obj/item/mod/core/standard/proc/on_attack_hand(datum/source, mob/living/user) + SIGNAL_HANDLER + + if(mod.seconds_electrified && charge_amount() && mod.shock(user)) + return COMPONENT_CANCEL_ATTACK_CHAIN + if(mod.open && mod.loc == user) + INVOKE_ASYNC(src, .proc/mod_uninstall_cell, user) + return COMPONENT_CANCEL_ATTACK_CHAIN + return NONE + +/obj/item/mod/core/standard/proc/mod_uninstall_cell(mob/living/user) + if(!cell) + mod.balloon_alert(user, "no cell!") + return + mod.balloon_alert(user, "removing cell...") + if(!do_after(user, 1.5 SECONDS, target = mod)) + mod.balloon_alert(user, "interrupted!") + return + mod.balloon_alert(user, "cell removed") + playsound(mod, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + uninstall_cell() + cell.forceMove(drop_location()) + user.put_in_hands(cell) + mod.update_charge_alert() + +/obj/item/mod/core/standard/proc/on_attackby(datum/source, obj/item/attacking_item, mob/user) + SIGNAL_HANDLER + + if(istype(attacking_item, /obj/item/stock_parts/cell)) + if(!mod.open) + mod.balloon_alert(user, "open the cover first!") + playsound(mod, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return NONE + if(cell) + mod.balloon_alert(user, "cell already installed!") + playsound(mod, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return COMPONENT_NO_AFTERATTACK + install_cell(attacking_item) + mod.balloon_alert(user, "cell installed") + playsound(mod, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + mod.update_charge_alert() + return COMPONENT_NO_AFTERATTACK + return NONE + +/obj/item/mod/core/ethereal + name = "MOD ethereal core" + icon_state = "mod-core-ethereal" + desc = "A reverse engineered core of a Modular Outerwear Device. Using natural liquid electricity from Ethereals, \ + preventing the need to use external sources to convert electric charge." + /// A modifier to all charge we use, ethereals don't need to spend as much energy as normal suits. + var/charge_modifier = 0.1 + +/obj/item/mod/core/ethereal/charge_source() + var/obj/item/organ/stomach/ethereal/ethereal_stomach = mod.wearer.getorganslot(ORGAN_SLOT_STOMACH) + if(!istype(ethereal_stomach)) + return + return ethereal_stomach + +/obj/item/mod/core/ethereal/charge_amount() + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() + return charge_source?.crystal_charge || ETHEREAL_CHARGE_NONE + +/obj/item/mod/core/ethereal/max_charge_amount() + return ETHEREAL_CHARGE_FULL + +/obj/item/mod/core/ethereal/add_charge(amount) + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() + if(!charge_source) + return FALSE + charge_source.adjust_charge(amount*charge_modifier) + return TRUE + +/obj/item/mod/core/ethereal/subtract_charge(amount) + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() + if(!charge_source) + return FALSE + charge_source.adjust_charge(-amount*charge_modifier) + return TRUE + +/obj/item/mod/core/ethereal/update_charge_alert() + var/obj/item/organ/stomach/ethereal/charge_source = charge_source() + if(charge_source) + mod.wearer.clear_alert("mod_charge") + return + mod.wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell) + +/obj/item/mod/core/infinite + name = "MOD infinite core" + icon_state = "mod-core-infinite" + desc = "A fusion core using the rare palladium to sustain enough energy for the lifetime of the MOD's user. \ + This might be because of the slowly killing poison inside, but those are just rumors." + +/obj/item/mod/core/infinite/charge_source() + return src + +/obj/item/mod/core/infinite/charge_amount() + return INFINITY + +/obj/item/mod/core/infinite/max_charge_amount() + return INFINITY + +/obj/item/mod/core/infinite/add_charge(amount) + return TRUE + +/obj/item/mod/core/infinite/subtract_charge(amount) + return TRUE diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 535e2ec2677..645d0493cd0 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -23,6 +23,8 @@ var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) /// Resistance flags shared across the MOD pieces. var/resistance_flags = NONE + /// Atom flags shared across the MOD pieces. + var/atom_flags = NONE /// Max heat protection shared across the MOD pieces. var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT /// Max cold protection shared across the MOD pieces. @@ -34,7 +36,7 @@ /// How much modules can the MOD carry without malfunctioning. var/complexity_max = DEFAULT_MAX_COMPLEXITY /// How much battery power the MOD uses by just being on - var/cell_drain = DEFAULT_CELL_DRAIN + var/charge_drain = DEFAULT_CHARGE_DRAIN /// Slowdown of the MOD when not active. var/slowdown_inactive = 1.25 /// Slowdown of the MOD when active. @@ -228,14 +230,14 @@ mining teams have since heavily tweaked the suit themselves. Aftermarket armor plating has been added, \ giving way to incredible protection against corrosives and thermal protection good enough for volcanic environments. \ The systems have been upgraded as well, giving space for further modification down the line. \ - However, all of this has proven to be straining on the cell and the actuators of the suit, \ + However, all of this has proven to be straining on the power and the actuators of the suit, \ making it demand more power in exchange." default_skin = "mining" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - cell_drain = DEFAULT_CELL_DRAIN * 2 + charge_drain = DEFAULT_CHARGE_DRAIN * 2 skins = list( "mining" = list( HELMET_LAYER = null, @@ -273,7 +275,7 @@ and weak against fingers tapping the glass." default_skin = "medical" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10) - cell_drain = DEFAULT_CELL_DRAIN * 1.5 + charge_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_inactive = 1 slowdown_active = 0.5 skins = list( @@ -338,7 +340,7 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - cell_drain = DEFAULT_CELL_DRAIN * 1.5 + charge_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_inactive = 0.75 slowdown_active = 0.25 inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) @@ -382,6 +384,7 @@ default_skin = "research" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) resistance_flags = FIRE_PROOF|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 slowdown_inactive = 1.75 @@ -424,7 +427,7 @@ However, the systems used in these suits are more than a few years out of date, \ leading to an overall lower capacity for modules." default_skin = "security" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20) siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 slowdown_inactive = 1 @@ -466,7 +469,7 @@ Heatsinks line the sides of the suit, and greater technology has been used in insulating it against \ both corrosive environments and sudden impacts to the user's joints." default_skin = "safeguard" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 40, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -513,6 +516,7 @@ default_skin = "magnate" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20) resistance_flags = FIRE_PROOF|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 5 @@ -555,10 +559,9 @@ All you know is that this suit is mysteriously power-efficient, and far too colorful for the Mime to steal." default_skin = "cosmohonk" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) - cell_drain = DEFAULT_CELL_DRAIN * 0.25 + charge_drain = DEFAULT_CHARGE_DRAIN * 0.25 slowdown_inactive = 1.75 slowdown_active = 1.25 - inbuilt_modules = list(/obj/item/mod/module/waddle) skins = list( "cosmohonk" = list( HELMET_LAYER = NECK_LAYER, @@ -591,12 +594,13 @@ extended_desc = "An advanced combat suit adorned in a sinister crimson red color scheme, produced and manufactured \ for special mercenary operations. The build is a streamlined layering consisting of shaped Plasteel, \ and composite ceramic, while the under suit is lined with a lightweight Kevlar and durathread hybrid weave \ - to provide ample protection to the user where the plating doesn't, with an illegal onboard cell powered \ + to provide ample protection to the user where the plating doesn't, with an illegal onboard electric powered \ ablative shield module to provide resistance against conventional energy firearms. \ A small tag hangs off of it reading; 'Property of the Gorlex Marauders, with assistance from Cybersun Industries. \ All rights reserved, tampering with suit will void warranty." default_skin = "syndicate" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25) + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 1 @@ -662,6 +666,7 @@ default_skin = "elite" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) resistance_flags = FIRE_PROOF|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 0.75 @@ -700,9 +705,9 @@ extended_desc = "The Wizard Federation's relatively low-tech MODsuit. This armor employs not \ plasteel or carbon fibre, but space dragon scales for its protection. Recruits are expected to \ gather these themselves, but the effort is well worth it, the suit being well-armored against threats \ - both mundane and mystic. Rather than wholly relying on the suit's cell, which would surely perish \ + both mundane and mystic. Rather than wholly relying on a cell, which would surely perish \ under the load, several naturally-occurring bluespace gemstones have been utilized as \ - supplementary means of power. The hood and platform boots are of unknown usage, but it's speculated that \ + default means of power. The hood and platform boots are of unknown usage, but it's speculated that \ wizards trend towards the dramatic." default_skin = "enchanted" armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30) @@ -755,7 +760,7 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5) resistance_flags = FIRE_PROOF complexity_max = DEFAULT_MAX_COMPLEXITY + 5 - cell_drain = DEFAULT_CELL_DRAIN * 2 + charge_drain = DEFAULT_CHARGE_DRAIN * 2 slowdown_inactive = 2 slowdown_active = 1.5 ui_theme = "hackerman" @@ -795,6 +800,7 @@ While wearing it you feel an extreme deference to darkness. " default_skin = "responsory" armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15) + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -860,6 +866,7 @@ default_skin = "apocryphal" armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) resistance_flags = FIRE_PROOF|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY + 10 @@ -900,6 +907,7 @@ default_skin = "corporate" armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) resistance_flags = FIRE_PROOF|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 0.5 @@ -931,6 +939,46 @@ ), ) +/datum/mod_theme/chrono + name = "chrono" + desc = "A suit beyond our time, beyond time itself. Used to traverse timelines and \"correct their course\"." + extended_desc = "A suit whose tech goes beyond this era's understanding. The internal mechanisms are all but \ + completely alien, but the purpose is quite simple. The suit protects the user from the many incredibly lethal \ + and sometimes hilariously painful side effects of jumping timelines, while providing inbuilt equipment for \ + making timeline adjustments to correct a bad course." + default_skin = "chrono" + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 100, FIRE = 100, ACID = 100) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + complexity_max = DEFAULT_MAX_COMPLEXITY - 10 + slowdown_inactive = 0 + slowdown_active = 0 + skins = list( + "chrono" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + /datum/mod_theme/debug name = "debug" desc = "Strangely nostalgic." @@ -940,6 +988,7 @@ default_skin = "debug" armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0) resistance_flags = FIRE_PROOF|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = 50 slowdown_inactive = 0.5 @@ -981,9 +1030,10 @@ default_skin = "debug" armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100) resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT complexity_max = 1000 - cell_drain = DEFAULT_CELL_DRAIN * 0 + charge_drain = DEFAULT_CHARGE_DRAIN * 0 slowdown_inactive = 0 slowdown_active = 0 skins = list( @@ -1007,44 +1057,3 @@ ), ), ) - -/datum/mod_theme/timeline - name = "chrono" - desc = "A suit beyond our time, beyond time itself. Used to traverse timelines and \"correct their course\"." - extended_desc = "A suit whose tech goes beyond this era's understanding. The internal mechanisms are all but \ - completely alien, but the purpose is quite simple. The suit protects the user from the many incredibly lethal \ - and sometimes hilariously painful side effects of jumping timelines, while providing inbuilt equipment for \ - making timeline adjustments to correct a bad course." - default_skin = "timeline" - armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, FIRE = 100, ACID = 100) - resistance_flags = FIRE_PROOF|ACID_PROOF - max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - complexity_max = 15 - slowdown_inactive = 0 - slowdown_active = 0 - skins = list( - "timeline" = list( - HELMET_LAYER = null, - HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE|BLOCK_GAS_SMOKE_EFFECT, - UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, - SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, - UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, - ), - CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - SEALED_INVISIBILITY = HIDEJUMPSUIT, - ), - GAUNTLETS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - BOOTS_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL, - SEALED_CLOTHING = STOPSPRESSUREDAMAGE, - ), - ), - ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 03c75646cd5..e6af768f845 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -1,9 +1,17 @@ /obj/item/mod/control/pre_equipped - cell = /obj/item/stock_parts/cell/high + /// The skin we apply to the suit, defaults to the default_skin of the theme. var/applied_skin + /// The MOD core we apply to the suit. + var/applied_core = /obj/item/mod/core/standard + /// The cell we apply to the core. Only applies to standard core suits. + var/applied_cell = /obj/item/stock_parts/cell/high -/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin) +/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin, new_core) new_skin = applied_skin + new_core = new applied_core(src) + if(istype(new_core, /obj/item/mod/core/standard)) + var/obj/item/mod/core/standard/cell_core = new_core + cell_core.cell = new applied_cell() return ..() /obj/item/mod/control/pre_equipped/standard @@ -11,7 +19,7 @@ /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, - ) + ) /obj/item/mod/control/pre_equipped/engineering theme = /datum/mod_theme/engineering @@ -21,7 +29,7 @@ /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, - ) + ) /obj/item/mod/control/pre_equipped/atmospheric theme = /datum/mod_theme/atmospheric @@ -31,22 +39,22 @@ /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/t_ray, - ) + ) /obj/item/mod/control/pre_equipped/advanced theme = /datum/mod_theme/advanced - cell = /obj/item/stock_parts/cell/super + applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, - ) + ) /obj/item/mod/control/pre_equipped/mining theme = /datum/mod_theme/mining - cell = /obj/item/stock_parts/cell/high/plus + applied_cell = /obj/item/stock_parts/cell/high/plus initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, @@ -54,7 +62,7 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, /obj/item/mod/module/drill, - ) + ) /obj/item/mod/control/pre_equipped/medical theme = /datum/mod_theme/medical @@ -63,69 +71,68 @@ /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/quick_carry, - ) + ) /obj/item/mod/control/pre_equipped/rescue theme = /datum/mod_theme/rescue - cell = /obj/item/stock_parts/cell/super + applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector, - ) + ) /obj/item/mod/control/pre_equipped/research theme = /datum/mod_theme/research - cell = /obj/item/stock_parts/cell/super + applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, /obj/item/mod/module/t_ray, - ) + ) /obj/item/mod/control/pre_equipped/security theme = /datum/mod_theme/security + applied_cell = /obj/item/stock_parts/cell/high/plus initial_modules = list( /obj/item/mod/module/storage, - /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster, - ) + ) /obj/item/mod/control/pre_equipped/safeguard theme = /datum/mod_theme/safeguard - cell = /obj/item/stock_parts/cell/super + applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/large_capacity, - /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster, - ) + ) /obj/item/mod/control/pre_equipped/magnate theme = /datum/mod_theme/magnate - cell = /obj/item/stock_parts/cell/hyper + applied_cell = /obj/item/stock_parts/cell/hyper initial_modules = list( /obj/item/mod/module/storage/large_capacity, - /obj/item/mod/module/welding, + /obj/item/mod/module/jetpack, /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder, - ) + ) /obj/item/mod/control/pre_equipped/cosmohonk theme = /datum/mod_theme/cosmohonk initial_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/bikehorn, - ) + ) /obj/item/mod/control/pre_equipped/traitor theme = /datum/mod_theme/syndicate - cell = /obj/item/stock_parts/cell/super + applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, @@ -133,22 +140,23 @@ /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, - ) + ) /obj/item/mod/control/pre_equipped/nuclear theme = /datum/mod_theme/syndicate - cell = /obj/item/stock_parts/cell/hyper + applied_cell = /obj/item/stock_parts/cell/hyper initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/jetpack, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster, - ) + /obj/item/mod/module/injector, + ) /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite - cell = /obj/item/stock_parts/cell/bluespace + applied_cell = /obj/item/stock_parts/cell/bluespace initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, @@ -156,42 +164,45 @@ /obj/item/mod/module/jetpack, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster, - ) + /obj/item/mod/module/injector, + ) /obj/item/mod/control/pre_equipped/enchanted theme = /datum/mod_theme/enchanted - cell = /obj/item/stock_parts/cell/crystal_cell/wizard + applied_core = /obj/item/mod/core/infinite initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield, - ) + ) /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype - cell = /obj/item/stock_parts/cell/high/plus + applied_cell = /obj/item/stock_parts/cell/upgraded initial_modules = list( /obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/tether, - ) + ) /obj/item/mod/control/pre_equipped/responsory theme = /datum/mod_theme/responsory - cell = /obj/item/stock_parts/cell/hyper + applied_cell = /obj/item/stock_parts/cell/hyper initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster, - ) + ) + /// The insignia type, insignias show what sort of member of the ERT you're dealing with. var/insignia_type = /obj/item/mod/module/insignia + /// Additional module we add, as a treat. var/additional_module = /obj/item/mod/module -/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin) +/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin, new_core) initial_modules.Insert(1, insignia_type) initial_modules.Add(additional_module) return ..() @@ -233,7 +244,7 @@ /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster, - ) + ) /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander insignia_type = /obj/item/mod/module/insignia/commander @@ -253,26 +264,38 @@ /obj/item/mod/control/pre_equipped/apocryphal theme = /datum/mod_theme/apocryphal - cell = /obj/item/stock_parts/cell/bluespace + applied_cell = /obj/item/stock_parts/cell/bluespace initial_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster, - ) + ) /obj/item/mod/control/pre_equipped/corporate theme = /datum/mod_theme/corporate - cell = /obj/item/stock_parts/cell/bluespace + applied_core = /obj/item/mod/core/infinite initial_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/holster, - ) + ) + +/obj/item/mod/control/pre_equipped/chrono + theme = /datum/mod_theme/chrono + applied_core = /obj/item/mod/core/infinite + initial_modules = list( + /obj/item/mod/module/eradication_lock, + /obj/item/mod/module/emp_shield, + /obj/item/mod/module/timeline_jumper, + /obj/item/mod/module/timestopper, + /obj/item/mod/module/rewinder, + /obj/item/mod/module/tem, + ) /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug - cell = /obj/item/stock_parts/cell/bluespace + applied_core = /obj/item/mod/core/infinite initial_modules = list( //one of every type of module, for testing if they all work correctly /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, @@ -281,11 +304,11 @@ /obj/item/mod/module/rad_protection, /obj/item/mod/module/tether, /obj/item/mod/module/injector, - ) + ) /obj/item/mod/control/pre_equipped/administrative theme = /datum/mod_theme/administrative - cell = /obj/item/stock_parts/cell/infinite/abductor + applied_core = /obj/item/mod/core/infinite initial_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, @@ -293,18 +316,6 @@ /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack, - ) - -/obj/item/mod/control/pre_equipped/timeline - theme = /datum/mod_theme/timeline - cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list( - /obj/item/mod/module/eradication_lock, - /obj/item/mod/module/emp_shield, - /obj/item/mod/module/timeline_jumper, - /obj/item/mod/module/timestopper, - /obj/item/mod/module/rewinder, - /obj/item/mod/module/tem, ) //these exist for the prefs menu diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 9a5eb6ec13d..4cfa09f5fb1 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -16,8 +16,8 @@ data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant" data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job" data["AI"] = ai?.name - data["cell"] = cell?.name - data["charge"] = cell ? round(cell.percent(), 1) : 0 + data["core"] = core?.name + data["charge"] = get_charge_percent() data["modules"] = list() for(var/obj/item/mod/module/module as anything in modules) var/list/module_data = list( diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 77121478cfe..4525f9d0028 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -12,11 +12,11 @@ /// How much space it takes up in the MOD var/complexity = 0 /// Power use when idle - var/idle_power_cost = DEFAULT_CELL_DRAIN * 0 + var/idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// Power use when active - var/active_power_cost = DEFAULT_CELL_DRAIN * 0 + var/active_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// Power use when used, we call it manually - var/use_power_cost = DEFAULT_CELL_DRAIN * 0 + var/use_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// ID used by their TGUI var/tgui_id /// Linked MODsuit @@ -106,14 +106,14 @@ if(!COOLDOWN_FINISHED(src, cooldown_timer)) balloon_alert(mod.wearer, "on cooldown!") return FALSE - if(!mod.active || mod.activating || !mod.cell?.charge) + if(!mod.active || mod.activating || !mod.get_charge()) balloon_alert(mod.wearer, "unpowered!") return FALSE if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) //specifically a to_chat because the user is phased out. to_chat(mod.wearer, span_warning("You cannot activate this right now.")) return FALSE - if(SEND_SIGNAL(src, COMSIG_MOD_MODULE_TRIGGERED) & MOD_ABORT_USE) + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) return FALSE if(module_type == MODULE_ACTIVE) if(mod.selected_module && !mod.selected_module.on_deactivation()) @@ -133,6 +133,7 @@ active = TRUE COOLDOWN_START(src, cooldown_timer, cooldown_time) mod.wearer.update_inv_back() + SEND_SIGNAL(src, COMSIG_MODULE_ACTIVATED) return TRUE /// Called when the module is deactivated @@ -149,6 +150,7 @@ UnregisterSignal(mod.wearer, used_signal) used_signal = null mod.wearer.update_inv_back() + SEND_SIGNAL(src, COMSIG_MODULE_DEACTIVATED) return TRUE /// Called when the module is used @@ -162,15 +164,18 @@ //specifically a to_chat because the user is phased out. to_chat(mod.wearer, span_warning("You cannot activate this right now.")) return FALSE - if(SEND_SIGNAL(src, COMSIG_MOD_MODULE_TRIGGERED) & MOD_ABORT_USE) + if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) return FALSE COOLDOWN_START(src, cooldown_timer, cooldown_time) addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) mod.wearer.update_inv_back() + SEND_SIGNAL(src, COMSIG_MODULE_USED) return TRUE /// Called when an activated module without a device is used /obj/item/mod/module/proc/on_select_use(atom/target) + if(mod.wearer.incapacitated(ignore_grab = TRUE)) + return FALSE mod.wearer.face_atom(target) if(!on_use()) return FALSE @@ -197,15 +202,16 @@ /obj/item/mod/module/proc/on_active_process(delta_time) return -/// Drains power from the suit cell +/// Drains power from the suit charge /obj/item/mod/module/proc/drain_power(amount) if(!check_power(amount)) return FALSE - mod.cell.charge = max(0, mod.cell.charge - amount) + mod.subtract_charge(amount) return TRUE +/// Checks if there is enough power in the suit /obj/item/mod/module/proc/check_power(amount) - if(!mod.cell || (mod.cell.charge < amount)) + if(mod.get_charge() < amount) return FALSE return TRUE diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index 870b13bf465..c1e93709b65 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -9,7 +9,7 @@ so this extra armor provides zero ability for extravehicular activity while deployed." icon_state = "armor_booster" module_type = MODULE_TOGGLE - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 removable = FALSE incompatible_modules = list(/obj/item/mod/module/armor_booster) cooldown_time = 0.5 SECONDS @@ -44,8 +44,6 @@ var/obj/item/clothing/clothing_part = part if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE) clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE - clothing_part.heat_protection = NONE - clothing_part.cold_protection = NONE spaceproofed[clothing_part] = TRUE /obj/item/mod/module/armor_booster/on_deactivation() @@ -66,8 +64,6 @@ var/obj/item/clothing/clothing_part = part if(spaceproofed[clothing_part]) clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE - clothing_part.heat_protection = initial(clothing_part.heat_protection) - clothing_part.cold_protection = initial(clothing_part.cold_protection) spaceproofed = list() /obj/item/mod/module/armor_booster/elite @@ -84,8 +80,8 @@ though with its' low amount of separate charges, the user remains mortal." icon_state = "energy_shield" complexity = 3 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 - use_power_cost = DEFAULT_CELL_DRAIN * 2 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/energy_shield) /// Max charges of the shield. var/max_charges = 3 @@ -134,8 +130,8 @@ This shield can perfectly nullify attacks ranging from high-caliber rifles to magic missiles, \ though can also be drained by more mundane attacks. It will not protect the caster from social ridicule." icon_state = "battlemage_shield" - idle_power_cost = DEFAULT_CELL_DRAIN * 0 //magic - use_power_cost = DEFAULT_CELL_DRAIN * 0 //magic too + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 //magic + use_power_cost = DEFAULT_CHARGE_DRAIN * 0 //magic too max_charges = 15 recharge_start_delay = 0 SECONDS charge_recovery = 8 @@ -226,7 +222,7 @@ in protest of these modules being legal." icon_state = "noslip" complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.1 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.1 incompatible_modules = list(/obj/item/mod/module/noslip) /obj/item/mod/module/noslip/on_suit_activation() diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 9f1e5871553..4910611c51e 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -26,7 +26,7 @@ icon_state = "tray" module_type = MODULE_TOGGLE complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.2 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/t_ray) cooldown_time = 0.5 SECONDS /// T-ray scan range. @@ -45,7 +45,7 @@ icon_state = "magnet" module_type = MODULE_TOGGLE complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN * 0.5 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/magboot, /obj/item/mod/module/atrocinator) cooldown_time = 0.5 SECONDS /// Slowdown added onto the suit. @@ -86,7 +86,7 @@ icon_state = "tether" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/tether) cooldown_time = 1.5 SECONDS @@ -144,7 +144,7 @@ giving a voice to an otherwise silent killer." icon_state = "radshield" complexity = 2 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/rad_protection) tgui_id = "rad_counter" /// Radiation threat level being perceived. @@ -187,8 +187,8 @@ icon_state = "constructor" module_type = MODULE_USABLE complexity = 2 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.2 - use_power_cost = DEFAULT_CELL_DRAIN * 2 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) cooldown_time = 11 SECONDS @@ -218,8 +218,8 @@ module_type = MODULE_TOGGLE // complexity = 3 complexity = 0 - active_power_cost = DEFAULT_CELL_DRAIN*0.75 -// use_power_cost = DEFAULT_CELL_DRAIN*3 + active_power_cost = DEFAULT_CHARGE_DRAIN*0.75 +// use_power_cost = DEFAULT_CHARGE_DRAIN*3 removable = FALSE incompatible_modules = list(/obj/item/mod/module/kinesis) cooldown_time = 0.5 SECONDS diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 15858af1b1e..9f13e61b659 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -32,12 +32,20 @@ modstorage.max_combined_w_class = max_combined_w_class modstorage.max_items = max_items SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + RegisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP, .proc/on_chestplate_unequip) /obj/item/mod/module/storage/on_uninstall() var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage) storage.slaves -= modstorage qdel(modstorage) SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + UnregisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP) + +/obj/item/mod/module/storage/proc/on_chestplate_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) + if(QDELETED(source) || newloc == mod.wearer || !mod.wearer.s_store) + return + to_chat(mod.wearer, span_notice("[src] tries to store [mod.wearer.s_store] inside itself.")) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_INSERT, mod.wearer.s_store, mod.wearer, TRUE) /obj/item/mod/module/storage/large_capacity name = "MOD expanded storage module" @@ -72,12 +80,12 @@ name = "MOD ion jetpack module" desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \ Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \ - charge from the suit's cell. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits." + charge from the suit's charge. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits." icon_state = "jetpack" module_type = MODULE_TOGGLE complexity = 3 - active_power_cost = DEFAULT_CELL_DRAIN * 0.5 - use_power_cost = DEFAULT_CELL_DRAIN + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/jetpack) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_jetpack" @@ -200,7 +208,7 @@ However, it will take from the suit's power to do so. Luckily, your PDA already has one of these." icon_state = "empshield" complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/emp_shield) /obj/item/mod/module/emp_shield/on_install() @@ -218,7 +226,7 @@ icon_state = "flashlight" module_type = MODULE_TOGGLE complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/flashlight) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_light" @@ -227,8 +235,8 @@ light_range = 3 light_power = 1 light_on = FALSE - /// Cell drain per range amount. - var/base_power = DEFAULT_CELL_DRAIN * 0.1 + /// Charge drain per range amount. + var/base_power = DEFAULT_CHARGE_DRAIN * 0.1 /// Minimum range we can set. var/min_range = 2 /// Maximum range we can set. @@ -287,13 +295,13 @@ /obj/item/mod/module/dispenser name = "MOD burger dispenser module" desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \ - This can draw incredible amounts of power from the suit's cell to create edible organic matter in the \ + This can draw incredible amounts of power from the suit's charge to create edible organic matter in the \ palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \ Notably, all attempts to get it to dispense Earl Grey tea have failed." icon_state = "dispenser" module_type = MODULE_USABLE complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN * 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 2 incompatible_modules = list(/obj/item/mod/module/dispenser) cooldown_time = 5 SECONDS /// Path we dispense. @@ -323,7 +331,7 @@ Useful for mining, monorail tracks, or even skydiving!" icon_state = "longfall" complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/longfall) /obj/item/mod/module/longfall/on_suit_activation() @@ -349,7 +357,7 @@ icon_state = "regulator" module_type = MODULE_TOGGLE complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/thermal_regulator) cooldown_time = 0.5 SECONDS /// The temperature we are regulating to. @@ -384,7 +392,7 @@ Nakamura Engineering swears up and down there's airbrakes." icon_state = "pathfinder" complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 10 + use_power_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/pathfinder) /// The pathfinding implant. var/obj/item/implant/mod/implant @@ -425,12 +433,11 @@ if(!ishuman(user)) return var/mob/living/carbon/human/human_user = user - if(human_user.back && !human_user.dropItemToGround(human_user.back)) + if(human_user.get_item_by_slot(mod.slot_flags) && !human_user.dropItemToGround(human_user.get_item_by_slot(mod.slot_flags))) return if(!human_user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) return - for(var/obj/item/part as anything in mod.mod_parts) - mod.deploy(null, part) + mod.quick_deploy(user) human_user.update_action_buttons(TRUE) balloon_alert(human_user, "[mod] attached") playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) @@ -531,7 +538,7 @@ ..() implant = Target -/datum/action/item_action/mod_recall/Trigger() +/datum/action/item_action/mod_recall/Trigger(trigger_flags) . = ..() if(!.) return @@ -550,7 +557,7 @@ icon_state = "dnalock" module_type = MODULE_USABLE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 3 + use_power_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/dna_lock, /obj/item/mod/module/eradication_lock) cooldown_time = 0.5 SECONDS /// The DNA we lock with. @@ -627,7 +634,7 @@ The purple glass of the visor seems to be constructed for nostalgic purposes." icon_state = "plasma_stabilizer" complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) overlay_state_inactive = "module_plasma" diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index 6a844525031..90fe9ac5ca8 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -12,10 +12,10 @@ incompatible_modules = list(/obj/item/mod/module/springlock) /obj/item/mod/module/springlock/on_install() - mod.activation_step_time *= 0.75 + mod.activation_step_time *= 0.5 /obj/item/mod/module/springlock/on_uninstall() - mod.activation_step_time /= 0.75 + mod.activation_step_time *= 2 /obj/item/mod/module/springlock/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, .proc/on_wearer_exposed) @@ -26,6 +26,7 @@ ///Signal fired when wearer is exposed to reagents /obj/item/mod/module/springlock/proc/on_wearer_exposed(atom/source, list/reagents, datum/reagents/source_reagents, methods, volume_modifier, show_message) SIGNAL_HANDLER + if(!(methods & (VAPOR|PATCH|TOUCH))) return //remove non-touch reagent exposure to_chat(mod.wearer, span_danger("[src] makes an ominous click sound...")) @@ -36,6 +37,7 @@ ///Signal fired when wearer attempts to activate/deactivate suits /obj/item/mod/module/springlock/proc/on_activate_spring_block(datum/source, user) SIGNAL_HANDLER + balloon_alert(user, "springlocks aren't responding...?") return MOD_CANCEL_ACTIVATE @@ -49,7 +51,7 @@ playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5) playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5) mod.wearer.client?.give_award(/datum/award/achievement/misc/springlock, mod.wearer) - mod.wearer.apply_damage(500, BRUTE, forced = TRUE, sharpness = SHARP_POINTY, def_zone = BODY_ZONE_CHEST) //boggers, bogchamp, etc + mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE, sharpness = SHARP_POINTY) //boggers, bogchamp, etc mod.wearer.death() //just in case, for some reason, they're still alive flash_color(mod.wearer, flash_color = "#FF0000", flash_time = 10 SECONDS) @@ -70,13 +72,13 @@ var/list/songs = list() /// A list of the colors the module can take. var/static/list/rainbow_order = list( - "#FF6666", - "#FFAA66", - "#FFFF66", - "#66FF66", - "#66AAFF", - "#AA66FF", - ) + list(1,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0), + list(1,0,0,0, 0,0.5,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0), + list(1,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0), + list(0,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0), + list(0,0,0,0, 0,0.5,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0), + list(1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1, 0,0,0,0), + ) /obj/item/mod/module/visor/rave/Initialize(mapload) . = ..() @@ -102,7 +104,7 @@ rave_screen = mod.wearer.add_client_colour(/datum/client_colour/rave) rave_screen.update_colour(rainbow_order[rave_number]) if(selection) - mod.wearer.playsound_local(get_turf(src), null, 50, channel = CHANNEL_JUKEBOX, S = sound(selection.song_path), use_reverb = FALSE) + SEND_SOUND(mod.wearer, sound(selection.song_path, volume = 50, channel = CHANNEL_JUKEBOX)) /obj/item/mod/module/visor/rave/on_deactivation() . = ..() @@ -111,6 +113,7 @@ QDEL_NULL(rave_screen) if(selection) mod.wearer.stop_sound_channel(CHANNEL_JUKEBOX) + SEND_SOUND(mod.wearer, sound('sound/machines/terminal_off.ogg', volume = 50, channel = CHANNEL_JUKEBOX)) /obj/item/mod/module/visor/rave/generate_worn_overlay(mutable_appearance/standing) . = ..() @@ -127,7 +130,7 @@ /obj/item/mod/module/visor/rave/get_configuration() . = ..() if(length(songs)) - .["selection"] = add_ui_configuration("Song", "list", selection.song_name, songs) + .["selection"] = add_ui_configuration("Song", "list", selection.song_name, clean_songs()) /obj/item/mod/module/visor/rave/configure_edit(key, value) switch(key) @@ -136,6 +139,11 @@ return selection = songs[value] +/obj/item/mod/module/visor/rave/proc/clean_songs() + . = list() + for(var/track in songs) + . += track + ///Tanner - Tans you with spraytan. /obj/item/mod/module/tanner name = "MOD tanning module" @@ -144,7 +152,7 @@ icon_state = "tanning" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/tanner) cooldown_time = 30 SECONDS @@ -167,7 +175,7 @@ icon_state = "bloon" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN*0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN*0.5 incompatible_modules = list(/obj/item/mod/module/balloon) cooldown_time = 15 SECONDS @@ -183,7 +191,7 @@ mod.wearer.put_in_hands(balloon) drain_power(use_power_cost) -/// Paper Dispenser - Dispenses (sometimes burning) paper sheets. +///Paper Dispenser - Dispenses (sometimes burning) paper sheets. /obj/item/mod/module/paper_dispenser name = "MOD paper dispenser module" desc = "A simple module designed by the bureaucrats of Torch Bay. \ @@ -191,7 +199,7 @@ icon_state = "paper_maker" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN * 0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/paper_dispenser) cooldown_time = 5 SECONDS /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. @@ -233,8 +241,8 @@ icon_state = "atrocinator" module_type = MODULE_TOGGLE complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/atrocinator, /obj/item/mod/module/magboot) + active_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/atrocinator, /obj/item/mod/module/magboot, /obj/item/mod/module/anomaly_locked/antigrav) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_atrocinator" /// How many steps the user has taken since turning the suit on, used for footsteps. diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index e32d5ed0f4f..9f42354b48f 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -14,7 +14,7 @@ icon_state = "health" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/health_analyzer) cooldown_time = 0.5 SECONDS tgui_id = "health_analyzer" @@ -67,7 +67,7 @@ or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat." icon_state = "carry" complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) /obj/item/mod/module/quick_carry/on_suit_activation() @@ -98,7 +98,7 @@ icon_state = "injector" module_type = MODULE_ACTIVE complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 device = /obj/item/reagent_containers/syringe/mod incompatible_modules = list(/obj/item/mod/module/injector) cooldown_time = 0.5 SECONDS @@ -125,7 +125,7 @@ icon_state = "organ_thrower" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/organ_thrower, /obj/item/mod/module/microwave_beam) cooldown_time = 0.5 SECONDS var/max_organs = 5 diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index f44661f66da..fa179feca9b 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -9,7 +9,7 @@ icon_state = "scanner" module_type = MODULE_TOGGLE complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.2 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/reagent_scanner) cooldown_time = 0.5 SECONDS @@ -64,7 +64,7 @@ to the HUD. Useful for universal translation, or perhaps as a calculator." module_type = MODULE_USABLE complexity = 3 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/circuit) cooldown_time = 0.5 SECONDS var/obj/item/integrated_circuit/circuit @@ -79,11 +79,11 @@ starting_circuit = circuit, \ ) -/obj/item/mod/module/circuit/on_install() +/*/obj/item/mod/module/circuit/on_install() circuit.set_cell(mod.cell) /obj/item/mod/module/circuit/on_uninstall() - circuit.set_cell(mod.cell) + circuit.set_cell(mod.cell)*/ /obj/item/mod/module/circuit/on_suit_activation() circuit.set_on(TRUE) @@ -254,7 +254,8 @@ icon_state = "antigrav" module_type = MODULE_TOGGLE complexity = 3 - active_power_cost = DEFAULT_CELL_DRAIN * 0.7 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.7 + incompatible_modules = list(/obj/item/mod/module/anomaly_locked, /obj/item/mod/module/atrocinator) cooldown_time = 0.5 SECONDS accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav) @@ -288,7 +289,7 @@ icon_state = "teleporter" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 5 SECONDS accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace) /// Time it takes to teleport @@ -307,9 +308,11 @@ animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = user_matrix.Scale(4, 0.25), easing = EASE_OUT) if(!do_after(mod.wearer, teleport_time, target = mod)) balloon_alert(mod.wearer, "interrupted!") - animate(mod.wearer, teleport_time, color = null, transform = user_matrix.Scale(0.25, 4), easing = EASE_IN) + var/matrix/post_matrix = matrix(mod.wearer.transform) + animate(mod.wearer, teleport_time, color = null, transform = post_matrix.Scale(0.25, 4), easing = EASE_IN) return - animate(mod.wearer, teleport_time*0.1, color = null, transform = user_matrix.Scale(0.25, 4), easing = EASE_IN) + var/matrix/post_matrix = matrix(mod.wearer.transform) + animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Scale(0.25, 4), easing = EASE_IN) if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg')) return drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index b44a2857412..4e7b1bb671c 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -9,8 +9,8 @@ icon_state = "cloak" module_type = MODULE_TOGGLE complexity = 4 - active_power_cost = DEFAULT_CELL_DRAIN * 2 - use_power_cost = DEFAULT_CELL_DRAIN * 10 + active_power_cost = DEFAULT_CHARGE_DRAIN * 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 10 incompatible_modules = list(/obj/item/mod/module/stealth) cooldown_time = 5 SECONDS /// Whether or not the cloak turns off on bumping. @@ -26,7 +26,7 @@ RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth) RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack) RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) - RegisterSignal(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), .proc/unstealth) + RegisterSignal(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), .proc/unstealth) animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) drain_power(use_power_cost) @@ -66,13 +66,13 @@ desc = "The latest in stealth technology, this module is a definite upgrade over previous versions. \ The field has been tuned to be even more responsive and fast-acting, with enough stability to \ continue operation of the field even if the user bumps into others. \ - The draw on the power cell has been reduced drastically, \ - making this perfect for activities like standing near sentry turrets for extended periods of time." + The power draw has been reduced drastically, making this perfect for activities like \ + standing near sentry turrets for extended periods of time." icon_state = "cloak_ninja" bumpoff = FALSE stealth_alpha = 20 - active_power_cost = DEFAULT_CELL_DRAIN - use_power_cost = DEFAULT_CELL_DRAIN * 5 + active_power_cost = DEFAULT_CHARGE_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 3 SECONDS ///Holster - Instantly holsters any not huge gun. @@ -85,7 +85,7 @@ icon_state = "holster" module_type = MODULE_USABLE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 0.5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 incompatible_modules = list(/obj/item/mod/module/holster) cooldown_time = 0.5 SECONDS /// Gun we have holstered. diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 86b7a704294..3c5526232b6 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -8,7 +8,7 @@ icon_state = "bikehorn" module_type = MODULE_USABLE complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/bikehorn) cooldown_time = 1 SECONDS @@ -28,7 +28,7 @@ icon_state = "microwave_beam" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/microwave_beam, /obj/item/mod/module/organ_thrower) cooldown_time = 10 SECONDS @@ -64,8 +64,8 @@ miniaturized etheric blasts of space-time beneath the user's feet, this enables them to... \ to waddle around, bouncing to and fro with a pep in their step." icon_state = "waddle" - idle_power_cost = DEFAULT_CELL_DRAIN * 0.2 - removable = FALSE + complexity = 1 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/waddle) /obj/item/mod/module/waddle/on_suit_activation() diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index b97be7ab5e2..1a2d69e8989 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -9,7 +9,7 @@ icon_state = "gps" module_type = MODULE_ACTIVE complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 device = /obj/item/gps/mod incompatible_modules = list(/obj/item/mod/module/gps) cooldown_time = 0.5 SECONDS @@ -29,7 +29,7 @@ icon_state = "clamp" module_type = MODULE_ACTIVE complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/clamp) cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_clamp" @@ -73,7 +73,7 @@ playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) drain_power(use_power_cost) -/obj/item/mod/module/clamp/on_uninstall() +/obj/item/mod/module/clamp/on_suit_deactivation() for(var/atom/movable/crate as anything in stored_crates) crate.forceMove(drop_location()) stored_crates -= crate @@ -86,7 +86,7 @@ icon_state = "drill" module_type = MODULE_ACTIVE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CHARGE_DRAIN incompatible_modules = list(/obj/item/mod/module/drill) cooldown_time = 0.5 SECONDS @@ -136,7 +136,7 @@ icon_state = "ore" module_type = MODULE_USABLE complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 0.2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 incompatible_modules = list(/obj/item/mod/module/orebag) cooldown_time = 0.5 SECONDS /// The ores stored in the bag. diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 078fedd2290..69bcbe667c2 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -12,11 +12,10 @@ out to be a good deterrent." icon_state = "eradicationlock" module_type = MODULE_USABLE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 3 + removable = FALSE + use_power_cost = DEFAULT_CHARGE_DRAIN * 3 incompatible_modules = list(/obj/item/mod/module/eradication_lock, /obj/item/mod/module/dna_lock) cooldown_time = 0.5 SECONDS - removable = FALSE //copy paste this comment - no timeline modules should be removable /// The ckey we lock with, to allow all alternate versions of the user, huhehuehe var/true_owner_ckey @@ -62,11 +61,10 @@ safety reasons while preparing a rewind." icon_state = "rewinder" module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + removable = FALSE + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/rewinder) cooldown_time = 20 SECONDS - removable = FALSE //copy paste this comment - no timeline modules should be removable /obj/item/mod/module/rewinder/on_use() . = ..() @@ -76,15 +74,15 @@ playsound(src, 'sound/items/modsuit/time_anchor_set.ogg', 50, TRUE) //stops all mods from triggering during rewinding for(var/obj/item/mod/module/module as anything in mod.modules) - RegisterSignal(module, COMSIG_MOD_MODULE_TRIGGERED, .proc/on_module_triggered) + RegisterSignal(module, COMSIG_MODULE_TRIGGERED, .proc/on_module_triggered) mod.wearer.AddComponent(/datum/component/dejavu/timeline, 1, 10 SECONDS) RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_activate_block) addtimer(CALLBACK(src, .proc/unblock_suit_activation), 10 SECONDS) -///unregisters the modsuit deactivation blocking signal, after dejavu functionality finishes. +///Unregisters the modsuit deactivation blocking signal, after dejavu functionality finishes. /obj/item/mod/module/rewinder/proc/unblock_suit_activation() for(var/obj/item/mod/module/module as anything in mod.modules) - UnregisterSignal(module, COMSIG_MOD_MODULE_TRIGGERED) + UnregisterSignal(module, COMSIG_MODULE_TRIGGERED) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) ///Signal fired when wearer attempts to activate/deactivate suits @@ -99,7 +97,7 @@ balloon_alert(mod.wearer, "not while rewinding!") return MOD_ABORT_USE -///timestopper - Need I really explain? It's the wizard's time stop, but the user channels it by not moving instead of a duration. +///Timestopper - Need I really explain? It's the wizard's time stop, but the user channels it by not moving instead of a duration. /obj/item/mod/module/timestopper name = "MOD timestopper module" desc = "A module that can halt time in a small radius around the user... for as long as they \ @@ -107,11 +105,10 @@ module has a hefty cooldown period to avoid reality errors." icon_state = "timestop" module_type = MODULE_USABLE - complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + removable = FALSE + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/timestopper) cooldown_time = 60 SECONDS - removable = FALSE //copy paste this comment - no timeline modules should be removable ///the current timestop in progress var/obj/effect/timestop/channelled/timestop @@ -124,15 +121,15 @@ return //stops all mods from triggering during timestop- including timestop itself for(var/obj/item/mod/module/module as anything in mod.modules) - RegisterSignal(module, COMSIG_MOD_MODULE_TRIGGERED, .proc/on_module_triggered) + RegisterSignal(module, COMSIG_MODULE_TRIGGERED, .proc/on_module_triggered) timestop = new /obj/effect/timestop/channelled(get_turf(mod.wearer), 2, INFINITY, list(mod.wearer)) RegisterSignal(timestop, COMSIG_PARENT_QDELETING, .proc/unblock_suit_activation) -///unregisters the modsuit deactivation blocking signal, after timestop functionality finishes. +///Unregisters the modsuit deactivation blocking signal, after timestop functionality finishes. /obj/item/mod/module/timestopper/proc/unblock_suit_activation(datum/source) SIGNAL_HANDLER for(var/obj/item/mod/module/module as anything in mod.modules) - UnregisterSignal(module, COMSIG_MOD_MODULE_TRIGGERED) + UnregisterSignal(module, COMSIG_MODULE_TRIGGERED) UnregisterSignal(source, COMSIG_PARENT_QDELETING) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) timestop = null @@ -149,18 +146,17 @@ balloon_alert(user, "not while channelling timestop!") return MOD_CANCEL_ACTIVATE -///timeline jumper - Infinite phasing. needs some special effects +///Timeline Jumper - Infinite phasing. needs some special effects /obj/item/mod/module/timeline_jumper name = "MOD timeline jumper module" desc = "A module used to traverse timelines, phasing the user in and out of the stream of events." icon_state = "timeline_jumper" module_type = MODULE_USABLE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + removable = FALSE + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/timeline_jumper) cooldown_time = 5 SECONDS allowed_in_phaseout = TRUE - removable = FALSE //copy paste this comment - no timeline modules should be removable ///the dummy for phasing from this module, the wearer is phased out while this exists. var/obj/effect/dummy/phased_mob/chrono/phased_mob @@ -210,11 +206,10 @@ timestream. They never are, they never were, they never will be." icon_state = "chronogun" module_type = MODULE_ACTIVE - complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN * 5 + removable = FALSE + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 incompatible_modules = list(/obj/item/mod/module/tem) cooldown_time = 0.5 SECONDS - removable = FALSE //copy paste this comment - no timeline modules should be removable ///reference to the chrono field being controlled by this module var/obj/structure/chrono_field/field = null ///where the chronofield maker was when the field went up diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index 99069f8d093..59473ae691b 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -6,7 +6,7 @@ desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." module_type = MODULE_TOGGLE complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 incompatible_modules = list(/obj/item/mod/module/visor) cooldown_time = 0.5 SECONDS /// The HUD type given by the visor. diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 27bd102d790..f192dedc27a 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -426,10 +426,6 @@ . = ..() charge = 50000 -/obj/item/stock_parts/cell/crystal_cell/wizard - desc = "A very high power cell made from crystallized magic." - chargerate = 5000 - /obj/item/stock_parts/cell/inducer_supply maxcharge = 5000 charge = 5000 diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0fd0066a794..a330e0c47db 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -687,7 +687,7 @@ button_icon_state = "sniper_zoom" var/obj/item/gun/gun = null -/datum/action/toggle_scope_zoom/Trigger() +/datum/action/toggle_scope_zoom/Trigger(trigger_flags) . = ..() if(!.) return diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index f353be2442f..48f2a525ca3 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1106,6 +1106,12 @@ materials = list(/datum/material/iron = 2500, /datum/material/glass = 500) build_path = /obj/item/mod/module/storage +/datum/design/module/mod_storage_expanded + name = "MOD Module: Expanded Storage" + id = "mod_storage_expanded" + materials = list(/datum/material/iron = 5000, /datum/material/uranium = 2000) + build_path = /obj/item/mod/module/storage/large_capacity + /datum/design/module/mod_visor_medhud name = "MOD Module: Medical Visor" id = "mod_visor_medhud" @@ -1137,7 +1143,7 @@ /datum/design/module/mod_visor_welding name = "MOD Module: Welding Protection" id = "mod_welding" - materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/welding department_type = MODULE_ENGINEERING @@ -1261,6 +1267,13 @@ build_path = /obj/item/mod/module/injector department_type = MODULE_MEDICAL +/datum/design/module/mod_bikehorn + name = "MOD Module: Bike Horn" + id = "mod_bikehorn" + materials = list(/datum/material/plastic = 500, /datum/material/iron = 500) + build_path = /obj/item/mod/module/bikehorn + department_type = MODULE_SERVICE + /datum/design/module/mod_microwave_beam name = "MOD Module: Microwave Beam" id = "mod_microwave_beam" @@ -1268,11 +1281,11 @@ build_path = /obj/item/mod/module/microwave_beam department_type = MODULE_SERVICE -/datum/design/module/mod_bikehorn - name = "MOD Module: Bike Horn" - id = "mod_bikehorn" - materials = list(/datum/material/plastic = 500, /datum/material/iron = 500) - build_path = /obj/item/mod/module/bikehorn +/datum/design/module/mod_waddle + name = "MOD Module: Waddle" + id = "mod_waddle" + materials = list(/datum/material/plastic = 1000, /datum/material/iron = 1000) + build_path = /obj/item/mod/module/waddle department_type = MODULE_SERVICE /datum/design/module/mod_clamp diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 387f0c0e98c..e13f518c443 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1490,6 +1490,7 @@ "mod_jetpack", "mod_rad_protection", "mod_emp_shield", + "mod_storage_expanded", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) @@ -1532,6 +1533,7 @@ "mod_armor_cosmohonk", "mod_bikehorn", "mod_microwave_beam", + "mod_waddle", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm index 7fe659016b4..20a6236e7c5 100644 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm @@ -64,7 +64,7 @@ Slimecrossing Armor icon_icon = 'icons/obj/slimecrossing.dmi' button_icon_state = "prismcolor" -/datum/action/item_action/change_prism_colour/Trigger() +/datum/action/item_action/change_prism_colour/Trigger(trigger_flags) if(!IsAvailable()) return var/obj/item/clothing/glasses/prism_glasses/glasses = target @@ -78,7 +78,7 @@ Slimecrossing Armor icon_icon = 'icons/obj/slimecrossing.dmi' button_icon_state = "lightprism" -/datum/action/item_action/place_light_prism/Trigger() +/datum/action/item_action/place_light_prism/Trigger(trigger_flags) if(!IsAvailable()) return var/obj/item/clothing/glasses/prism_glasses/glasses = target diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index a6c07c4a4ac..8faf880d2a1 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -337,7 +337,7 @@ GLOBAL_VAR_INIT(hhMysteryRoomNumber, rand(1, 999999)) desc = "Stop looking through the bluespace peephole." button_icon_state = "cancel_peephole" -/datum/action/peephole_cancel/Trigger() +/datum/action/peephole_cancel/Trigger(trigger_flags) . = ..() to_chat(owner, span_warning("You move away from the peephole.")) owner.reset_perspective() diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index a7326ea0973..1fef114b341 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -35,7 +35,7 @@ /datum/action/item_action/hands_free/activate_pill name = "Activate Pill" -/datum/action/item_action/hands_free/activate_pill/Trigger() +/datum/action/item_action/hands_free/activate_pill/Trigger(trigger_flags) if(!..()) return FALSE var/obj/item/item_target = target diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index f1cbb1220f8..ef98d9c876a 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -149,7 +149,7 @@ name = "Pump your blood" //You are now brea- pumping blood manually -/datum/action/item_action/organ_action/cursed_heart/Trigger() +/datum/action/item_action/organ_action/cursed_heart/Trigger(trigger_flags) . = ..() if(. && istype(target, /obj/item/organ/heart/cursed)) var/obj/item/organ/heart/cursed/cursed_heart = target diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 7561be778c3..e80535477b7 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -125,7 +125,7 @@ QDEL_NULL(statue) . = ..() -/datum/action/item_action/organ_action/statue/Trigger() +/datum/action/item_action/organ_action/statue/Trigger(trigger_flags) . = ..() if(!iscarbon(owner)) to_chat(owner, span_warning("Your body rejects the powers of the tongue!")) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 430d5467f49..95a1d7557a3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -32,7 +32,7 @@ actions_types = list(/datum/action/item_action/organ_action/use/adamantine_vocal_cords) icon_state = "adamantine_cords" -/datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger() +/datum/action/item_action/organ_action/use/adamantine_vocal_cords/Trigger(trigger_flags) if(!IsAvailable()) return var/message = tgui_input_text(owner, "Resonate a message to all nearby golems", "Resonate") @@ -86,7 +86,7 @@ return FALSE return TRUE -/datum/action/item_action/organ_action/colossus/Trigger() +/datum/action/item_action/organ_action/colossus/Trigger(trigger_flags) . = ..() if(!IsAvailable()) if(world.time < cords.next_command) diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index a472fe9820d..54548cca0bf 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -238,7 +238,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe for(var/O in chassis.occupants) var/mob/living/occupant = O var/datum/action/action = LAZYACCESSASSOC(chassis.occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/mech_defense_mode) - action.Trigger(FALSE) + action.Trigger() atom_integrity = 10000 /obj/durand_shield/play_attack_sound() diff --git a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm index 50ecda7b040..eb03af7b1f2 100644 --- a/code/modules/vehicles/mecha/combat/savannah_ivanov.dm +++ b/code/modules/vehicles/mecha/combat/savannah_ivanov.dm @@ -304,7 +304,7 @@ name = "Savannah Skyfall" button_icon_state = "mech_savannah" -/datum/action/vehicle/sealed/mecha/skyfall/Trigger() +/datum/action/vehicle/sealed/mecha/skyfall/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return var/obj/vehicle/sealed/mecha/combat/savannah_ivanov/savannah_mecha = chassis @@ -333,7 +333,7 @@ name = "Ivanov Strike" button_icon_state = "mech_ivanov" -/datum/action/vehicle/sealed/mecha/ivanov_strike/Trigger() +/datum/action/vehicle/sealed/mecha/ivanov_strike/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return var/obj/vehicle/sealed/mecha/combat/savannah_ivanov/ivanov_mecha = chassis diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 25bd29178c3..744897f891a 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -19,7 +19,7 @@ name = "Eject From Mech" button_icon_state = "mech_eject" -/datum/action/vehicle/sealed/mecha/mech_eject/Trigger() +/datum/action/vehicle/sealed/mecha/mech_eject/Trigger(trigger_flags) if(!owner) return if(!chassis || !(owner in chassis.occupants)) @@ -30,7 +30,7 @@ name = "Toggle Internal Airtank Usage" button_icon_state = "mech_internals_off" -/datum/action/vehicle/sealed/mecha/mech_toggle_internals/Trigger() +/datum/action/vehicle/sealed/mecha/mech_toggle_internals/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -44,7 +44,7 @@ name = "Cycle Equipment" button_icon_state = "mech_cycle_equip_off" -/datum/action/vehicle/sealed/mecha/mech_cycle_equip/Trigger() +/datum/action/vehicle/sealed/mecha/mech_cycle_equip/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -90,7 +90,7 @@ name = "Toggle Lights" button_icon_state = "mech_lights_off" -/datum/action/vehicle/sealed/mecha/mech_toggle_lights/Trigger() +/datum/action/vehicle/sealed/mecha/mech_toggle_lights/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -112,7 +112,7 @@ name = "View Stats" button_icon_state = "mech_view_stats" -/datum/action/vehicle/sealed/mecha/mech_view_stats/Trigger() +/datum/action/vehicle/sealed/mecha/mech_view_stats/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -125,7 +125,7 @@ name = "Toggle Strafing. Disabled when Alt is held." button_icon_state = "strafe" -/datum/action/vehicle/sealed/mecha/strafe/Trigger() +/datum/action/vehicle/sealed/mecha/strafe/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -161,14 +161,14 @@ name = "Toggle an energy shield that blocks all attacks from the faced direction at a heavy power cost." button_icon_state = "mech_defense_mode_off" -/datum/action/vehicle/sealed/mecha/mech_defense_mode/Trigger(forced_state = FALSE) +/datum/action/vehicle/sealed/mecha/mech_defense_mode/Trigger(trigger_flags, forced_state = FALSE) SEND_SIGNAL(chassis, COMSIG_MECHA_ACTION_TRIGGER, owner, args) //Signal sent to the mech, to be handed to the shield. See durand.dm for more details /datum/action/vehicle/sealed/mecha/mech_overload_mode name = "Toggle leg actuators overload" button_icon_state = "mech_overload_off" -/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(forced_state = null) +/datum/action/vehicle/sealed/mecha/mech_overload_mode/Trigger(trigger_flags, forced_state = null) if(!owner || !chassis || !(owner in chassis.occupants)) return if(!isnull(forced_state)) @@ -191,7 +191,7 @@ name = "Smoke" button_icon_state = "mech_smoke" -/datum/action/vehicle/sealed/mecha/mech_smoke/Trigger() +/datum/action/vehicle/sealed/mecha/mech_smoke/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return if(!TIMER_COOLDOWN_CHECK(src, COOLDOWN_MECHA_SMOKE) && chassis.smoke_charges>0) @@ -204,7 +204,7 @@ name = "Zoom" button_icon_state = "mech_zoom_off" -/datum/action/vehicle/sealed/mecha/mech_zoom/Trigger() +/datum/action/vehicle/sealed/mecha/mech_zoom/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return if(owner.client) @@ -223,7 +223,7 @@ name = "Reconfigure arm microtool arrays" button_icon_state = "mech_damtype_brute" -/datum/action/vehicle/sealed/mecha/mech_switch_damtype/Trigger() +/datum/action/vehicle/sealed/mecha/mech_switch_damtype/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return var/new_damtype @@ -246,7 +246,7 @@ name = "Toggle Phasing" button_icon_state = "mech_phasing_off" -/datum/action/vehicle/sealed/mecha/mech_toggle_phasing/Trigger() +/datum/action/vehicle/sealed/mecha/mech_toggle_phasing/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return chassis.phasing = chassis.phasing ? "" : "phasing" @@ -259,7 +259,7 @@ name = "Switch Seats" button_icon_state = "mech_seat_swap" -/datum/action/vehicle/sealed/mecha/swap_seat/Trigger() +/datum/action/vehicle/sealed/mecha/swap_seat/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return @@ -291,7 +291,7 @@ button_icon_state = "mech_search_ruins" COOLDOWN_DECLARE(search_cooldown) -/datum/action/vehicle/sealed/mecha/mech_search_ruins/Trigger() +/datum/action/vehicle/sealed/mecha/mech_search_ruins/Trigger(trigger_flags) if(!owner || !chassis || !(owner in chassis.occupants)) return if(!COOLDOWN_FINISHED(src, search_cooldown)) diff --git a/code/modules/vehicles/vehicle_actions.dm b/code/modules/vehicles/vehicle_actions.dm index 055d81afc19..aab97e75025 100644 --- a/code/modules/vehicles/vehicle_actions.dm +++ b/code/modules/vehicles/vehicle_actions.dm @@ -184,7 +184,7 @@ desc = "Climb out of your vehicle!" button_icon_state = "car_eject" -/datum/action/vehicle/sealed/climb_out/Trigger() +/datum/action/vehicle/sealed/climb_out/Trigger(trigger_flags) if(..() && istype(vehicle_entered_target)) vehicle_entered_target.mob_try_exit(owner, owner) @@ -196,7 +196,7 @@ desc = "Take your key out of the vehicle's ignition." button_icon_state = "car_removekey" -/datum/action/vehicle/sealed/remove_key/Trigger() +/datum/action/vehicle/sealed/remove_key/Trigger(trigger_flags) vehicle_entered_target.remove_key(owner) //CLOWN CAR ACTION DATUMS @@ -206,7 +206,7 @@ button_icon_state = "car_horn" var/hornsound = 'sound/items/carhorn.ogg' -/datum/action/vehicle/sealed/horn/Trigger() +/datum/action/vehicle/sealed/horn/Trigger(trigger_flags) if(TIMER_COOLDOWN_CHECK(src, COOLDOWN_CAR_HONK)) return TIMER_COOLDOWN_START(src, COOLDOWN_CAR_HONK, 2 SECONDS) @@ -222,7 +222,7 @@ desc = "Turn on your brights!" button_icon_state = "car_headlights" -/datum/action/vehicle/sealed/headlights/Trigger() +/datum/action/vehicle/sealed/headlights/Trigger(trigger_flags) to_chat(owner, span_notice("You flip the switch for the vehicle's headlights.")) vehicle_entered_target.headlights_toggle = !vehicle_entered_target.headlights_toggle vehicle_entered_target.set_light_on(vehicle_entered_target.headlights_toggle) @@ -234,7 +234,7 @@ desc = "Dump all objects and people in your car on the floor." button_icon_state = "car_dump" -/datum/action/vehicle/sealed/dump_kidnapped_mobs/Trigger() +/datum/action/vehicle/sealed/dump_kidnapped_mobs/Trigger(trigger_flags) vehicle_entered_target.visible_message(span_danger("[vehicle_entered_target] starts dumping the people inside of it.")) vehicle_entered_target.dump_specific_mobs(VEHICLE_CONTROL_KIDNAPPED) @@ -244,7 +244,7 @@ desc = "Press one of those colorful buttons on your display panel!" button_icon_state = "car_rtd" -/datum/action/vehicle/sealed/roll_the_dice/Trigger() +/datum/action/vehicle/sealed/roll_the_dice/Trigger(trigger_flags) if(!istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar)) return var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target @@ -255,7 +255,7 @@ desc = "Destroy them with their own fodder!" button_icon_state = "car_cannon" -/datum/action/vehicle/sealed/cannon/Trigger() +/datum/action/vehicle/sealed/cannon/Trigger(trigger_flags) if(!istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar)) return var/obj/vehicle/sealed/car/clowncar/C = vehicle_entered_target @@ -269,7 +269,7 @@ COOLDOWN_DECLARE(thank_time_cooldown) -/datum/action/vehicle/sealed/thank/Trigger() +/datum/action/vehicle/sealed/thank/Trigger(trigger_flags) if(!istype(vehicle_entered_target, /obj/vehicle/sealed/car/clowncar)) return if(!COOLDOWN_FINISHED(src, thank_time_cooldown)) @@ -290,7 +290,7 @@ ///Cooldown to next jump var/next_ollie -/datum/action/vehicle/ridden/scooter/skateboard/ollie/Trigger() +/datum/action/vehicle/ridden/scooter/skateboard/ollie/Trigger(trigger_flags) if(world.time > next_ollie) var/obj/vehicle/ridden/scooter/skateboard/vehicle = vehicle_target vehicle.obj_flags |= BLOCK_Z_OUT_DOWN @@ -334,7 +334,7 @@ var/sound_path = 'sound/items/carhorn.ogg' var/sound_message = "makes a sound." -/datum/action/vehicle/sealed/noise/Trigger() +/datum/action/vehicle/sealed/noise/Trigger(trigger_flags) var/obj/vehicle/sealed/car/vim/vim_mecha = vehicle_entered_target if(!COOLDOWN_FINISHED(vim_mecha, sound_cooldown)) vim_mecha.balloon_alert(owner, "on cooldown!") diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 853c9ba9857..91c745db74f 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -297,7 +297,7 @@ return ..() -/datum/action/innate/bci_charge_action/Trigger() +/datum/action/innate/bci_charge_action/Trigger(trigger_flags) var/obj/item/stock_parts/cell/cell = circuit_component.parent.cell if (isnull(cell)) diff --git a/icons/hud/radial.dmi b/icons/hud/radial.dmi index 35311aa29e62b557a2397b70e83ed506d71844a6..2fe8d9c66e280280ea0bfb5b7b161b8c62bb5ff5 100644 GIT binary patch delta 3247 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 D=wRh3 delta 55755 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 L>gTe~DWM4f{T~}S diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi index aff5fa6fb0e86eac1d413d84cd0bdfaf75b1e6da..6945f481349c81f5125077b0e0f2d4e2f18edadf 100644 GIT binary patch delta 24168 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 delta 23855 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 X5I(a1EXFwj0gp%Ox@sjVmT&$KE6!%| diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi index 7642a6f22989173624e88d9279e3d4452e1b01d8..4bd8de5ad3b13f2c853066e654eddadfb2ac219c 100644 GIT binary patch delta 4273 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 diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index 50798f4845dd15451c564c7573d015a5b0edb240..f95d869bff1adda4fa4ce4242859d516f6a53170 100644 GIT binary patch delta 16279 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 diff --git a/tgstation.dme b/tgstation.dme index e0a777f2ea4..b77b8393cfb 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -26,6 +26,7 @@ #include "code\__DEFINES\access.dm" #include "code\__DEFINES\achievements.dm" #include "code\__DEFINES\acid.dm" +#include "code\__DEFINES\actions.dm" #include "code\__DEFINES\actionspeed_modification.dm" #include "code\__DEFINES\admin.dm" #include "code\__DEFINES\adventure.dm" @@ -3283,6 +3284,7 @@ #include "code\modules\mod\mod_clothes.dm" #include "code\modules\mod\mod_construction.dm" #include "code\modules\mod\mod_control.dm" +#include "code\modules\mod\mod_core.dm" #include "code\modules\mod\mod_theme.dm" #include "code\modules\mod\mod_types.dm" #include "code\modules\mod\mod_ui.dm" diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 6224b0e7aa3..4275d052bcd 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -349,7 +349,7 @@ const HardwareSection = (props, context) => { chestplate, gauntlets, boots, - cell, + core, charge, } = data; return ( @@ -373,13 +373,13 @@ const HardwareSection = (props, context) => { - - {cell && ( + + {core && ( - - {cell} + + {core} - + { ) || ( - No Cell Detected + No Core Detected )}